rx-player 3.29.0 → 3.30.0-dev.2023011800

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 (439) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/VERSION +1 -1
  3. package/dist/_esm5.processed/compat/can_reuse_media_keys.d.ts +3 -2
  4. package/dist/_esm5.processed/compat/can_reuse_media_keys.js +5 -4
  5. package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +16 -7
  6. package/dist/_esm5.processed/compat/event_listeners.d.ts +33 -56
  7. package/dist/_esm5.processed/compat/event_listeners.js +66 -116
  8. package/dist/_esm5.processed/compat/index.d.ts +1 -4
  9. package/dist/_esm5.processed/compat/index.js +1 -4
  10. package/dist/_esm5.processed/compat/on_height_width_change.d.ts +1 -1
  11. package/dist/_esm5.processed/compat/on_height_width_change.js +2 -2
  12. package/dist/_esm5.processed/config.d.ts +1 -0
  13. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.d.ts +3 -1
  14. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +27 -6
  15. package/dist/_esm5.processed/core/api/playback_observer.d.ts +8 -9
  16. package/dist/_esm5.processed/core/api/playback_observer.js +6 -7
  17. package/dist/_esm5.processed/core/api/public_api.d.ts +39 -41
  18. package/dist/_esm5.processed/core/api/public_api.js +569 -578
  19. package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.d.ts +9 -14
  20. package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.js +73 -43
  21. package/dist/_esm5.processed/core/api/utils.d.ts +15 -10
  22. package/dist/_esm5.processed/core/api/utils.js +84 -19
  23. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +22 -5
  24. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +97 -25
  25. package/dist/_esm5.processed/core/decrypt/attach_media_keys.d.ts +3 -2
  26. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +3 -2
  27. package/dist/_esm5.processed/core/decrypt/clear_on_stop.d.ts +1 -1
  28. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +1 -1
  29. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +12 -20
  30. package/dist/_esm5.processed/core/decrypt/create_session.js +1 -1
  31. package/dist/_esm5.processed/core/decrypt/find_key_system.js +35 -13
  32. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +1 -1
  33. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +32 -31
  34. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +291 -160
  35. package/dist/_esm5.processed/core/decrypt/set_server_certificate.d.ts +1 -1
  36. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +1 -1
  37. package/dist/_esm5.processed/core/decrypt/types.d.ts +0 -6
  38. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.d.ts +1 -1
  39. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +1 -1
  40. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +1 -1
  41. package/dist/_esm5.processed/core/fetchers/index.d.ts +2 -2
  42. package/dist/_esm5.processed/core/fetchers/manifest/index.d.ts +2 -2
  43. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +153 -89
  44. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +419 -144
  45. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +0 -24
  46. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +0 -24
  47. package/dist/_esm5.processed/core/init/{initialize_directfile.d.ts → directfile_content_initializer.d.ts} +13 -16
  48. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +196 -0
  49. package/dist/_esm5.processed/core/init/index.d.ts +2 -2
  50. package/dist/_esm5.processed/core/init/index.js +2 -2
  51. package/dist/_esm5.processed/core/init/media_source_content_initializer.d.ts +181 -0
  52. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +576 -0
  53. package/dist/_esm5.processed/core/init/types.d.ts +203 -64
  54. package/dist/_esm5.processed/core/init/types.js +36 -1
  55. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.d.ts +164 -0
  56. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +484 -0
  57. package/dist/_esm5.processed/core/init/{create_media_source.d.ts → utils/create_media_source.d.ts} +8 -4
  58. package/dist/_esm5.processed/core/init/utils/create_media_source.js +118 -0
  59. package/dist/_esm5.processed/core/init/{create_stream_playback_observer.d.ts → utils/create_stream_playback_observer.d.ts} +4 -4
  60. package/dist/_esm5.processed/core/init/{create_stream_playback_observer.js → utils/create_stream_playback_observer.js} +2 -5
  61. package/dist/_esm5.processed/core/init/{end_of_stream.d.ts → utils/end_of_stream.d.ts} +5 -5
  62. package/dist/_esm5.processed/core/init/utils/end_of_stream.js +85 -0
  63. package/dist/_esm5.processed/core/init/{get_initial_time.d.ts → utils/get_initial_time.d.ts} +1 -1
  64. package/dist/_esm5.processed/core/init/{get_initial_time.js → utils/get_initial_time.js} +3 -3
  65. package/dist/_esm5.processed/core/init/{emit_loaded_event.d.ts → utils/get_loaded_reference.d.ts} +9 -9
  66. package/dist/_esm5.processed/core/init/{emit_loaded_event.js → utils/get_loaded_reference.js} +23 -17
  67. package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.d.ts +63 -0
  68. package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +124 -0
  69. package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.d.ts +80 -0
  70. package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +111 -0
  71. package/dist/_esm5.processed/core/init/{media_duration_updater.d.ts → utils/media_duration_updater.d.ts} +3 -3
  72. package/dist/_esm5.processed/core/init/{media_duration_updater.js → utils/media_duration_updater.js} +115 -41
  73. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +113 -0
  74. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +483 -0
  75. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/are_same_stream_events.d.ts +0 -0
  76. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/are_same_stream_events.js +0 -0
  77. package/dist/_esm5.processed/core/{stream/types.js → init/utils/stream_events_emitter/index.d.ts} +3 -1
  78. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/index.js +0 -0
  79. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/refresh_scheduled_events_list.d.ts +1 -1
  80. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/refresh_scheduled_events_list.js +0 -0
  81. package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.d.ts +30 -0
  82. package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +155 -0
  83. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/types.d.ts +1 -13
  84. package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/types.js +0 -0
  85. package/dist/_esm5.processed/core/init/{throw_on_media_error.d.ts → utils/throw_on_media_error.d.ts} +5 -5
  86. package/dist/_esm5.processed/core/init/{throw_on_media_error.js → utils/throw_on_media_error.js} +19 -15
  87. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +0 -1
  88. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +0 -1
  89. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +0 -5
  90. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +0 -5
  91. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +3 -3
  92. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +3 -3
  93. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +1 -1
  94. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
  95. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +25 -130
  96. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +188 -117
  97. package/dist/_esm5.processed/core/stream/adaptation/index.d.ts +2 -2
  98. package/dist/_esm5.processed/core/stream/adaptation/index.js +1 -0
  99. package/dist/_esm5.processed/core/stream/adaptation/types.d.ts +172 -0
  100. package/dist/_esm5.processed/core/stream/adaptation/types.js +1 -0
  101. package/dist/_esm5.processed/core/stream/adaptation/{create_representation_estimator.d.ts → utils/create_representation_estimator.d.ts} +6 -6
  102. package/dist/_esm5.processed/core/stream/adaptation/{create_representation_estimator.js → utils/create_representation_estimator.js} +3 -4
  103. package/dist/_esm5.processed/core/stream/index.d.ts +4 -3
  104. package/dist/_esm5.processed/core/stream/index.js +0 -1
  105. package/dist/_esm5.processed/core/stream/orchestrator/index.d.ts +2 -2
  106. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +142 -17
  107. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +303 -229
  108. package/dist/_esm5.processed/core/stream/period/index.d.ts +2 -3
  109. package/dist/_esm5.processed/core/stream/period/index.js +1 -0
  110. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +27 -62
  111. package/dist/_esm5.processed/core/stream/period/period_stream.js +278 -105
  112. package/dist/_esm5.processed/core/stream/period/types.d.ts +110 -0
  113. package/dist/_esm5.processed/core/stream/period/types.js +1 -0
  114. package/dist/_esm5.processed/core/stream/period/{get_adaptation_switch_strategy.d.ts → utils/get_adaptation_switch_strategy.d.ts} +3 -3
  115. package/dist/_esm5.processed/core/stream/period/{get_adaptation_switch_strategy.js → utils/get_adaptation_switch_strategy.js} +3 -3
  116. package/dist/_esm5.processed/core/stream/representation/index.d.ts +2 -2
  117. package/dist/_esm5.processed/core/stream/representation/index.js +1 -0
  118. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +32 -121
  119. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +210 -136
  120. package/dist/_esm5.processed/core/stream/representation/types.d.ts +267 -0
  121. package/dist/_esm5.processed/core/stream/representation/types.js +1 -0
  122. package/dist/_esm5.processed/core/stream/representation/{append_segment_to_buffer.d.ts → utils/append_segment_to_buffer.d.ts} +5 -5
  123. package/dist/_esm5.processed/core/stream/representation/{append_segment_to_buffer.js → utils/append_segment_to_buffer.js} +8 -3
  124. package/dist/_esm5.processed/core/stream/representation/{check_for_discontinuity.d.ts → utils/check_for_discontinuity.d.ts} +2 -2
  125. package/dist/_esm5.processed/core/stream/representation/{check_for_discontinuity.js → utils/check_for_discontinuity.js} +1 -1
  126. package/dist/_esm5.processed/core/stream/representation/{downloading_queue.d.ts → utils/downloading_queue.d.ts} +85 -80
  127. package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +378 -0
  128. package/dist/_esm5.processed/core/stream/representation/{force_garbage_collection.d.ts → utils/force_garbage_collection.d.ts} +2 -2
  129. package/dist/_esm5.processed/core/stream/representation/{force_garbage_collection.js → utils/force_garbage_collection.js} +3 -3
  130. package/dist/_esm5.processed/core/stream/representation/{get_buffer_status.d.ts → utils/get_buffer_status.d.ts} +3 -3
  131. package/dist/_esm5.processed/core/stream/representation/{get_buffer_status.js → utils/get_buffer_status.js} +3 -3
  132. package/dist/_esm5.processed/core/stream/representation/{get_needed_segments.d.ts → utils/get_needed_segments.d.ts} +3 -3
  133. package/dist/_esm5.processed/core/stream/representation/{get_needed_segments.js → utils/get_needed_segments.js} +4 -5
  134. package/dist/_esm5.processed/core/stream/representation/{get_segment_priority.d.ts → utils/get_segment_priority.d.ts} +0 -0
  135. package/dist/_esm5.processed/core/stream/representation/{get_segment_priority.js → utils/get_segment_priority.js} +1 -1
  136. package/dist/_esm5.processed/core/stream/representation/{push_init_segment.d.ts → utils/push_init_segment.d.ts} +9 -12
  137. package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +85 -0
  138. package/dist/_esm5.processed/core/stream/representation/{push_media_segment.d.ts → utils/push_media_segment.d.ts} +9 -12
  139. package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +109 -0
  140. package/dist/_esm5.processed/default_config.d.ts +10 -0
  141. package/dist/_esm5.processed/default_config.js +12 -1
  142. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +1 -1
  143. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.d.ts +1 -1
  144. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.js +1 -1
  145. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.d.ts +2 -3
  146. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +107 -59
  147. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/index.js +6 -7
  148. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  149. package/dist/_esm5.processed/features/list/directfile.js +1 -1
  150. package/dist/_esm5.processed/features/types.d.ts +2 -3
  151. package/dist/_esm5.processed/manifest/adaptation.d.ts +7 -0
  152. package/dist/_esm5.processed/manifest/adaptation.js +3 -0
  153. package/dist/_esm5.processed/manifest/manifest.d.ts +2 -1
  154. package/dist/_esm5.processed/manifest/manifest.js +4 -3
  155. package/dist/_esm5.processed/manifest/update_period_in_place.d.ts +26 -1
  156. package/dist/_esm5.processed/manifest/update_period_in_place.js +58 -7
  157. package/dist/_esm5.processed/manifest/update_periods.d.ts +19 -2
  158. package/dist/_esm5.processed/manifest/update_periods.js +62 -18
  159. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +3 -0
  160. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +1 -0
  161. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +1 -0
  162. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +7 -1
  163. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +16 -0
  164. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +63 -25
  165. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +3 -0
  166. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +60 -6
  167. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +39 -13
  168. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +7 -3
  169. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentBase.js +5 -0
  170. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +3 -0
  171. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.d.ts +0 -1
  172. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +0 -1
  173. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentBase.js +5 -0
  174. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentTemplate.js +6 -0
  175. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
  176. package/dist/_esm5.processed/parsers/manifest/types.d.ts +13 -2
  177. package/dist/_esm5.processed/parsers/texttracks/ttml/html/create_element.js +7 -0
  178. package/dist/_esm5.processed/public_types.d.ts +2 -0
  179. package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -2
  180. package/dist/_esm5.processed/transports/dash/segment_loader.js +1 -1
  181. package/dist/_esm5.processed/transports/dash/text_parser.js +3 -3
  182. package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
  183. package/dist/_esm5.processed/utils/event_emitter.d.ts +3 -13
  184. package/dist/_esm5.processed/utils/event_emitter.js +0 -19
  185. package/dist/_esm5.processed/utils/reference.d.ts +46 -67
  186. package/dist/_esm5.processed/utils/reference.js +63 -93
  187. package/dist/_esm5.processed/utils/request/xhr.d.ts +3 -68
  188. package/dist/_esm5.processed/utils/{rx-retry_with_backoff.d.ts → retry_promise_with_backoff.d.ts} +19 -34
  189. package/dist/_esm5.processed/utils/retry_promise_with_backoff.js +119 -0
  190. package/dist/_esm5.processed/utils/sleep.d.ts +10 -0
  191. package/dist/_esm5.processed/utils/sleep.js +14 -0
  192. package/dist/_esm5.processed/utils/sorted_list.d.ts +1 -0
  193. package/dist/_esm5.processed/utils/sorted_list.js +3 -0
  194. package/dist/mpd-parser.wasm +0 -0
  195. package/dist/rx-player.js +8116 -11600
  196. package/dist/rx-player.min.js +1 -1
  197. package/dist/rx-player.min.js.LICENSE.txt +0 -15
  198. package/manifest.mpd +149 -0
  199. package/package.json +26 -26
  200. package/scripts/build/generate_build.js +1 -8
  201. package/sonar-project.properties +1 -1
  202. package/src/README.md +2 -2
  203. package/src/compat/__tests__/can_reuse_media_keys.test.ts +4 -27
  204. package/src/compat/can_reuse_media_keys.ts +5 -7
  205. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +14 -15
  206. package/src/compat/event_listeners.ts +84 -148
  207. package/src/compat/index.ts +0 -6
  208. package/src/compat/on_height_width_change.ts +2 -2
  209. package/src/core/README.md +1 -1
  210. package/src/core/adaptive/adaptive_representation_selector.ts +36 -7
  211. package/src/core/api/README.md +0 -33
  212. package/src/core/api/playback_observer.ts +20 -11
  213. package/src/core/api/public_api.ts +826 -815
  214. package/src/core/api/tracks_management/track_choice_manager.ts +97 -57
  215. package/src/core/api/utils.ts +112 -42
  216. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +42 -38
  217. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +15 -20
  218. package/src/core/decrypt/__tests__/__global__/media_key_system_access.test.ts +35 -47
  219. package/src/core/decrypt/__tests__/__global__/utils.ts +116 -17
  220. package/src/core/decrypt/attach_media_keys.ts +3 -2
  221. package/src/core/decrypt/clear_on_stop.ts +1 -1
  222. package/src/core/decrypt/content_decryptor.ts +19 -27
  223. package/src/core/decrypt/create_session.ts +1 -1
  224. package/src/core/decrypt/find_key_system.ts +31 -11
  225. package/src/core/decrypt/get_media_keys.ts +1 -1
  226. package/src/core/decrypt/session_events_listener.ts +259 -277
  227. package/src/core/decrypt/set_server_certificate.ts +1 -1
  228. package/src/core/decrypt/types.ts +0 -5
  229. package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +1 -1
  230. package/src/core/decrypt/utils/loaded_sessions_store.ts +1 -1
  231. package/src/core/fetchers/README.md +3 -0
  232. package/src/core/fetchers/index.ts +6 -6
  233. package/src/core/fetchers/manifest/index.ts +7 -7
  234. package/src/core/fetchers/manifest/manifest_fetcher.ts +646 -295
  235. package/src/core/fetchers/segment/segment_fetcher_creator.ts +0 -24
  236. package/src/core/init/README.md +31 -45
  237. package/src/core/init/directfile_content_initializer.ts +229 -0
  238. package/src/core/init/index.ts +3 -3
  239. package/src/core/init/media_source_content_initializer.ts +819 -0
  240. package/src/core/init/types.ts +220 -132
  241. package/src/core/init/{__tests__ → utils/__tests__}/are_same_stream_events.test.ts +0 -0
  242. package/src/core/init/{__tests__ → utils/__tests__}/refresh_scheduled_events_list.test.ts +0 -0
  243. package/src/core/init/utils/content_time_boundaries_observer.ts +609 -0
  244. package/src/core/init/{create_media_source.ts → utils/create_media_source.ts} +60 -55
  245. package/src/core/init/{create_stream_playback_observer.ts → utils/create_stream_playback_observer.ts} +7 -11
  246. package/src/core/init/utils/end_of_stream.ts +104 -0
  247. package/src/core/init/{get_initial_time.ts → utils/get_initial_time.ts} +4 -4
  248. package/src/core/init/utils/get_loaded_reference.ts +76 -0
  249. package/src/core/init/utils/initial_seek_and_play.ts +179 -0
  250. package/src/core/init/utils/initialize_content_decryption.ts +178 -0
  251. package/src/core/init/{media_duration_updater.ts → utils/media_duration_updater.ts} +166 -84
  252. package/src/core/init/{rebuffering_controller.ts → utils/rebuffering_controller.ts} +247 -226
  253. package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/are_same_stream_events.ts +0 -0
  254. package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/index.ts +1 -13
  255. package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/refresh_scheduled_events_list.ts +1 -1
  256. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +210 -0
  257. package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/types.ts +1 -19
  258. package/src/core/init/utils/throw_on_media_error.ts +74 -0
  259. package/src/core/segment_buffers/README.md +5 -4
  260. package/src/core/segment_buffers/garbage_collector.ts +0 -1
  261. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -8
  262. package/src/core/segment_buffers/implementations/image/image_segment_buffer.ts +3 -3
  263. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +1 -1
  264. package/src/core/stream/README.md +1 -1
  265. package/src/core/stream/adaptation/adaptation_stream.ts +265 -330
  266. package/src/core/stream/adaptation/index.ts +2 -12
  267. package/src/core/stream/adaptation/types.ts +193 -0
  268. package/src/core/stream/adaptation/{create_representation_estimator.ts → utils/create_representation_estimator.ts} +10 -9
  269. package/src/core/stream/index.ts +9 -1
  270. package/src/core/stream/orchestrator/README.md +1 -4
  271. package/src/core/stream/orchestrator/index.ts +2 -0
  272. package/src/core/stream/orchestrator/stream_orchestrator.ts +423 -326
  273. package/src/core/stream/period/index.ts +2 -12
  274. package/src/core/stream/period/period_stream.ts +301 -238
  275. package/src/core/stream/period/types.ts +132 -0
  276. package/src/core/stream/period/{get_adaptation_switch_strategy.ts → utils/get_adaptation_switch_strategy.ts} +6 -6
  277. package/src/core/stream/representation/README.md +2 -23
  278. package/src/core/stream/representation/index.ts +2 -12
  279. package/src/core/stream/representation/representation_stream.ts +315 -415
  280. package/src/core/stream/representation/types.ts +292 -0
  281. package/src/core/stream/representation/{append_segment_to_buffer.ts → utils/append_segment_to_buffer.ts} +11 -7
  282. package/src/core/stream/representation/{check_for_discontinuity.ts → utils/check_for_discontinuity.ts} +3 -3
  283. package/src/core/stream/representation/utils/downloading_queue.ts +592 -0
  284. package/src/core/stream/representation/{force_garbage_collection.ts → utils/force_garbage_collection.ts} +5 -6
  285. package/src/core/stream/representation/{get_buffer_status.ts → utils/get_buffer_status.ts} +5 -5
  286. package/src/core/stream/representation/{get_needed_segments.ts → utils/get_needed_segments.ts} +6 -7
  287. package/src/core/stream/representation/{get_segment_priority.ts → utils/get_segment_priority.ts} +1 -2
  288. package/src/core/stream/representation/utils/push_init_segment.ts +80 -0
  289. package/src/core/stream/representation/utils/push_media_segment.ts +113 -0
  290. package/src/default_config.ts +13 -1
  291. package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +1 -1
  292. package/src/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.ts +1 -1
  293. package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +58 -66
  294. package/src/experimental/tools/createMetaplaylist/index.ts +29 -38
  295. package/src/features/__tests__/initialize_features.test.ts +1 -1
  296. package/src/features/initialize_features.ts +2 -1
  297. package/src/features/list/__tests__/directfile.test.ts +3 -2
  298. package/src/features/list/directfile.ts +1 -1
  299. package/src/features/types.ts +2 -7
  300. package/src/manifest/__tests__/manifest.test.ts +14 -365
  301. package/src/manifest/__tests__/update_period_in_place.test.ts +522 -57
  302. package/src/manifest/__tests__/update_periods.test.ts +254 -40
  303. package/src/manifest/adaptation.ts +11 -0
  304. package/src/manifest/manifest.ts +6 -4
  305. package/src/manifest/update_period_in_place.ts +84 -14
  306. package/src/manifest/update_periods.ts +93 -33
  307. package/src/parsers/manifest/dash/common/indexes/base.ts +4 -0
  308. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +8 -1
  309. package/src/parsers/manifest/dash/common/indexes/template.ts +76 -25
  310. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +61 -3
  311. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +46 -15
  312. package/src/parsers/manifest/dash/common/parse_representations.ts +7 -3
  313. package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentBase.ts +6 -0
  314. package/src/parsers/manifest/dash/node_parser_types.ts +3 -0
  315. package/src/parsers/manifest/dash/wasm-parser/rs/events.rs +3 -0
  316. package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +4 -0
  317. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
  318. package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentBase.ts +6 -0
  319. package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentTemplate.ts +7 -0
  320. package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +3 -0
  321. package/src/parsers/manifest/types.ts +13 -2
  322. package/src/parsers/texttracks/ttml/html/create_element.ts +8 -0
  323. package/src/public_types.ts +2 -0
  324. package/src/transports/README.md +15 -54
  325. package/src/transports/dash/manifest_parser.ts +2 -2
  326. package/src/transports/dash/segment_loader.ts +1 -1
  327. package/src/transports/dash/text_parser.ts +3 -3
  328. package/src/transports/local/segment_loader.ts +1 -1
  329. package/src/utils/__tests__/event_emitter.test.ts +1 -76
  330. package/src/utils/event_emitter.ts +6 -30
  331. package/src/utils/reference.ts +112 -169
  332. package/src/utils/request/xhr.ts +3 -68
  333. package/src/utils/retry_promise_with_backoff.ts +95 -0
  334. package/src/utils/sleep.ts +14 -0
  335. package/src/utils/sorted_list.ts +4 -0
  336. package/dist/_esm5.processed/compat/play.d.ts +0 -23
  337. package/dist/_esm5.processed/compat/play.js +0 -32
  338. package/dist/_esm5.processed/compat/set_element_src.d.ts +0 -26
  339. package/dist/_esm5.processed/compat/set_element_src.js +0 -37
  340. package/dist/_esm5.processed/compat/when_loaded_metadata.d.ts +0 -23
  341. package/dist/_esm5.processed/compat/when_loaded_metadata.js +0 -33
  342. package/dist/_esm5.processed/core/init/content_time_boundaries_observer.d.ts +0 -45
  343. package/dist/_esm5.processed/core/init/content_time_boundaries_observer.js +0 -295
  344. package/dist/_esm5.processed/core/init/create_media_source.js +0 -107
  345. package/dist/_esm5.processed/core/init/end_of_stream.js +0 -74
  346. package/dist/_esm5.processed/core/init/events_generators.d.ts +0 -88
  347. package/dist/_esm5.processed/core/init/events_generators.js +0 -87
  348. package/dist/_esm5.processed/core/init/initial_seek_and_play.d.ts +0 -81
  349. package/dist/_esm5.processed/core/init/initial_seek_and_play.js +0 -114
  350. package/dist/_esm5.processed/core/init/initialize_directfile.js +0 -120
  351. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +0 -122
  352. package/dist/_esm5.processed/core/init/initialize_media_source.js +0 -201
  353. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +0 -62
  354. package/dist/_esm5.processed/core/init/link_drm_and_content.js +0 -94
  355. package/dist/_esm5.processed/core/init/load_on_media_source.d.ts +0 -46
  356. package/dist/_esm5.processed/core/init/load_on_media_source.js +0 -122
  357. package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +0 -65
  358. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +0 -233
  359. package/dist/_esm5.processed/core/init/rebuffering_controller.d.ts +0 -81
  360. package/dist/_esm5.processed/core/init/rebuffering_controller.js +0 -439
  361. package/dist/_esm5.processed/core/init/stream_events_emitter/index.d.ts +0 -19
  362. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.d.ts +0 -27
  363. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +0 -126
  364. package/dist/_esm5.processed/core/init/update_playback_rate.d.ts +0 -0
  365. package/dist/_esm5.processed/core/init/update_playback_rate.js +0 -1
  366. package/dist/_esm5.processed/core/stream/events_generators.d.ts +0 -67
  367. package/dist/_esm5.processed/core/stream/events_generators.js +0 -112
  368. package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.d.ts +0 -53
  369. package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.js +0 -124
  370. package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.d.ts +0 -35
  371. package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.js +0 -53
  372. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.d.ts +0 -36
  373. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +0 -46
  374. package/dist/_esm5.processed/core/stream/reload_after_switch.d.ts +0 -47
  375. package/dist/_esm5.processed/core/stream/reload_after_switch.js +0 -56
  376. package/dist/_esm5.processed/core/stream/representation/downloading_queue.js +0 -371
  377. package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +0 -49
  378. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +0 -76
  379. package/dist/_esm5.processed/core/stream/types.d.ts +0 -437
  380. package/dist/_esm5.processed/utils/cast_to_observable.d.ts +0 -24
  381. package/dist/_esm5.processed/utils/cast_to_observable.js +0 -35
  382. package/dist/_esm5.processed/utils/concat_map_latest.d.ts +0 -23
  383. package/dist/_esm5.processed/utils/concat_map_latest.js +0 -48
  384. package/dist/_esm5.processed/utils/defer_subscriptions.d.ts +0 -79
  385. package/dist/_esm5.processed/utils/defer_subscriptions.js +0 -89
  386. package/dist/_esm5.processed/utils/filter_map.d.ts +0 -28
  387. package/dist/_esm5.processed/utils/filter_map.js +0 -32
  388. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +0 -39
  389. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +0 -63
  390. package/dist/_esm5.processed/utils/rx-next-tick.d.ts +0 -27
  391. package/dist/_esm5.processed/utils/rx-next-tick.js +0 -41
  392. package/dist/_esm5.processed/utils/rx-retry_with_backoff.js +0 -70
  393. package/dist/_esm5.processed/utils/rx-throttle.d.ts +0 -40
  394. package/dist/_esm5.processed/utils/rx-throttle.js +0 -47
  395. package/dist/_esm5.processed/utils/rx-try_catch.d.ts +0 -23
  396. package/dist/_esm5.processed/utils/rx-try_catch.js +0 -30
  397. package/src/compat/__tests__/play.test.ts +0 -73
  398. package/src/compat/__tests__/set_element_src.test.ts +0 -71
  399. package/src/compat/__tests__/when_loaded_metadata.test.ts +0 -109
  400. package/src/compat/play.ts +0 -37
  401. package/src/compat/set_element_src.ts +0 -47
  402. package/src/compat/when_loaded_metadata.ts +0 -40
  403. package/src/core/init/content_time_boundaries_observer.ts +0 -382
  404. package/src/core/init/emit_loaded_event.ts +0 -71
  405. package/src/core/init/end_of_stream.ts +0 -104
  406. package/src/core/init/events_generators.ts +0 -140
  407. package/src/core/init/initial_seek_and_play.ts +0 -208
  408. package/src/core/init/initialize_directfile.ts +0 -191
  409. package/src/core/init/initialize_media_source.ts +0 -389
  410. package/src/core/init/link_drm_and_content.ts +0 -176
  411. package/src/core/init/load_on_media_source.ts +0 -237
  412. package/src/core/init/manifest_update_scheduler.ts +0 -362
  413. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +0 -182
  414. package/src/core/init/throw_on_media_error.ts +0 -68
  415. package/src/core/init/update_playback_rate.ts +0 -0
  416. package/src/core/stream/events_generators.ts +0 -217
  417. package/src/core/stream/orchestrator/active_period_emitter.ts +0 -146
  418. package/src/core/stream/orchestrator/are_streams_complete.ts +0 -70
  419. package/src/core/stream/period/create_empty_adaptation_stream.ts +0 -70
  420. package/src/core/stream/reload_after_switch.ts +0 -76
  421. package/src/core/stream/representation/downloading_queue.ts +0 -632
  422. package/src/core/stream/representation/push_init_segment.ts +0 -87
  423. package/src/core/stream/representation/push_media_segment.ts +0 -125
  424. package/src/core/stream/types.ts +0 -558
  425. package/src/utils/__tests__/cast_to_observable.test.ts +0 -93
  426. package/src/utils/__tests__/concat_map_latest.test.ts +0 -221
  427. package/src/utils/__tests__/defer_subscriptions.test.ts +0 -50
  428. package/src/utils/__tests__/filter_map.test.ts +0 -87
  429. package/src/utils/__tests__/rx-throttle.test.ts +0 -252
  430. package/src/utils/__tests__/rx-try_catch.test.ts +0 -100
  431. package/src/utils/cast_to_observable.ts +0 -48
  432. package/src/utils/concat_map_latest.ts +0 -61
  433. package/src/utils/defer_subscriptions.ts +0 -96
  434. package/src/utils/filter_map.ts +0 -43
  435. package/src/utils/rx-from_cancellable_promise.ts +0 -71
  436. package/src/utils/rx-next-tick.ts +0 -43
  437. package/src/utils/rx-retry_with_backoff.ts +0 -101
  438. package/src/utils/rx-throttle.ts +0 -84
  439. package/src/utils/rx-try_catch.ts +0 -37
@@ -43,7 +43,6 @@ var __assign = (this && this.__assign) || function () {
43
43
  * This file defines the public API for the RxPlayer.
44
44
  * It also starts the different sub-parts of the player on various API calls.
45
45
  */
46
- import { combineLatest as observableCombineLatest, concat as observableConcat, connectable, distinctUntilChanged, EMPTY, filter, map, merge as observableMerge, mergeMap, Observable, of as observableOf, share, shareReplay, skipWhile, startWith, Subject, switchMap, take, takeUntil, tap, } from "rxjs";
47
46
  import { events, exitFullscreen, getStartDate, isFullscreen, requestFullscreen, } from "../../compat";
48
47
  /* eslint-disable-next-line max-len */
49
48
  import canRelyOnVideoVisibilityAndSize from "../../compat/can_rely_on_video_visibility_and_size";
@@ -51,9 +50,10 @@ import config from "../../config";
51
50
  import { ErrorCodes, ErrorTypes, formatError, MediaError, } from "../../errors";
52
51
  import features from "../../features";
53
52
  import log from "../../log";
54
- import Manifest from "../../manifest";
55
53
  import areArraysOfNumbersEqual from "../../utils/are_arrays_of_numbers_equal";
54
+ import assert from "../../utils/assert";
56
55
  import EventEmitter from "../../utils/event_emitter";
56
+ import idGenerator from "../../utils/id_generator";
57
57
  import isNullOrUndefined from "../../utils/is_null_or_undefined";
58
58
  import objectAssign from "../../utils/object_assign";
59
59
  import { getLeftSizeOfRange, getPlayedSizeOfRange, getSizeOfRange, } from "../../utils/ranges";
@@ -61,14 +61,14 @@ import createSharedReference, { createMappedReference, } from "../../utils/refer
61
61
  import TaskCanceller from "../../utils/task_canceller";
62
62
  import warnOnce from "../../utils/warn_once";
63
63
  import { clearOnStop, disposeDecryptionResources, getCurrentKeySystem, } from "../decrypt";
64
- import { ManifestFetcher, } from "../fetchers";
65
- import initializeMediaSourcePlayback from "../init";
64
+ import MediaSourceContentInitializer from "../init/media_source_content_initializer";
66
65
  import { checkReloadOptions, parseConstructorOptions, parseLoadVideoOptions, } from "./option_utils";
67
66
  import PlaybackObserver from "./playback_observer";
68
67
  import TrackChoiceManager from "./tracks_management/track_choice_manager";
69
- import { emitSeekEvents, getLoadedContentState, } from "./utils";
68
+ import { constructPlayerStateReference, emitSeekEvents, isLoadedState, } from "./utils";
70
69
  /* eslint-disable @typescript-eslint/naming-convention */
71
- var getPageActivityRef = events.getPageActivityRef, getPictureOnPictureStateRef = events.getPictureOnPictureStateRef, getVideoVisibilityRef = events.getVideoVisibilityRef, getVideoWidthRef = events.getVideoWidthRef, onFullscreenChange$ = events.onFullscreenChange$, onTextTrackChanges$ = events.onTextTrackChanges$;
70
+ var generateContentId = idGenerator();
71
+ var getPageActivityRef = events.getPageActivityRef, getPictureOnPictureStateRef = events.getPictureOnPictureStateRef, getVideoVisibilityRef = events.getVideoVisibilityRef, getVideoWidthRef = events.getVideoWidthRef, onFullscreenChange = events.onFullscreenChange, onTextTrackAdded = events.onTextTrackAdded, onTextTrackRemoved = events.onTextTrackRemoved;
72
72
  /**
73
73
  * @class Player
74
74
  * @extends EventEmitter
@@ -81,80 +81,88 @@ var Player = /** @class */ (function (_super) {
81
81
  */
82
82
  function Player(options) {
83
83
  if (options === void 0) { options = {}; }
84
- var _this = _super.call(this) || this;
85
- var _a = parseConstructorOptions(options), initialAudioBitrate = _a.initialAudioBitrate, initialVideoBitrate = _a.initialVideoBitrate, limitVideoWidth = _a.limitVideoWidth, minAudioBitrate = _a.minAudioBitrate, minVideoBitrate = _a.minVideoBitrate, maxAudioBitrate = _a.maxAudioBitrate, maxBufferAhead = _a.maxBufferAhead, maxBufferBehind = _a.maxBufferBehind, maxVideoBitrate = _a.maxVideoBitrate, preferredAudioTracks = _a.preferredAudioTracks, preferredTextTracks = _a.preferredTextTracks, preferredVideoTracks = _a.preferredVideoTracks, throttleWhenHidden = _a.throttleWhenHidden, throttleVideoBitrateWhenHidden = _a.throttleVideoBitrateWhenHidden, videoElement = _a.videoElement, wantedBufferAhead = _a.wantedBufferAhead, maxVideoBufferSize = _a.maxVideoBufferSize, stopAtEnd = _a.stopAtEnd;
84
+ var _this = this;
85
+ var _a, _b;
86
+ _this = _super.call(this) || this;
87
+ var _c = parseConstructorOptions(options), initialAudioBitrate = _c.initialAudioBitrate, initialVideoBitrate = _c.initialVideoBitrate, limitVideoWidth = _c.limitVideoWidth, minAudioBitrate = _c.minAudioBitrate, minVideoBitrate = _c.minVideoBitrate, maxAudioBitrate = _c.maxAudioBitrate, maxBufferAhead = _c.maxBufferAhead, maxBufferBehind = _c.maxBufferBehind, maxVideoBitrate = _c.maxVideoBitrate, preferredAudioTracks = _c.preferredAudioTracks, preferredTextTracks = _c.preferredTextTracks, preferredVideoTracks = _c.preferredVideoTracks, throttleWhenHidden = _c.throttleWhenHidden, throttleVideoBitrateWhenHidden = _c.throttleVideoBitrateWhenHidden, videoElement = _c.videoElement, wantedBufferAhead = _c.wantedBufferAhead, maxVideoBufferSize = _c.maxVideoBufferSize, stopAtEnd = _c.stopAtEnd;
86
88
  var DEFAULT_UNMUTED_VOLUME = config.getCurrent().DEFAULT_UNMUTED_VOLUME;
87
89
  // Workaround to support Firefox autoplay on FF 42.
88
90
  // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
89
91
  videoElement.preload = "auto";
90
- _this.version = /* PLAYER_VERSION */ "3.29.0";
92
+ _this.version = /* PLAYER_VERSION */ "3.30.0-dev.2023011800";
91
93
  _this.log = log;
92
94
  _this.state = "STOPPED";
93
95
  _this.videoElement = videoElement;
94
96
  var destroyCanceller = new TaskCanceller();
95
- _this._priv_destroy$ = new Subject(); // TODO Remove the need for this Subject
96
- _this._priv_destroy$.pipe(take(1)).subscribe(function () {
97
- destroyCanceller.cancel();
98
- });
97
+ _this._destroyCanceller = destroyCanceller;
99
98
  _this._priv_pictureInPictureRef = getPictureOnPictureStateRef(videoElement, destroyCanceller.signal);
100
99
  /** @deprecated */
101
- onFullscreenChange$(videoElement)
102
- .pipe(takeUntil(_this._priv_destroy$))
100
+ onFullscreenChange(videoElement, function () {
103
101
  /* eslint-disable import/no-deprecated */
104
- .subscribe(function () { return _this.trigger("fullscreenChange", _this.isFullscreen()); });
105
- /* eslint-enable import/no-deprecated */
106
- /** @deprecated */
107
- onTextTrackChanges$(videoElement.textTracks)
108
- .pipe(takeUntil(_this._priv_destroy$), map(function (evt) {
102
+ _this.trigger("fullscreenChange", _this.isFullscreen());
103
+ /* eslint-enable import/no-deprecated */
104
+ }, destroyCanceller.signal);
105
+ /** Store last known TextTrack array linked to the media element. */
106
+ var prevTextTracks = [];
107
+ for (var i = 0; i < ((_a = videoElement.textTracks) === null || _a === void 0 ? void 0 : _a.length); i++) {
108
+ var textTrack = (_b = videoElement.textTracks) === null || _b === void 0 ? void 0 : _b[i];
109
+ if (!isNullOrUndefined(textTrack)) {
110
+ prevTextTracks.push(textTrack);
111
+ }
112
+ }
113
+ /** Callback called when a TextTrack element is added or removed. */
114
+ var onTextTrackChanges = function (_evt) {
115
+ var evt = _evt;
109
116
  var target = evt.target;
110
- var arr = [];
117
+ var textTrackArr = [];
111
118
  for (var i = 0; i < target.length; i++) {
112
119
  var textTrack = target[i];
113
- arr.push(textTrack);
120
+ textTrackArr.push(textTrack);
114
121
  }
115
- return arr;
116
- }),
117
- // We can have two consecutive textTrackChanges with the exact same
118
- // payload when we perform multiple texttrack operations before the event
119
- // loop is freed.
120
- // In that case we only want to fire one time the observable.
121
- distinctUntilChanged(function (textTracksA, textTracksB) {
122
- if (textTracksA.length !== textTracksB.length) {
123
- return false;
122
+ var oldTextTracks = prevTextTracks;
123
+ prevTextTracks = textTrackArr;
124
+ // We can have two consecutive textTrackChanges with the exact same
125
+ // payload when we perform multiple texttrack operations before the event
126
+ // loop is freed.
127
+ if (oldTextTracks.length !== textTrackArr.length) {
128
+ _this._priv_onNativeTextTracksNext(textTrackArr);
129
+ return;
124
130
  }
125
- for (var i = 0; i < textTracksA.length; i++) {
126
- if (textTracksA[i] !== textTracksB[i]) {
127
- return false;
131
+ for (var i = 0; i < oldTextTracks.length; i++) {
132
+ if (oldTextTracks[i] !== textTrackArr[i]) {
133
+ _this._priv_onNativeTextTracksNext(textTrackArr);
134
+ return;
128
135
  }
129
136
  }
130
- return true;
131
- }))
132
- .subscribe(function (x) { return _this._priv_onNativeTextTracksNext(x); });
133
- _this._priv_speed = createSharedReference(videoElement.playbackRate);
137
+ return;
138
+ };
139
+ if (!isNullOrUndefined(videoElement.textTracks)) {
140
+ onTextTrackAdded(videoElement.textTracks, onTextTrackChanges, destroyCanceller.signal);
141
+ onTextTrackRemoved(videoElement.textTracks, onTextTrackChanges, destroyCanceller.signal);
142
+ }
143
+ _this._priv_speed = createSharedReference(videoElement.playbackRate, _this._destroyCanceller.signal);
134
144
  _this._priv_preferTrickModeTracks = false;
135
- _this._priv_contentLock = createSharedReference(false);
145
+ _this._priv_contentLock = createSharedReference(false, _this._destroyCanceller.signal);
136
146
  _this._priv_bufferOptions = {
137
- wantedBufferAhead: createSharedReference(wantedBufferAhead),
138
- maxBufferAhead: createSharedReference(maxBufferAhead),
139
- maxBufferBehind: createSharedReference(maxBufferBehind),
140
- maxVideoBufferSize: createSharedReference(maxVideoBufferSize),
147
+ wantedBufferAhead: createSharedReference(wantedBufferAhead, _this._destroyCanceller.signal),
148
+ maxBufferAhead: createSharedReference(maxBufferAhead, _this._destroyCanceller.signal),
149
+ maxBufferBehind: createSharedReference(maxBufferBehind, _this._destroyCanceller.signal),
150
+ maxVideoBufferSize: createSharedReference(maxVideoBufferSize, _this._destroyCanceller.signal),
141
151
  };
142
152
  _this._priv_bitrateInfos = {
143
153
  lastBitrates: { audio: initialAudioBitrate,
144
154
  video: initialVideoBitrate },
145
- minAutoBitrates: { audio: createSharedReference(minAudioBitrate),
146
- video: createSharedReference(minVideoBitrate) },
147
- maxAutoBitrates: { audio: createSharedReference(maxAudioBitrate),
148
- video: createSharedReference(maxVideoBitrate) },
149
- manualBitrates: { audio: createSharedReference(-1),
150
- video: createSharedReference(-1) },
155
+ minAutoBitrates: { audio: createSharedReference(minAudioBitrate, _this._destroyCanceller.signal),
156
+ video: createSharedReference(minVideoBitrate, _this._destroyCanceller.signal) },
157
+ maxAutoBitrates: { audio: createSharedReference(maxAudioBitrate, _this._destroyCanceller.signal),
158
+ video: createSharedReference(maxVideoBitrate, _this._destroyCanceller.signal) },
159
+ manualBitrates: { audio: createSharedReference(-1, _this._destroyCanceller.signal),
160
+ video: createSharedReference(-1, _this._destroyCanceller.signal) },
151
161
  };
152
162
  _this._priv_throttleWhenHidden = throttleWhenHidden;
153
163
  _this._priv_throttleVideoBitrateWhenHidden = throttleVideoBitrateWhenHidden;
154
164
  _this._priv_limitVideoWidth = limitVideoWidth;
155
165
  _this._priv_mutedMemory = DEFAULT_UNMUTED_VOLUME;
156
- _this._priv_trackChoiceManager = null;
157
- _this._priv_mediaElementTrackChoiceManager = null;
158
166
  _this._priv_currentError = null;
159
167
  _this._priv_contentInfos = null;
160
168
  _this._priv_contentEventsMemory = {};
@@ -246,22 +254,8 @@ var Player = /** @class */ (function (_super) {
246
254
  log.error("API: Could not dispose decryption resources: " + message);
247
255
  });
248
256
  }
249
- // free Observables linked to the Player instance
250
- this._priv_destroy$.next();
251
- this._priv_destroy$.complete();
252
- // Complete all subjects and references
253
- this._priv_speed.finish();
254
- this._priv_contentLock.finish();
255
- this._priv_bufferOptions.wantedBufferAhead.finish();
256
- this._priv_bufferOptions.maxVideoBufferSize.finish();
257
- this._priv_bufferOptions.maxBufferAhead.finish();
258
- this._priv_bufferOptions.maxBufferBehind.finish();
259
- this._priv_bitrateInfos.manualBitrates.video.finish();
260
- this._priv_bitrateInfos.manualBitrates.audio.finish();
261
- this._priv_bitrateInfos.minAutoBitrates.video.finish();
262
- this._priv_bitrateInfos.minAutoBitrates.audio.finish();
263
- this._priv_bitrateInfos.maxAutoBitrates.video.finish();
264
- this._priv_bitrateInfos.maxAutoBitrates.audio.finish();
257
+ // free resources linked to the Player instance
258
+ this._destroyCanceller.cancel();
265
259
  this._priv_reloadingMetadata = {};
266
260
  // un-attach video element
267
261
  this.videoElement = null;
@@ -324,44 +318,17 @@ var Player = /** @class */ (function (_super) {
324
318
  */
325
319
  Player.prototype._priv_initializeContentPlayback = function (options) {
326
320
  var _this = this;
327
- var _a, _b, _c;
328
321
  var autoPlay = options.autoPlay, audioTrackSwitchingMode = options.audioTrackSwitchingMode, defaultAudioTrack = options.defaultAudioTrack, defaultTextTrack = options.defaultTextTrack, enableFastSwitching = options.enableFastSwitching, initialManifest = options.initialManifest, keySystems = options.keySystems, lowLatencyMode = options.lowLatencyMode, manualBitrateSwitchingMode = options.manualBitrateSwitchingMode, minimumManifestUpdateInterval = options.minimumManifestUpdateInterval, networkConfig = options.networkConfig, onCodecSwitch = options.onCodecSwitch, startAt = options.startAt, transport = options.transport, transportOptions = options.transportOptions, url = options.url;
329
322
  // Perform multiple checks on the given options
330
323
  if (this.videoElement === null) {
331
324
  throw new Error("the attached video element is disposed");
332
325
  }
333
326
  var isDirectFile = transport === "directfile";
334
- /** Subject which will emit to stop the current content. */
327
+ /** Emit to stop the current content. */
335
328
  var currentContentCanceller = new TaskCanceller();
336
- // Some logic needs the equivalent of the `currentContentCanceller` under
337
- // an Observable form
338
- // TODO remove the need for `stoppedContent$`
339
- var stoppedContent$ = new Observable(function (obs) {
340
- currentContentCanceller.signal.register(function () {
341
- obs.next();
342
- obs.complete();
343
- });
344
- });
345
- /** Future `this._priv_contentInfos` related to this content. */
346
- var contentInfos = { url: url, currentContentCanceller: currentContentCanceller, isDirectFile: isDirectFile, segmentBuffersStore: null,
347
- thumbnails: null,
348
- manifest: null,
349
- currentPeriod: null,
350
- activeAdaptations: null,
351
- activeRepresentations: null,
352
- initialAudioTrack: defaultAudioTrack,
353
- initialTextTrack: defaultTextTrack };
354
329
  var videoElement = this.videoElement;
355
- /** Global "playback observer" which will emit playback conditions */
356
- var playbackObserver = new PlaybackObserver(videoElement, {
357
- withMediaSource: !isDirectFile,
358
- lowLatencyMode: lowLatencyMode,
359
- });
360
- currentContentCanceller.signal.register(function () {
361
- playbackObserver.stop();
362
- });
363
- /** Emit playback events. */
364
- var playback$;
330
+ var initializer;
331
+ var mediaElementTrackChoiceManager = null;
365
332
  if (!isDirectFile) {
366
333
  var transportFn = features.transports[transport];
367
334
  if (typeof transportFn !== "function") {
@@ -373,34 +340,9 @@ var Player = /** @class */ (function (_super) {
373
340
  var transportPipelines = transportFn(transportOptions);
374
341
  var offlineRetry = networkConfig.offlineRetry, segmentRetry = networkConfig.segmentRetry, manifestRetry = networkConfig.manifestRetry, manifestRequestTimeout = networkConfig.manifestRequestTimeout, segmentRequestTimeout = networkConfig.segmentRequestTimeout;
375
342
  /** Interface used to load and refresh the Manifest. */
376
- var manifestFetcher = new ManifestFetcher(url, transportPipelines, { lowLatencyMode: lowLatencyMode, maxRetryRegular: manifestRetry,
343
+ var manifestRequestSettings = { lowLatencyMode: lowLatencyMode, maxRetryRegular: manifestRetry,
377
344
  maxRetryOffline: offlineRetry,
378
- requestTimeout: manifestRequestTimeout });
379
- /** Observable emitting the initial Manifest */
380
- var manifest$ = void 0;
381
- if (initialManifest instanceof Manifest) {
382
- manifest$ = observableOf({ type: "parsed",
383
- manifest: initialManifest });
384
- }
385
- else if (initialManifest !== undefined) {
386
- manifest$ = manifestFetcher.parse(initialManifest, { previousManifest: null,
387
- unsafeMode: false });
388
- }
389
- else {
390
- manifest$ = manifestFetcher.fetch(url).pipe(mergeMap(function (response) { return response.type === "warning" ?
391
- observableOf(response) : // bubble-up warnings
392
- response.parse({ previousManifest: null, unsafeMode: false }); }));
393
- }
394
- // Load the Manifest right now and share it with every subscriber until
395
- // the content is stopped
396
- manifest$ = manifest$.pipe(takeUntil(stoppedContent$), shareReplay());
397
- manifest$.subscribe();
398
- // now that the Manifest is loading, stop previous content and reset state
399
- // This is done after fetching the Manifest as `stop` could technically
400
- // take time.
401
- this.stop();
402
- this._priv_currentError = null;
403
- this._priv_contentInfos = contentInfos;
345
+ requestTimeout: manifestRequestTimeout, minimumManifestUpdateInterval: minimumManifestUpdateInterval, initialManifest: initialManifest };
404
346
  var relyOnVideoVisibilityAndSize = canRelyOnVideoVisibilityAndSize();
405
347
  var throttlers = { throttle: {},
406
348
  throttleBitrate: {},
@@ -454,126 +396,165 @@ var Player = /** @class */ (function (_super) {
454
396
  { textTrackMode: "html",
455
397
  textTrackElement: options.textTrackElement };
456
398
  var bufferOptions = objectAssign({ audioTrackSwitchingMode: audioTrackSwitchingMode, enableFastSwitching: enableFastSwitching, manualBitrateSwitchingMode: manualBitrateSwitchingMode, onCodecSwitch: onCodecSwitch }, this._priv_bufferOptions);
457
- var segmentRequestOptions = { regularError: segmentRetry,
399
+ var segmentRequestOptions = { lowLatencyMode: lowLatencyMode, maxRetryRegular: segmentRetry,
458
400
  requestTimeout: segmentRequestTimeout,
459
- offlineError: offlineRetry };
460
- // We've every options set up. Start everything now
461
- var init$ = initializeMediaSourcePlayback({ adaptiveOptions: adaptiveOptions, autoPlay: autoPlay, bufferOptions: bufferOptions, playbackObserver: playbackObserver, keySystems: keySystems, lowLatencyMode: lowLatencyMode, manifest$: manifest$, manifestFetcher: manifestFetcher, mediaElement: videoElement, minimumManifestUpdateInterval: minimumManifestUpdateInterval, segmentRequestOptions: segmentRequestOptions, speed: this._priv_speed, startAt: startAt, transport: transportPipelines, textTrackOptions: textTrackOptions })
462
- .pipe(takeUntil(stoppedContent$));
463
- playback$ = connectable(init$, { connector: function () { return new Subject(); },
464
- resetOnDisconnect: false });
401
+ maxRetryOffline: offlineRetry };
402
+ initializer = new MediaSourceContentInitializer({
403
+ adaptiveOptions: adaptiveOptions,
404
+ autoPlay: autoPlay,
405
+ bufferOptions: bufferOptions,
406
+ keySystems: keySystems,
407
+ lowLatencyMode: lowLatencyMode,
408
+ manifestRequestSettings: manifestRequestSettings,
409
+ transport: transportPipelines,
410
+ segmentRequestOptions: segmentRequestOptions,
411
+ speed: this._priv_speed,
412
+ startAt: startAt,
413
+ textTrackOptions: textTrackOptions,
414
+ url: url,
415
+ });
465
416
  }
466
417
  else {
467
- // Stop previous content and reset its state
468
- this.stop();
469
- this._priv_currentError = null;
470
418
  if (features.directfile === null) {
419
+ this.stop();
420
+ this._priv_currentError = null;
471
421
  throw new Error("DirectFile feature not activated in your build.");
472
422
  }
473
- this._priv_contentInfos = contentInfos;
474
- this._priv_mediaElementTrackChoiceManager =
475
- new features.directfile.mediaElementTrackChoiceManager(this.videoElement);
476
- var preferredAudioTracks = defaultAudioTrack === undefined ?
477
- this._priv_preferredAudioTracks :
478
- [defaultAudioTrack];
479
- this._priv_mediaElementTrackChoiceManager
480
- .setPreferredAudioTracks(preferredAudioTracks, true);
481
- var preferredTextTracks = defaultTextTrack === undefined ?
482
- this._priv_preferredTextTracks :
483
- [defaultTextTrack];
484
- this._priv_mediaElementTrackChoiceManager
485
- .setPreferredTextTracks(preferredTextTracks, true);
486
- this._priv_mediaElementTrackChoiceManager
487
- .setPreferredVideoTracks(this._priv_preferredVideoTracks, true);
488
- this.trigger("availableAudioTracksChange", this._priv_mediaElementTrackChoiceManager.getAvailableAudioTracks());
489
- this.trigger("availableVideoTracksChange", this._priv_mediaElementTrackChoiceManager.getAvailableVideoTracks());
490
- this.trigger("availableTextTracksChange", this._priv_mediaElementTrackChoiceManager.getAvailableTextTracks());
491
- this.trigger("audioTrackChange", (_a = this._priv_mediaElementTrackChoiceManager.getChosenAudioTrack()) !== null && _a !== void 0 ? _a : null);
492
- this.trigger("textTrackChange", (_b = this._priv_mediaElementTrackChoiceManager.getChosenTextTrack()) !== null && _b !== void 0 ? _b : null);
493
- this.trigger("videoTrackChange", (_c = this._priv_mediaElementTrackChoiceManager.getChosenVideoTrack()) !== null && _c !== void 0 ? _c : null);
494
- this._priv_mediaElementTrackChoiceManager
495
- .addEventListener("availableVideoTracksChange", function (val) {
496
- return _this.trigger("availableVideoTracksChange", val);
497
- });
498
- this._priv_mediaElementTrackChoiceManager
499
- .addEventListener("availableAudioTracksChange", function (val) {
500
- return _this.trigger("availableAudioTracksChange", val);
501
- });
502
- this._priv_mediaElementTrackChoiceManager
503
- .addEventListener("availableTextTracksChange", function (val) {
504
- return _this.trigger("availableTextTracksChange", val);
505
- });
506
- this._priv_mediaElementTrackChoiceManager
507
- .addEventListener("audioTrackChange", function (val) {
508
- return _this.trigger("audioTrackChange", val);
509
- });
510
- this._priv_mediaElementTrackChoiceManager
511
- .addEventListener("videoTrackChange", function (val) {
512
- return _this.trigger("videoTrackChange", val);
423
+ mediaElementTrackChoiceManager =
424
+ this._priv_initializeMediaElementTrackChoiceManager(defaultAudioTrack, defaultTextTrack, currentContentCanceller.signal);
425
+ if (currentContentCanceller.isUsed) {
426
+ return;
427
+ }
428
+ initializer = new features.directfile.initDirectFile({ autoPlay: autoPlay, keySystems: keySystems, speed: this._priv_speed, startAt: startAt, url: url });
429
+ }
430
+ /** Future `this._priv_contentInfos` related to this content. */
431
+ var contentInfos = {
432
+ contentId: generateContentId(),
433
+ originalUrl: url,
434
+ currentContentCanceller: currentContentCanceller,
435
+ initializer: initializer,
436
+ isDirectFile: isDirectFile,
437
+ segmentBuffersStore: null,
438
+ thumbnails: null,
439
+ manifest: null,
440
+ currentPeriod: null,
441
+ activeAdaptations: null,
442
+ activeRepresentations: null,
443
+ initialAudioTrack: defaultAudioTrack,
444
+ initialTextTrack: defaultTextTrack,
445
+ trackChoiceManager: null,
446
+ mediaElementTrackChoiceManager: mediaElementTrackChoiceManager,
447
+ };
448
+ // Bind events
449
+ initializer.addEventListener("error", function (error) {
450
+ var formattedError = formatError(error, {
451
+ defaultCode: "NONE",
452
+ defaultReason: "An unknown error stopped content playback.",
513
453
  });
514
- this._priv_mediaElementTrackChoiceManager
515
- .addEventListener("textTrackChange", function (val) {
516
- return _this.trigger("textTrackChange", val);
454
+ formattedError.fatal = true;
455
+ contentInfos.currentContentCanceller.cancel();
456
+ _this._priv_cleanUpCurrentContentState();
457
+ _this._priv_currentError = formattedError;
458
+ log.error("API: The player stopped because of an error", error instanceof Error ? error : "");
459
+ _this._priv_setPlayerState("STOPPED" /* PLAYER_STATES.STOPPED */);
460
+ // TODO This condition is here because the eventual callback called when the
461
+ // player state is updated can launch a new content, thus the error will not
462
+ // be here anymore, in which case triggering the "error" event is unwanted.
463
+ // This is very ugly though, and we should probable have a better solution
464
+ if (_this._priv_currentError === formattedError) {
465
+ _this.trigger("error", formattedError);
466
+ }
467
+ });
468
+ initializer.addEventListener("warning", function (error) {
469
+ var formattedError = formatError(error, {
470
+ defaultCode: "NONE",
471
+ defaultReason: "An unknown error happened.",
517
472
  });
518
- var directfileInit$ = features.directfile.initDirectFile({ autoPlay: autoPlay, keySystems: keySystems, mediaElement: videoElement,
519
- speed: this._priv_speed, playbackObserver: playbackObserver, startAt: startAt, url: url })
520
- .pipe(takeUntil(stoppedContent$));
521
- playback$ = connectable(directfileInit$, { connector: function () { return new Subject(); },
522
- resetOnDisconnect: false });
523
- }
524
- /** Emit an object when the player "stalls" and null when it un-stalls */
525
- var stalled$ = playback$.pipe(filter(function (evt) { return evt.type === "stalled" ||
526
- evt.type === "unstalled"; }), map(function (x) { return x.value; }), distinctUntilChanged(function (prevStallReason, currStallReason) {
527
- return prevStallReason === null && currStallReason === null ||
528
- (prevStallReason !== null && currStallReason !== null &&
529
- prevStallReason === currStallReason);
530
- }));
531
- /** Emit when the content is considered "loaded". */
532
- var loaded$ = playback$.pipe(filter(function (evt) { return evt.type === "loaded"; }), share());
533
- /** Emit when we will "reload" the MediaSource. */
534
- var reloading$ = playback$
535
- .pipe(filter(function (evt) {
536
- return evt.type === "reloading-media-source";
537
- }), share());
538
- /** Emit when the media element emits a "seeking" event. */
539
- var observation$ = playbackObserver.getReference().asObservable();
540
- var stateChangingEvent$ = observation$.pipe(filter(function (o) {
541
- return o.event === "seeking" || o.event === "ended" ||
542
- o.event === "play" || o.event === "pause";
543
- }));
544
- /** Emit state updates once the content is considered "loaded". */
545
- var loadedStateUpdates$ = observableCombineLatest([
546
- stalled$.pipe(startWith(null)),
547
- stateChangingEvent$.pipe(startWith(null)),
548
- ]).pipe(takeUntil(stoppedContent$), map(function (_a) {
549
- var stalledStatus = _a[0];
550
- return getLoadedContentState(videoElement, stalledStatus);
551
- }));
552
- /** Emit all player "state" updates. */
553
- var playerState$ = observableConcat(observableOf("LOADING" /* PLAYER_STATES.LOADING */), // Begin with LOADING
554
- loaded$.pipe(switchMap(function (_, i) {
555
- var isFirstLoad = i === 0;
556
- return observableMerge(
557
- // Purposely subscribed first so a RELOADING triggered synchronously
558
- // after a LOADED state is catched.
559
- reloading$.pipe(map(function () { return "RELOADING" /* PLAYER_STATES.RELOADING */; })),
560
- // Only switch to LOADED state for the first (i.e. non-RELOADING) load
561
- isFirstLoad ? observableOf("LOADED" /* PLAYER_STATES.LOADED */) :
562
- EMPTY,
563
- // Purposely put last so any other state change happens after we've
564
- // already switched to LOADED
565
- loadedStateUpdates$.pipe(takeUntil(reloading$),
566
- // For the first load, we prefer staying at the LOADED state over
567
- // PAUSED when autoPlay is disabled.
568
- // For consecutive loads however, there's no LOADED state.
569
- skipWhile(function (state) { return isFirstLoad && state === "PAUSED" /* PLAYER_STATES.PAUSED */; })));
570
- }))).pipe(distinctUntilChanged());
571
- var playbackSubscription;
572
- stoppedContent$.subscribe(function () {
573
- if (playbackSubscription !== undefined) {
574
- playbackSubscription.unsubscribe();
473
+ log.warn("API: Sending warning:", formattedError);
474
+ _this.trigger("warning", formattedError);
475
+ });
476
+ initializer.addEventListener("reloadingMediaSource", function () {
477
+ contentInfos.segmentBuffersStore = null;
478
+ if (contentInfos.trackChoiceManager !== null) {
479
+ contentInfos.trackChoiceManager.resetPeriods();
575
480
  }
576
481
  });
482
+ initializer.addEventListener("inbandEvents", function (inbandEvents) {
483
+ return _this.trigger("inbandEvents", inbandEvents);
484
+ });
485
+ initializer.addEventListener("streamEvent", function (streamEvent) {
486
+ return _this.trigger("streamEvent", streamEvent);
487
+ });
488
+ initializer.addEventListener("streamEventSkip", function (streamEventSkip) {
489
+ return _this.trigger("streamEventSkip", streamEventSkip);
490
+ });
491
+ initializer.addEventListener("decipherabilityUpdate", function (decipherabilityUpdate) {
492
+ return _this.trigger("decipherabilityUpdate", decipherabilityUpdate);
493
+ });
494
+ initializer.addEventListener("activePeriodChanged", function (periodInfo) {
495
+ return _this._priv_onActivePeriodChanged(contentInfos, periodInfo);
496
+ });
497
+ initializer.addEventListener("periodStreamReady", function (periodReadyInfo) {
498
+ return _this._priv_onPeriodStreamReady(contentInfos, periodReadyInfo);
499
+ });
500
+ initializer.addEventListener("periodStreamCleared", function (periodClearedInfo) {
501
+ return _this._priv_onPeriodStreamCleared(contentInfos, periodClearedInfo);
502
+ });
503
+ initializer.addEventListener("representationChange", function (representationInfo) {
504
+ return _this._priv_onRepresentationChange(contentInfos, representationInfo);
505
+ });
506
+ initializer.addEventListener("adaptationChange", function (adaptationInfo) {
507
+ return _this._priv_onAdaptationChange(contentInfos, adaptationInfo);
508
+ });
509
+ initializer.addEventListener("bitrateEstimationChange", function (bitrateEstimationInfo) {
510
+ return _this._priv_onBitrateEstimationChange(bitrateEstimationInfo);
511
+ });
512
+ initializer.addEventListener("manifestReady", function (manifest) {
513
+ return _this._priv_onManifestReady(contentInfos, manifest);
514
+ });
515
+ initializer.addEventListener("loaded", function (evt) {
516
+ contentInfos.segmentBuffersStore = evt.segmentBuffersStore;
517
+ });
518
+ initializer.addEventListener("addedSegment", function (evt) {
519
+ // Manage image tracks
520
+ // @deprecated
521
+ var content = evt.content, segmentData = evt.segmentData;
522
+ if (content.adaptation.type === "image") {
523
+ if (!isNullOrUndefined(segmentData) &&
524
+ segmentData.type === "bif") {
525
+ var imageData = segmentData.data;
526
+ /* eslint-disable import/no-deprecated */
527
+ contentInfos.thumbnails = imageData;
528
+ _this.trigger("imageTrackUpdate", { data: contentInfos.thumbnails });
529
+ /* eslint-enable import/no-deprecated */
530
+ }
531
+ }
532
+ });
533
+ // Now, that most events are linked, prepare the next content.
534
+ initializer.prepare();
535
+ // Now that the content is prepared, stop previous content and reset state
536
+ // This is done after content preparation as `stop` could technically have
537
+ // a long and synchronous blocking time.
538
+ // Note that this call is done **synchronously** after all events linking.
539
+ // This is **VERY** important so:
540
+ // - the `STOPPED` state is switched to synchronously after loading a new
541
+ // content.
542
+ // - we can avoid involontarily catching events linked to the previous
543
+ // content.
544
+ this.stop();
545
+ /** Global "playback observer" which will emit playback conditions */
546
+ var playbackObserver = new PlaybackObserver(videoElement, {
547
+ withMediaSource: !isDirectFile,
548
+ lowLatencyMode: lowLatencyMode,
549
+ });
550
+ currentContentCanceller.signal.register(function () {
551
+ playbackObserver.stop();
552
+ });
553
+ // Update the RxPlayer's state at the right events
554
+ var playerStateRef = constructPlayerStateReference(initializer, videoElement, playbackObserver, currentContentCanceller.signal);
555
+ currentContentCanceller.signal.register(function () {
556
+ initializer.dispose();
557
+ });
577
558
  /**
578
559
  * Function updating `this._priv_reloadingMetadata` in function of the
579
560
  * current state and playback conditions.
@@ -598,44 +579,55 @@ var Player = /** @class */ (function (_super) {
598
579
  break;
599
580
  }
600
581
  };
601
- playerState$.pipe(tap(function (newState) {
582
+ /**
583
+ * `TaskCanceller` allowing to stop emitting `"seeking"` and `"seeked"`
584
+ * events.
585
+ * `null` when such events are not emitted currently.
586
+ */
587
+ var seekEventsCanceller = null;
588
+ // React to player state change
589
+ playerStateRef.onUpdate(function (newState) {
602
590
  updateReloadingMetadata(newState);
603
591
  _this._priv_setPlayerState(newState);
592
+ if (currentContentCanceller.isUsed) {
593
+ return;
594
+ }
595
+ if (seekEventsCanceller !== null) {
596
+ if (!isLoadedState(_this.state)) {
597
+ seekEventsCanceller.cancel();
598
+ seekEventsCanceller = null;
599
+ }
600
+ }
601
+ else if (isLoadedState(_this.state)) {
602
+ seekEventsCanceller = new TaskCanceller({
603
+ cancelOn: currentContentCanceller.signal,
604
+ });
605
+ emitSeekEvents(videoElement, playbackObserver, function () { return _this.trigger("seeking", null); }, function () { return _this.trigger("seeked", null); }, seekEventsCanceller.signal);
606
+ }
604
607
  // Previous call could have performed all kind of side-effects, thus,
605
608
  // we re-check the current state associated to the RxPlayer
606
- if (_this.state === "ENDED" && _this._priv_stopAtEnd) {
609
+ if (_this.state === "ENDED" /* PLAYER_STATES.ENDED */ && _this._priv_stopAtEnd) {
607
610
  currentContentCanceller.cancel();
608
611
  }
609
- }), map(function (state) { return state !== "RELOADING" && state !== "STOPPED"; }), distinctUntilChanged(), switchMap(function (canSendObservation) { return canSendObservation ? observation$ :
610
- EMPTY; }), takeUntil(stoppedContent$)).subscribe(function (o) {
612
+ }, { emitCurrentValue: true, clearSignal: currentContentCanceller.signal });
613
+ // React to playback conditions change
614
+ playbackObserver.listen(function (observation) {
611
615
  updateReloadingMetadata(_this.state);
612
- _this._priv_triggerPositionUpdate(o);
613
- });
614
- // Link "seeking" and "seeked" events (once the content is loaded)
615
- loaded$.pipe(switchMap(function () { return emitSeekEvents(_this.videoElement, observation$); }), takeUntil(stoppedContent$)).subscribe(function (evt) {
616
- log.info("API: Triggering \"".concat(evt, "\" event"));
617
- _this.trigger(evt, null);
618
- });
619
- // Link playback events to the corresponding callbacks
620
- playback$.subscribe({
621
- next: function (x) { return _this._priv_onPlaybackEvent(x); },
622
- error: function (err) { return _this._priv_onPlaybackError(err); },
623
- complete: function () {
624
- if (!contentInfos.currentContentCanceller.isUsed) {
625
- log.info("API: Previous playback finished. Stopping and cleaning-up...");
626
- contentInfos.currentContentCanceller.cancel();
627
- _this._priv_cleanUpCurrentContentState();
628
- _this._priv_setPlayerState("STOPPED" /* PLAYER_STATES.STOPPED */);
629
- }
630
- },
616
+ _this._priv_triggerPositionUpdate(contentInfos, observation);
617
+ }, { clearSignal: currentContentCanceller.signal });
618
+ this._priv_currentError = null;
619
+ this._priv_contentInfos = contentInfos;
620
+ currentContentCanceller.signal.register(function () {
621
+ initializer.removeEventListener();
631
622
  });
632
623
  // initialize the content only when the lock is inactive
633
- this._priv_contentLock.asObservable()
634
- .pipe(filter(function (isLocked) { return !isLocked; }), take(1), takeUntil(stoppedContent$))
635
- .subscribe(function () {
636
- // start playback!
637
- playbackSubscription = playback$.connect();
638
- });
624
+ this._priv_contentLock.onUpdate(function (isLocked, stopListeningToLock) {
625
+ if (!isLocked) {
626
+ stopListeningToLock();
627
+ // start playback!
628
+ initializer.start(videoElement, playbackObserver);
629
+ }
630
+ }, { emitCurrentValue: true, clearSignal: currentContentCanceller.signal });
639
631
  };
640
632
  /**
641
633
  * Returns fatal error if one for the current content.
@@ -755,7 +747,8 @@ var Player = /** @class */ (function (_super) {
755
747
  return this._priv_preferTrickModeTracks;
756
748
  };
757
749
  /**
758
- * Returns the url of the content's manifest
750
+ * Returns the url of the currently considered Manifest, or of the content for
751
+ * directfile content.
759
752
  * @returns {string|undefined} - Current URL. `undefined` if not known or no
760
753
  * URL yet.
761
754
  */
@@ -763,15 +756,30 @@ var Player = /** @class */ (function (_super) {
763
756
  if (this._priv_contentInfos === null) {
764
757
  return undefined;
765
758
  }
766
- var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, manifest = _a.manifest, url = _a.url;
759
+ var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, manifest = _a.manifest, originalUrl = _a.originalUrl;
767
760
  if (isDirectFile) {
768
- return url;
761
+ return originalUrl;
769
762
  }
770
763
  if (manifest !== null) {
771
764
  return manifest.getUrl();
772
765
  }
773
766
  return undefined;
774
767
  };
768
+ /**
769
+ * Update URL of the content currently being played (e.g. DASH's MPD).
770
+ * @param {Array.<string>|undefined} urls - URLs to reach that content /
771
+ * Manifest from the most prioritized URL to the least prioritized URL.
772
+ * @param {Object|undefined} [params]
773
+ * @param {boolean} params.refresh - If `true` the resource in question
774
+ * (e.g. DASH's MPD) will be refreshed immediately.
775
+ */
776
+ Player.prototype.updateContentUrls = function (urls, params) {
777
+ if (this._priv_contentInfos === null) {
778
+ throw new Error("No content loaded");
779
+ }
780
+ var refreshNow = (params === null || params === void 0 ? void 0 : params.refresh) === true;
781
+ this._priv_contentInfos.initializer.updateContentUrls(urls, refreshNow);
782
+ };
775
783
  /**
776
784
  * Returns the video duration, in seconds.
777
785
  * NaN if no video is playing.
@@ -938,6 +946,7 @@ var Player = /** @class */ (function (_super) {
938
946
  * @param {Object} opts
939
947
  */
940
948
  Player.prototype.setPlaybackRate = function (rate, opts) {
949
+ var _a;
941
950
  if (rate !== this._priv_speed.getValue()) {
942
951
  this._priv_speed.setValue(rate);
943
952
  }
@@ -946,14 +955,13 @@ var Player = /** @class */ (function (_super) {
946
955
  return;
947
956
  }
948
957
  this._priv_preferTrickModeTracks = preferTrickModeTracks;
949
- if (this._priv_trackChoiceManager !== null) {
950
- if (preferTrickModeTracks &&
951
- !this._priv_trackChoiceManager.isTrickModeEnabled()) {
952
- this._priv_trackChoiceManager.enableVideoTrickModeTracks();
958
+ var trackChoiceManager = (_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.trackChoiceManager;
959
+ if (!isNullOrUndefined(trackChoiceManager)) {
960
+ if (preferTrickModeTracks && !trackChoiceManager.isTrickModeEnabled()) {
961
+ trackChoiceManager.enableVideoTrickModeTracks();
953
962
  }
954
- else if (!preferTrickModeTracks &&
955
- this._priv_trackChoiceManager.isTrickModeEnabled()) {
956
- this._priv_trackChoiceManager.disableVideoTrickModeTracks();
963
+ else if (!preferTrickModeTracks && trackChoiceManager.isTrickModeEnabled()) {
964
+ trackChoiceManager.disableVideoTrickModeTracks();
957
965
  }
958
966
  }
959
967
  };
@@ -1378,54 +1386,54 @@ var Player = /** @class */ (function (_super) {
1378
1386
  * @returns {Array.<Object>|null}
1379
1387
  */
1380
1388
  Player.prototype.getAvailableAudioTracks = function () {
1381
- var _a, _b;
1389
+ var _a;
1382
1390
  if (this._priv_contentInfos === null) {
1383
1391
  return [];
1384
1392
  }
1385
- var _c = this._priv_contentInfos, currentPeriod = _c.currentPeriod, isDirectFile = _c.isDirectFile;
1393
+ var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile, trackChoiceManager = _b.trackChoiceManager, mediaElementTrackChoiceManager = _b.mediaElementTrackChoiceManager;
1386
1394
  if (isDirectFile) {
1387
- return (_b = (_a = this._priv_mediaElementTrackChoiceManager) === null || _a === void 0 ? void 0 : _a.getAvailableAudioTracks()) !== null && _b !== void 0 ? _b : [];
1395
+ return (_a = mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.getAvailableAudioTracks()) !== null && _a !== void 0 ? _a : [];
1388
1396
  }
1389
- if (this._priv_trackChoiceManager === null || currentPeriod === null) {
1397
+ if (trackChoiceManager === null || currentPeriod === null) {
1390
1398
  return [];
1391
1399
  }
1392
- return this._priv_trackChoiceManager.getAvailableAudioTracks(currentPeriod);
1400
+ return trackChoiceManager.getAvailableAudioTracks(currentPeriod);
1393
1401
  };
1394
1402
  /**
1395
1403
  * Returns every available text tracks for the current Period.
1396
1404
  * @returns {Array.<Object>|null}
1397
1405
  */
1398
1406
  Player.prototype.getAvailableTextTracks = function () {
1399
- var _a, _b;
1407
+ var _a;
1400
1408
  if (this._priv_contentInfos === null) {
1401
1409
  return [];
1402
1410
  }
1403
- var _c = this._priv_contentInfos, currentPeriod = _c.currentPeriod, isDirectFile = _c.isDirectFile;
1411
+ var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile, trackChoiceManager = _b.trackChoiceManager, mediaElementTrackChoiceManager = _b.mediaElementTrackChoiceManager;
1404
1412
  if (isDirectFile) {
1405
- return (_b = (_a = this._priv_mediaElementTrackChoiceManager) === null || _a === void 0 ? void 0 : _a.getAvailableTextTracks()) !== null && _b !== void 0 ? _b : [];
1413
+ return (_a = mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.getAvailableTextTracks()) !== null && _a !== void 0 ? _a : [];
1406
1414
  }
1407
- if (this._priv_trackChoiceManager === null || currentPeriod === null) {
1415
+ if (trackChoiceManager === null || currentPeriod === null) {
1408
1416
  return [];
1409
1417
  }
1410
- return this._priv_trackChoiceManager.getAvailableTextTracks(currentPeriod);
1418
+ return trackChoiceManager.getAvailableTextTracks(currentPeriod);
1411
1419
  };
1412
1420
  /**
1413
1421
  * Returns every available video tracks for the current Period.
1414
1422
  * @returns {Array.<Object>|null}
1415
1423
  */
1416
1424
  Player.prototype.getAvailableVideoTracks = function () {
1417
- var _a, _b;
1425
+ var _a;
1418
1426
  if (this._priv_contentInfos === null) {
1419
1427
  return [];
1420
1428
  }
1421
- var _c = this._priv_contentInfos, currentPeriod = _c.currentPeriod, isDirectFile = _c.isDirectFile;
1429
+ var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile, trackChoiceManager = _b.trackChoiceManager, mediaElementTrackChoiceManager = _b.mediaElementTrackChoiceManager;
1422
1430
  if (isDirectFile) {
1423
- return (_b = (_a = this._priv_mediaElementTrackChoiceManager) === null || _a === void 0 ? void 0 : _a.getAvailableVideoTracks()) !== null && _b !== void 0 ? _b : [];
1431
+ return (_a = mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.getAvailableVideoTracks()) !== null && _a !== void 0 ? _a : [];
1424
1432
  }
1425
- if (this._priv_trackChoiceManager === null || currentPeriod === null) {
1433
+ if (trackChoiceManager === null || currentPeriod === null) {
1426
1434
  return [];
1427
1435
  }
1428
- return this._priv_trackChoiceManager.getAvailableVideoTracks(currentPeriod);
1436
+ return trackChoiceManager.getAvailableVideoTracks(currentPeriod);
1429
1437
  };
1430
1438
  /**
1431
1439
  * Returns currently chosen audio language for the current Period.
@@ -1435,17 +1443,17 @@ var Player = /** @class */ (function (_super) {
1435
1443
  if (this._priv_contentInfos === null) {
1436
1444
  return undefined;
1437
1445
  }
1438
- var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile;
1446
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1439
1447
  if (isDirectFile) {
1440
- if (this._priv_mediaElementTrackChoiceManager === null) {
1448
+ if (mediaElementTrackChoiceManager === null) {
1441
1449
  return undefined;
1442
1450
  }
1443
- return this._priv_mediaElementTrackChoiceManager.getChosenAudioTrack();
1451
+ return mediaElementTrackChoiceManager.getChosenAudioTrack();
1444
1452
  }
1445
- if (this._priv_trackChoiceManager === null || currentPeriod === null) {
1453
+ if (trackChoiceManager === null || currentPeriod === null) {
1446
1454
  return undefined;
1447
1455
  }
1448
- return this._priv_trackChoiceManager.getChosenAudioTrack(currentPeriod);
1456
+ return trackChoiceManager.getChosenAudioTrack(currentPeriod);
1449
1457
  };
1450
1458
  /**
1451
1459
  * Returns currently chosen subtitle for the current Period.
@@ -1455,17 +1463,17 @@ var Player = /** @class */ (function (_super) {
1455
1463
  if (this._priv_contentInfos === null) {
1456
1464
  return undefined;
1457
1465
  }
1458
- var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile;
1466
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1459
1467
  if (isDirectFile) {
1460
- if (this._priv_mediaElementTrackChoiceManager === null) {
1468
+ if (mediaElementTrackChoiceManager === null) {
1461
1469
  return undefined;
1462
1470
  }
1463
- return this._priv_mediaElementTrackChoiceManager.getChosenTextTrack();
1471
+ return mediaElementTrackChoiceManager.getChosenTextTrack();
1464
1472
  }
1465
- if (this._priv_trackChoiceManager === null || currentPeriod === null) {
1473
+ if (trackChoiceManager === null || currentPeriod === null) {
1466
1474
  return undefined;
1467
1475
  }
1468
- return this._priv_trackChoiceManager.getChosenTextTrack(currentPeriod);
1476
+ return trackChoiceManager.getChosenTextTrack(currentPeriod);
1469
1477
  };
1470
1478
  /**
1471
1479
  * Returns currently chosen video track for the current Period.
@@ -1475,17 +1483,17 @@ var Player = /** @class */ (function (_super) {
1475
1483
  if (this._priv_contentInfos === null) {
1476
1484
  return undefined;
1477
1485
  }
1478
- var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile;
1486
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1479
1487
  if (isDirectFile) {
1480
- if (this._priv_mediaElementTrackChoiceManager === null) {
1488
+ if (mediaElementTrackChoiceManager === null) {
1481
1489
  return undefined;
1482
1490
  }
1483
- return this._priv_mediaElementTrackChoiceManager.getChosenVideoTrack();
1491
+ return mediaElementTrackChoiceManager.getChosenVideoTrack();
1484
1492
  }
1485
- if (this._priv_trackChoiceManager === null || currentPeriod === null) {
1493
+ if (trackChoiceManager === null || currentPeriod === null) {
1486
1494
  return undefined;
1487
1495
  }
1488
- return this._priv_trackChoiceManager.getChosenVideoTrack(currentPeriod);
1496
+ return trackChoiceManager.getChosenVideoTrack(currentPeriod);
1489
1497
  };
1490
1498
  /**
1491
1499
  * Update the audio language for the current Period.
@@ -1494,25 +1502,24 @@ var Player = /** @class */ (function (_super) {
1494
1502
  * @throws Error - the given id is linked to no audio track.
1495
1503
  */
1496
1504
  Player.prototype.setAudioTrack = function (audioId) {
1497
- var _a;
1498
1505
  if (this._priv_contentInfos === null) {
1499
1506
  throw new Error("No content loaded");
1500
1507
  }
1501
- var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile;
1508
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1502
1509
  if (isDirectFile) {
1503
1510
  try {
1504
- (_a = this._priv_mediaElementTrackChoiceManager) === null || _a === void 0 ? void 0 : _a.setAudioTrackById(audioId);
1511
+ mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.setAudioTrackById(audioId);
1505
1512
  return;
1506
1513
  }
1507
1514
  catch (e) {
1508
1515
  throw new Error("player: unknown audio track");
1509
1516
  }
1510
1517
  }
1511
- if (this._priv_trackChoiceManager === null || currentPeriod === null) {
1518
+ if (trackChoiceManager === null || currentPeriod === null) {
1512
1519
  throw new Error("No compatible content launched.");
1513
1520
  }
1514
1521
  try {
1515
- this._priv_trackChoiceManager.setAudioTrackByID(currentPeriod, audioId);
1522
+ trackChoiceManager.setAudioTrackByID(currentPeriod, audioId);
1516
1523
  }
1517
1524
  catch (e) {
1518
1525
  throw new Error("player: unknown audio track");
@@ -1525,25 +1532,24 @@ var Player = /** @class */ (function (_super) {
1525
1532
  * @throws Error - the given id is linked to no text track.
1526
1533
  */
1527
1534
  Player.prototype.setTextTrack = function (textId) {
1528
- var _a;
1529
1535
  if (this._priv_contentInfos === null) {
1530
1536
  throw new Error("No content loaded");
1531
1537
  }
1532
- var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile;
1538
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1533
1539
  if (isDirectFile) {
1534
1540
  try {
1535
- (_a = this._priv_mediaElementTrackChoiceManager) === null || _a === void 0 ? void 0 : _a.setTextTrackById(textId);
1541
+ mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.setTextTrackById(textId);
1536
1542
  return;
1537
1543
  }
1538
1544
  catch (e) {
1539
1545
  throw new Error("player: unknown text track");
1540
1546
  }
1541
1547
  }
1542
- if (this._priv_trackChoiceManager === null || currentPeriod === null) {
1548
+ if (trackChoiceManager === null || currentPeriod === null) {
1543
1549
  throw new Error("No compatible content launched.");
1544
1550
  }
1545
1551
  try {
1546
- this._priv_trackChoiceManager.setTextTrackByID(currentPeriod, textId);
1552
+ trackChoiceManager.setTextTrackByID(currentPeriod, textId);
1547
1553
  }
1548
1554
  catch (e) {
1549
1555
  throw new Error("player: unknown text track");
@@ -1553,19 +1559,18 @@ var Player = /** @class */ (function (_super) {
1553
1559
  * Disable subtitles for the current content.
1554
1560
  */
1555
1561
  Player.prototype.disableTextTrack = function () {
1556
- var _a;
1557
1562
  if (this._priv_contentInfos === null) {
1558
1563
  return;
1559
1564
  }
1560
- var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile;
1565
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1561
1566
  if (isDirectFile) {
1562
- (_a = this._priv_mediaElementTrackChoiceManager) === null || _a === void 0 ? void 0 : _a.disableTextTrack();
1567
+ mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.disableTextTrack();
1563
1568
  return;
1564
1569
  }
1565
- if (this._priv_trackChoiceManager === null || currentPeriod === null) {
1570
+ if (trackChoiceManager === null || currentPeriod === null) {
1566
1571
  return;
1567
1572
  }
1568
- return this._priv_trackChoiceManager.disableTextTrack(currentPeriod);
1573
+ return trackChoiceManager.disableTextTrack(currentPeriod);
1569
1574
  };
1570
1575
  /**
1571
1576
  * Update the video track for the current Period.
@@ -1574,25 +1579,24 @@ var Player = /** @class */ (function (_super) {
1574
1579
  * @throws Error - the given id is linked to no video track.
1575
1580
  */
1576
1581
  Player.prototype.setVideoTrack = function (videoId) {
1577
- var _a;
1578
1582
  if (this._priv_contentInfos === null) {
1579
1583
  throw new Error("No content loaded");
1580
1584
  }
1581
- var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile;
1585
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1582
1586
  if (isDirectFile) {
1583
1587
  try {
1584
- (_a = this._priv_mediaElementTrackChoiceManager) === null || _a === void 0 ? void 0 : _a.setVideoTrackById(videoId);
1588
+ mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.setVideoTrackById(videoId);
1585
1589
  return;
1586
1590
  }
1587
1591
  catch (e) {
1588
1592
  throw new Error("player: unknown video track");
1589
1593
  }
1590
1594
  }
1591
- if (this._priv_trackChoiceManager === null || currentPeriod === null) {
1595
+ if (trackChoiceManager === null || currentPeriod === null) {
1592
1596
  throw new Error("No compatible content launched.");
1593
1597
  }
1594
1598
  try {
1595
- this._priv_trackChoiceManager.setVideoTrackByID(currentPeriod, videoId);
1599
+ trackChoiceManager.setVideoTrackByID(currentPeriod, videoId);
1596
1600
  }
1597
1601
  catch (e) {
1598
1602
  throw new Error("player: unknown video track");
@@ -1605,14 +1609,14 @@ var Player = /** @class */ (function (_super) {
1605
1609
  if (this._priv_contentInfos === null) {
1606
1610
  return;
1607
1611
  }
1608
- var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile;
1609
- if (isDirectFile && this._priv_mediaElementTrackChoiceManager !== null) {
1610
- return this._priv_mediaElementTrackChoiceManager.disableVideoTrack();
1612
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1613
+ if (isDirectFile && mediaElementTrackChoiceManager !== null) {
1614
+ return mediaElementTrackChoiceManager.disableVideoTrack();
1611
1615
  }
1612
- if (this._priv_trackChoiceManager === null || currentPeriod === null) {
1616
+ if (trackChoiceManager === null || currentPeriod === null) {
1613
1617
  return;
1614
1618
  }
1615
- return this._priv_trackChoiceManager.disableVideoTrack(currentPeriod);
1619
+ return trackChoiceManager.disableVideoTrack(currentPeriod);
1616
1620
  };
1617
1621
  /**
1618
1622
  * Returns the current list of preferred audio tracks, in preference order.
@@ -1649,11 +1653,12 @@ var Player = /** @class */ (function (_super) {
1649
1653
  "Should have been an Array.");
1650
1654
  }
1651
1655
  this._priv_preferredAudioTracks = tracks;
1652
- if (this._priv_trackChoiceManager !== null) {
1653
- this._priv_trackChoiceManager.setPreferredAudioTracks(tracks, shouldApply);
1656
+ var contentInfos = this._priv_contentInfos;
1657
+ if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager)) {
1658
+ contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager.setPreferredAudioTracks(tracks, shouldApply);
1654
1659
  }
1655
- else if (this._priv_mediaElementTrackChoiceManager !== null) {
1656
- this._priv_mediaElementTrackChoiceManager.setPreferredAudioTracks(tracks, shouldApply);
1660
+ else if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager)) {
1661
+ contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager.setPreferredAudioTracks(tracks, shouldApply);
1657
1662
  }
1658
1663
  };
1659
1664
  /**
@@ -1670,11 +1675,12 @@ var Player = /** @class */ (function (_super) {
1670
1675
  "Should have been an Array.");
1671
1676
  }
1672
1677
  this._priv_preferredTextTracks = tracks;
1673
- if (this._priv_trackChoiceManager !== null) {
1674
- this._priv_trackChoiceManager.setPreferredTextTracks(tracks, shouldApply);
1678
+ var contentInfos = this._priv_contentInfos;
1679
+ if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager)) {
1680
+ contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager.setPreferredTextTracks(tracks, shouldApply);
1675
1681
  }
1676
- else if (this._priv_mediaElementTrackChoiceManager !== null) {
1677
- this._priv_mediaElementTrackChoiceManager.setPreferredTextTracks(tracks, shouldApply);
1682
+ else if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager)) {
1683
+ contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager.setPreferredTextTracks(tracks, shouldApply);
1678
1684
  }
1679
1685
  };
1680
1686
  /**
@@ -1691,11 +1697,12 @@ var Player = /** @class */ (function (_super) {
1691
1697
  "Should have been an Array.");
1692
1698
  }
1693
1699
  this._priv_preferredVideoTracks = tracks;
1694
- if (this._priv_trackChoiceManager !== null) {
1695
- this._priv_trackChoiceManager.setPreferredVideoTracks(tracks, shouldApply);
1700
+ var contentInfos = this._priv_contentInfos;
1701
+ if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager)) {
1702
+ contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager.setPreferredVideoTracks(tracks, shouldApply);
1696
1703
  }
1697
- else if (this._priv_mediaElementTrackChoiceManager !== null) {
1698
- this._priv_mediaElementTrackChoiceManager.setPreferredVideoTracks(tracks, shouldApply);
1704
+ else if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager)) {
1705
+ contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager.setPreferredVideoTracks(tracks, shouldApply);
1699
1706
  }
1700
1707
  };
1701
1708
  /**
@@ -1776,14 +1783,12 @@ var Player = /** @class */ (function (_super) {
1776
1783
  */
1777
1784
  Player.prototype._priv_cleanUpCurrentContentState = function () {
1778
1785
  var _this = this;
1779
- var _a;
1786
+ var _a, _b;
1780
1787
  log.debug("Locking `contentLock` to clean-up the current content.");
1781
1788
  // lock playback of new contents while cleaning up is pending
1782
1789
  this._priv_contentLock.setValue(true);
1790
+ (_b = (_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.mediaElementTrackChoiceManager) === null || _b === void 0 ? void 0 : _b.dispose();
1783
1791
  this._priv_contentInfos = null;
1784
- this._priv_trackChoiceManager = null;
1785
- (_a = this._priv_mediaElementTrackChoiceManager) === null || _a === void 0 ? void 0 : _a.dispose();
1786
- this._priv_mediaElementTrackChoiceManager = null;
1787
1792
  this._priv_contentEventsMemory = {};
1788
1793
  // DRM-related clean-up
1789
1794
  var freeUpContentLock = function () {
@@ -1807,153 +1812,61 @@ var Player = /** @class */ (function (_super) {
1807
1812
  freeUpContentLock();
1808
1813
  }
1809
1814
  };
1810
- /**
1811
- * Triggered each time the playback Observable emits.
1812
- *
1813
- * React to various events.
1814
- *
1815
- * @param {Object} event - payload emitted
1816
- */
1817
- Player.prototype._priv_onPlaybackEvent = function (event) {
1818
- switch (event.type) {
1819
- case "inband-events":
1820
- var inbandEvents = event.value;
1821
- this.trigger("inbandEvents", inbandEvents);
1822
- return;
1823
- case "stream-event":
1824
- this.trigger("streamEvent", event.value);
1825
- break;
1826
- case "stream-event-skip":
1827
- this.trigger("streamEventSkip", event.value);
1828
- break;
1829
- case "activePeriodChanged":
1830
- this._priv_onActivePeriodChanged(event.value);
1831
- break;
1832
- case "periodStreamReady":
1833
- this._priv_onPeriodStreamReady(event.value);
1834
- break;
1835
- case "periodStreamCleared":
1836
- this._priv_onPeriodStreamCleared(event.value);
1837
- break;
1838
- case "reloading-media-source":
1839
- this._priv_onReloadingMediaSource();
1840
- break;
1841
- case "representationChange":
1842
- this._priv_onRepresentationChange(event.value);
1843
- break;
1844
- case "adaptationChange":
1845
- this._priv_onAdaptationChange(event.value);
1846
- break;
1847
- case "bitrateEstimationChange":
1848
- this._priv_onBitrateEstimationChange(event.value);
1849
- break;
1850
- case "manifestReady":
1851
- this._priv_onManifestReady(event.value);
1852
- break;
1853
- case "warning":
1854
- this._priv_onPlaybackWarning(event.value);
1855
- break;
1856
- case "loaded":
1857
- if (this._priv_contentInfos === null) {
1858
- log.error("API: Loaded event while no content is loaded");
1859
- return;
1860
- }
1861
- this._priv_contentInfos.segmentBuffersStore = event.value.segmentBuffersStore;
1862
- break;
1863
- case "decipherabilityUpdate":
1864
- this.trigger("decipherabilityUpdate", event.value);
1865
- break;
1866
- case "added-segment":
1867
- if (this._priv_contentInfos === null) {
1868
- log.error("API: Added segment while no content is loaded");
1869
- return;
1870
- }
1871
- // Manage image tracks
1872
- // @deprecated
1873
- var _a = event.value, content = _a.content, segmentData = _a.segmentData;
1874
- if (content.adaptation.type === "image") {
1875
- if (!isNullOrUndefined(segmentData) &&
1876
- segmentData.type === "bif") {
1877
- var imageData = segmentData.data;
1878
- /* eslint-disable import/no-deprecated */
1879
- this._priv_contentInfos.thumbnails = imageData;
1880
- this.trigger("imageTrackUpdate", { data: this._priv_contentInfos.thumbnails });
1881
- /* eslint-enable import/no-deprecated */
1882
- }
1883
- }
1884
- }
1885
- };
1886
- /**
1887
- * Triggered when we received a fatal error.
1888
- * Clean-up ressources and signal that the content has stopped on error.
1889
- * @param {Error} error
1890
- */
1891
- Player.prototype._priv_onPlaybackError = function (error) {
1892
- var formattedError = formatError(error, {
1893
- defaultCode: "NONE",
1894
- defaultReason: "An unknown error stopped content playback.",
1895
- });
1896
- formattedError.fatal = true;
1897
- if (this._priv_contentInfos !== null) {
1898
- this._priv_contentInfos.currentContentCanceller.cancel();
1899
- }
1900
- this._priv_cleanUpCurrentContentState();
1901
- this._priv_currentError = formattedError;
1902
- log.error("API: The player stopped because of an error", error instanceof Error ? error : "");
1903
- this._priv_setPlayerState("STOPPED" /* PLAYER_STATES.STOPPED */);
1904
- // TODO This condition is here because the eventual callback called when the
1905
- // player state is updated can launch a new content, thus the error will not
1906
- // be here anymore, in which case triggering the "error" event is unwanted.
1907
- // This is very ugly though, and we should probable have a better solution
1908
- if (this._priv_currentError === formattedError) {
1909
- this.trigger("error", formattedError);
1910
- }
1911
- };
1912
- /**
1913
- * Triggered when we received a warning event during playback.
1914
- * Trigger the right API event.
1915
- * @param {Error} error
1916
- */
1917
- Player.prototype._priv_onPlaybackWarning = function (error) {
1918
- var formattedError = formatError(error, {
1919
- defaultCode: "NONE",
1920
- defaultReason: "An unknown error happened.",
1921
- });
1922
- log.warn("API: Sending warning:", formattedError);
1923
- this.trigger("warning", formattedError);
1924
- };
1925
1815
  /**
1926
1816
  * Triggered when the Manifest has been loaded for the current content.
1927
1817
  * Initialize various private properties and emit initial event.
1928
- * @param {Object} value
1818
+ * @param {Object} contentInfos
1819
+ * @param {Object} manifest
1929
1820
  */
1930
- Player.prototype._priv_onManifestReady = function (_a) {
1821
+ Player.prototype._priv_onManifestReady = function (contentInfos, manifest) {
1931
1822
  var _this = this;
1932
- var manifest = _a.manifest;
1933
- var contentInfos = this._priv_contentInfos;
1934
- if (contentInfos === null) {
1935
- log.error("API: The manifest is loaded but no content is.");
1936
- return;
1823
+ var _a;
1824
+ if (contentInfos.contentId !== ((_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.contentId)) {
1825
+ return; // Event for another content
1937
1826
  }
1938
1827
  contentInfos.manifest = manifest;
1828
+ var cancelSignal = contentInfos.currentContentCanceller.signal;
1939
1829
  this._priv_reloadingMetadata.manifest = manifest;
1940
1830
  var initialAudioTrack = contentInfos.initialAudioTrack, initialTextTrack = contentInfos.initialTextTrack;
1941
- this._priv_trackChoiceManager = new TrackChoiceManager({
1831
+ contentInfos.trackChoiceManager = new TrackChoiceManager({
1942
1832
  preferTrickModeTracks: this._priv_preferTrickModeTracks,
1943
1833
  });
1944
1834
  var preferredAudioTracks = initialAudioTrack === undefined ?
1945
1835
  this._priv_preferredAudioTracks :
1946
1836
  [initialAudioTrack];
1947
- this._priv_trackChoiceManager.setPreferredAudioTracks(preferredAudioTracks, true);
1837
+ contentInfos.trackChoiceManager.setPreferredAudioTracks(preferredAudioTracks, true);
1948
1838
  var preferredTextTracks = initialTextTrack === undefined ?
1949
1839
  this._priv_preferredTextTracks :
1950
1840
  [initialTextTrack];
1951
- this._priv_trackChoiceManager.setPreferredTextTracks(preferredTextTracks, true);
1952
- this._priv_trackChoiceManager.setPreferredVideoTracks(this._priv_preferredVideoTracks, true);
1953
- manifest.addEventListener("manifestUpdate", function () {
1841
+ contentInfos.trackChoiceManager.setPreferredTextTracks(preferredTextTracks, true);
1842
+ contentInfos.trackChoiceManager
1843
+ .setPreferredVideoTracks(this._priv_preferredVideoTracks, true);
1844
+ manifest.addEventListener("manifestUpdate", function (updates) {
1845
+ var _a, _b, _c;
1954
1846
  // Update the tracks chosen if it changed
1955
- if (_this._priv_trackChoiceManager !== null) {
1956
- _this._priv_trackChoiceManager.update();
1847
+ if (contentInfos.trackChoiceManager !== null) {
1848
+ contentInfos.trackChoiceManager.update();
1849
+ }
1850
+ var currentPeriod = (_b = (_a = _this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.currentPeriod) !== null && _b !== void 0 ? _b : undefined;
1851
+ var trackChoiceManager = (_c = _this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.trackChoiceManager;
1852
+ if (currentPeriod === undefined || isNullOrUndefined(trackChoiceManager)) {
1853
+ return;
1854
+ }
1855
+ for (var _i = 0, _d = updates.updatedPeriods; _i < _d.length; _i++) {
1856
+ var update = _d[_i];
1857
+ if (update.period.id === currentPeriod.id) {
1858
+ if (update.result.addedAdaptations.length > 0 ||
1859
+ update.result.removedAdaptations.length > 0) {
1860
+ // We might have new (or less) tracks, send events just to be sure
1861
+ var audioTracks = trackChoiceManager.getAvailableAudioTracks(currentPeriod);
1862
+ _this._priv_triggerEventIfNotStopped("availableAudioTracksChange", audioTracks !== null && audioTracks !== void 0 ? audioTracks : [], cancelSignal);
1863
+ var textTracks = trackChoiceManager.getAvailableTextTracks(currentPeriod);
1864
+ _this._priv_triggerEventIfNotStopped("availableTextTracksChange", textTracks !== null && textTracks !== void 0 ? textTracks : [], cancelSignal);
1865
+ var videoTracks = trackChoiceManager.getAvailableVideoTracks(currentPeriod);
1866
+ _this._priv_triggerEventIfNotStopped("availableVideoTracksChange", videoTracks !== null && videoTracks !== void 0 ? videoTracks : [], cancelSignal);
1867
+ }
1868
+ }
1869
+ return;
1957
1870
  }
1958
1871
  }, contentInfos.currentContentCanceller.signal);
1959
1872
  };
@@ -1961,114 +1874,134 @@ var Player = /** @class */ (function (_super) {
1961
1874
  * Triggered each times the current Period Changed.
1962
1875
  * Store and emit initial state for the Period.
1963
1876
  *
1964
- * @param {Object} value
1877
+ * @param {Object} contentInfos
1878
+ * @param {Object} periodInfo
1965
1879
  */
1966
- Player.prototype._priv_onActivePeriodChanged = function (_a) {
1967
- var _b, _c, _d, _e, _f, _g;
1880
+ Player.prototype._priv_onActivePeriodChanged = function (contentInfos, _a) {
1881
+ var _b, _c, _d, _e, _f, _g, _h, _j;
1968
1882
  var period = _a.period;
1969
- if (this._priv_contentInfos === null) {
1970
- log.error("API: The active period changed but no content is loaded");
1971
- return;
1883
+ if (contentInfos.contentId !== ((_b = this._priv_contentInfos) === null || _b === void 0 ? void 0 : _b.contentId)) {
1884
+ return; // Event for another content
1972
1885
  }
1973
- this._priv_contentInfos.currentPeriod = period;
1886
+ contentInfos.currentPeriod = period;
1887
+ var cancelSignal = contentInfos.currentContentCanceller.signal;
1974
1888
  if (this._priv_contentEventsMemory.periodChange !== period) {
1975
1889
  this._priv_contentEventsMemory.periodChange = period;
1976
- this.trigger("periodChange", period);
1890
+ this._priv_triggerEventIfNotStopped("periodChange", period, cancelSignal);
1977
1891
  }
1978
- this.trigger("availableAudioTracksChange", this.getAvailableAudioTracks());
1979
- this.trigger("availableTextTracksChange", this.getAvailableTextTracks());
1980
- this.trigger("availableVideoTracksChange", this.getAvailableVideoTracks());
1892
+ this._priv_triggerEventIfNotStopped("availableAudioTracksChange", this.getAvailableAudioTracks(), cancelSignal);
1893
+ this._priv_triggerEventIfNotStopped("availableTextTracksChange", this.getAvailableTextTracks(), cancelSignal);
1894
+ this._priv_triggerEventIfNotStopped("availableVideoTracksChange", this.getAvailableVideoTracks(), cancelSignal);
1895
+ var trackChoiceManager = (_c = this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.trackChoiceManager;
1981
1896
  // Emit intial events for the Period
1982
- if (this._priv_trackChoiceManager !== null) {
1983
- var audioTrack = this._priv_trackChoiceManager.getChosenAudioTrack(period);
1984
- var textTrack = this._priv_trackChoiceManager.getChosenTextTrack(period);
1985
- var videoTrack = this._priv_trackChoiceManager.getChosenVideoTrack(period);
1986
- this.trigger("audioTrackChange", audioTrack);
1987
- this.trigger("textTrackChange", textTrack);
1988
- this.trigger("videoTrackChange", videoTrack);
1897
+ if (!isNullOrUndefined(trackChoiceManager)) {
1898
+ var audioTrack = trackChoiceManager.getChosenAudioTrack(period);
1899
+ this._priv_triggerEventIfNotStopped("audioTrackChange", audioTrack, cancelSignal);
1900
+ var textTrack = trackChoiceManager.getChosenTextTrack(period);
1901
+ this._priv_triggerEventIfNotStopped("textTrackChange", textTrack, cancelSignal);
1902
+ var videoTrack = trackChoiceManager.getChosenVideoTrack(period);
1903
+ this._priv_triggerEventIfNotStopped("videoTrackChange", videoTrack, cancelSignal);
1989
1904
  }
1990
1905
  else {
1991
- this.trigger("audioTrackChange", null);
1992
- this.trigger("textTrackChange", null);
1993
- this.trigger("videoTrackChange", null);
1906
+ this._priv_triggerEventIfNotStopped("audioTrackChange", null, cancelSignal);
1907
+ this._priv_triggerEventIfNotStopped("textTrackChange", null, cancelSignal);
1908
+ this._priv_triggerEventIfNotStopped("videoTrackChange", null, cancelSignal);
1909
+ }
1910
+ this._priv_triggerAvailableBitratesChangeEvent("availableAudioBitratesChange", this.getAvailableAudioBitrates(), cancelSignal);
1911
+ if (contentInfos.currentContentCanceller.isUsed) {
1912
+ return;
1913
+ }
1914
+ this._priv_triggerAvailableBitratesChangeEvent("availableVideoBitratesChange", this.getAvailableVideoBitrates(), cancelSignal);
1915
+ if (contentInfos.currentContentCanceller.isUsed) {
1916
+ return;
1994
1917
  }
1995
- this._priv_triggerAvailableBitratesChangeEvent("availableAudioBitratesChange", this.getAvailableAudioBitrates());
1996
- this._priv_triggerAvailableBitratesChangeEvent("availableVideoBitratesChange", this.getAvailableVideoBitrates());
1997
- var audioBitrate = (_d = (_c = (_b = this._priv_getCurrentRepresentations()) === null || _b === void 0 ? void 0 : _b.audio) === null || _c === void 0 ? void 0 : _c.bitrate) !== null && _d !== void 0 ? _d : -1;
1998
- this._priv_triggerCurrentBitrateChangeEvent("audioBitrateChange", audioBitrate);
1999
- var videoBitrate = (_g = (_f = (_e = this._priv_getCurrentRepresentations()) === null || _e === void 0 ? void 0 : _e.video) === null || _f === void 0 ? void 0 : _f.bitrate) !== null && _g !== void 0 ? _g : -1;
2000
- this._priv_triggerCurrentBitrateChangeEvent("videoBitrateChange", videoBitrate);
1918
+ var audioBitrate = (_f = (_e = (_d = this._priv_getCurrentRepresentations()) === null || _d === void 0 ? void 0 : _d.audio) === null || _e === void 0 ? void 0 : _e.bitrate) !== null && _f !== void 0 ? _f : -1;
1919
+ this._priv_triggerCurrentBitrateChangeEvent("audioBitrateChange", audioBitrate, cancelSignal);
1920
+ if (contentInfos.currentContentCanceller.isUsed) {
1921
+ return;
1922
+ }
1923
+ var videoBitrate = (_j = (_h = (_g = this._priv_getCurrentRepresentations()) === null || _g === void 0 ? void 0 : _g.video) === null || _h === void 0 ? void 0 : _h.bitrate) !== null && _j !== void 0 ? _j : -1;
1924
+ this._priv_triggerCurrentBitrateChangeEvent("videoBitrateChange", videoBitrate, cancelSignal);
2001
1925
  };
2002
1926
  /**
2003
1927
  * Triggered each times a new "PeriodStream" is ready.
2004
1928
  * Choose the right Adaptation for the Period and emit it.
1929
+ * @param {Object} contentInfos
2005
1930
  * @param {Object} value
2006
1931
  */
2007
- Player.prototype._priv_onPeriodStreamReady = function (value) {
2008
- var type = value.type, period = value.period, adaptation$ = value.adaptation$;
1932
+ Player.prototype._priv_onPeriodStreamReady = function (contentInfos, value) {
1933
+ var _a;
1934
+ if (contentInfos.contentId !== ((_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.contentId)) {
1935
+ return; // Event for another content
1936
+ }
1937
+ var type = value.type, period = value.period, adaptationRef = value.adaptationRef;
1938
+ var trackChoiceManager = contentInfos.trackChoiceManager;
2009
1939
  switch (type) {
2010
1940
  case "video":
2011
- if (this._priv_trackChoiceManager === null) {
1941
+ if (isNullOrUndefined(trackChoiceManager)) {
2012
1942
  log.error("API: TrackChoiceManager not instanciated for a new video period");
2013
- adaptation$.next(null);
1943
+ adaptationRef.setValue(null);
2014
1944
  }
2015
1945
  else {
2016
- this._priv_trackChoiceManager.addPeriod(type, period, adaptation$);
2017
- this._priv_trackChoiceManager.setInitialVideoTrack(period);
1946
+ trackChoiceManager.addPeriod(type, period, adaptationRef);
1947
+ trackChoiceManager.setInitialVideoTrack(period);
2018
1948
  }
2019
1949
  break;
2020
1950
  case "audio":
2021
- if (this._priv_trackChoiceManager === null) {
1951
+ if (isNullOrUndefined(trackChoiceManager)) {
2022
1952
  log.error("API: TrackChoiceManager not instanciated for a new ".concat(type, " period"));
2023
- adaptation$.next(null);
1953
+ adaptationRef.setValue(null);
2024
1954
  }
2025
1955
  else {
2026
- this._priv_trackChoiceManager.addPeriod(type, period, adaptation$);
2027
- this._priv_trackChoiceManager.setInitialAudioTrack(period);
1956
+ trackChoiceManager.addPeriod(type, period, adaptationRef);
1957
+ trackChoiceManager.setInitialAudioTrack(period);
2028
1958
  }
2029
1959
  break;
2030
1960
  case "text":
2031
- if (this._priv_trackChoiceManager === null) {
1961
+ if (isNullOrUndefined(trackChoiceManager)) {
2032
1962
  log.error("API: TrackChoiceManager not instanciated for a new ".concat(type, " period"));
2033
- adaptation$.next(null);
1963
+ adaptationRef.setValue(null);
2034
1964
  }
2035
1965
  else {
2036
- this._priv_trackChoiceManager.addPeriod(type, period, adaptation$);
2037
- this._priv_trackChoiceManager.setInitialTextTrack(period);
1966
+ trackChoiceManager.addPeriod(type, period, adaptationRef);
1967
+ trackChoiceManager.setInitialTextTrack(period);
2038
1968
  }
2039
1969
  break;
2040
1970
  default:
2041
1971
  var adaptations = period.adaptations[type];
2042
1972
  if (!isNullOrUndefined(adaptations) && adaptations.length > 0) {
2043
- adaptation$.next(adaptations[0]);
1973
+ adaptationRef.setValue(adaptations[0]);
2044
1974
  }
2045
1975
  else {
2046
- adaptation$.next(null);
1976
+ adaptationRef.setValue(null);
2047
1977
  }
2048
1978
  break;
2049
1979
  }
2050
1980
  };
2051
1981
  /**
2052
1982
  * Triggered each times we "remove" a PeriodStream.
1983
+ * @param {Object} contentInfos
2053
1984
  * @param {Object} value
2054
1985
  */
2055
- Player.prototype._priv_onPeriodStreamCleared = function (value) {
1986
+ Player.prototype._priv_onPeriodStreamCleared = function (contentInfos, value) {
1987
+ var _a;
1988
+ if (contentInfos.contentId !== ((_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.contentId)) {
1989
+ return; // Event for another content
1990
+ }
2056
1991
  var type = value.type, period = value.period;
1992
+ var trackChoiceManager = contentInfos.trackChoiceManager;
2057
1993
  // Clean-up track choice from TrackChoiceManager
2058
1994
  switch (type) {
2059
1995
  case "audio":
2060
1996
  case "text":
2061
1997
  case "video":
2062
- if (this._priv_trackChoiceManager !== null) {
2063
- this._priv_trackChoiceManager.removePeriod(type, period);
1998
+ if (!isNullOrUndefined(trackChoiceManager)) {
1999
+ trackChoiceManager.removePeriod(type, period);
2064
2000
  }
2065
2001
  break;
2066
2002
  }
2067
2003
  // Clean-up stored Representation and Adaptation information
2068
- if (this._priv_contentInfos === null) {
2069
- return;
2070
- }
2071
- var _a = this._priv_contentInfos, activeAdaptations = _a.activeAdaptations, activeRepresentations = _a.activeRepresentations;
2004
+ var activeAdaptations = contentInfos.activeAdaptations, activeRepresentations = contentInfos.activeRepresentations;
2072
2005
  if (!isNullOrUndefined(activeAdaptations) &&
2073
2006
  !isNullOrUndefined(activeAdaptations[period.id])) {
2074
2007
  var activePeriodAdaptations = activeAdaptations[period.id];
@@ -2086,35 +2019,25 @@ var Player = /** @class */ (function (_super) {
2086
2019
  }
2087
2020
  }
2088
2021
  };
2089
- /**
2090
- * Triggered each time the content is re-loaded on the MediaSource.
2091
- */
2092
- Player.prototype._priv_onReloadingMediaSource = function () {
2093
- if (this._priv_contentInfos !== null) {
2094
- this._priv_contentInfos.segmentBuffersStore = null;
2095
- }
2096
- if (this._priv_trackChoiceManager !== null) {
2097
- this._priv_trackChoiceManager.resetPeriods();
2098
- }
2099
- };
2100
2022
  /**
2101
2023
  * Triggered each times a new Adaptation is considered for the current
2102
2024
  * content.
2103
2025
  * Store given Adaptation and emit it if from the current Period.
2026
+ * @param {Object} contentInfos
2104
2027
  * @param {Object} value
2105
2028
  */
2106
- Player.prototype._priv_onAdaptationChange = function (_a) {
2029
+ Player.prototype._priv_onAdaptationChange = function (contentInfos, _a) {
2107
2030
  var _b;
2031
+ var _c;
2108
2032
  var type = _a.type, adaptation = _a.adaptation, period = _a.period;
2109
- if (this._priv_contentInfos === null) {
2110
- log.error("API: The adaptations changed but no content is loaded");
2111
- return;
2033
+ if (contentInfos.contentId !== ((_c = this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.contentId)) {
2034
+ return; // Event for another content
2112
2035
  }
2113
- // lazily create this._priv_contentInfos.activeAdaptations
2114
- if (this._priv_contentInfos.activeAdaptations === null) {
2115
- this._priv_contentInfos.activeAdaptations = {};
2036
+ // lazily create contentInfos.activeAdaptations
2037
+ if (contentInfos.activeAdaptations === null) {
2038
+ contentInfos.activeAdaptations = {};
2116
2039
  }
2117
- var _c = this._priv_contentInfos, activeAdaptations = _c.activeAdaptations, currentPeriod = _c.currentPeriod;
2040
+ var activeAdaptations = contentInfos.activeAdaptations, currentPeriod = contentInfos.currentPeriod;
2118
2041
  var activePeriodAdaptations = activeAdaptations[period.id];
2119
2042
  if (isNullOrUndefined(activePeriodAdaptations)) {
2120
2043
  activeAdaptations[period.id] = (_b = {}, _b[type] = adaptation, _b);
@@ -2122,28 +2045,27 @@ var Player = /** @class */ (function (_super) {
2122
2045
  else {
2123
2046
  activePeriodAdaptations[type] = adaptation;
2124
2047
  }
2125
- if (this._priv_trackChoiceManager !== null &&
2048
+ var trackChoiceManager = contentInfos.trackChoiceManager;
2049
+ var cancelSignal = contentInfos.currentContentCanceller.signal;
2050
+ if (trackChoiceManager !== null &&
2126
2051
  currentPeriod !== null && !isNullOrUndefined(period) &&
2127
2052
  period.id === currentPeriod.id) {
2128
2053
  switch (type) {
2129
2054
  case "audio":
2130
- var audioTrack = this._priv_trackChoiceManager
2131
- .getChosenAudioTrack(currentPeriod);
2132
- this.trigger("audioTrackChange", audioTrack);
2055
+ var audioTrack = trackChoiceManager.getChosenAudioTrack(currentPeriod);
2056
+ this._priv_triggerEventIfNotStopped("audioTrackChange", audioTrack, cancelSignal);
2133
2057
  var availableAudioBitrates = this.getAvailableAudioBitrates();
2134
- this._priv_triggerAvailableBitratesChangeEvent("availableAudioBitratesChange", availableAudioBitrates);
2058
+ this._priv_triggerAvailableBitratesChangeEvent("availableAudioBitratesChange", availableAudioBitrates, cancelSignal);
2135
2059
  break;
2136
2060
  case "text":
2137
- var textTrack = this._priv_trackChoiceManager
2138
- .getChosenTextTrack(currentPeriod);
2139
- this.trigger("textTrackChange", textTrack);
2061
+ var textTrack = trackChoiceManager.getChosenTextTrack(currentPeriod);
2062
+ this._priv_triggerEventIfNotStopped("textTrackChange", textTrack, cancelSignal);
2140
2063
  break;
2141
2064
  case "video":
2142
- var videoTrack = this._priv_trackChoiceManager
2143
- .getChosenVideoTrack(currentPeriod);
2144
- this.trigger("videoTrackChange", videoTrack);
2065
+ var videoTrack = trackChoiceManager.getChosenVideoTrack(currentPeriod);
2066
+ this._priv_triggerEventIfNotStopped("videoTrackChange", videoTrack, cancelSignal);
2145
2067
  var availableVideoBitrates = this.getAvailableVideoBitrates();
2146
- this._priv_triggerAvailableBitratesChangeEvent("availableVideoBitratesChange", availableVideoBitrates);
2068
+ this._priv_triggerAvailableBitratesChangeEvent("availableVideoBitratesChange", availableVideoBitrates, cancelSignal);
2147
2069
  break;
2148
2070
  }
2149
2071
  }
@@ -2153,21 +2075,21 @@ var Player = /** @class */ (function (_super) {
2153
2075
  *
2154
2076
  * Store given Representation and emit it if from the current Period.
2155
2077
  *
2078
+ * @param {Object} contentInfos
2156
2079
  * @param {Object} obj
2157
2080
  */
2158
- Player.prototype._priv_onRepresentationChange = function (_a) {
2081
+ Player.prototype._priv_onRepresentationChange = function (contentInfos, _a) {
2159
2082
  var _b;
2160
- var _c;
2083
+ var _c, _d;
2161
2084
  var type = _a.type, period = _a.period, representation = _a.representation;
2162
- if (this._priv_contentInfos === null) {
2163
- log.error("API: The representations changed but no content is loaded");
2164
- return;
2085
+ if (contentInfos.contentId !== ((_c = this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.contentId)) {
2086
+ return; // Event for another content
2165
2087
  }
2166
- // lazily create this._priv_contentInfos.activeRepresentations
2167
- if (this._priv_contentInfos.activeRepresentations === null) {
2168
- this._priv_contentInfos.activeRepresentations = {};
2088
+ // lazily create contentInfos.activeRepresentations
2089
+ if (contentInfos.activeRepresentations === null) {
2090
+ contentInfos.activeRepresentations = {};
2169
2091
  }
2170
- var _d = this._priv_contentInfos, activeRepresentations = _d.activeRepresentations, currentPeriod = _d.currentPeriod;
2092
+ var activeRepresentations = contentInfos.activeRepresentations, currentPeriod = contentInfos.currentPeriod;
2171
2093
  var activePeriodRepresentations = activeRepresentations[period.id];
2172
2094
  if (isNullOrUndefined(activePeriodRepresentations)) {
2173
2095
  activeRepresentations[period.id] = (_b = {}, _b[type] = representation, _b);
@@ -2175,15 +2097,16 @@ var Player = /** @class */ (function (_super) {
2175
2097
  else {
2176
2098
  activePeriodRepresentations[type] = representation;
2177
2099
  }
2178
- var bitrate = (_c = representation === null || representation === void 0 ? void 0 : representation.bitrate) !== null && _c !== void 0 ? _c : -1;
2100
+ var bitrate = (_d = representation === null || representation === void 0 ? void 0 : representation.bitrate) !== null && _d !== void 0 ? _d : -1;
2179
2101
  if (!isNullOrUndefined(period) &&
2180
2102
  currentPeriod !== null &&
2181
2103
  currentPeriod.id === period.id) {
2104
+ var cancelSignal = this._priv_contentInfos.currentContentCanceller.signal;
2182
2105
  if (type === "video") {
2183
- this._priv_triggerCurrentBitrateChangeEvent("videoBitrateChange", bitrate);
2106
+ this._priv_triggerCurrentBitrateChangeEvent("videoBitrateChange", bitrate, cancelSignal);
2184
2107
  }
2185
2108
  else if (type === "audio") {
2186
- this._priv_triggerCurrentBitrateChangeEvent("audioBitrateChange", bitrate);
2109
+ this._priv_triggerCurrentBitrateChangeEvent("audioBitrateChange", bitrate, cancelSignal);
2187
2110
  }
2188
2111
  }
2189
2112
  };
@@ -2230,15 +2153,15 @@ var Player = /** @class */ (function (_super) {
2230
2153
  *
2231
2154
  * Trigger the right Player Event
2232
2155
  *
2156
+ * @param {Object} contentInfos
2233
2157
  * @param {Object} observation
2234
2158
  */
2235
- Player.prototype._priv_triggerPositionUpdate = function (observation) {
2236
- var _a;
2237
- if (this._priv_contentInfos === null) {
2238
- log.warn("API: Cannot perform time update: no content loaded.");
2239
- return;
2159
+ Player.prototype._priv_triggerPositionUpdate = function (contentInfos, observation) {
2160
+ var _a, _b;
2161
+ if (contentInfos.contentId !== ((_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.contentId)) {
2162
+ return; // Event for another content
2240
2163
  }
2241
- var _b = this._priv_contentInfos, isDirectFile = _b.isDirectFile, manifest = _b.manifest;
2164
+ var isDirectFile = contentInfos.isDirectFile, manifest = contentInfos.manifest;
2242
2165
  if ((!isDirectFile && manifest === null) || isNullOrUndefined(observation)) {
2243
2166
  return;
2244
2167
  }
@@ -2258,7 +2181,7 @@ var Player = /** @class */ (function (_super) {
2258
2181
  if (manifest !== null &&
2259
2182
  manifest.isLive &&
2260
2183
  observation.position > 0) {
2261
- var ast = (_a = manifest.availabilityStartTime) !== null && _a !== void 0 ? _a : 0;
2184
+ var ast = (_b = manifest.availabilityStartTime) !== null && _b !== void 0 ? _b : 0;
2262
2185
  positionData.wallClockTime = observation.position + ast;
2263
2186
  var livePosition = manifest.getLivePosition();
2264
2187
  if (livePosition !== undefined) {
@@ -2278,10 +2201,12 @@ var Player = /** @class */ (function (_super) {
2278
2201
  * the previously stored value.
2279
2202
  * @param {string} event
2280
2203
  * @param {Array.<number>} newVal
2204
+ * @param {Object} currentContentCancelSignal
2281
2205
  */
2282
- Player.prototype._priv_triggerAvailableBitratesChangeEvent = function (event, newVal) {
2206
+ Player.prototype._priv_triggerAvailableBitratesChangeEvent = function (event, newVal, currentContentCancelSignal) {
2283
2207
  var prevVal = this._priv_contentEventsMemory[event];
2284
- if (prevVal === undefined || !areArraysOfNumbersEqual(newVal, prevVal)) {
2208
+ if (!currentContentCancelSignal.isCancelled &&
2209
+ (prevVal === undefined || !areArraysOfNumbersEqual(newVal, prevVal))) {
2285
2210
  this._priv_contentEventsMemory[event] = newVal;
2286
2211
  this.trigger(event, newVal);
2287
2212
  }
@@ -2291,9 +2216,11 @@ var Player = /** @class */ (function (_super) {
2291
2216
  * previously stored value.
2292
2217
  * @param {string} event
2293
2218
  * @param {number} newVal
2219
+ * @param {Object} currentContentCancelSignal
2294
2220
  */
2295
- Player.prototype._priv_triggerCurrentBitrateChangeEvent = function (event, newVal) {
2296
- if (newVal !== this._priv_contentEventsMemory[event]) {
2221
+ Player.prototype._priv_triggerCurrentBitrateChangeEvent = function (event, newVal, currentContentCancelSignal) {
2222
+ if (!currentContentCancelSignal.isCancelled &&
2223
+ newVal !== this._priv_contentEventsMemory[event]) {
2297
2224
  this._priv_contentEventsMemory[event] = newVal;
2298
2225
  this.trigger(event, newVal);
2299
2226
  }
@@ -2310,7 +2237,71 @@ var Player = /** @class */ (function (_super) {
2310
2237
  }
2311
2238
  return activeRepresentations[currentPeriod.id];
2312
2239
  };
2240
+ /**
2241
+ * @param {string} evt
2242
+ * @param {*} arg
2243
+ * @param {Object} currentContentCancelSignal
2244
+ */
2245
+ Player.prototype._priv_triggerEventIfNotStopped = function (evt, arg, currentContentCancelSignal) {
2246
+ if (!currentContentCancelSignal.isCancelled) {
2247
+ this.trigger(evt, arg);
2248
+ }
2249
+ };
2250
+ /**
2251
+ * @param {Object} defaultAudioTrack
2252
+ * @param {Object} defaultTextTrack
2253
+ * @param {Object} cancelSignal
2254
+ * @returns {Object}
2255
+ */
2256
+ Player.prototype._priv_initializeMediaElementTrackChoiceManager = function (defaultAudioTrack, defaultTextTrack, cancelSignal) {
2257
+ var _this = this;
2258
+ var _a, _b, _c;
2259
+ assert(features.directfile !== null, "Initializing `MediaElementTrackChoiceManager` without Directfile feature");
2260
+ assert(this.videoElement !== null, "Initializing `MediaElementTrackChoiceManager` on a disposed RxPlayer");
2261
+ var mediaElementTrackChoiceManager = new features.directfile.mediaElementTrackChoiceManager(this.videoElement);
2262
+ var preferredAudioTracks = defaultAudioTrack === undefined ?
2263
+ this._priv_preferredAudioTracks :
2264
+ [defaultAudioTrack];
2265
+ mediaElementTrackChoiceManager.setPreferredAudioTracks(preferredAudioTracks, true);
2266
+ var preferredTextTracks = defaultTextTrack === undefined ?
2267
+ this._priv_preferredTextTracks :
2268
+ [defaultTextTrack];
2269
+ mediaElementTrackChoiceManager.setPreferredTextTracks(preferredTextTracks, true);
2270
+ mediaElementTrackChoiceManager
2271
+ .setPreferredVideoTracks(this._priv_preferredVideoTracks, true);
2272
+ this._priv_triggerEventIfNotStopped("availableAudioTracksChange", mediaElementTrackChoiceManager.getAvailableAudioTracks(), cancelSignal);
2273
+ this._priv_triggerEventIfNotStopped("availableVideoTracksChange", mediaElementTrackChoiceManager.getAvailableVideoTracks(), cancelSignal);
2274
+ this._priv_triggerEventIfNotStopped("availableTextTracksChange", mediaElementTrackChoiceManager.getAvailableTextTracks(), cancelSignal);
2275
+ this._priv_triggerEventIfNotStopped("audioTrackChange", (_a = mediaElementTrackChoiceManager.getChosenAudioTrack()) !== null && _a !== void 0 ? _a : null, cancelSignal);
2276
+ this._priv_triggerEventIfNotStopped("textTrackChange", (_b = mediaElementTrackChoiceManager.getChosenTextTrack()) !== null && _b !== void 0 ? _b : null, cancelSignal);
2277
+ this._priv_triggerEventIfNotStopped("videoTrackChange", (_c = mediaElementTrackChoiceManager.getChosenVideoTrack()) !== null && _c !== void 0 ? _c : null, cancelSignal);
2278
+ mediaElementTrackChoiceManager
2279
+ .addEventListener("availableVideoTracksChange", function (val) {
2280
+ return _this.trigger("availableVideoTracksChange", val);
2281
+ });
2282
+ mediaElementTrackChoiceManager
2283
+ .addEventListener("availableAudioTracksChange", function (val) {
2284
+ return _this.trigger("availableAudioTracksChange", val);
2285
+ });
2286
+ mediaElementTrackChoiceManager
2287
+ .addEventListener("availableTextTracksChange", function (val) {
2288
+ return _this.trigger("availableTextTracksChange", val);
2289
+ });
2290
+ mediaElementTrackChoiceManager
2291
+ .addEventListener("audioTrackChange", function (val) {
2292
+ return _this.trigger("audioTrackChange", val);
2293
+ });
2294
+ mediaElementTrackChoiceManager
2295
+ .addEventListener("videoTrackChange", function (val) {
2296
+ return _this.trigger("videoTrackChange", val);
2297
+ });
2298
+ mediaElementTrackChoiceManager
2299
+ .addEventListener("textTrackChange", function (val) {
2300
+ return _this.trigger("textTrackChange", val);
2301
+ });
2302
+ return mediaElementTrackChoiceManager;
2303
+ };
2313
2304
  return Player;
2314
2305
  }(EventEmitter));
2315
- Player.version = /* PLAYER_VERSION */ "3.29.0";
2306
+ Player.version = /* PLAYER_VERSION */ "3.30.0-dev.2023011800";
2316
2307
  export default Player;