react-native-theoplayer
Version:
A THEOplayer video component for react-native.
367 lines (363 loc) • 11.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.THEOplayerWebAdapter = void 0;
var _DefaultEventDispatcher = require("./event/DefaultEventDispatcher");
var _reactNativeTheoplayer = require("react-native-theoplayer");
var _THEOplayerWebAdsAdapter = require("./ads/THEOplayerWebAdsAdapter");
var _THEOplayerWebCastAdapter = require("./cast/THEOplayerWebCastAdapter");
var _theoplayer = require("theoplayer");
var _TrackUtils = require("./web/TrackUtils");
var _WebEventForwarder = require("./WebEventForwarder");
var _WebPresentationModeManager = require("./web/WebPresentationModeManager");
var _WebMediaSession = require("./web/WebMediaSession");
var _BaseEvent = require("./event/BaseEvent");
var _EventBroadcastAdapter = require("./broadcast/EventBroadcastAdapter");
var _DefaultTextTrackState = require("./DefaultTextTrackState");
var _THEOAdsWebAdapter = require("./theoads/THEOAdsWebAdapter");
var _cmcdConnectorWeb = require("@theoplayer/cmcd-connector-web");
var _TheoLiveWebAdapter = require("./theolive/TheoLiveWebAdapter");
const defaultBackgroundAudioConfiguration = {
enabled: false
};
const defaultPipConfiguration = {
startsAutomatically: false
};
class THEOplayerWebAdapter extends _DefaultEventDispatcher.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.THEOplayerWebAdsAdapter(this._player);
this._castAdapter = new _THEOplayerWebCastAdapter.THEOplayerWebCastAdapter(this._player);
this._theoAdsAdapter = new _THEOAdsWebAdapter.THEOAdsWebAdapter(this._player);
this._theoliveAdapter = new _TheoLiveWebAdapter.TheoLiveWebAdapter(this._player);
this._textTrackState = new _DefaultTextTrackState.DefaultTextTrackState(this);
this._eventForwarder = new _WebEventForwarder.WebEventForwarder(this._player, this);
this._presentationModeManager = new _WebPresentationModeManager.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.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 = (0, _cmcdConnectorWeb.createCMCDConnector)(this._player);
}
this._cmcdConnector?.reconfigure(this.toWebCmcdConfiguration(source?.cmcd));
}
}
toWebCmcdConfiguration(cmcdConfiguration) {
if (!cmcdConfiguration) {
return undefined;
}
let transmissionMode = _cmcdConnectorWeb.TransmissionMode.QUERY_ARGUMENT;
switch (cmcdConfiguration.transmissionMode) {
case _reactNativeTheoplayer.CmcdTransmissionMode.HTTP_HEADER:
transmissionMode = _cmcdConnectorWeb.TransmissionMode.HTTP_HEADER;
break;
case _reactNativeTheoplayer.CmcdTransmissionMode.JSON_OBJECT:
transmissionMode = _cmcdConnectorWeb.TransmissionMode.JSON_OBJECT;
break;
case _reactNativeTheoplayer.CmcdTransmissionMode.QUERY_ARGUMENT:
case _reactNativeTheoplayer.CmcdTransmissionMode.SDK_DEFAULT:
default:
transmissionMode = _cmcdConnectorWeb.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 ? (0, _TrackUtils.fromNativeMediaTrackList)(this._player.audioTracks) : [];
}
get videoTracks() {
return this._player ? (0, _TrackUtils.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 = (0, _TrackUtils.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 _reactNativeTheoplayer.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: _theoplayer.version,
playerSuiteVersion: '' // deprecated
};
}
destroy() {
this.dispatchEvent(new _BaseEvent.BaseEvent(_reactNativeTheoplayer.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 !== _reactNativeTheoplayer.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.EventBroadcastAdapter(this));
}
get width() {
return this._width;
}
get height() {
return this._height;
}
get videoWidth() {
return this._player?.videoWidth;
}
get videoHeight() {
return this._player?.videoHeight;
}
}
exports.THEOplayerWebAdapter = THEOplayerWebAdapter;
//# sourceMappingURL=THEOplayerWebAdapter.js.map