shaka-player 4.3.11 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/AUTHORS +9 -0
  2. package/CHANGELOG.md +303 -202
  3. package/CONTRIBUTORS +8 -0
  4. package/LICENSE +32 -0
  5. package/README.md +63 -10
  6. package/demo/autoTemplate.txt +40 -5
  7. package/demo/close_button.js +11 -0
  8. package/demo/common/asset.js +13 -1
  9. package/demo/common/assets.js +53 -3
  10. package/demo/common/message_ids.js +25 -1
  11. package/demo/config.js +69 -10
  12. package/demo/customWarning.txt +2 -2
  13. package/demo/index.html +3 -1
  14. package/demo/locales/en.json +26 -2
  15. package/demo/locales/source.json +105 -9
  16. package/demo/main.js +52 -9
  17. package/demo/search.js +3 -1
  18. package/demo/service_worker.js +3 -0
  19. package/dist/controls.css +1 -1
  20. package/dist/controls.css.map +1 -1
  21. package/dist/demo.compiled.debug.js +124 -112
  22. package/dist/demo.compiled.debug.map +3 -3
  23. package/dist/demo.compiled.js +124 -112
  24. package/dist/demo.compiled.map +3 -3
  25. package/dist/deps.js +46 -28
  26. package/dist/locales.js +33 -33
  27. package/dist/receiver.compiled.debug.js +52 -46
  28. package/dist/receiver.compiled.debug.map +3 -3
  29. package/dist/receiver.compiled.js +52 -46
  30. package/dist/receiver.compiled.map +3 -3
  31. package/dist/shaka-player.compiled.d.ts +676 -391
  32. package/dist/shaka-player.compiled.debug.d.ts +676 -391
  33. package/dist/shaka-player.compiled.debug.externs.js +1188 -616
  34. package/dist/shaka-player.compiled.debug.js +1043 -699
  35. package/dist/shaka-player.compiled.debug.map +4 -4
  36. package/dist/shaka-player.compiled.externs.js +1188 -616
  37. package/dist/shaka-player.compiled.js +1091 -929
  38. package/dist/shaka-player.compiled.map +4 -4
  39. package/dist/shaka-player.ui.d.ts +677 -392
  40. package/dist/shaka-player.ui.debug.d.ts +677 -392
  41. package/dist/shaka-player.ui.debug.externs.js +1023 -451
  42. package/dist/shaka-player.ui.debug.js +1098 -737
  43. package/dist/shaka-player.ui.debug.map +4 -4
  44. package/dist/shaka-player.ui.externs.js +1023 -451
  45. package/dist/shaka-player.ui.js +1246 -1071
  46. package/dist/shaka-player.ui.map +4 -4
  47. package/docs/tutorials/ad_monetization.md +15 -1
  48. package/docs/tutorials/application-level-redirects.md +1 -1
  49. package/docs/tutorials/config.md +9 -5
  50. package/docs/tutorials/drm-config.md +61 -0
  51. package/docs/tutorials/fairplay.md +19 -4
  52. package/docs/tutorials/license-server-auth.md +4 -4
  53. package/docs/tutorials/license-wrapping.md +2 -2
  54. package/docs/tutorials/ui-customization.md +7 -3
  55. package/docs/tutorials/ui.md +7 -7
  56. package/docs/tutorials/upgrade.md +3 -0
  57. package/externs/ima.js +123 -2
  58. package/externs/isoboxer.js +217 -0
  59. package/externs/mediakeys.js +18 -0
  60. package/externs/mux.js +1 -105
  61. package/externs/pictureinpicture.js +48 -0
  62. package/externs/shaka/ads.js +61 -1
  63. package/externs/shaka/cea.js +110 -0
  64. package/externs/shaka/codecs.js +32 -0
  65. package/externs/shaka/manifest.js +101 -1
  66. package/externs/shaka/manifest_parser.js +0 -10
  67. package/externs/shaka/net.js +36 -7
  68. package/externs/shaka/offline.js +8 -1
  69. package/externs/shaka/player.js +220 -21
  70. package/externs/shaka/text.js +1 -382
  71. package/externs/shaka/transmuxer.js +60 -0
  72. package/karma.conf.js +13 -0
  73. package/lib/abr/simple_abr_manager.js +6 -3
  74. package/lib/ads/ad_manager.js +60 -2
  75. package/lib/ads/client_side_ad.js +86 -0
  76. package/lib/ads/client_side_ad_manager.js +79 -3
  77. package/lib/ads/server_side_ad.js +86 -0
  78. package/lib/ads/server_side_ad_manager.js +13 -0
  79. package/lib/cast/cast_utils.js +1 -0
  80. package/lib/cea/cea608_data_channel.js +24 -14
  81. package/lib/cea/cea608_memory.js +5 -2
  82. package/lib/cea/cea708_service.js +8 -9
  83. package/lib/cea/cea708_window.js +1 -2
  84. package/lib/cea/cea_decoder.js +23 -6
  85. package/lib/cea/cea_utils.js +25 -2
  86. package/lib/cea/dummy_caption_decoder.js +21 -0
  87. package/lib/cea/dummy_cea_parser.js +1 -3
  88. package/lib/cea/mp4_cea_parser.js +15 -10
  89. package/lib/cea/ts_cea_parser.js +69 -0
  90. package/lib/dash/content_protection.js +32 -2
  91. package/lib/dash/dash_parser.js +93 -31
  92. package/lib/dash/mpd_utils.js +6 -25
  93. package/lib/dash/segment_base.js +12 -14
  94. package/lib/dash/segment_list.js +10 -6
  95. package/lib/dash/segment_template.js +349 -32
  96. package/lib/dependencies/all.js +8 -0
  97. package/lib/hls/hls_classes.js +33 -8
  98. package/lib/hls/hls_parser.js +805 -191
  99. package/lib/hls/manifest_text_parser.js +4 -14
  100. package/lib/media/adaptation_set_criteria.js +43 -3
  101. package/lib/media/closed_caption_parser.js +74 -12
  102. package/lib/media/drm_engine.js +189 -49
  103. package/lib/media/gap_jumping_controller.js +1 -1
  104. package/lib/media/manifest_parser.js +34 -0
  105. package/lib/media/media_source_capabilities.js +10 -0
  106. package/lib/media/media_source_engine.js +495 -231
  107. package/lib/media/playhead.js +1 -1
  108. package/lib/media/presentation_timeline.js +62 -0
  109. package/lib/media/segment_index.js +50 -14
  110. package/lib/media/segment_prefetch.js +277 -0
  111. package/lib/media/segment_reference.js +70 -4
  112. package/lib/media/streaming_engine.js +258 -81
  113. package/lib/media/video_wrapper.js +15 -7
  114. package/lib/mss/content_protection.js +353 -0
  115. package/lib/mss/mss_parser.js +1082 -0
  116. package/lib/net/networking_engine.js +60 -10
  117. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  118. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  119. package/lib/offline/manifest_converter.js +6 -0
  120. package/lib/offline/storage.js +2 -4
  121. package/lib/player.js +309 -105
  122. package/lib/polyfill/media_capabilities.js +43 -3
  123. package/lib/polyfill/patchedmediakeys_apple.js +5 -0
  124. package/lib/polyfill/patchedmediakeys_nop.js +5 -0
  125. package/lib/polyfill/patchedmediakeys_webkit.js +5 -0
  126. package/lib/text/cue.js +208 -130
  127. package/lib/text/lrc_text_parser.js +2 -2
  128. package/lib/text/mp4_vtt_parser.js +2 -2
  129. package/lib/text/sbv_text_parser.js +1 -1
  130. package/lib/text/simple_text_displayer.js +1 -1
  131. package/lib/text/srt_text_parser.js +9 -1
  132. package/lib/text/ssa_text_parser.js +2 -2
  133. package/lib/text/text_engine.js +3 -21
  134. package/lib/text/text_utils.js +71 -20
  135. package/lib/text/ui_text_displayer.js +14 -14
  136. package/lib/text/vtt_text_parser.js +22 -14
  137. package/lib/transmuxer/aac_transmuxer.js +224 -0
  138. package/lib/transmuxer/ac3.js +142 -0
  139. package/lib/transmuxer/ac3_transmuxer.js +213 -0
  140. package/lib/transmuxer/adts.js +232 -0
  141. package/lib/transmuxer/ec3.js +103 -0
  142. package/lib/transmuxer/ec3_transmuxer.js +213 -0
  143. package/lib/transmuxer/h264.js +324 -0
  144. package/lib/transmuxer/mp3_transmuxer.js +205 -0
  145. package/lib/transmuxer/mpeg_audio.js +196 -0
  146. package/lib/transmuxer/mpeg_ts_transmuxer.js +182 -0
  147. package/lib/transmuxer/mss_transmuxer.js +389 -0
  148. package/lib/{media/transmuxer.js → transmuxer/muxjs_transmuxer.js} +34 -80
  149. package/lib/transmuxer/transmuxer_engine.js +161 -0
  150. package/lib/transmuxer/ts_transmuxer.js +721 -0
  151. package/lib/util/cmcd_manager.js +131 -71
  152. package/lib/util/error.js +62 -26
  153. package/lib/util/exp_golomb.js +220 -0
  154. package/lib/util/fairplay_utils.js +64 -13
  155. package/lib/util/id3_utils.js +56 -3
  156. package/lib/util/language_utils.js +11 -8
  157. package/lib/util/manifest_parser_utils.js +3 -0
  158. package/lib/util/mime_utils.js +44 -7
  159. package/lib/util/mp4_box_parsers.js +233 -5
  160. package/lib/util/mp4_generator.js +1388 -0
  161. package/lib/util/periods.js +40 -34
  162. package/lib/util/platform.js +17 -3
  163. package/lib/util/player_configuration.js +38 -1
  164. package/lib/util/stream_utils.js +138 -27
  165. package/lib/util/text_parser.js +1 -1
  166. package/lib/util/ts_parser.js +460 -74
  167. package/lib/util/xml_utils.js +16 -3
  168. package/maintained-branches.md +2 -2
  169. package/package.json +3 -1
  170. package/roadmap.md +21 -6
  171. package/shaka-player.uncompiled.js +18 -0
  172. package/test/abr/simple_abr_manager_unit.js +32 -4
  173. package/test/ads/ad_manager_unit.js +18 -2
  174. package/test/cast/cast_utils_unit.js +7 -2
  175. package/test/cea/cea608_memory_unit.js +24 -0
  176. package/test/cea/cea_decoder_unit.js +33 -0
  177. package/test/dash/dash_parser_content_protection_unit.js +93 -3
  178. package/test/dash/dash_parser_live_unit.js +56 -13
  179. package/test/dash/dash_parser_manifest_unit.js +70 -2
  180. package/test/dash/dash_parser_segment_base_unit.js +14 -9
  181. package/test/dash/dash_parser_segment_template_unit.js +286 -6
  182. package/test/demo/demo_unit.js +5 -1
  183. package/test/hls/hls_live_unit.js +188 -28
  184. package/test/hls/hls_parser_unit.js +250 -109
  185. package/test/hls/manifest_text_parser_unit.js +18 -13
  186. package/test/media/adaptation_set_criteria_unit.js +46 -14
  187. package/test/media/adaptation_set_unit.js +2 -0
  188. package/test/media/drm_engine_integration.js +11 -8
  189. package/test/media/drm_engine_unit.js +220 -7
  190. package/test/media/media_source_engine_integration.js +124 -40
  191. package/test/media/media_source_engine_unit.js +133 -153
  192. package/test/media/playhead_unit.js +3 -0
  193. package/test/media/presentation_timeline_unit.js +51 -0
  194. package/test/media/segment_index_unit.js +52 -0
  195. package/test/media/segment_prefetch_unit.js +243 -0
  196. package/test/media/streaming_engine_integration.js +9 -3
  197. package/test/media/streaming_engine_unit.js +440 -59
  198. package/test/mss/mss_parser_content_protection_unit.js +49 -0
  199. package/test/mss/mss_parser_unit.js +472 -0
  200. package/test/mss/mss_player_integration.js +123 -0
  201. package/test/offline/manifest_convert_unit.js +9 -0
  202. package/test/offline/storage_integration.js +6 -1
  203. package/test/player_unit.js +386 -133
  204. package/test/polyfill/media_capabilities_unit.js +18 -0
  205. package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
  206. package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
  207. package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
  208. package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
  209. package/test/test/assets/hls-raw-aac/manifest.m3u8 +4 -0
  210. package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +14 -0
  211. package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
  212. package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
  213. package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
  214. package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
  215. package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
  216. package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
  217. package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
  218. package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
  219. package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +31 -0
  220. package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
  221. package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
  222. package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
  223. package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
  224. package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
  225. package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
  226. package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
  227. package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
  228. package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +31 -0
  229. package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +13 -0
  230. package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
  231. package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
  232. package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
  233. package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
  234. package/test/test/assets/hls-raw-mp3/playlist.m3u8 +4 -0
  235. package/test/test/assets/hls-ts-aac/playlist.m3u8 +23 -0
  236. package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
  237. package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
  238. package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
  239. package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
  240. package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
  241. package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
  242. package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
  243. package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
  244. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
  245. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
  246. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
  247. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
  248. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
  249. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
  250. package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +19 -0
  251. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
  252. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
  253. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
  254. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
  255. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
  256. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
  257. package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +19 -0
  258. package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
  259. package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
  260. package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
  261. package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
  262. package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
  263. package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
  264. package/test/test/assets/hls-ts-h264/prog_index.m3u8 +25 -0
  265. package/test/test/assets/hls-ts-mp3/manifest.m3u8 +13 -0
  266. package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
  267. package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
  268. package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
  269. package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
  270. package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +17 -0
  271. package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
  272. package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
  273. package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
  274. package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
  275. package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
  276. package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
  277. package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +4 -0
  278. package/test/test/boot.js +7 -2
  279. package/test/test/util/fake_ad.js +99 -0
  280. package/test/test/util/fake_ad_manager.js +7 -1
  281. package/test/test/util/fake_networking_engine.js +41 -14
  282. package/test/test/util/fake_segment_prefetch.js +81 -0
  283. package/test/test/util/manifest_generator.js +19 -5
  284. package/test/test/util/mss_parser_util.js +115 -0
  285. package/test/test/util/offline_utils.js +1 -0
  286. package/test/test/util/simple_fakes.js +12 -3
  287. package/test/test/util/streaming_engine_util.js +14 -4
  288. package/test/test/util/ttml_utils.js +2 -2
  289. package/test/text/cue_integration.js +1 -1
  290. package/test/text/srt_text_parser_unit.js +78 -0
  291. package/test/text/text_engine_unit.js +17 -8
  292. package/test/text/ui_text_displayer_unit.js +4 -4
  293. package/test/text/vtt_text_parser_unit.js +59 -40
  294. package/test/text/web_vtt_generator_unit.js +9 -3
  295. package/test/{media/transmuxer_integration.js → transmuxer/muxjs_transmuxer_integration.js} +30 -33
  296. package/test/transmuxer/transmuxer_engine_integration.js +60 -0
  297. package/test/transmuxer/transmuxer_integration.js +296 -0
  298. package/test/util/cmcd_manager_unit.js +162 -13
  299. package/test/util/language_utils_unit.js +9 -2
  300. package/test/util/mp4_box_parsers_unit.js +39 -4
  301. package/test/util/periods_unit.js +34 -26
  302. package/test/util/stream_utils_unit.js +60 -107
  303. package/ui/controls.js +19 -1
  304. package/ui/controls.less +1 -0
  305. package/ui/externs/ui.js +11 -1
  306. package/ui/language_utils.js +15 -0
  307. package/ui/less/thumbnails.less +26 -0
  308. package/ui/locales/oc.json +42 -0
  309. package/ui/pip_button.js +83 -2
  310. package/ui/range_element.js +15 -0
  311. package/ui/resolution_selection.js +9 -2
  312. package/ui/seek_bar.js +223 -0
  313. package/ui/ui.js +5 -0
  314. package/lib/cea/i_caption_decoder.js +0 -51
  315. package/lib/cea/i_cea_parser.js +0 -68
@@ -6,7 +6,6 @@
6
6
 
7
7
  describe('Player', () => {
8
8
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
9
- const StreamUtils = shaka.util.StreamUtils;
10
9
  const Util = shaka.test.Util;
11
10
 
12
11
  const originalLogError = shaka.log.error;
@@ -30,8 +29,6 @@ describe('Player', () => {
30
29
  let player;
31
30
  /** @type {!shaka.test.FakeAbrManager} */
32
31
  let abrManager;
33
- /** @type {function(!shaka.util.Error)} */
34
- let onErrorCallback;
35
32
 
36
33
  /** @type {!shaka.test.FakeNetworkingEngine} */
37
34
  let networkingEngine;
@@ -138,8 +135,7 @@ describe('Player', () => {
138
135
  ended: jasmine.createSpy('ended').and.returnValue(false),
139
136
  };
140
137
 
141
- player.createDrmEngine = ({onError}) => {
142
- onErrorCallback = onError;
138
+ player.createDrmEngine = () => {
143
139
  return drmEngine;
144
140
  };
145
141
  player.createNetworkingEngine = () => networkingEngine;
@@ -343,164 +339,376 @@ describe('Player', () => {
343
339
  });
344
340
  });
345
341
 
346
- describe('onError and tryToRecoverFromError', () => {
347
- const httpError = new shaka.util.Error(
348
- shaka.util.Error.Severity.RECOVERABLE,
349
- shaka.util.Error.Category.NETWORK,
350
- shaka.util.Error.Code.HTTP_ERROR);
351
- const nonHttpError = new shaka.util.Error(
352
- shaka.util.Error.Severity.RECOVERABLE,
353
- shaka.util.Error.Category.NETWORK,
354
- shaka.util.Error.Code.TIMEOUT);
342
+ describe('disableStream', () => {
343
+ /** @type {function(function(), number)} */
344
+ let realSetTimeout;
345
+ /** @type {number} */
346
+ let disableTimeInSeconds;
355
347
  /** @type {?jasmine.Spy} */
356
- let dispatchEventSpy;
348
+ let getBufferedInfoSpy;
349
+
350
+ beforeAll(() => {
351
+ realSetTimeout = window.setTimeout;
352
+ jasmine.clock().install();
353
+ jasmine.clock().mockDate();
354
+ });
355
+
356
+ afterAll(() => {
357
+ jasmine.clock().uninstall();
358
+ });
359
+
360
+ beforeEach(() => {
361
+ disableTimeInSeconds = 30;
362
+ getBufferedInfoSpy = spyOn(player, 'getBufferedInfo')
363
+ .and.returnValue(bufferedInfo);
364
+ });
365
+
366
+ async function runTest(variantIndex, streamType, expectedStatus) {
367
+ await player.load(fakeManifestUri, 0, fakeMimeType);
368
+
369
+ const stream =
370
+ /** @type {shaka.extern.Stream} */
371
+ (manifest.variants[variantIndex][streamType]);
372
+ const status = player.disableStream(stream, 10);
373
+
374
+ expect(status).toBe(expectedStatus);
375
+ }
357
376
 
358
- beforeEach(async () => {
377
+ function multiVariantManifest() {
359
378
  manifest = shaka.test.ManifestGenerator.generate((manifest) => {
360
- manifest.addVariant(11, (variant) => {
361
- variant.addAudio(2);
379
+ manifest.addVariant(0, (variant) => {
380
+ variant.addAudio(1, (stream) => {
381
+ stream.mime('audio/mp4', 'mp4a.40.2');
382
+ stream.language = 'en';
383
+ });
384
+ variant.addVideo(2);
385
+ });
386
+ manifest.addVariant(1, (variant) => {
387
+ variant.addExistingStream(1);
362
388
  variant.addVideo(3);
363
389
  });
364
- manifest.addVariant(12, (variant) => {
365
- variant.addAudio(4);
366
- variant.addVideo(5);
390
+ manifest.addVariant(2, (variant) => {
391
+ variant.addExistingStream(1);
392
+ variant.addVideo(4);
367
393
  });
368
394
  });
395
+ }
396
+
397
+ it('disable and restore stream after configured time', async () => {
398
+ multiVariantManifest();
399
+
369
400
  await player.load(fakeManifestUri, 0, fakeMimeType);
370
- dispatchEventSpy = spyOn(player, 'dispatchEvent').and.returnValue(true);
371
- });
372
401
 
373
- afterEach(() => {
374
- dispatchEventSpy.calls.reset();
402
+ const variant = manifest.variants[0];
403
+ const videoStream = /** @type {shaka.extern.Stream} */ (variant.video);
404
+
405
+ player.disableStream(videoStream, disableTimeInSeconds);
406
+
407
+ expect(variant.disabledUntilTime).toBeGreaterThan(Date.now()/1000);
408
+
409
+ await shaka.test.Util.fakeEventLoop(disableTimeInSeconds);
410
+
411
+ expect(variant.disabledUntilTime).toBe(0);
375
412
  });
376
413
 
377
- it('does not handle non NETWORK HTTP_ERROR', () => {
378
- onErrorCallback(nonHttpError);
379
- expect(nonHttpError.handled).toBeFalsy();
380
- expect(player.dispatchEvent).toHaveBeenCalled();
414
+ it('does not restore stream if disabled time did not elapsed',
415
+ async () => {
416
+ multiVariantManifest();
417
+
418
+ await player.load(fakeManifestUri, 0, fakeMimeType);
419
+
420
+ const variant = manifest.variants[0];
421
+ const videoStream =
422
+ /** @type {shaka.extern.Stream} */ (variant.video);
423
+
424
+ player.disableStream(videoStream, disableTimeInSeconds);
425
+
426
+ expect(variant.disabledUntilTime).toBeGreaterThan(Date.now()/1000);
427
+
428
+ await shaka.test.Util.fakeEventLoop(disableTimeInSeconds - 5);
429
+
430
+ expect(variant.disabledUntilTime).toBeGreaterThan(Date.now()/1000);
431
+ });
432
+
433
+ it('updates abrManager and switch after disabling a stream', async () => {
434
+ multiVariantManifest();
435
+
436
+ await player.load(fakeManifestUri, 0, fakeMimeType);
437
+
438
+ const variantCount = manifest.variants.length;
439
+ const variant = manifest.variants[0];
440
+ const videoStream =
441
+ /** @type {shaka.extern.Stream} */ (variant.video);
442
+
443
+ player.disableStream(videoStream, disableTimeInSeconds);
444
+
445
+ // Disabled as expected?
446
+ expect(variant.disabledUntilTime).toBeGreaterThan(Date.now()/1000);
447
+ expect(abrManager.setVariants).toHaveBeenCalled();
448
+ expect(abrManager.chooseVariant).toHaveBeenCalled();
449
+ expect(streamingEngine.switchVariant).toHaveBeenCalled();
450
+ expect(getBufferedInfoSpy).toHaveBeenCalled();
451
+
452
+ const updatedVariants =
453
+ abrManager.setVariants.calls.mostRecent().args[0];
454
+ const alternateVariant =
455
+ streamingEngine.switchVariant.calls.mostRecent().args[0];
456
+ const safeMargin =
457
+ streamingEngine.switchVariant.calls.mostRecent().args[2];
458
+ const forceSwitch =
459
+ streamingEngine.switchVariant.calls.mostRecent().args[3];
460
+ const fromAdaptation =
461
+ streamingEngine.switchVariant.calls.mostRecent().args[4];
462
+
463
+ expect(updatedVariants.length).toBe(variantCount - 1);
464
+ expect(alternateVariant.video).not.toEqual(variant.video);
465
+ expect(safeMargin).toBe(14);
466
+ expect(forceSwitch).toBeTruthy();
467
+ expect(fromAdaptation).toBeFalsy();
468
+ });
469
+
470
+ it('updates abrManager and switch after restoring a stream', async () => {
471
+ multiVariantManifest();
472
+
473
+ await player.load(fakeManifestUri, 0, fakeMimeType);
474
+
475
+ const variantCount = manifest.variants.length;
476
+ const variant = manifest.variants[0];
477
+ const videoStream = /** @type {shaka.extern.Stream} */ (variant.video);
478
+
479
+ player.disableStream(videoStream, disableTimeInSeconds);
480
+
481
+ await shaka.test.Util.fakeEventLoop(disableTimeInSeconds);
482
+
483
+ // Restored as expected?
484
+ expect(variant.disabledUntilTime).toBe(0);
485
+ expect(abrManager.setVariants).toHaveBeenCalled();
486
+ expect(abrManager.chooseVariant).toHaveBeenCalled();
487
+ expect(streamingEngine.switchVariant).toHaveBeenCalled();
488
+
489
+ const updatedVariants =
490
+ abrManager.setVariants.calls.mostRecent().args[0];
491
+ const forceSwitch =
492
+ streamingEngine.switchVariant.calls.mostRecent().args[3];
493
+ const fromAdaptation =
494
+ streamingEngine.switchVariant.calls.mostRecent().args[4];
495
+
496
+ expect(updatedVariants.length).toBe(variantCount);
497
+ expect(forceSwitch).toBeFalsy();
498
+ expect(fromAdaptation).toBeFalsy();
381
499
  });
382
500
 
383
- describe('when config.streaming.maxDisabledTime is 0', () => {
384
- it('does not handle NETWORK HTTP_ERROR', () => {
385
- player.configure({streaming: {maxDisabledTime: 0}});
386
- httpError.handled = false;
387
- onErrorCallback(httpError);
388
- expect(httpError.handled).toBeFalsy();
389
- expect(player.dispatchEvent).toHaveBeenCalled();
501
+ it('disables all variants containing stream', async () => {
502
+ manifest = shaka.test.ManifestGenerator.generate((manifest) => {
503
+ manifest.addVariant(0, (variant) => {
504
+ variant.addAudio(1, (stream) => {
505
+ stream.mime('audio/mp4', 'mp4a.40.2');
506
+ stream.language = 'en';
507
+ stream.bandwidth = 100;
508
+ });
509
+ variant.addVideo(2);
510
+ });
511
+ manifest.addVariant(1, (variant) => {
512
+ variant.addExistingStream(1);
513
+ variant.addVideo(3);
514
+ });
515
+
516
+ manifest.addVariant(2, (variant) => {
517
+ variant.addAudio(4, (stream) => {
518
+ stream.mime('audio/mp4', 'mp4a.40.2');
519
+ stream.language = 'en';
520
+ stream.bandwidth = 200;
521
+ });
522
+ variant.addExistingStream(2);
523
+ });
524
+ manifest.addVariant(3, (variant) => {
525
+ variant.addExistingStream(4);
526
+ variant.addExistingStream(3);
527
+ });
390
528
  });
529
+
530
+ await player.load(fakeManifestUri, 0, fakeMimeType);
531
+
532
+ const variantCount = manifest.variants.length;
533
+ const variantAffected = 2;
534
+ const audioStream =
535
+ /** @type {shaka.extern.Stream} */ (manifest.variants[0].audio);
536
+
537
+ player.disableStream(audioStream, disableTimeInSeconds);
538
+
539
+ await shaka.test.Util.shortDelay(realSetTimeout);
540
+
541
+ expect(abrManager.setVariants).toHaveBeenCalled();
542
+
543
+ const updatedVariants =
544
+ abrManager.setVariants.calls.mostRecent().args[0];
545
+
546
+ expect(updatedVariants.length).toBe(variantCount - variantAffected);
547
+
548
+ for (const variant of updatedVariants) {
549
+ expect(variant.audio).not.toEqual(audioStream);
550
+ }
391
551
  });
392
552
 
393
- describe('when config.streaming.maxDisabledTime is 30', () => {
394
- /** @type {number} */
395
- const maxDisabledTime = 30;
396
- /** @type {number} */
397
- const currentTime = 123;
398
- const chosenVariant = {
399
- id: 1,
400
- language: 'es',
401
- disabledUntilTime: 0,
402
- primary: false,
403
- bandwidth: 2100,
404
- allowedByApplication: true,
405
- allowedByKeySystem: true,
406
- decodingInfos: [],
407
- };
408
- /** @type {?jasmine.Spy} */
409
- let applyRestrictionsSpy;
410
- /** @type {?jasmine.Spy} */
411
- let chooseVariantSpy;
412
- /** @type {?jasmine.Spy} */
413
- let getBufferedInfoSpy;
414
- /** @type {?jasmine.Spy} */
415
- let switchVariantSpy;
416
-
417
- describe('and there is new variant', () => {
418
- const oldDateNow = Date.now;
419
- beforeEach(() => {
420
- Date.now = () => currentTime * 1000;
421
- chooseVariantSpy = spyOn(player, 'chooseVariant_')
422
- .and.returnValue(chosenVariant);
423
- getBufferedInfoSpy = spyOn(player, 'getBufferedInfo')
424
- .and.returnValue(bufferedInfo);
425
- switchVariantSpy = spyOn(player, 'switchVariant_');
426
- applyRestrictionsSpy = spyOn(StreamUtils, 'applyRestrictions');
427
- httpError.handled = false;
428
- dispatchEventSpy.calls.reset();
429
- player.configure({streaming: {maxDisabledTime}});
430
- player.setMaxHardwareResolution(123, 456);
431
- });
553
+ it('does not disable streams if abr is disabled', async () => {
554
+ await player.load(fakeManifestUri, 0, fakeMimeType);
432
555
 
433
- afterEach(() => {
434
- Date.now = oldDateNow;
435
- chooseVariantSpy.calls.reset();
436
- getBufferedInfoSpy.calls.reset();
437
- switchVariantSpy.calls.reset();
438
- applyRestrictionsSpy.calls.reset();
556
+ player.configure({abr: {enabled: true}});
557
+
558
+ const videoStream =
559
+ /** @type {shaka.extern.Stream} */ (manifest.variants[0].video);
560
+ let status = player.disableStream(videoStream, 10);
561
+ expect(status).toBe(true);
562
+
563
+ player.configure({abr: {enabled: false}});
564
+
565
+ status = player.disableStream(videoStream, 10);
566
+ expect(status).toBe(false);
567
+ });
568
+
569
+ it('disables stream if have alternate stream', async () => {
570
+ // Run test with the default manifest
571
+ await runTest(0, 'video', true);
572
+
573
+ manifest = shaka.test.ManifestGenerator.generate((manifest) => {
574
+ manifest.addVariant(0, (variant) => {
575
+ variant.addAudio(1, (stream) => {
576
+ stream.mime('audio/mp4', 'mp4a.40.2');
577
+ stream.language = 'en';
578
+ stream.bandwidth = 10;
579
+ });
580
+ variant.addVideo(2);
439
581
  });
582
+ manifest.addVariant(1, (variant) => {
583
+ variant.addAudio(3, (stream) => {
584
+ stream.mime('audio/mp4', 'mp4a.40.2');
585
+ stream.language = 'en';
586
+ stream.bandwidth = 20;
587
+ });
588
+ variant.addExistingStream(2);
589
+ });
590
+ });
591
+
592
+ player.configure({abr: {enabled: true}});
593
+
594
+ await runTest(0, 'audio', true);
595
+ });
440
596
 
441
- it('handles HTTP_ERROR', () => {
442
- onErrorCallback(httpError);
443
- expect(httpError.handled).toBeTruthy();
597
+ describe('does not disable stream if there not alternate stream', () => {
598
+ it('single audio multiple videos', async () => {
599
+ manifest = shaka.test.ManifestGenerator.generate((manifest) => {
600
+ manifest.addVariant(0, (variant) => {
601
+ variant.addAudio(1, (stream) => {
602
+ stream.mime('audio/mp4', 'mp4a.40.2');
603
+ stream.language = 'en';
604
+ });
605
+ variant.addVideo(2);
606
+ });
607
+ manifest.addVariant(1, (variant) => {
608
+ variant.addExistingStream(1);
609
+ variant.addVideo(3);
610
+ });
444
611
  });
445
612
 
446
- it('does not dispatch any error', () => {
447
- onErrorCallback(httpError);
448
- expect(dispatchEventSpy).not.toHaveBeenCalled();
613
+ await runTest(0, 'audio', false);
614
+ });
615
+
616
+ it('multiple audio different languages', async () => {
617
+ manifest = shaka.test.ManifestGenerator.generate((manifest) => {
618
+ manifest.addVariant(0, (variant) => {
619
+ variant.addAudio(1, (stream) => {
620
+ stream.mime('audio/mp4', 'mp4a.40.2');
621
+ stream.language = 'en';
622
+ });
623
+ variant.addVideo(2);
624
+ });
625
+ manifest.addVariant(1, (variant) => {
626
+ variant.addAudio(3, (stream) => {
627
+ stream.mime('audio/mp4', 'mp4a.40.2');
628
+ stream.language = 'de';
629
+ });
630
+ variant.addExistingStream(2);
631
+ });
449
632
  });
450
633
 
451
- it('disables the current variant and applies restrictions', () => {
452
- onErrorCallback(httpError);
453
-
454
- const foundDisabledVariant =
455
- manifest.variants.some(({disabledUntilTime}) =>
456
- disabledUntilTime == currentTime + maxDisabledTime);
457
- expect(foundDisabledVariant).toBeTruthy();
458
- expect(applyRestrictionsSpy).toHaveBeenCalledWith(
459
- manifest.variants,
460
- player.getConfiguration().restrictions,
461
- {width: 123, height: 456});
634
+ await runTest(1, 'audio', false);
635
+ });
636
+
637
+ it('single variant', async () => {
638
+ manifest = shaka.test.ManifestGenerator.generate((manifest) => {
639
+ manifest.addVariant(0, (variant) => {
640
+ variant.addAudio(1);
641
+ variant.addVideo(2);
642
+ });
462
643
  });
463
644
 
464
- it('switches the variant', () => {
465
- onErrorCallback(httpError);
645
+ await runTest(0, 'audio', false);
646
+ await runTest(0, 'video', false);
647
+ });
466
648
 
467
- expect(chooseVariantSpy).toHaveBeenCalled();
468
- expect(getBufferedInfoSpy).toHaveBeenCalled();
469
- expect(switchVariantSpy)
470
- .toHaveBeenCalledWith(chosenVariant, false, true, 14);
649
+ it('single video multiple audio', async () => {
650
+ manifest = shaka.test.ManifestGenerator.generate((manifest) => {
651
+ manifest.addVariant(0, (variant) => {
652
+ variant.addAudio(1, (stream) => {
653
+ stream.mime('audio/mp4', 'mp4a.40.2');
654
+ stream.language = 'en';
655
+ stream.bandwidth = 10;
656
+ });
657
+ variant.addVideo(2);
658
+ });
659
+ manifest.addVariant(1, (variant) => {
660
+ variant.addAudio(3, (stream) => {
661
+ stream.mime('audio/mp4', 'mp4a.40.2');
662
+ stream.language = 'en';
663
+ stream.bandwidth = 20;
664
+ });
665
+ variant.addExistingStream(2);
666
+ });
471
667
  });
472
668
 
473
- describe('but browser is truly offline', () => {
474
- /** @type {!Object} */
475
- let navigatorOnLineDescriptor;
669
+ await runTest(0, 'video', false);
670
+ });
476
671
 
477
- // eslint-disable-next-line no-restricted-syntax
478
- const navigatorPrototype = Navigator.prototype;
672
+ describe('or', () => {
673
+ /** @type {!Object} */
674
+ let navigatorOnLineDescriptor;
479
675
 
480
- beforeAll(() => {
481
- navigatorOnLineDescriptor =
482
- /** @type {!Object} */(Object.getOwnPropertyDescriptor(
483
- navigatorPrototype, 'onLine'));
484
- });
676
+ // eslint-disable-next-line no-restricted-syntax
677
+ const navigatorPrototype = Navigator.prototype;
485
678
 
486
- beforeEach(() => {
487
- // Redefine the property, replacing only the getter.
488
- Object.defineProperty(navigatorPrototype, 'onLine',
489
- Object.assign(navigatorOnLineDescriptor, {
490
- get: () => false,
491
- }));
492
- });
679
+ beforeAll(() => {
680
+ navigatorOnLineDescriptor =
681
+ /** @type {!Object} */(Object.getOwnPropertyDescriptor(
682
+ navigatorPrototype, 'onLine'));
683
+ });
493
684
 
494
- afterEach(() => {
495
- // Restore the original property definition.
496
- Object.defineProperty(
497
- navigatorPrototype, 'onLine', navigatorOnLineDescriptor);
498
- });
685
+ beforeEach(() => {
686
+ // Redefine the property, replacing only the getter.
687
+ Object.defineProperty(navigatorPrototype, 'onLine',
688
+ Object.assign(navigatorOnLineDescriptor, {
689
+ get: () => false,
690
+ }));
691
+ });
692
+
693
+ afterEach(() => {
694
+ // Restore the original property definition.
695
+ Object.defineProperty(
696
+ navigatorPrototype, 'onLine', navigatorOnLineDescriptor);
697
+ });
499
698
 
500
- it('does not handle HTTP_ERROR', () => {
501
- onErrorCallback(httpError);
502
- expect(httpError.handled).toBe(false);
699
+ it('browser is truly offline', async () => {
700
+ manifest = shaka.test.ManifestGenerator.generate((manifest) => {
701
+ manifest.addVariant(11, (variant) => {
702
+ variant.addAudio(2);
703
+ variant.addVideo(3);
704
+ });
705
+ manifest.addVariant(12, (variant) => {
706
+ variant.addAudio(4);
707
+ variant.addVideo(5);
708
+ });
503
709
  });
710
+
711
+ await runTest(0, 'video', false);
504
712
  });
505
713
  });
506
714
  });
@@ -1083,19 +1291,23 @@ describe('Player', () => {
1083
1291
  lowLatencyMode: true,
1084
1292
  rebufferingGoal: 1,
1085
1293
  inaccurateManifestTolerance: 1,
1294
+ segmentPrefetchLimit: 1,
1086
1295
  },
1087
1296
  });
1088
1297
  expect(player.getConfiguration().streaming.rebufferingGoal).toBe(1);
1089
1298
  expect(player.getConfiguration().streaming.inaccurateManifestTolerance)
1090
1299
  .toBe(1);
1300
+ expect(player.getConfiguration().streaming.segmentPrefetchLimit).toBe(1);
1091
1301
 
1092
1302
  // When low latency streaming gets enabled, rebufferingGoal will default
1093
- // to 0.01 if unless specified, and inaccurateManifestTolerance will
1094
- // default to 0 unless specified.
1303
+ // to 0.01 if unless specified, inaccurateManifestTolerance will
1304
+ // default to 0 unless specified, and segmentPrefetchLimit will
1305
+ // default to 2 unless specified.
1095
1306
  player.configure('streaming.lowLatencyMode', true);
1096
1307
  expect(player.getConfiguration().streaming.rebufferingGoal).toBe(0.01);
1097
1308
  expect(player.getConfiguration().streaming.inaccurateManifestTolerance)
1098
1309
  .toBe(0);
1310
+ expect(player.getConfiguration().streaming.segmentPrefetchLimit).toBe(2);
1099
1311
  });
1100
1312
  });
1101
1313
 
@@ -1309,6 +1521,7 @@ describe('Player', () => {
1309
1521
  manifest.addVariant(106, (variant) => { // spanish stereo, low res
1310
1522
  variant.language = 'es';
1311
1523
  variant.bandwidth = 1100;
1524
+ variant.label = 'es-label';
1312
1525
  variant.addExistingStream(1); // video
1313
1526
  variant.addAudio(6, (stream) => {
1314
1527
  stream.originalId = 'audio-es';
@@ -1320,6 +1533,7 @@ describe('Player', () => {
1320
1533
  manifest.addVariant(107, (variant) => { // spanish stereo, high res
1321
1534
  variant.language = 'es';
1322
1535
  variant.bandwidth = 2100;
1536
+ variant.label = 'es-label';
1323
1537
  variant.addExistingStream(2); // video
1324
1538
  variant.addExistingStream(6); // audio
1325
1539
  });
@@ -1328,6 +1542,7 @@ describe('Player', () => {
1328
1542
  manifest.addTextStream(50, (stream) => {
1329
1543
  stream.originalId = 'text-es';
1330
1544
  stream.language = 'es';
1545
+ stream.originalLanguage = 'es';
1331
1546
  stream.label = 'Spanish';
1332
1547
  stream.bandwidth = 10;
1333
1548
  stream.mimeType = 'text/vtt';
@@ -1336,6 +1551,7 @@ describe('Player', () => {
1336
1551
  manifest.addTextStream(51, (stream) => {
1337
1552
  stream.originalId = 'text-en';
1338
1553
  stream.language = 'en';
1554
+ stream.originalLanguage = 'en';
1339
1555
  stream.label = 'English';
1340
1556
  stream.bandwidth = 10;
1341
1557
  stream.mimeType = 'application/ttml+xml';
@@ -1345,6 +1561,7 @@ describe('Player', () => {
1345
1561
  manifest.addTextStream(52, (stream) => {
1346
1562
  stream.originalId = 'text-commentary';
1347
1563
  stream.language = 'en';
1564
+ stream.originalLanguage = 'en';
1348
1565
  stream.label = 'English';
1349
1566
  stream.bandwidth = 10;
1350
1567
  stream.mimeType = 'application/ttml+xml';
@@ -1370,6 +1587,7 @@ describe('Player', () => {
1370
1587
  type: 'variant',
1371
1588
  bandwidth: 1300,
1372
1589
  language: 'en',
1590
+ originalLanguage: 'en',
1373
1591
  label: null,
1374
1592
  kind: null,
1375
1593
  width: 100,
@@ -1399,6 +1617,7 @@ describe('Player', () => {
1399
1617
  originalVideoId: 'video-1kbps',
1400
1618
  originalTextId: null,
1401
1619
  originalImageId: null,
1620
+ accessibilityPurpose: undefined,
1402
1621
  },
1403
1622
  {
1404
1623
  id: 101,
@@ -1406,6 +1625,7 @@ describe('Player', () => {
1406
1625
  type: 'variant',
1407
1626
  bandwidth: 2300,
1408
1627
  language: 'en',
1628
+ originalLanguage: 'en',
1409
1629
  label: null,
1410
1630
  kind: null,
1411
1631
  width: 200,
@@ -1435,6 +1655,7 @@ describe('Player', () => {
1435
1655
  originalVideoId: 'video-2kbps',
1436
1656
  originalTextId: null,
1437
1657
  originalImageId: null,
1658
+ accessibilityPurpose: undefined,
1438
1659
  },
1439
1660
  {
1440
1661
  id: 102,
@@ -1442,6 +1663,7 @@ describe('Player', () => {
1442
1663
  type: 'variant',
1443
1664
  bandwidth: 1100,
1444
1665
  language: 'en',
1666
+ originalLanguage: 'en',
1445
1667
  label: null,
1446
1668
  kind: null,
1447
1669
  width: 100,
@@ -1471,6 +1693,7 @@ describe('Player', () => {
1471
1693
  originalVideoId: 'video-1kbps',
1472
1694
  originalTextId: null,
1473
1695
  originalImageId: null,
1696
+ accessibilityPurpose: undefined,
1474
1697
  },
1475
1698
  {
1476
1699
  id: 103,
@@ -1478,6 +1701,7 @@ describe('Player', () => {
1478
1701
  type: 'variant',
1479
1702
  bandwidth: 2100,
1480
1703
  language: 'en',
1704
+ originalLanguage: 'en',
1481
1705
  label: null,
1482
1706
  kind: null,
1483
1707
  width: 200,
@@ -1507,6 +1731,7 @@ describe('Player', () => {
1507
1731
  originalVideoId: 'video-2kbps',
1508
1732
  originalTextId: null,
1509
1733
  originalImageId: null,
1734
+ accessibilityPurpose: undefined,
1510
1735
  },
1511
1736
  {
1512
1737
  id: 104,
@@ -1514,6 +1739,7 @@ describe('Player', () => {
1514
1739
  type: 'variant',
1515
1740
  bandwidth: 1100,
1516
1741
  language: 'en',
1742
+ originalLanguage: 'en',
1517
1743
  label: null,
1518
1744
  kind: null,
1519
1745
  width: 100,
@@ -1543,6 +1769,7 @@ describe('Player', () => {
1543
1769
  originalVideoId: 'video-1kbps',
1544
1770
  originalTextId: null,
1545
1771
  originalImageId: null,
1772
+ accessibilityPurpose: undefined,
1546
1773
  },
1547
1774
  {
1548
1775
  id: 105,
@@ -1550,6 +1777,7 @@ describe('Player', () => {
1550
1777
  type: 'variant',
1551
1778
  bandwidth: 2100,
1552
1779
  language: 'en',
1780
+ originalLanguage: 'en',
1553
1781
  label: null,
1554
1782
  kind: null,
1555
1783
  width: 200,
@@ -1579,6 +1807,7 @@ describe('Player', () => {
1579
1807
  originalVideoId: 'video-2kbps',
1580
1808
  originalTextId: null,
1581
1809
  originalImageId: null,
1810
+ accessibilityPurpose: undefined,
1582
1811
  },
1583
1812
  {
1584
1813
  id: 106,
@@ -1586,7 +1815,8 @@ describe('Player', () => {
1586
1815
  type: 'variant',
1587
1816
  bandwidth: 1100,
1588
1817
  language: 'es',
1589
- label: null,
1818
+ label: 'es-label',
1819
+ originalLanguage: 'es',
1590
1820
  kind: null,
1591
1821
  width: 100,
1592
1822
  height: 200,
@@ -1615,6 +1845,7 @@ describe('Player', () => {
1615
1845
  originalVideoId: 'video-1kbps',
1616
1846
  originalTextId: null,
1617
1847
  originalImageId: null,
1848
+ accessibilityPurpose: undefined,
1618
1849
  },
1619
1850
  {
1620
1851
  id: 107,
@@ -1622,7 +1853,8 @@ describe('Player', () => {
1622
1853
  type: 'variant',
1623
1854
  bandwidth: 2100,
1624
1855
  language: 'es',
1625
- label: null,
1856
+ label: 'es-label',
1857
+ originalLanguage: 'es',
1626
1858
  kind: null,
1627
1859
  width: 200,
1628
1860
  height: 400,
@@ -1651,6 +1883,7 @@ describe('Player', () => {
1651
1883
  originalVideoId: 'video-2kbps',
1652
1884
  originalTextId: null,
1653
1885
  originalImageId: null,
1886
+ accessibilityPurpose: undefined,
1654
1887
  },
1655
1888
  ];
1656
1889
 
@@ -1660,6 +1893,7 @@ describe('Player', () => {
1660
1893
  active: true,
1661
1894
  type: ContentType.TEXT,
1662
1895
  language: 'es',
1896
+ originalLanguage: 'es',
1663
1897
  label: 'Spanish',
1664
1898
  kind: 'caption',
1665
1899
  mimeType: 'text/vtt',
@@ -1690,12 +1924,14 @@ describe('Player', () => {
1690
1924
  originalVideoId: null,
1691
1925
  originalTextId: 'text-es',
1692
1926
  originalImageId: null,
1927
+ accessibilityPurpose: undefined,
1693
1928
  },
1694
1929
  {
1695
1930
  id: 51,
1696
1931
  active: false,
1697
1932
  type: ContentType.TEXT,
1698
1933
  language: 'en',
1934
+ originalLanguage: 'en',
1699
1935
  label: 'English',
1700
1936
  kind: 'caption',
1701
1937
  mimeType: 'application/ttml+xml',
@@ -1726,12 +1962,14 @@ describe('Player', () => {
1726
1962
  originalVideoId: null,
1727
1963
  originalTextId: 'text-en',
1728
1964
  originalImageId: null,
1965
+ accessibilityPurpose: undefined,
1729
1966
  },
1730
1967
  {
1731
1968
  id: 52,
1732
1969
  active: false,
1733
1970
  type: ContentType.TEXT,
1734
1971
  language: 'en',
1972
+ originalLanguage: 'en',
1735
1973
  label: 'English',
1736
1974
  kind: 'caption',
1737
1975
  mimeType: 'application/ttml+xml',
@@ -1762,6 +2000,7 @@ describe('Player', () => {
1762
2000
  originalVideoId: null,
1763
2001
  originalTextId: 'text-commentary',
1764
2002
  originalImageId: null,
2003
+ accessibilityPurpose: undefined,
1765
2004
  },
1766
2005
  ];
1767
2006
 
@@ -1771,6 +2010,7 @@ describe('Player', () => {
1771
2010
  active: false,
1772
2011
  type: ContentType.IMAGE,
1773
2012
  language: '',
2013
+ originalLanguage: null,
1774
2014
  label: null,
1775
2015
  kind: null,
1776
2016
  mimeType: 'image/jpeg',
@@ -1801,6 +2041,7 @@ describe('Player', () => {
1801
2041
  originalVideoId: null,
1802
2042
  originalTextId: null,
1803
2043
  originalImageId: 'thumbnail',
2044
+ accessibilityPurpose: null,
1804
2045
  },
1805
2046
  ];
1806
2047
 
@@ -2293,6 +2534,18 @@ describe('Player', () => {
2293
2534
  roles: ['commentary'],
2294
2535
  }));
2295
2536
  });
2537
+
2538
+ it('chooses a variant with preferred audio label', async () => {
2539
+ expect(getActiveVariantTrack().label).toBe(null);
2540
+
2541
+ player.configure({
2542
+ preferredAudioLanguage: '',
2543
+ preferredAudioLabel: 'es-label',
2544
+ });
2545
+
2546
+ await player.load(fakeManifestUri, 0, fakeMimeType);
2547
+ expect(getActiveVariantTrack().label).toBe('es-label');
2548
+ });
2296
2549
  }); // describe('tracks')
2297
2550
 
2298
2551
  describe('languages', () => {