rx-player 3.26.3-dev.2022021400 → 3.27.0-dev.20220317

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 (340) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/FILES.md +5 -4
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
  5. package/dist/_esm5.processed/compat/browser_detection.js +4 -2
  6. package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
  7. package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
  8. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  9. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +21 -22
  10. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
  12. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  13. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  14. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  15. package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
  16. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  17. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  18. package/dist/_esm5.processed/config.d.ts +166 -1080
  19. package/dist/_esm5.processed/config.js +17 -1119
  20. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  21. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  22. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  23. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  24. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +2 -1
  25. package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
  26. package/dist/_esm5.processed/core/api/option_utils.js +19 -6
  27. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  28. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  29. package/dist/_esm5.processed/core/api/public_api.js +72 -33
  30. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -49
  31. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +25 -65
  32. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  33. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
  34. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  35. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
  36. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  37. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
  38. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  39. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  40. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  41. package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
  42. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
  43. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  44. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  45. package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
  46. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  47. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  48. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  49. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  50. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  51. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  52. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  53. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  54. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  55. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  56. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  57. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  58. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +119 -241
  59. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  60. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  61. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  62. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  63. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  64. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  65. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
  66. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  67. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  68. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  69. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  70. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  71. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  72. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  73. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  74. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  75. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  76. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  77. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  78. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  79. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
  80. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  81. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  82. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  83. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  84. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  85. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  86. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  87. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  88. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +2 -2
  89. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +1 -1
  90. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  91. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  92. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +1 -1
  93. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  94. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +4 -2
  95. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  96. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  97. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  98. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  99. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  100. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  101. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  102. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  103. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  104. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  105. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  106. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  107. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  108. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  109. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  110. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  111. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  112. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  113. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
  114. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
  115. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  116. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +2 -2
  117. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  118. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  119. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  120. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  121. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  122. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  123. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  124. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  125. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  126. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  127. package/dist/_esm5.processed/default_config.js +1145 -0
  128. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  129. package/dist/_esm5.processed/experimental/index.js +2 -0
  130. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  131. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +1 -1
  132. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
  133. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
  134. package/dist/_esm5.processed/features/features_object.js +1 -1
  135. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  136. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  137. package/dist/_esm5.processed/features/list/eme.js +5 -5
  138. package/dist/_esm5.processed/features/types.d.ts +3 -3
  139. package/dist/_esm5.processed/manifest/manifest.d.ts +1 -14
  140. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  141. package/dist/_esm5.processed/manifest/representation.d.ts +35 -3
  142. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  143. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  144. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +1 -1
  145. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +87 -75
  146. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  147. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  148. package/dist/_esm5.processed/public_types.d.ts +2 -2
  149. package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -0
  150. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  151. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  152. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  153. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  154. package/dist/_esm5.processed/transports/smooth/pipelines.js +68 -10
  155. package/dist/_esm5.processed/transports/types.d.ts +22 -0
  156. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  157. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  158. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  159. package/dist/_esm5.processed/utils/reference.js +72 -24
  160. package/dist/_esm5.processed/utils/request/fetch.js +1 -2
  161. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  162. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  163. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  164. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  165. package/dist/rx-player.js +5002 -3033
  166. package/dist/rx-player.min.js +1 -1
  167. package/dummy +1 -0
  168. package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
  169. package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
  170. package/package.json +32 -34
  171. package/scripts/build/templates/experimental/index.d.ts +16 -0
  172. package/scripts/build/templates/experimental/index.js +16 -0
  173. package/sonar-project.properties +1 -1
  174. package/src/README.md +6 -6
  175. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  176. package/src/compat/browser_detection.ts +4 -2
  177. package/src/compat/eme/close_session.ts +90 -56
  178. package/src/compat/eme/custom_media_keys/index.ts +21 -38
  179. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
  180. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
  181. package/src/compat/eme/generate_key_request.ts +25 -33
  182. package/src/compat/eme/load_session.ts +29 -31
  183. package/src/compat/event_listeners.ts +2 -1
  184. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  185. package/src/config.ts +17 -1210
  186. package/src/core/README.md +1 -1
  187. package/src/core/abr/bandwidth_estimator.ts +4 -4
  188. package/src/core/abr/network_analyzer.ts +5 -6
  189. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  190. package/src/core/api/__tests__/option_utils.test.ts +17 -17
  191. package/src/core/api/get_player_state.ts +1 -1
  192. package/src/core/api/index.ts +3 -0
  193. package/src/core/api/option_utils.ts +37 -20
  194. package/src/core/api/playback_observer.ts +12 -8
  195. package/src/core/api/public_api.ts +151 -111
  196. package/src/core/decrypt/README.md +22 -0
  197. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  198. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  199. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  200. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  201. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  202. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +31 -93
  203. package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
  204. package/src/core/decrypt/clear_on_stop.ts +48 -0
  205. package/src/core/decrypt/content_decryptor.ts +1158 -0
  206. package/src/core/decrypt/create_or_load_session.ts +130 -0
  207. package/src/core/decrypt/create_session.ts +175 -0
  208. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  209. package/src/core/{eme → decrypt}/find_key_system.ts +112 -122
  210. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  211. package/src/core/decrypt/get_media_keys.ts +145 -0
  212. package/src/core/{eme → decrypt}/index.ts +11 -8
  213. package/src/core/decrypt/init_media_keys.ts +51 -0
  214. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  215. package/src/core/decrypt/set_server_certificate.ts +104 -0
  216. package/src/core/{eme → decrypt}/types.ts +128 -258
  217. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  218. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  219. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  220. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  221. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  222. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
  223. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  224. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  225. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  226. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  227. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  228. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  229. package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
  230. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  231. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  232. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  233. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  234. package/src/core/fetchers/manifest/manifest_fetcher.ts +4 -4
  235. package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
  236. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  237. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  238. package/src/core/init/get_initial_time.ts +2 -1
  239. package/src/core/init/initialize_directfile.ts +17 -20
  240. package/src/core/init/initialize_media_source.ts +42 -105
  241. package/src/core/init/link_drm_and_content.ts +176 -0
  242. package/src/core/init/manifest_update_scheduler.ts +5 -3
  243. package/src/core/init/stall_avoider.ts +6 -5
  244. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  245. package/src/core/init/types.ts +1 -39
  246. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  247. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +3 -4
  248. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  249. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  250. package/src/core/stream/events_generators.ts +9 -4
  251. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  252. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  253. package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
  254. package/src/core/stream/period/period_stream.ts +5 -2
  255. package/src/core/stream/representation/force_garbage_collection.ts +2 -2
  256. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  257. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  258. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  259. package/src/core/stream/representation/push_media_segment.ts +3 -2
  260. package/src/core/stream/representation/representation_stream.ts +30 -7
  261. package/src/core/stream/types.ts +1 -1
  262. package/src/default_config.ts +1241 -0
  263. package/src/experimental/index.ts +5 -0
  264. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  265. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +2 -1
  266. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  267. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
  268. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
  269. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
  270. package/src/features/__tests__/initialize_features.test.ts +2 -2
  271. package/src/features/features_object.ts +1 -1
  272. package/src/features/initialize_features.ts +1 -1
  273. package/src/features/list/__tests__/eme.test.ts +5 -5
  274. package/src/features/list/eme.ts +5 -5
  275. package/src/features/types.ts +3 -10
  276. package/src/manifest/manifest.ts +6 -76
  277. package/src/manifest/representation.ts +36 -3
  278. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  279. package/src/parsers/manifest/dash/common/indexes/template.ts +1 -2
  280. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +1 -1
  281. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +109 -64
  282. package/src/parsers/manifest/dash/common/parse_mpd.ts +1 -2
  283. package/src/parsers/manifest/smooth/create_parser.ts +1 -0
  284. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  285. package/src/public_types.ts +5 -1
  286. package/src/transports/dash/image_pipelines.ts +3 -0
  287. package/src/transports/dash/segment_parser.ts +5 -0
  288. package/src/transports/dash/text_parser.ts +8 -0
  289. package/src/transports/local/segment_parser.ts +4 -0
  290. package/src/transports/local/text_parser.ts +8 -0
  291. package/src/transports/smooth/pipelines.ts +22 -9
  292. package/src/transports/types.ts +22 -0
  293. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  294. package/src/utils/deep_merge.ts +46 -0
  295. package/src/utils/reference.ts +116 -23
  296. package/src/utils/request/fetch.ts +1 -2
  297. package/src/utils/request/xhr.ts +2 -1
  298. package/src/utils/rx-from_cancellable_promise.ts +7 -2
  299. package/src/utils/task_canceller.ts +6 -4
  300. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  301. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  302. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  303. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  304. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  305. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  306. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  307. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  308. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -253
  309. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  310. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  311. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  312. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  313. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  314. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  315. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  316. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  317. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  318. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  319. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  320. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  321. package/src/core/eme/README.md +0 -26
  322. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  323. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  324. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  325. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  326. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  327. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  328. package/src/core/eme/clear_eme_session.ts +0 -62
  329. package/src/core/eme/create_session.ts +0 -187
  330. package/src/core/eme/dispose_eme.ts +0 -25
  331. package/src/core/eme/dispose_media_keys.ts +0 -46
  332. package/src/core/eme/eme_manager.ts +0 -387
  333. package/src/core/eme/get_media_keys.ts +0 -141
  334. package/src/core/eme/get_session.ts +0 -135
  335. package/src/core/eme/init_media_keys.ts +0 -106
  336. package/src/core/eme/set_server_certificate.ts +0 -115
  337. package/src/core/eme/utils/close_session.ts +0 -113
  338. package/src/core/eme/utils/init_data_store.ts +0 -234
  339. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  340. package/src/core/init/create_eme_manager.ts +0 -95
@@ -28,10 +28,9 @@ var __extends = (this && this.__extends) || (function () {
28
28
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
29
29
  };
30
30
  })();
31
- import { merge as observableMerge, Subject, takeUntil, } from "rxjs";
32
31
  import EventEmitter from "../../../utils/event_emitter";
32
+ import noop from "../../../utils/noop";
33
33
  import PPromise from "../../../utils/promise";
34
- import * as events from "../../event_listeners";
35
34
  import getWebKitFairplayInitData from "../get_webkit_fairplay_initdata";
36
35
  import { WebKitMediaKeysConstructor, } from "./webkit_media_keys_constructor";
37
36
  /**
@@ -74,52 +73,39 @@ var WebkitMediaKeySession = /** @class */ (function (_super) {
74
73
  function WebkitMediaKeySession(mediaElement, keyType, serverCertificate) {
75
74
  var _this = _super.call(this) || this;
76
75
  _this._serverCertificate = serverCertificate;
77
- _this._closeSession$ = new Subject();
78
76
  _this._videoElement = mediaElement;
79
77
  _this._keyType = keyType;
78
+ _this._unbindSession = noop;
79
+ _this._closeSession = noop; // Just here to make TypeScript happy
80
80
  _this.closed = new PPromise(function (resolve) {
81
- _this._closeSession$.subscribe(resolve);
81
+ _this._closeSession = resolve;
82
82
  });
83
83
  _this.keyStatuses = new Map();
84
84
  _this.expiration = NaN;
85
- _this.update = function (license) {
86
- return new PPromise(function (resolve, reject) {
87
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
88
- if (_this._nativeSession === undefined ||
89
- _this._nativeSession.update === undefined ||
90
- typeof _this._nativeSession.update !== "function") {
91
- return reject("Unavailable WebKit key session.");
92
- }
93
- try {
94
- var uInt8Arraylicense = void 0;
95
- if (license instanceof ArrayBuffer) {
96
- uInt8Arraylicense = new Uint8Array(license);
97
- }
98
- else if (license instanceof Uint8Array) {
99
- uInt8Arraylicense = license;
100
- }
101
- else {
102
- uInt8Arraylicense = new Uint8Array(license.buffer);
103
- }
104
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
105
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
106
- resolve(_this._nativeSession.update(uInt8Arraylicense));
107
- /* eslint-enable @typescript-eslint/no-unsafe-member-access */
108
- }
109
- catch (err) {
110
- reject(err);
111
- }
112
- /* eslint-enable @typescript-eslint/no-unsafe-member-access */
113
- });
85
+ _this._onEvent = function (evt) {
86
+ _this.trigger(evt.type, evt);
114
87
  };
115
88
  return _this;
116
89
  }
117
- WebkitMediaKeySession.prototype.listenEvent = function (session) {
90
+ WebkitMediaKeySession.prototype.update = function (license) {
118
91
  var _this = this;
119
- observableMerge(events.onKeyMessage$(session), events.onKeyAdded$(session), events.onKeyError$(session))
120
- .pipe(takeUntil(this._closeSession$))
121
- .subscribe(function (evt) {
122
- _this.trigger(evt.type, evt);
92
+ return new PPromise(function (resolve, reject) {
93
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
94
+ if (_this._nativeSession === undefined ||
95
+ _this._nativeSession.update === undefined ||
96
+ typeof _this._nativeSession.update !== "function") {
97
+ return reject("Unavailable WebKit key session.");
98
+ }
99
+ try {
100
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
101
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
102
+ resolve(_this._nativeSession.update(license));
103
+ /* eslint-enable @typescript-eslint/no-unsafe-member-access */
104
+ }
105
+ catch (err) {
106
+ reject(err);
107
+ }
108
+ /* eslint-enable @typescript-eslint/no-unsafe-member-access */
123
109
  });
124
110
  };
125
111
  WebkitMediaKeySession.prototype.generateRequest = function (_initDataType, initData) {
@@ -144,7 +130,7 @@ var WebkitMediaKeySession = /** @class */ (function (_super) {
144
130
  if (keySession === undefined || keySession === null) {
145
131
  throw new Error("Impossible to get the key sessions");
146
132
  }
147
- _this.listenEvent(keySession);
133
+ _this._listenEvent(keySession);
148
134
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
149
135
  _this._nativeSession = keySession;
150
136
  resolve();
@@ -153,8 +139,8 @@ var WebkitMediaKeySession = /** @class */ (function (_super) {
153
139
  WebkitMediaKeySession.prototype.close = function () {
154
140
  var _this = this;
155
141
  return new PPromise(function (resolve, reject) {
156
- _this._closeSession$.next();
157
- _this._closeSession$.complete();
142
+ _this._unbindSession();
143
+ _this._closeSession();
158
144
  if (_this._nativeSession === undefined) {
159
145
  reject("No session to close.");
160
146
  return;
@@ -183,6 +169,22 @@ var WebkitMediaKeySession = /** @class */ (function (_super) {
183
169
  enumerable: false,
184
170
  configurable: true
185
171
  });
172
+ WebkitMediaKeySession.prototype._listenEvent = function (session) {
173
+ var _this = this;
174
+ this._unbindSession(); // If previous session was linked
175
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
176
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
177
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
178
+ ["keymessage", "message", "keyadded", "ready", "keyerror", "error"]
179
+ .forEach(function (evt) { return session.addEventListener(evt, _this._onEvent); });
180
+ this._unbindSession = function () {
181
+ ["keymessage", "message", "keyadded", "ready", "keyerror", "error"]
182
+ .forEach(function (evt) { return session.removeEventListener(evt, _this._onEvent); });
183
+ };
184
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
185
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
186
+ /* eslint-enable @typescript-eslint/no-unsafe-call */
187
+ };
186
188
  return WebkitMediaKeySession;
187
189
  }(EventEmitter));
188
190
  var WebKitCustomMediaKeys = /** @class */ (function () {
@@ -13,7 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { Observable } from "rxjs";
17
16
  import { ICustomMediaKeySession } from "./custom_media_keys";
18
17
  /**
19
18
  * Modify "initialization data" sent to a `generateKeyRequest` EME call to
@@ -52,6 +51,6 @@ export declare function patchInitData(initData: Uint8Array): Uint8Array;
52
51
  * "encrypted" event for the corresponding request.
53
52
  * @param {string} sessionType - Type of session you want to generate. Consult
54
53
  * EME Specification for more information on session types.
55
- * @returns {Observable} - Emit when done. Errors if fails.
54
+ * @returns {Promise} - Emit when done. Errors if fails.
56
55
  */
57
- export default function generateKeyRequest(session: MediaKeySession | ICustomMediaKeySession, initializationDataType: string | undefined, initializationData: Uint8Array): Observable<unknown>;
56
+ export default function generateKeyRequest(session: MediaKeySession | ICustomMediaKeySession, initializationDataType: string | undefined, initializationData: Uint8Array): Promise<unknown>;
@@ -13,11 +13,9 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { catchError, defer as observableDefer, } from "rxjs";
17
16
  import log from "../../log";
18
17
  import { getNextBoxOffsets } from "../../parsers/containers/isobmff";
19
18
  import { be4toi, concat, } from "../../utils/byte_parsing";
20
- import castToObservable from "../../utils/cast_to_observable";
21
19
  import { PSSH_TO_INTEGER } from "./constants";
22
20
  /**
23
21
  * Modify "initialization data" sent to a `generateKeyRequest` EME call to
@@ -122,32 +120,30 @@ export function patchInitData(initData) {
122
120
  * "encrypted" event for the corresponding request.
123
121
  * @param {string} sessionType - Type of session you want to generate. Consult
124
122
  * EME Specification for more information on session types.
125
- * @returns {Observable} - Emit when done. Errors if fails.
123
+ * @returns {Promise} - Emit when done. Errors if fails.
126
124
  */
127
125
  export default function generateKeyRequest(session, initializationDataType, initializationData) {
128
- return observableDefer(function () {
129
- log.debug("Compat: Calling generateRequest on the MediaKeySession");
130
- var patchedInit;
131
- try {
132
- patchedInit = patchInitData(initializationData);
133
- }
134
- catch (_e) {
135
- patchedInit = initializationData;
126
+ log.debug("Compat: Calling generateRequest on the MediaKeySession");
127
+ var patchedInit;
128
+ try {
129
+ patchedInit = patchInitData(initializationData);
130
+ }
131
+ catch (_e) {
132
+ patchedInit = initializationData;
133
+ }
134
+ var initDataType = initializationDataType !== null && initializationDataType !== void 0 ? initializationDataType : "";
135
+ return session.generateRequest(initDataType, patchedInit)
136
+ .catch(function (error) {
137
+ if (initDataType !== "" || !(error instanceof TypeError)) {
138
+ throw error;
136
139
  }
137
- var initDataType = initializationDataType !== null && initializationDataType !== void 0 ? initializationDataType : "";
138
- return castToObservable(session.generateRequest(initDataType, patchedInit))
139
- .pipe(catchError(function (error) {
140
- if (initDataType !== "" || !(error instanceof TypeError)) {
141
- throw error;
142
- }
143
- // On newer EME versions of the specification, the initialization data
144
- // type given to generateRequest cannot be an empty string (it returns
145
- // a rejected promise with a TypeError in that case).
146
- // Retry with a default "cenc" value for initialization data type if
147
- // we're in that condition.
148
- log.warn("Compat: error while calling `generateRequest` with an empty " +
149
- "initialization data type. Retrying with a default \"cenc\" value.", error);
150
- return castToObservable(session.generateRequest("cenc", patchedInit));
151
- }));
140
+ // On newer EME versions of the specification, the initialization data
141
+ // type given to generateRequest cannot be an empty string (it returns
142
+ // a rejected promise with a TypeError in that case).
143
+ // Retry with a default "cenc" value for initialization data type if
144
+ // we're in that condition.
145
+ log.warn("Compat: error while calling `generateRequest` with an empty " +
146
+ "initialization data type. Retrying with a default \"cenc\" value.", error);
147
+ return session.generateRequest("cenc", patchedInit);
152
148
  });
153
149
  }
@@ -13,7 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { Observable } from "rxjs";
17
16
  import { ICustomMediaKeySession } from "./custom_media_keys";
18
17
  /**
19
18
  * Load a persistent session, based on its `sessionId`, on the given
@@ -29,4 +28,4 @@ import { ICustomMediaKeySession } from "./custom_media_keys";
29
28
  * @param {string} sessionId
30
29
  * @returns {Observable}
31
30
  */
32
- export default function loadSession(session: MediaKeySession | ICustomMediaKeySession, sessionId: string): Observable<boolean>;
31
+ export default function loadSession(session: MediaKeySession | ICustomMediaKeySession, sessionId: string): Promise<boolean>;
@@ -13,11 +13,44 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { defer as observableDefer, map, mergeMap, of as observableOf, race as observableRace, take, timer as observableTimer, } from "rxjs";
16
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
17
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
18
+ return new (P || (P = Promise))(function (resolve, reject) {
19
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
20
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
21
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
22
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
23
+ });
24
+ };
25
+ var __generator = (this && this.__generator) || function (thisArg, body) {
26
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
27
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
28
+ function verb(n) { return function (v) { return step([n, v]); }; }
29
+ function step(op) {
30
+ if (f) throw new TypeError("Generator is already executing.");
31
+ while (_) try {
32
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
33
+ if (y = 0, t) op = [op[0] & 2, t.value];
34
+ switch (op[0]) {
35
+ case 0: case 1: t = op; break;
36
+ case 4: _.label++; return { value: op[1], done: false };
37
+ case 5: _.label++; y = op[1]; op = [0]; continue;
38
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
39
+ default:
40
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
41
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
42
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
43
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
44
+ if (t[2]) _.ops.pop();
45
+ _.trys.pop(); continue;
46
+ }
47
+ op = body.call(thisArg, _);
48
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
49
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
50
+ }
51
+ };
52
+ import PPromise from "pinkie";
17
53
  import log from "../../log";
18
- import castToObservable from "../../utils/cast_to_observable";
19
- import tryCatch from "../../utils/rx-try_catch";
20
- import { onKeyStatusesChange$ } from "../event_listeners";
21
54
  var EME_WAITING_DELAY_LOADED_SESSION_EMPTY_KEYSTATUSES = 100;
22
55
  /**
23
56
  * Load a persistent session, based on its `sessionId`, on the given
@@ -34,17 +67,35 @@ var EME_WAITING_DELAY_LOADED_SESSION_EMPTY_KEYSTATUSES = 100;
34
67
  * @returns {Observable}
35
68
  */
36
69
  export default function loadSession(session, sessionId) {
37
- return observableDefer(function () {
38
- log.info("Compat/EME: Load persisted session", sessionId);
39
- return tryCatch(function () { return castToObservable(session.load(sessionId)); }, undefined);
40
- }).pipe(mergeMap(function (isLoaded) {
41
- if (!isLoaded || session.keyStatuses.size > 0) {
42
- return observableOf(isLoaded);
43
- }
44
- // A browser race condition can exist, seen for example in some
45
- // Chromium/Chrome versions where the `keyStatuses` property from a loaded
46
- // MediaKeySession would not be populated directly as the load answer but
47
- // asynchronously after.
48
- return observableRace(observableTimer(EME_WAITING_DELAY_LOADED_SESSION_EMPTY_KEYSTATUSES), onKeyStatusesChange$(session)).pipe(take(1), map(function () { return isLoaded; }));
49
- }));
70
+ return __awaiter(this, void 0, void 0, function () {
71
+ var isLoaded;
72
+ return __generator(this, function (_a) {
73
+ switch (_a.label) {
74
+ case 0:
75
+ log.info("Compat/DRM: Load persisted session", sessionId);
76
+ return [4 /*yield*/, session.load(sessionId)];
77
+ case 1:
78
+ isLoaded = _a.sent();
79
+ if (!isLoaded || session.keyStatuses.size > 0) {
80
+ return [2 /*return*/, isLoaded];
81
+ }
82
+ // A browser race condition can exist, seen for example in some
83
+ // Chromium/Chrome versions where the `keyStatuses` property from a loaded
84
+ // MediaKeySession would not be populated directly as the load answer but
85
+ // asynchronously after.
86
+ return [2 /*return*/, new PPromise(function (resolve) {
87
+ session.addEventListener("keystatuseschange", resolveWithLoadedStatus);
88
+ var timeout = setTimeout(resolveWithLoadedStatus, EME_WAITING_DELAY_LOADED_SESSION_EMPTY_KEYSTATUSES);
89
+ function resolveWithLoadedStatus() {
90
+ cleanUp();
91
+ resolve(isLoaded);
92
+ }
93
+ function cleanUp() {
94
+ clearTimeout(timeout);
95
+ session.removeEventListener("keystatuseschange", resolveWithLoadedStatus);
96
+ }
97
+ })];
98
+ }
99
+ });
100
+ });
50
101
  }
@@ -24,7 +24,6 @@ import isNonEmptyString from "../utils/is_non_empty_string";
24
24
  import isNode from "./is_node";
25
25
  import shouldFavourCustomSafariEME from "./should_favour_custom_safari_EME";
26
26
  var BROWSER_PREFIXES = ["", "webkit", "moz", "ms"];
27
- var INACTIVITY_DELAY = config.INACTIVITY_DELAY;
28
27
  var pixelRatio = isNode ||
29
28
  window.devicePixelRatio == null ||
30
29
  window.devicePixelRatio === 0 ? 1 :
@@ -140,6 +139,7 @@ function visibilityChange() {
140
139
  * @returns {Observable}
141
140
  */
142
141
  function isPageActive() {
142
+ var INACTIVITY_DELAY = config.getCurrent().INACTIVITY_DELAY;
143
143
  return visibilityChange().pipe(switchMap(function (x) {
144
144
  if (!x) {
145
145
  return observableOf(x).pipe(delay(INACTIVITY_DELAY));
@@ -195,6 +195,7 @@ function onPictureInPictureEvent$(elt) {
195
195
  * @returns {Observable}
196
196
  */
197
197
  function isVideoVisible(pip$) {
198
+ var INACTIVITY_DELAY = config.getCurrent().INACTIVITY_DELAY;
198
199
  return observableCombineLatest([visibilityChange(), pip$]).pipe(switchMap(function (_a) {
199
200
  var isVisible = _a[0], pip = _a[1];
200
201
  if (pip.isEnabled || isVisible) {
@@ -13,7 +13,7 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { isSafari } from "./browser_detection";
16
+ import { isSafariDesktop, isSafariMobile, } from "./browser_detection";
17
17
  import { WebKitMediaKeysConstructor, } from "./eme/custom_media_keys/webkit_media_keys_constructor";
18
18
  /**
19
19
  * On Safari 12.1, it seems that since fairplay CDM implementation
@@ -23,5 +23,5 @@ import { WebKitMediaKeysConstructor, } from "./eme/custom_media_keys/webkit_medi
23
23
  * @returns {boolean}
24
24
  */
25
25
  export default function shouldFavourCustomSafariEME() {
26
- return isSafari && WebKitMediaKeysConstructor !== undefined;
26
+ return (isSafariDesktop || isSafariMobile) && WebKitMediaKeysConstructor !== undefined;
27
27
  }