@eluvio/elv-client-js 4.0.104 → 4.0.107

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 (41) hide show
  1. package/dist/ElvClient-min.js +15 -14
  2. package/dist/ElvClient-node-min.js +14 -13
  3. package/dist/ElvFrameClient-min.js +10 -10
  4. package/dist/ElvPermissionsClient-min.js +9 -9
  5. package/dist/ElvWalletClient-min.js +15 -14
  6. package/dist/ElvWalletClient-node-min.js +14 -13
  7. package/dist/src/AuthorizationClient.js +9 -12
  8. package/dist/src/ContentObjectAudit.js +3 -3
  9. package/dist/src/ContentObjectVerification.js +3 -3
  10. package/dist/src/Crypto.js +2 -2
  11. package/dist/src/ElvClient.js +47 -28
  12. package/dist/src/ElvWallet.js +7 -5
  13. package/dist/src/EthClient.js +8 -9
  14. package/dist/src/FrameClient.js +8 -9
  15. package/dist/src/HttpClient.js +1 -2
  16. package/dist/src/Id.js +1 -2
  17. package/dist/src/PermissionsClient.js +31 -19
  18. package/dist/src/RemoteSigner.js +10 -11
  19. package/dist/src/UserProfileClient.js +194 -150
  20. package/dist/src/Utils.js +2 -3
  21. package/dist/src/abr_profiles/abr_profile_live_drm.js +22 -0
  22. package/dist/src/client/ABRPublishing.js +2 -2
  23. package/dist/src/client/AccessGroups.js +2 -2
  24. package/dist/src/client/ContentAccess.js +9 -6
  25. package/dist/src/client/ContentManagement.js +3 -3
  26. package/dist/src/client/Contracts.js +433 -108
  27. package/dist/src/client/Files.js +2 -2
  28. package/dist/src/client/LiveConf.js +60 -78
  29. package/dist/src/client/LiveStream.js +270 -158
  30. package/dist/src/client/NFT.js +2 -2
  31. package/dist/src/walletClient/ClientMethods.js +2 -2
  32. package/dist/src/walletClient/Profile.js +2 -2
  33. package/dist/src/walletClient/Utils.js +2 -2
  34. package/dist/src/walletClient/index.js +19 -16
  35. package/package.json +1 -1
  36. package/src/UserProfileClient.js +19 -20
  37. package/src/abr_profiles/abr_profile_live_drm.js +22 -0
  38. package/src/client/Contracts.js +244 -42
  39. package/src/client/LiveConf.js +86 -111
  40. package/src/client/LiveStream.js +141 -44
  41. package/testScripts/TestAddTenantContractId.js +45 -4
@@ -498,25 +498,35 @@ exports.StreamStatus = /*#__PURE__*/function () {
498
498
  });
499
499
  status.edge_write_token = edgeWriteToken;
500
500
  status.stream_id = edgeWriteToken; // By convention the stream ID is its write token
501
- _context4.next = 36;
501
+ _context4.prev = 34;
502
+ _context4.next = 37;
502
503
  return this.ContentObjectMetadata({
503
504
  libraryId: libraryId,
504
505
  objectId: objectId,
505
506
  writeToken: edgeWriteToken,
506
507
  select: ["live_recording"]
507
508
  });
508
- case 36:
509
+ case 37:
509
510
  edgeMeta = _context4.sent;
510
- status.edge_meta_size = JSON.stringify(edgeMeta).length;
511
+ _context4.next = 45;
512
+ break;
513
+ case 40:
514
+ _context4.prev = 40;
515
+ _context4.t0 = _context4["catch"](34);
516
+ console.error("Unable to read edge write token metadata. Has token been deleted?", _context4.t0);
517
+ status.state = "inactive";
518
+ return _context4.abrupt("return", status);
519
+ case 45:
520
+ status.edge_meta_size = JSON.stringify(edgeMeta || "").length;
511
521
 
512
522
  // If a stream has never been started return state 'inactive'
513
523
  if (!(edgeMeta.live_recording === undefined || edgeMeta.live_recording.recordings === undefined || edgeMeta.live_recording.recordings.recording_sequence === undefined)) {
514
- _context4.next = 41;
524
+ _context4.next = 49;
515
525
  break;
516
526
  }
517
527
  status.state = "stopped";
518
528
  return _context4.abrupt("return", status);
519
- case 41:
529
+ case 49:
520
530
  recordings = edgeMeta.live_recording.recordings;
521
531
  status.recording_period_sequence = recordings.recording_sequence;
522
532
  sequence = recordings.recording_sequence;
@@ -542,14 +552,14 @@ exports.StreamStatus = /*#__PURE__*/function () {
542
552
  video_since_last_finalize_sec: sinceLastFinalize
543
553
  };
544
554
  status.recording_period = recording_period;
545
- _context4.next = 55;
555
+ _context4.next = 63;
546
556
  return this.FabricUrl({
547
557
  libraryId: libraryId,
548
558
  objectId: objectId,
549
559
  writeToken: edgeWriteToken,
550
560
  call: "live/status/" + tlro
551
561
  });
552
- case 55:
562
+ case 63:
553
563
  status.lro_status_url = _context4.sent;
554
564
  status.insertions = [];
555
565
  if (edgeMeta.live_recording.playout_config.interleaves != undefined && edgeMeta.live_recording.playout_config.interleaves[sequence] != undefined) {
@@ -569,15 +579,15 @@ exports.StreamStatus = /*#__PURE__*/function () {
569
579
  }
570
580
  state = "stopped";
571
581
  lroStatus = "";
572
- _context4.prev = 61;
573
- _context4.t0 = this.utils;
574
- _context4.next = 65;
582
+ _context4.prev = 69;
583
+ _context4.t1 = this.utils;
584
+ _context4.next = 73;
575
585
  return HttpClient.Fetch(status.lro_status_url);
576
- case 65:
577
- _context4.t1 = _context4.sent;
578
- _context4.next = 68;
579
- return _context4.t0.ResponseToJson.call(_context4.t0, _context4.t1);
580
- case 68:
586
+ case 73:
587
+ _context4.t2 = _context4.sent;
588
+ _context4.next = 76;
589
+ return _context4.t1.ResponseToJson.call(_context4.t1, _context4.t2);
590
+ case 76:
581
591
  lroStatus = _context4.sent;
582
592
  state = lroStatus.state;
583
593
  status.warnings = lroStatus.custom && lroStatus.custom.warnings;
@@ -585,16 +595,16 @@ exports.StreamStatus = /*#__PURE__*/function () {
585
595
  if (lroStatus.custom && lroStatus.custom.status) {
586
596
  status.recording_status = lroStatus.custom.status;
587
597
  }
588
- _context4.next = 81;
598
+ _context4.next = 89;
589
599
  break;
590
- case 75:
591
- _context4.prev = 75;
592
- _context4.t2 = _context4["catch"](61);
593
- console.log("LRO Status (failed): ", _context4.t2.response.statusCode);
600
+ case 83:
601
+ _context4.prev = 83;
602
+ _context4.t3 = _context4["catch"](69);
603
+ console.log("LRO Status (failed): ", _context4.t3.response.statusCode);
594
604
  status.state = "stopped";
595
- status.error = _context4.t2.response;
605
+ status.error = _context4.t3.response;
596
606
  return _context4.abrupt("return", status);
597
- case 81:
607
+ case 89:
598
608
  // Convert LRO 'state' to desired 'state'
599
609
  if (state === "running" && videoLastFinalizationTimeEpochSec <= 0) {
600
610
  state = "starting";
@@ -605,97 +615,97 @@ exports.StreamStatus = /*#__PURE__*/function () {
605
615
  }
606
616
  status.state = state;
607
617
  if (!((state === "running" || state === "stalled" || state === "starting") && stopLro)) {
608
- _context4.next = 102;
618
+ _context4.next = 110;
609
619
  break;
610
620
  }
611
- _context4.next = 86;
621
+ _context4.next = 94;
612
622
  return this.FabricUrl({
613
623
  libraryId: libraryId,
614
624
  objectId: objectId,
615
625
  writeToken: edgeWriteToken,
616
626
  call: "live/stop/" + tlro
617
627
  });
618
- case 86:
628
+ case 94:
619
629
  lroStopUrl = _context4.sent;
620
- _context4.prev = 87;
621
- _context4.t3 = this.utils;
622
- _context4.next = 91;
630
+ _context4.prev = 95;
631
+ _context4.t4 = this.utils;
632
+ _context4.next = 99;
623
633
  return HttpClient.Fetch(lroStopUrl);
624
- case 91:
625
- _context4.t4 = _context4.sent;
626
- _context4.next = 94;
627
- return _context4.t3.ResponseToJson.call(_context4.t3, _context4.t4);
628
- case 94:
634
+ case 99:
635
+ _context4.t5 = _context4.sent;
636
+ _context4.next = 102;
637
+ return _context4.t4.ResponseToJson.call(_context4.t4, _context4.t5);
638
+ case 102:
629
639
  console.log("LRO Stop: ", lroStatus.body);
630
- _context4.next = 100;
640
+ _context4.next = 108;
631
641
  break;
632
- case 97:
633
- _context4.prev = 97;
634
- _context4.t5 = _context4["catch"](87);
635
- console.log("LRO Stop (failed): ", _context4.t5.response.statusCode);
636
- case 100:
642
+ case 105:
643
+ _context4.prev = 105;
644
+ _context4.t6 = _context4["catch"](95);
645
+ console.log("LRO Stop (failed): ", _context4.t6.response.statusCode);
646
+ case 108:
637
647
  state = "stopped";
638
648
  status.state = state;
639
- case 102:
649
+ case 110:
640
650
  if (!(state === "running")) {
641
- _context4.next = 133;
651
+ _context4.next = 141;
642
652
  break;
643
653
  }
644
654
  playout_urls = {};
645
- _context4.next = 106;
655
+ _context4.next = 114;
646
656
  return this.PlayoutOptions({
647
657
  objectId: objectId,
648
658
  linkPath: "public/asset_metadata/sources/default"
649
659
  });
650
- case 106:
660
+ case 114:
651
661
  playout_options = _context4.sent;
652
662
  hls_clear_enabled = playout_options && playout_options.hls && playout_options.hls.playoutMethods && playout_options.hls.playoutMethods.clear !== undefined;
653
663
  if (!hls_clear_enabled) {
654
- _context4.next = 112;
664
+ _context4.next = 120;
655
665
  break;
656
666
  }
657
- _context4.next = 111;
667
+ _context4.next = 119;
658
668
  return this.FabricUrl({
659
669
  libraryId: libraryId,
660
670
  objectId: objectId,
661
671
  rep: "playout/default/hls-clear/playlist.m3u8"
662
672
  });
663
- case 111:
673
+ case 119:
664
674
  playout_urls.hls_clear = _context4.sent;
665
- case 112:
675
+ case 120:
666
676
  hls_aes128_enabled = playout_options && playout_options.hls && playout_options.hls.playoutMethods && playout_options.hls.playoutMethods["aes-128"] !== undefined;
667
677
  if (!hls_aes128_enabled) {
668
- _context4.next = 117;
678
+ _context4.next = 125;
669
679
  break;
670
680
  }
671
- _context4.next = 116;
681
+ _context4.next = 124;
672
682
  return this.FabricUrl({
673
683
  libraryId: libraryId,
674
684
  objectId: objectId,
675
685
  rep: "playout/default/hls-aes128/playlist.m3u8"
676
686
  });
677
- case 116:
687
+ case 124:
678
688
  playout_urls.hls_aes128 = _context4.sent;
679
- case 117:
689
+ case 125:
680
690
  hls_sample_aes_enabled = playout_options && playout_options.hls && playout_options.hls.playoutMethods && playout_options.hls.playoutMethods["sample-aes"] !== undefined;
681
691
  if (!hls_sample_aes_enabled) {
682
- _context4.next = 122;
692
+ _context4.next = 130;
683
693
  break;
684
694
  }
685
- _context4.next = 121;
695
+ _context4.next = 129;
686
696
  return this.FabricUrl({
687
697
  libraryId: libraryId,
688
698
  objectId: objectId,
689
699
  rep: "playout/default/hls-sample-aes/playlist.m3u8"
690
700
  });
691
- case 121:
701
+ case 129:
692
702
  playout_urls.hls_sample_aes = _context4.sent;
693
- case 122:
694
- _context4.next = 124;
703
+ case 130:
704
+ _context4.next = 132;
695
705
  return this.NetworkInfo();
696
- case 124:
706
+ case 132:
697
707
  networkInfo = _context4.sent;
698
- _context4.next = 127;
708
+ _context4.next = 135;
699
709
  return this.authClient.AuthorizationToken({
700
710
  libraryId: libraryId,
701
711
  objectId: objectId,
@@ -703,7 +713,7 @@ exports.StreamStatus = /*#__PURE__*/function () {
703
713
  noCache: true,
704
714
  noAuth: true
705
715
  });
706
- case 127:
716
+ case 135:
707
717
  token = _context4.sent;
708
718
  embed_net = "main";
709
719
  if (networkInfo.name.includes("demo")) {
@@ -712,20 +722,20 @@ exports.StreamStatus = /*#__PURE__*/function () {
712
722
  embed_url = "https://embed.v3.contentfabric.io/?net=".concat(embed_net, "&p&ct=h&oid=").concat(objectId, "&mt=lv&ath=").concat(token);
713
723
  playout_urls.embed_url = embed_url;
714
724
  status.playout_urls = playout_urls;
715
- case 133:
716
- _context4.next = 138;
725
+ case 141:
726
+ _context4.next = 146;
717
727
  break;
718
- case 135:
719
- _context4.prev = 135;
720
- _context4.t6 = _context4["catch"](3);
721
- console.error(_context4.t6);
722
- case 138:
728
+ case 143:
729
+ _context4.prev = 143;
730
+ _context4.t7 = _context4["catch"](3);
731
+ console.error(_context4.t7);
732
+ case 146:
723
733
  return _context4.abrupt("return", status);
724
- case 139:
734
+ case 147:
725
735
  case "end":
726
736
  return _context4.stop();
727
737
  }
728
- }, _callee4, this, [[3, 135], [61, 75], [87, 97]]);
738
+ }, _callee4, this, [[3, 143], [34, 40], [69, 83], [95, 105]]);
729
739
  }));
730
740
  return function (_x4) {
731
741
  return _ref8.apply(this, arguments);
@@ -823,7 +833,6 @@ exports.StreamCreate = /*#__PURE__*/function () {
823
833
  edge_write_token: edgeToken,
824
834
  state: "active" // indicates there is an active session (set to 'closed' when done)
825
835
  },
826
-
827
836
  fabric_config: {
828
837
  edge_write_token: edgeToken
829
838
  }
@@ -1296,7 +1305,7 @@ exports.StreamSetOfferingAndDRM = /*#__PURE__*/function () {
1296
1305
  abrProfileDefault = require("../abr_profiles/abr_profile_live_drm.js");
1297
1306
  abrProfile = JSON.parse(JSON.stringify(abrProfileDefault));
1298
1307
  if (!format) {
1299
- _context9.next = 39;
1308
+ _context9.next = 43;
1300
1309
  break;
1301
1310
  }
1302
1311
  drm = true; // Override DRM parameter
@@ -1305,7 +1314,7 @@ exports.StreamSetOfferingAndDRM = /*#__PURE__*/function () {
1305
1314
  i = 0;
1306
1315
  case 28:
1307
1316
  if (!(i < formats.length)) {
1308
- _context9.next = 37;
1317
+ _context9.next = 41;
1309
1318
  break;
1310
1319
  }
1311
1320
  if (!(formats[i] === "hls-clear")) {
@@ -1319,17 +1328,31 @@ exports.StreamSetOfferingAndDRM = /*#__PURE__*/function () {
1319
1328
  "type": "ProtoHls"
1320
1329
  }
1321
1330
  };
1322
- return _context9.abrupt("continue", 34);
1331
+ return _context9.abrupt("continue", 38);
1323
1332
  case 33:
1333
+ if (!(formats[i] === "dash-clear")) {
1334
+ _context9.next = 37;
1335
+ break;
1336
+ }
1337
+ abrProfile.drm_optional = true;
1338
+ playoutFormats["dash-clear"] = {
1339
+ "drm": null,
1340
+ "protocol": {
1341
+ "min_buffer_length": 2,
1342
+ "type": "ProtoDash"
1343
+ }
1344
+ };
1345
+ return _context9.abrupt("continue", 38);
1346
+ case 37:
1324
1347
  playoutFormats[formats[i]] = abrProfile.playout_formats[formats[i]];
1325
- case 34:
1348
+ case 38:
1326
1349
  i++;
1327
1350
  _context9.next = 28;
1328
1351
  break;
1329
- case 37:
1330
- _context9.next = 40;
1352
+ case 41:
1353
+ _context9.next = 44;
1331
1354
  break;
1332
- case 39:
1355
+ case 43:
1333
1356
  if (!drm) {
1334
1357
  abrProfile.drm_optional = true;
1335
1358
  playoutFormats = {
@@ -1338,26 +1361,33 @@ exports.StreamSetOfferingAndDRM = /*#__PURE__*/function () {
1338
1361
  "protocol": {
1339
1362
  "type": "ProtoHls"
1340
1363
  }
1364
+ },
1365
+ "dash-clear": {
1366
+ "drm": null,
1367
+ "protocol": {
1368
+ "min_buffer_length": 2,
1369
+ "type": "ProtoDash"
1370
+ }
1341
1371
  }
1342
1372
  };
1343
1373
  } else {
1344
1374
  playoutFormats = Object.assign({}, abrProfile.playout_formats);
1345
1375
  }
1346
- case 40:
1376
+ case 44:
1347
1377
  abrProfile.playout_formats = playoutFormats;
1348
- _context9.next = 43;
1378
+ _context9.next = 47;
1349
1379
  return this.ContentObjectLibraryId({
1350
1380
  objectId: objectId
1351
1381
  });
1352
- case 43:
1382
+ case 47:
1353
1383
  libraryId = _context9.sent;
1354
- _context9.prev = 44;
1355
- _context9.next = 47;
1384
+ _context9.prev = 48;
1385
+ _context9.next = 51;
1356
1386
  return this.ContentObjectMetadata({
1357
1387
  libraryId: libraryId,
1358
1388
  objectId: objectId
1359
1389
  });
1360
- case 47:
1390
+ case 51:
1361
1391
  mainMeta = _context9.sent;
1362
1392
  fabURI = mainMeta.live_recording.fabric_config.ingress_node_api; // Support both hostname and URL ingress_node_api
1363
1393
  if (!fabURI.startsWith("http")) {
@@ -1368,7 +1398,7 @@ exports.StreamSetOfferingAndDRM = /*#__PURE__*/function () {
1368
1398
  fabricURIs: [fabURI]
1369
1399
  });
1370
1400
  streamUrl = mainMeta.live_recording.recording_config.recording_params.origin_url;
1371
- _context9.next = 54;
1401
+ _context9.next = 58;
1372
1402
  return StreamGenerateOffering({
1373
1403
  client: this,
1374
1404
  libraryId: libraryId,
@@ -1391,22 +1421,22 @@ exports.StreamSetOfferingAndDRM = /*#__PURE__*/function () {
1391
1421
  vFrameRate: vFrameRate,
1392
1422
  vTimeBase: vTimeBase
1393
1423
  });
1394
- case 54:
1424
+ case 58:
1395
1425
  console.log("Finished generating offering");
1396
1426
  return _context9.abrupt("return", {
1397
1427
  name: name,
1398
1428
  object_id: objectId,
1399
1429
  state: "initialized"
1400
1430
  });
1401
- case 58:
1402
- _context9.prev = 58;
1403
- _context9.t0 = _context9["catch"](44);
1431
+ case 62:
1432
+ _context9.prev = 62;
1433
+ _context9.t0 = _context9["catch"](48);
1404
1434
  console.error(_context9.t0);
1405
- case 61:
1435
+ case 65:
1406
1436
  case "end":
1407
1437
  return _context9.stop();
1408
1438
  }
1409
- }, _callee9, this, [[44, 58]]);
1439
+ }, _callee9, this, [[48, 62]]);
1410
1440
  }));
1411
1441
  return function (_x9) {
1412
1442
  return _ref18.apply(this, arguments);
@@ -1445,7 +1475,6 @@ exports.StreamInsertion = /*#__PURE__*/function () {
1445
1475
  insertionInfo = {
1446
1476
  duration_sec: 0 // Minimum of video and audio duration
1447
1477
  };
1448
-
1449
1478
  ["video", "audio"].forEach(function (mt) {
1450
1479
  var stream = offeringMeta.media_struct.streams[mt];
1451
1480
  insertionInfo[mt] = {
@@ -2252,106 +2281,121 @@ exports.StreamCopyToVod = /*#__PURE__*/function () {
2252
2281
  *
2253
2282
  * @methodGroup Live Stream
2254
2283
  * @namedParams
2284
+ * @param {string=} libraryId - Library ID of the live stream
2255
2285
  * @param {string} objectId - Object ID of the live stream
2286
+ * @param {string=} writeToken - Write token of the draft
2256
2287
  * @param {Array<string>} types - Specify which type of watermark to remove. Possible values:
2257
2288
  * - "image"
2258
2289
  * - "text"
2290
+ * - "forensic"
2259
2291
  * @param {boolean=} finalize - If enabled, target object will be finalized after removing watermark
2260
2292
  *
2261
2293
  * @return {Promise<Object>} - The finalize response
2262
2294
  */
2263
2295
  exports.StreamRemoveWatermark = /*#__PURE__*/function () {
2264
2296
  var _ref29 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee15(_ref28) {
2265
- var objectId, types, _ref28$finalize, finalize, libraryId, _yield$this$EditConte3, writeToken, edgeWriteToken, recordingParamsPath, recordingMetadata, finalizeResponse;
2297
+ var libraryId, objectId, writeToken, types, _ref28$finalize, finalize, _yield$this$EditConte3, edgeWriteToken, metadataPath, objectMetadata, finalizeResponse;
2266
2298
  return _regeneratorRuntime.wrap(function _callee15$(_context15) {
2267
2299
  while (1) switch (_context15.prev = _context15.next) {
2268
2300
  case 0:
2269
- objectId = _ref28.objectId, types = _ref28.types, _ref28$finalize = _ref28.finalize, finalize = _ref28$finalize === void 0 ? true : _ref28$finalize;
2301
+ libraryId = _ref28.libraryId, objectId = _ref28.objectId, writeToken = _ref28.writeToken, types = _ref28.types, _ref28$finalize = _ref28.finalize, finalize = _ref28$finalize === void 0 ? true : _ref28$finalize;
2270
2302
  ValidateObject(objectId);
2271
- _context15.next = 4;
2303
+ if (libraryId) {
2304
+ _context15.next = 6;
2305
+ break;
2306
+ }
2307
+ _context15.next = 5;
2272
2308
  return this.ContentObjectLibraryId({
2273
2309
  objectId: objectId
2274
2310
  });
2275
- case 4:
2311
+ case 5:
2276
2312
  libraryId = _context15.sent;
2277
- _context15.next = 7;
2313
+ case 6:
2314
+ if (writeToken) {
2315
+ _context15.next = 11;
2316
+ break;
2317
+ }
2318
+ _context15.next = 9;
2278
2319
  return this.EditContentObject({
2279
2320
  objectId: objectId,
2280
2321
  libraryId: libraryId
2281
2322
  });
2282
- case 7:
2323
+ case 9:
2283
2324
  _yield$this$EditConte3 = _context15.sent;
2284
2325
  writeToken = _yield$this$EditConte3.writeToken;
2326
+ case 11:
2285
2327
  this.Log("Removing watermark types: ".concat(types.join(", "), " ").concat(libraryId, " ").concat(objectId));
2286
- _context15.next = 12;
2328
+ _context15.next = 14;
2287
2329
  return this.ContentObjectMetadata({
2288
2330
  objectId: objectId,
2289
2331
  libraryId: libraryId,
2290
2332
  metadataSubtree: "/live_recording/fabric_config/edge_write_token"
2291
2333
  });
2292
- case 12:
2334
+ case 14:
2293
2335
  edgeWriteToken = _context15.sent;
2294
- recordingParamsPath = "live_recording/recording_config/recording_params";
2295
- _context15.next = 16;
2336
+ metadataPath = "live_recording/playout_config";
2337
+ _context15.next = 18;
2296
2338
  return this.ContentObjectMetadata({
2297
2339
  libraryId: libraryId,
2298
2340
  objectId: objectId,
2299
2341
  writeToken: writeToken,
2300
- metadataSubtree: recordingParamsPath,
2342
+ metadataSubtree: metadataPath,
2301
2343
  resolveLinks: false
2302
2344
  });
2303
- case 16:
2304
- recordingMetadata = _context15.sent;
2305
- if (recordingMetadata) {
2306
- _context15.next = 19;
2345
+ case 18:
2346
+ objectMetadata = _context15.sent;
2347
+ if (objectMetadata) {
2348
+ _context15.next = 21;
2307
2349
  break;
2308
2350
  }
2309
- throw Error("Stream object must be configured");
2310
- case 19:
2351
+ throw Error("Stream object must be configured before removing a watermark");
2352
+ case 21:
2311
2353
  types.forEach(function (type) {
2312
2354
  if (type === "text") {
2313
- delete recordingMetadata.simple_watermark;
2355
+ delete objectMetadata.simple_watermark;
2314
2356
  } else if (type === "image") {
2315
- delete recordingMetadata.image_watermark;
2357
+ delete objectMetadata.image_watermark;
2358
+ } else if (type === "forensic") {
2359
+ delete objectMetadata.forensic_watermark;
2316
2360
  }
2317
2361
  });
2318
- _context15.next = 22;
2362
+ _context15.next = 24;
2319
2363
  return this.ReplaceMetadata({
2320
2364
  libraryId: libraryId,
2321
2365
  objectId: objectId,
2322
2366
  writeToken: writeToken,
2323
- metadataSubtree: recordingParamsPath,
2324
- metadata: recordingMetadata
2367
+ metadataSubtree: metadataPath,
2368
+ metadata: objectMetadata
2325
2369
  });
2326
- case 22:
2370
+ case 24:
2327
2371
  if (!edgeWriteToken) {
2328
- _context15.next = 25;
2372
+ _context15.next = 27;
2329
2373
  break;
2330
2374
  }
2331
- _context15.next = 25;
2375
+ _context15.next = 27;
2332
2376
  return this.ReplaceMetadata({
2333
2377
  libraryId: libraryId,
2334
2378
  objectId: objectId,
2335
2379
  writeToken: edgeWriteToken,
2336
- metadataSubtree: recordingParamsPath,
2337
- metadata: recordingMetadata
2380
+ metadataSubtree: metadataPath,
2381
+ metadata: objectMetadata
2338
2382
  });
2339
- case 25:
2383
+ case 27:
2340
2384
  if (!finalize) {
2341
- _context15.next = 30;
2385
+ _context15.next = 32;
2342
2386
  break;
2343
2387
  }
2344
- _context15.next = 28;
2388
+ _context15.next = 30;
2345
2389
  return this.FinalizeContentObject({
2346
2390
  libraryId: libraryId,
2347
2391
  objectId: objectId,
2348
2392
  writeToken: writeToken,
2349
2393
  commitMessage: "Watermark removed"
2350
2394
  });
2351
- case 28:
2395
+ case 30:
2352
2396
  finalizeResponse = _context15.sent;
2353
2397
  return _context15.abrupt("return", finalizeResponse);
2354
- case 30:
2398
+ case 32:
2355
2399
  case "end":
2356
2400
  return _context15.stop();
2357
2401
  }
@@ -2367,109 +2411,177 @@ exports.StreamRemoveWatermark = /*#__PURE__*/function () {
2367
2411
  *
2368
2412
  * @methodGroup Live Stream
2369
2413
  * @namedParams
2414
+ * @param {string=} libraryId - Library ID of the live stream
2370
2415
  * @param {string} objectId - Object ID of the live stream
2416
+ * @param {string=} writeToken - Write token of the draft
2371
2417
  * @param {Object} simpleWatermark - Text watermark
2372
2418
  * @param {Object} imageWatermark - Image watermark
2419
+ * @param {Object} forensicWatermark - Forensic watermark
2373
2420
  * @param {boolean=} finalize - If enabled, target object will be finalized after adding watermark
2421
+ * Watermark examples:
2422
+ *
2423
+ * Simple Watermark:
2424
+ {
2425
+ "font_color": "",
2426
+ "font_relative_height": 0,
2427
+ "shadow": false,
2428
+ "template": "",
2429
+ "timecode": "",
2430
+ "timecode_rate": 0,
2431
+ "x": "",
2432
+ "y": ""
2433
+ }
2434
+ *
2435
+ * Image watermark:
2436
+ {
2437
+ "image": "",
2438
+ "align_h": "",
2439
+ "align_v": "",
2440
+ "target_video_height": 0,
2441
+ "wm_enabled": false
2442
+ }
2443
+ *
2444
+ * Forensic watermark:
2445
+ {
2446
+ "algo": 6,
2447
+ "forensic_duration": 0,
2448
+ "forensic_start": "",
2449
+ "image_a": <path_to_image>,
2450
+ "image_b": <path_to_image>,
2451
+ "is_stub": true,
2452
+ "payload_bit_nb": 23,
2453
+ "wm_enabled": true
2454
+ }
2455
+ *
2374
2456
  *
2375
2457
  * @return {Promise<Object>} - The finalize response
2376
2458
  */
2377
2459
  exports.StreamAddWatermark = /*#__PURE__*/function () {
2378
2460
  var _ref31 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee16(_ref30) {
2379
- var objectId, simpleWatermark, imageWatermark, _ref30$finalize, finalize, libraryId, _yield$this$EditConte4, writeToken, edgeWriteToken, recordingParamsPath, recordingMetadata, response, finalizeResponse;
2461
+ var libraryId, objectId, writeToken, simpleWatermark, imageWatermark, forensicWatermark, _ref30$finalize, finalize, _yield$this$EditConte4, edgeWriteToken, watermarkType, metadataPath, objectMetadata, watermarkArgCount, response, finalizeResponse;
2380
2462
  return _regeneratorRuntime.wrap(function _callee16$(_context16) {
2381
2463
  while (1) switch (_context16.prev = _context16.next) {
2382
2464
  case 0:
2383
- objectId = _ref30.objectId, simpleWatermark = _ref30.simpleWatermark, imageWatermark = _ref30.imageWatermark, _ref30$finalize = _ref30.finalize, finalize = _ref30$finalize === void 0 ? true : _ref30$finalize;
2465
+ libraryId = _ref30.libraryId, objectId = _ref30.objectId, writeToken = _ref30.writeToken, simpleWatermark = _ref30.simpleWatermark, imageWatermark = _ref30.imageWatermark, forensicWatermark = _ref30.forensicWatermark, _ref30$finalize = _ref30.finalize, finalize = _ref30$finalize === void 0 ? true : _ref30$finalize;
2384
2466
  ValidateObject(objectId);
2385
- _context16.next = 4;
2467
+ if (libraryId) {
2468
+ _context16.next = 6;
2469
+ break;
2470
+ }
2471
+ _context16.next = 5;
2386
2472
  return this.ContentObjectLibraryId({
2387
2473
  objectId: objectId
2388
2474
  });
2389
- case 4:
2475
+ case 5:
2390
2476
  libraryId = _context16.sent;
2391
- _context16.next = 7;
2477
+ case 6:
2478
+ if (writeToken) {
2479
+ _context16.next = 11;
2480
+ break;
2481
+ }
2482
+ _context16.next = 9;
2392
2483
  return this.EditContentObject({
2393
2484
  objectId: objectId,
2394
2485
  libraryId: libraryId
2395
2486
  });
2396
- case 7:
2487
+ case 9:
2397
2488
  _yield$this$EditConte4 = _context16.sent;
2398
2489
  writeToken = _yield$this$EditConte4.writeToken;
2399
- _context16.next = 11;
2490
+ case 11:
2491
+ _context16.next = 13;
2400
2492
  return this.ContentObjectMetadata({
2401
2493
  objectId: objectId,
2402
2494
  libraryId: libraryId,
2403
2495
  metadataSubtree: "/live_recording/fabric_config/edge_write_token"
2404
2496
  });
2405
- case 11:
2497
+ case 13:
2406
2498
  edgeWriteToken = _context16.sent;
2407
- this.Log("Adding watermarking type: ".concat(imageWatermark ? "image" : "text", " ").concat(libraryId, " ").concat(objectId));
2408
- recordingParamsPath = "live_recording/recording_config/recording_params";
2409
- _context16.next = 16;
2499
+ watermarkType = imageWatermark ? "image" : forensicWatermark ? "forensic" : "text";
2500
+ metadataPath = "live_recording/playout_config";
2501
+ this.Log("Adding watermarking type: ".concat(watermarkType, " ").concat(libraryId, " ").concat(objectId));
2502
+ _context16.next = 19;
2410
2503
  return this.ContentObjectMetadata({
2411
2504
  libraryId: libraryId,
2412
2505
  objectId: objectId,
2413
2506
  writeToken: writeToken,
2414
- metadataSubtree: recordingParamsPath,
2507
+ metadataSubtree: metadataPath,
2415
2508
  resolveLinks: false
2416
2509
  });
2417
- case 16:
2418
- recordingMetadata = _context16.sent;
2419
- if (recordingMetadata) {
2420
- _context16.next = 19;
2510
+ case 19:
2511
+ objectMetadata = _context16.sent;
2512
+ if (objectMetadata) {
2513
+ _context16.next = 22;
2421
2514
  break;
2422
2515
  }
2423
- throw Error("Stream object must be configured");
2424
- case 19:
2516
+ throw Error("Stream object must be configured before adding a watermark");
2517
+ case 22:
2518
+ watermarkArgCount = [simpleWatermark, imageWatermark, forensicWatermark].filter(function (i) {
2519
+ return !!i;
2520
+ }).length;
2521
+ console.log("watermark arg count", watermarkArgCount);
2522
+ if (!(watermarkArgCount === 0)) {
2523
+ _context16.next = 28;
2524
+ break;
2525
+ }
2526
+ throw Error("No watermark was provided");
2527
+ case 28:
2528
+ if (!(watermarkArgCount > 1)) {
2529
+ _context16.next = 30;
2530
+ break;
2531
+ }
2532
+ throw Error("Only one watermark is allowed");
2533
+ case 30:
2425
2534
  if (simpleWatermark) {
2426
- recordingMetadata.simple_watermark = simpleWatermark;
2535
+ objectMetadata.simple_watermark = simpleWatermark;
2427
2536
  } else if (imageWatermark) {
2428
- recordingMetadata.image_watermark = imageWatermark;
2537
+ objectMetadata.image_watermark = imageWatermark;
2538
+ } else if (forensicWatermark) {
2539
+ objectMetadata.forensic_watermark = forensicWatermark;
2429
2540
  }
2430
- _context16.next = 22;
2541
+ _context16.next = 33;
2431
2542
  return this.ReplaceMetadata({
2432
2543
  libraryId: libraryId,
2433
2544
  objectId: objectId,
2434
2545
  writeToken: writeToken,
2435
- metadataSubtree: recordingParamsPath,
2436
- metadata: recordingMetadata
2546
+ metadataSubtree: metadataPath,
2547
+ metadata: objectMetadata
2437
2548
  });
2438
- case 22:
2549
+ case 33:
2439
2550
  if (!edgeWriteToken) {
2440
- _context16.next = 25;
2551
+ _context16.next = 36;
2441
2552
  break;
2442
2553
  }
2443
- _context16.next = 25;
2554
+ _context16.next = 36;
2444
2555
  return this.ReplaceMetadata({
2445
2556
  libraryId: libraryId,
2446
2557
  objectId: objectId,
2447
2558
  writeToken: edgeWriteToken,
2448
- metadataSubtree: recordingParamsPath,
2449
- metadata: recordingMetadata
2559
+ metadataSubtree: metadataPath,
2560
+ metadata: objectMetadata
2450
2561
  });
2451
- case 25:
2562
+ case 36:
2452
2563
  response = {
2453
- "imageWatermark": recordingMetadata.image_watermark,
2454
- "textWatermark": recordingMetadata.simple_watermark
2564
+ "imageWatermark": objectMetadata.image_watermark,
2565
+ "textWatermark": objectMetadata.simple_watermark,
2566
+ "forensicWatermark": objectMetadata.forensic_watermark
2455
2567
  };
2456
2568
  if (!finalize) {
2457
- _context16.next = 31;
2569
+ _context16.next = 42;
2458
2570
  break;
2459
2571
  }
2460
- _context16.next = 29;
2572
+ _context16.next = 40;
2461
2573
  return this.FinalizeContentObject({
2462
2574
  libraryId: libraryId,
2463
2575
  objectId: objectId,
2464
2576
  writeToken: writeToken,
2465
2577
  commitMessage: "Watermark set"
2466
2578
  });
2467
- case 29:
2579
+ case 40:
2468
2580
  finalizeResponse = _context16.sent;
2469
2581
  response.hash = finalizeResponse.hash;
2470
- case 31:
2582
+ case 42:
2471
2583
  return _context16.abrupt("return", response);
2472
- case 32:
2584
+ case 43:
2473
2585
  case "end":
2474
2586
  return _context16.stop();
2475
2587
  }