UNPKG

react-native-theoplayer

Version:

A THEOplayer video component for react-native.

362 lines (358 loc) 10.9 kB
"use strict"; import { DefaultEventDispatcher } from './event/DefaultEventDispatcher'; import { AspectRatio, CmcdTransmissionMode, PlayerEventType, PresentationMode } from 'react-native-theoplayer'; import { THEOplayerWebAdsAdapter } from './ads/THEOplayerWebAdsAdapter'; import { THEOplayerWebCastAdapter } from './cast/THEOplayerWebCastAdapter'; import { version as nativeVersion } from 'theoplayer'; import { findNativeQualitiesByUid, fromNativeMediaTrackList } from './web/TrackUtils'; import { WebEventForwarder } from './WebEventForwarder'; import { WebPresentationModeManager } from './web/WebPresentationModeManager'; import { WebMediaSession } from './web/WebMediaSession'; import { BaseEvent } from './event/BaseEvent'; import { EventBroadcastAdapter } from './broadcast/EventBroadcastAdapter'; import { DefaultTextTrackState } from './DefaultTextTrackState'; import { THEOAdsWebAdapter } from './theoads/THEOAdsWebAdapter'; import { createCMCDConnector, TransmissionMode } from '@theoplayer/cmcd-connector-web'; import { TheoLiveWebAdapter } from './theolive/TheoLiveWebAdapter'; const defaultBackgroundAudioConfiguration = { enabled: false }; const defaultPipConfiguration = { startsAutomatically: false }; export class THEOplayerWebAdapter extends DefaultEventDispatcher { _mediaSession = undefined; _targetVideoQuality = undefined; _backgroundAudioConfiguration = defaultBackgroundAudioConfiguration; _pipConfiguration = defaultPipConfiguration; _externalEventRouter = undefined; _cmcdConnector = undefined; _width = undefined; _height = undefined; constructor(player, config) { super(); this._player = player; this._adsAdapter = new THEOplayerWebAdsAdapter(this._player); this._castAdapter = new THEOplayerWebCastAdapter(this._player); this._theoAdsAdapter = new THEOAdsWebAdapter(this._player); this._theoliveAdapter = new TheoLiveWebAdapter(this._player); this._textTrackState = new DefaultTextTrackState(this); this._eventForwarder = new WebEventForwarder(this._player, this); this._presentationModeManager = new WebPresentationModeManager(this._player, this); document.addEventListener('visibilitychange', this.onVisibilityChange); this._player.addEventListener('dimensionchange', this.onPlayerDimensionChange); // Optionally create a media session connector if (config?.mediaControl?.mediaSessionEnabled !== false) { this._mediaSession = new WebMediaSession(this, player, config?.mediaControl); } } get abr() { return this._player?.abr; } get source() { return this._player?.source; } set source(source) { this._targetVideoQuality = undefined; if (this._player) { this._player.source = source; if (source?.cmcd && this._cmcdConnector === undefined) { this._cmcdConnector = createCMCDConnector(this._player); } this._cmcdConnector?.reconfigure(this.toWebCmcdConfiguration(source?.cmcd)); } } toWebCmcdConfiguration(cmcdConfiguration) { if (!cmcdConfiguration) { return undefined; } let transmissionMode = TransmissionMode.QUERY_ARGUMENT; switch (cmcdConfiguration.transmissionMode) { case CmcdTransmissionMode.HTTP_HEADER: transmissionMode = TransmissionMode.HTTP_HEADER; break; case CmcdTransmissionMode.JSON_OBJECT: transmissionMode = TransmissionMode.JSON_OBJECT; break; case CmcdTransmissionMode.QUERY_ARGUMENT: case CmcdTransmissionMode.SDK_DEFAULT: default: transmissionMode = TransmissionMode.QUERY_ARGUMENT; } return { ...cmcdConfiguration, transmissionMode: transmissionMode }; } play() { this._player?.play(); } pause() { this._player?.pause(); } get paused() { return this._player ? this._player.paused : true; } get autoplay() { return this._player ? this._player.autoplay : false; } set autoplay(autoplay) { if (this._player) { this._player.autoplay = autoplay; } } set preload(type) { if (this._player) { this._player.preload = type; } } get preload() { return this._player?.preload || 'none'; } get seekable() { if (!this._player) { return []; } const nativeRange = this._player.seekable; return [...Array(nativeRange.length)].map((_, index) => ({ start: 1e3 * nativeRange.start(index), end: 1e3 * nativeRange.end(index) })); } get buffered() { if (!this._player) { return []; } const nativeRange = this._player.buffered; return [...Array(nativeRange.length)].map((_, index) => ({ start: 1e3 * nativeRange.start(index), end: 1e3 * nativeRange.end(index) })); } get playbackRate() { return this._player ? this._player.playbackRate : 1; } set playbackRate(playbackRate) { if (this._player) { this._player.playbackRate = playbackRate; } } get pipConfiguration() { return this._pipConfiguration; } set pipConfiguration(config) { this._pipConfiguration = config; } get backgroundAudioConfiguration() { return this._backgroundAudioConfiguration; } set backgroundAudioConfiguration(config) { this._backgroundAudioConfiguration = config; // Notify media session this._mediaSession?.updateMediaSession(); } get volume() { return this._player ? this._player.volume : 1; } set volume(volume) { if (this._player) { this._player.volume = volume; } } get muted() { return this._player ? this._player.muted : false; } set muted(muted) { if (this._player) { this._player.muted = muted; } } get seeking() { return this._player ? this._player.seeking : false; } get presentationMode() { return this._presentationModeManager.presentationMode; } set presentationMode(presentationMode) { this._presentationModeManager.presentationMode = presentationMode; } get audioTracks() { return this._player ? fromNativeMediaTrackList(this._player.audioTracks) : []; } get videoTracks() { return this._player ? fromNativeMediaTrackList(this._player.videoTracks) : []; } get textTracks() { return this._textTrackState.textTracks; } get selectedTextTrack() { return this._player ? this._textTrackState.selectedTextTrack : undefined; } set selectedTextTrack(trackUid) { if (this._player) { this._textTrackState.selectedTextTrack = trackUid; // Apply native selection this._player.textTracks.forEach(textTrack => { if (textTrack.uid === trackUid) { textTrack.mode = 'showing'; } else if (textTrack.mode === 'showing') { textTrack.mode = 'disabled'; } }); } } get textTrackStyle() { return this._player?.textTrackStyle; } get selectedVideoTrack() { if (this._player) { return this._player.videoTracks.find(videoTrack => videoTrack.enabled)?.uid; } return undefined; } set selectedVideoTrack(selectedVideoTrack) { if (this._player) { this._targetVideoQuality = undefined; this._player.videoTracks.forEach(videoTrack => { videoTrack.enabled = videoTrack.uid === selectedVideoTrack; }); } } get selectedAudioTrack() { if (this._player) { return this._player.audioTracks.find(audioTrack => { return audioTrack.enabled; })?.uid; } return undefined; } set selectedAudioTrack(selectedAudioTrack) { if (this._player) { this._player.audioTracks.forEach(audioTrack => { audioTrack.enabled = audioTrack.uid === selectedAudioTrack; }); } } get targetVideoQuality() { if (this._player) { return this._targetVideoQuality; } return undefined; } set targetVideoQuality(targetVideoQuality) { if (this._player) { const enabledVideoTrack = this._player.videoTracks.find(videoTrack => videoTrack.enabled); if (enabledVideoTrack) { enabledVideoTrack.targetQuality = findNativeQualitiesByUid(enabledVideoTrack, targetVideoQuality); } this._targetVideoQuality = targetVideoQuality; } } get currentTime() { return this._player ? 1e3 * this._player.currentTime : NaN; } set currentTime(currentTime) { if (isNaN(currentTime)) { return; } if (this._player) { this._player.currentTime = currentTime / 1e3; } } get currentProgramDateTime() { return this._player?.currentProgramDateTime?.getTime(); } get aspectRatio() { return AspectRatio.FIT; } set aspectRatio(_ratio) { // unused } get keepScreenOn() { return false; } set keepScreenOn(_screenOn) { // unused } get duration() { return this._player ? this._player.duration * 1e3 : NaN; } get ads() { return this._adsAdapter; } get theoads() { return this._theoAdsAdapter; } get cast() { return this._castAdapter; } get theoLive() { return this._theoliveAdapter; } get theolive() { return this._theoliveAdapter; } get version() { return { version: nativeVersion, playerSuiteVersion: '' // deprecated }; } destroy() { this.dispatchEvent(new BaseEvent(PlayerEventType.DESTROY)); this._eventForwarder?.unload(); this._mediaSession?.destroy(); document.removeEventListener('visibilitychange', this.onVisibilityChange); this._eventForwarder = undefined; this._mediaSession = undefined; this._cmcdConnector?.destroy(); this._cmcdConnector = undefined; this._player?.removeEventListener('dimensionchange', this.onPlayerDimensionChange); this._player?.destroy(); this._player = undefined; } onVisibilityChange = () => { if (!this._player) { return; } if (document.visibilityState !== 'visible') { if (this.presentationMode !== PresentationMode.pip) { // Apply background configuration: by default, pause when going to background, unless in pip if (!this.backgroundAudioConfiguration.enabled) { this._player.pause(); } if (this.backgroundAudioConfiguration.stopOnBackground) { this._player.stop(); } } } // Apply media session controls this._mediaSession?.updateMediaSession(); }; onPlayerDimensionChange = event => { if (!this._player) { return; } this._width = event.width; this._height = event.height; }; get nativeHandle() { return this._player; } get broadcast() { return this._externalEventRouter ?? (this._externalEventRouter = new EventBroadcastAdapter(this)); } get width() { return this._width; } get height() { return this._height; } get videoWidth() { return this._player?.videoWidth; } get videoHeight() { return this._player?.videoHeight; } } //# sourceMappingURL=THEOplayerWebAdapter.js.map