@pixwel/pixwel-sdk 1.1.11 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/.babelrc +2 -1
  2. package/README.md +60 -0
  3. package/coverage/clover.xml +375 -226
  4. package/coverage/coverage-final.json +11 -5
  5. package/coverage/lcov-report/Ass.js.html +1 -1
  6. package/coverage/lcov-report/Asset.js.html +4 -4
  7. package/coverage/lcov-report/AssetType.js.html +98 -0
  8. package/coverage/lcov-report/Encode.js.html +98 -0
  9. package/coverage/lcov-report/File.js.html +98 -0
  10. package/coverage/lcov-report/Filename.js.html +11 -719
  11. package/coverage/lcov-report/Ingest.js.html +1240 -280
  12. package/coverage/lcov-report/IngestFile.js.html +5 -5
  13. package/coverage/lcov-report/Model.js.html +821 -0
  14. package/coverage/lcov-report/Order.js.html +25 -25
  15. package/coverage/lcov-report/Srt.js.html +1 -1
  16. package/coverage/lcov-report/Sub.js.html +1 -1
  17. package/coverage/lcov-report/Tag.js.html +98 -0
  18. package/coverage/lcov-report/TimeFormat.js.html +1 -1
  19. package/coverage/lcov-report/fileType.js.html +188 -0
  20. package/coverage/lcov-report/index.html +114 -36
  21. package/coverage/lcov.info +787 -474
  22. package/dist/index.js +74 -22
  23. package/dist/src/Asset.js +10 -5
  24. package/dist/src/AssetType.js +54 -0
  25. package/dist/src/Encode.js +54 -0
  26. package/dist/src/File.js +54 -0
  27. package/dist/src/Filename.js +7 -222
  28. package/dist/src/Ingest.js +370 -35
  29. package/dist/src/IngestFile.js +6 -2
  30. package/dist/src/Model.js +569 -0
  31. package/dist/src/Order.js +20 -9
  32. package/dist/src/Srt.js +5 -1
  33. package/dist/src/Tag.js +54 -0
  34. package/dist/src/fileType.js +43 -0
  35. package/index.js +14 -0
  36. package/package.json +9 -3
  37. package/src/AssetType.js +11 -0
  38. package/src/Encode.js +11 -0
  39. package/src/File.js +11 -0
  40. package/src/Filename.js +0 -236
  41. package/src/Ingest.js +350 -30
  42. package/src/Model.js +252 -0
  43. package/src/Tag.js +11 -0
  44. package/src/fileType.js +41 -0
  45. package/test/Filename.spec.js +9 -685
  46. package/test/Ingest.spec.js +1107 -152
  47. package/test/Model.spec.js +328 -0
@@ -4,34 +4,307 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
 
7
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
7
+ var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of");
8
+
9
+ var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
10
+
11
+ var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
12
+
13
+ var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
14
+
15
+ var _createClass2 = require("babel-runtime/helpers/createClass");
16
+
17
+ var _createClass3 = _interopRequireDefault(_createClass2);
18
+
19
+ var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn");
20
+
21
+ var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
22
+
23
+ var _inherits2 = require("babel-runtime/helpers/inherits");
24
+
25
+ var _inherits3 = _interopRequireDefault(_inherits2);
8
26
 
9
27
  var _lodash = require("lodash");
10
28
 
11
29
  var _lodash2 = _interopRequireDefault(_lodash);
12
30
 
13
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
+ var _File = require("./File");
32
+
33
+ var _File2 = _interopRequireDefault(_File);
34
+
35
+ var _Model2 = require("./Model");
36
+
37
+ var _Model3 = _interopRequireDefault(_Model2);
14
38
 
15
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
39
+ var _fileType = require("./fileType");
40
+
41
+ var _ramda = require("ramda");
42
+
43
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
44
 
17
45
  /**
18
46
  * [media description]
19
47
  * @type {[type]}
20
48
  */
21
- var Ingest = function () {
22
- function Ingest() {
23
- _classCallCheck(this, Ingest);
49
+ var Ingest = function (_Model) {
50
+ (0, _inherits3.default)(Ingest, _Model);
51
+
52
+ function Ingest(data) {
53
+ (0, _classCallCheck3.default)(this, Ingest);
54
+
55
+ var _this = (0, _possibleConstructorReturn3.default)(this, (Ingest.__proto__ || (0, _getPrototypeOf2.default)(Ingest)).call(this, data));
56
+
57
+ _this._resource = "ingests";
58
+ return _this;
24
59
  }
25
60
 
26
- _createClass(Ingest, null, [{
27
- key: "mapFromMediainfo",
61
+ (0, _createClass3.default)(Ingest, [{
62
+ key: "renderPath",
63
+
64
+ /**
65
+ * Returns path given an ingest record
66
+ *
67
+ */
68
+ value: function renderPath() {
69
+ var ingest = this.data();
70
+ if (!ingest.asset.project.studio.slug) {
71
+ throw new Error("missing studio slug");
72
+ }
73
+ if (!ingest.asset.project.slug) {
74
+ throw new Error("missing asset.project.slug");
75
+ }
76
+ if (!ingest.asset.project.slug) {
77
+ throw new Error("missing asset.project.slug");
78
+ }
79
+ return [ingest.asset.project.studio.slug, ingest.asset.project.slug, ingest.asset.type].join("/");
80
+ }
81
+ /**
82
+ * Create a File from an Ingest object with path and filename
83
+ *
84
+ * @param {object} params
85
+ */
86
+
87
+ }, {
88
+ key: "renderFilename",
89
+ value: function renderFilename() {
90
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : params = {},
91
+ allTags = _ref.allTags,
92
+ allTypes = _ref.allTypes,
93
+ order = _ref.order;
94
+
95
+ var asset = this.data().asset;
96
+ var options = this.data().selected.download;
97
+ var mediaType = this.data().asset.mediaType;
98
+
99
+ if (!asset.project) {
100
+ throw new Error("missing asset.project");
101
+ }
102
+
103
+ if (asset.project && !asset.project.filePrefix) {
104
+ throw new Error("missing asset.project.filePrefix");
105
+ }
106
+
107
+ if (!asset.name) {
108
+ throw new Error("missing asset.name");
109
+ }
110
+
111
+ if (!asset.type) {
112
+ throw new Error("missing asset.type");
113
+ }
114
+
115
+ var defaults = {
116
+ language: null,
117
+ country: null,
118
+ version: null,
119
+ tags: {
120
+ Usage: null,
121
+ Aspect: null,
122
+ SubDub: {
123
+ sub: null,
124
+ dub: null
125
+ },
126
+ Resolution: null,
127
+ "Frame Mode": null,
128
+ Framerate: null,
129
+ Text: null,
130
+ Codec: null,
131
+ Extra: []
132
+ }
133
+ };
134
+ options = _lodash2.default.merge(defaults, options);
135
+
136
+ if (!options.language) {
137
+ throw new Error("missing options.language");
138
+ }
139
+
140
+ if (mediaType && mediaType == "video" && !options.tags.Codec) {
141
+ throw new Error("missing options.tags.Codec");
142
+ }
143
+
144
+ if (mediaType && mediaType == "video" && !options.tags.Resolution) {
145
+ throw new Error("missing options.tags.Resolution");
146
+ }
147
+
148
+ if (mediaType && mediaType == "video" && !options.tags.Framerate) {
149
+ throw new Error("missing options.tags.Framerate");
150
+ }
151
+
152
+ if (mediaType == "video" && !options.tags["Frame Mode"]) {
153
+ throw new Error("missing options.tags[Frame Mode]");
154
+ }
155
+
156
+ function assetType(asset, types) {
157
+ if (/trailer/.test(asset.type)) {
158
+ return false;
159
+ }
160
+
161
+ var matchingType = _lodash2.default.find(types, { name: asset.type });
162
+ if (!matchingType) {
163
+ throw new Error("Asset type \"" + asset.type + "\" could not be found");
164
+ }
165
+
166
+ return matchingType.file || matchingType.name.replace(".", "-").toUpperCase();
167
+ }
168
+
169
+ function assetTitle(asset) {
170
+ var prefix = "";
171
+ var name = asset.slug.toUpperCase().replace("INT-L", "INTL");
172
+ if (/trailer/.test(asset.type)) {
173
+ switch (asset.type) {
174
+ case "trailer.intl":
175
+ prefix = "ITR-";
176
+ name = name.replace(/INTL-TRAILER-/, "");
177
+ break;
178
+ case "trailer":
179
+ prefix = "TR-";
180
+ name = name.replace(/TRAILER-/, "");
181
+ break;
182
+ case "trailer.us":
183
+ prefix = "DTR-";
184
+ name = name.replace(/DOMESTIC-TRAILER-/, "");
185
+ break;
186
+ }
187
+ }
188
+ return prefix + name;
189
+ }
190
+
191
+ function runningTime(asset) {
192
+ var matches = asset.type.match(/^film-clip|^featurette/);
193
+ if (!matches) {
194
+ return;
195
+ }
28
196
 
197
+ var minutes = Math.floor(asset.length / 60);
198
+ var seconds = asset.length % 60;
199
+
200
+ var result = "";
201
+
202
+ if (minutes > 0) {
203
+ result += minutes + "min";
204
+ }
205
+
206
+ if (seconds > 0) {
207
+ result += seconds + "sec";
208
+ }
209
+
210
+ return result;
211
+ }
212
+
213
+ function locale(country, language) {
214
+ if (language.includes("-")) {
215
+ country = "";
216
+ }
217
+ return [language, country].filter(function (str) {
218
+ return !!str && str !== "WW";
219
+ }).join("-");
220
+ }
221
+
222
+ function textType(subDub, text) {
223
+ if (!subDub || !subDub.sub && !subDub.dub) {
224
+ return text;
225
+ }
226
+
227
+ var result = [];
228
+ if (subDub.sub) {
229
+ result.push("sub");
230
+ }
231
+
232
+ if (subDub.dub) {
233
+ result.push("dub");
234
+ }
235
+
236
+ return result;
237
+ }
238
+
239
+ function matchSet(allTags, tags) {
240
+ var selectedTags = (0, _lodash2.default)(tags).values().flatten().value();
241
+
242
+ var setTag = (0, _lodash2.default)(allTags).filter("set").find(function (setTag) {
243
+ return _lodash2.default.difference(setTag.set, selectedTags).length === 0;
244
+ });
245
+
246
+ if (setTag) {
247
+ return setTag.name;
248
+ }
249
+ }
250
+
251
+ var tags = options.tags,
252
+ parts = [asset.project.filePrefix, assetType(asset, allTypes), assetTitle(asset), runningTime(asset), locale(options.country, options.language), textType(tags.SubDub, tags.Text), tags.Extra.join("_"), options.version, tags.Codec];
253
+
254
+ parts = (0, _lodash2.default)(parts).flatten().filter().map(function (part) {
255
+ return part.toUpperCase();
256
+ });
257
+
258
+ var matchedSet = matchSet(allTags, options.tags);
259
+ var requiredInfo = tags.Resolution && tags["Frame Mode"] && tags.Framerate;
260
+
261
+ if (matchedSet) {
262
+ parts = parts.push(matchedSet);
263
+ } else if (mediaType == "video" && tags.Resolution && !requiredInfo) {
264
+ parts = parts.push(tags.Resolution.replace(/\d+x/, ""));
265
+ } else if (mediaType == "image" && tags.Resolution) {
266
+ parts = parts.push(tags.Resolution);
267
+ }
268
+
269
+ var name = parts.join("_");
270
+
271
+ var hasResInfo = name.match(/\d+(i|p)/i);
272
+ var hasAllInfo = name.match(/\d+(i|p)\d+/i);
273
+
274
+ if (requiredInfo && !hasResInfo && !hasAllInfo) {
275
+ var res = tags.Resolution;
276
+ var encodeTag = [hasResInfo ? "" : res.indexOf("x") ? res.replace(/\d+x/, "") : res, res.match(/i|p/i) && !hasResInfo ? "" : tags["Frame Mode"].toLowerCase().slice(0, 1), tags.Framerate.replace(".", "").toUpperCase()].filter(function (val) {
277
+ return val;
278
+ }).join("");
279
+
280
+ var match = new RegExp(encodeTag, "i");
281
+ name = name.match(match) ? name.replace(match, encodeTag) : name + "_" + encodeTag;
282
+ } else if (hasResInfo && !hasAllInfo && tags.Framerate) {
283
+ name += tags.Framerate.replace(".", "").toUpperCase();
284
+ }
285
+
286
+ return name;
287
+ }
288
+ /**
289
+ * Returns the mediaType of the ingest
290
+ */
291
+
292
+ }, {
293
+ key: "mediaType",
294
+ value: function mediaType() {
295
+ return this.src.mediaType;
296
+ }
29
297
  /**
30
298
  * Maps mediainfo metadata into ingest Tag format
31
- * @param {*} info
32
- * @param {*} mediaType
299
+ *
33
300
  */
34
- value: function mapFromMediainfo(info, mediaType) {
301
+
302
+ }, {
303
+ key: "mapFromMediainfo",
304
+ value: function mapFromMediainfo() {
305
+ var info = this.mediainfo;
306
+ var mediaType = this.asset.mediaType;
307
+
35
308
  var schema = {
36
309
  Aspect: null,
37
310
  Standard: null,
@@ -214,7 +487,10 @@ var Ingest = function () {
214
487
 
215
488
  }, {
216
489
  key: "mapFromFilename",
217
- value: function mapFromFilename(filename, allTags) {
490
+ value: function mapFromFilename(params) {
491
+ var allTags = params.allTags;
492
+
493
+ var filename = this.filename;
218
494
  var tags = {
219
495
  SubDub: {
220
496
  sub: null,
@@ -224,11 +500,11 @@ var Ingest = function () {
224
500
  filename.file.tags.forEach(function (tag) {
225
501
  var foundTag = _lodash2.default.find(allTags, { name: tag });
226
502
  if (foundTag) {
227
- if (foundTag.type == 'SubDub') {
228
- if (foundTag.name == 'sub') {
503
+ if (foundTag.type == "SubDub") {
504
+ if (foundTag.name == "sub") {
229
505
  tags.SubDub.sub = true;
230
506
  }
231
- if (foundTag.name == 'dub') {
507
+ if (foundTag.name == "dub") {
232
508
  tags.SubDub.dub = true;
233
509
  }
234
510
  } else {
@@ -245,12 +521,12 @@ var Ingest = function () {
245
521
  preview: {}
246
522
  }
247
523
  };
248
- if (filename.file.tags.includes('sub') && filename.file.tags.includes('dub')) {
249
- ingest.selected.preview.type = 'both';
250
- } else if (filename.file.tags.includes('sub')) {
251
- ingest.selected.preview.type = 'sub';
252
- } else if (filename.file.tags.includes('dub')) {
253
- ingest.selected.preview.type = 'dub';
524
+ if (filename.file.tags.includes("sub") && filename.file.tags.includes("dub")) {
525
+ ingest.selected.preview.type = "both";
526
+ } else if (filename.file.tags.includes("sub")) {
527
+ ingest.selected.preview.type = "sub";
528
+ } else if (filename.file.tags.includes("dub")) {
529
+ ingest.selected.preview.type = "dub";
254
530
  }
255
531
  if (filename.file.language) {
256
532
  ingest.selected.preview.language = filename.file.language;
@@ -262,17 +538,56 @@ var Ingest = function () {
262
538
  return ingest;
263
539
  }
264
540
  /**
265
- * Assembles Ingest based on weighted rules
266
- * @param {*} context
267
- * @param {*} filename
268
- * @param {*} mediainfo
269
- * @param {*} order
541
+ * Create a File from an Ingest object
542
+ *
543
+ * @param {object} params
544
+ */
545
+
546
+ }, {
547
+ key: "createFile",
548
+ value: function createFile(params) {
549
+ var allTags = params.allTags,
550
+ allTypes = params.allTypes,
551
+ order = params.order;
552
+
553
+
554
+ this.filename = this.mapFromFilename({ allTags: allTags });
555
+ this.mediainfo = this.mapFromMediainfo();
556
+
557
+ var ingest = this.assemble({ order: order });
558
+
559
+ var file = new _File2.default({
560
+ name: this.renderFilename({ allTags: allTags, allTypes: allTypes }),
561
+ path: this.renderPath(),
562
+ asset: ingest.asset._id,
563
+ generator: 'ingest',
564
+ contextTag: ingest.context.tag,
565
+ language: ingest.selected.download.language,
566
+ country: ingest.selected.download.country,
567
+ tags: flatValues(ingest.selected.download.tags),
568
+ ingest: ingest._id,
569
+ workRequest: ingest.workRequest,
570
+ verified: true
571
+ });
572
+
573
+ return file;
574
+ }
575
+ /**
576
+ * Merges ingest metadata sources
577
+ *
578
+ * @param {object} params
270
579
  */
271
580
 
272
581
  }, {
273
582
  key: "assemble",
274
- value: function assemble(original, filename, mediainfo, order) {
275
- var watermarks = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
583
+ value: function assemble(params) {
584
+ var original = this.data();
585
+ var filename = this.data().filename;
586
+ var mediainfo = this.data().mediainfo;
587
+
588
+ var order = params.order,
589
+ _params$watermarks = params.watermarks,
590
+ watermarks = _params$watermarks === undefined ? [] : _params$watermarks;
276
591
 
277
592
 
278
593
  var defaults = {
@@ -289,8 +604,8 @@ var Ingest = function () {
289
604
  },
290
605
  preview: {
291
606
  enabled: false,
292
- revision: 'Final',
293
- type: 'none',
607
+ revision: "Final",
608
+ type: "none",
294
609
  embargo: {
295
610
  enabled: false
296
611
  }
@@ -305,7 +620,7 @@ var Ingest = function () {
305
620
  var ingest = _lodash2.default.merge(defaults, filename, original, mediainfo);
306
621
 
307
622
  if (original.asset && original.asset.creative) {
308
- ingest.selected.preview.revision = 'Unfinished';
623
+ ingest.selected.preview.revision = "Unfinished";
309
624
  }
310
625
 
311
626
  if (!original.context.asset && filename.asset && filename.asset._id) {
@@ -334,7 +649,7 @@ var Ingest = function () {
334
649
  ingest.selected.download.language = order.language;
335
650
  }
336
651
  if (order._id) {
337
- ingest.selected.download.tags.Text = 'txtd';
652
+ ingest.selected.download.tags.Text = "txtd";
338
653
  }
339
654
  if (order.isSub() || order.isDub()) {
340
655
  ingest.selected.download.tags.SubDub = {
@@ -359,9 +674,29 @@ var Ingest = function () {
359
674
 
360
675
  return ingest;
361
676
  }
677
+ }], [{
678
+ key: "_resource",
679
+ get: function get() {
680
+ return 'ingests';
681
+ }
362
682
  }]);
363
-
364
683
  return Ingest;
365
- }();
684
+ }(_Model3.default);
685
+
686
+ /**
687
+ * Flattens ingest.selected.download.tags into a simple array
688
+ *
689
+ * @param {object} data
690
+ */
366
691
 
367
- exports.default = Ingest;
692
+
693
+ exports.default = Ingest;
694
+ function flatValues(data) {
695
+ var copy = (0, _ramda.clone)(data);
696
+ if (copy.SubDub) {
697
+ copy.SubDub = (0, _ramda.keys)((0, _ramda.filter)(function (val) {
698
+ return !!val;
699
+ }, copy.SubDub));
700
+ }
701
+ return (0, _ramda.flatten)((0, _ramda.values)(copy));
702
+ }
@@ -4,10 +4,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
 
7
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
7
+ var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
8
+
9
+ var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
10
+
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
12
 
9
13
  var IngestFile = function IngestFile(file, order) {
10
- _classCallCheck(this, IngestFile);
14
+ (0, _classCallCheck3.default)(this, IngestFile);
11
15
 
12
16
  this.file = file;
13
17
  }