shaka-player 3.3.4 → 4.0.1

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 (201) hide show
  1. package/.github/config.yml +1 -0
  2. package/.github/workflows/build-and-test.yaml +0 -1
  3. package/.github/workflows/demo-version-index.yaml +8 -0
  4. package/.github/workflows/release-please.yaml +19 -3
  5. package/.github/workflows/selenium-lab-tests.yaml +0 -1
  6. package/.github/workflows/sync-labels.yaml +33 -0
  7. package/.github/workflows/update-issues.yaml +29 -0
  8. package/.github/workflows/validate-pr-title.yaml +35 -0
  9. package/AUTHORS +1 -0
  10. package/CHANGELOG.md +209 -28
  11. package/CONTRIBUTORS +1 -0
  12. package/README.md +10 -7
  13. package/app-engine/demo-version-index/README.md +3 -3
  14. package/app-engine/demo-version-index/app.yaml +27 -1
  15. package/app-engine/demo-version-index/generate.py +164 -0
  16. package/app-engine/demo-version-index/main.py +4 -155
  17. package/app-engine/demo-version-index/requirements.txt +0 -1
  18. package/build/README.md +2 -2
  19. package/build/compiler.py +1 -1
  20. package/build/generateTsDefs.py +0 -2
  21. package/build/misspellings.txt +1 -0
  22. package/build/shaka-lab.yaml +0 -2
  23. package/build/test.py +7 -1
  24. package/build/types/core +0 -1
  25. package/build/types/polyfill +0 -3
  26. package/demo/common/asset.js +17 -1
  27. package/demo/common/assets.js +29 -0
  28. package/demo/common/message_ids.js +6 -3
  29. package/demo/config.js +10 -11
  30. package/demo/custom.js +39 -0
  31. package/demo/demo_utils.js +0 -1
  32. package/demo/locales/en.json +6 -3
  33. package/demo/locales/source.json +22 -10
  34. package/demo/main.js +9 -6
  35. package/demo/search.js +2 -1
  36. package/dist/controls.css +1 -1
  37. package/dist/demo.compiled.debug.js +71 -64
  38. package/dist/demo.compiled.debug.map +3 -3
  39. package/dist/demo.compiled.js +71 -64
  40. package/dist/demo.compiled.map +3 -3
  41. package/dist/demo.css +1 -1
  42. package/dist/demo.css.map +1 -1
  43. package/dist/deps.js +16 -20
  44. package/dist/locales.js +33 -31
  45. package/dist/receiver.compiled.debug.js +32 -28
  46. package/dist/receiver.compiled.debug.map +3 -3
  47. package/dist/receiver.compiled.js +32 -28
  48. package/dist/receiver.compiled.map +3 -3
  49. package/dist/shaka-player.compiled.d.ts +78 -82
  50. package/dist/shaka-player.compiled.debug.d.ts +78 -82
  51. package/dist/shaka-player.compiled.debug.externs.js +127 -126
  52. package/dist/shaka-player.compiled.debug.js +471 -523
  53. package/dist/shaka-player.compiled.debug.map +4 -4
  54. package/dist/shaka-player.compiled.externs.js +127 -126
  55. package/dist/shaka-player.compiled.js +844 -858
  56. package/dist/shaka-player.compiled.map +4 -4
  57. package/dist/shaka-player.ui.d.ts +80 -82
  58. package/dist/shaka-player.ui.debug.d.ts +80 -82
  59. package/dist/shaka-player.ui.debug.externs.js +135 -126
  60. package/dist/shaka-player.ui.debug.js +531 -581
  61. package/dist/shaka-player.ui.debug.map +4 -4
  62. package/dist/shaka-player.ui.externs.js +135 -126
  63. package/dist/shaka-player.ui.js +991 -1001
  64. package/dist/shaka-player.ui.map +4 -4
  65. package/docs/tutorials/config.md +0 -2
  66. package/docs/tutorials/drm-config.md +5 -0
  67. package/docs/tutorials/fairplay.md +7 -22
  68. package/docs/tutorials/faq.md +0 -11
  69. package/docs/tutorials/index.json +2 -8
  70. package/docs/tutorials/plugins.md +1 -3
  71. package/docs/tutorials/upgrade.md +85 -11
  72. package/externs/polyfill.js +15 -0
  73. package/externs/shaka/manifest.js +5 -1
  74. package/externs/shaka/net.js +12 -0
  75. package/externs/shaka/offline.js +5 -1
  76. package/externs/shaka/player.js +39 -21
  77. package/externs/shaka/text.js +12 -12
  78. package/externs/sourcebuffer.js +15 -0
  79. package/karma.conf.js +4 -0
  80. package/lib/ads/client_side_ad.js +13 -2
  81. package/lib/ads/client_side_ad_manager.js +22 -4
  82. package/lib/cast/cast_utils.js +0 -1
  83. package/lib/dash/content_protection.js +85 -5
  84. package/lib/dash/dash_parser.js +3 -3
  85. package/lib/hls/hls_parser.js +391 -747
  86. package/lib/hls/manifest_text_parser.js +2 -3
  87. package/lib/media/drm_engine.js +102 -37
  88. package/lib/media/gap_jumping_controller.js +10 -45
  89. package/lib/media/media_source_engine.js +157 -31
  90. package/lib/media/playhead.js +2 -5
  91. package/lib/media/presentation_timeline.js +1 -2
  92. package/lib/media/segment_index.js +13 -46
  93. package/lib/media/segment_reference.js +47 -1
  94. package/lib/media/streaming_engine.js +28 -11
  95. package/lib/media/time_ranges_utils.js +4 -9
  96. package/lib/net/networking_engine.js +3 -0
  97. package/lib/offline/indexeddb/storage_mechanism.js +4 -2
  98. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  99. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  100. package/lib/offline/manifest_converter.js +1 -0
  101. package/lib/offline/storage.js +100 -132
  102. package/lib/player.js +181 -307
  103. package/lib/polyfill/media_capabilities.js +12 -6
  104. package/lib/polyfill/mediasource.js +0 -28
  105. package/lib/polyfill/patchedmediakeys_nop.js +2 -0
  106. package/lib/polyfill/patchedmediakeys_webkit.js +2 -0
  107. package/lib/text/cue.js +0 -6
  108. package/lib/text/lrc_text_parser.js +8 -0
  109. package/lib/text/mp4_ttml_parser.js +8 -0
  110. package/lib/text/mp4_vtt_parser.js +8 -0
  111. package/lib/text/sbv_text_parser.js +8 -0
  112. package/lib/text/simple_text_displayer.js +1 -7
  113. package/lib/text/srt_text_parser.js +8 -0
  114. package/lib/text/ssa_text_parser.js +8 -0
  115. package/lib/text/text_engine.js +19 -3
  116. package/lib/text/ttml_text_parser.js +8 -0
  117. package/lib/text/ui_text_displayer.js +1 -7
  118. package/lib/text/vtt_text_parser.js +27 -5
  119. package/lib/text/web_vtt_generator.js +1 -7
  120. package/lib/util/config_utils.js +25 -0
  121. package/lib/util/error.js +16 -13
  122. package/lib/util/fairplay_utils.js +109 -0
  123. package/lib/util/functional.js +0 -42
  124. package/lib/util/manifest_parser_utils.js +1 -1
  125. package/lib/util/mime_utils.js +50 -1
  126. package/lib/util/periods.js +5 -4
  127. package/lib/util/platform.js +45 -0
  128. package/lib/util/player_configuration.js +26 -20
  129. package/lib/util/pssh.js +23 -4
  130. package/lib/util/stream_utils.js +96 -24
  131. package/lib/util/uint8array_utils.js +0 -16
  132. package/lib/util/xml_utils.js +1 -1
  133. package/package.json +4 -1
  134. package/roadmap.md +19 -19
  135. package/shaka-player.uncompiled.js +0 -3
  136. package/test/cast/cast_utils_unit.js +1 -0
  137. package/test/dash/dash_parser_content_protection_unit.js +44 -0
  138. package/test/dash/dash_parser_manifest_unit.js +0 -24
  139. package/test/dash/dash_parser_segment_template_unit.js +3 -4
  140. package/test/demo/demo_unit.js +2 -1
  141. package/test/hls/hls_live_unit.js +121 -220
  142. package/test/hls/hls_parser_unit.js +515 -432
  143. package/test/hls/manifest_text_parser_unit.js +19 -0
  144. package/test/media/drm_engine_unit.js +86 -120
  145. package/test/media/media_source_engine_integration.js +26 -3
  146. package/test/media/media_source_engine_unit.js +7 -6
  147. package/test/media/playhead_unit.js +27 -191
  148. package/test/media/segment_index_unit.js +15 -25
  149. package/test/media/streaming_engine_integration.js +4 -39
  150. package/test/media/streaming_engine_unit.js +3 -2
  151. package/test/media/time_ranges_utils_unit.js +0 -5
  152. package/test/offline/indexeddb_storage_unit.js +1 -1
  153. package/test/offline/manifest_convert_unit.js +34 -4
  154. package/test/offline/offline_manifest_parser_unit.js +1 -0
  155. package/test/offline/storage_compatibility_unit.js +1 -1
  156. package/test/offline/storage_integration.js +5 -4
  157. package/test/player_external.js +7 -7
  158. package/test/player_integration.js +22 -10
  159. package/test/player_src_equals_integration.js +81 -83
  160. package/test/player_unit.js +124 -1
  161. package/test/test/boot.js +9 -0
  162. package/test/test/externs/filters.js +4 -0
  163. package/test/test/util/fake_media_source_engine.js +11 -4
  164. package/test/test/util/manifest_generator.js +3 -1
  165. package/test/test/util/manifest_parser_util.js +4 -1
  166. package/test/test/util/offline_utils.js +1 -0
  167. package/test/test/util/simple_fakes.js +31 -2
  168. package/test/test/util/streaming_engine_util.js +1 -0
  169. package/test/test/util/test_scheme.js +24 -1
  170. package/test/test/util/util.js +4 -4
  171. package/test/text/cue_integration.js +2 -2
  172. package/test/text/lrc_text_parser_unit.js +6 -7
  173. package/test/text/mp4_ttml_parser_unit.js +6 -4
  174. package/test/text/mp4_vtt_parser_unit.js +6 -5
  175. package/test/text/sbv_text_parser_unit.js +5 -6
  176. package/test/text/srt_text_parser_unit.js +5 -6
  177. package/test/text/ssa_text_parser_unit.js +17 -29
  178. package/test/text/text_engine_unit.js +45 -5
  179. package/test/text/ttml_text_parser_unit.js +77 -77
  180. package/test/text/vtt_text_parser_unit.js +116 -59
  181. package/test/ui/ui_integration.js +0 -16
  182. package/test/ui/ui_unit.js +27 -0
  183. package/test/util/cmcd_manager_unit.js +3 -0
  184. package/test/util/mime_utils_unit.js +54 -0
  185. package/test/util/periods_unit.js +79 -0
  186. package/test/util/stream_utils_unit.js +23 -7
  187. package/ui/controls.js +65 -40
  188. package/ui/fullscreen_button.js +26 -6
  189. package/ui/less/containers.less +3 -3
  190. package/ui/locales/en.json +1 -0
  191. package/ui/locales/source.json +5 -0
  192. package/ui/resolution_selection.js +31 -33
  193. package/ui/ui.js +0 -17
  194. package/docs/tutorials/gsoc-ideas-list.md +0 -3
  195. package/docs/tutorials/upgrade-v2-5.md +0 -441
  196. package/docs/tutorials/upgrade-v3.md +0 -38
  197. package/lib/polyfill/mathround.js +0 -49
  198. package/lib/polyfill/patchedmediakeys_apple.js +0 -744
  199. package/lib/polyfill/patchedmediakeys_ms.js +0 -698
  200. package/lib/util/mutex.js +0 -52
  201. package/test/util/functional_unit.js +0 -82
@@ -68,7 +68,7 @@ shaka.dash.ContentProtection = class {
68
68
 
69
69
  if (parsedNonCenc.length) {
70
70
  drmInfos = ContentProtection.convertElements_(
71
- defaultInit, parsedNonCenc, keySystemsByURI);
71
+ defaultInit, parsedNonCenc, keySystemsByURI, keyIds);
72
72
 
73
73
  // If there are no drmInfos after parsing, then add a dummy entry.
74
74
  // This may be removed in parseKeyIds.
@@ -180,6 +180,27 @@ shaka.dash.ContentProtection = class {
180
180
  return '';
181
181
  }
182
182
 
183
+ /**
184
+ * Gets a ClearKey license URL from a content protection element
185
+ * containing a custom `clearkey::Laurl` element
186
+ *
187
+ * @param {shaka.dash.ContentProtection.Element} element
188
+ * @return {string}
189
+ */
190
+ static getClearKeyLicenseUrl(element) {
191
+ const clearKeyLaurlNode = shaka.util.XmlUtils.findChildNS(
192
+ element.node, shaka.dash.ContentProtection.ClearKeyNamespaceUri_,
193
+ 'Laurl',
194
+ );
195
+ if (clearKeyLaurlNode &&
196
+ clearKeyLaurlNode.getAttribute('Lic_type') === 'EME-1.0') {
197
+ if (clearKeyLaurlNode.textContent) {
198
+ return clearKeyLaurlNode.textContent;
199
+ }
200
+ }
201
+ return '';
202
+ }
203
+
183
204
  /**
184
205
  * Parses an Array buffer starting at byteOffset for PlayReady Object Records.
185
206
  * Each PRO Record is preceded by its PlayReady Record type and length in
@@ -335,7 +356,41 @@ shaka.dash.ContentProtection = class {
335
356
  0x9a, 0x04, 0xf0, 0x79, 0x98, 0x40, 0x42, 0x86,
336
357
  0xab, 0x92, 0xe6, 0x5b, 0xe0, 0x88, 0x5f, 0x95,
337
358
  ]);
338
- const pssh = shaka.util.Pssh.createPssh(data, systemId);
359
+ const keyIds = new Set();
360
+ const psshVersion = 0;
361
+ const pssh =
362
+ shaka.util.Pssh.createPssh(data, systemId, keyIds, psshVersion);
363
+ return [
364
+ {
365
+ initData: pssh,
366
+ initDataType: 'cenc',
367
+ keyId: element.keyId,
368
+ },
369
+ ];
370
+ }
371
+
372
+ /**
373
+ * Creates ClearKey initData from Default_KID value retrieved from previously
374
+ * parsed ContentProtection tag.
375
+ * @param {shaka.dash.ContentProtection.Element} element
376
+ * @param {!Set.<string>} keyIds
377
+ * @return {?Array.<shaka.extern.InitDataOverride>}
378
+ * @private
379
+ */
380
+ static getInitDataClearKey_(element, keyIds) {
381
+ if (keyIds.size == 0) {
382
+ return null;
383
+ }
384
+
385
+ const systemId = new Uint8Array([
386
+ 0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02,
387
+ 0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b,
388
+ ]);
389
+ const data = new Uint8Array([]);
390
+ const psshVersion = 1;
391
+ const pssh =
392
+ shaka.util.Pssh.createPssh(data, systemId, keyIds, psshVersion);
393
+
339
394
  return [
340
395
  {
341
396
  initData: pssh,
@@ -351,10 +406,11 @@ shaka.dash.ContentProtection = class {
351
406
  * @param {Array.<shaka.extern.InitDataOverride>} defaultInit
352
407
  * @param {!Array.<shaka.dash.ContentProtection.Element>} elements
353
408
  * @param {!Object.<string, string>} keySystemsByURI
409
+ * @param {!Set.<string>} keyIds
354
410
  * @return {!Array.<shaka.extern.DrmInfo>}
355
411
  * @private
356
412
  */
357
- static convertElements_(defaultInit, elements, keySystemsByURI) {
413
+ static convertElements_(defaultInit, elements, keySystemsByURI, keyIds) {
358
414
  const ContentProtection = shaka.dash.ContentProtection;
359
415
  const ManifestParserUtils = shaka.util.ManifestParserUtils;
360
416
  const licenseUrlParsers = ContentProtection.licenseUrlParsers_;
@@ -370,7 +426,14 @@ shaka.dash.ContentProtection = class {
370
426
  'Init data must be null or non-empty.');
371
427
 
372
428
  const proInitData = ContentProtection.getInitDataFromPro_(element);
373
- const initData = element.init || defaultInit || proInitData;
429
+ let clearKeyInitData = null;
430
+ if (element.schemeUri ===
431
+ shaka.dash.ContentProtection.ClearKeySchemeUri_) {
432
+ clearKeyInitData =
433
+ ContentProtection.getInitDataClearKey_(element, keyIds);
434
+ }
435
+ const initData = element.init || defaultInit || proInitData ||
436
+ clearKeyInitData;
374
437
  const info = ManifestParserUtils.createDrmInfo(keySystem, initData);
375
438
  const licenseParser = licenseUrlParsers.get(keySystem);
376
439
  if (licenseParser) {
@@ -562,7 +625,9 @@ shaka.dash.ContentProtection.licenseUrlParsers_ = new Map()
562
625
  .set('com.microsoft.playready.software',
563
626
  shaka.dash.ContentProtection.getPlayReadyLicenseUrl)
564
627
  .set('com.microsoft.playready.hardware',
565
- shaka.dash.ContentProtection.getPlayReadyLicenseUrl);
628
+ shaka.dash.ContentProtection.getPlayReadyLicenseUrl)
629
+ .set('org.w3.clearkey',
630
+ shaka.dash.ContentProtection.getClearKeyLicenseUrl);
566
631
 
567
632
  /**
568
633
  * @const {string}
@@ -577,3 +642,18 @@ shaka.dash.ContentProtection.MP4Protection_ =
577
642
  * @private
578
643
  */
579
644
  shaka.dash.ContentProtection.CencNamespaceUri_ = 'urn:mpeg:cenc:2013';
645
+
646
+ /**
647
+ * @const {string}
648
+ * @private
649
+ */
650
+ shaka.dash.ContentProtection.ClearKeyNamespaceUri_ =
651
+ 'http://dashif.org/guidelines/clearKey';
652
+
653
+
654
+ /**
655
+ * @const {string}
656
+ * @private
657
+ */
658
+ shaka.dash.ContentProtection.ClearKeySchemeUri_ =
659
+ 'urn:uuid:e2719d58-a985-b3c9-781a-b030af78d30e';
@@ -498,6 +498,7 @@ shaka.dash.DashParser = class {
498
498
  imageStreams: this.periodCombiner_.getImageStreams(),
499
499
  offlineSessionIds: [],
500
500
  minBufferTime: minBufferTime || 0,
501
+ sequenceMode: false,
501
502
  };
502
503
 
503
504
  // We only need to do clock sync when we're using presentation start
@@ -764,8 +765,8 @@ shaka.dash.DashParser = class {
764
765
  // currently support that. Just choose one.
765
766
  // TODO: https://github.com/shaka-project/shaka-player/issues/1528
766
767
  stream.trickModeVideo = trickModeSet.streams.find((trickStream) =>
767
- shaka.util.MimeUtils.getCodecBase(stream.codecs) ==
768
- shaka.util.MimeUtils.getCodecBase(trickStream.codecs));
768
+ shaka.util.MimeUtils.getNormalizedCodec(stream.codecs) ==
769
+ shaka.util.MimeUtils.getNormalizedCodec(trickStream.codecs));
769
770
  }
770
771
  }
771
772
  }
@@ -1228,7 +1229,6 @@ shaka.dash.DashParser = class {
1228
1229
  });
1229
1230
  let spatialAudio = false;
1230
1231
  if (hasJoc) {
1231
- context.representation.mimeType = 'audio/eac3-joc';
1232
1232
  spatialAudio = true;
1233
1233
  }
1234
1234