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