commit 70a0a07ecc9b61604534f9471f7c7b7cd70a1650 Author: Zoe Roux Date: Mon Jul 27 22:57:03 2026 +0200 build diff --git a/app.plugin.js b/app.plugin.js new file mode 100644 index 0000000..0706fd9 --- /dev/null +++ b/app.plugin.js @@ -0,0 +1 @@ +module.exports = require("./plugin/build").default; diff --git a/lib/commonjs/events.js b/lib/commonjs/events.js new file mode 100644 index 0000000..e9a0df7 --- /dev/null +++ b/lib/commonjs/events.js @@ -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 \ No newline at end of file diff --git a/lib/commonjs/events.js.map b/lib/commonjs/events.js.map new file mode 100644 index 0000000..a2ca2d6 --- /dev/null +++ b/lib/commonjs/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":[]} diff --git a/lib/commonjs/events.web.js b/lib/commonjs/events.web.js new file mode 100644 index 0000000..d7be73b --- /dev/null +++ b/lib/commonjs/events.web.js @@ -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 \ No newline at end of file diff --git a/lib/commonjs/events.web.js.map b/lib/commonjs/events.web.js.map new file mode 100644 index 0000000..c0acd07 --- /dev/null +++ b/lib/commonjs/events.web.js.map @@ -0,0 +1 @@ +{"version":3,"names":["_react","require","_react2","_provider","createEventMapper","key","selector","handler","eventMapper","selectPlayback","cb","value","prev","ended","selectError","error","message","selectTextTrack","tracks","textTrackList","length","i","track","mode","id","label","language","selected","undefined","selectAudioTrack","audioTrackList","find","t","enabled","selectQuality","active","activeVideoRendition","width","height","bitrate","useEvent","event","callback","config","callbackRef","useRef","current","prevRef","useStoreSelector","player","usePlayer","useEffect","onPrev","add","delete","onNext","exports","createMapper","mapper","stateMapper","s","waiting","paused","selectTime","currentTime","selectBuffer","buffered","last","duration","selectPlaybackRate","playbackRate","selectVolume","volume","muted","q","videoRenditionList","some","r","selectRemotePlayback","remotePlaybackState","remotePlaybackAvailability","usePlayerState","_refresh","Error","ret"],"sourceRoot":"../../src","sources":["events.web.tsx"],"mappings":"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","ignoreList":[]} diff --git a/lib/commonjs/index.js b/lib/commonjs/index.js new file mode 100644 index 0000000..424ebfc --- /dev/null +++ b/lib/commonjs/index.js @@ -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 \ No newline at end of file diff --git a/lib/commonjs/index.js.map b/lib/commonjs/index.js.map new file mode 100644 index 0000000..7b31bf0 --- /dev/null +++ b/lib/commonjs/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":[]} diff --git a/lib/commonjs/package.json b/lib/commonjs/package.json new file mode 100644 index 0000000..729ac4d --- /dev/null +++ b/lib/commonjs/package.json @@ -0,0 +1 @@ +{"type":"commonjs"} diff --git a/lib/commonjs/player.web.js b/lib/commonjs/player.web.js new file mode 100644 index 0000000..bdb442f --- /dev/null +++ b/lib/commonjs/player.web.js @@ -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 \ No newline at end of file diff --git a/lib/commonjs/player.web.js.map b/lib/commonjs/player.web.js.map new file mode 100644 index 0000000..cb0d973 --- /dev/null +++ b/lib/commonjs/player.web.js.map @@ -0,0 +1 @@ +{"version":3,"names":["_react","require","_events","getSubtitleFormat","subtitle","mime","mimeType","toLowerCase","ext","link","split","pop","includes","exports","isCustomSubtitle","format","WebOmniPlayer","onPrev","Set","onNext","constructor","store","_store","castStatus","stateMapper","mapper","state","toggleCastStatus","toggleRemotePlayback","castOptions","_source","undefined","_showNotification","overlaySubtitle","overlayListeners","source","subtitles","some","s","id","setOverlaySubtitle","updateMediaSession","showNotification","value","status","isPlaying","paused","ended","currentTime","time","seek","catch","buffered","length","duration","playbackRate","rate","setPlaybackRate","volume","vol","setVolume","muted","toggleMuted","isAutoQuality","quality","selectQuality","videoRenditionList","r","selected","play","setPlaybackState","pause","seekBy","offset","playPrev","cb","playNext","hasPrev","metadata","hasNext","videos","selectVideo","_video","audios","audio","selectAudioTrack","audioTrackList","map","track","i","toString","label","language","enabled","selectAudio","tracks","overlaySubtitles","filter","textTracks","selectTextTrack","textTrackList","x","kind","mode","selectSubtitle","selectSubtitlesTrack","overlay","find","sub","listener","subscribeOverlaySubtitle","callback","add","delete","getOverlaySubtitle","rendition","isSameRendition","a","b","width","height","bitrate","active","activeVideoRendition","selectRendition","selectVideoRendition","navigator","mediaSession","playbackState","session","actions","action","setActionHandler","MediaMetadata","title","artist","album","artwork","imageLink","src","set","handler","d","seekOffset","seekTime"],"sourceRoot":"../../src","sources":["player.web.tsx"],"mappings":"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","ignoreList":[]} diff --git a/lib/commonjs/provider.js b/lib/commonjs/provider.js new file mode 100644 index 0000000..01882d3 --- /dev/null +++ b/lib/commonjs/provider.js @@ -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 \ No newline at end of file diff --git a/lib/commonjs/provider.js.map b/lib/commonjs/provider.js.map new file mode 100644 index 0000000..dc2238f --- /dev/null +++ b/lib/commonjs/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":[]} diff --git a/lib/commonjs/provider.web.js b/lib/commonjs/provider.web.js new file mode 100644 index 0000000..02ea396 --- /dev/null +++ b/lib/commonjs/provider.web.js @@ -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 \ No newline at end of file diff --git a/lib/commonjs/provider.web.js.map b/lib/commonjs/provider.web.js.map new file mode 100644 index 0000000..319c00e --- /dev/null +++ b/lib/commonjs/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":[]} diff --git a/lib/commonjs/specs/omni-player.nitro.js b/lib/commonjs/specs/omni-player.nitro.js new file mode 100644 index 0000000..b2aec8d --- /dev/null +++ b/lib/commonjs/specs/omni-player.nitro.js @@ -0,0 +1,6 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +//# sourceMappingURL=omni-player.nitro.js.map \ No newline at end of file diff --git a/lib/commonjs/specs/omni-player.nitro.js.map b/lib/commonjs/specs/omni-player.nitro.js.map new file mode 100644 index 0000000..732a41f --- /dev/null +++ b/lib/commonjs/specs/omni-player.nitro.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/omni-player.nitro.ts"],"mappings":"","ignoreList":[]} diff --git a/lib/commonjs/specs/omni-view.nitro.js b/lib/commonjs/specs/omni-view.nitro.js new file mode 100644 index 0000000..4f2b8b0 --- /dev/null +++ b/lib/commonjs/specs/omni-view.nitro.js @@ -0,0 +1,6 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +//# sourceMappingURL=omni-view.nitro.js.map \ No newline at end of file diff --git a/lib/commonjs/specs/omni-view.nitro.js.map b/lib/commonjs/specs/omni-view.nitro.js.map new file mode 100644 index 0000000..d834ab2 --- /dev/null +++ b/lib/commonjs/specs/omni-view.nitro.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/omni-view.nitro.ts"],"mappings":"","ignoreList":[]} diff --git a/lib/commonjs/types/events.js b/lib/commonjs/types/events.js new file mode 100644 index 0000000..ba5dbb9 --- /dev/null +++ b/lib/commonjs/types/events.js @@ -0,0 +1,6 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +//# sourceMappingURL=events.js.map \ No newline at end of file diff --git a/lib/commonjs/types/events.js.map b/lib/commonjs/types/events.js.map new file mode 100644 index 0000000..e2cbebb --- /dev/null +++ b/lib/commonjs/types/events.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/events.ts"],"mappings":"","ignoreList":[]} diff --git a/lib/commonjs/types/player.js b/lib/commonjs/types/player.js new file mode 100644 index 0000000..34b1dc0 --- /dev/null +++ b/lib/commonjs/types/player.js @@ -0,0 +1,6 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +//# sourceMappingURL=player.js.map \ No newline at end of file diff --git a/lib/commonjs/types/player.js.map b/lib/commonjs/types/player.js.map new file mode 100644 index 0000000..852741d --- /dev/null +++ b/lib/commonjs/types/player.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/player.ts"],"mappings":"","ignoreList":[]} diff --git a/lib/commonjs/types/source.js b/lib/commonjs/types/source.js new file mode 100644 index 0000000..8c2b534 --- /dev/null +++ b/lib/commonjs/types/source.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=source.js.map \ No newline at end of file diff --git a/lib/commonjs/types/source.js.map b/lib/commonjs/types/source.js.map new file mode 100644 index 0000000..98cd2d5 --- /dev/null +++ b/lib/commonjs/types/source.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/source.ts"],"mappings":"","ignoreList":[]} diff --git a/lib/commonjs/types/subtitles.js b/lib/commonjs/types/subtitles.js new file mode 100644 index 0000000..496aa84 --- /dev/null +++ b/lib/commonjs/types/subtitles.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=subtitles.js.map \ No newline at end of file diff --git a/lib/commonjs/types/subtitles.js.map b/lib/commonjs/types/subtitles.js.map new file mode 100644 index 0000000..d266c1f --- /dev/null +++ b/lib/commonjs/types/subtitles.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/subtitles.ts"],"mappings":"","ignoreList":[]} diff --git a/lib/commonjs/types/view.js b/lib/commonjs/types/view.js new file mode 100644 index 0000000..16442c1 --- /dev/null +++ b/lib/commonjs/types/view.js @@ -0,0 +1,6 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +//# sourceMappingURL=view.js.map \ No newline at end of file diff --git a/lib/commonjs/types/view.js.map b/lib/commonjs/types/view.js.map new file mode 100644 index 0000000..0a0fccc --- /dev/null +++ b/lib/commonjs/types/view.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/view.ts"],"mappings":"","ignoreList":[]} diff --git a/lib/commonjs/utils/lazy-ref.js b/lib/commonjs/utils/lazy-ref.js new file mode 100644 index 0000000..48e4f96 --- /dev/null +++ b/lib/commonjs/utils/lazy-ref.js @@ -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 \ No newline at end of file diff --git a/lib/commonjs/utils/lazy-ref.js.map b/lib/commonjs/utils/lazy-ref.js.map new file mode 100644 index 0000000..34340ab --- /dev/null +++ b/lib/commonjs/utils/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":[]} diff --git a/lib/commonjs/view.js b/lib/commonjs/view.js new file mode 100644 index 0000000..f6f3726 --- /dev/null +++ b/lib/commonjs/view.js @@ -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 \ No newline at end of file diff --git a/lib/commonjs/view.js.map b/lib/commonjs/view.js.map new file mode 100644 index 0000000..7585ea2 --- /dev/null +++ b/lib/commonjs/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":[]} diff --git a/lib/commonjs/view.web.js b/lib/commonjs/view.web.js new file mode 100644 index 0000000..161038b --- /dev/null +++ b/lib/commonjs/view.web.js @@ -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