shaka-player 4.4.3 → 4.6.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 (307) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  2. package/.github/workflows/release-please.yaml +2 -27
  3. package/AUTHORS +2 -0
  4. package/CHANGELOG.md +156 -39
  5. package/CODE_OF_CONDUCT.md +1 -1
  6. package/CONTRIBUTORS +2 -0
  7. package/README.md +54 -42
  8. package/demo/asset_card.js +18 -21
  9. package/demo/cast_receiver/index.html +0 -1
  10. package/demo/close_button.js +0 -3
  11. package/demo/common/asset.js +33 -22
  12. package/demo/common/assets.js +249 -60
  13. package/demo/config.js +219 -253
  14. package/demo/custom.js +88 -133
  15. package/demo/front.js +7 -10
  16. package/demo/index.html +19 -22
  17. package/demo/input.js +6 -11
  18. package/demo/input_container.js +8 -9
  19. package/demo/main.js +62 -126
  20. package/demo/search.js +29 -34
  21. package/demo/service_worker.js +0 -3
  22. package/demo/tooltip.js +3 -5
  23. package/demo/visualizer.js +3 -5
  24. package/demo/visualizer_button.js +1 -20
  25. package/dist/controls.css +1 -1
  26. package/dist/controls.css.map +1 -1
  27. package/dist/demo.compiled.debug.js +211 -228
  28. package/dist/demo.compiled.debug.map +4 -4
  29. package/dist/demo.compiled.js +211 -228
  30. package/dist/demo.compiled.map +4 -4
  31. package/dist/deps.js +42 -37
  32. package/dist/locales.js +34 -30
  33. package/dist/receiver.compiled.debug.js +64 -77
  34. package/dist/receiver.compiled.debug.map +4 -4
  35. package/dist/receiver.compiled.js +64 -77
  36. package/dist/receiver.compiled.map +4 -4
  37. package/dist/shaka-player.compiled.d.ts +343 -151
  38. package/dist/shaka-player.compiled.debug.d.ts +343 -151
  39. package/dist/shaka-player.compiled.debug.externs.js +356 -117
  40. package/dist/shaka-player.compiled.debug.js +952 -811
  41. package/dist/shaka-player.compiled.debug.map +4 -4
  42. package/dist/shaka-player.compiled.externs.js +356 -117
  43. package/dist/shaka-player.compiled.js +1165 -1078
  44. package/dist/shaka-player.compiled.map +4 -4
  45. package/dist/shaka-player.ui.d.ts +359 -153
  46. package/dist/shaka-player.ui.debug.d.ts +359 -153
  47. package/dist/shaka-player.ui.debug.externs.js +382 -117
  48. package/dist/shaka-player.ui.debug.js +1084 -918
  49. package/dist/shaka-player.ui.debug.map +4 -4
  50. package/dist/shaka-player.ui.externs.js +382 -117
  51. package/dist/shaka-player.ui.js +1377 -1274
  52. package/dist/shaka-player.ui.map +4 -4
  53. package/docs/design/lcevc-integration.md +14 -14
  54. package/docs/tutorials/ad_monetization.md +54 -0
  55. package/docs/tutorials/basic-usage.md +2 -1
  56. package/docs/tutorials/errors.md +2 -1
  57. package/docs/tutorials/faq.md +27 -55
  58. package/docs/tutorials/index.json +2 -1
  59. package/docs/tutorials/lcevc.md +118 -0
  60. package/docs/tutorials/offline.md +10 -8
  61. package/docs/tutorials/plugins.md +5 -0
  62. package/docs/tutorials/ui-customization.md +17 -0
  63. package/docs/tutorials/ui.md +2 -1
  64. package/docs/tutorials/upgrade.md +3 -0
  65. package/externs/css_style_declaration.js +19 -0
  66. package/externs/lcevc.js +37 -13
  67. package/externs/managedmediasource.js +24 -0
  68. package/externs/media_remote.js +68 -0
  69. package/externs/mediatailor.js +193 -0
  70. package/externs/pictureinpicture.js +11 -0
  71. package/externs/shaka/abr_manager.js +6 -2
  72. package/externs/shaka/ads.js +27 -0
  73. package/externs/shaka/cea.js +7 -0
  74. package/externs/shaka/codecs.js +5 -3
  75. package/externs/shaka/manifest.js +31 -10
  76. package/externs/shaka/manifest_parser.js +24 -1
  77. package/externs/shaka/net.js +2 -2
  78. package/externs/shaka/offline.js +13 -2
  79. package/externs/shaka/player.js +65 -8
  80. package/externs/shaka/text.js +3 -1
  81. package/externs/shaka/transmuxer.js +1 -1
  82. package/karma.conf.js +7 -3
  83. package/lib/abr/simple_abr_manager.js +66 -9
  84. package/lib/ads/ad_manager.js +104 -50
  85. package/lib/ads/media_tailor_ad.js +297 -0
  86. package/lib/ads/media_tailor_ad_manager.js +839 -0
  87. package/lib/cast/cast_receiver.js +1 -1
  88. package/lib/cea/cea_decoder.js +28 -0
  89. package/lib/cea/dummy_caption_decoder.js +5 -0
  90. package/lib/cea/ts_cea_parser.js +15 -2
  91. package/lib/config/codec_switching_strategy.js +24 -0
  92. package/lib/dash/content_protection.js +120 -2
  93. package/lib/dash/dash_parser.js +322 -93
  94. package/lib/dash/mpd_utils.js +62 -37
  95. package/lib/dash/segment_base.js +17 -10
  96. package/lib/dash/segment_list.js +18 -9
  97. package/lib/dash/segment_template.js +122 -107
  98. package/lib/dependencies/all.js +8 -7
  99. package/lib/hls/hls_classes.js +28 -43
  100. package/lib/hls/hls_parser.js +798 -658
  101. package/lib/hls/hls_utils.js +64 -5
  102. package/lib/hls/manifest_text_parser.js +7 -11
  103. package/lib/lcevc/lcevc_dec.js +220 -0
  104. package/lib/media/adaptation_set.js +32 -14
  105. package/lib/media/adaptation_set_criteria.js +86 -16
  106. package/lib/media/closed_caption_parser.js +13 -0
  107. package/lib/media/content_workarounds.js +6 -0
  108. package/lib/media/drm_engine.js +8 -13
  109. package/lib/media/manifest_parser.js +8 -113
  110. package/lib/media/media_source_capabilities.js +10 -3
  111. package/lib/media/media_source_engine.js +286 -44
  112. package/lib/media/play_rate_controller.js +8 -38
  113. package/lib/media/presentation_timeline.js +7 -1
  114. package/lib/media/quality_observer.js +1 -1
  115. package/lib/media/segment_index.js +6 -6
  116. package/lib/media/segment_prefetch.js +92 -24
  117. package/lib/media/segment_reference.js +73 -7
  118. package/lib/media/segment_utils.js +343 -0
  119. package/lib/media/stall_detector.js +0 -3
  120. package/lib/media/streaming_engine.js +73 -38
  121. package/lib/mss/mss_parser.js +19 -2
  122. package/lib/net/networking_engine.js +67 -12
  123. package/lib/net/networking_utils.js +95 -0
  124. package/lib/offline/indexeddb/v1_storage_cell.js +3 -0
  125. package/lib/offline/indexeddb/v2_storage_cell.js +3 -0
  126. package/lib/offline/manifest_converter.js +3 -0
  127. package/lib/offline/offline_manifest_parser.js +10 -0
  128. package/lib/offline/storage.js +14 -7
  129. package/lib/player.js +1098 -1537
  130. package/lib/polyfill/mediasource.js +22 -1
  131. package/lib/text/cue.js +15 -0
  132. package/lib/text/mp4_ttml_parser.js +2 -2
  133. package/lib/text/srt_text_parser.js +2 -2
  134. package/lib/text/stub_text_displayer.js +51 -0
  135. package/lib/text/text_engine.js +3 -2
  136. package/lib/text/ttml_text_parser.js +45 -5
  137. package/lib/text/ui_text_displayer.js +8 -0
  138. package/lib/text/vtt_text_parser.js +40 -22
  139. package/lib/transmuxer/aac_transmuxer.js +1 -1
  140. package/lib/transmuxer/ac3_transmuxer.js +1 -1
  141. package/lib/transmuxer/ec3_transmuxer.js +1 -1
  142. package/lib/transmuxer/h264.js +5 -4
  143. package/lib/transmuxer/h265.js +863 -0
  144. package/lib/transmuxer/mp3_transmuxer.js +1 -1
  145. package/lib/transmuxer/mpeg_ts_transmuxer.js +4 -3
  146. package/lib/transmuxer/mss_transmuxer.js +1 -1
  147. package/lib/transmuxer/ts_transmuxer.js +187 -22
  148. package/lib/util/buffer_utils.js +26 -4
  149. package/lib/util/content_steering_manager.js +358 -0
  150. package/lib/util/error.js +30 -15
  151. package/lib/util/exp_golomb.js +30 -2
  152. package/lib/util/fairplay_utils.js +1 -1
  153. package/lib/util/fake_event.js +8 -1
  154. package/lib/util/id3_utils.js +50 -1
  155. package/lib/util/manifest_parser_utils.js +12 -8
  156. package/lib/util/mp4_generator.js +6 -8
  157. package/lib/util/mutex.js +59 -0
  158. package/lib/util/object_utils.js +1 -1
  159. package/lib/util/periods.js +156 -179
  160. package/lib/util/platform.js +44 -3
  161. package/lib/util/player_configuration.js +43 -6
  162. package/lib/util/state_history.js +6 -2
  163. package/lib/util/stream_utils.js +206 -283
  164. package/lib/util/ts_parser.js +335 -98
  165. package/lib/util/uint8array_utils.js +5 -1
  166. package/lib/util/xml_utils.js +5 -0
  167. package/maintained-branches.md +3 -2
  168. package/package.json +4 -6
  169. package/roadmap.md +25 -5
  170. package/shaka-player.uncompiled.js +2 -2
  171. package/support.html +0 -1
  172. package/test/abr/simple_abr_manager_unit.js +33 -33
  173. package/test/ads/ad_manager_unit.js +3 -2
  174. package/test/cast/cast_receiver_integration.js +50 -4
  175. package/test/cast/cast_utils_unit.js +2 -0
  176. package/test/cea/cea_decoder_unit.js +7 -0
  177. package/test/codec_switching/codec_switching_integration.js +182 -0
  178. package/test/dash/dash_parser_content_protection_unit.js +2 -0
  179. package/test/dash/dash_parser_integration.js +74 -0
  180. package/test/dash/dash_parser_live_unit.js +2 -19
  181. package/test/dash/dash_parser_manifest_unit.js +536 -2
  182. package/test/dash/dash_parser_segment_base_unit.js +2 -0
  183. package/test/dash/dash_parser_segment_list_unit.js +2 -0
  184. package/test/dash/dash_parser_segment_template_unit.js +2 -0
  185. package/test/dash/mpd_utils_unit.js +61 -30
  186. package/test/demo/demo_unit.js +0 -16
  187. package/test/hls/hls_live_unit.js +14 -3
  188. package/test/hls/hls_parser_unit.js +385 -33
  189. package/test/hls/manifest_text_parser_unit.js +32 -99
  190. package/test/media/adaptation_set_criteria_unit.js +284 -15
  191. package/test/media/adaptation_set_unit.js +2 -0
  192. package/test/media/content_workarounds_unit.js +1 -1
  193. package/test/media/drm_engine_unit.js +3 -3
  194. package/test/media/media_source_engine_unit.js +166 -2
  195. package/test/media/play_rate_controller_unit.js +0 -48
  196. package/test/media/segment_index_unit.js +5 -4
  197. package/test/media/segment_prefetch_unit.js +1 -1
  198. package/test/media/streaming_engine_unit.js +17 -17
  199. package/test/mss/mss_parser_unit.js +2 -0
  200. package/test/mss/mss_player_integration.js +3 -2
  201. package/test/net/networking_engine_unit.js +3 -3
  202. package/test/{media/manifest_parser_unit.js → net/networking_utils_unit.js} +2 -2
  203. package/test/offline/manifest_convert_unit.js +14 -0
  204. package/test/offline/offline_integration.js +2 -1
  205. package/test/offline/storage_integration.js +22 -13
  206. package/test/player_external.js +4 -2
  207. package/test/player_integration.js +15 -4
  208. package/test/player_load_graph_integration.js +47 -151
  209. package/test/player_src_equals_external.js +1 -0
  210. package/test/player_src_equals_integration.js +71 -4
  211. package/test/player_unit.js +182 -158
  212. package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
  213. package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
  214. package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
  215. package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
  216. package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
  217. package/test/test/assets/dash-aes-128/dash.mpd +18 -0
  218. package/test/test/assets/dash-aes-128/license +1 -0
  219. package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
  220. package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
  221. package/test/test/assets/dash-multi-codec/dash.mpd +32 -0
  222. package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
  223. package/test/test/assets/hls-ts-h265/0.ts +0 -0
  224. package/test/test/assets/hls-ts-h265/hevc.m3u8 +6 -0
  225. package/test/test/assets/hls-ts-h265/index.m3u8 +7 -0
  226. package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
  227. package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
  228. package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +9 -0
  229. package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +24 -0
  230. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
  231. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
  232. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
  233. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
  234. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
  235. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
  236. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
  237. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
  238. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
  239. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
  240. package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +14 -0
  241. package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +23 -0
  242. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
  243. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
  244. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
  245. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
  246. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
  247. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
  248. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
  249. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
  250. package/test/test/util/dash_parser_util.js +4 -0
  251. package/test/test/util/fake_ad_manager.js +20 -0
  252. package/test/test/util/fake_media_source_engine.js +13 -2
  253. package/test/test/util/fake_networking_engine.js +9 -1
  254. package/test/test/util/fake_segment_prefetch.js +3 -0
  255. package/test/test/util/manifest_generator.js +11 -3
  256. package/test/test/util/manifest_parser_util.js +14 -2
  257. package/test/test/util/mss_parser_util.js +4 -0
  258. package/test/test/util/offline_utils.js +2 -0
  259. package/test/test/util/simple_fakes.js +2 -2
  260. package/test/test/util/streaming_engine_util.js +10 -4
  261. package/test/test/util/test_scheme.js +6 -0
  262. package/test/test/util/ui_utils.js +4 -3
  263. package/test/text/mp4_ttml_parser_unit.js +4 -4
  264. package/test/text/srt_text_parser_unit.js +1 -1
  265. package/test/text/text_displayer_layout_unit.js +1 -1
  266. package/test/text/text_engine_unit.js +6 -0
  267. package/test/text/ttml_text_parser_unit.js +85 -2
  268. package/test/text/vtt_text_parser_unit.js +103 -31
  269. package/test/transmuxer/transmuxer_engine_integration.js +9 -0
  270. package/test/transmuxer/transmuxer_integration.js +150 -3
  271. package/test/ui/ad_ui_unit.js +2 -2
  272. package/test/ui/ui_customization_unit.js +17 -16
  273. package/test/ui/ui_integration.js +30 -20
  274. package/test/ui/ui_unit.js +28 -29
  275. package/test/util/buffer_utils_unit.js +1 -1
  276. package/test/util/content_steering_manager_unit.js +427 -0
  277. package/test/util/id3_utils_unit.js +52 -0
  278. package/test/util/stream_utils_unit.js +207 -169
  279. package/test/util/ts_parser_unit.js +3 -3
  280. package/third_party/closure-uri/uri.js +13 -1
  281. package/ui/audio_language_selection.js +9 -2
  282. package/ui/controls.js +125 -0
  283. package/ui/externs/ui.js +24 -2
  284. package/ui/language_utils.js +43 -8
  285. package/ui/less/range_elements.less +33 -0
  286. package/ui/locales/en.json +1 -0
  287. package/ui/locales/es-419.json +1 -0
  288. package/ui/locales/es.json +1 -0
  289. package/ui/locales/source.json +4 -0
  290. package/ui/localization.js +10 -0
  291. package/ui/pip_button.js +22 -120
  292. package/ui/remote_button.js +203 -0
  293. package/ui/resolution_selection.js +47 -10
  294. package/ui/seek_bar.js +296 -3
  295. package/ui/text_selection.js +2 -1
  296. package/ui/ui.js +11 -4
  297. package/demo/common/message_ids.js +0 -309
  298. package/demo/locales/en.json +0 -288
  299. package/demo/locales/source.json +0 -1146
  300. package/externs/mux.js +0 -69
  301. package/lib/lcevc/lcevc_dil.js +0 -152
  302. package/lib/routing/node.js +0 -23
  303. package/lib/routing/payload.js +0 -43
  304. package/lib/routing/walker.js +0 -587
  305. package/lib/transmuxer/muxjs_transmuxer.js +0 -242
  306. package/test/routing/walker_unit.js +0 -504
  307. 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
@@ -244,40 +235,6 @@ shakaDemo.Custom = class {
244
235
  }
245
236
 
246
237
 
247
- /**
248
- * @param {!ShakaDemoAssetInfo} assetInProgress
249
- * @param {!Array.<!HTMLInputElement>} inputsToCheck
250
- * @return {!Element} div
251
- * @private
252
- */
253
- makeAssetDialogContentsHLS_(assetInProgress, inputsToCheck) {
254
- const mediaPlaylistDiv = document.createElement('div');
255
- const containerStyle = shakaDemo.InputContainer.Style.FLEX;
256
- const container = new shakaDemo.InputContainer(
257
- mediaPlaylistDiv, /* headerText= */ null, containerStyle,
258
- /* docLink= */ null);
259
- container.getClassList().add('wide-input');
260
- container.setDefaultRowClass('wide-input');
261
-
262
- const fullMimeTypeSetup = (input, container) => {
263
- if (assetInProgress.mediaPlaylistFullMimeType) {
264
- input.value = assetInProgress.mediaPlaylistFullMimeType;
265
- }
266
- const defaultConfig = shaka.util.PlayerConfiguration.createDefault();
267
- input.placeholder = defaultConfig.manifest.hls.mediaPlaylistFullMimeType;
268
- };
269
- const fullMimeTypeOnChange = (input) => {
270
- assetInProgress.setMediaPlaylistFullMimeType(input.value);
271
- };
272
- const fullMimeTypeName = shakaDemoMain.getLocalizedString(
273
- shakaDemo.MessageIds.HLS_FULL_MIME_TYPE);
274
- this.makeField_(
275
- container, fullMimeTypeName, fullMimeTypeSetup, fullMimeTypeOnChange);
276
-
277
- return mediaPlaylistDiv;
278
- }
279
-
280
-
281
238
  /**
282
239
  * @param {!ShakaDemoAssetInfo} assetInProgress
283
240
  * @param {!Array.<!HTMLInputElement>} inputsToCheck
@@ -300,10 +257,7 @@ shakaDemo.Custom = class {
300
257
  const adTagOnChange = (input) => {
301
258
  assetInProgress.adTagUri = input.value;
302
259
  };
303
- const adTagURLName = shakaDemoMain.getLocalizedString(
304
- shakaDemo.MessageIds.AD_TAG_URL);
305
- this.makeField_(
306
- container, adTagURLName, adTagSetup, adTagOnChange);
260
+ this.makeField_(container, 'Ad Tag URL', adTagSetup, adTagOnChange);
307
261
 
308
262
  // Make the content source id field.
309
263
  const contentSrcIdSetup = (input, container) => {
@@ -319,8 +273,7 @@ shakaDemo.Custom = class {
319
273
  this.manifestField_.required =
320
274
  this.checkManifestRequired_(assetInProgress);
321
275
  };
322
- const contentSrcIdName = shakaDemoMain.getLocalizedString(
323
- shakaDemo.MessageIds.IMA_CONTENT_SRC_ID);
276
+ const contentSrcIdName = 'Content source ID (for VOD DAI Content)';
324
277
  this.makeField_(
325
278
  container, contentSrcIdName, contentSrcIdSetup, contentSrcIdOnChange);
326
279
 
@@ -338,10 +291,8 @@ shakaDemo.Custom = class {
338
291
  this.manifestField_.required =
339
292
  this.checkManifestRequired_(assetInProgress);
340
293
  };
341
- const videoIdName = shakaDemoMain.getLocalizedString(
342
- shakaDemo.MessageIds.IMA_VIDEO_ID);
343
- this.makeField_(
344
- container, videoIdName, videoIdSetup, videoIdOnChange);
294
+ const videoIdName = 'Video ID (for VOD DAI Content)';
295
+ this.makeField_(container, videoIdName, videoIdSetup, videoIdOnChange);
345
296
 
346
297
  // Make the asset key field.
347
298
  const assetKeySetup = (input, container) => {
@@ -357,10 +308,8 @@ shakaDemo.Custom = class {
357
308
  this.manifestField_.required =
358
309
  this.checkManifestRequired_(assetInProgress);
359
310
  };
360
- const assetKeyName = shakaDemoMain.getLocalizedString(
361
- shakaDemo.MessageIds.IMA_ASSET_KEY);
362
- this.makeField_(
363
- container, assetKeyName, assetKeySetup, assetKeyChange);
311
+ const assetKeyName = 'Asset key (for LIVE DAI Content)';
312
+ this.makeField_(container, assetKeyName, assetKeySetup, assetKeyChange);
364
313
 
365
314
  // Make the manifest type field.
366
315
  const manifestTypeSetup = (input, container) => {
@@ -376,11 +325,25 @@ shakaDemo.Custom = class {
376
325
  this.manifestField_.required =
377
326
  this.checkManifestRequired_(assetInProgress);
378
327
  };
379
- const manifestTypeName = shakaDemoMain.getLocalizedString(
380
- shakaDemo.MessageIds.IMA_MANIFEST_TYPE);
328
+ const manifestTypeName = 'Manifest type (for DAI Content)';
381
329
  this.makeField_(
382
330
  container, manifestTypeName, manifestTypeSetup, manifestTypeChange);
383
331
 
332
+ // Make the MediaTailor URL field.
333
+ const mediaTailorSetup = (input, container) => {
334
+ if (assetInProgress.mediaTailorUrl) {
335
+ input.value = assetInProgress.mediaTailorUrl;
336
+ }
337
+ };
338
+ const mediaTailorOnChange = (input) => {
339
+ assetInProgress.setMediaTailor(input.value);
340
+ this.manifestField_.required =
341
+ this.checkManifestRequired_(assetInProgress);
342
+ };
343
+ const mediaTailorName = 'Media Tailor URL';
344
+ this.makeField_(
345
+ container, mediaTailorName, mediaTailorSetup, mediaTailorOnChange);
346
+
384
347
  return adsDiv;
385
348
  }
386
349
 
@@ -437,10 +400,8 @@ shakaDemo.Custom = class {
437
400
  const licenseOnChange = (input) => {
438
401
  setLicenseServerURLs();
439
402
  };
440
- const licenseServerURLName = shakaDemoMain.getLocalizedString(
441
- shakaDemo.MessageIds.LICENSE_SERVER_URL);
442
403
  this.makeField_(
443
- container, licenseServerURLName, licenseSetup, licenseOnChange);
404
+ container, 'Custom License Server URL', licenseSetup, licenseOnChange);
444
405
 
445
406
  // Make the license certificate URL field.
446
407
  const certSetup = (input, container) => {
@@ -451,10 +412,8 @@ shakaDemo.Custom = class {
451
412
  const certOnChange = (input) => {
452
413
  assetInProgress.certificateUri = input.value;
453
414
  };
454
- const licenseCertificateURLName = shakaDemoMain.getLocalizedString(
455
- shakaDemo.MessageIds.LICENSE_CERTIFICATE_URL);
456
415
  this.makeField_(
457
- container, licenseCertificateURLName, certSetup, certOnChange);
416
+ container, 'Custom License Certificate URL', certSetup, certOnChange);
458
417
 
459
418
  // Make the drm system field.
460
419
  const drmSetup = (input, container) => {
@@ -470,14 +429,42 @@ shakaDemo.Custom = class {
470
429
  const drmOnChange = (input) => {
471
430
  setLicenseServerURLs();
472
431
  };
473
- const DRMSystemName = shakaDemoMain.getLocalizedString(
474
- shakaDemo.MessageIds.DRM_SYSTEM);
475
- this.makeField_(
476
- container, DRMSystemName, drmSetup, drmOnChange);
432
+ this.makeField_(container, 'Custom DRM System', drmSetup, drmOnChange);
477
433
 
478
434
  return drmDiv;
479
435
  }
480
436
 
437
+ /**
438
+ * @param {!ShakaDemoAssetInfo} assetInProgress
439
+ * @param {!Array.<!HTMLInputElement>} inputsToCheck
440
+ * @return {!Element} div
441
+ * @private
442
+ */
443
+ makeAssetDialogContentsExtraTracks_(assetInProgress, inputsToCheck) {
444
+ const extraTracksDiv = document.createElement('div');
445
+ const containerStyle = shakaDemo.InputContainer.Style.FLEX;
446
+ const container = new shakaDemo.InputContainer(
447
+ extraTracksDiv, /* headerText= */ null, containerStyle,
448
+ /* docLink= */ null);
449
+ container.getClassList().add('wide-input');
450
+ container.setDefaultRowClass('wide-input');
451
+
452
+ const thumbnailsUrlSetup = (input, container) => {
453
+ if (assetInProgress.extraThumbnail.length) {
454
+ input.value = assetInProgress.extraThumbnail[0];
455
+ }
456
+ };
457
+ const thumbnailsUrlOnChange = (input) => {
458
+ assetInProgress.extraThumbnail = [];
459
+ assetInProgress.addExtraThumbnail(input.value);
460
+ };
461
+
462
+ this.makeField_(
463
+ container, 'Thumbnails URL', thumbnailsUrlSetup, thumbnailsUrlOnChange);
464
+
465
+ return extraTracksDiv;
466
+ }
467
+
481
468
  /**
482
469
  * @param {!ShakaDemoAssetInfo} assetInProgress
483
470
  * @param {!Array.<!HTMLInputElement>} inputsToCheck
@@ -508,8 +495,7 @@ shakaDemo.Custom = class {
508
495
  // Make an error that shows up if you did not provide valid JSON.
509
496
  const error = document.createElement('span');
510
497
  error.classList.add('mdl-textfield__error');
511
- error.textContent = shakaDemoMain.getLocalizedString(
512
- shakaDemo.MessageIds.INVALID_JSON_CONFIG_ERROR);
498
+ error.textContent = 'Invalid JSON configuration';
513
499
 
514
500
  container.appendChild(error);
515
501
  };
@@ -526,8 +512,7 @@ shakaDemo.Custom = class {
526
512
  inputWrapper.setValid(false);
527
513
  }
528
514
  };
529
- const extraConfigLabel = shakaDemoMain.getLocalizedString(
530
- shakaDemo.MessageIds.EXTRA_SHAKA_PLAYER_CONFIG);
515
+ const extraConfigLabel = 'Extra Shaka Player configuration (JSON)';
531
516
  this.makeField_(
532
517
  container, extraConfigLabel, extraSetup, extraOnChange,
533
518
  /* isTextArea= */ true);
@@ -557,8 +542,7 @@ shakaDemo.Custom = class {
557
542
  // Make an error that shows up if you did not provide an URL.
558
543
  const error = document.createElement('span');
559
544
  error.classList.add('mdl-textfield__error');
560
- error.textContent = shakaDemoMain.getLocalizedString(
561
- shakaDemo.MessageIds.MANIFEST_URL_ERROR);
545
+ error.textContent = 'Must have a manifest URL, or IMA DAI id fields';
562
546
  container.appendChild(error);
563
547
 
564
548
  // Add a regex that will detect empty strings.
@@ -569,10 +553,7 @@ shakaDemo.Custom = class {
569
553
  const manifestOnChange = (input) => {
570
554
  assetInProgress.manifestUri = input.value.trim();
571
555
  };
572
- const manifestURLName = shakaDemoMain.getLocalizedString(
573
- shakaDemo.MessageIds.MANIFEST_URL);
574
- this.makeField_(
575
- container, manifestURLName, manifestSetup, manifestOnChange);
556
+ this.makeField_(container, 'Manifest URL', manifestSetup, manifestOnChange);
576
557
 
577
558
  // Make the name field.
578
559
  const nameSetup = (input, container) => {
@@ -582,8 +563,7 @@ shakaDemo.Custom = class {
582
563
  // Make an error that shows up if you have an empty/duplicate name.
583
564
  const error = document.createElement('span');
584
565
  error.classList.add('mdl-textfield__error');
585
- error.textContent = shakaDemoMain.getLocalizedString(
586
- shakaDemo.MessageIds.NAME_ERROR);
566
+ error.textContent = 'Must be a unique name.';
587
567
  container.appendChild(error);
588
568
 
589
569
  // Make a regex that will detect duplicates.
@@ -604,10 +584,7 @@ shakaDemo.Custom = class {
604
584
  const nameOnChange = (input) => {
605
585
  assetInProgress.name = input.value;
606
586
  };
607
- const nameName = shakaDemoMain.getLocalizedString(
608
- shakaDemo.MessageIds.NAME);
609
- this.makeField_(
610
- container, nameName, nameSetup, nameOnChange);
587
+ this.makeField_(container, 'Name', nameSetup, nameOnChange);
611
588
 
612
589
  // Make the icon field.
613
590
  const iconSetup = (input, container) => {
@@ -634,11 +611,7 @@ shakaDemo.Custom = class {
634
611
  iconDiv.appendChild(img);
635
612
  }
636
613
  };
637
-
638
- const iconURLName = shakaDemoMain.getLocalizedString(
639
- shakaDemo.MessageIds.ICON_URL);
640
- this.makeField_(
641
- container, iconURLName, iconSetup, iconOnChange);
614
+ this.makeField_(container, 'Icon URL', iconSetup, iconOnChange);
642
615
 
643
616
  // Make the MIME type field.
644
617
  const mimeTypeSetup = (input, container) => {
@@ -650,11 +623,7 @@ shakaDemo.Custom = class {
650
623
  const mimeTypeOnChange = (input) => {
651
624
  assetInProgress.mimeType = input.value || null;
652
625
  };
653
-
654
- const mimeTypeName = shakaDemoMain.getLocalizedString(
655
- shakaDemo.MessageIds.MIME_TYPE);
656
- this.makeField_(
657
- container, mimeTypeName, mimeTypeSetup, mimeTypeOnChange);
626
+ this.makeField_(container, 'MIME Type', mimeTypeSetup, mimeTypeOnChange);
658
627
 
659
628
  return mainDiv;
660
629
  }
@@ -668,7 +637,9 @@ shakaDemo.Custom = class {
668
637
  // from the Google Ad Manager using IMA ids.
669
638
  const isDaiAdManifest = (assetInProgress.imaContentSrcId &&
670
639
  assetInProgress.imaVideoId) || assetInProgress.imaAssetKey != null;
671
- return !isDaiAdManifest;
640
+ // Or if we are getting it from AWS Elemental MediaTailor.
641
+ const isMediaTailor = !!assetInProgress.mediaTailorUrl;
642
+ return !isDaiAdManifest && !isMediaTailor;
672
643
  }
673
644
 
674
645
  /**
@@ -681,9 +652,7 @@ shakaDemo.Custom = class {
681
652
  const finishDiv = document.createElement('tr');
682
653
 
683
654
  const buttonStyle = shakaDemo.Custom.ButtonStyle_.RAISED;
684
- const saveString =
685
- shakaDemoMain.getLocalizedString(shakaDemo.MessageIds.SAVE_BUTTON);
686
- finishDiv.appendChild(this.makeButton_(saveString, buttonStyle, () => {
655
+ finishDiv.appendChild(this.makeButton_('Save', buttonStyle, () => {
687
656
  for (const input of inputsToCheck) {
688
657
  if (!input.validity.valid) {
689
658
  return;
@@ -695,9 +664,7 @@ shakaDemo.Custom = class {
695
664
  this.remakeSavedList_();
696
665
  this.dialog_.close();
697
666
  }));
698
- const cancelString =
699
- shakaDemoMain.getLocalizedString(shakaDemo.MessageIds.CANCEL_BUTTON);
700
- finishDiv.appendChild(this.makeButton_(cancelString, buttonStyle, () => {
667
+ finishDiv.appendChild(this.makeButton_('Cancel', buttonStyle, () => {
701
668
  this.dialog_.close();
702
669
  }));
703
670
 
@@ -726,7 +693,7 @@ shakaDemo.Custom = class {
726
693
  assetInProgress, inputsToCheck);
727
694
  const adsDiv = this.makeAssetDialogContentsAds_(
728
695
  assetInProgress, inputsToCheck);
729
- const hlsDiv = this.makeAssetDialogContentsHLS_(
696
+ const extraTracksDiv = this.makeAssetDialogContentsExtraTracks_(
730
697
  assetInProgress, inputsToCheck);
731
698
  const extraConfigDiv = this.makeAssetDialogContentsExtra_(
732
699
  assetInProgress, inputsToCheck);
@@ -737,9 +704,8 @@ shakaDemo.Custom = class {
737
704
  const tabDiv = document.createElement('tr');
738
705
  const tabsToHide = [];
739
706
  const buttonsToSwitch = [];
740
- const addTabButton = (messageId, tabToShow, startOn) => {
707
+ const addTabButton = (name, tabToShow, startOn) => {
741
708
  const buttonStyle = shakaDemo.Custom.ButtonStyle_.PLAIN;
742
- const name = shakaDemoMain.getLocalizedString(messageId);
743
709
  const button = this.makeButton_(name, buttonStyle, () => {
744
710
  for (const tab of tabsToHide) {
745
711
  tab.classList.add('hidden');
@@ -759,18 +725,12 @@ shakaDemo.Custom = class {
759
725
  tabToShow.classList.add('hidden');
760
726
  }
761
727
  };
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);
728
+ addTabButton('Main', mainDiv, /* startOn= */ true);
729
+ addTabButton('Drm', drmDiv, /* startOn= */ false);
730
+ addTabButton('Headers', headersDiv, /* startOn= */ false);
731
+ addTabButton('Ads', adsDiv, /* startOn= */ false);
732
+ addTabButton('Extra Tracks', extraTracksDiv, /* startOn= */ false);
733
+ addTabButton('Extra Config', extraConfigDiv, /* startOn= */ false);
774
734
 
775
735
  // Append the divs in the desired order.
776
736
  this.dialog_.appendChild(tabDiv);
@@ -778,7 +738,7 @@ shakaDemo.Custom = class {
778
738
  this.dialog_.appendChild(drmDiv);
779
739
  this.dialog_.appendChild(headersDiv);
780
740
  this.dialog_.appendChild(adsDiv);
781
- this.dialog_.appendChild(hlsDiv);
741
+ this.dialog_.appendChild(extraTracksDiv);
782
742
  this.dialog_.appendChild(extraConfigDiv);
783
743
  this.dialog_.appendChild(finishDiv);
784
744
  this.dialog_.appendChild(iconDiv);
@@ -861,24 +821,24 @@ shakaDemo.Custom = class {
861
821
  const savedList = this.savedList_;
862
822
  const isFeatured = false;
863
823
  return new shakaDemo.AssetCard(savedList, asset, isFeatured, (c) => {
864
- c.addButton(shakaDemo.MessageIds.PLAY, () => {
824
+ c.addButton('Play', () => {
865
825
  shakaDemoMain.loadAsset(asset);
866
826
  this.updateSelected_();
867
827
  });
868
- c.addButton(shakaDemo.MessageIds.EDIT_CUSTOM, async () => {
828
+ c.addButton('Edit', async () => {
869
829
  if (asset.unstoreCallback) {
870
830
  await asset.unstoreCallback();
871
831
  }
872
832
  this.showAssetDialog_(asset);
873
833
  });
874
- c.addButton(shakaDemo.MessageIds.DELETE_CUSTOM, async () => {
834
+ c.addButton('Delete', async () => {
875
835
  this.assets_.delete(asset);
876
836
  if (asset.unstoreCallback) {
877
837
  await asset.unstoreCallback();
878
838
  }
879
839
  this.saveAssetInfos_(this.assets_);
880
840
  this.remakeSavedList_();
881
- }, shakaDemo.MessageIds.DELETE_CUSTOM);
841
+ }, 'Delete this custom asset?');
882
842
  c.addStoreButton();
883
843
  });
884
844
  }
@@ -905,15 +865,10 @@ shakaDemo.Custom = class {
905
865
  textElement.textContent = text;
906
866
  this.savedList_.appendChild(textElement);
907
867
  };
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));
868
+ makeMessage('title', 'Try Shaka Player with your own content!');
869
+ makeMessage('body-2', 'Press the button below to add a custom asset.');
914
870
  makeMessage('body-1',
915
- shakaDemoMain.getLocalizedString(
916
- shakaDemo.MessageIds.CUSTOM_INTRO_THREE));
871
+ 'Custom assets will remain even after reloading the page.');
917
872
  } else {
918
873
  // Make asset cards for the assets.
919
874
  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|';