react-native-theoplayer
Version:
A THEOplayer video component for react-native.
362 lines (358 loc) • 10.9 kB
JavaScript
"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