@eluvio/elv-client-js 3.1.95 → 3.1.96

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.
@@ -353,7 +353,7 @@ var AuthorizationClient = /*#__PURE__*/function () {
353
353
  addr: Utils.FormatAddress(this.client.signer && this.client.signer.address || "")
354
354
  };
355
355
 
356
- if (!(!(this.noAuth || noAuth) && !this.client.signer.remoteSigner)) {
356
+ if (this.noAuth || noAuth) {
357
357
  _context3.next = 29;
358
358
  break;
359
359
  }
@@ -4318,6 +4318,15 @@ exports.CreateEncryptionConk = /*#__PURE__*/function () {
4318
4318
  switch (_context46.prev = _context46.next) {
4319
4319
  case 0:
4320
4320
  libraryId = _ref81.libraryId, objectId = _ref81.objectId, versionHash = _ref81.versionHash, writeToken = _ref81.writeToken, _ref81$createKMSConk = _ref81.createKMSConk, createKMSConk = _ref81$createKMSConk === void 0 ? true : _ref81$createKMSConk;
4321
+
4322
+ if (!this.signer.remoteSigner) {
4323
+ _context46.next = 3;
4324
+ break;
4325
+ }
4326
+
4327
+ return _context46.abrupt("return");
4328
+
4329
+ case 3:
4321
4330
  ValidateParameters({
4322
4331
  libraryId: libraryId,
4323
4332
  objectId: objectId,
@@ -4330,21 +4339,21 @@ exports.CreateEncryptionConk = /*#__PURE__*/function () {
4330
4339
  }
4331
4340
 
4332
4341
  if (libraryId) {
4333
- _context46.next = 8;
4342
+ _context46.next = 10;
4334
4343
  break;
4335
4344
  }
4336
4345
 
4337
- _context46.next = 7;
4346
+ _context46.next = 9;
4338
4347
  return this.ContentObjectLibraryId({
4339
4348
  objectId: objectId
4340
4349
  });
4341
4350
 
4342
- case 7:
4351
+ case 9:
4343
4352
  libraryId = _context46.sent;
4344
4353
 
4345
- case 8:
4354
+ case 10:
4346
4355
  capKey = "eluv.caps.iusr".concat(this.utils.AddressToHash(this.signer.address));
4347
- _context46.next = 11;
4356
+ _context46.next = 13;
4348
4357
  return this.ContentObjectMetadata({
4349
4358
  libraryId: libraryId,
4350
4359
  objectId: objectId,
@@ -4352,40 +4361,40 @@ exports.CreateEncryptionConk = /*#__PURE__*/function () {
4352
4361
  metadataSubtree: capKey
4353
4362
  });
4354
4363
 
4355
- case 11:
4364
+ case 13:
4356
4365
  existingUserCap = _context46.sent;
4357
4366
 
4358
4367
  if (!existingUserCap) {
4359
- _context46.next = 18;
4368
+ _context46.next = 20;
4360
4369
  break;
4361
4370
  }
4362
4371
 
4363
- _context46.next = 15;
4372
+ _context46.next = 17;
4364
4373
  return this.Crypto.DecryptCap(existingUserCap, this.signer.signingKey.privateKey);
4365
4374
 
4366
- case 15:
4375
+ case 17:
4367
4376
  this.encryptionConks[objectId] = _context46.sent;
4368
- _context46.next = 32;
4377
+ _context46.next = 34;
4369
4378
  break;
4370
4379
 
4371
- case 18:
4372
- _context46.next = 20;
4380
+ case 20:
4381
+ _context46.next = 22;
4373
4382
  return this.Crypto.GeneratePrimaryConk({
4374
4383
  spaceId: this.contentSpaceId,
4375
4384
  objectId: objectId
4376
4385
  });
4377
4386
 
4378
- case 20:
4387
+ case 22:
4379
4388
  this.encryptionConks[objectId] = _context46.sent;
4380
4389
  _context46.t0 = this;
4381
4390
  _context46.t1 = libraryId;
4382
4391
  _context46.t2 = objectId;
4383
4392
  _context46.t3 = writeToken;
4384
4393
  _context46.t4 = capKey;
4385
- _context46.next = 28;
4394
+ _context46.next = 30;
4386
4395
  return this.Crypto.EncryptConk(this.encryptionConks[objectId], this.signer.signingKey.publicKey);
4387
4396
 
4388
- case 28:
4397
+ case 30:
4389
4398
  _context46.t5 = _context46.sent;
4390
4399
  _context46.t6 = {
4391
4400
  libraryId: _context46.t1,
@@ -4394,32 +4403,32 @@ exports.CreateEncryptionConk = /*#__PURE__*/function () {
4394
4403
  metadataSubtree: _context46.t4,
4395
4404
  metadata: _context46.t5
4396
4405
  };
4397
- _context46.next = 32;
4406
+ _context46.next = 34;
4398
4407
  return _context46.t0.ReplaceMetadata.call(_context46.t0, _context46.t6);
4399
4408
 
4400
- case 32:
4409
+ case 34:
4401
4410
  if (!createKMSConk) {
4402
- _context46.next = 62;
4411
+ _context46.next = 64;
4403
4412
  break;
4404
4413
  }
4405
4414
 
4406
- _context46.prev = 33;
4407
- _context46.next = 36;
4415
+ _context46.prev = 35;
4416
+ _context46.next = 38;
4408
4417
  return this.authClient.KMSAddress({
4409
4418
  objectId: objectId
4410
4419
  });
4411
4420
 
4412
- case 36:
4421
+ case 38:
4413
4422
  kmsAddress = _context46.sent;
4414
- _context46.next = 39;
4423
+ _context46.next = 41;
4415
4424
  return this.authClient.KMSInfo({
4416
4425
  objectId: objectId
4417
4426
  });
4418
4427
 
4419
- case 39:
4428
+ case 41:
4420
4429
  kmsPublicKey = _context46.sent.publicKey;
4421
4430
  kmsCapKey = "eluv.caps.ikms".concat(this.utils.AddressToHash(kmsAddress));
4422
- _context46.next = 43;
4431
+ _context46.next = 45;
4423
4432
  return this.ContentObjectMetadata({
4424
4433
  libraryId: libraryId,
4425
4434
  // Cap may only exist in draft
@@ -4428,11 +4437,11 @@ exports.CreateEncryptionConk = /*#__PURE__*/function () {
4428
4437
  metadataSubtree: kmsCapKey
4429
4438
  });
4430
4439
 
4431
- case 43:
4440
+ case 45:
4432
4441
  existingKMSCap = _context46.sent;
4433
4442
 
4434
4443
  if (existingKMSCap) {
4435
- _context46.next = 56;
4444
+ _context46.next = 58;
4436
4445
  break;
4437
4446
  }
4438
4447
 
@@ -4441,10 +4450,10 @@ exports.CreateEncryptionConk = /*#__PURE__*/function () {
4441
4450
  _context46.t9 = objectId;
4442
4451
  _context46.t10 = writeToken;
4443
4452
  _context46.t11 = kmsCapKey;
4444
- _context46.next = 52;
4453
+ _context46.next = 54;
4445
4454
  return this.Crypto.EncryptConk(this.encryptionConks[objectId], kmsPublicKey);
4446
4455
 
4447
- case 52:
4456
+ case 54:
4448
4457
  _context46.t12 = _context46.sent;
4449
4458
  _context46.t13 = {
4450
4459
  libraryId: _context46.t8,
@@ -4453,30 +4462,30 @@ exports.CreateEncryptionConk = /*#__PURE__*/function () {
4453
4462
  metadataSubtree: _context46.t11,
4454
4463
  metadata: _context46.t12
4455
4464
  };
4456
- _context46.next = 56;
4465
+ _context46.next = 58;
4457
4466
  return _context46.t7.ReplaceMetadata.call(_context46.t7, _context46.t13);
4458
4467
 
4459
- case 56:
4460
- _context46.next = 62;
4468
+ case 58:
4469
+ _context46.next = 64;
4461
4470
  break;
4462
4471
 
4463
- case 58:
4464
- _context46.prev = 58;
4465
- _context46.t14 = _context46["catch"](33);
4472
+ case 60:
4473
+ _context46.prev = 60;
4474
+ _context46.t14 = _context46["catch"](35);
4466
4475
  // eslint-disable-next-line no-console
4467
4476
  console.error("Failed to create encryption cap for KMS:"); // eslint-disable-next-line no-console
4468
4477
 
4469
4478
  console.error(_context46.t14);
4470
4479
 
4471
- case 62:
4480
+ case 64:
4472
4481
  return _context46.abrupt("return", this.encryptionConks[objectId]);
4473
4482
 
4474
- case 63:
4483
+ case 65:
4475
4484
  case "end":
4476
4485
  return _context46.stop();
4477
4486
  }
4478
4487
  }
4479
- }, _callee46, this, [[33, 58]]);
4488
+ }, _callee46, this, [[35, 60]]);
4480
4489
  }));
4481
4490
 
4482
4491
  return function (_x45) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eluvio/elv-client-js",
3
- "version": "3.1.95",
3
+ "version": "3.1.96",
4
4
  "description": "Javascript client for the Eluvio Content Fabric",
5
5
  "main": "src/ElvClient.js",
6
6
  "author": "Kevin Talmadge",
@@ -57,7 +57,7 @@
57
57
  "dependencies": {
58
58
  "@babel/runtime": "^7.8.4",
59
59
  "@eluvio/crypto": ">=1.0.8",
60
- "@eluvio/elv-abr-profile": "^0.2.0",
60
+ "@eluvio/elv-abr-profile": "^1.0.0",
61
61
  "@sindresorhus/slugify": "^1.1.0",
62
62
  "babel-loader": "^8.0.6",
63
63
  "bignumber.js": "^8.0.2",
@@ -204,7 +204,7 @@ class AuthorizationClient {
204
204
  addr: Utils.FormatAddress(((this.client.signer && this.client.signer.address) || ""))
205
205
  };
206
206
 
207
- if(!(this.noAuth || noAuth) && !this.client.signer.remoteSigner) {
207
+ if(!(this.noAuth || noAuth)) {
208
208
  const { transactionHash } = await this.MakeAccessRequest({
209
209
  libraryId,
210
210
  objectId,
@@ -2332,6 +2332,10 @@ exports.LinkData = async function({libraryId, objectId, versionHash, writeToken,
2332
2332
  /* Encryption */
2333
2333
 
2334
2334
  exports.CreateEncryptionConk = async function({libraryId, objectId, versionHash, writeToken, createKMSConk=true}) {
2335
+ if(this.signer.remoteSigner) {
2336
+ return;
2337
+ }
2338
+
2335
2339
  ValidateParameters({libraryId, objectId, versionHash});
2336
2340
  ValidateWriteToken(writeToken);
2337
2341
 
@@ -9,7 +9,7 @@ const Logger = require("./lib/concerns/Logger");
9
9
 
10
10
  const permissionTypes = ["owner", "editable", "viewable", "listable", "public"];
11
11
 
12
- class ObjectAddGroupPerms extends Utility {
12
+ class ObjectSetPermission extends Utility {
13
13
  blueprint() {
14
14
  return {
15
15
  concerns: [Logger, ArgObjectId, Client],
@@ -55,7 +55,7 @@ class ObjectAddGroupPerms extends Utility {
55
55
  }
56
56
 
57
57
  if(require.main === module) {
58
- Utility.cmdLineInvoke(ObjectAddGroupPerms);
58
+ Utility.cmdLineInvoke(ObjectSetPermission);
59
59
  } else {
60
- module.exports = ObjectAddGroupPerms;
61
- }
60
+ module.exports = ObjectSetPermission;
61
+ }
@@ -53,6 +53,10 @@ class SimpleIngest extends Utility {
53
53
  const libABRProfile = R.path(["metadata", "abr", "default_profile"], libInfo);
54
54
  if(R.isNil(libABRProfile)) throw Error("Library does not specify ABR profile for simple ingests");
55
55
 
56
+ const libMezManageGroups = R.path(["metadata", "abr", "mez_manage_groups"], libInfo);
57
+
58
+ const libMezPermission = R.path(["metadata", "abr", "mez_permission_level"], libInfo);
59
+
56
60
  const {drm, libraryId, title} = this.args;
57
61
  const encrypt = true;
58
62
 
@@ -91,6 +95,7 @@ class SimpleIngest extends Utility {
91
95
 
92
96
  if(!R.isNil(createMasterResponse.errors) && !R.isEmpty(createMasterResponse.errors)) throw Error(`Error(s) encountered while inspecting uploaded files: ${createMasterResponse.errors.join("\n")}`);
93
97
 
98
+ // TODO: replace with a 'waitForNewObject' call (Finalize.waitForPublish throws exception for brand new object not yet visible)
94
99
  await seconds(2);
95
100
 
96
101
  await this.concerns.Finalize.waitForPublish({
@@ -218,6 +223,42 @@ class SimpleIngest extends Utility {
218
223
  const finalizeErrors = finalizeAbrResponse.errors;
219
224
  if(!R.isNil(finalizeErrors) && !R.isEmpty(finalizeErrors)) throw Error(`Error(s) encountered while finalizing object: ${finalizeErrors.join("\n")}`);
220
225
 
226
+ if(libMezManageGroups && libMezManageGroups.length > 0){
227
+ for(const groupAddress of libMezManageGroups){
228
+ logger.log("Setting access permissions for managers");
229
+ await client.AddContentObjectGroupPermission({
230
+ objectId: id,
231
+ groupAddress,
232
+ permission: "manage"
233
+ });
234
+
235
+ }
236
+ }
237
+
238
+ if(libMezPermission) {
239
+ if(!["owner", "editable", "viewable", "listable", "public"].includes(libMezPermission)) {
240
+ logger.warn(`Bad value for mez_permission_level: '${libMezPermission}', skipping permission setting`);
241
+ } else {
242
+ logger.log(`Setting object permission to '${libMezPermission}'`);
243
+ const prevHash = await client.LatestVersionHash({objectId: id});
244
+
245
+ await client.SetPermission({
246
+ objectId: id,
247
+ permission: libMezPermission
248
+ });
249
+
250
+ const newHash = await client.LatestVersionHash({objectId: id});
251
+
252
+ if(prevHash === newHash) {
253
+ logger.log("Version hash unchanged: " + newHash );
254
+ } else {
255
+ logger.log("Previous version hash: " + prevHash );
256
+ logger.log("New version hash: " + newHash );
257
+ }
258
+ logger.data("version_hash", newHash);
259
+ }
260
+ }
261
+
221
262
  logger.logList(
222
263
  "",
223
264
  "Playable media object created:",
@@ -0,0 +1,180 @@
1
+ {
2
+ "abr": {
3
+ "comments": [
4
+ "For movies/TV - snapAR is set to true, this profile will attempt to conform aspect ratio to nearby standard",
5
+ "also specifies 'store encrypted', offers both clear and drm playout formats"
6
+ ],
7
+ "mez_content_type": "YOUR_TITLE_(MEZ)_CONTENT_TYPE_ID",
8
+ "mez_manage_groups": [
9
+ "ADDRESS_FOR_YOUR_CONTENT_ADMINS_GROUP"
10
+ ],
11
+ "mez_permission_level": "ONE_OF_THE_FOLLOWING: owner, editable, viewable, listable, public",
12
+ "default_profile": {
13
+ "drm_optional": true,
14
+ "store_clear": false,
15
+ "video_parametric_ladder": {
16
+ "baseAspectRatio": "16/9",
17
+ "baseFrameRate": "30",
18
+ "rungSpecs": [
19
+ {
20
+ "dim": 2160,
21
+ "bitrate": 14000000
22
+ },
23
+ {
24
+ "dim": 1440,
25
+ "bitrate": 11500000
26
+ },
27
+ {
28
+ "dim": 1080,
29
+ "bitrate": 9500000
30
+ },
31
+ {
32
+ "dim": 720,
33
+ "bitrate": 4500000
34
+ },
35
+ {
36
+ "dim": 480,
37
+ "bitrate": 1750000
38
+ },
39
+ {
40
+ "dim": 360,
41
+ "bitrate": 810000
42
+ },
43
+ {
44
+ "dim": 240,
45
+ "bitrate": 500000
46
+ }
47
+ ],
48
+ "options": {
49
+ "upscale": false,
50
+ "snapAR": true,
51
+ "maxARSnap": 0.06,
52
+ "minDimStepdown": 0.12,
53
+ "frameRateScaleFactor": 0.5
54
+ },
55
+ "limits": {
56
+ "aspectRatioMax": "3",
57
+ "aspectRatioMin": "1/3",
58
+ "avgBitrateMax": 100000000,
59
+ "avgBitrateMin": 100000,
60
+ "fileSizeMax": 100000000,
61
+ "fileSizeMin": 10000,
62
+ "durationMax": 14400,
63
+ "durationMin": 1,
64
+ "finalBitrateMax": 30000000,
65
+ "frameRateMax": "60",
66
+ "frameRateMin": "15",
67
+ "heightMax": 5000,
68
+ "heightMin": 100,
69
+ "sampleAspectRatioMax": "3/2",
70
+ "sampleAspectRatioMin": "2/3",
71
+ "widthMax": 5000,
72
+ "widthMin": 100
73
+ }
74
+ },
75
+ "ladder_specs": {
76
+ "{\"media_type\":\"audio\",\"channels\":1}": {
77
+ "rung_specs": [
78
+ {
79
+ "bit_rate": 128000,
80
+ "media_type": "audio",
81
+ "pregenerate": true
82
+ }
83
+ ]
84
+ },
85
+ "{\"media_type\":\"audio\",\"channels\":2}": {
86
+ "rung_specs": [
87
+ {
88
+ "bit_rate": 192000,
89
+ "media_type": "audio",
90
+ "pregenerate": true
91
+ }
92
+ ]
93
+ },
94
+ "{\"media_type\":\"audio\",\"channels\":6}": {
95
+ "rung_specs": [
96
+ {
97
+ "bit_rate": 384000,
98
+ "media_type": "audio",
99
+ "pregenerate": true
100
+ }
101
+ ]
102
+ }
103
+ },
104
+ "playout_formats": {
105
+ "dash-widevine": {
106
+ "drm": {
107
+ "content_id": "",
108
+ "enc_scheme_name": "cenc",
109
+ "license_servers": [],
110
+ "type": "DrmWidevine"
111
+ },
112
+ "protocol": {
113
+ "min_buffer_length": 2,
114
+ "type": "ProtoDash"
115
+ }
116
+ },
117
+ "hls-aes128": {
118
+ "drm": {
119
+ "enc_scheme_name": "aes-128",
120
+ "type": "DrmAes128"
121
+ },
122
+ "protocol": {
123
+ "type": "ProtoHls"
124
+ }
125
+ },
126
+ "hls-fairplay": {
127
+ "drm": {
128
+ "enc_scheme_name": "cbcs",
129
+ "license_servers": [],
130
+ "type": "DrmFairplay"
131
+ },
132
+ "protocol": {
133
+ "type": "ProtoHls"
134
+ }
135
+ },
136
+ "hls-sample-aes": {
137
+ "drm": {
138
+ "enc_scheme_name": "cbcs",
139
+ "type": "DrmSampleAes"
140
+ },
141
+ "protocol": {
142
+ "type": "ProtoHls"
143
+ }
144
+ },
145
+ "dash-clear": {
146
+ "drm": null,
147
+ "protocol": {
148
+ "min_buffer_length": 2,
149
+ "type": "ProtoDash"
150
+ }
151
+ },
152
+ "hls-clear": {
153
+ "drm": null,
154
+ "protocol": {
155
+ "type": "ProtoHls"
156
+ }
157
+ }
158
+ },
159
+ "segment_specs": {
160
+ "audio": {
161
+ "segs_per_chunk": 15,
162
+ "target_dur": 2
163
+ },
164
+ "video": {
165
+ "segs_per_chunk": 15,
166
+ "target_dur": 2
167
+ }
168
+ }
169
+ }
170
+ },
171
+ "elv": {
172
+ "media": {
173
+ "drm": {
174
+ "fps": {
175
+ "cert": "MIIExzCCA6+gAwIBAgIIHyfkXhxLHC4wDQYJKoZIhvcNAQEFBQAwfzELMAkGA1UEBhMCVVMxEzARBgNVBAoMCkFwcGxlIEluYy4xJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYDVQQDDCpBcHBsZSBLZXkgU2VydmljZXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMjAwOTEyMDMzMjI0WhcNMjIwOTEzMDMzMjI0WjBgMQswCQYDVQQGEwJVUzETMBEGA1UECgwKRWx1dmlvIEluYzETMBEGA1UECwwKMktIOEtDM01NWDEnMCUGA1UEAwweRmFpclBsYXkgU3RyZWFtaW5nOiBFbHV2aW8gSW5jMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDslbBURB6gj07g7VrS7Ojixe7FNZOupomcZt+mtMvyavjg7X7/T4RccmKUQxOoMLKCJcQ6WrdHhIpN8+bciq7lr0mNzaN467zREiUNYOpkVPi13sJLieY2m2MEPOQTbIl52Cu1YyH+4/g1dKPmeguSnzZRo36jsCGHlJBjHq0jkQIDAQABo4IB6DCCAeQwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBRj5EdUy4VxWUYsg6zMRDFkZwMsvjCB4gYDVR0gBIHaMIHXMIHUBgkqhkiG92NkBQEwgcYwgcMGCCsGAQUFBwICMIG2DIGzUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2NlcHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRpZmljYXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wNQYDVR0fBC4wLDAqoCigJoYkaHR0cDovL2NybC5hcHBsZS5jb20va2V5c2VydmljZXMuY3JsMB0GA1UdDgQWBBR4jerseBHEUDC7mU+NQuIzZqHRFDAOBgNVHQ8BAf8EBAMCBSAwOAYLKoZIhvdjZAYNAQMBAf8EJgFuNnNkbHQ2OXFuc3l6eXp5bWFzdmdudGthbWd2bGE1Y212YzdpMC4GCyqGSIb3Y2QGDQEEAQH/BBwBd252bHhlbGV1Y3Vpb2JyZW4yeHZlZmV6N2Y5MA0GCSqGSIb3DQEBBQUAA4IBAQBM17YYquw0soDPAadr1aIM6iC6BQ/kOGYu3y/6AlrwYgAQNFy8DjsQUoqlQWFuA0sigp57bTUymkXEBf9yhUmXXiPafGjbxzsPF5SPFLIciolWbxRCB153L1a/Vh2wg3rhf4IvAZuJpnml6SSg5SjD19bN+gD7zrtp3yWKBKuarLSjDvVIB1SoxEToBs3glAEqoBiA2eZjikBA0aBlbvjUF2gqOmZjZJ7dmG1Tos2Zd4SdGL6ltSpKUeSGSxyv41aqF83vNpymNJmey2t2kPPtC7mt0LM32Ift3AkAl8Za9JbV/pOnc95oAfPhVTOGOI+u2BuB2qaKWjqHwkfqCz4A"
176
+ }
177
+ }
178
+ }
179
+ }
180
+ }
@@ -0,0 +1,133 @@
1
+ {
2
+ "abr": {
3
+ "comments": [
4
+ "For animation NFTs that are not movie/TV clips - snapAR is set to false",
5
+ "also specifies 'store clear', only offers clear playout formats (no drm)",
6
+ "and object permission 'listable'.",
7
+ "does not include DRM cert @ /elv/media/drm/fps/cert"
8
+ ],
9
+ "mez_content_type": "YOUR_TITLE_(NFT)_CONTENT_TYPE_ID",
10
+ "mez_manage_groups": [
11
+ "ADDRESS_FOR_YOUR_CONTENT_ADMINS_GROUP"
12
+ ],
13
+ "mez_permission_level": "listable",
14
+ "default_profile": {
15
+ "drm_optional": true,
16
+ "store_clear": true,
17
+ "video_parametric_ladder": {
18
+ "baseAspectRatio": "16/9",
19
+ "baseFrameRate": "30",
20
+ "rungSpecs": [
21
+ {
22
+ "dim": 2160,
23
+ "bitrate": 14000000
24
+ },
25
+ {
26
+ "dim": 1440,
27
+ "bitrate": 11500000
28
+ },
29
+ {
30
+ "dim": 1080,
31
+ "bitrate": 9500000
32
+ },
33
+ {
34
+ "dim": 720,
35
+ "bitrate": 4500000
36
+ },
37
+ {
38
+ "dim": 480,
39
+ "bitrate": 1750000
40
+ },
41
+ {
42
+ "dim": 360,
43
+ "bitrate": 810000
44
+ },
45
+ {
46
+ "dim": 240,
47
+ "bitrate": 500000
48
+ }
49
+ ],
50
+ "options": {
51
+ "upscale": false,
52
+ "snapAR": false,
53
+ "maxARSnap": 0.06,
54
+ "minDimStepdown": 0.12,
55
+ "frameRateScaleFactor": 0.5
56
+ },
57
+ "limits": {
58
+ "aspectRatioMax": "3",
59
+ "aspectRatioMin": "1/3",
60
+ "avgBitrateMax": 100000000,
61
+ "avgBitrateMin": 100000,
62
+ "fileSizeMax": 100000000,
63
+ "fileSizeMin": 10000,
64
+ "durationMax": 14400,
65
+ "durationMin": 1,
66
+ "finalBitrateMax": 30000000,
67
+ "frameRateMax": "60",
68
+ "frameRateMin": "15",
69
+ "heightMax": 5000,
70
+ "heightMin": 100,
71
+ "sampleAspectRatioMax": "3/2",
72
+ "sampleAspectRatioMin": "2/3",
73
+ "widthMax": 5000,
74
+ "widthMin": 100
75
+ }
76
+ },
77
+ "ladder_specs": {
78
+ "{\"media_type\":\"audio\",\"channels\":1}": {
79
+ "rung_specs": [
80
+ {
81
+ "bit_rate": 128000,
82
+ "media_type": "audio",
83
+ "pregenerate": true
84
+ }
85
+ ]
86
+ },
87
+ "{\"media_type\":\"audio\",\"channels\":2}": {
88
+ "rung_specs": [
89
+ {
90
+ "bit_rate": 192000,
91
+ "media_type": "audio",
92
+ "pregenerate": true
93
+ }
94
+ ]
95
+ },
96
+ "{\"media_type\":\"audio\",\"channels\":6}": {
97
+ "rung_specs": [
98
+ {
99
+ "bit_rate": 384000,
100
+ "media_type": "audio",
101
+ "pregenerate": true
102
+ }
103
+ ]
104
+ }
105
+ },
106
+ "playout_formats": {
107
+ "dash-clear": {
108
+ "drm": null,
109
+ "protocol": {
110
+ "min_buffer_length": 2,
111
+ "type": "ProtoDash"
112
+ }
113
+ },
114
+ "hls-clear": {
115
+ "drm": null,
116
+ "protocol": {
117
+ "type": "ProtoHls"
118
+ }
119
+ }
120
+ },
121
+ "segment_specs": {
122
+ "audio": {
123
+ "segs_per_chunk": 15,
124
+ "target_dur": 2
125
+ },
126
+ "video": {
127
+ "segs_per_chunk": 15,
128
+ "target_dur": 2
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }