@pixwel/pixwel-sdk 2.0.0 → 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 +581 -430
  4. package/coverage/coverage-final.json +15 -9
  5. package/coverage/lcov-report/Ass.js.html +212 -212
  6. package/coverage/lcov-report/Asset.js.html +27 -27
  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 +9 -726
  11. package/coverage/lcov-report/Ingest.js.html +1239 -279
  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 +102 -102
  16. package/coverage/lcov-report/Sub.js.html +43 -43
  17. package/coverage/lcov-report/Tag.js.html +98 -0
  18. package/coverage/lcov-report/TimeFormat.js.html +63 -63
  19. package/coverage/lcov-report/fileType.js.html +188 -0
  20. package/coverage/lcov-report/index.html +164 -86
  21. package/coverage/lcov.info +1159 -846
  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 -228
  28. package/dist/src/Ingest.js +365 -33
  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 -239
  41. package/src/Ingest.js +347 -27
  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 +3 -707
  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
+ }
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("");
28
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,7 +538,42 @@ var Ingest = function () {
262
538
  return ingest;
263
539
  }
264
540
  /**
265
- * Assembles Ingest based on weighted rules
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
266
577
  *
267
578
  * @param {object} params
268
579
  */
@@ -270,10 +581,11 @@ var Ingest = function () {
270
581
  }, {
271
582
  key: "assemble",
272
583
  value: function assemble(params) {
273
- var original = params.original,
274
- filename = params.filename,
275
- mediainfo = params.mediainfo,
276
- order = params.order,
584
+ var original = this.data();
585
+ var filename = this.data().filename;
586
+ var mediainfo = this.data().mediainfo;
587
+
588
+ var order = params.order,
277
589
  _params$watermarks = params.watermarks,
278
590
  watermarks = _params$watermarks === undefined ? [] : _params$watermarks;
279
591
 
@@ -292,8 +604,8 @@ var Ingest = function () {
292
604
  },
293
605
  preview: {
294
606
  enabled: false,
295
- revision: 'Final',
296
- type: 'none',
607
+ revision: "Final",
608
+ type: "none",
297
609
  embargo: {
298
610
  enabled: false
299
611
  }
@@ -308,7 +620,7 @@ var Ingest = function () {
308
620
  var ingest = _lodash2.default.merge(defaults, filename, original, mediainfo);
309
621
 
310
622
  if (original.asset && original.asset.creative) {
311
- ingest.selected.preview.revision = 'Unfinished';
623
+ ingest.selected.preview.revision = "Unfinished";
312
624
  }
313
625
 
314
626
  if (!original.context.asset && filename.asset && filename.asset._id) {
@@ -337,7 +649,7 @@ var Ingest = function () {
337
649
  ingest.selected.download.language = order.language;
338
650
  }
339
651
  if (order._id) {
340
- ingest.selected.download.tags.Text = 'txtd';
652
+ ingest.selected.download.tags.Text = "txtd";
341
653
  }
342
654
  if (order.isSub() || order.isDub()) {
343
655
  ingest.selected.download.tags.SubDub = {
@@ -362,9 +674,29 @@ var Ingest = function () {
362
674
 
363
675
  return ingest;
364
676
  }
677
+ }], [{
678
+ key: "_resource",
679
+ get: function get() {
680
+ return 'ingests';
681
+ }
365
682
  }]);
366
-
367
683
  return Ingest;
368
- }();
684
+ }(_Model3.default);
685
+
686
+ /**
687
+ * Flattens ingest.selected.download.tags into a simple array
688
+ *
689
+ * @param {object} data
690
+ */
369
691
 
370
- 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
  }