shaka-player 4.4.3 → 4.5.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 (198) hide show
  1. package/.github/workflows/release-please.yaml +2 -27
  2. package/CHANGELOG.md +64 -45
  3. package/README.md +16 -10
  4. package/demo/asset_card.js +18 -21
  5. package/demo/cast_receiver/index.html +0 -1
  6. package/demo/close_button.js +0 -3
  7. package/demo/common/asset.js +22 -5
  8. package/demo/common/assets.js +132 -49
  9. package/demo/config.js +192 -253
  10. package/demo/custom.js +39 -98
  11. package/demo/front.js +7 -10
  12. package/demo/index.html +19 -22
  13. package/demo/input.js +6 -11
  14. package/demo/input_container.js +8 -9
  15. package/demo/main.js +51 -123
  16. package/demo/search.js +22 -34
  17. package/demo/service_worker.js +0 -3
  18. package/demo/tooltip.js +3 -5
  19. package/demo/visualizer.js +3 -5
  20. package/demo/visualizer_button.js +1 -20
  21. package/dist/demo.compiled.debug.js +152 -178
  22. package/dist/demo.compiled.debug.map +4 -4
  23. package/dist/demo.compiled.js +152 -178
  24. package/dist/demo.compiled.map +4 -4
  25. package/dist/deps.js +27 -24
  26. package/dist/locales.js +31 -31
  27. package/dist/receiver.compiled.debug.js +22 -43
  28. package/dist/receiver.compiled.debug.map +4 -4
  29. package/dist/receiver.compiled.js +22 -43
  30. package/dist/receiver.compiled.map +4 -4
  31. package/dist/shaka-player.compiled.d.ts +507 -365
  32. package/dist/shaka-player.compiled.debug.d.ts +507 -365
  33. package/dist/shaka-player.compiled.debug.externs.js +205 -51
  34. package/dist/shaka-player.compiled.debug.js +541 -450
  35. package/dist/shaka-player.compiled.debug.map +4 -4
  36. package/dist/shaka-player.compiled.externs.js +205 -51
  37. package/dist/shaka-player.compiled.js +1120 -1066
  38. package/dist/shaka-player.compiled.map +4 -4
  39. package/dist/shaka-player.ui.d.ts +562 -410
  40. package/dist/shaka-player.ui.debug.d.ts +562 -410
  41. package/dist/shaka-player.ui.debug.externs.js +226 -51
  42. package/dist/shaka-player.ui.debug.js +606 -506
  43. package/dist/shaka-player.ui.debug.map +4 -4
  44. package/dist/shaka-player.ui.externs.js +226 -51
  45. package/dist/shaka-player.ui.js +1266 -1207
  46. package/dist/shaka-player.ui.map +4 -4
  47. package/docs/design/lcevc-integration.md +14 -14
  48. package/docs/tutorials/faq.md +27 -55
  49. package/docs/tutorials/index.json +2 -1
  50. package/docs/tutorials/lcevc.md +118 -0
  51. package/docs/tutorials/ui-customization.md +4 -0
  52. package/externs/css_style_declaration.js +19 -0
  53. package/externs/lcevc.js +37 -13
  54. package/externs/media_remote.js +68 -0
  55. package/externs/mediatailor.js +193 -0
  56. package/externs/pictureinpicture.js +11 -0
  57. package/externs/shaka/ads.js +27 -0
  58. package/externs/shaka/manifest.js +10 -5
  59. package/externs/shaka/manifest_parser.js +7 -1
  60. package/externs/shaka/offline.js +4 -0
  61. package/externs/shaka/player.js +12 -1
  62. package/karma.conf.js +7 -3
  63. package/lib/abr/simple_abr_manager.js +43 -3
  64. package/lib/ads/ad_manager.js +104 -50
  65. package/lib/ads/media_tailor_ad.js +297 -0
  66. package/lib/ads/media_tailor_ad_manager.js +828 -0
  67. package/lib/cea/ts_cea_parser.js +15 -2
  68. package/lib/config/codec_switching_strategy.js +24 -0
  69. package/lib/dash/content_protection.js +120 -2
  70. package/lib/dash/dash_parser.js +75 -12
  71. package/lib/dash/mpd_utils.js +10 -6
  72. package/lib/dash/segment_base.js +13 -5
  73. package/lib/dash/segment_list.js +13 -5
  74. package/lib/dash/segment_template.js +43 -85
  75. package/lib/dependencies/all.js +8 -7
  76. package/lib/hls/hls_parser.js +44 -16
  77. package/lib/lcevc/lcevc_dec.js +220 -0
  78. package/lib/media/adaptation_set.js +22 -11
  79. package/lib/media/adaptation_set_criteria.js +25 -7
  80. package/lib/media/media_source_engine.js +215 -27
  81. package/lib/media/segment_index.js +1 -1
  82. package/lib/media/segment_reference.js +7 -7
  83. package/lib/media/streaming_engine.js +33 -18
  84. package/lib/mss/mss_parser.js +1 -0
  85. package/lib/net/networking_engine.js +1 -0
  86. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  87. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  88. package/lib/offline/manifest_converter.js +1 -0
  89. package/lib/offline/storage.js +3 -0
  90. package/lib/player.js +142 -72
  91. package/lib/routing/payload.js +5 -1
  92. package/lib/text/cue.js +15 -0
  93. package/lib/text/ttml_text_parser.js +17 -0
  94. package/lib/text/ui_text_displayer.js +4 -0
  95. package/lib/text/vtt_text_parser.js +33 -20
  96. package/lib/transmuxer/h265.js +862 -0
  97. package/lib/transmuxer/mpeg_ts_transmuxer.js +3 -2
  98. package/lib/transmuxer/ts_transmuxer.js +160 -15
  99. package/lib/util/error.js +28 -9
  100. package/lib/util/exp_golomb.js +30 -2
  101. package/lib/util/fake_event.js +3 -0
  102. package/lib/util/mp4_generator.js +4 -4
  103. package/lib/util/periods.js +2 -0
  104. package/lib/util/platform.js +40 -0
  105. package/lib/util/player_configuration.js +8 -0
  106. package/lib/util/state_history.js +6 -2
  107. package/lib/util/stream_utils.js +133 -217
  108. package/lib/util/ts_parser.js +226 -40
  109. package/maintained-branches.md +3 -2
  110. package/package.json +4 -6
  111. package/roadmap.md +15 -5
  112. package/shaka-player.uncompiled.js +2 -1
  113. package/support.html +0 -1
  114. package/test/cast/cast_receiver_integration.js +47 -0
  115. package/test/codec_switching/codec_switching_integration.js +181 -0
  116. package/test/dash/dash_parser_content_protection_unit.js +2 -0
  117. package/test/dash/dash_parser_integration.js +73 -0
  118. package/test/dash/dash_parser_live_unit.js +2 -0
  119. package/test/dash/dash_parser_manifest_unit.js +42 -0
  120. package/test/dash/dash_parser_segment_base_unit.js +2 -0
  121. package/test/dash/dash_parser_segment_list_unit.js +2 -0
  122. package/test/dash/dash_parser_segment_template_unit.js +2 -0
  123. package/test/demo/demo_unit.js +0 -16
  124. package/test/hls/hls_live_unit.js +2 -0
  125. package/test/hls/hls_parser_unit.js +8 -6
  126. package/test/media/adaptation_set_criteria_unit.js +118 -0
  127. package/test/media/adaptation_set_unit.js +1 -0
  128. package/test/media/media_source_engine_unit.js +165 -1
  129. package/test/media/segment_index_unit.js +4 -4
  130. package/test/media/segment_prefetch_unit.js +1 -1
  131. package/test/media/streaming_engine_unit.js +17 -17
  132. package/test/mss/mss_parser_unit.js +2 -0
  133. package/test/offline/manifest_convert_unit.js +5 -0
  134. package/test/offline/storage_integration.js +1 -4
  135. package/test/player_unit.js +102 -131
  136. package/test/routing/walker_unit.js +1 -0
  137. package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
  138. package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
  139. package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
  140. package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
  141. package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
  142. package/test/test/assets/dash-aes-128/dash.mpd +18 -0
  143. package/test/test/assets/dash-aes-128/license +1 -0
  144. package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
  145. package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
  146. package/test/test/assets/dash-multi-codec/dash.mpd +32 -0
  147. package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
  148. package/test/test/assets/hls-ts-h265/0.ts +0 -0
  149. package/test/test/assets/hls-ts-h265/hevc.m3u8 +6 -0
  150. package/test/test/assets/hls-ts-h265/index.m3u8 +7 -0
  151. package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
  152. package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
  153. package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +9 -0
  154. package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +24 -0
  155. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
  156. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
  157. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
  158. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
  159. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
  160. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
  161. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
  162. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
  163. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
  164. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
  165. package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +14 -0
  166. package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +23 -0
  167. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
  168. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
  169. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
  170. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
  171. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
  172. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
  173. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
  174. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
  175. package/test/test/util/dash_parser_util.js +4 -0
  176. package/test/test/util/fake_ad_manager.js +20 -0
  177. package/test/test/util/fake_media_source_engine.js +8 -2
  178. package/test/test/util/manifest_generator.js +7 -3
  179. package/test/test/util/mss_parser_util.js +4 -0
  180. package/test/test/util/offline_utils.js +1 -0
  181. package/test/test/util/streaming_engine_util.js +7 -4
  182. package/test/text/ttml_text_parser_unit.js +52 -0
  183. package/test/text/vtt_text_parser_unit.js +103 -31
  184. package/test/transmuxer/transmuxer_integration.js +117 -0
  185. package/test/ui/ui_unit.js +3 -10
  186. package/test/util/stream_utils_unit.js +208 -74
  187. package/ui/controls.js +125 -0
  188. package/ui/externs/ui.js +8 -1
  189. package/ui/pip_button.js +22 -120
  190. package/ui/remote_button.js +201 -0
  191. package/ui/ui.js +5 -2
  192. package/demo/common/message_ids.js +0 -309
  193. package/demo/locales/en.json +0 -288
  194. package/demo/locales/source.json +0 -1146
  195. package/externs/mux.js +0 -69
  196. package/lib/lcevc/lcevc_dil.js +0 -152
  197. package/lib/transmuxer/muxjs_transmuxer.js +0 -242
  198. package/test/transmuxer/muxjs_transmuxer_integration.js +0 -177
package/demo/custom.js CHANGED
@@ -12,7 +12,6 @@ goog.require('ShakaDemoAssetInfo');
12
12
  goog.require('shakaDemo.AssetCard');
13
13
  goog.require('shakaDemo.Input');
14
14
  goog.require('shakaDemo.InputContainer');
15
- goog.require('shakaDemo.MessageIds');
16
15
  goog.require('shakaDemo.TextInput');
17
16
 
18
17
  /** @type {?shakaDemo.Custom} */
@@ -71,9 +70,6 @@ shakaDemo.Custom = class {
71
70
  document.addEventListener('shaka-main-offline-progress', () => {
72
71
  this.updateOfflineProgress_();
73
72
  });
74
- document.addEventListener('shaka-main-locale-changed', () => {
75
- this.remakeSavedList_();
76
- });
77
73
  document.addEventListener('shaka-main-page-changed', () => {
78
74
  if (!this.savedList_.childNodes.length &&
79
75
  !container.classList.contains('hidden')) {
@@ -142,9 +138,8 @@ shakaDemo.Custom = class {
142
138
  const div = document.createElement('div');
143
139
  headersDiv.appendChild(div);
144
140
  const containerStyle = shakaDemo.InputContainer.Style.VERTICAL;
145
- const headerText = shakaDemo.MessageIds.LICENSE_HEADER_TITLE;
146
141
  const container = new shakaDemo.InputContainer(
147
- div, headerText, containerStyle,
142
+ div, 'License Header', containerStyle,
148
143
  /* docLink= */ null);
149
144
 
150
145
  const collisionCheckEntry = {
@@ -209,9 +204,7 @@ shakaDemo.Custom = class {
209
204
  const nameOnChange = (input) => {
210
205
  onChange(input.value, headerValue);
211
206
  };
212
- const licenseHeaderName = shakaDemoMain.getLocalizedString(
213
- shakaDemo.MessageIds.LICENSE_HEADER_NAME);
214
- this.makeField_(container, licenseHeaderName, nameSetup, nameOnChange);
207
+ this.makeField_(container, 'Header Name', nameSetup, nameOnChange);
215
208
 
216
209
  const valueSetup = (input, container) => {
217
210
  if (headerValue) {
@@ -221,9 +214,7 @@ shakaDemo.Custom = class {
221
214
  const valueOnChange = (input) => {
222
215
  onChange(headerName, input.value);
223
216
  };
224
- const licenseHeaderValue = shakaDemoMain.getLocalizedString(
225
- shakaDemo.MessageIds.LICENSE_HEADER_VALUE);
226
- this.makeField_(container, licenseHeaderValue, valueSetup, valueOnChange);
217
+ this.makeField_(container, 'Header Value', valueSetup, valueOnChange);
227
218
  };
228
219
  if (assetInProgress.licenseRequestHeaders.size == 0) {
229
220
  // It starts out with a single empty row, but each time you start filling
@@ -269,8 +260,8 @@ shakaDemo.Custom = class {
269
260
  const fullMimeTypeOnChange = (input) => {
270
261
  assetInProgress.setMediaPlaylistFullMimeType(input.value);
271
262
  };
272
- const fullMimeTypeName = shakaDemoMain.getLocalizedString(
273
- shakaDemo.MessageIds.HLS_FULL_MIME_TYPE);
263
+ const fullMimeTypeName =
264
+ 'Full Mime Type for Playing Media Playlists Directly';
274
265
  this.makeField_(
275
266
  container, fullMimeTypeName, fullMimeTypeSetup, fullMimeTypeOnChange);
276
267
 
@@ -300,10 +291,7 @@ shakaDemo.Custom = class {
300
291
  const adTagOnChange = (input) => {
301
292
  assetInProgress.adTagUri = input.value;
302
293
  };
303
- const adTagURLName = shakaDemoMain.getLocalizedString(
304
- shakaDemo.MessageIds.AD_TAG_URL);
305
- this.makeField_(
306
- container, adTagURLName, adTagSetup, adTagOnChange);
294
+ this.makeField_(container, 'Ad Tag URL', adTagSetup, adTagOnChange);
307
295
 
308
296
  // Make the content source id field.
309
297
  const contentSrcIdSetup = (input, container) => {
@@ -319,8 +307,7 @@ shakaDemo.Custom = class {
319
307
  this.manifestField_.required =
320
308
  this.checkManifestRequired_(assetInProgress);
321
309
  };
322
- const contentSrcIdName = shakaDemoMain.getLocalizedString(
323
- shakaDemo.MessageIds.IMA_CONTENT_SRC_ID);
310
+ const contentSrcIdName = 'Content source ID (for VOD DAI Content)';
324
311
  this.makeField_(
325
312
  container, contentSrcIdName, contentSrcIdSetup, contentSrcIdOnChange);
326
313
 
@@ -338,10 +325,8 @@ shakaDemo.Custom = class {
338
325
  this.manifestField_.required =
339
326
  this.checkManifestRequired_(assetInProgress);
340
327
  };
341
- const videoIdName = shakaDemoMain.getLocalizedString(
342
- shakaDemo.MessageIds.IMA_VIDEO_ID);
343
- this.makeField_(
344
- container, videoIdName, videoIdSetup, videoIdOnChange);
328
+ const videoIdName = 'Video ID (for VOD DAI Content)';
329
+ this.makeField_(container, videoIdName, videoIdSetup, videoIdOnChange);
345
330
 
346
331
  // Make the asset key field.
347
332
  const assetKeySetup = (input, container) => {
@@ -357,10 +342,8 @@ shakaDemo.Custom = class {
357
342
  this.manifestField_.required =
358
343
  this.checkManifestRequired_(assetInProgress);
359
344
  };
360
- const assetKeyName = shakaDemoMain.getLocalizedString(
361
- shakaDemo.MessageIds.IMA_ASSET_KEY);
362
- this.makeField_(
363
- container, assetKeyName, assetKeySetup, assetKeyChange);
345
+ const assetKeyName = 'Asset key (for LIVE DAI Content)';
346
+ this.makeField_(container, assetKeyName, assetKeySetup, assetKeyChange);
364
347
 
365
348
  // Make the manifest type field.
366
349
  const manifestTypeSetup = (input, container) => {
@@ -376,8 +359,7 @@ shakaDemo.Custom = class {
376
359
  this.manifestField_.required =
377
360
  this.checkManifestRequired_(assetInProgress);
378
361
  };
379
- const manifestTypeName = shakaDemoMain.getLocalizedString(
380
- shakaDemo.MessageIds.IMA_MANIFEST_TYPE);
362
+ const manifestTypeName = 'Manifest type (for DAI Content)';
381
363
  this.makeField_(
382
364
  container, manifestTypeName, manifestTypeSetup, manifestTypeChange);
383
365
 
@@ -437,10 +419,8 @@ shakaDemo.Custom = class {
437
419
  const licenseOnChange = (input) => {
438
420
  setLicenseServerURLs();
439
421
  };
440
- const licenseServerURLName = shakaDemoMain.getLocalizedString(
441
- shakaDemo.MessageIds.LICENSE_SERVER_URL);
442
422
  this.makeField_(
443
- container, licenseServerURLName, licenseSetup, licenseOnChange);
423
+ container, 'Custom License Server URL', licenseSetup, licenseOnChange);
444
424
 
445
425
  // Make the license certificate URL field.
446
426
  const certSetup = (input, container) => {
@@ -451,10 +431,8 @@ shakaDemo.Custom = class {
451
431
  const certOnChange = (input) => {
452
432
  assetInProgress.certificateUri = input.value;
453
433
  };
454
- const licenseCertificateURLName = shakaDemoMain.getLocalizedString(
455
- shakaDemo.MessageIds.LICENSE_CERTIFICATE_URL);
456
434
  this.makeField_(
457
- container, licenseCertificateURLName, certSetup, certOnChange);
435
+ container, 'Custom License Certificate URL', certSetup, certOnChange);
458
436
 
459
437
  // Make the drm system field.
460
438
  const drmSetup = (input, container) => {
@@ -470,10 +448,7 @@ shakaDemo.Custom = class {
470
448
  const drmOnChange = (input) => {
471
449
  setLicenseServerURLs();
472
450
  };
473
- const DRMSystemName = shakaDemoMain.getLocalizedString(
474
- shakaDemo.MessageIds.DRM_SYSTEM);
475
- this.makeField_(
476
- container, DRMSystemName, drmSetup, drmOnChange);
451
+ this.makeField_(container, 'Custom DRM System', drmSetup, drmOnChange);
477
452
 
478
453
  return drmDiv;
479
454
  }
@@ -508,8 +483,7 @@ shakaDemo.Custom = class {
508
483
  // Make an error that shows up if you did not provide valid JSON.
509
484
  const error = document.createElement('span');
510
485
  error.classList.add('mdl-textfield__error');
511
- error.textContent = shakaDemoMain.getLocalizedString(
512
- shakaDemo.MessageIds.INVALID_JSON_CONFIG_ERROR);
486
+ error.textContent = 'Invalid JSON configuration';
513
487
 
514
488
  container.appendChild(error);
515
489
  };
@@ -526,8 +500,7 @@ shakaDemo.Custom = class {
526
500
  inputWrapper.setValid(false);
527
501
  }
528
502
  };
529
- const extraConfigLabel = shakaDemoMain.getLocalizedString(
530
- shakaDemo.MessageIds.EXTRA_SHAKA_PLAYER_CONFIG);
503
+ const extraConfigLabel = 'Extra Shaka Player configuration (JSON)';
531
504
  this.makeField_(
532
505
  container, extraConfigLabel, extraSetup, extraOnChange,
533
506
  /* isTextArea= */ true);
@@ -557,8 +530,7 @@ shakaDemo.Custom = class {
557
530
  // Make an error that shows up if you did not provide an URL.
558
531
  const error = document.createElement('span');
559
532
  error.classList.add('mdl-textfield__error');
560
- error.textContent = shakaDemoMain.getLocalizedString(
561
- shakaDemo.MessageIds.MANIFEST_URL_ERROR);
533
+ error.textContent = 'Must have a manifest URL, or IMA DAI id fields';
562
534
  container.appendChild(error);
563
535
 
564
536
  // Add a regex that will detect empty strings.
@@ -569,10 +541,7 @@ shakaDemo.Custom = class {
569
541
  const manifestOnChange = (input) => {
570
542
  assetInProgress.manifestUri = input.value.trim();
571
543
  };
572
- const manifestURLName = shakaDemoMain.getLocalizedString(
573
- shakaDemo.MessageIds.MANIFEST_URL);
574
- this.makeField_(
575
- container, manifestURLName, manifestSetup, manifestOnChange);
544
+ this.makeField_(container, 'Manifest URL', manifestSetup, manifestOnChange);
576
545
 
577
546
  // Make the name field.
578
547
  const nameSetup = (input, container) => {
@@ -582,8 +551,7 @@ shakaDemo.Custom = class {
582
551
  // Make an error that shows up if you have an empty/duplicate name.
583
552
  const error = document.createElement('span');
584
553
  error.classList.add('mdl-textfield__error');
585
- error.textContent = shakaDemoMain.getLocalizedString(
586
- shakaDemo.MessageIds.NAME_ERROR);
554
+ error.textContent = 'Must be a unique name.';
587
555
  container.appendChild(error);
588
556
 
589
557
  // Make a regex that will detect duplicates.
@@ -604,10 +572,7 @@ shakaDemo.Custom = class {
604
572
  const nameOnChange = (input) => {
605
573
  assetInProgress.name = input.value;
606
574
  };
607
- const nameName = shakaDemoMain.getLocalizedString(
608
- shakaDemo.MessageIds.NAME);
609
- this.makeField_(
610
- container, nameName, nameSetup, nameOnChange);
575
+ this.makeField_(container, 'Name', nameSetup, nameOnChange);
611
576
 
612
577
  // Make the icon field.
613
578
  const iconSetup = (input, container) => {
@@ -634,11 +599,7 @@ shakaDemo.Custom = class {
634
599
  iconDiv.appendChild(img);
635
600
  }
636
601
  };
637
-
638
- const iconURLName = shakaDemoMain.getLocalizedString(
639
- shakaDemo.MessageIds.ICON_URL);
640
- this.makeField_(
641
- container, iconURLName, iconSetup, iconOnChange);
602
+ this.makeField_(container, 'Icon URL', iconSetup, iconOnChange);
642
603
 
643
604
  // Make the MIME type field.
644
605
  const mimeTypeSetup = (input, container) => {
@@ -650,11 +611,7 @@ shakaDemo.Custom = class {
650
611
  const mimeTypeOnChange = (input) => {
651
612
  assetInProgress.mimeType = input.value || null;
652
613
  };
653
-
654
- const mimeTypeName = shakaDemoMain.getLocalizedString(
655
- shakaDemo.MessageIds.MIME_TYPE);
656
- this.makeField_(
657
- container, mimeTypeName, mimeTypeSetup, mimeTypeOnChange);
614
+ this.makeField_(container, 'MIME Type', mimeTypeSetup, mimeTypeOnChange);
658
615
 
659
616
  return mainDiv;
660
617
  }
@@ -681,9 +638,7 @@ shakaDemo.Custom = class {
681
638
  const finishDiv = document.createElement('tr');
682
639
 
683
640
  const buttonStyle = shakaDemo.Custom.ButtonStyle_.RAISED;
684
- const saveString =
685
- shakaDemoMain.getLocalizedString(shakaDemo.MessageIds.SAVE_BUTTON);
686
- finishDiv.appendChild(this.makeButton_(saveString, buttonStyle, () => {
641
+ finishDiv.appendChild(this.makeButton_('Save', buttonStyle, () => {
687
642
  for (const input of inputsToCheck) {
688
643
  if (!input.validity.valid) {
689
644
  return;
@@ -695,9 +650,7 @@ shakaDemo.Custom = class {
695
650
  this.remakeSavedList_();
696
651
  this.dialog_.close();
697
652
  }));
698
- const cancelString =
699
- shakaDemoMain.getLocalizedString(shakaDemo.MessageIds.CANCEL_BUTTON);
700
- finishDiv.appendChild(this.makeButton_(cancelString, buttonStyle, () => {
653
+ finishDiv.appendChild(this.makeButton_('Cancel', buttonStyle, () => {
701
654
  this.dialog_.close();
702
655
  }));
703
656
 
@@ -737,9 +690,8 @@ shakaDemo.Custom = class {
737
690
  const tabDiv = document.createElement('tr');
738
691
  const tabsToHide = [];
739
692
  const buttonsToSwitch = [];
740
- const addTabButton = (messageId, tabToShow, startOn) => {
693
+ const addTabButton = (name, tabToShow, startOn) => {
741
694
  const buttonStyle = shakaDemo.Custom.ButtonStyle_.PLAIN;
742
- const name = shakaDemoMain.getLocalizedString(messageId);
743
695
  const button = this.makeButton_(name, buttonStyle, () => {
744
696
  for (const tab of tabsToHide) {
745
697
  tab.classList.add('hidden');
@@ -759,18 +711,12 @@ shakaDemo.Custom = class {
759
711
  tabToShow.classList.add('hidden');
760
712
  }
761
713
  };
762
- addTabButton(
763
- shakaDemo.MessageIds.MAIN_TAB, mainDiv, /* startOn= */ true);
764
- addTabButton(
765
- shakaDemo.MessageIds.DRM_TAB, drmDiv, /* startOn= */ false);
766
- addTabButton(
767
- shakaDemo.MessageIds.HEADERS_TAB, headersDiv, /* startOn= */ false);
768
- addTabButton(
769
- shakaDemo.MessageIds.ADS_TAB, adsDiv, /* startOn= */ false);
770
- addTabButton(
771
- shakaDemo.MessageIds.HLS_TAB, hlsDiv, /* startOn= */ false);
772
- addTabButton(
773
- shakaDemo.MessageIds.EXTRA_TAB, extraConfigDiv, /* startOn= */ false);
714
+ addTabButton('Main', mainDiv, /* startOn= */ true);
715
+ addTabButton('Drm', drmDiv, /* startOn= */ false);
716
+ addTabButton('Headers', headersDiv, /* startOn= */ false);
717
+ addTabButton('Ads', adsDiv, /* startOn= */ false);
718
+ addTabButton('HLS', hlsDiv, /* startOn= */ false);
719
+ addTabButton('Extra Config', extraConfigDiv, /* startOn= */ false);
774
720
 
775
721
  // Append the divs in the desired order.
776
722
  this.dialog_.appendChild(tabDiv);
@@ -861,24 +807,24 @@ shakaDemo.Custom = class {
861
807
  const savedList = this.savedList_;
862
808
  const isFeatured = false;
863
809
  return new shakaDemo.AssetCard(savedList, asset, isFeatured, (c) => {
864
- c.addButton(shakaDemo.MessageIds.PLAY, () => {
810
+ c.addButton('Play', () => {
865
811
  shakaDemoMain.loadAsset(asset);
866
812
  this.updateSelected_();
867
813
  });
868
- c.addButton(shakaDemo.MessageIds.EDIT_CUSTOM, async () => {
814
+ c.addButton('Edit', async () => {
869
815
  if (asset.unstoreCallback) {
870
816
  await asset.unstoreCallback();
871
817
  }
872
818
  this.showAssetDialog_(asset);
873
819
  });
874
- c.addButton(shakaDemo.MessageIds.DELETE_CUSTOM, async () => {
820
+ c.addButton('Delete', async () => {
875
821
  this.assets_.delete(asset);
876
822
  if (asset.unstoreCallback) {
877
823
  await asset.unstoreCallback();
878
824
  }
879
825
  this.saveAssetInfos_(this.assets_);
880
826
  this.remakeSavedList_();
881
- }, shakaDemo.MessageIds.DELETE_CUSTOM);
827
+ }, 'Delete this custom asset?');
882
828
  c.addStoreButton();
883
829
  });
884
830
  }
@@ -905,15 +851,10 @@ shakaDemo.Custom = class {
905
851
  textElement.textContent = text;
906
852
  this.savedList_.appendChild(textElement);
907
853
  };
908
- makeMessage('title',
909
- shakaDemoMain.getLocalizedString(
910
- shakaDemo.MessageIds.CUSTOM_INTRO_ONE));
911
- makeMessage('body-2',
912
- shakaDemoMain.getLocalizedString(
913
- shakaDemo.MessageIds.CUSTOM_INTRO_TWO));
854
+ makeMessage('title', 'Try Shaka Player with your own content!');
855
+ makeMessage('body-2', 'Press the button below to add a custom asset.');
914
856
  makeMessage('body-1',
915
- shakaDemoMain.getLocalizedString(
916
- shakaDemo.MessageIds.CUSTOM_INTRO_THREE));
857
+ 'Custom assets will remain even after reloading the page.');
917
858
  } else {
918
859
  // Make asset cards for the assets.
919
860
  this.assetCards_ = Array.from(this.assets_).map((asset) => {
package/demo/front.js CHANGED
@@ -9,7 +9,6 @@ goog.provide('shakaDemo.Front');
9
9
 
10
10
 
11
11
  goog.require('shakaDemo.AssetCard');
12
- goog.require('shakaDemo.MessageIds');
13
12
  goog.requireType('ShakaDemoAssetInfo');
14
13
 
15
14
  /** @type {?shakaDemo.Front} */
@@ -50,9 +49,6 @@ shakaDemo.Front = class {
50
49
  document.addEventListener('shaka-main-offline-progress', () => {
51
50
  this.updateOfflineProgress_();
52
51
  });
53
- document.addEventListener('shaka-main-locale-changed', () => {
54
- this.remakeAssetCards_();
55
- });
56
52
  document.addEventListener('shaka-main-page-changed', () => {
57
53
  if (!this.assetCardDiv_.childNodes.length &&
58
54
  !container.classList.contains('hidden')) {
@@ -74,19 +70,20 @@ shakaDemo.Front = class {
74
70
  const makeMessage = (textClass, text) => {
75
71
  const textElement = document.createElement('h2');
76
72
  textElement.classList.add('mdl-typography--' + textClass);
77
- textElement.textContent = shakaDemoMain.getLocalizedString(text);
73
+ textElement.textContent = text;
78
74
  this.messageDiv_.appendChild(textElement);
79
75
  };
80
- makeMessage('body-2', shakaDemo.MessageIds.FRONT_INTRO_ONE);
81
- makeMessage('body-1', shakaDemo.MessageIds.FRONT_INTRO_TWO);
76
+ makeMessage('body-2', 'This is a demo of Google\'s Shaka Player, a ' +
77
+ 'JavaScript library for adaptive video streaming.');
78
+ makeMessage('body-1', 'Choose a video to playback; more assets are ' +
79
+ 'available via the "all content" tab.');
82
80
 
83
81
  const hideButton = document.createElement('button');
84
82
  hideButton.classList.add('mdl-button');
85
83
  hideButton.classList.add('mdl-button--colored');
86
84
  hideButton.classList.add('mdl-js-button');
87
85
  hideButton.classList.add('mdl-js-ripple-effect');
88
- hideButton.textContent = shakaDemoMain.getLocalizedString(
89
- shakaDemo.MessageIds.FRONT_INTRO_DISMISS);
86
+ hideButton.textContent = 'Dismiss';
90
87
  hideButton.addEventListener('click', () => {
91
88
  shaka.util.Dom.removeAllChildren(this.messageDiv_);
92
89
  window.localStorage.setItem(hideName, 'true');
@@ -122,7 +119,7 @@ shakaDemo.Front = class {
122
119
  if (unsupportedReason) {
123
120
  c.markAsUnsupported(unsupportedReason);
124
121
  } else {
125
- c.addButton(shakaDemo.MessageIds.PLAY, () => {
122
+ c.addButton('Play', () => {
126
123
  shakaDemoMain.loadAsset(asset);
127
124
  this.updateSelected_();
128
125
  });
package/demo/index.html CHANGED
@@ -36,12 +36,10 @@
36
36
  <link rel="stylesheet" href="../dist/controls.css">
37
37
 
38
38
  <script defer src="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"></script>
39
- <!-- transmuxing support is enabled by including this: -->
40
- <script defer src="../node_modules/mux.js/dist/mux.min.js"></script>
41
39
  <!-- MSS support is enabled by including this: -->
42
40
  <script defer src="../node_modules/codem-isoboxer/dist/iso_boxer.min.js"></script>
43
41
  <!-- MPEG-5 Part2 LCEVC support is enabled by including this: -->
44
- <script defer src="../node_modules/lcevc_dil.js/dist/lcevc_dil.min.js"></script>
42
+ <script defer src="../node_modules/lcevc_dec.js/dist/lcevc_dec.min.js"></script>
45
43
  <!-- MDL is enabled by including this: -->
46
44
  <script defer src="../node_modules/material-design-lite/dist/material.min.js"></script>
47
45
  <!-- MDL modal dialogs are enabled by including these: -->
@@ -87,7 +85,6 @@ UNCOMPILED_JS = [
87
85
  // Enable less, the CSS pre-processor.
88
86
  '../node_modules/less/dist/less.js',
89
87
  // These are the individual parts of the demo app.
90
- 'common/message_ids.js',
91
88
  'common/asset.js',
92
89
  'common/assets.js',
93
90
  'demo_uncompiled.js',
@@ -102,11 +99,11 @@ UNCOMPILED_JS = [
102
99
  <header class="app-header mdl-layout__header should-hide-in-no-input-mode">
103
100
  <header class="mdl-layout__header-row" id="nav-button-container">
104
101
  <img alt="Shaka Player Logo" src="shaka_logo_trans.png" class="logo" />
105
- <button id="nav-button-front" class="mdl-button mdl-js-button mdl-js-ripple-effect should-disable-on-fail" defaultselected localized-string="HOME" tab-identifier="HOME"></button>
106
- <button id="nav-button-search" class="mdl-button mdl-js-button mdl-js-ripple-effect should-disable-on-fail" localized-string="ALL_CONTENT" tab-identifier="ALL_CONTENT"></button>
107
- <button id="nav-button-custom" class="mdl-button mdl-js-button mdl-js-ripple-effect should-disable-on-fail" localized-string="CUSTOM_CONTENT" tab-identifier="CUSTOM CONTENT"></button>
102
+ <button id="nav-button-front" class="mdl-button mdl-js-button mdl-js-ripple-effect should-disable-on-fail" defaultselected tab-identifier="HOME">HOME</button>
103
+ <button id="nav-button-search" class="mdl-button mdl-js-button mdl-js-ripple-effect should-disable-on-fail" tab-identifier="ALL_CONTENT">ALL CONTENT</button>
104
+ <button id="nav-button-custom" class="mdl-button mdl-js-button mdl-js-ripple-effect should-disable-on-fail" tab-identifier="CUSTOM CONTENT">CUSTOM CONTENT</button>
108
105
  <div class="mdl-layout-spacer"></div>
109
- <button id="bug-button" class="mdl-button mdl-js-button mdl-js-ripple-effect should-disable-on-fail" localized-string="REPORT_BUG"></button>
106
+ <button id="bug-button" class="mdl-button mdl-js-button mdl-js-ripple-effect should-disable-on-fail">REPORT BUG</button>
110
107
  <div class="version-block">
111
108
  <span class="version-string"></span>
112
109
  </div>
@@ -117,7 +114,7 @@ UNCOMPILED_JS = [
117
114
  </div>
118
115
  <div class="mdl-layout__drawer hamburger-menu">
119
116
  <div id="hamburger-menu-title" class="mdl-layout-title">
120
- <div localized-string="CONFIG"></div>
117
+ <div>Shaka Player Demo Config</div>
121
118
  <div class="mdl-layout-spacer"></div>
122
119
  <button id="drawer-close-button" class="mdl-button mdl-js-button mdl-button--icon should-disable-on-fail"><i class="material-icons-round">close</i></button>
123
120
  </div>
@@ -144,28 +141,28 @@ UNCOMPILED_JS = [
144
141
  <div class="mdl-mega-footer__middle-section">
145
142
 
146
143
  <div class="mdl-mega-footer__drop-down-section">
147
- <h1 class="mdl-mega-footer__heading" localized-string="PROJECT_LINKS_HEADER"></h1>
144
+ <h1 class="mdl-mega-footer__heading">PROJECT LINKS</h1>
148
145
  <ul class="mdl-mega-footer__link-list">
149
- <li><a rel="noopener" target="_blank" href="../docs/api/index.html" localized-string="DOCUMENTATION"></a></li>
150
- <li><a rel="noopener" target="_blank" href="https://www.apache.org/licenses/LICENSE-2.0" localized-string="LICENSE"></a></li>
151
- <li><a rel="noopener" target="_blank" href="https://github.com/shaka-project/shaka-player" localized-string="SOURCE"></a></li>
152
- <li><a rel="noopener" target="_blank" href="https://www.npmjs.com/package/shaka-player" localized-string="NPM"></a></li>
153
- <li><a rel="noopener" target="_blank" href="../support.html" localized-string="SUPPORT"></a></li>
146
+ <li><a rel="noopener" target="_blank" href="../docs/api/index.html">Documentation</a></li>
147
+ <li><a rel="noopener" target="_blank" href="https://www.apache.org/licenses/LICENSE-2.0">Apache License</a></li>
148
+ <li><a rel="noopener" target="_blank" href="https://github.com/shaka-project/shaka-player">Source on GitHub</a></li>
149
+ <li><a rel="noopener" target="_blank" href="https://www.npmjs.com/package/shaka-player">Package on NPM</a></li>
150
+ <li><a rel="noopener" target="_blank" href="../support.html">Browser Support Test</a></li>
154
151
  </ul>
155
152
  </div>
156
153
  <div class="mdl-mega-footer__drop-down-section">
157
- <h1 class="mdl-mega-footer__heading" localized-string="CDN_HEADER"></h1>
154
+ <h1 class="mdl-mega-footer__heading">CDN</h1>
158
155
  <ul class="mdl-mega-footer__link-list">
159
- <li><a rel="noopener" target="_blank" href="https://developers.google.com/speed/libraries/#shaka-player" localized-string="LIBRARIES"></a></li>
160
- <li><a rel="noopener" target="_blank" href="https://www.jsdelivr.com/package/npm/shaka-player" localized-string="JSDELIVR"></a></li>
156
+ <li><a rel="noopener" target="_blank" href="https://developers.google.com/speed/libraries/#shaka-player">Google Hosted Libraries</a></li>
157
+ <li><a rel="noopener" target="_blank" href="https://www.jsdelivr.com/package/npm/shaka-player">jsDelivr</a></li>
161
158
  </ul>
162
159
  </div>
163
160
  <div class="mdl-mega-footer__drop-down-section">
164
- <h1 class="mdl-mega-footer__heading" localized-string="DEMO_MODE_HEADER"></h1>
161
+ <h1 class="mdl-mega-footer__heading">DEMO MODE</h1>
165
162
  <ul class="mdl-mega-footer__link-list" id="compiled-links">
166
- <li><a href="#build=compiled" id="compiled-link" localized-string="COMPILED_RELEASE"></a></li>
167
- <li><a href="#build=debug_compiled" id="debug-compiled-link" localized-string="COMPILED_DEBUG"></a></li>
168
- <li><a href="#build=uncompiled" id="uncompiled-link" localized-string="UNCOMPILED"></a></li>
163
+ <li><a href="#build=compiled" id="compiled-link">Compiled (Release)</a></li>
164
+ <li><a href="#build=debug_compiled" id="debug-compiled-link">Compiled (Debug)</a></li>
165
+ <li><a href="#build=uncompiled" id="uncompiled-link">Uncompiled</a></li>
169
166
  </ul>
170
167
  </div>
171
168
  </div>
package/demo/input.js CHANGED
@@ -11,7 +11,6 @@ goog.provide('shakaDemo.NumberInput');
11
11
  goog.provide('shakaDemo.SelectInput');
12
12
  goog.provide('shakaDemo.TextInput');
13
13
 
14
- goog.require('shakaDemo.MessageIds');
15
14
  goog.requireType('shakaDemo.InputContainer');
16
15
 
17
16
  /**
@@ -121,7 +120,7 @@ shakaDemo.Input.lastId_ = 0;
121
120
  shakaDemo.SelectInput = class extends shakaDemo.Input {
122
121
  /**
123
122
  * @param {!shakaDemo.InputContainer} parentContainer
124
- * @param {?shakaDemo.MessageIds} name
123
+ * @param {?string} name
125
124
  * @param {function(!HTMLInputElement, !shakaDemo.Input)} onChange
126
125
  * @param {!Object.<string, string>} values
127
126
  */
@@ -134,7 +133,7 @@ shakaDemo.SelectInput = class extends shakaDemo.Input {
134
133
  this.extra_.classList.add('mdl-textfield__label');
135
134
  this.extra_.setAttribute('for', this.input_.id);
136
135
  if (name) {
137
- this.extra_.textContent = shakaDemoMain.getLocalizedString(name);
136
+ this.extra_.textContent = name;
138
137
  }
139
138
  for (const value of Object.keys(values)) {
140
139
  const option =
@@ -243,18 +242,14 @@ shakaDemo.NumberInput = class extends shakaDemo.TextInput {
243
242
  error.classList.add('mdl-textfield__error');
244
243
  this.container_.appendChild(error);
245
244
 
246
- const MessageIds = shakaDemo.MessageIds;
247
- const localize = (name) => shakaDemoMain.getLocalizedString(name);
248
245
  if (canBeZero && canBeDecimal) {
249
- error.textContent = localize(MessageIds.NUMBER_DECIMAL_WARNING);
246
+ error.textContent = 'Must be a positive number.';
250
247
  } else if (canBeZero) {
251
- error.textContent = localize(MessageIds.NUMBER_INTEGER_WARNING);
248
+ error.textContent = 'Must be a positive integer.';
252
249
  } else if (canBeDecimal) {
253
- error.textContent =
254
- localize(MessageIds.NUMBER_NONZERO_DECIMAL_WARNING);
250
+ error.textContent = 'Must be a positive, nonzero number.';
255
251
  } else {
256
- error.textContent =
257
- localize(MessageIds.NUMBER_NONZERO_INTEGER_WARNING);
252
+ error.textContent = 'Must be a positive, nonzero integer.';
258
253
  }
259
254
 
260
255
  this.input_.pattern = '(Infinity|';
@@ -9,7 +9,6 @@ goog.provide('shakaDemo.InputContainer');
9
9
 
10
10
 
11
11
  goog.require('shakaDemo.Tooltips');
12
- goog.requireType('shakaDemo.MessageIds');
13
12
 
14
13
  /**
15
14
  * Creates elements for containing inputs. It represents a single "section" of
@@ -22,8 +21,8 @@ goog.requireType('shakaDemo.MessageIds');
22
21
  shakaDemo.InputContainer = class {
23
22
  /**
24
23
  * @param {!Element} parentDiv
25
- * @param {?shakaDemo.MessageIds} headerText The text to be displayed by
26
- * the header. If null, there will be no header.
24
+ * @param {?string} headerText The text to be displayed by the header.
25
+ * If null, there will be no header.
27
26
  * @param {!shakaDemo.InputContainer.Style} style
28
27
  * @param {?string} docLink
29
28
  */
@@ -46,7 +45,7 @@ shakaDemo.InputContainer = class {
46
45
  /** @type {?Element} */
47
46
  this.latestElementContainer;
48
47
 
49
- /** @type {?shakaDemo.MessageIds} */
48
+ /** @type {?string} */
50
49
  this.latestTooltip;
51
50
 
52
51
  /** @private {number} */
@@ -101,7 +100,7 @@ shakaDemo.InputContainer = class {
101
100
 
102
101
  /**
103
102
  * @param {!Element} parentDiv
104
- * @param {shakaDemo.MessageIds} headerText
103
+ * @param {string} headerText
105
104
  * @private
106
105
  */
107
106
  createHeader_(parentDiv, headerText) {
@@ -123,7 +122,7 @@ shakaDemo.InputContainer = class {
123
122
  this.header_ = document.createElement('div');
124
123
  this.header_.classList.add('input-header');
125
124
  }
126
- this.header_.textContent = shakaDemoMain.getLocalizedString(headerText);
125
+ this.header_.textContent = headerText;
127
126
  parentDiv.appendChild(this.header_);
128
127
  }
129
128
 
@@ -170,8 +169,8 @@ shakaDemo.InputContainer = class {
170
169
 
171
170
  /**
172
171
  * Makes a row, for storing an input.
173
- * @param {?shakaDemo.MessageIds} labelString
174
- * @param {?shakaDemo.MessageIds} tooltipString
172
+ * @param {?string} labelString
173
+ * @param {?string} tooltipString
175
174
  * @param {string=} rowClass
176
175
  */
177
176
  addRow(labelString, tooltipString, rowClass) {
@@ -190,7 +189,7 @@ shakaDemo.InputContainer = class {
190
189
  label.setAttribute('for', elementId);
191
190
  label.classList.add('input-container-label');
192
191
  const labelText = document.createElement('b');
193
- labelText.textContent = shakaDemoMain.getLocalizedString(labelString);
192
+ labelText.textContent = labelString;
194
193
  label.appendChild(labelText);
195
194
  this.latestRow_.appendChild(label);
196
195
  }