mirror of
https://github.com/zoriya/react-native-omni.git
synced 2026-08-16 02:44:51 +00:00
build
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.useEvent = void 0;
|
||||
exports.usePlayerState = usePlayerState;
|
||||
var _react = require("react");
|
||||
var _provider = require("./provider");
|
||||
function capitalize(str) {
|
||||
return str.charAt(0).toUpperCase() + str.slice(1);
|
||||
}
|
||||
const useEvent = (event, callback) => {
|
||||
const player = (0, _provider.usePlayer)();
|
||||
(0, _react.useEffect)(() => {
|
||||
player.eventMap[`addOn${capitalize(event)}Listener`](callback);
|
||||
return () => player.eventMap[`removeOn${capitalize(event)}Listener`](callback);
|
||||
}, [player, event, callback]);
|
||||
};
|
||||
exports.useEvent = useEvent;
|
||||
function usePlayerState(key, refresh) {
|
||||
const player = (0, _provider.usePlayer)();
|
||||
const [ret, setState] = (0, _react.useState)(player[key]);
|
||||
(0, _react.useEffect)(() => {
|
||||
const em = player.eventMap;
|
||||
switch (key) {
|
||||
case "currentTime":
|
||||
case "buffered":
|
||||
case "duration":
|
||||
case "playbackRate":
|
||||
case "volume":
|
||||
em.addStateListener(key, setState);
|
||||
return () => em.removeStateListener(key, setState);
|
||||
case "isPlaying":
|
||||
case "muted":
|
||||
case "isAutoQuality":
|
||||
em.addStateBoolListener(key, setState);
|
||||
return () => em.removeStateBoolListener(key, setState);
|
||||
case "status":
|
||||
em.addPlayerStatusListener(setState);
|
||||
return () => em.removePlayerStatusListener(setState);
|
||||
case "castStatus":
|
||||
em.addCastStatusListener(setState);
|
||||
return () => em.removeCastStatusListener(setState);
|
||||
}
|
||||
}, [player, key]);
|
||||
if (key === "currentTime") refresh ??= 1;
|
||||
(0, _react.useEffect)(() => {
|
||||
if (!refresh || refresh <= 0) return;
|
||||
const int = setInterval(() => {
|
||||
setState(player[key]);
|
||||
}, refresh * 1000);
|
||||
return () => clearInterval(int);
|
||||
}, [refresh, key, player]);
|
||||
return ret;
|
||||
}
|
||||
//# sourceMappingURL=events.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":["_react","require","_provider","capitalize","str","charAt","toUpperCase","slice","useEvent","event","callback","player","usePlayer","useEffect","eventMap","exports","usePlayerState","key","refresh","ret","setState","useState","em","addStateListener","removeStateListener","addStateBoolListener","removeStateBoolListener","addPlayerStatusListener","removePlayerStatusListener","addCastStatusListener","removeCastStatusListener","int","setInterval","clearInterval"],"sourceRoot":"../../src","sources":["events.tsx"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AAKA,SAASE,UAAUA,CAAmBC,GAAM,EAAiB;EAC5D,OAAQA,GAAG,CAACC,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,GAAGF,GAAG,CAACG,KAAK,CAAC,CAAC,CAAC;AACnD;AAEO,MAAMC,QAAQ,GAAGA,CACvBC,KAAY,EACZC,QAA2B,KACvB;EACJ,MAAMC,MAAM,GAAG,IAAAC,mBAAS,EAAC,CAAe;EACxC,IAAAC,gBAAS,EAAC,MAAM;IACfF,MAAM,CAACG,QAAQ,CAAC,QAAQX,UAAU,CAACM,KAAK,CAAC,UAAU,CAAC,CAACC,QAAe,CAAC;IACrE,OAAO,MACNC,MAAM,CAACG,QAAQ,CAAC,WAAWX,UAAU,CAACM,KAAK,CAAC,UAAU,CAAC,CAACC,QAAe,CAAC;EAC1E,CAAC,EAAE,CAACC,MAAM,EAAEF,KAAK,EAAEC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAACK,OAAA,CAAAP,QAAA,GAAAA,QAAA;AASK,SAASQ,cAAcA,CAC7BC,GAAQ,EACRC,OAAgB,EACO;EACvB,MAAMP,MAAM,GAAG,IAAAC,mBAAS,EAAC,CAAe;EACxC,MAAM,CAACO,GAAG,EAAEC,QAAQ,CAAC,GAAG,IAAAC,eAAQ,EAAMV,MAAM,CAACM,GAAG,CAAC,CAAC;EAElD,IAAAJ,gBAAS,EAAC,MAAM;IACf,MAAMS,EAAE,GAAGX,MAAM,CAACG,QAAQ;IAC1B,QAAQG,GAAG;MACV,KAAK,aAAa;MAClB,KAAK,UAAU;MACf,KAAK,UAAU;MACf,KAAK,cAAc;MACnB,KAAK,QAAQ;QACZK,EAAE,CAACC,gBAAgB,CAACN,GAAG,EAAEG,QAAQ,CAAC;QAClC,OAAO,MAAME,EAAE,CAACE,mBAAmB,CAACP,GAAG,EAAEG,QAAQ,CAAC;MACnD,KAAK,WAAW;MAChB,KAAK,OAAO;MACZ,KAAK,eAAe;QACnBE,EAAE,CAACG,oBAAoB,CAACR,GAAG,EAAEG,QAAQ,CAAC;QACtC,OAAO,MAAME,EAAE,CAACI,uBAAuB,CAACT,GAAG,EAAEG,QAAQ,CAAC;MACvD,KAAK,QAAQ;QACZE,EAAE,CAACK,uBAAuB,CAACP,QAAQ,CAAC;QACpC,OAAO,MAAME,EAAE,CAACM,0BAA0B,CAACR,QAAQ,CAAC;MACrD,KAAK,YAAY;QAChBE,EAAE,CAACO,qBAAqB,CAACT,QAAQ,CAAC;QAClC,OAAO,MAAME,EAAE,CAACQ,wBAAwB,CAACV,QAAQ,CAAC;IACpD;EACD,CAAC,EAAE,CAACT,MAAM,EAAEM,GAAG,CAAC,CAAC;EAEjB,IAAIA,GAAG,KAAK,aAAa,EAAEC,OAAO,KAAK,CAAC;EACxC,IAAAL,gBAAS,EAAC,MAAM;IACf,IAAI,CAACK,OAAO,IAAIA,OAAO,IAAI,CAAC,EAAE;IAC9B,MAAMa,GAAG,GAAGC,WAAW,CAAC,MAAM;MAC7BZ,QAAQ,CAACT,MAAM,CAACM,GAAG,CAAC,CAAC;IACtB,CAAC,EAAEC,OAAO,GAAG,IAAI,CAAC;IAClB,OAAO,MAAMe,aAAa,CAACF,GAAG,CAAC;EAChC,CAAC,EAAE,CAACb,OAAO,EAAED,GAAG,EAAEN,MAAM,CAAC,CAAC;EAE1B,OAAOQ,GAAG;AACX","ignoreList":[]}
|
||||
@@ -0,0 +1,156 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.useEvent = exports.stateMapper = void 0;
|
||||
exports.usePlayerState = usePlayerState;
|
||||
var _react = require("@videojs/react");
|
||||
var _react2 = require("react");
|
||||
var _provider = require("./provider.web");
|
||||
function createEventMapper(key, selector, handler) {
|
||||
return {
|
||||
[key]: {
|
||||
selector,
|
||||
handler
|
||||
}
|
||||
};
|
||||
}
|
||||
const eventMapper = {
|
||||
...createEventMapper("end", _react.selectPlayback, (cb, value, prev) => {
|
||||
if (value?.ended && prev && !prev.ended) cb();
|
||||
}),
|
||||
...createEventMapper("error", _react.selectError, (cb, value, prev) => {
|
||||
if (value?.error && value.error !== prev?.error) {
|
||||
cb(value.error.message ?? "Unknown error", value.error.message ?? "Unknown error");
|
||||
}
|
||||
}),
|
||||
...createEventMapper("subtitleChange", _react.selectTextTrack, (cb, value, prev) => {
|
||||
if (value === prev) return;
|
||||
const tracks = value?.textTrackList;
|
||||
if (tracks?.length) {
|
||||
for (let i = 0; i < tracks.length; i++) {
|
||||
const track = tracks[i];
|
||||
if (track?.mode === "showing") {
|
||||
cb({
|
||||
id: `text-${i}`,
|
||||
label: track.label,
|
||||
language: track.language,
|
||||
selected: true
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
cb(undefined);
|
||||
}),
|
||||
...createEventMapper("audioTrackChange", _react.selectAudioTrack, (cb, value) => {
|
||||
if (!value) return;
|
||||
const track = value.audioTrackList.find(t => t.enabled);
|
||||
if (!track) return;
|
||||
cb({
|
||||
id: track.id,
|
||||
label: track.label,
|
||||
language: track.language,
|
||||
selected: true
|
||||
});
|
||||
}),
|
||||
...createEventMapper("renditionChange", _react.selectQuality, (cb, value) => {
|
||||
const active = value?.activeVideoRendition;
|
||||
if (!active) return;
|
||||
cb({
|
||||
id: active.id,
|
||||
width: active.width ?? 0,
|
||||
height: active.height ?? 0,
|
||||
bitrate: active.bitrate ?? 0,
|
||||
selected: true
|
||||
});
|
||||
})
|
||||
};
|
||||
const useEvent = (event, callback) => {
|
||||
const config = eventMapper[event];
|
||||
const callbackRef = (0, _react2.useRef)(callback);
|
||||
callbackRef.current = callback;
|
||||
const prevRef = (0, _react2.useRef)(undefined);
|
||||
const value = (0, _react.usePlayer)(config?.selector ?? (() => undefined));
|
||||
const player = (0, _provider.usePlayer)();
|
||||
(0, _react2.useEffect)(() => {
|
||||
if (!config) return;
|
||||
config.handler(callbackRef.current, value, prevRef.current);
|
||||
prevRef.current = value;
|
||||
}, [value, config]);
|
||||
(0, _react2.useEffect)(() => {
|
||||
// don't use callbackRef.current directly to keep future callback updates
|
||||
const cb = () => callbackRef.current();
|
||||
if (event === "prev") {
|
||||
player.onPrev.add(cb);
|
||||
return () => {
|
||||
player.onPrev.delete(cb);
|
||||
};
|
||||
}
|
||||
if (event === "next") {
|
||||
player.onNext.add(cb);
|
||||
return () => {
|
||||
player.onNext.delete(cb);
|
||||
};
|
||||
}
|
||||
return undefined;
|
||||
}, [event, player]);
|
||||
};
|
||||
exports.useEvent = useEvent;
|
||||
function createMapper(key, selector, mapper) {
|
||||
return {
|
||||
[key]: {
|
||||
selector,
|
||||
mapper
|
||||
}
|
||||
};
|
||||
}
|
||||
const stateMapper = exports.stateMapper = {
|
||||
...createMapper("status", _react.selectPlayback, s => {
|
||||
if (s?.waiting) return "loading";
|
||||
if (s?.ended) return "idle";
|
||||
return "readyToPlay";
|
||||
}),
|
||||
...createMapper("isPlaying", _react.selectPlayback, s => {
|
||||
if (!s) return false;
|
||||
return !s.paused;
|
||||
}),
|
||||
...createMapper("currentTime", _react.selectTime, s => {
|
||||
return s?.currentTime ?? 0;
|
||||
}),
|
||||
...createMapper("buffered", _react.selectBuffer, s => {
|
||||
if (!s?.buffered.length) return 0;
|
||||
const last = s.buffered[s.buffered.length - 1];
|
||||
return last?.[1] ?? 0;
|
||||
}),
|
||||
...createMapper("duration", _react.selectTime, s => {
|
||||
return s?.duration ?? 0;
|
||||
}),
|
||||
...createMapper("playbackRate", _react.selectPlaybackRate, s => {
|
||||
return s?.playbackRate ?? 1;
|
||||
}),
|
||||
...createMapper("volume", _react.selectVolume, s => {
|
||||
return s?.volume ?? 1;
|
||||
}),
|
||||
...createMapper("muted", _react.selectVolume, s => {
|
||||
return s?.muted ?? false;
|
||||
}),
|
||||
...createMapper("isAutoQuality", _react.selectQuality, q => {
|
||||
if (!q) return true;
|
||||
return !q.videoRenditionList.some(r => r.selected);
|
||||
}),
|
||||
...createMapper("castStatus", _react.selectRemotePlayback, r => {
|
||||
if (!r) return "unavailable";
|
||||
if (r.remotePlaybackState === "connecting") return "connecting";
|
||||
if (r.remotePlaybackState === "connected") return "connected";
|
||||
return r.remotePlaybackAvailability;
|
||||
})
|
||||
};
|
||||
function usePlayerState(key, _refresh) {
|
||||
const config = stateMapper[key];
|
||||
if (!config) throw new Error(`No mapper for ${key}`);
|
||||
const ret = (0, _react.usePlayer)(config.selector);
|
||||
return config.mapper(ret);
|
||||
}
|
||||
//# sourceMappingURL=events.web.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,39 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
Object.defineProperty(exports, "OmniProvider", {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return _provider.OmniProvider;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "OmniView", {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return _view.OmniView;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "useEvent", {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return _events.useEvent;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "usePlayer", {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return _provider.usePlayer;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "usePlayerState", {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return _events.usePlayerState;
|
||||
}
|
||||
});
|
||||
var _events = require("./events");
|
||||
var _provider = require("./provider");
|
||||
var _view = require("./view");
|
||||
//# sourceMappingURL=index.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":["_events","require","_provider","_view"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AAqBA,IAAAE,KAAA,GAAAF,OAAA","ignoreList":[]}
|
||||
@@ -0,0 +1 @@
|
||||
{"type":"commonjs"}
|
||||
@@ -0,0 +1,259 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.isCustomSubtitle = exports.getSubtitleFormat = exports.WebOmniPlayer = void 0;
|
||||
var _react = require("@videojs/react");
|
||||
var _events = require("./events.web");
|
||||
const getSubtitleFormat = subtitle => {
|
||||
const mime = subtitle.mimeType?.toLowerCase() ?? "";
|
||||
const ext = subtitle.link.split(/[?#]/)[0]?.split(".").pop()?.toLowerCase();
|
||||
if (mime.includes("ass") || mime.includes("ssa") || ext === "ass" || ext === "ssa") return "ass";
|
||||
if (mime.includes("pgs") || ext === "sup") return "pgs";
|
||||
if (mime.includes("vtt") || ext === "vtt") return "vtt";
|
||||
return "native";
|
||||
};
|
||||
exports.getSubtitleFormat = getSubtitleFormat;
|
||||
const isCustomSubtitle = subtitle => {
|
||||
const format = getSubtitleFormat(subtitle);
|
||||
return format === "ass" || format === "pgs";
|
||||
};
|
||||
exports.isCustomSubtitle = isCustomSubtitle;
|
||||
class WebOmniPlayer {
|
||||
onPrev = new Set();
|
||||
onNext = new Set();
|
||||
constructor(store) {
|
||||
this._store = store;
|
||||
}
|
||||
get castStatus() {
|
||||
return _events.stateMapper.castStatus.mapper(this._store.state);
|
||||
}
|
||||
toggleCastStatus() {
|
||||
this._store.state.toggleRemotePlayback();
|
||||
}
|
||||
castOptions = null;
|
||||
_source = undefined;
|
||||
_showNotification = false;
|
||||
|
||||
// Selected ASS/PGS subtitle (drawn by the overlay); `null` when the active
|
||||
// subtitle is native or off. Exposed as an external store so the view can
|
||||
// react to selection changes.
|
||||
overlaySubtitle = null;
|
||||
overlayListeners = new Set();
|
||||
get source() {
|
||||
return this._source;
|
||||
}
|
||||
set source(source) {
|
||||
this._source = source;
|
||||
// Drop the overlay subtitle if it is not part of the new source.
|
||||
if (this.overlaySubtitle && !source?.subtitles.some(s => s.id === this.overlaySubtitle?.id)) {
|
||||
this.setOverlaySubtitle(null);
|
||||
}
|
||||
this.updateMediaSession();
|
||||
}
|
||||
get showNotification() {
|
||||
return this._showNotification;
|
||||
}
|
||||
set showNotification(value) {
|
||||
this._showNotification = value;
|
||||
this.updateMediaSession();
|
||||
}
|
||||
get status() {
|
||||
const state = this._store.state;
|
||||
return _events.stateMapper.status.mapper(state);
|
||||
}
|
||||
get isPlaying() {
|
||||
return !this._store.state.paused && !this._store.state.ended;
|
||||
}
|
||||
get currentTime() {
|
||||
return this._store.state.currentTime;
|
||||
}
|
||||
set currentTime(time) {
|
||||
this._store.seek(time).catch(() => {});
|
||||
}
|
||||
get buffered() {
|
||||
const buffered = this._store.state.buffered;
|
||||
if (buffered.length === 0) return 0;
|
||||
return buffered[buffered.length - 1]?.[1] ?? 0;
|
||||
}
|
||||
get duration() {
|
||||
return this._store.state.duration;
|
||||
}
|
||||
get playbackRate() {
|
||||
return this._store.state.playbackRate;
|
||||
}
|
||||
set playbackRate(rate) {
|
||||
this._store.setPlaybackRate(rate);
|
||||
}
|
||||
get volume() {
|
||||
return this._store.state.volume;
|
||||
}
|
||||
set volume(vol) {
|
||||
this._store.setVolume(vol);
|
||||
}
|
||||
get muted() {
|
||||
return this._store.state.muted;
|
||||
}
|
||||
set muted(value) {
|
||||
if (value !== this.muted) {
|
||||
this._store.toggleMuted();
|
||||
}
|
||||
}
|
||||
get isAutoQuality() {
|
||||
const quality = (0, _react.selectQuality)(this._store.state);
|
||||
if (!quality) return true;
|
||||
// ABR ("auto") is on whenever no rendition is explicitly pinned.
|
||||
return !quality.videoRenditionList.some(r => r.selected);
|
||||
}
|
||||
play() {
|
||||
this._store.play();
|
||||
this.setPlaybackState("playing");
|
||||
}
|
||||
pause() {
|
||||
this._store.pause();
|
||||
this.setPlaybackState("paused");
|
||||
}
|
||||
seekBy(offset) {
|
||||
this._store.seek(this.currentTime + offset).catch(() => {});
|
||||
}
|
||||
playPrev() {
|
||||
for (const cb of this.onPrev) cb();
|
||||
}
|
||||
playNext() {
|
||||
for (const cb of this.onNext) cb();
|
||||
}
|
||||
get hasPrev() {
|
||||
return this._source?.metadata?.hasPrev ?? false;
|
||||
}
|
||||
get hasNext() {
|
||||
return this._source?.metadata?.hasNext ?? false;
|
||||
}
|
||||
get videos() {
|
||||
// hls.js does not support alternative video tracks (e.g. camera angles)
|
||||
return [];
|
||||
}
|
||||
selectVideo(_video) {
|
||||
// hls.js does not support alternative video tracks
|
||||
}
|
||||
get audios() {
|
||||
const audio = (0, _react.selectAudioTrack)(this._store.state);
|
||||
if (!audio) return [];
|
||||
return audio.audioTrackList.map((track, i) => ({
|
||||
id: track.id ?? i.toString(),
|
||||
label: track.label,
|
||||
language: track.language,
|
||||
selected: track.enabled
|
||||
}));
|
||||
}
|
||||
selectAudio(audio) {
|
||||
const tracks = (0, _react.selectAudioTrack)(this._store.state);
|
||||
if (!tracks) return;
|
||||
tracks.selectAudioTrack(audio.id);
|
||||
}
|
||||
get overlaySubtitles() {
|
||||
return (this._source?.subtitles ?? []).filter(isCustomSubtitle);
|
||||
}
|
||||
get subtitles() {
|
||||
// Every subtitle (incl. ass/pgs) is a real text track now; the cast
|
||||
// receiver draws the ones it can't render natively, keyed off the active
|
||||
// track. So the text-track list already contains all of them.
|
||||
const textTracks = (0, _react.selectTextTrack)(this._store.state)?.textTrackList ?? [];
|
||||
return textTracks.filter(x => x.kind === "subtitles" || x.kind === "captions").map(track => ({
|
||||
id: track.id,
|
||||
label: track.label,
|
||||
language: track.language,
|
||||
selected: track.mode === "showing"
|
||||
}));
|
||||
}
|
||||
selectSubtitle(subtitle) {
|
||||
// Selecting a text track drives local playback and, while casting,
|
||||
// video.js forwards it to the receiver as an active cast track. ass/pgs
|
||||
// additionally need our local overlay since the browser can't render them.
|
||||
const tracks = (0, _react.selectTextTrack)(this._store.state);
|
||||
tracks?.selectSubtitlesTrack(subtitle ? subtitle.id : "off");
|
||||
const overlay = subtitle ? this.overlaySubtitles.find(s => s.id === subtitle.id) : undefined;
|
||||
this.setOverlaySubtitle(overlay ?? null);
|
||||
}
|
||||
setOverlaySubtitle(sub) {
|
||||
if (this.overlaySubtitle === sub) return;
|
||||
this.overlaySubtitle = sub;
|
||||
for (const listener of this.overlayListeners) listener();
|
||||
}
|
||||
|
||||
// External store used by the view to render the ASS/PGS overlay.
|
||||
subscribeOverlaySubtitle = callback => {
|
||||
this.overlayListeners.add(callback);
|
||||
return () => this.overlayListeners.delete(callback);
|
||||
};
|
||||
getOverlaySubtitle = () => this.overlaySubtitle;
|
||||
get rendition() {
|
||||
function isSameRendition(a, b) {
|
||||
return b != null && a.id === b.id && a.width === b.width && a.height === b.height && a.bitrate === b.bitrate;
|
||||
}
|
||||
const quality = (0, _react.selectQuality)(this._store.state);
|
||||
if (!quality) return [];
|
||||
const active = quality.activeVideoRendition;
|
||||
return quality.videoRenditionList.map((rendition, i) => ({
|
||||
id: rendition.id ?? i.toString(),
|
||||
width: rendition.width ?? 0,
|
||||
height: rendition.height ?? 0,
|
||||
bitrate: rendition.bitrate ?? 0,
|
||||
selected: rendition.selected || isSameRendition(rendition, active)
|
||||
}));
|
||||
}
|
||||
selectRendition(rendition) {
|
||||
const tracks = (0, _react.selectQuality)(this._store.state);
|
||||
if (!tracks) return;
|
||||
tracks.selectVideoRendition(rendition ? rendition.id : "auto");
|
||||
}
|
||||
setPlaybackState(state) {
|
||||
if (typeof navigator === "undefined" || !("mediaSession" in navigator)) {
|
||||
return;
|
||||
}
|
||||
if (this._showNotification) navigator.mediaSession.playbackState = state;
|
||||
}
|
||||
updateMediaSession() {
|
||||
if (typeof navigator === "undefined" || !("mediaSession" in navigator)) {
|
||||
return;
|
||||
}
|
||||
const session = navigator.mediaSession;
|
||||
const actions = ["play", "pause", "seekbackward", "seekforward", "seekto", "previoustrack", "nexttrack"];
|
||||
if (!this._showNotification) {
|
||||
session.metadata = null;
|
||||
for (const action of actions) {
|
||||
try {
|
||||
session.setActionHandler(action, null);
|
||||
} catch {}
|
||||
}
|
||||
return;
|
||||
}
|
||||
const metadata = this._source?.metadata;
|
||||
if (metadata && typeof MediaMetadata !== "undefined") {
|
||||
session.metadata = new MediaMetadata({
|
||||
title: metadata.title,
|
||||
artist: metadata.artist ?? "",
|
||||
album: metadata.album ?? "",
|
||||
artwork: metadata.imageLink ? [{
|
||||
src: metadata.imageLink
|
||||
}] : []
|
||||
});
|
||||
}
|
||||
const set = (action, handler) => {
|
||||
try {
|
||||
session.setActionHandler(action, handler);
|
||||
} catch {}
|
||||
};
|
||||
set("play", () => this.play());
|
||||
set("pause", () => this.pause());
|
||||
set("seekbackward", d => this.seekBy(-(d.seekOffset ?? 10)));
|
||||
set("seekforward", d => this.seekBy(d.seekOffset ?? 10));
|
||||
set("seekto", d => {
|
||||
if (d.seekTime != null) this.currentTime = d.seekTime;
|
||||
});
|
||||
set("previoustrack", this.hasPrev ? () => this.playPrev() : null);
|
||||
set("nexttrack", this.hasNext ? () => this.playNext() : null);
|
||||
}
|
||||
}
|
||||
exports.WebOmniPlayer = WebOmniPlayer;
|
||||
//# sourceMappingURL=player.web.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,39 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.usePlayer = exports.OmniProvider = void 0;
|
||||
var _react = require("react");
|
||||
var _reactNativeNitroModules = require("react-native-nitro-modules");
|
||||
var _lazyRef = require("./utils/lazy-ref");
|
||||
var _jsxRuntime = require("react/jsx-runtime");
|
||||
const ProviderFactory = _reactNativeNitroModules.NitroModules.createHybridObject("OmniPlayerFactory");
|
||||
const PlayerCtx = /*#__PURE__*/(0, _react.createContext)(null);
|
||||
const OmniProvider = ({
|
||||
children,
|
||||
source,
|
||||
backend = {
|
||||
android: "vlc"
|
||||
},
|
||||
showNotification = false,
|
||||
cast
|
||||
}) => {
|
||||
const player = (0, _lazyRef.useLazyRef)(() => ProviderFactory.createPlayer(source, backend, cast));
|
||||
(0, _react.useEffect)(() => {
|
||||
player.source = source;
|
||||
}, [source]);
|
||||
(0, _react.useEffect)(() => {
|
||||
player.showNotification = showNotification;
|
||||
}, [showNotification]);
|
||||
return /*#__PURE__*/(0, _jsxRuntime.jsx)(PlayerCtx.Provider, {
|
||||
value: player,
|
||||
children: children
|
||||
});
|
||||
};
|
||||
exports.OmniProvider = OmniProvider;
|
||||
const usePlayer = () => {
|
||||
return (0, _react.useContext)(PlayerCtx);
|
||||
};
|
||||
exports.usePlayer = usePlayer;
|
||||
//# sourceMappingURL=provider.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":["_react","require","_reactNativeNitroModules","_lazyRef","_jsxRuntime","ProviderFactory","NitroModules","createHybridObject","PlayerCtx","createContext","OmniProvider","children","source","backend","android","showNotification","cast","player","useLazyRef","createPlayer","useEffect","jsx","Provider","value","exports","usePlayer","useContext"],"sourceRoot":"../../src","sources":["provider.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,wBAAA,GAAAD,OAAA;AAIA,IAAAE,QAAA,GAAAF,OAAA;AAA8C,IAAAG,WAAA,GAAAH,OAAA;AAE9C,MAAMI,eAAe,GACpBC,qCAAY,CAACC,kBAAkB,CAAoB,mBAAmB,CAAC;AAExE,MAAMC,SAAS,gBAAG,IAAAC,oBAAa,EAAa,IAAK,CAAC;AAE3C,MAAMC,YAAY,GAAGA,CAAC;EAC5BC,QAAQ;EACRC,MAAM;EACNC,OAAO,GAAG;IAAEC,OAAO,EAAE;EAAM,CAAC;EAC5BC,gBAAgB,GAAG,KAAK;EACxBC;AAOD,CAAC,KAAK;EACL,MAAMC,MAAM,GAAG,IAAAC,mBAAU,EAAC,MACzBb,eAAe,CAACc,YAAY,CAACP,MAAM,EAAEC,OAAO,EAAEG,IAAI,CACnD,CAAC;EAED,IAAAI,gBAAS,EAAC,MAAM;IACfH,MAAM,CAACL,MAAM,GAAGA,MAAM;EACvB,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EAEZ,IAAAQ,gBAAS,EAAC,MAAM;IACfH,MAAM,CAACF,gBAAgB,GAAGA,gBAAgB;EAC3C,CAAC,EAAE,CAACA,gBAAgB,CAAC,CAAC;EAEtB,oBAAO,IAAAX,WAAA,CAAAiB,GAAA,EAACb,SAAS,CAACc,QAAQ;IAACC,KAAK,EAAEN,MAAO;IAAAN,QAAA,EAAEA;EAAQ,CAAqB,CAAC;AAC1E,CAAC;AAACa,OAAA,CAAAd,YAAA,GAAAA,YAAA;AAEK,MAAMe,SAAS,GAAGA,CAAA,KAAM;EAC9B,OAAO,IAAAC,iBAAU,EAAClB,SAAS,CAAC;AAC7B,CAAC;AAACgB,OAAA,CAAAC,SAAA,GAAAA,SAAA","ignoreList":[]}
|
||||
@@ -0,0 +1,65 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.usePlayer = exports.VideoPlayer = exports.OmniProvider = void 0;
|
||||
var _react = require("@videojs/react");
|
||||
var _video = require("@videojs/react/video");
|
||||
var _react2 = require("react");
|
||||
var _player = require("./player.web");
|
||||
var _lazyRef = require("./utils/lazy-ref");
|
||||
var _jsxRuntime = require("react/jsx-runtime");
|
||||
const VideoPlayer = exports.VideoPlayer = (0, _react.createPlayer)({
|
||||
features: _video.videoFeatures
|
||||
});
|
||||
const PlayerCtx = /*#__PURE__*/(0, _react2.createContext)(null);
|
||||
const OmniProvider = ({
|
||||
children,
|
||||
source,
|
||||
cast,
|
||||
// Web always uses video.js; accepted for API parity with native.
|
||||
backend: _backend,
|
||||
showNotification = false
|
||||
}) => {
|
||||
return /*#__PURE__*/(0, _jsxRuntime.jsx)(VideoPlayer.Provider, {
|
||||
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(PlayerInitializer, {
|
||||
source: source,
|
||||
cast: cast,
|
||||
showNotification: showNotification,
|
||||
children: children
|
||||
})
|
||||
});
|
||||
};
|
||||
exports.OmniProvider = OmniProvider;
|
||||
const PlayerInitializer = ({
|
||||
children,
|
||||
source,
|
||||
cast,
|
||||
showNotification
|
||||
}) => {
|
||||
const store = VideoPlayer.usePlayer();
|
||||
const player = (0, _lazyRef.useLazyRef)(() => new _player.WebOmniPlayer(store));
|
||||
const seekedForSrc = (0, _react2.useRef)(undefined);
|
||||
(0, _react2.useEffect)(() => {
|
||||
player.source = source;
|
||||
const uri = source?.src?.uri;
|
||||
if (uri !== seekedForSrc.current) {
|
||||
seekedForSrc.current = uri;
|
||||
if (source?.startTime) store.seek(source.startTime);
|
||||
}
|
||||
}, [source, store]);
|
||||
(0, _react2.useEffect)(() => {
|
||||
player.castOptions = cast ?? null;
|
||||
}, [cast]);
|
||||
(0, _react2.useEffect)(() => {
|
||||
player.showNotification = showNotification;
|
||||
}, [showNotification]);
|
||||
return /*#__PURE__*/(0, _jsxRuntime.jsx)(PlayerCtx.Provider, {
|
||||
value: player,
|
||||
children: children
|
||||
});
|
||||
};
|
||||
const usePlayer = () => (0, _react2.useContext)(PlayerCtx);
|
||||
exports.usePlayer = usePlayer;
|
||||
//# sourceMappingURL=provider.web.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":["_react","require","_video","_react2","_player","_lazyRef","_jsxRuntime","VideoPlayer","exports","createPlayer","features","videoFeatures","PlayerCtx","createContext","OmniProvider","children","source","cast","backend","_backend","showNotification","jsx","Provider","PlayerInitializer","store","usePlayer","player","useLazyRef","WebOmniPlayer","seekedForSrc","useRef","undefined","useEffect","uri","src","current","startTime","seek","castOptions","value","useContext"],"sourceRoot":"../../src","sources":["provider.web.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAOA,IAAAG,OAAA,GAAAH,OAAA;AAGA,IAAAI,QAAA,GAAAJ,OAAA;AAA8C,IAAAK,WAAA,GAAAL,OAAA;AAEvC,MAAMM,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,IAAAE,mBAAY,EAAC;EAAEC,QAAQ,EAAEC;AAAc,CAAC,CAAC;AAEpE,MAAMC,SAAS,gBAAG,IAAAC,qBAAa,EAAa,IAAK,CAAC;AAE3C,MAAMC,YAAY,GAAGA,CAAC;EAC5BC,QAAQ;EACRC,MAAM;EACNC,IAAI;EACJ;EACAC,OAAO,EAAEC,QAAQ;EACjBC,gBAAgB,GAAG;AAOpB,CAAC,KAAK;EACL,oBACC,IAAAd,WAAA,CAAAe,GAAA,EAACd,WAAW,CAACe,QAAQ;IAAAP,QAAA,eACpB,IAAAT,WAAA,CAAAe,GAAA,EAACE,iBAAiB;MACjBP,MAAM,EAAEA,MAAO;MACfC,IAAI,EAAEA,IAAK;MACXG,gBAAgB,EAAEA,gBAAiB;MAAAL,QAAA,EAElCA;IAAQ,CACS;EAAC,CACC,CAAC;AAEzB,CAAC;AAACP,OAAA,CAAAM,YAAA,GAAAA,YAAA;AAEF,MAAMS,iBAAiB,GAAGA,CAAC;EAC1BR,QAAQ;EACRC,MAAM;EACNC,IAAI;EACJG;AAMD,CAAC,KAAK;EACL,MAAMI,KAAK,GAAGjB,WAAW,CAACkB,SAAS,CAAC,CAAC;EACrC,MAAMC,MAAM,GAAG,IAAAC,mBAAU,EAAC,MAAM,IAAIC,qBAAa,CAACJ,KAAK,CAAC,CAAC;EACzD,MAAMK,YAAY,GAAG,IAAAC,cAAM,EAAqBC,SAAS,CAAC;EAE1D,IAAAC,iBAAS,EAAC,MAAM;IACfN,MAAM,CAACV,MAAM,GAAGA,MAAM;IACtB,MAAMiB,GAAG,GAAGjB,MAAM,EAAEkB,GAAG,EAAED,GAAG;IAC5B,IAAIA,GAAG,KAAKJ,YAAY,CAACM,OAAO,EAAE;MACjCN,YAAY,CAACM,OAAO,GAAGF,GAAG;MAC1B,IAAIjB,MAAM,EAAEoB,SAAS,EAAEZ,KAAK,CAACa,IAAI,CAACrB,MAAM,CAACoB,SAAS,CAAC;IACpD;EACD,CAAC,EAAE,CAACpB,MAAM,EAAEQ,KAAK,CAAC,CAAC;EAEnB,IAAAQ,iBAAS,EAAC,MAAM;IACfN,MAAM,CAACY,WAAW,GAAGrB,IAAI,IAAI,IAAI;EAClC,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EAEV,IAAAe,iBAAS,EAAC,MAAM;IACfN,MAAM,CAACN,gBAAgB,GAAGA,gBAAgB;EAC3C,CAAC,EAAE,CAACA,gBAAgB,CAAC,CAAC;EAEtB,oBAAO,IAAAd,WAAA,CAAAe,GAAA,EAACT,SAAS,CAACU,QAAQ;IAACiB,KAAK,EAAEb,MAAO;IAAAX,QAAA,EAAEA;EAAQ,CAAqB,CAAC;AAC1E,CAAC;AAEM,MAAMU,SAAS,GAAGA,CAAA,KAAM,IAAAe,kBAAU,EAAC5B,SAAS,CAAC;AAACJ,OAAA,CAAAiB,SAAA,GAAAA,SAAA","ignoreList":[]}
|
||||
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
//# sourceMappingURL=omni-player.nitro.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/omni-player.nitro.ts"],"mappings":"","ignoreList":[]}
|
||||
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
//# sourceMappingURL=omni-view.nitro.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/omni-view.nitro.ts"],"mappings":"","ignoreList":[]}
|
||||
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
//# sourceMappingURL=events.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/events.ts"],"mappings":"","ignoreList":[]}
|
||||
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
//# sourceMappingURL=player.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/player.ts"],"mappings":"","ignoreList":[]}
|
||||
@@ -0,0 +1,2 @@
|
||||
"use strict";
|
||||
//# sourceMappingURL=source.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/source.ts"],"mappings":"","ignoreList":[]}
|
||||
@@ -0,0 +1,2 @@
|
||||
"use strict";
|
||||
//# sourceMappingURL=subtitles.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/subtitles.ts"],"mappings":"","ignoreList":[]}
|
||||
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
//# sourceMappingURL=view.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/view.ts"],"mappings":"","ignoreList":[]}
|
||||
@@ -0,0 +1,13 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.useLazyRef = void 0;
|
||||
var _react = require("react");
|
||||
const useLazyRef = init => {
|
||||
const [ret] = (0, _react.useState)(init);
|
||||
return ret;
|
||||
};
|
||||
exports.useLazyRef = useLazyRef;
|
||||
//# sourceMappingURL=lazy-ref.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":["_react","require","useLazyRef","init","ret","useState","exports"],"sourceRoot":"../../../src","sources":["utils/lazy-ref.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEO,MAAMC,UAAU,GAAOC,IAAa,IAAQ;EAClD,MAAM,CAACC,GAAG,CAAC,GAAG,IAAAC,eAAQ,EAAIF,IAAI,CAAC;EAC/B,OAAOC,GAAG;AACX,CAAC;AAACE,OAAA,CAAAJ,UAAA,GAAAA,UAAA","ignoreList":[]}
|
||||
@@ -0,0 +1,25 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.OmniView = void 0;
|
||||
var _react = require("react");
|
||||
var _reactNativeNitroModules = require("react-native-nitro-modules");
|
||||
var _OmniViewConfig = _interopRequireDefault(require("../nitrogen/generated/shared/json/OmniViewConfig.json"));
|
||||
var _provider = require("./provider");
|
||||
var _jsxRuntime = require("react/jsx-runtime");
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
||||
const NativeView = /*#__PURE__*/(0, _react.memo)((0, _reactNativeNitroModules.getHostComponent)("OmniView", () => _OmniViewConfig.default));
|
||||
const OmniView = exports.OmniView = /*#__PURE__*/(0, _react.memo)(({
|
||||
// Web-only; not forwarded to the native view.
|
||||
subtitleAssets: _subtitleAssets,
|
||||
...props
|
||||
}) => {
|
||||
const player = (0, _provider.usePlayer)();
|
||||
return /*#__PURE__*/(0, _jsxRuntime.jsx)(NativeView, {
|
||||
player: player,
|
||||
...props
|
||||
});
|
||||
});
|
||||
//# sourceMappingURL=view.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"names":["_react","require","_reactNativeNitroModules","_OmniViewConfig","_interopRequireDefault","_provider","_jsxRuntime","e","__esModule","default","NativeView","memo","getHostComponent","OmniConfig","OmniView","exports","subtitleAssets","_subtitleAssets","props","player","usePlayer","jsx"],"sourceRoot":"../../src","sources":["view.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,wBAAA,GAAAD,OAAA;AAIA,IAAAE,eAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AAAuC,IAAAK,WAAA,GAAAL,OAAA;AAAA,SAAAG,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAKvC,MAAMG,UAAU,gBAAG,IAAAC,WAAI,EACtB,IAAAC,yCAAgB,EAA2B,UAAU,EAAE,MAAMC,uBAAU,CACxE,CAAC;AAEM,MAAMC,QAAQ,GAAAC,OAAA,CAAAD,QAAA,gBAAG,IAAAH,WAAI,EAC3B,CAAC;EACA;EACAK,cAAc,EAAEC,eAAe;EAC/B,GAAGC;AACkC,CAAC,KAAK;EAC3C,MAAMC,MAAM,GAAG,IAAAC,mBAAS,EAAC,CAAe;EACxC,oBAAO,IAAAd,WAAA,CAAAe,GAAA,EAACX,UAAU;IAACS,MAAM,EAAEA,MAAO;IAAA,GAAKD;EAAK,CAAG,CAAC;AACjD,CACD,CAAC","ignoreList":[]}
|
||||
@@ -0,0 +1,171 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.OmniView = void 0;
|
||||
var _hlsjsVideo = require("@videojs/react/media/hlsjs-video");
|
||||
var _video = require("@videojs/react/video");
|
||||
var _react = require("react");
|
||||
var _events = require("./events");
|
||||
var _player = require("./player.web");
|
||||
var _provider = require("./provider.web");
|
||||
var _jsxRuntime = require("react/jsx-runtime");
|
||||
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
||||
const SubtitleOverlay = ({
|
||||
video,
|
||||
assets,
|
||||
fonts
|
||||
}) => {
|
||||
const player = (0, _provider.usePlayer)();
|
||||
const subtitle = (0, _react.useSyncExternalStore)(player.subscribeOverlaySubtitle, player.getOverlaySubtitle, () => null);
|
||||
const assetsRef = (0, _react.useRef)(assets);
|
||||
assetsRef.current = assets;
|
||||
const fontsRef = (0, _react.useRef)(fonts);
|
||||
fontsRef.current = fonts;
|
||||
(0, _react.useEffect)(() => {
|
||||
const el = video.current;
|
||||
if (!el || !subtitle) return;
|
||||
let renderer = null;
|
||||
let cancelled = false;
|
||||
const attach = created => {
|
||||
if (cancelled) created.destroy();else renderer = created;
|
||||
};
|
||||
if ((0, _player.getSubtitleFormat)(subtitle) === "ass") {
|
||||
const jassub = assetsRef.current?.jassub;
|
||||
const fonts = fontsRef.current;
|
||||
// The video's source resolution (its highest available rendition).
|
||||
// jassub uses this as libass' storage size so subtitles stay sharp
|
||||
// even while a low-bitrate rendition is playing — otherwise the
|
||||
// raster tracks the currently-decoded (possibly tiny) frame size.
|
||||
const renditions = player.rendition;
|
||||
const videoWidth = Math.max(0, ...renditions.map(r => r.width));
|
||||
const videoHeight = Math.max(0, ...renditions.map(r => r.height));
|
||||
Promise.resolve().then(() => _interopRequireWildcard(require("jassub"))).then(({
|
||||
default: JASSUB
|
||||
}) => {
|
||||
const instance = new JASSUB({
|
||||
video: el,
|
||||
subUrl: subtitle.link,
|
||||
...(videoWidth && {
|
||||
videoWidth
|
||||
}),
|
||||
...(videoHeight && {
|
||||
videoHeight
|
||||
}),
|
||||
...(fonts?.length && {
|
||||
fonts
|
||||
}),
|
||||
...(jassub?.workerUrl && {
|
||||
workerUrl: jassub.workerUrl
|
||||
}),
|
||||
...(jassub?.wasmUrl && {
|
||||
wasmUrl: jassub.wasmUrl
|
||||
}),
|
||||
...(jassub?.modernWasmUrl && {
|
||||
modernWasmUrl: jassub.modernWasmUrl
|
||||
}),
|
||||
...(jassub?.fontUrl && {
|
||||
availableFonts: {
|
||||
"liberation sans": jassub.fontUrl
|
||||
},
|
||||
defaultFont: "liberation sans"
|
||||
})
|
||||
});
|
||||
attach({
|
||||
destroy: () => instance.destroy()
|
||||
});
|
||||
}).catch(e => console.error("[omni] failed to render ass subtitle", e));
|
||||
} else {
|
||||
const pgs = assetsRef.current?.pgs;
|
||||
Promise.resolve().then(() => _interopRequireWildcard(require("libpgs"))).then(({
|
||||
PgsRenderer
|
||||
}) => {
|
||||
const instance = new PgsRenderer({
|
||||
video: el,
|
||||
subUrl: subtitle.link,
|
||||
workerUrl: pgs?.workerUrl ?? new URL("libpgs/dist/libpgs.worker.js", import.meta.url).href
|
||||
});
|
||||
attach({
|
||||
destroy: () => instance.dispose()
|
||||
});
|
||||
}).catch(e => console.error("[omni] failed to render pgs subtitle", e));
|
||||
}
|
||||
return () => {
|
||||
cancelled = true;
|
||||
renderer?.destroy();
|
||||
};
|
||||
}, [video, subtitle, player]);
|
||||
return null;
|
||||
};
|
||||
const OmniView = ({
|
||||
style,
|
||||
autoplay,
|
||||
subtitleAssets
|
||||
}) => {
|
||||
const player = (0, _provider.usePlayer)();
|
||||
const containerRef = (0, _react.useRef)(null);
|
||||
const ref = (0, _react.useRef)(undefined);
|
||||
const src = player.source?.src;
|
||||
const isHls = src?.mimeType?.toLowerCase().includes("mpegurl") || src?.uri.split(/[?#]/)[0]?.toLowerCase().endsWith(".m3u8") || false;
|
||||
const Tech = isHls ? _hlsjsVideo.HlsJsVideo : _video.Video;
|
||||
const headersRef = (0, _react.useRef)(src?.headers);
|
||||
headersRef.current = src?.headers;
|
||||
const castId = player.source?.castId;
|
||||
const castData = player.source?.castData;
|
||||
const config = (0, _react.useMemo)(() => ({
|
||||
hlsJs: {
|
||||
xhrSetup: xhr => {
|
||||
const headers = headersRef.current;
|
||||
if (!headers) return;
|
||||
for (const [key, value] of Object.entries(headers)) {
|
||||
if (value) xhr.setRequestHeader(key, value);
|
||||
}
|
||||
}
|
||||
},
|
||||
googleCast: {
|
||||
receiver: player.castOptions?.receiverApplicationId,
|
||||
customData: castData ?? null,
|
||||
...(castId && {
|
||||
src: castId
|
||||
})
|
||||
}
|
||||
}), [player.castOptions, castData, castId]);
|
||||
|
||||
// While casting, the receiver renders subtitles (the player forwards the
|
||||
// selection); skip rendering them locally on the idle <video>.
|
||||
const castStatus = (0, _events.usePlayerState)("castStatus");
|
||||
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_provider.VideoPlayer.Container, {
|
||||
ref: containerRef,
|
||||
style: {
|
||||
position: "relative",
|
||||
...style
|
||||
},
|
||||
children: [src && /*#__PURE__*/(0, _jsxRuntime.jsx)(Tech, {
|
||||
ref: ref,
|
||||
src: src.uri,
|
||||
config: config,
|
||||
autoPlay: autoplay,
|
||||
playsInline: true,
|
||||
crossOrigin: "anonymous",
|
||||
style: {
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
objectFit: "contain"
|
||||
},
|
||||
children: (player.source?.subtitles ?? []).map(subtitle => /*#__PURE__*/(0, _jsxRuntime.jsx)("track", {
|
||||
id: subtitle.id,
|
||||
kind: "subtitles",
|
||||
src: subtitle.link,
|
||||
srcLang: subtitle.language,
|
||||
label: subtitle.label ?? subtitle.language ?? subtitle.id
|
||||
}, subtitle.id))
|
||||
}), castStatus !== "connected" && castStatus !== "connecting" && /*#__PURE__*/(0, _jsxRuntime.jsx)(SubtitleOverlay, {
|
||||
video: ref,
|
||||
assets: subtitleAssets,
|
||||
fonts: player.source?.fonts
|
||||
})]
|
||||
});
|
||||
};
|
||||
exports.OmniView = OmniView;
|
||||
//# sourceMappingURL=view.web.js.map
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user