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
@@ -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
  }
package/demo/main.js CHANGED
@@ -10,7 +10,6 @@ goog.provide('shakaDemo.Main');
10
10
  goog.require('ShakaDemoAssetInfo');
11
11
  goog.require('goog.asserts');
12
12
  goog.require('shakaDemo.CloseButton');
13
- goog.require('shakaDemo.MessageIds');
14
13
  goog.require('shakaDemo.Utils');
15
14
  goog.require('shakaDemo.Visualizer');
16
15
  goog.require('shakaDemo.VisualizerButton');
@@ -122,9 +121,8 @@ shakaDemo.Main = class {
122
121
  * This does not dispatch the shaka-main-loaded event, so it will not cause
123
122
  * the nav bar buttons to be set up.
124
123
  * @param {!shaka.ui.Overlay.FailReasonCode} reasonCode
125
- * @return {!Promise}
126
124
  */
127
- async initFailed(reasonCode) {
125
+ initFailed(reasonCode) {
128
126
  this.initCommon_();
129
127
 
130
128
  // Set up version links, so the user can switch to compiled mode if
@@ -155,25 +153,19 @@ shakaDemo.Main = class {
155
153
  element.classList.add('disabled-by-fail');
156
154
  }
157
155
 
158
- // Because the UI did not load, this will need to set up a localization
159
- // object manually.
160
- this.localization_ = new shaka.ui.Localization(/* fallbackLocale= */ 'en');
161
- this.localization_.changeLocale(navigator.languages || []);
162
- await this.setupLocalization_();
163
-
164
156
  // Process a synthetic error about lack of browser support.
165
157
  const severity = shaka.util.Error.Severity.CRITICAL;
166
158
  let href = '';
167
159
  let message = '';
168
160
  switch (reasonCode) {
169
161
  case shaka.ui.Overlay.FailReasonCode.NO_BROWSER_SUPPORT:
170
- message = this.getLocalizedString(
171
- shakaDemo.MessageIds.FAILURE_NO_BROWSER_SUPPORT);
162
+ message = 'Your browser is not supported!';
172
163
  href = 'https://github.com/shaka-project/shaka-player#' +
173
164
  'platform-and-browser-support-matrix';
174
165
  break;
175
166
  case shaka.ui.Overlay.FailReasonCode.PLAYER_FAILED_TO_LOAD:
176
- message = this.getLocalizedString(shakaDemo.MessageIds.FAILURE_MISC);
167
+ message = 'Shaka Player failed to load! If you are using an adblocker' +
168
+ ', try switching to compiled mode at the bottom of the page.';
177
169
  break;
178
170
  }
179
171
  this.handleError_(severity, message, href);
@@ -205,7 +197,7 @@ shakaDemo.Main = class {
205
197
  // Optionally enter noinput mode. This has to happen before setting up the
206
198
  // player.
207
199
  this.noInput_ = 'noinput' in this.getParams_();
208
- await this.setupPlayer_();
200
+ this.setupPlayer_();
209
201
  this.readHash_();
210
202
  window.addEventListener('hashchange', () => this.hashChanged_());
211
203
 
@@ -392,11 +384,8 @@ shakaDemo.Main = class {
392
384
  ui.configure(uiConfig);
393
385
  }
394
386
 
395
- /**
396
- * @return {!Promise}
397
- * @private
398
- */
399
- async setupPlayer_() {
387
+ /** @private */
388
+ setupPlayer_() {
400
389
  const video = /** @type {!HTMLVideoElement} */ (this.video_);
401
390
  const ui = video['ui'];
402
391
  this.player_ = ui.getControls().getPlayer();
@@ -443,7 +432,6 @@ shakaDemo.Main = class {
443
432
  });
444
433
 
445
434
  this.localization_ = this.controls_.getLocalization();
446
- await this.setupLocalization_();
447
435
 
448
436
  const drawerCloseButton = document.getElementById('drawer-close-button');
449
437
  drawerCloseButton.addEventListener('click', () => {
@@ -481,50 +469,6 @@ shakaDemo.Main = class {
481
469
  this.hideElement_(drawerCloseButton);
482
470
  }
483
471
 
484
- /**
485
- * @return {!Promise}
486
- * @private
487
- */
488
- async setupLocalization_() {
489
- // Set up localization lazy-loading.
490
- const applyNewLocaleIfPossible = () => {
491
- this.localizeHTMLElements_();
492
- this.dispatchEventWithName_('shaka-main-locale-changed');
493
- };
494
- const UNKNOWN_LOCALES = shaka.ui.Localization.UNKNOWN_LOCALES;
495
- this.localization_.addEventListener(UNKNOWN_LOCALES, (event) => {
496
- for (const locale of event['locales']) {
497
- // This will leave promise rejections uncaught; this is acceptable, as
498
- // this function is actually expected to fail fairly often, and has
499
- // built-in fallback behavior (from localization events) without needing
500
- // to catch the promise rejection.
501
- this.loadUILocale_(locale).then(() => {
502
- if (locale == this.uiLocale_) {
503
- applyNewLocaleIfPossible();
504
- }
505
- });
506
- }
507
- });
508
- const LOCALE_CHANGED = shaka.ui.Localization.LOCALE_CHANGED;
509
- this.localization_.addEventListener(LOCALE_CHANGED, (event) => {
510
- applyNewLocaleIfPossible();
511
- });
512
- const initialLocaleLoads = [];
513
- initialLocaleLoads.push(this.loadUILocale_(this.uiLocale_));
514
- if (this.uiLocale_.includes('-')) {
515
- // Also try to load the 'base' localization.
516
- // This is so that, for example, the uiLocale_ is set to 'en-US', it will
517
- // try to load 'en'.
518
- initialLocaleLoads.push(this.loadUILocale_(this.uiLocale_.split('-')[0]));
519
- }
520
- if (!this.uiLocale_.startsWith('en')) {
521
- // Load 'en' as a fallback option, if not already loaded.
522
- initialLocaleLoads.push(this.loadUILocale_('en'));
523
- }
524
- await Promise.all(initialLocaleLoads);
525
- this.localizeHTMLElements_();
526
- }
527
-
528
472
  /** @return {boolean} */
529
473
  getIsDrawerOpen() {
530
474
  const drawer = document.querySelector('.mdl-layout__drawer');
@@ -719,13 +663,13 @@ shakaDemo.Main = class {
719
663
  *
720
664
  * @param {!ShakaDemoAssetInfo} asset
721
665
  * @param {boolean} needOffline True if offline support is required.
722
- * @return {?shakaDemo.MessageIds} unsupportedReason
666
+ * @return {?string} unsupportedReason
723
667
  * Null if asset is supported.
724
668
  */
725
669
  getAssetUnsupportedReason(asset, needOffline) {
726
670
  if (needOffline &&
727
671
  (!shaka.offline.Storage.support() || !this.initialStoredList_)) {
728
- return shakaDemo.MessageIds.UNSUPPORTED_NO_OFFLINE;
672
+ return 'Your browser does not support offline storage.';
729
673
  }
730
674
 
731
675
  if (asset.source == shakaAssets.Source.CUSTOM) {
@@ -736,11 +680,11 @@ shakaDemo.Main = class {
736
680
 
737
681
  // Is the asset disabled?
738
682
  if (asset.disabled) {
739
- return shakaDemo.MessageIds.UNSUPPORTED_DISABLED;
683
+ return 'This asset is disabled.';
740
684
  }
741
685
 
742
686
  if (needOffline && !asset.features.includes(shakaAssets.Feature.OFFLINE)) {
743
- return shakaDemo.MessageIds.UNSUPPORTED_NO_DOWNLOAD;
687
+ return 'This asset cannot be downloaded.';
744
688
  }
745
689
 
746
690
  if (!asset.isClear() && !asset.isAes128()) {
@@ -748,7 +692,7 @@ shakaDemo.Main = class {
748
692
  return this.support_.drm[shakaAssets.identifierForKeySystem(drm)];
749
693
  });
750
694
  if (!hasSupportedDRM) {
751
- return shakaDemo.MessageIds.UNSUPPORTED_NO_KEY_SUPPORT;
695
+ return 'Your browser does not support the required key systems.';
752
696
  }
753
697
  if (needOffline) {
754
698
  const hasSupportedOfflineDRM = asset.drm.some((drm) => {
@@ -757,23 +701,24 @@ shakaDemo.Main = class {
757
701
  this.support_.drm[identifier].persistentState;
758
702
  });
759
703
  if (!hasSupportedOfflineDRM) {
760
- return shakaDemo.MessageIds.UNSUPPORTED_NO_LICENSE_SUPPORT;
704
+ return 'Your browser does not support offline licenses for the ' +
705
+ 'required key systems.';
761
706
  }
762
707
  }
763
708
  }
764
709
 
765
710
  // Does the browser support the asset's manifest type?
766
711
  if (asset.features.includes(shakaAssets.Feature.DASH) &&
767
- !this.support_.manifest['mpd']) {
768
- return shakaDemo.MessageIds.UNSUPPORTED_NO_DASH_SUPPORT;
712
+ !this.support_.manifest['application/dash+xml']) {
713
+ return 'Your browser does not support MPEG-DASH manifests.';
769
714
  }
770
715
  if (asset.features.includes(shakaAssets.Feature.HLS) &&
771
- !this.support_.manifest['m3u8']) {
772
- return shakaDemo.MessageIds.UNSUPPORTED_NO_HLS_SUPPORT;
716
+ !this.support_.manifest['application/x-mpegurl']) {
717
+ return 'Your browser does not support HLS manifests.';
773
718
  }
774
719
  if (asset.features.includes(shakaAssets.Feature.MSS) &&
775
- !this.support_.manifest['ism']) {
776
- return shakaDemo.MessageIds.UNSUPPORTED_NO_MSS_SUPPORT;
720
+ !this.support_.manifest['application/vnd.ms-sstr+xml']) {
721
+ return 'Your browser does not support MSS manifests.';
777
722
  }
778
723
 
779
724
  // Does the asset contain a playable mime type?
@@ -790,11 +735,14 @@ shakaDemo.Main = class {
790
735
  if (asset.features.includes(shakaAssets.Feature.CONTAINERLESS)) {
791
736
  mimeTypes.push('audio/aac');
792
737
  }
738
+ if (asset.features.includes(shakaAssets.Feature.DOLBY_VISION_3D)) {
739
+ mimeTypes.push('video/mp4; codecs="dvh1.20.01"');
740
+ }
793
741
  const hasSupportedMimeType = mimeTypes.some((type) => {
794
742
  return this.support_.media[type];
795
743
  });
796
744
  if (!hasSupportedMimeType) {
797
- return shakaDemo.MessageIds.UNSUPPORTED_NO_FORMAT_SUPPORT;
745
+ return 'Your browser does not support the required video format.';
798
746
  }
799
747
 
800
748
  return null;
@@ -841,55 +789,6 @@ shakaDemo.Main = class {
841
789
  return this.nativeControlsEnabled_;
842
790
  }
843
791
 
844
- /**
845
- * Look through all elements in the DOM, and look for things tagged as having
846
- * a localized string. Then, localize them.
847
- *
848
- * @private
849
- */
850
- localizeHTMLElements_() {
851
- for (const element of document.querySelectorAll('[localized-string]')) {
852
- const key = element.getAttribute('localized-string');
853
- const value = shakaDemo.MessageIds[key];
854
- if (value) {
855
- element.textContent = this.getLocalizedString(value);
856
- }
857
- }
858
- }
859
-
860
- /**
861
- * @param {!shakaDemo.MessageIds} string
862
- * @return {string}
863
- */
864
- getLocalizedString(string) {
865
- return this.localization_.resolve(string);
866
- }
867
-
868
- /**
869
- * @param {string} locale
870
- * @return {!Promise}
871
- * @private
872
- */
873
- async loadUILocale_(locale) {
874
- if (!locale) {
875
- return;
876
- }
877
-
878
- const load = async (urlBase) => {
879
- const url = urlBase + '/locales/' + locale + '.json';
880
-
881
- try {
882
- const text = await this.loadText_(url);
883
- const obj = /** @type {!Object.<string, string>} */(JSON.parse(text));
884
- const map = new Map(Object.entries(obj));
885
- this.localization_.insert(locale, map);
886
- } catch (error) {
887
- console.warn('Unable to load locale', locale, 'for url', url);
888
- }
889
- };
890
- await Promise.all([load('../ui'), load('../demo')]);
891
- }
892
-
893
792
  /** @param {string} locale */
894
793
  setUILocale(locale) {
895
794
  this.uiLocale_ = locale;
@@ -1349,6 +1248,11 @@ shakaDemo.Main = class {
1349
1248
  if (asset.imaAssetKey || (asset.imaContentSrcId && asset.imaVideoId)) {
1350
1249
  manifestUri = await this.getManifestUriFromAdManager_(asset);
1351
1250
  }
1251
+ // If it's a MediaTailor asset, request ad-containing manifest
1252
+ // from the ad manager.
1253
+ if (asset.mediaTailorUrl) {
1254
+ manifestUri = await this.getManifestUriFromMediaTailorAdManager_(asset);
1255
+ }
1352
1256
  await this.player_.load(
1353
1257
  manifestUri,
1354
1258
  /* startTime= */ null,
@@ -1367,6 +1271,11 @@ shakaDemo.Main = class {
1367
1271
  this.player_.addThumbnailsTrack(extraThumbnail);
1368
1272
  }
1369
1273
 
1274
+ for (const extraChapter of asset.extraChapter) {
1275
+ this.player_.addChaptersTrack(extraChapter.uri, extraChapter.language,
1276
+ extraChapter.mime);
1277
+ }
1278
+
1370
1279
  // If the asset has an ad tag attached to it, load the ads
1371
1280
  const adManager = this.player_.getAdManager();
1372
1281
  if (adManager && asset.adTagUri) {
@@ -1636,6 +1545,34 @@ shakaDemo.Main = class {
1636
1545
  }
1637
1546
  }
1638
1547
 
1548
+ /**
1549
+ * @param {ShakaDemoAssetInfo} asset
1550
+ * @return {!Promise.<string>}
1551
+ * @private
1552
+ */
1553
+ async getManifestUriFromMediaTailorAdManager_(asset) {
1554
+ const adManager = this.player_.getAdManager();
1555
+ const container = this.controls_.getServerSideAdContainer();
1556
+ try {
1557
+ goog.asserts.assert(this.video_ != null, 'Video should not be null!');
1558
+ goog.asserts.assert(asset.mediaTailorUrl != null,
1559
+ 'Media Tailor info not be null!');
1560
+ const netEngine = this.player_.getNetworkingEngine();
1561
+ goog.asserts.assert(netEngine, 'There should be a net engine.');
1562
+ adManager.initMediaTailor(container, netEngine, this.video_);
1563
+ const uri = await adManager.requestMediaTailorStream(
1564
+ asset.mediaTailorUrl, asset.mediaTailorAdsParams,
1565
+ /* backupUri= */ asset.manifestUri);
1566
+ return uri;
1567
+ } catch (error) {
1568
+ console.log(error);
1569
+ console.warn('Ads code has been prevented from running ' +
1570
+ 'or returned an error. Proceeding without ads.');
1571
+
1572
+ return asset.manifestUri;
1573
+ }
1574
+ }
1575
+
1639
1576
  /**
1640
1577
  * Sets up a nav button, and an associated tab.
1641
1578
  * This method is meant to be called by the various tabs, as part of their
@@ -1810,7 +1747,6 @@ shakaDemo.Main = class {
1810
1747
  // Always show the new error if:
1811
1748
  // 1. there is no error showing currently
1812
1749
  // 2. the new error is more severe than the old one
1813
- // Sadly, we do not (yet?) have localizations for error messages.
1814
1750
  if (this.currentErrorSeverity_ == null ||
1815
1751
  severity > this.currentErrorSeverity_) {
1816
1752
  this.errorDisplayLink_.href = href;
package/demo/search.js CHANGED
@@ -11,7 +11,6 @@ goog.provide('shakaDemo.Search');
11
11
  goog.require('shakaDemo.AssetCard');
12
12
  goog.require('shakaDemo.BoolInput');
13
13
  goog.require('shakaDemo.InputContainer');
14
- goog.require('shakaDemo.MessageIds');
15
14
  goog.require('shakaDemo.SelectInput');
16
15
  goog.requireType('ShakaDemoAssetInfo');
17
16
 
@@ -60,12 +59,6 @@ shakaDemo.Search = class {
60
59
  document.addEventListener('shaka-main-offline-progress', () => {
61
60
  this.updateOfflineProgress_();
62
61
  });
63
- document.addEventListener('shaka-main-locale-changed', () => {
64
- this.remakeSearchDiv_(container);
65
- this.remakeResultsDiv_();
66
- // Update the componentHandler, to account for any new MDL elements added.
67
- componentHandler.upgradeDom();
68
- });
69
62
  document.addEventListener('shaka-main-page-changed', () => {
70
63
  if (!this.resultsDiv_.childNodes.length &&
71
64
  !container.classList.contains('hidden')) {
@@ -153,7 +146,7 @@ shakaDemo.Search = class {
153
146
  if (unsupportedReason) {
154
147
  c.markAsUnsupported(unsupportedReason);
155
148
  } else {
156
- c.addButton(shakaDemo.MessageIds.PLAY, () => {
149
+ c.addButton('Play', () => {
157
150
  shakaDemoMain.loadAsset(asset);
158
151
  this.updateSelected_();
159
152
  });
@@ -270,7 +263,7 @@ shakaDemo.Search = class {
270
263
  * The term this represents.
271
264
  * @param {shakaDemo.Search.TermType} type
272
265
  * The type of term that this term is.
273
- * @param {?shakaDemo.MessageIds} tooltip
266
+ * @param {?string} tooltip
274
267
  * @private
275
268
  */
276
269
  makeBooleanInput_(searchContainer, choice, type, tooltip) {
@@ -298,7 +291,7 @@ shakaDemo.Search = class {
298
291
  * Creates an input for a group of related but mutually-exclusive search
299
292
  * terms.
300
293
  * @param {!shakaDemo.InputContainer} searchContainer
301
- * @param {!shakaDemo.MessageIds} name
294
+ * @param {string} name
302
295
  * @param {!Array.<!shakaDemo.Search.SearchTerm>} choices
303
296
  * An array of the terms in this term group.
304
297
  * @param {shakaDemo.Search.TermType} type
@@ -311,7 +304,7 @@ shakaDemo.Search = class {
311
304
  const nullOption = '---';
312
305
  const valuesObject = {};
313
306
  for (const term of choices) {
314
- valuesObject[term] = shakaDemoMain.getLocalizedString(term);
307
+ valuesObject[term] = term;
315
308
  }
316
309
  valuesObject[nullOption] = nullOption;
317
310
  let lastValue = nullOption;
@@ -357,23 +350,18 @@ shakaDemo.Search = class {
357
350
  const coreContainer = new shakaDemo.InputContainer(
358
351
  container, /* headerText= */ null, shakaDemo.InputContainer.Style.FLEX,
359
352
  /* docLink= */ null);
360
- this.makeSelectInput_(coreContainer,
361
- shakaDemo.MessageIds.MANIFEST_SEARCH,
353
+ this.makeSelectInput_(coreContainer, 'Manifest',
362
354
  [Feature.DASH, Feature.HLS, Feature.MSS], FEATURE);
363
- this.makeSelectInput_(coreContainer,
364
- shakaDemo.MessageIds.CONTAINER_SEARCH,
355
+ this.makeSelectInput_(coreContainer, 'Container',
365
356
  [Feature.MP4, Feature.MP2TS, Feature.WEBM, Feature.CONTAINERLESS],
366
357
  FEATURE);
367
- this.makeSelectInput_(coreContainer,
368
- shakaDemo.MessageIds.DRM_SEARCH,
358
+ this.makeSelectInput_(coreContainer, 'DRM',
369
359
  Object.values(shakaAssets.KeySystem), DRM);
370
- this.makeSelectInput_(coreContainer,
371
- shakaDemo.MessageIds.SOURCE_SEARCH,
360
+ this.makeSelectInput_(coreContainer, 'Source',
372
361
  Object.values(shakaAssets.Source).filter((term) => {
373
362
  return term != shakaAssets.Source.CUSTOM;
374
363
  }), SOURCE);
375
- this.makeSelectInput_(coreContainer,
376
- shakaDemo.MessageIds.LIVE_SEARCH,
364
+ this.makeSelectInput_(coreContainer, 'Live',
377
365
  [Feature.LOW_LATENCY, Feature.LIVE, Feature.VOD], FEATURE);
378
366
 
379
367
  // Special terms.
@@ -382,29 +370,36 @@ shakaDemo.Search = class {
382
370
  container, /* headerText= */ null, containerStyle,
383
371
  /* docLink= */ null);
384
372
  this.makeBooleanInput_(specialContainer, Feature.HIGH_DEFINITION, FEATURE,
385
- shakaDemo.MessageIds.HIGH_DEFINITION_SEARCH);
373
+ 'Filters for assets with at least one high-definition video stream.');
374
+ this.makeBooleanInput_(specialContainer, Feature.ULTRA_HIGH_DEFINITION,
375
+ FEATURE, 'Filters for assets with at least one ultra-high-definition' +
376
+ ' video stream.');
386
377
  this.makeBooleanInput_(specialContainer, Feature.XLINK, FEATURE,
387
- shakaDemo.MessageIds.XLINK_SEARCH);
378
+ 'Filters for assets that have XLINK tags in their manifests, so that ' +
379
+ 'they can be broken into multiple files.');
388
380
  this.makeBooleanInput_(specialContainer, Feature.SUBTITLES, FEATURE,
389
- shakaDemo.MessageIds.SUBTITLES_SEARCH);
381
+ 'Filters for assets with caption tracks, or embedded captions.');
390
382
  this.makeBooleanInput_(specialContainer, Feature.TRICK_MODE, FEATURE,
391
- shakaDemo.MessageIds.TRICK_MODE_SEARCH);
383
+ 'Filters for assets that have special video tracks to be used in ' +
384
+ 'trick mode playback (aka fast-forward).');
392
385
  this.makeBooleanInput_(specialContainer, Feature.SURROUND, FEATURE,
393
- shakaDemo.MessageIds.SURROUND_SEARCH);
386
+ 'Filters for assets with at least one surround sound audio track.');
394
387
  this.makeBooleanInput_(specialContainer, Feature.OFFLINE, FEATURE,
395
- shakaDemo.MessageIds.OFFLINE_SEARCH);
388
+ 'Filters for assets that can be stored offline.');
396
389
  this.makeBooleanInput_(specialContainer, Feature.STORED, FEATURE,
397
- shakaDemo.MessageIds.STORED_SEARCH);
390
+ 'Filters for assets that have been stored offline.');
398
391
  this.makeBooleanInput_(specialContainer, Feature.ADS, FEATURE,
399
- shakaDemo.MessageIds.AD_SEARCH);
392
+ 'Filters for assets that have advertisements.');
400
393
  this.makeBooleanInput_(specialContainer, Feature.AUDIO_ONLY, FEATURE,
401
- shakaDemo.MessageIds.AUDIO_ONLY_SEARCH);
394
+ 'Filters for assets that do not have video streams.');
402
395
  this.makeBooleanInput_(specialContainer, Feature.THUMBNAILS, FEATURE,
403
- shakaDemo.MessageIds.THUMBNAILS);
396
+ 'Filters for assets that have a thumbnail track.');
397
+ this.makeBooleanInput_(specialContainer, Feature.CHAPTERS, FEATURE,
398
+ 'Filters for assets that have a chapters track.');
404
399
  this.makeBooleanInput_(specialContainer, Feature.LCEVC, FEATURE,
405
- shakaDemo.MessageIds.LCEVC);
406
- this.makeBooleanInput_(specialContainer, Feature.LOW_LATENCY,
407
- FEATURE, shakaDemo.MessageIds.LOW_LATENCY);
400
+ 'Filters for assets that have an LCEVC enhancement layer.');
401
+ this.makeBooleanInput_(specialContainer, Feature.CONTENT_STEERING, FEATURE,
402
+ 'Filters for assets that use Content Steering.');
408
403
 
409
404
  container.appendChild(this.resultsDiv_);
410
405
  }
@@ -92,9 +92,6 @@ const OPTIONAL_RESOURCES = [
92
92
  'https://shaka-player-demo.appspot.com/assets/poster.jpg',
93
93
  'https://shaka-player-demo.appspot.com/assets/audioOnly.gif',
94
94
 
95
- // The mux.js transmuxing library for MPEG-2 TS and CEA support.
96
- '../node_modules/mux.js/dist/mux.min.js',
97
-
98
95
  // The codem-isoboxer library for MSS support.
99
96
  '../node_modules/codem-isoboxer/dist/iso_boxer.min.js',
100
97
 
package/demo/tooltip.js CHANGED
@@ -7,19 +7,17 @@
7
7
 
8
8
  goog.provide('shakaDemo.Tooltips');
9
9
 
10
- goog.requireType('shakaDemo.MessageIds');
11
-
12
10
  /**
13
11
  * Creates and contains a tooltip.
14
12
  */
15
13
  shakaDemo.Tooltips = class {
16
14
  /**
17
15
  * @param {!Element} labeledElement
18
- * @param {shakaDemo.MessageIds} message
16
+ * @param {string} content
19
17
  */
20
- static make(labeledElement, message) {
18
+ static make(labeledElement, content) {
21
19
  tippy(labeledElement, {
22
- content: shakaDemoMain.getLocalizedString(message),
20
+ content,
23
21
  placement: 'bottom',
24
22
  arrow: true,
25
23
  animation: 'scale',
@@ -84,8 +84,7 @@ shakaDemo.Visualizer = class {
84
84
  inputContainer.addRow(null, null);
85
85
  this.screenshotButton_ = document.createElement('button');
86
86
  inputContainer.latestElementContainer.appendChild(this.screenshotButton_);
87
- this.screenshotButton_.textContent = shakaDemoMain.getLocalizedString(
88
- shakaDemo.MessageIds.VISUALIZER_SCREENSHOT_BUTTON);
87
+ this.screenshotButton_.textContent = 'Take Screenshot';
89
88
  this.screenshotButton_.classList.add('mdl-button');
90
89
  this.screenshotButton_.classList.add('mdl-button--colored');
91
90
  this.screenshotButton_.classList.add('mdl-js-button');
@@ -94,11 +93,10 @@ shakaDemo.Visualizer = class {
94
93
  this.takeScreenshot_();
95
94
  });
96
95
 
97
- inputContainer.addRow(
98
- shakaDemo.MessageIds.VISUALIZER_AUTO_SCREENSHOT_TOGGLE, null);
96
+ inputContainer.addRow('Take Screenshot On Stall', null);
99
97
  /** @private {!shakaDemo.BoolInput} */
100
98
  this.autoScreenshotToggle_ = new shakaDemo.BoolInput(
101
- inputContainer, shakaDemo.MessageIds.VISUALIZER_AUTO_SCREENSHOT_TOGGLE,
99
+ inputContainer, 'Take Screenshot On Stall',
102
100
  (input) => {
103
101
  this.takeAutoScreenshots_ = input.checked;
104
102
  });
@@ -7,8 +7,6 @@
7
7
 
8
8
  goog.provide('shakaDemo.VisualizerButton');
9
9
 
10
- goog.require('shakaDemo.MessageIds');
11
-
12
10
  /**
13
11
  * A custom UI overflow button, to allow users to show the visualizer.
14
12
  * This cannot actually extend shaka.ui.Element, as that class does not exist
@@ -41,6 +39,7 @@ shakaDemo.VisualizerButton = class extends shaka.ui.Element {
41
39
  label.classList.add('shaka-overflow-menu-only');
42
40
  this.nameSpan_ = document.createElement('span');
43
41
  label.appendChild(this.nameSpan_);
42
+ this.nameSpan_.textContent = 'Buffer Visualizer';
44
43
 
45
44
  /** @private {!HTMLElement} */
46
45
  this.currentPipState_ = /** @type {!HTMLElement} */ (
@@ -57,24 +56,6 @@ shakaDemo.VisualizerButton = class extends shaka.ui.Element {
57
56
  !shakaDemoMain.getIsVisualizerActive());
58
57
  this.setIcon_();
59
58
  });
60
-
61
- this.eventManager.listen(
62
- this.localization, shaka.ui.Localization.LOCALE_UPDATED, () => {
63
- this.updateLocalizedStrings_();
64
- });
65
-
66
- this.eventManager.listen(
67
- this.localization, shaka.ui.Localization.LOCALE_CHANGED, () => {
68
- this.updateLocalizedStrings_();
69
- });
70
- }
71
-
72
- /** @private */
73
- updateLocalizedStrings_() {
74
- this.nameSpan_.textContent = shakaDemoMain.getLocalizedString(
75
- shakaDemo.MessageIds.VISUALIZER_BUTTON);
76
- // TODO: Make sure that the screenreader description of this control is
77
- // localized!
78
59
  }
79
60
 
80
61
  /** @private */