rx-player 4.0.0-beta.0 → 4.0.0-beta.2

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 (297) hide show
  1. package/.eslintrc.js +8 -0
  2. package/CHANGELOG.md +93 -0
  3. package/CONTRIBUTING.md +48 -168
  4. package/FILES.md +40 -92
  5. package/VERSION +1 -1
  6. package/dist/_esm5.processed/compat/browser_detection.d.ts +25 -12
  7. package/dist/_esm5.processed/compat/browser_detection.js +85 -38
  8. package/dist/_esm5.processed/compat/can_reuse_media_keys.js +2 -2
  9. package/dist/_esm5.processed/compat/eme/close_session.js +2 -2
  10. package/dist/_esm5.processed/compat/eme/load_session.js +1 -1
  11. package/dist/_esm5.processed/compat/event_listeners.js +1 -1
  12. package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.d.ts +21 -0
  13. package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.js +26 -0
  14. package/dist/_esm5.processed/config.d.ts +4 -0
  15. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +9 -6
  16. package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.d.ts +18 -1
  17. package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.js +106 -25
  18. package/dist/_esm5.processed/core/adaptive/guess_based_chooser.js +6 -6
  19. package/dist/_esm5.processed/core/adaptive/network_analyzer.js +8 -5
  20. package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.d.ts +19 -1
  21. package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.js +1 -1
  22. package/dist/_esm5.processed/core/api/debug/buffer_graph.d.ts +28 -0
  23. package/dist/_esm5.processed/core/api/debug/buffer_graph.js +175 -0
  24. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.d.ts +10 -0
  25. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +104 -0
  26. package/dist/_esm5.processed/core/api/debug/constants.d.ts +2 -0
  27. package/dist/_esm5.processed/core/api/debug/constants.js +2 -0
  28. package/dist/_esm5.processed/core/api/debug/index.d.ts +2 -0
  29. package/dist/_esm5.processed/core/api/debug/index.js +2 -0
  30. package/dist/_esm5.processed/core/api/debug/modules/general_info.d.ts +3 -0
  31. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +180 -0
  32. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.d.ts +4 -0
  33. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +121 -0
  34. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.d.ts +3 -0
  35. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +35 -0
  36. package/dist/_esm5.processed/core/api/debug/render.d.ts +3 -0
  37. package/dist/_esm5.processed/core/api/debug/render.js +32 -0
  38. package/dist/_esm5.processed/core/api/debug/utils.d.ts +39 -0
  39. package/dist/_esm5.processed/core/api/debug/utils.js +57 -0
  40. package/dist/_esm5.processed/core/api/playback_observer.js +4 -2
  41. package/dist/_esm5.processed/core/api/public_api.d.ts +60 -3
  42. package/dist/_esm5.processed/core/api/public_api.js +280 -60
  43. package/dist/_esm5.processed/core/api/track_management/media_element_tracks_store.js +10 -1
  44. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +13 -1
  45. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +30 -15
  46. package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +3 -1
  47. package/dist/_esm5.processed/core/api/track_management/tracks_store.js +67 -152
  48. package/dist/_esm5.processed/core/api/utils.d.ts +10 -0
  49. package/dist/_esm5.processed/core/api/utils.js +23 -3
  50. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +27 -8
  51. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +28 -7
  52. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +1 -1
  53. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +1 -1
  54. package/dist/_esm5.processed/core/decrypt/find_key_system.js +29 -6
  55. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +42 -32
  56. package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +4 -0
  57. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +2 -0
  58. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +5 -1
  59. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +17 -8
  60. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +10 -6
  61. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +5 -4
  62. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +22 -5
  63. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +37 -21
  64. package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +21 -23
  65. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +17 -7
  66. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +2 -2
  67. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +74 -41
  68. package/dist/_esm5.processed/core/init/types.d.ts +9 -1
  69. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.d.ts +28 -1
  70. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +24 -11
  71. package/dist/_esm5.processed/core/init/utils/create_media_source.js +3 -12
  72. package/dist/_esm5.processed/core/init/utils/end_of_stream.js +6 -3
  73. package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +2 -1
  74. package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +9 -5
  75. package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +2 -1
  76. package/dist/_esm5.processed/core/init/utils/media_source_duration_updater.d.ts +58 -0
  77. package/dist/_esm5.processed/core/init/utils/{media_duration_updater.js → media_source_duration_updater.js} +87 -86
  78. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +36 -2
  79. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +83 -3
  80. package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +6 -4
  81. package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +1 -1
  82. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -7
  83. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +38 -50
  84. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +8 -0
  85. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +16 -2
  86. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +8 -0
  87. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +12 -0
  88. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +11 -4
  89. package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
  90. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +13 -9
  91. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +30 -16
  92. package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.d.ts +47 -0
  93. package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.js +70 -0
  94. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +41 -20
  95. package/dist/_esm5.processed/core/stream/period/period_stream.js +12 -11
  96. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +37 -28
  97. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.d.ts +4 -2
  98. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +3 -3
  99. package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +16 -6
  100. package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.d.ts +3 -2
  101. package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +8 -8
  102. package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.d.ts +2 -2
  103. package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +2 -3
  104. package/dist/_esm5.processed/core/stream/utils/create_reload_request.js +1 -1
  105. package/dist/_esm5.processed/default_config.d.ts +41 -0
  106. package/dist/_esm5.processed/default_config.js +46 -2
  107. package/dist/_esm5.processed/errors/index.d.ts +2 -2
  108. package/dist/_esm5.processed/errors/media_error.d.ts +23 -1
  109. package/dist/_esm5.processed/errors/media_error.js +18 -5
  110. package/dist/_esm5.processed/experimental/features/debug_element.d.ts +8 -0
  111. package/dist/_esm5.processed/experimental/features/debug_element.js +10 -0
  112. package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
  113. package/dist/_esm5.processed/experimental/features/index.js +1 -0
  114. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.d.ts +1 -1
  115. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.js +8 -7
  116. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +7 -4
  117. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +24 -12
  118. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/index.js +0 -2
  119. package/dist/_esm5.processed/features/features_object.js +1 -0
  120. package/dist/_esm5.processed/features/initialize_features.js +13 -10
  121. package/dist/_esm5.processed/features/types.d.ts +3 -0
  122. package/dist/_esm5.processed/manifest/adaptation.d.ts +21 -2
  123. package/dist/_esm5.processed/manifest/adaptation.js +80 -1
  124. package/dist/_esm5.processed/manifest/manifest.js +2 -0
  125. package/dist/_esm5.processed/manifest/period.js +2 -2
  126. package/dist/_esm5.processed/manifest/representation.d.ts +33 -2
  127. package/dist/_esm5.processed/manifest/representation.js +32 -4
  128. package/dist/_esm5.processed/manifest/utils.js +1 -3
  129. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +105 -137
  130. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +25 -5
  131. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.d.ts +1 -1
  132. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +1 -1
  133. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -0
  134. package/dist/_esm5.processed/public_types.d.ts +13 -3
  135. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +1 -1
  136. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +15 -11
  137. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +2 -2
  138. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  139. package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -4
  140. package/dist/_esm5.processed/transports/local/segment_loader.js +13 -26
  141. package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.d.ts +4 -6
  142. package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.js +4 -6
  143. package/dist/_esm5.processed/transports/smooth/segment_loader.js +4 -4
  144. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  145. package/dist/_esm5.processed/utils/cancellable_sleep.js +4 -10
  146. package/dist/_esm5.processed/utils/create_cancellable_promise.d.ts +26 -0
  147. package/dist/_esm5.processed/utils/create_cancellable_promise.js +52 -0
  148. package/dist/_esm5.processed/utils/is_null_or_undefined.d.ts +1 -1
  149. package/dist/_esm5.processed/utils/is_null_or_undefined.js +1 -1
  150. package/dist/_esm5.processed/utils/reference.js +6 -0
  151. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  152. package/dist/_esm5.processed/utils/task_canceller.d.ts +34 -15
  153. package/dist/_esm5.processed/utils/task_canceller.js +55 -22
  154. package/dist/mpd-parser.wasm +0 -0
  155. package/dist/rx-player.js +5424 -4712
  156. package/dist/rx-player.min.js +1 -1
  157. package/jest.config.js +1 -5
  158. package/package.json +44 -40
  159. package/scripts/build/constants.d.ts +1 -0
  160. package/scripts/build/generate_build.js +1 -1
  161. package/scripts/fast_demo_build.js +40 -40
  162. package/scripts/generate_full_demo.js +1 -1
  163. package/sonar-project.properties +1 -1
  164. package/src/compat/browser_detection.ts +105 -52
  165. package/src/compat/can_reuse_media_keys.ts +5 -2
  166. package/src/compat/eme/close_session.ts +2 -2
  167. package/src/compat/eme/load_session.ts +1 -1
  168. package/src/compat/event_listeners.ts +1 -1
  169. package/src/compat/has_issues_with_high_media_source_duration.ts +27 -0
  170. package/src/core/adaptive/__tests__/buffer_based_chooser.test.ts +147 -48
  171. package/src/core/adaptive/adaptive_representation_selector.ts +11 -6
  172. package/src/core/adaptive/buffer_based_chooser.ts +144 -26
  173. package/src/core/adaptive/guess_based_chooser.ts +9 -8
  174. package/src/core/adaptive/network_analyzer.ts +9 -4
  175. package/src/core/adaptive/utils/representation_score_calculator.ts +22 -2
  176. package/src/core/api/debug/buffer_graph.ts +247 -0
  177. package/src/core/api/debug/buffer_size_graph.ts +130 -0
  178. package/src/core/api/debug/constants.ts +2 -0
  179. package/src/core/api/debug/index.ts +3 -0
  180. package/src/core/api/debug/modules/general_info.ts +184 -0
  181. package/src/core/api/debug/modules/segment_buffer_content.ts +155 -0
  182. package/src/core/api/debug/modules/segment_buffer_size.ts +48 -0
  183. package/src/core/api/debug/render.ts +40 -0
  184. package/src/core/api/debug/utils.ts +103 -0
  185. package/src/core/api/playback_observer.ts +5 -2
  186. package/src/core/api/public_api.ts +334 -73
  187. package/src/core/api/track_management/media_element_tracks_store.ts +17 -8
  188. package/src/core/api/track_management/track_dispatcher.ts +37 -14
  189. package/src/core/api/track_management/tracks_store.ts +77 -167
  190. package/src/core/api/utils.ts +29 -3
  191. package/src/core/decrypt/__tests__/__global__/utils.ts +61 -40
  192. package/src/core/decrypt/attach_media_keys.ts +1 -1
  193. package/src/core/decrypt/content_decryptor.ts +1 -1
  194. package/src/core/decrypt/find_key_system.ts +25 -11
  195. package/src/core/decrypt/session_events_listener.ts +45 -39
  196. package/src/core/decrypt/utils/check_key_statuses.ts +6 -0
  197. package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +2 -1
  198. package/src/core/decrypt/utils/loaded_sessions_store.ts +8 -1
  199. package/src/core/fetchers/cdn_prioritizer.ts +18 -9
  200. package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -4
  201. package/src/core/fetchers/segment/segment_fetcher.ts +36 -14
  202. package/src/core/fetchers/segment/task_prioritizer.ts +25 -30
  203. package/src/core/fetchers/utils/schedule_request.ts +18 -7
  204. package/src/core/init/directfile_content_initializer.ts +2 -1
  205. package/src/core/init/media_source_content_initializer.ts +89 -50
  206. package/src/core/init/types.ts +9 -1
  207. package/src/core/init/utils/content_time_boundaries_observer.ts +48 -12
  208. package/src/core/init/utils/create_media_source.ts +4 -16
  209. package/src/core/init/utils/end_of_stream.ts +6 -3
  210. package/src/core/init/utils/get_loaded_reference.ts +2 -1
  211. package/src/core/init/utils/initial_seek_and_play.ts +9 -5
  212. package/src/core/init/utils/initialize_content_decryption.ts +2 -1
  213. package/src/core/init/utils/{media_duration_updater.ts → media_source_duration_updater.ts} +103 -110
  214. package/src/core/init/utils/rebuffering_controller.ts +115 -4
  215. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +6 -4
  216. package/src/core/init/utils/throw_on_media_error.ts +1 -1
  217. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +63 -66
  218. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +20 -2
  219. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +16 -0
  220. package/src/core/segment_buffers/implementations/types.ts +16 -4
  221. package/src/core/segment_buffers/index.ts +2 -0
  222. package/src/core/segment_buffers/segment_buffers_store.ts +16 -13
  223. package/src/core/stream/adaptation/adaptation_stream.ts +33 -19
  224. package/src/core/stream/adaptation/utils/create_representation_estimator.ts +114 -0
  225. package/src/core/stream/orchestrator/stream_orchestrator.ts +42 -20
  226. package/src/core/stream/period/period_stream.ts +13 -11
  227. package/src/core/stream/representation/representation_stream.ts +49 -37
  228. package/src/core/stream/representation/utils/append_segment_to_buffer.ts +9 -4
  229. package/src/core/stream/representation/utils/downloading_queue.ts +16 -4
  230. package/src/core/stream/representation/utils/push_init_segment.ts +11 -6
  231. package/src/core/stream/representation/utils/push_media_segment.ts +3 -3
  232. package/src/core/stream/utils/create_reload_request.ts +1 -1
  233. package/src/default_config.ts +59 -11
  234. package/src/errors/__tests__/media_error.test.ts +6 -6
  235. package/src/errors/index.ts +4 -1
  236. package/src/errors/media_error.ts +67 -1
  237. package/src/experimental/features/__tests__/debug_element.test.ts +26 -0
  238. package/src/experimental/features/debug_element.ts +13 -0
  239. package/src/experimental/features/index.ts +1 -0
  240. package/src/experimental/tools/VideoThumbnailLoader/load_and_push_segment.ts +10 -7
  241. package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -4
  242. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +25 -10
  243. package/src/experimental/tools/mediaCapabilitiesProber/index.ts +0 -4
  244. package/src/features/__tests__/initialize_features.test.ts +11 -0
  245. package/src/features/features_object.ts +1 -0
  246. package/src/features/initialize_features.ts +15 -10
  247. package/src/features/types.ts +9 -0
  248. package/src/manifest/__tests__/manifest.test.ts +7 -7
  249. package/src/manifest/__tests__/period.test.ts +90 -45
  250. package/src/manifest/adaptation.ts +96 -1
  251. package/src/manifest/manifest.ts +4 -0
  252. package/src/manifest/period.ts +4 -2
  253. package/src/manifest/representation.ts +77 -5
  254. package/src/manifest/utils.ts +1 -3
  255. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +116 -151
  256. package/src/parsers/manifest/dash/common/parse_representations.ts +21 -4
  257. package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +1 -1
  258. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -0
  259. package/src/parsers/texttracks/ttml/parse_ttml.ts +1 -1
  260. package/src/public_types.ts +16 -1
  261. package/src/tools/TextTrackRenderer/text_track_renderer.ts +1 -1
  262. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +31 -22
  263. package/src/transports/dash/low_latency_segment_loader.ts +2 -2
  264. package/src/transports/dash/manifest_parser.ts +1 -1
  265. package/src/transports/dash/segment_loader.ts +4 -4
  266. package/src/transports/local/segment_loader.ts +14 -30
  267. package/src/transports/smooth/isobmff/create_boxes.ts +4 -6
  268. package/src/transports/smooth/segment_loader.ts +4 -4
  269. package/src/transports/utils/call_custom_manifest_loader.ts +3 -3
  270. package/src/typings/globals.d.ts +21 -19
  271. package/src/utils/cancellable_sleep.ts +5 -14
  272. package/src/utils/create_cancellable_promise.ts +69 -0
  273. package/src/utils/is_null_or_undefined.ts +1 -1
  274. package/src/utils/reference.ts +6 -0
  275. package/src/utils/request/xhr.ts +1 -1
  276. package/src/utils/task_canceller.ts +63 -34
  277. package/tsconfig.json +1 -1
  278. package/tsconfig.modules.json +1 -1
  279. package/dist/_esm5.processed/core/init/utils/media_duration_updater.d.ts +0 -56
  280. package/locked_reps.js +0 -46
  281. package/scripts/doc-generator/construct_table_of_contents.js +0 -76
  282. package/scripts/doc-generator/convert_MD_to_HMTL.js +0 -26
  283. package/scripts/doc-generator/create_documentation.js +0 -331
  284. package/scripts/doc-generator/create_documentation_page.js +0 -209
  285. package/scripts/doc-generator/create_page.js +0 -210
  286. package/scripts/doc-generator/generate_header_html.js +0 -147
  287. package/scripts/doc-generator/generate_page_html.js +0 -115
  288. package/scripts/doc-generator/generate_page_list_html.js +0 -92
  289. package/scripts/doc-generator/generate_sidebar_html.js +0 -85
  290. package/scripts/doc-generator/get_search_data_for_content.js +0 -137
  291. package/scripts/doc-generator/index.js +0 -34
  292. package/scripts/doc-generator/parse_doc_configs.js +0 -327
  293. package/scripts/doc-generator/scripts/lunr.js +0 -10
  294. package/scripts/doc-generator/scripts/script.js +0 -451
  295. package/scripts/doc-generator/styles/code.css +0 -99
  296. package/scripts/doc-generator/styles/style.css +0 -835
  297. package/scripts/doc-generator/utils.js +0 -74
@@ -50,6 +50,8 @@ import config from "../../config";
50
50
  import { ErrorCodes, ErrorTypes, formatError, MediaError, } from "../../errors";
51
51
  import features from "../../features";
52
52
  import log from "../../log";
53
+ import arrayFind from "../../utils/array_find";
54
+ import arrayIncludes from "../../utils/array_includes";
53
55
  import assert from "../../utils/assert";
54
56
  import assertUnreachable from "../../utils/assert_unreachable";
55
57
  import EventEmitter from "../../utils/event_emitter";
@@ -64,7 +66,7 @@ import MediaSourceContentInitializer from "../init/media_source_content_initiali
64
66
  import { checkReloadOptions, parseConstructorOptions, parseLoadVideoOptions, } from "./option_utils";
65
67
  import PlaybackObserver from "./playback_observer";
66
68
  import TracksStore from "./track_management/tracks_store";
67
- import { constructPlayerStateReference, emitSeekEvents, isLoadedState, } from "./utils";
69
+ import { constructPlayerStateReference, emitPlayPauseEvents, emitSeekEvents, isLoadedState, } from "./utils";
68
70
  /* eslint-disable @typescript-eslint/naming-convention */
69
71
  var generateContentId = idGenerator();
70
72
  var getPictureOnPictureStateRef = events.getPictureOnPictureStateRef, getVideoVisibilityRef = events.getVideoVisibilityRef, getElementResolutionRef = events.getElementResolutionRef, getScreenResolutionRef = events.getScreenResolutionRef;
@@ -86,7 +88,7 @@ var Player = /** @class */ (function (_super) {
86
88
  // Workaround to support Firefox autoplay on FF 42.
87
89
  // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
88
90
  videoElement.preload = "auto";
89
- _this.version = /* PLAYER_VERSION */ "4.0.0-beta.0";
91
+ _this.version = /* PLAYER_VERSION */ "4.0.0-beta.2";
90
92
  _this.log = log;
91
93
  _this.state = "STOPPED";
92
94
  _this.videoElement = videoElement;
@@ -114,6 +116,7 @@ var Player = /** @class */ (function (_super) {
114
116
  _this._priv_contentEventsMemory = {};
115
117
  _this._priv_setPlayerState("STOPPED" /* PLAYER_STATES.STOPPED */);
116
118
  _this._priv_reloadingMetadata = {};
119
+ _this._priv_lastAutoPlay = false;
117
120
  return _this;
118
121
  }
119
122
  Object.defineProperty(Player, "ErrorTypes", {
@@ -211,6 +214,7 @@ var Player = /** @class */ (function (_super) {
211
214
  log.info("API: Calling loadvideo", options.url, options.transport);
212
215
  this._priv_reloadingMetadata = { options: options };
213
216
  this._priv_initializeContentPlayback(options);
217
+ this._priv_lastAutoPlay = options.autoPlay;
214
218
  };
215
219
  /**
216
220
  * Reload the last loaded content.
@@ -254,6 +258,18 @@ var Player = /** @class */ (function (_super) {
254
258
  }
255
259
  this._priv_initializeContentPlayback(newOptions);
256
260
  };
261
+ Player.prototype.createDebugElement = function (element) {
262
+ if (features.createDebugElement === null) {
263
+ throw new Error("Feature `DEBUG_ELEMENT` not added to the RxPlayer");
264
+ }
265
+ var canceller = new TaskCanceller();
266
+ features.createDebugElement(element, this, canceller.signal);
267
+ return {
268
+ dispose: function () {
269
+ canceller.cancel();
270
+ },
271
+ };
272
+ };
257
273
  /**
258
274
  * From given options, initialize content playback.
259
275
  * @param {Object} options
@@ -351,7 +367,7 @@ var Player = /** @class */ (function (_super) {
351
367
  }
352
368
  mediaElementTracksStore =
353
369
  this._priv_initializeMediaElementTracksStore(currentContentCanceller.signal);
354
- if (currentContentCanceller.isUsed) {
370
+ if (currentContentCanceller.isUsed()) {
355
371
  return;
356
372
  }
357
373
  initializer = new features.directfile.initDirectFile({ autoPlay: autoPlay, keySystems: keySystems, speed: this._priv_speed, startAt: startAt, url: url });
@@ -374,23 +390,7 @@ var Player = /** @class */ (function (_super) {
374
390
  };
375
391
  // Bind events
376
392
  initializer.addEventListener("error", function (error) {
377
- var formattedError = formatError(error, {
378
- defaultCode: "NONE",
379
- defaultReason: "An unknown error stopped content playback.",
380
- });
381
- formattedError.fatal = true;
382
- contentInfos.currentContentCanceller.cancel();
383
- _this._priv_cleanUpCurrentContentState();
384
- _this._priv_currentError = formattedError;
385
- log.error("API: The player stopped because of an error", error instanceof Error ? error : "");
386
- _this._priv_setPlayerState("STOPPED" /* PLAYER_STATES.STOPPED */);
387
- // TODO This condition is here because the eventual callback called when the
388
- // player state is updated can launch a new content, thus the error will not
389
- // be here anymore, in which case triggering the "error" event is unwanted.
390
- // This is very ugly though, and we should probable have a better solution
391
- if (_this._priv_currentError === formattedError) {
392
- _this.trigger("error", formattedError);
393
- }
393
+ _this._priv_onFatalError(error, contentInfos);
394
394
  });
395
395
  initializer.addEventListener("warning", function (error) {
396
396
  var formattedError = formatError(error, {
@@ -400,11 +400,12 @@ var Player = /** @class */ (function (_super) {
400
400
  log.warn("API: Sending warning:", formattedError);
401
401
  _this.trigger("warning", formattedError);
402
402
  });
403
- initializer.addEventListener("reloadingMediaSource", function () {
403
+ initializer.addEventListener("reloadingMediaSource", function (payload) {
404
404
  contentInfos.segmentBuffersStore = null;
405
405
  if (contentInfos.tracksStore !== null) {
406
406
  contentInfos.tracksStore.resetPeriodObjects();
407
407
  }
408
+ _this._priv_lastAutoPlay = payload.autoPlay;
408
409
  });
409
410
  initializer.addEventListener("inbandEvents", function (inbandEvents) {
410
411
  return _this.trigger("inbandEvents", inbandEvents);
@@ -488,6 +489,48 @@ var Player = /** @class */ (function (_super) {
488
489
  break;
489
490
  }
490
491
  };
492
+ /**
493
+ * `TaskCanceller` allowing to stop emitting `"play"` and `"pause"`
494
+ * events.
495
+ * `null` when such events are not emitted currently.
496
+ */
497
+ var playPauseEventsCanceller = null;
498
+ /**
499
+ * Callback emitting `"play"` and `"pause`" events once the content is
500
+ * loaded, starting from the state indicated in argument.
501
+ * @param {boolean} willAutoPlay - If `false`, we're currently paused.
502
+ */
503
+ var triggerPlayPauseEventsWhenReady = function (willAutoPlay) {
504
+ if (playPauseEventsCanceller !== null) {
505
+ playPauseEventsCanceller.cancel(); // cancel previous logic
506
+ playPauseEventsCanceller = null;
507
+ }
508
+ playerStateRef.onUpdate(function (val, stopListeningToStateUpdates) {
509
+ if (!isLoadedState(val)) {
510
+ return; // content not loaded yet: no event
511
+ }
512
+ stopListeningToStateUpdates();
513
+ if (playPauseEventsCanceller !== null) {
514
+ playPauseEventsCanceller.cancel();
515
+ }
516
+ playPauseEventsCanceller = new TaskCanceller();
517
+ playPauseEventsCanceller.linkToSignal(currentContentCanceller.signal);
518
+ if (willAutoPlay !== !videoElement.paused) {
519
+ // paused status is not at the expected value on load: emit event
520
+ if (videoElement.paused) {
521
+ _this.trigger("pause", null);
522
+ }
523
+ else {
524
+ _this.trigger("play", null);
525
+ }
526
+ }
527
+ emitPlayPauseEvents(videoElement, function () { return _this.trigger("play", null); }, function () { return _this.trigger("pause", null); }, currentContentCanceller.signal);
528
+ }, { emitCurrentValue: false, clearSignal: currentContentCanceller.signal });
529
+ };
530
+ triggerPlayPauseEventsWhenReady(autoPlay);
531
+ initializer.addEventListener("reloadingMediaSource", function (payload) {
532
+ triggerPlayPauseEventsWhenReady(payload.autoPlay);
533
+ });
491
534
  /**
492
535
  * `TaskCanceller` allowing to stop emitting `"seeking"` and `"seeked"`
493
536
  * events.
@@ -498,7 +541,7 @@ var Player = /** @class */ (function (_super) {
498
541
  playerStateRef.onUpdate(function (newState) {
499
542
  updateReloadingMetadata(newState);
500
543
  _this._priv_setPlayerState(newState);
501
- if (currentContentCanceller.isUsed) {
544
+ if (currentContentCanceller.isUsed()) {
502
545
  return;
503
546
  }
504
547
  if (seekEventsCanceller !== null) {
@@ -508,9 +551,8 @@ var Player = /** @class */ (function (_super) {
508
551
  }
509
552
  }
510
553
  else if (isLoadedState(_this.state)) {
511
- seekEventsCanceller = new TaskCanceller({
512
- cancelOn: currentContentCanceller.signal,
513
- });
554
+ seekEventsCanceller = new TaskCanceller();
555
+ seekEventsCanceller.linkToSignal(currentContentCanceller.signal);
514
556
  emitSeekEvents(videoElement, playbackObserver, function () { return _this.trigger("seeking", null); }, function () { return _this.trigger("seeked", null); }, seekEventsCanceller.signal);
515
557
  }
516
558
  }, { emitCurrentValue: true, clearSignal: currentContentCanceller.signal });
@@ -558,6 +600,40 @@ var Player = /** @class */ (function (_super) {
558
600
  Player.prototype.getPlayerState = function () {
559
601
  return this.state;
560
602
  };
603
+ /**
604
+ * Returns true if a content is loaded.
605
+ * @returns {Boolean} - `true` if a content is loaded, `false` otherwise.
606
+ */
607
+ Player.prototype.isContentLoaded = function () {
608
+ return !arrayIncludes(["LOADING", "RELOADING", "STOPPED"], this.state);
609
+ };
610
+ /**
611
+ * Returns true if the player is buffering.
612
+ * @returns {Boolean} - `true` if the player is buffering, `false` otherwise.
613
+ */
614
+ Player.prototype.isBuffering = function () {
615
+ return arrayIncludes(["BUFFERING", "SEEKING", "LOADING", "RELOADING"], this.state);
616
+ };
617
+ /**
618
+ * Returns the play/pause status of the player :
619
+ * - when `LOADING` or `RELOADING`, returns the scheduled play/pause condition
620
+ * for when loading is over,
621
+ * - in other states, returns the `<video>` element .paused value,
622
+ * - if the player is disposed, returns `true`.
623
+ * @returns {Boolean} - `true` if the player is paused or will be after loading,
624
+ * `false` otherwise.
625
+ */
626
+ Player.prototype.isPaused = function () {
627
+ if (this.videoElement) {
628
+ if (arrayIncludes(["LOADING", "RELOADING"], this.state)) {
629
+ return !this._priv_lastAutoPlay;
630
+ }
631
+ else {
632
+ return this.videoElement.paused;
633
+ }
634
+ }
635
+ return true;
636
+ };
561
637
  /**
562
638
  * Returns true if both:
563
639
  * - a content is loaded
@@ -698,6 +774,14 @@ var Player = /** @class */ (function (_super) {
698
774
  }
699
775
  return this.videoElement.currentTime;
700
776
  };
777
+ /**
778
+ * Returns the last stored content position, in seconds.
779
+ *
780
+ * @returns {number|undefined}
781
+ */
782
+ Player.prototype.getLastStoredContentPosition = function () {
783
+ return this._priv_reloadingMetadata.reloadPosition;
784
+ };
701
785
  /**
702
786
  * Returns the current playback rate at which the video plays.
703
787
  * @returns {Number}
@@ -791,7 +875,7 @@ var Player = /** @class */ (function (_super) {
791
875
  * @returns {Object|null|undefined}
792
876
  */
793
877
  Player.prototype.getVideoRepresentation = function () {
794
- var representations = this._priv_getCurrentRepresentations();
878
+ var representations = this.__priv_getCurrentRepresentations();
795
879
  if (representations === null) {
796
880
  return undefined;
797
881
  }
@@ -807,7 +891,7 @@ var Player = /** @class */ (function (_super) {
807
891
  * @returns {Object|null|undefined}
808
892
  */
809
893
  Player.prototype.getAudioRepresentation = function () {
810
- var representations = this._priv_getCurrentRepresentations();
894
+ var representations = this.__priv_getCurrentRepresentations();
811
895
  if (representations === null) {
812
896
  return undefined;
813
897
  }
@@ -898,6 +982,7 @@ var Player = /** @class */ (function (_super) {
898
982
  if (positionWanted === undefined) {
899
983
  throw new Error("invalid time given");
900
984
  }
985
+ log.info("API: API Seek to", positionWanted);
901
986
  this.videoElement.currentTime = positionWanted;
902
987
  return positionWanted;
903
988
  };
@@ -1462,12 +1547,39 @@ var Player = /** @class */ (function (_super) {
1462
1547
  * null if the player is STOPPED.
1463
1548
  * @returns {Manifest|null} - The current Manifest (`null` when not known).
1464
1549
  */
1550
+ // TODO remove the need for that public method
1465
1551
  Player.prototype.__priv_getManifest = function () {
1466
1552
  if (this._priv_contentInfos === null) {
1467
1553
  return null;
1468
1554
  }
1469
1555
  return this._priv_contentInfos.manifest;
1470
1556
  };
1557
+ // TODO remove the need for that public method
1558
+ Player.prototype.__priv_getCurrentAdaptation = function () {
1559
+ if (this._priv_contentInfos === null) {
1560
+ return null;
1561
+ }
1562
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, activeAdaptations = _a.activeAdaptations;
1563
+ if (currentPeriod === null ||
1564
+ activeAdaptations === null ||
1565
+ isNullOrUndefined(activeAdaptations[currentPeriod.id])) {
1566
+ return null;
1567
+ }
1568
+ return activeAdaptations[currentPeriod.id];
1569
+ };
1570
+ // TODO remove the need for that public method
1571
+ Player.prototype.__priv_getCurrentRepresentations = function () {
1572
+ if (this._priv_contentInfos === null) {
1573
+ return null;
1574
+ }
1575
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, activeRepresentations = _a.activeRepresentations;
1576
+ if (currentPeriod === null ||
1577
+ activeRepresentations === null ||
1578
+ isNullOrUndefined(activeRepresentations[currentPeriod.id])) {
1579
+ return null;
1580
+ }
1581
+ return activeRepresentations[currentPeriod.id];
1582
+ };
1471
1583
  // ---- Private methods ----
1472
1584
  /**
1473
1585
  * Reset all state properties relative to a playing content.
@@ -1517,20 +1629,32 @@ var Player = /** @class */ (function (_super) {
1517
1629
  return; // Event for another content
1518
1630
  }
1519
1631
  contentInfos.manifest = manifest;
1520
- var cancelSignal = contentInfos.currentContentCanceller.signal;
1521
1632
  this._priv_reloadingMetadata.manifest = manifest;
1522
- contentInfos.tracksStore = new TracksStore({
1633
+ var tracksStore = new TracksStore({
1523
1634
  preferTrickModeTracks: this._priv_preferTrickModeTracks,
1524
1635
  defaultAudioTrackSwitchingMode: contentInfos.defaultAudioTrackSwitchingMode,
1525
1636
  });
1526
- contentInfos.tracksStore.addEventListener("newAvailablePeriods", function (p) {
1637
+ contentInfos.tracksStore = tracksStore;
1638
+ tracksStore.addEventListener("newAvailablePeriods", function (p) {
1527
1639
  _this.trigger("newAvailablePeriods", p);
1528
1640
  });
1529
- contentInfos.tracksStore.addEventListener("brokenRepresentationsLock", function (e) {
1641
+ tracksStore.addEventListener("brokenRepresentationsLock", function (e) {
1530
1642
  _this.trigger("brokenRepresentationsLock", e);
1531
1643
  });
1532
- contentInfos.tracksStore.addEventListener("trackUpdate", function (e) {
1644
+ tracksStore.addEventListener("trackUpdate", function (e) {
1645
+ var _a, _b;
1533
1646
  _this.trigger("trackUpdate", e);
1647
+ var currentPeriod = (_b = (_a = _this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.currentPeriod) !== null && _b !== void 0 ? _b : undefined;
1648
+ if (e.reason === "no-playable-representation" &&
1649
+ e.period.id === (currentPeriod === null || currentPeriod === void 0 ? void 0 : currentPeriod.id)) {
1650
+ _this._priv_onAvailableTracksMayHaveChanged(e.trackType);
1651
+ }
1652
+ });
1653
+ contentInfos.tracksStore.addEventListener("warning", function (err) {
1654
+ _this.trigger("warning", err);
1655
+ });
1656
+ contentInfos.tracksStore.addEventListener("error", function (err) {
1657
+ _this._priv_onFatalError(err, contentInfos);
1534
1658
  });
1535
1659
  contentInfos.tracksStore.updatePeriodList(manifest);
1536
1660
  manifest.addEventListener("manifestUpdate", function (updates) {
@@ -1540,8 +1664,8 @@ var Player = /** @class */ (function (_super) {
1540
1664
  contentInfos.tracksStore.updatePeriodList(manifest);
1541
1665
  }
1542
1666
  var currentPeriod = (_b = (_a = _this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.currentPeriod) !== null && _b !== void 0 ? _b : undefined;
1543
- var tracksStore = (_c = _this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.tracksStore;
1544
- if (currentPeriod === undefined || isNullOrUndefined(tracksStore)) {
1667
+ var currTracksStore = (_c = _this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.tracksStore;
1668
+ if (currentPeriod === undefined || isNullOrUndefined(currTracksStore)) {
1545
1669
  return;
1546
1670
  }
1547
1671
  for (var _i = 0, _d = updates.updatedPeriods; _i < _d.length; _i++) {
@@ -1550,21 +1674,64 @@ var Player = /** @class */ (function (_super) {
1550
1674
  if (update.result.addedAdaptations.length > 0 ||
1551
1675
  update.result.removedAdaptations.length > 0) {
1552
1676
  // We might have new (or less) tracks, send events just to be sure
1553
- var periodRef = tracksStore.getPeriodObjectFromPeriod(currentPeriod);
1677
+ var periodRef = currTracksStore.getPeriodObjectFromPeriod(currentPeriod);
1554
1678
  if (periodRef === undefined) {
1555
1679
  return;
1556
1680
  }
1557
- var audioTracks = tracksStore.getAvailableAudioTracks(periodRef);
1558
- _this._priv_triggerEventIfNotStopped("availableAudioTracksChange", audioTracks !== null && audioTracks !== void 0 ? audioTracks : [], cancelSignal);
1559
- var textTracks = tracksStore.getAvailableTextTracks(periodRef);
1560
- _this._priv_triggerEventIfNotStopped("availableTextTracksChange", textTracks !== null && textTracks !== void 0 ? textTracks : [], cancelSignal);
1561
- var videoTracks = tracksStore.getAvailableVideoTracks(periodRef);
1562
- _this._priv_triggerEventIfNotStopped("availableVideoTracksChange", videoTracks !== null && videoTracks !== void 0 ? videoTracks : [], cancelSignal);
1681
+ _this._priv_onAvailableTracksMayHaveChanged("audio");
1682
+ _this._priv_onAvailableTracksMayHaveChanged("text");
1683
+ _this._priv_onAvailableTracksMayHaveChanged("video");
1563
1684
  }
1564
1685
  }
1565
1686
  return;
1566
1687
  }
1567
1688
  }, contentInfos.currentContentCanceller.signal);
1689
+ manifest.addEventListener("decipherabilityUpdate", function (elts) {
1690
+ /**
1691
+ * Array of tuples only including once the Period/Track combination, and
1692
+ * only when it concerns the currently-selected track.
1693
+ */
1694
+ var periodsAndTrackTypes = elts.reduce(function (acc, elt) {
1695
+ var _a, _b, _c;
1696
+ var isFound = arrayFind(acc, function (x) { return x[0].id === elt.period.id &&
1697
+ x[1] === elt.adaptation.type; }) === undefined;
1698
+ if (!isFound) {
1699
+ // Only consider the currently-selected tracks.
1700
+ // NOTE: Maybe there's room for optimizations? Unclear.
1701
+ var tStore = contentInfos.tracksStore;
1702
+ if (tStore === null) {
1703
+ return acc;
1704
+ }
1705
+ var isCurrent = false;
1706
+ var periodRef = tStore.getPeriodObjectFromPeriod(elt.period);
1707
+ if (periodRef === undefined) {
1708
+ return acc;
1709
+ }
1710
+ switch (elt.adaptation.type) {
1711
+ case "audio":
1712
+ isCurrent = ((_a = tStore
1713
+ .getChosenAudioTrack(periodRef)) === null || _a === void 0 ? void 0 : _a.id) === elt.adaptation.id;
1714
+ break;
1715
+ case "video":
1716
+ isCurrent = ((_b = tStore
1717
+ .getChosenVideoTrack(periodRef)) === null || _b === void 0 ? void 0 : _b.id) === elt.adaptation.id;
1718
+ break;
1719
+ case "text":
1720
+ isCurrent = ((_c = tStore
1721
+ .getChosenTextTrack(periodRef)) === null || _c === void 0 ? void 0 : _c.id) === elt.adaptation.id;
1722
+ break;
1723
+ }
1724
+ if (isCurrent) {
1725
+ acc.push([elt.period, elt.adaptation.type]);
1726
+ }
1727
+ }
1728
+ return acc;
1729
+ }, []);
1730
+ for (var _i = 0, periodsAndTrackTypes_1 = periodsAndTrackTypes; _i < periodsAndTrackTypes_1.length; _i++) {
1731
+ var _a = periodsAndTrackTypes_1[_i], period = _a[0], trackType = _a[1];
1732
+ _this._priv_triggerEventIfNotStopped("representationListUpdate", { period: period, trackType: trackType, reason: "decipherability-update" }, contentInfos.currentContentCanceller.signal);
1733
+ }
1734
+ }, contentInfos.currentContentCanceller.signal);
1568
1735
  };
1569
1736
  /**
1570
1737
  * Triggered each times the current Period Changed.
@@ -1608,12 +1775,9 @@ var Player = /** @class */ (function (_super) {
1608
1775
  this._priv_triggerEventIfNotStopped("textTrackChange", null, cancelSignal);
1609
1776
  this._priv_triggerEventIfNotStopped("videoTrackChange", null, cancelSignal);
1610
1777
  }
1611
- var audioRepresentation = (_e = (_d = this._priv_getCurrentRepresentations()) === null || _d === void 0 ? void 0 : _d.audio) !== null && _e !== void 0 ? _e : null;
1778
+ var audioRepresentation = (_e = (_d = this.__priv_getCurrentRepresentations()) === null || _d === void 0 ? void 0 : _d.audio) !== null && _e !== void 0 ? _e : null;
1612
1779
  this._priv_triggerEventIfNotStopped("audioRepresentationChange", audioRepresentation, cancelSignal);
1613
- if (contentInfos.currentContentCanceller.isUsed) {
1614
- return;
1615
- }
1616
- var videoRepresentation = (_g = (_f = this._priv_getCurrentRepresentations()) === null || _f === void 0 ? void 0 : _f.video) !== null && _g !== void 0 ? _g : null;
1780
+ var videoRepresentation = (_g = (_f = this.__priv_getCurrentRepresentations()) === null || _f === void 0 ? void 0 : _f.video) !== null && _g !== void 0 ? _g : null;
1617
1781
  this._priv_triggerEventIfNotStopped("videoRepresentationChange", videoRepresentation, cancelSignal);
1618
1782
  };
1619
1783
  /**
@@ -1854,25 +2018,13 @@ var Player = /** @class */ (function (_super) {
1854
2018
  }
1855
2019
  this.trigger("positionUpdate", positionData);
1856
2020
  };
1857
- Player.prototype._priv_getCurrentRepresentations = function () {
1858
- if (this._priv_contentInfos === null) {
1859
- return null;
1860
- }
1861
- var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, activeRepresentations = _a.activeRepresentations;
1862
- if (currentPeriod === null ||
1863
- activeRepresentations === null ||
1864
- isNullOrUndefined(activeRepresentations[currentPeriod.id])) {
1865
- return null;
1866
- }
1867
- return activeRepresentations[currentPeriod.id];
1868
- };
1869
2021
  /**
1870
2022
  * @param {string} evt
1871
2023
  * @param {*} arg
1872
2024
  * @param {Object} currentContentCancelSignal
1873
2025
  */
1874
2026
  Player.prototype._priv_triggerEventIfNotStopped = function (evt, arg, currentContentCancelSignal) {
1875
- if (!currentContentCancelSignal.isCancelled) {
2027
+ if (!currentContentCancelSignal.isCancelled()) {
1876
2028
  this.trigger(evt, arg);
1877
2029
  }
1878
2030
  };
@@ -1939,7 +2091,75 @@ var Player = /** @class */ (function (_super) {
1939
2091
  }
1940
2092
  return cb(tracksStore, periodRef);
1941
2093
  };
2094
+ /**
2095
+ * Method to call when some event lead to a high for possibility that the
2096
+ * available tracks for the given type have changed.
2097
+ * Send the corresponding `available*Tracks` change event with the last
2098
+ * available tracks.
2099
+ *
2100
+ * @param {string} trackType
2101
+ * @param {Object|undefined} [oPeriodRef] - optional period object used by the
2102
+ * `tracksStore` API, allows to optimize the method by bypassing this step.
2103
+ */
2104
+ Player.prototype._priv_onAvailableTracksMayHaveChanged = function (trackType, oPeriodRef) {
2105
+ var contentInfos = this._priv_contentInfos;
2106
+ if (contentInfos === null) {
2107
+ return;
2108
+ }
2109
+ var currentPeriod = contentInfos.currentPeriod, tracksStore = contentInfos.tracksStore, currentContentCanceller = contentInfos.currentContentCanceller;
2110
+ var cancelSignal = currentContentCanceller.signal;
2111
+ if (isNullOrUndefined(currentPeriod) || tracksStore === null) {
2112
+ return;
2113
+ }
2114
+ var periodRef = oPeriodRef !== null && oPeriodRef !== void 0 ? oPeriodRef : tracksStore.getPeriodObjectFromPeriod(currentPeriod);
2115
+ if (periodRef === undefined) {
2116
+ return;
2117
+ }
2118
+ switch (trackType) {
2119
+ case "video":
2120
+ var videoTracks = tracksStore.getAvailableVideoTracks(periodRef);
2121
+ this._priv_triggerEventIfNotStopped("availableVideoTracksChange", videoTracks !== null && videoTracks !== void 0 ? videoTracks : [], cancelSignal);
2122
+ break;
2123
+ case "audio":
2124
+ var audioTracks = tracksStore.getAvailableAudioTracks(periodRef);
2125
+ this._priv_triggerEventIfNotStopped("availableAudioTracksChange", audioTracks !== null && audioTracks !== void 0 ? audioTracks : [], cancelSignal);
2126
+ break;
2127
+ case "text":
2128
+ var textTracks = tracksStore.getAvailableTextTracks(periodRef);
2129
+ this._priv_triggerEventIfNotStopped("availableTextTracksChange", textTracks !== null && textTracks !== void 0 ? textTracks : [], cancelSignal);
2130
+ break;
2131
+ default:
2132
+ assertUnreachable(trackType);
2133
+ }
2134
+ };
2135
+ /**
2136
+ * Method to call when a fatal error lead to the stopping of the current
2137
+ * content.
2138
+ *
2139
+ * @param {*} err - The error encountered.
2140
+ * @param {Object} contentInfos - The `IPublicApiContentInfos` object linked
2141
+ * to the content for which the error was received.
2142
+ */
2143
+ Player.prototype._priv_onFatalError = function (err, contentInfos) {
2144
+ var formattedError = formatError(err, {
2145
+ defaultCode: "NONE",
2146
+ defaultReason: "An unknown error stopped content playback.",
2147
+ });
2148
+ formattedError.fatal = true;
2149
+ contentInfos.currentContentCanceller.cancel();
2150
+ this._priv_cleanUpCurrentContentState();
2151
+ this._priv_currentError = formattedError;
2152
+ log.error("API: The player stopped because of an error", formattedError);
2153
+ this._priv_setPlayerState("STOPPED" /* PLAYER_STATES.STOPPED */);
2154
+ // TODO This condition is here because the eventual callback called when the
2155
+ // player state is updated can launch a new content, thus the error will not
2156
+ // be here anymore, in which case triggering the "error" event is unwanted.
2157
+ // This is very ugly though, and we should probable have a better solution
2158
+ if (this._priv_currentError === formattedError) {
2159
+ this.trigger("error", formattedError);
2160
+ }
2161
+ };
1942
2162
  return Player;
1943
2163
  }(EventEmitter));
1944
- Player.version = /* PLAYER_VERSION */ "4.0.0-beta.0";
2164
+ Player.version = /* PLAYER_VERSION */ "4.0.0-beta.2";
1945
2165
  export default Player;
@@ -102,7 +102,14 @@ function createTextTracks(textTracks) {
102
102
  "_" +
103
103
  occurences.toString();
104
104
  languagesOccurences[language] = occurences + 1;
105
- var track = { language: textTrack.language, id: id, normalized: normalizeLanguage(textTrack.language),
105
+ // Safari seems to be indicating that the subtitles track is a forced
106
+ // subtitles track by setting the `kind` attribute to `"forced"`.
107
+ // As of now (2023-04-04), this is not standard.
108
+ // @see https://github.com/whatwg/html/issues/4472
109
+ var forced = textTrack.kind === "forced" ?
110
+ true :
111
+ undefined;
112
+ var track = { language: textTrack.language, forced: forced, label: textTrack.label, id: id, normalized: normalizeLanguage(textTrack.language),
106
113
  closedCaption: textTrack.kind === "captions" };
107
114
  newTextTracks.push({ track: track, nativeTrack: textTrack });
108
115
  }
@@ -293,6 +300,8 @@ var MediaElementTracksStore = /** @class */ (function (_super) {
293
300
  return this._textTracks.map(function (_a) {
294
301
  var track = _a.track, nativeTrack = _a.nativeTrack;
295
302
  return { id: track.id,
303
+ label: track.label,
304
+ forced: track.forced,
296
305
  language: track.language,
297
306
  normalized: track.normalized,
298
307
  closedCaption: track.closedCaption,
@@ -30,6 +30,14 @@ export default class TrackDispatcher extends EventEmitter<ITrackDispatcherEvent>
30
30
  private _lastEmitted;
31
31
  /** Interface allowing to clean-up resources when they are not needed anymore. */
32
32
  private _canceller;
33
+ /**
34
+ * Boolean set to `true` when a track-updating method is called and to `false`
35
+ * just before it performs the actual track change to allow checking for
36
+ * re-entrancy: if the token is already reset to `false` before the
37
+ * track change is officialized, then another track update has already been
38
+ * performed in the meantime.
39
+ */
40
+ private _updateToken;
33
41
  /**
34
42
  * Create a new `TrackDispatcher` by giving its Reference and an initial track
35
43
  * setting.
@@ -37,9 +45,12 @@ export default class TrackDispatcher extends EventEmitter<ITrackDispatcherEvent>
37
45
  * synchronously.
38
46
  * @param {Object} manifest
39
47
  * @param {Object} adaptationRef
48
+ */
49
+ constructor(manifest: Manifest, adaptationRef: ISharedReference<IAdaptationChoice | null | undefined>);
50
+ /**
40
51
  * @param {Object|null} initialTrackInfo
41
52
  */
42
- constructor(manifest: Manifest, adaptationRef: ISharedReference<IAdaptationChoice | null | undefined>, initialTrackInfo: ITrackSetting | null);
53
+ start(initialTrackInfo: ITrackSetting | null): void;
43
54
  /**
44
55
  * Update the wanted track on the Reference linked to this `TrackDispatcher`.
45
56
  * @param {Object|null} newTrackInfo
@@ -65,6 +76,7 @@ export interface ITrackDispatcherEvent {
65
76
  * none of them are currently "playable".
66
77
  */
67
78
  noPlayableLockedRepresentation: null;
79
+ noPlayableRepresentation: null;
68
80
  }
69
81
  /** Define a new Track preference given to the `TrackDispatcher`. */
70
82
  export interface ITrackSetting {