shaka-player 3.3.2 → 4.0.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 (389) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/pull_request_template.md +6 -34
  4. package/.github/workflows/build-and-test.yaml +129 -0
  5. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  6. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  7. package/.github/workflows/demo-version-index.yaml +37 -0
  8. package/.github/workflows/nightly-demo.yaml +42 -0
  9. package/.github/workflows/release-please.yaml +168 -0
  10. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  11. package/.github/workflows/selenium-lab-tests.yaml +92 -0
  12. package/.github/workflows/sync-labels.yaml +33 -0
  13. package/.github/workflows/update-issues.yaml +29 -0
  14. package/.github/workflows/validate-pr-title.yaml +35 -0
  15. package/AUTHORS +3 -0
  16. package/CHANGELOG.md +1866 -1675
  17. package/CONTRIBUTING.md +2 -2
  18. package/CONTRIBUTORS +3 -0
  19. package/README.md +16 -13
  20. package/app-engine/README.md +9 -0
  21. package/app-engine/demo-version-index/README.md +14 -0
  22. package/app-engine/demo-version-index/app.yaml +28 -0
  23. package/app-engine/demo-version-index/generate.py +164 -0
  24. package/app-engine/demo-version-index/main.py +11 -0
  25. package/app-engine/demo-version-index/requirements.txt +5 -0
  26. package/app-engine/demo-version-index/templates/index.html +114 -0
  27. package/app-engine/shaka-player-demo/README.md +18 -0
  28. package/app-engine/shaka-player-demo/app.yaml +61 -0
  29. package/app-engine/shaka-player-demo/main.py +95 -0
  30. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  31. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  32. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  33. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  34. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  35. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  36. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  37. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  38. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  39. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  40. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  41. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  42. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  43. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  44. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  45. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  46. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  47. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  48. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  49. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  50. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  51. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  52. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  53. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  54. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  55. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  56. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  57. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  58. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  59. package/app-engine/shaka-player-demo/posters.py +110 -0
  60. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  61. package/app-engine/shaka-player-demo/time.txt +1 -0
  62. package/build/README.md +3 -3
  63. package/build/checkversion.py +1 -1
  64. package/build/compiler.py +1 -1
  65. package/build/conformance.textproto +13 -0
  66. package/build/docker/Dockerfile +20 -0
  67. package/build/docker/docker-compose.yml +10 -0
  68. package/build/gendeps.py +18 -15
  69. package/build/shaka-lab.yaml +161 -0
  70. package/build/shakaBuildHelpers.py +4 -29
  71. package/build/test.py +94 -29
  72. package/build/types/core +0 -1
  73. package/build/types/polyfill +1 -3
  74. package/build/wrapper.template.js +2 -2
  75. package/demo/TengwarTelcontar.woff2 +0 -0
  76. package/demo/asset_card.js +1 -2
  77. package/demo/cast_receiver/index.html +1 -1
  78. package/demo/cast_receiver/receiver_app.css +14 -14
  79. package/demo/common/asset.js +17 -1
  80. package/demo/common/assets.js +31 -0
  81. package/demo/common/message_ids.js +6 -3
  82. package/demo/config.js +10 -12
  83. package/demo/custom.js +39 -1
  84. package/demo/customWarning.txt +2 -2
  85. package/demo/demo.less +29 -18
  86. package/demo/demo_uncompiled.js +1 -13
  87. package/demo/demo_utils.js +0 -1
  88. package/demo/index.html +1 -1
  89. package/demo/locales/en.json +6 -3
  90. package/demo/locales/source.json +22 -10
  91. package/demo/main.js +12 -9
  92. package/demo/search.js +2 -1
  93. package/dist/controls.css +3 -3
  94. package/dist/controls.css.map +1 -1
  95. package/dist/demo.compiled.debug.js +236 -232
  96. package/dist/demo.compiled.debug.map +4 -4
  97. package/dist/demo.compiled.js +236 -232
  98. package/dist/demo.compiled.map +4 -4
  99. package/dist/demo.css +1 -1
  100. package/dist/demo.css.map +1 -1
  101. package/dist/deps.js +229 -226
  102. package/dist/locales.js +34 -32
  103. package/dist/receiver.compiled.debug.js +75 -73
  104. package/dist/receiver.compiled.debug.map +4 -4
  105. package/dist/receiver.compiled.js +75 -73
  106. package/dist/receiver.compiled.map +4 -4
  107. package/dist/shaka-player.compiled.d.ts +321 -314
  108. package/dist/shaka-player.compiled.debug.d.ts +321 -314
  109. package/dist/shaka-player.compiled.debug.externs.js +140 -129
  110. package/dist/shaka-player.compiled.debug.js +527 -592
  111. package/dist/shaka-player.compiled.debug.map +4 -4
  112. package/dist/shaka-player.compiled.externs.js +140 -129
  113. package/dist/shaka-player.compiled.js +836 -860
  114. package/dist/shaka-player.compiled.map +4 -4
  115. package/dist/shaka-player.ui.d.ts +367 -358
  116. package/dist/shaka-player.ui.debug.d.ts +367 -358
  117. package/dist/shaka-player.ui.debug.externs.js +148 -129
  118. package/dist/shaka-player.ui.debug.js +586 -649
  119. package/dist/shaka-player.ui.debug.map +4 -4
  120. package/dist/shaka-player.ui.externs.js +148 -129
  121. package/dist/shaka-player.ui.js +1008 -1028
  122. package/dist/shaka-player.ui.map +4 -4
  123. package/docs/design/REDESIGN.md +33 -33
  124. package/docs/design/bg-fetch.md +2 -2
  125. package/docs/design/codec_preferences.md +1 -1
  126. package/docs/design/dash-audio-channels.md +3 -3
  127. package/docs/design/dash-manifests.md +1 -1
  128. package/docs/design/gap-jumping.md +3 -3
  129. package/docs/design/preload.md +2 -2
  130. package/docs/tutorials/config.md +0 -2
  131. package/docs/tutorials/drm-config.md +5 -0
  132. package/docs/tutorials/fairplay.md +7 -22
  133. package/docs/tutorials/faq.md +8 -19
  134. package/docs/tutorials/index.json +3 -8
  135. package/docs/tutorials/plugins.md +4 -6
  136. package/docs/tutorials/selenium-grid-config.md +122 -0
  137. package/docs/tutorials/upgrade.md +83 -11
  138. package/docs/tutorials/welcome.md +10 -2
  139. package/externs/cmcd.js +1 -1
  140. package/externs/polyfill.js +15 -0
  141. package/externs/shaka/manifest.js +5 -1
  142. package/externs/shaka/net.js +12 -0
  143. package/externs/shaka/offline.js +5 -1
  144. package/externs/shaka/player.js +39 -32
  145. package/externs/shaka/text.js +12 -12
  146. package/externs/sourcebuffer.js +15 -0
  147. package/karma.conf.js +137 -30
  148. package/lib/abr/simple_abr_manager.js +12 -6
  149. package/lib/ads/client_side_ad.js +13 -2
  150. package/lib/ads/client_side_ad_manager.js +22 -4
  151. package/lib/cast/cast_proxy.js +3 -4
  152. package/lib/cast/cast_utils.js +0 -1
  153. package/lib/cea/cea608_data_channel.js +2 -2
  154. package/lib/cea/cea708_service.js +5 -4
  155. package/lib/cea/mp4_cea_parser.js +11 -5
  156. package/lib/cea/sei_processor.js +6 -3
  157. package/lib/dash/content_protection.js +85 -5
  158. package/lib/dash/dash_parser.js +10 -12
  159. package/lib/dash/mpd_utils.js +4 -5
  160. package/lib/dash/segment_list.js +1 -2
  161. package/lib/dash/segment_template.js +3 -3
  162. package/lib/hls/hls_parser.js +386 -749
  163. package/lib/hls/manifest_text_parser.js +5 -6
  164. package/lib/media/adaptation_set.js +1 -2
  165. package/lib/media/content_workarounds.js +2 -2
  166. package/lib/media/drm_engine.js +105 -55
  167. package/lib/media/gap_jumping_controller.js +10 -45
  168. package/lib/media/media_source_engine.js +90 -17
  169. package/lib/media/mp4_segment_index_parser.js +1 -4
  170. package/lib/media/playhead.js +4 -7
  171. package/lib/media/presentation_timeline.js +19 -10
  172. package/lib/media/segment_index.js +13 -46
  173. package/lib/media/segment_reference.js +47 -1
  174. package/lib/media/streaming_engine.js +35 -17
  175. package/lib/media/time_ranges_utils.js +5 -12
  176. package/lib/media/video_wrapper.js +1 -1
  177. package/lib/net/networking_engine.js +4 -1
  178. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  179. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  180. package/lib/offline/manifest_converter.js +1 -0
  181. package/lib/offline/storage.js +104 -136
  182. package/lib/player.js +50 -216
  183. package/lib/polyfill/all.js +2 -3
  184. package/lib/polyfill/encryption_scheme.js +1 -1
  185. package/lib/polyfill/media_capabilities.js +15 -9
  186. package/lib/polyfill/mediasource.js +0 -28
  187. package/lib/polyfill/patchedmediakeys_nop.js +2 -0
  188. package/lib/polyfill/patchedmediakeys_webkit.js +2 -0
  189. package/lib/polyfill/symbol.js +46 -0
  190. package/lib/text/cue.js +1 -7
  191. package/lib/text/lrc_text_parser.js +8 -0
  192. package/lib/text/mp4_ttml_parser.js +8 -0
  193. package/lib/text/mp4_vtt_parser.js +8 -0
  194. package/lib/text/sbv_text_parser.js +8 -0
  195. package/lib/text/simple_text_displayer.js +3 -8
  196. package/lib/text/srt_text_parser.js +8 -0
  197. package/lib/text/ssa_text_parser.js +8 -0
  198. package/lib/text/text_engine.js +19 -3
  199. package/lib/text/ttml_text_parser.js +16 -5
  200. package/lib/text/ui_text_displayer.js +2 -8
  201. package/lib/text/vtt_text_parser.js +24 -2
  202. package/lib/text/web_vtt_generator.js +1 -7
  203. package/lib/util/buffer_utils.js +1 -3
  204. package/lib/util/ebml_parser.js +3 -3
  205. package/lib/util/error.js +10 -14
  206. package/lib/util/fairplay_utils.js +109 -0
  207. package/lib/util/functional.js +0 -42
  208. package/lib/util/iterables.js +0 -46
  209. package/lib/util/mime_utils.js +2 -0
  210. package/lib/util/mp4_box_parsers.js +1 -4
  211. package/lib/util/mp4_parser.js +5 -7
  212. package/lib/util/periods.js +10 -11
  213. package/lib/util/platform.js +48 -3
  214. package/lib/util/player_configuration.js +12 -6
  215. package/lib/util/pssh.js +24 -8
  216. package/lib/util/stream_utils.js +96 -25
  217. package/lib/util/string_utils.js +3 -5
  218. package/lib/util/uint8array_utils.js +3 -21
  219. package/lib/util/xml_utils.js +16 -8
  220. package/package.json +61 -36
  221. package/roadmap.md +27 -27
  222. package/shaka-player.uncompiled.js +1 -3
  223. package/test/abr/simple_abr_manager_unit.js +3 -8
  224. package/test/ads/ad_manager_unit.js +0 -6
  225. package/test/cast/cast_proxy_unit.js +0 -8
  226. package/test/cast/cast_receiver_integration.js +1 -18
  227. package/test/cast/cast_receiver_unit.js +1 -9
  228. package/test/cast/cast_sender_unit.js +0 -6
  229. package/test/cast/cast_utils_unit.js +1 -13
  230. package/test/cea/cea608_memory_unit.js +0 -5
  231. package/test/cea/cea708_service_unit.js +0 -7
  232. package/test/cea/cea708_window_unit.js +0 -5
  233. package/test/cea/cea_decoder_unit.js +0 -6
  234. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  235. package/test/cea/dtvcc_packet_unit.js +0 -5
  236. package/test/cea/mp4_cea_parser_unit.js +0 -4
  237. package/test/dash/dash_parser_content_protection_unit.js +45 -10
  238. package/test/dash/dash_parser_live_unit.js +2 -15
  239. package/test/dash/dash_parser_manifest_unit.js +2 -40
  240. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  241. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  242. package/test/dash/dash_parser_segment_template_unit.js +3 -13
  243. package/test/dash/mpd_utils_unit.js +3 -11
  244. package/test/demo/demo_unit.js +2 -6
  245. package/test/deprecate/enforcer_unit.js +0 -4
  246. package/test/deprecate/version_unit.js +0 -2
  247. package/test/hls/hls_live_unit.js +101 -234
  248. package/test/hls/hls_parser_unit.js +517 -447
  249. package/test/hls/manifest_text_parser_unit.js +0 -10
  250. package/test/media/adaptation_set_criteria_unit.js +3 -7
  251. package/test/media/adaptation_set_unit.js +0 -2
  252. package/test/media/buffering_observer_unit.js +1 -4
  253. package/test/media/closed_caption_parser_unit.js +0 -3
  254. package/test/media/drm_engine_integration.js +2 -15
  255. package/test/media/drm_engine_unit.js +90 -144
  256. package/test/media/manifest_parser_unit.js +0 -4
  257. package/test/media/media_source_engine_integration.js +26 -10
  258. package/test/media/media_source_engine_unit.js +8 -20
  259. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  260. package/test/media/play_rate_controller_unit.js +0 -4
  261. package/test/media/playhead_unit.js +35 -207
  262. package/test/media/presentation_timeline_unit.js +4 -7
  263. package/test/media/quality_observer_unit.js +0 -4
  264. package/test/media/region_observer_unit.js +1 -6
  265. package/test/media/region_timeline_unit.js +0 -3
  266. package/test/media/segment_index_unit.js +15 -31
  267. package/test/media/segment_reference_unit.js +0 -3
  268. package/test/media/stall_detector_unit.js +0 -5
  269. package/test/media/streaming_engine_integration.js +13 -75
  270. package/test/media/streaming_engine_unit.js +14 -37
  271. package/test/media/time_ranges_utils_unit.js +0 -7
  272. package/test/media/transmuxer_integration.js +0 -6
  273. package/test/media/webm_segment_index_parser_unit.js +0 -4
  274. package/test/net/data_uri_plugin_unit.js +0 -7
  275. package/test/net/http_plugin_unit.js +0 -9
  276. package/test/net/networking_engine_unit.js +0 -11
  277. package/test/offline/download_progress_estimator_unit.js +0 -2
  278. package/test/offline/indexeddb_storage_unit.js +0 -6
  279. package/test/offline/manifest_convert_unit.js +34 -12
  280. package/test/offline/offline_integration.js +1 -10
  281. package/test/offline/offline_manifest_parser_unit.js +1 -6
  282. package/test/offline/offline_scheme_unit.js +0 -8
  283. package/test/offline/offline_uri_unit.js +0 -2
  284. package/test/offline/storage_compatibility_unit.js +1 -14
  285. package/test/offline/storage_integration.js +6 -31
  286. package/test/player_external.js +1 -15
  287. package/test/player_integration.js +38 -28
  288. package/test/player_load_graph_integration.js +1 -6
  289. package/test/player_src_equals_external.js +3 -9
  290. package/test/player_src_equals_integration.js +0 -7
  291. package/test/player_unit.js +78 -37
  292. package/test/routing/walker_unit.js +0 -8
  293. package/test/test/assets/large_file.mpd +1 -1
  294. package/test/test/boot.js +75 -22
  295. package/test/test/externs/jasmine.js +2 -2
  296. package/test/test/externs/karma.js +4 -0
  297. package/test/test/namespace.js +10 -0
  298. package/test/test/util/canned_idb.js +0 -8
  299. package/test/test/util/cea_utils.js +0 -6
  300. package/test/test/util/dash_parser_util.js +0 -13
  301. package/test/test/util/fake_ad.js +0 -3
  302. package/test/test/util/fake_ad_manager.js +0 -9
  303. package/test/test/util/fake_demo_main.js +0 -5
  304. package/test/test/util/fake_drm_engine.js +0 -6
  305. package/test/test/util/fake_media_source_engine.js +11 -11
  306. package/test/test/util/fake_networking_engine.js +0 -5
  307. package/test/test/util/fake_text_displayer.js +0 -5
  308. package/test/test/util/indexeddb_utils.js +1 -10
  309. package/test/test/util/jasmine_fetch.js +0 -1
  310. package/test/test/util/loader.js +0 -18
  311. package/test/test/util/manifest_generator.js +12 -15
  312. package/test/test/util/manifest_parser_util.js +4 -7
  313. package/test/test/util/offline_utils.js +1 -5
  314. package/test/test/util/simple_fakes.js +9 -26
  315. package/test/test/util/stream_generator.js +0 -14
  316. package/test/test/util/streaming_engine_util.js +1 -15
  317. package/test/test/util/test_scheme.js +25 -20
  318. package/test/test/util/ttml_utils.js +0 -2
  319. package/test/test/util/ui_utils.js +0 -9
  320. package/test/test/util/util.js +9 -23
  321. package/test/test/util/waiter.js +84 -43
  322. package/test/text/cue_integration.js +2 -6
  323. package/test/text/lrc_text_parser_unit.js +6 -11
  324. package/test/text/mp4_ttml_parser_unit.js +6 -10
  325. package/test/text/mp4_vtt_parser_unit.js +7 -12
  326. package/test/text/sbv_text_parser_unit.js +5 -10
  327. package/test/text/simple_text_displayer_unit.js +1 -8
  328. package/test/text/srt_text_parser_unit.js +5 -10
  329. package/test/text/ssa_text_parser_unit.js +17 -34
  330. package/test/text/text_engine_unit.js +47 -12
  331. package/test/text/text_track_integration.js +0 -2
  332. package/test/text/ttml_text_parser_unit.js +79 -88
  333. package/test/text/ui_text_displayer_unit.js +44 -41
  334. package/test/text/vtt_text_parser_unit.js +55 -66
  335. package/test/text/web_vtt_generator_unit.js +0 -3
  336. package/test/ui/ad_ui_unit.js +0 -11
  337. package/test/ui/localization_unit.js +0 -3
  338. package/test/ui/text_displayer_layout_unit.js +1 -12
  339. package/test/ui/ui_customization_unit.js +0 -6
  340. package/test/ui/ui_integration.js +0 -32
  341. package/test/ui/ui_unit.js +28 -17
  342. package/test/util/abortable_operation_unit.js +4 -9
  343. package/test/util/array_utils_unit.js +0 -2
  344. package/test/util/buffer_utils_unit.js +0 -2
  345. package/test/util/cmcd_manager_unit.js +3 -3
  346. package/test/util/data_view_reader_unit.js +0 -4
  347. package/test/util/ebml_parser_unit.js +0 -4
  348. package/test/util/event_manager_unit.js +0 -3
  349. package/test/util/fake_event_target_unit.js +0 -5
  350. package/test/util/iterables_unit.js +0 -64
  351. package/test/util/language_utils_unit.js +0 -3
  352. package/test/util/manifest_parser_utils_unit.js +0 -2
  353. package/test/util/mp4_box_parsers_unit.js +0 -5
  354. package/test/util/mp4_parser_unit.js +0 -4
  355. package/test/util/multi_map_unit.js +0 -3
  356. package/test/util/object_utils_unit.js +0 -2
  357. package/test/util/periods_unit.js +14 -7
  358. package/test/util/pssh_unit.js +0 -5
  359. package/test/util/state_history_unit.js +0 -2
  360. package/test/util/stream_utils_unit.js +26 -15
  361. package/test/util/string_utils_unit.js +0 -6
  362. package/test/util/text_parser_unit.js +0 -2
  363. package/test/util/xml_utils_unit.js +0 -4
  364. package/ui/controls.js +65 -40
  365. package/ui/fullscreen_button.js +26 -6
  366. package/ui/less/ad_controls.less +6 -6
  367. package/ui/less/buttons.less +6 -6
  368. package/ui/less/containers.less +10 -12
  369. package/ui/less/overflow_menu.less +4 -4
  370. package/ui/less/range_elements.less +7 -2
  371. package/ui/less/tooltip.less +4 -4
  372. package/ui/locales/en.json +1 -0
  373. package/ui/locales/sjn-translations.yaml +257 -0
  374. package/ui/locales/sjn.json +42 -0
  375. package/ui/locales/source.json +5 -0
  376. package/ui/resolution_selection.js +31 -33
  377. package/ui/seek_bar.js +2 -1
  378. package/ui/ui.js +0 -17
  379. package/.github/workflows/build_and_test.yaml +0 -73
  380. package/.github/workflows/release.yaml +0 -53
  381. package/docs/tutorials/upgrade-v2-5.md +0 -441
  382. package/docs/tutorials/upgrade-v3.md +0 -38
  383. package/externs/svgelement.js +0 -18
  384. package/externs/webcrypto.js +0 -18
  385. package/lib/polyfill/mathround.js +0 -49
  386. package/lib/polyfill/patchedmediakeys_apple.js +0 -744
  387. package/lib/polyfill/patchedmediakeys_ms.js +0 -698
  388. package/lib/util/mutex.js +0 -52
  389. package/test/util/functional_unit.js +0 -82
@@ -7,7 +7,6 @@
7
7
  goog.provide('shaka.offline.Storage');
8
8
 
9
9
  goog.require('goog.asserts');
10
- goog.require('shaka.Deprecate');
11
10
  goog.require('shaka.Player');
12
11
  goog.require('shaka.log');
13
12
  goog.require('shaka.media.DrmEngine');
@@ -25,11 +24,9 @@ goog.require('shaka.util.ArrayUtils');
25
24
  goog.require('shaka.util.ConfigUtils');
26
25
  goog.require('shaka.util.Destroyer');
27
26
  goog.require('shaka.util.Error');
28
- goog.require('shaka.util.Functional');
29
27
  goog.require('shaka.util.IDestroyable');
30
28
  goog.require('shaka.util.Iterables');
31
29
  goog.require('shaka.util.MimeUtils');
32
- goog.require('shaka.util.Mutex');
33
30
  goog.require('shaka.util.Platform');
34
31
  goog.require('shaka.util.PlayerConfiguration');
35
32
  goog.require('shaka.util.StreamUtils');
@@ -195,22 +192,10 @@ shaka.offline.Storage = class {
195
192
  if (arguments.length == 2 && typeof(config) == 'string') {
196
193
  config = shaka.util.ConfigUtils.convertToConfigObject(config, value);
197
194
  }
198
-
199
195
  goog.asserts.assert(typeof(config) == 'object', 'Should be an object!');
200
196
 
201
- // Deprecate 'manifest.dash.defaultPresentationDelay' configuration.
202
- if (config['manifest'] && config['manifest']['dash'] &&
203
- 'defaultPresentationDelay' in config['manifest']['dash']) {
204
- shaka.Deprecate.deprecateFeature(4,
205
- 'manifest.dash.defaultPresentationDelay configuration',
206
- 'Please Use manifest.defaultPresentationDelay instead.');
207
- config['manifest']['defaultPresentationDelay'] =
208
- config['manifest']['dash']['defaultPresentationDelay'];
209
- delete config['manifest']['dash']['defaultPresentationDelay'];
210
- }
211
-
212
197
  goog.asserts.assert(
213
- this.config_, 'Cannot reconfigure stroage after calling destroy.');
198
+ this.config_, 'Cannot reconfigure storage after calling destroy.');
214
199
  return shaka.util.PlayerConfiguration.mergeConfigObjects(
215
200
  /* destination= */ this.config_, /* updates= */ config );
216
201
  }
@@ -292,7 +277,7 @@ shaka.offline.Storage = class {
292
277
  config.manifest.retryParameters,
293
278
  mimeType || null);
294
279
 
295
- return shaka.util.Functional.callFactory(factory);
280
+ return factory();
296
281
  };
297
282
 
298
283
  /** @type {!shaka.offline.DownloadManager} */
@@ -309,33 +294,9 @@ shaka.offline.Storage = class {
309
294
  shaka.util.ArrayUtils.remove(this.openDownloadManagers_, downloader);
310
295
  });
311
296
 
312
- // Provide a temporary shim for "then" for backward compatibility.
313
- /** @type {!Object} */ (abortableStoreOp)['then'] = (onSuccess) => {
314
- shaka.Deprecate.deprecateFeature(4,
315
- 'shaka.offline.Storage.store.then',
316
- 'Storage operations now return a shaka.util.AbortableOperation, ' +
317
- 'rather than a promise. Please update to conform to this new API; ' +
318
- 'you can use the |chain| method instead.');
319
- return abortableStoreOp.promise.then(onSuccess);
320
- };
321
-
322
297
  return this.startAbortableOperation_(abortableStoreOp);
323
298
  }
324
299
 
325
- /**
326
- * Returns true if an asset is currently downloading.
327
- *
328
- * @return {boolean}
329
- * @deprecated
330
- * @export
331
- */
332
- getStoreInProgress() {
333
- shaka.Deprecate.deprecateFeature(4,
334
- 'shaka.offline.Storage.getStoreInProgress',
335
- 'Multiple concurrent downloads are now supported.');
336
- return false;
337
- }
338
-
339
300
  /**
340
301
  * See |shaka.offline.Storage.store| for details.
341
302
  *
@@ -479,36 +440,34 @@ shaka.offline.Storage = class {
479
440
  async downloadSegments_(
480
441
  toDownload, manifestId, manifestDB, downloader, config, storage,
481
442
  manifest, drmEngine) {
443
+ let pendingManifestUpdates = {};
444
+ let pendingDataSize = 0;
445
+
482
446
  /**
483
447
  * @param {!Array.<!shaka.offline.DownloadInfo>} toDownload
484
448
  * @param {boolean} updateDRM
485
449
  */
486
450
  const download = async (toDownload, updateDRM) => {
487
- const throwIfAbortedFn = () => {
488
- this.ensureNotDestroyed_();
489
- };
490
451
  for (const download of toDownload) {
491
- /** @param {?BufferSource} data */
492
- let data;
493
452
  const request = download.makeSegmentRequest(config);
494
453
  const estimateId = download.estimateId;
495
454
  const isInitSegment = download.isInitSegment;
496
- const onDownloaded = (d) => {
497
- data = d;
498
- return Promise.resolve();
499
- };
500
- downloader.queue(download.groupId,
501
- request, estimateId, isInitSegment, onDownloaded);
502
- downloader.queueWork(download.groupId, async () => {
503
- goog.asserts.assert(data, 'We should have loaded data by now');
504
- goog.asserts.assert(data instanceof ArrayBuffer,
505
- 'The data should be an ArrayBuffer');
506
455
 
456
+ const onDownloaded = async (data) => {
457
+ // Store the data.
458
+ const dataKeys = await storage.addSegments([{data}]);
459
+ this.ensureNotDestroyed_();
460
+
461
+ // Store the necessary update to the manifest, to be processed later.
507
462
  const ref = /** @type {!shaka.media.SegmentReference} */ (
508
463
  download.ref);
509
- manifestDB = (await shaka.offline.Storage.assignStreamToManifest(
510
- manifestId, ref, {data}, throwIfAbortedFn)) || manifestDB;
511
- });
464
+ const id = shaka.offline.DownloadInfo.idForSegmentRef(ref);
465
+ pendingManifestUpdates[id] = dataKeys[0];
466
+ pendingDataSize += data.byteLength;
467
+ };
468
+
469
+ downloader.queue(download.groupId,
470
+ request, estimateId, isInitSegment, onDownloaded);
512
471
  }
513
472
  await downloader.waitToFinish();
514
473
 
@@ -516,8 +475,8 @@ shaka.offline.Storage = class {
516
475
  // Re-store the manifest, to attach session IDs.
517
476
  // These were (maybe) discovered inside the downloader; we can only add
518
477
  // them now, at the end, since the manifestDB is in flux during the
519
- // process of downloading and storing, and assignStreamToManifest does
520
- // not know about the DRM engine.
478
+ // process of downloading and storing, and assignSegmentsToManifest
479
+ // does not know about the DRM engine.
521
480
  this.ensureNotDestroyed_();
522
481
  this.setManifestDrmFields_(manifest, manifestDB, drmEngine, config);
523
482
  await storage.updateManifest(manifestId, manifestDB);
@@ -526,24 +485,54 @@ shaka.offline.Storage = class {
526
485
 
527
486
  const usingBgFetch = false; // TODO: Get.
528
487
 
529
- if (this.getManifestIsEncrypted_(manifest) && usingBgFetch &&
530
- !this.getManifestIncludesInitData_(manifest)) {
531
- // Background fetch can't make DRM sessions, so if we have to get the
532
- // init data from the init segments, download those first before anything
533
- // else.
534
- await download(toDownload.filter((info) => info.isInitSegment), true);
535
- this.ensureNotDestroyed_();
536
- toDownload = toDownload.filter((info) => !info.isInitSegment);
537
- }
488
+ try {
489
+ if (this.getManifestIsEncrypted_(manifest) && usingBgFetch &&
490
+ !this.getManifestIncludesInitData_(manifest)) {
491
+ // Background fetch can't make DRM sessions, so if we have to get the
492
+ // init data from the init segments, download those first before
493
+ // anything else.
494
+ await download(toDownload.filter((info) => info.isInitSegment), true);
495
+ this.ensureNotDestroyed_();
496
+ toDownload = toDownload.filter((info) => !info.isInitSegment);
538
497
 
539
- if (!usingBgFetch) {
540
- await download(toDownload, false);
541
- this.ensureNotDestroyed_();
498
+ // Copy these and reset them now, before calling await.
499
+ const manifestUpdates = pendingManifestUpdates;
500
+ const dataSize = pendingDataSize;
501
+ pendingManifestUpdates = {};
502
+ pendingDataSize = 0;
542
503
 
543
- goog.asserts.assert(
544
- !manifestDB.isIncomplete, 'The manifest should be complete by now');
545
- } else {
546
- // TODO: Send the request to the service worker. Don't await the result.
504
+ await shaka.offline.Storage.assignSegmentsToManifest(
505
+ storage, manifestId, manifestDB, manifestUpdates, dataSize,
506
+ () => this.ensureNotDestroyed_());
507
+ this.ensureNotDestroyed_();
508
+ }
509
+
510
+ if (!usingBgFetch) {
511
+ await download(toDownload, false);
512
+ this.ensureNotDestroyed_();
513
+
514
+ // Copy these and reset them now, before calling await.
515
+ const manifestUpdates = pendingManifestUpdates;
516
+ const dataSize = pendingDataSize;
517
+ pendingManifestUpdates = {};
518
+ pendingDataSize = 0;
519
+
520
+ await shaka.offline.Storage.assignSegmentsToManifest(
521
+ storage, manifestId, manifestDB, manifestUpdates, dataSize,
522
+ () => this.ensureNotDestroyed_());
523
+ this.ensureNotDestroyed_();
524
+
525
+ goog.asserts.assert(
526
+ !manifestDB.isIncomplete, 'The manifest should be complete by now');
527
+ } else {
528
+ // TODO: Send the request to the service worker. Don't await the result.
529
+ }
530
+ } catch (error) {
531
+ const dataKeys = Object.values(pendingManifestUpdates);
532
+ // Remove these pending segments that are not yet linked to the manifest.
533
+ await storage.removeSegments(dataKeys, (key) => {});
534
+
535
+ throw error;
547
536
  }
548
537
  }
549
538
 
@@ -567,70 +556,50 @@ shaka.offline.Storage = class {
567
556
  }
568
557
 
569
558
  /**
570
- * Load the given manifest, modifies it by assigning the given data to the
571
- * segments corresponding to "ref", then re-stores the manifest.
572
- * The parts of this function that modify the manifest are protected by a
573
- * mutex, to prevent race conditions; specifically, it prevents two parallel
574
- * instances of this method from both loading the manifest into memory at the
575
- * same time, which would result in the slower/later call overwriting the
576
- * changes of the other.
559
+ * Updates the given manifest, assigns database keys to segments, then stores
560
+ * the updated manifest.
577
561
  *
562
+ * It is up to the caller to ensure that this method is not called
563
+ * concurrently on the same manifest.
564
+ *
565
+ * @param {shaka.extern.StorageCell} storage
578
566
  * @param {number} manifestId
579
- * @param {!shaka.media.SegmentReference} ref
580
- * @param {shaka.extern.SegmentDataDB} data
567
+ * @param {!shaka.extern.ManifestDB} manifestDB
568
+ * @param {!Object.<string, number>} manifestUpdates
569
+ * @param {number} dataSizeUpdate
581
570
  * @param {function()} throwIfAbortedFn A function that should throw if the
582
571
  * download has been aborted.
583
- * @return {!Promise.<?shaka.extern.ManifestDB>}
572
+ * @return {!Promise}
584
573
  */
585
- static async assignStreamToManifest(manifestId, ref, data, throwIfAbortedFn) {
586
- /** @type {shaka.offline.StorageMuxer} */
587
- const muxer = new shaka.offline.StorageMuxer();
588
-
589
- const idForRef = shaka.offline.DownloadInfo.idForSegmentRef(ref);
574
+ static async assignSegmentsToManifest(
575
+ storage, manifestId, manifestDB, manifestUpdates, dataSizeUpdate,
576
+ throwIfAbortedFn) {
590
577
  let manifestUpdated = false;
591
- let dataKey;
592
- let activeHandle;
593
- /** @type {!shaka.extern.ManifestDB} */
594
- let manifestDB;
595
-
596
- let mutexId = 0;
597
578
 
598
579
  try {
599
- await muxer.init();
600
- activeHandle = await muxer.getActive();
601
-
602
- // Store the data.
603
- const dataKeys = await activeHandle.cell.addSegments([data]);
604
- dataKey = dataKeys[0];
605
- throwIfAbortedFn();
606
-
607
- // Acquire the mutex before accessing the manifest, since there could be
608
- // multiple instances of this method running at once.
609
- mutexId = await shaka.offline.Storage.mutex_.acquire();
610
- throwIfAbortedFn();
611
-
612
- // Load the manifest.
613
- const manifests = await activeHandle.cell.getManifests([manifestId]);
614
- throwIfAbortedFn();
615
- manifestDB = manifests[0];
616
-
617
580
  // Assign the stored data to the manifest.
618
581
  let complete = true;
619
582
  for (const stream of manifestDB.streams) {
620
583
  for (const segment of stream.segments) {
621
- if (segment.pendingSegmentRefId == idForRef) {
584
+ let dataKey = segment.pendingSegmentRefId ?
585
+ manifestUpdates[segment.pendingSegmentRefId] : null;
586
+ if (dataKey != null) {
622
587
  segment.dataKey = dataKey;
623
588
  // Now that the segment has been associated with the appropriate
624
589
  // dataKey, the pendingSegmentRefId is no longer necessary.
625
590
  segment.pendingSegmentRefId = undefined;
626
591
  }
627
- if (segment.pendingInitSegmentRefId == idForRef) {
592
+
593
+ dataKey = segment.pendingInitSegmentRefId ?
594
+ manifestUpdates[segment.pendingInitSegmentRefId] : null;
595
+ if (dataKey != null) {
628
596
  segment.initSegmentKey = dataKey;
629
597
  // Now that the init segment has been associated with the
630
598
  // appropriate initSegmentKey, the pendingInitSegmentRefId is no
631
599
  // longer necessary.
632
600
  segment.pendingInitSegmentRefId = undefined;
633
601
  }
602
+
634
603
  if (segment.pendingSegmentRefId) {
635
604
  complete = false;
636
605
  }
@@ -641,33 +610,30 @@ shaka.offline.Storage = class {
641
610
  }
642
611
 
643
612
  // Update the size of the manifest.
644
- manifestDB.size += data.data.byteLength;
613
+ manifestDB.size += dataSizeUpdate;
645
614
 
646
615
  // Mark the manifest as complete, if all segments are downloaded.
647
616
  if (complete) {
648
617
  manifestDB.isIncomplete = false;
649
618
  }
650
619
 
651
- // Re-store the manifest.
652
- await activeHandle.cell.updateManifest(manifestId, manifestDB);
620
+ // Update the manifest.
621
+ await storage.updateManifest(manifestId, manifestDB);
653
622
  manifestUpdated = true;
654
623
  throwIfAbortedFn();
655
624
  } catch (e) {
656
625
  await shaka.offline.Storage.cleanStoredManifest(manifestId);
657
626
 
658
- if (activeHandle && !manifestUpdated && dataKey) {
627
+ if (!manifestUpdated) {
628
+ const dataKeys = Object.values(manifestUpdates);
659
629
  // The cleanStoredManifest method will not "see" any segments that have
660
630
  // been downloaded but not assigned to the manifest yet. So un-store
661
631
  // them separately.
662
- await activeHandle.cell.removeSegments([dataKey], (key) => {});
632
+ await storage.removeSegments(dataKeys, (key) => {});
663
633
  }
664
634
 
665
635
  throw e;
666
- } finally {
667
- await muxer.destroy();
668
- shaka.offline.Storage.mutex_.release(mutexId);
669
636
  }
670
- return manifestDB;
671
637
  }
672
638
 
673
639
  /**
@@ -804,10 +770,10 @@ shaka.offline.Storage = class {
804
770
  makeManifestDB_(drmEngine, manifest, uri, metadata, config, downloader) {
805
771
  const pendingContent = shaka.offline.StoredContentUtils.fromManifest(
806
772
  uri, manifest, /* size= */ 0, metadata);
807
- // In https://github.com/google/shaka-player/issues/2652, we found that this
808
- // callback would be removed by the compiler if we reference the config in
809
- // the onProgress closure below. Reading it into a local variable first
810
- // seems to work around this apparent compiler bug.
773
+ // In https://github.com/shaka-project/shaka-player/issues/2652, we found
774
+ // that this callback would be removed by the compiler if we reference the
775
+ // config in the onProgress closure below. Reading it into a local
776
+ // variable first seems to work around this apparent compiler bug.
811
777
  const progressCallback = config.offline.progressCallback;
812
778
 
813
779
  const onProgress = (progress, size) => {
@@ -866,6 +832,7 @@ shaka.offline.Storage = class {
866
832
  drmInfo,
867
833
  appMetadata: metadata,
868
834
  isIncomplete: true,
835
+ sequenceMode: manifest.sequenceMode,
869
836
  };
870
837
 
871
838
  return {manifestDB, toDownload};
@@ -1361,6 +1328,9 @@ shaka.offline.Storage = class {
1361
1328
  const startTime =
1362
1329
  manifest.presentationTimeline.getSegmentAvailabilityStart();
1363
1330
 
1331
+ const numberOfParallelDownloads = config.offline.numberOfParallelDownloads;
1332
+ let groupId = 0;
1333
+
1364
1334
  shaka.offline.Storage.forEachSegment_(stream, startTime, (segment) => {
1365
1335
  const pendingSegmentRefId =
1366
1336
  shaka.offline.DownloadInfo.idForSegmentRef(segment);
@@ -1374,7 +1344,7 @@ shaka.offline.Storage = class {
1374
1344
  const segmentDownload = new shaka.offline.DownloadInfo(
1375
1345
  segment,
1376
1346
  estimateId,
1377
- stream.id,
1347
+ groupId,
1378
1348
  /* isInitSegment= */ false);
1379
1349
  toDownload.set(pendingSegmentRefId, segmentDownload);
1380
1350
  }
@@ -1389,7 +1359,7 @@ shaka.offline.Storage = class {
1389
1359
  const initDownload = new shaka.offline.DownloadInfo(
1390
1360
  segment.initSegmentReference,
1391
1361
  estimateId,
1392
- stream.id,
1362
+ groupId,
1393
1363
  /* isInitSegment= */ true);
1394
1364
  toDownload.set(pendingInitSegmentRefId, initDownload);
1395
1365
  }
@@ -1409,6 +1379,7 @@ shaka.offline.Storage = class {
1409
1379
  dataKey: 0,
1410
1380
  };
1411
1381
  streamDb.segments.push(segmentDB);
1382
+ groupId = (groupId + 1) % numberOfParallelDownloads;
1412
1383
  });
1413
1384
 
1414
1385
  return streamDb;
@@ -1662,9 +1633,6 @@ shaka.offline.Storage = class {
1662
1633
  }
1663
1634
  };
1664
1635
 
1665
- /** @private {!shaka.util.Mutex} */
1666
- shaka.offline.Storage.mutex_ = new shaka.util.Mutex();
1667
-
1668
1636
  shaka.offline.Storage.defaultSystemIds_ = new Map()
1669
1637
  .set('org.w3.clearkey', '1077efecc0b24d02ace33c1e52e2fb4b')
1670
1638
  .set('com.widevine.alpha', 'edef8ba979d64acea3c827dcd51d21ed')