@asicupv/paella-video-plugins
Version:
More video formats for Paella Player
545 lines (544 loc) • 21.9 kB
JavaScript
import { AudioTrackData as e, Events as t, HtmlVideo as n, MenuButtonPlugin as r, Mp4Video as i, PluginModule as a, VideoPlugin as o, VideoQualityItem as s, triggerEvent as c, utils as l } from "@asicupv/paella-core";
var u = {
name: "@asicupv/paella-video-plugins",
version: "2.5.2",
exports: {
".": "./dist/paella-video-plugins.js",
"./paella-video-plugins.css": "./dist/paella-video-plugins.css",
"./src/": "./src/"
},
description: "More video formats for Paella Player",
main: "./dist/paella-video-plugins.js",
publishConfig: { access: "public" },
type: "module",
module: "./dist/paella-video-plugins.js",
files: [
"dist/paella-video-plugins.css",
"dist/paella-video-plugins.js",
"dist/paella-video-plugins.js.map",
"dist/hls*",
"dist/paella-video-plugins.d.ts"
],
scripts: {
dev: "vite build --watch",
build: "vite build --emptyOutDir && npm run bundle:types",
"bundle:types": "dts-bundle-generator -o dist/paella-video-plugins.d.ts dist/index.d.ts --external-inlines=@asicupv --no-check",
"clean:build": "rimraf .turbo dist",
"clean:deps": "rimraf node_modules"
},
repository: {
type: "git",
url: "git+https://github.com/polimediaupv/paella-player.git"
},
keywords: [
"paella",
"player",
"zoom",
"slide",
"presentation",
"blackboard",
"whiteboard",
"hls"
],
author: "Fernando Serrano Carpena <ferserc1@gmail.com>",
license: "SEE LICENSE IN license.txt",
bugs: { url: "https://github.com/polimediaupv/paella-video-plugins/issues" },
homepage: "https://github.com/polimediaupv/paella-video-plugins#readme",
devDependencies: {
"@asicupv/paella-core": "^2.12.8",
vite: "^8.0.10",
"vite-plugin-dts": "^4.5.4"
},
dependencies: { "hls.js": "^1.5.20" },
peerDependencies: { "@asicupv/paella-core": "^2.12.8" }
}, d = null, f = class e extends a {
static Get() {
return d ||= new e(), d;
}
get moduleName() {
return "paella-video-plugins";
}
get moduleVersion() {
return u.version;
}
}, p = {
autoStartLoad: !0,
startPosition: -1,
capLevelToPlayerSize: !0,
debug: !1,
defaultAudioCodec: void 0,
initialLiveManifestSize: 1,
maxBufferLength: 6,
maxMaxBufferLength: 6,
maxBufferSize: 600 * 1e3 * 1e3,
maxBufferHole: .5,
lowBufferWatchdogPeriod: .5,
highBufferWatchdogPeriod: 3,
nudgeOffset: .1,
nudgeMaxRetry: 3,
maxFragLookUpTolerance: .2,
enableWorker: !0,
enableSoftwareAES: !0,
manifestLoadingTimeOut: 1e4,
manifestLoadingMaxRetry: 1,
manifestLoadingRetryDelay: 500,
manifestLoadingMaxRetryTimeout: 64e3,
startLevel: void 0,
levelLoadingTimeOut: 1e4,
levelLoadingMaxRetry: 4,
levelLoadingRetryDelay: 500,
levelLoadingMaxRetryTimeout: 64e3,
fragLoadingTimeOut: 2e4,
fragLoadingMaxRetry: 6,
fragLoadingRetryDelay: 500,
fragLoadingMaxRetryTimeout: 64e3,
startFragPrefetch: !1,
appendErrorMaxRetry: 3,
enableWebVTT: !0,
enableCEA708Captions: !0,
stretchShortVideoTrack: !1,
maxAudioFramesDrift: 1,
forceKeyFrameOnDiscontinuity: !0,
abrEwmaFastLive: 5,
abrEwmaSlowLive: 9,
abrEwmaFastVoD: 4,
abrEwmaSlowVoD: 15,
abrEwmaDefaultEstimate: 5e5,
abrBandWidthFactor: .95,
abrBandWidthUpFactor: .7,
minAutoBitrate: 0
}, m = {
withCredentials: !0,
requestHeaders: {
"Access-Control-Allow-Headers": "Content-Type, Accept, X-Requested-With",
"Access-Control-Allow-Origin": "http://localhost:8000",
"Access-Control-Allow-Credentials": "true"
}
}, h = {
UNSUPPORTED: 0,
MEDIA_SOURCE_EXTENSIONS: 1,
NATIVE: 2
}, g = null;
async function _() {
return g ||= (console.debug("Loading HLS.js"), (await import("./hls.js")).default), g;
}
async function v(e = !1) {
let t = await _(), n = document.createElement("video");
return n.canPlayType("application/vnd.apple.mpegurl") && e ? h.NATIVE : t.isSupported() ? h.MEDIA_SOURCE_EXTENSIONS : n.canPlayType("application/vnd.apple.mpegurl") ? h.NATIVE : h.UNSUPPORTED;
}
var y = async (e, n, r, i, a) => {
let o = await _();
a.withCredentials && (i.xhrSetup = function(e, t) {
e.withCredentials = a.withCredentials;
for (let t in a.requestHeaders) {
let n = a.requestHeaders[t];
e.setRequestHeader(t, n);
}
}), i.autoStartLoad = !0;
let s = new o(i), l = n?.sources?.hls?.length > 0 && n.sources.hls[0] || {
src: "",
mimetype: ""
};
return [s, new Promise((n, a) => {
let u = !1;
s.on(o.Events.LEVEL_SWITCHED, (n, r) => {
e.log.debug(`HLS: quality level switched to ${r.level}`), u ||= (s.currentLevel = -1, !0), c(e, t.VIDEO_QUALITY_CHANGED, {});
}), s.on(o.Events.ERROR, (t, n) => {
if (n.fatal) switch (n.type) {
case o.ErrorTypes.NETWORK_ERROR:
n.details === o.ErrorDetails.MANIFEST_LOAD_ERROR ? a(Error("hlsVideoFormatPlugin: unrecoverable error in HLS player. The video is not available")) : (e.log.warn("hlsVideoFormatPlugin: Fatal network error. Try to recover"), s.startLoad());
break;
case o.ErrorTypes.MEDIA_ERROR:
e.log.warn("hlsVideoFormatPlugin: Fatal media error encountered. Try to recover"), s.recoverMediaError();
break;
default: s.destroy(), a(Error("hlsVideoFormat: Fatal error. Can not recover"));
}
else e.log.warn("HLS: error"), e.log.warn(n.details);
}), s.on(o.Events.LEVEL_SWITCHING, () => {
e.log.debug("HLS media attached");
}), s.on(o.Events.MEDIA_ATTACHED, () => {
e.log.debug("HLS media attached");
}), s.on(o.Events.MEDIA_DETACHING, () => {
e.log.debug("HLS media detaching");
}), s.on(o.Events.MEDIA_DETACHED, () => {
e.log.debug("HLS media detached");
}), s.on(o.Events.MANIFEST_PARSED, () => {
e.log.debug("HLS manifest parsed"), s.startLoad(-1);
});
let d = Math.floor(Math.random() * 1e11), f = l.src + (i.enableCache ? /\?/.test(l.src) ? `&cache=${d}` : `?cache=${d}` : "");
s.loadSource(f), s.attachMedia(r);
let p = !1;
s._videoEventListener = () => {
p = !0, n(null);
}, r.addEventListener("canplay", s._videoEventListener), setTimeout(() => {
p || r.play();
}, 1e3);
})];
}, b = class extends n {
constructor(e, t, n, r) {
super(e, t, r, n), this._ready = !1, this._hls = null, this._hlsConfig = null, this._cors = null, this._autoQuality = null, this._currentQualityItem = null, this._forceNative = !1, this._currentAudioTrack = null, this._videoEndedCallback = null, this._hlsConfig = this._hlsConfig || {
audioTrackLabel: n.audioTrackLabel || "name",
enableCache: n.enableCache || !1
};
for (let e in p) this._hlsConfig[e] = p[e];
for (let e in n.hlsConfig) this._hlsConfig[e] = n.hlsConfig[e];
this._cors = {};
for (let e in m) this._cors[e] = m[e];
for (let e in n.corsConfig) this._cors[e] = n.corsConfig[e];
}
get autoQuality() {
return this._autoQuality;
}
get forceNative() {
return this._forceNative;
}
async loadStreamData(e) {
if (await v(this.forceNative) === h.NATIVE) {
e.sources.mp4 = e.sources.hls;
let t = await super.loadStreamData(e), n = await this.getAudioTracks();
return this._currentAudioTrack = n.find((e) => e.selected), this._autoQuality = new s({
label: "auto",
shortLabel: "auto",
index: -1,
width: 1,
height: 1,
isAuto: !0
}), this._currentQualityItem = this._autoQuality, this.saveDisabledProperties(this.video), this._endedCallback = this._endedCallback || (() => {
typeof this._videoEndedCallback == "function" && this._videoEndedCallback();
}), this.video.addEventListener("ended", this._endedCallback), t;
} else {
this.player.log.debug("Loading HLS stream");
let t = e?.sources?.hls?.length && e.sources.hls[0] || {
src: "",
mimetype: ""
};
this._hlsConfig.audioTrackLabel = t?.audioLabel || this._hlsConfig.audioTrackLabel;
let [n, r] = await y(this.player, e, this.video, this._hlsConfig, this._cors);
this._hls = n, await r, this.video.pause(), this._autoQuality = new s({
label: "auto",
shortLabel: "auto",
index: -1,
width: 1,
height: 1,
isAuto: !0
}), this._currentQualityItem = this._autoQuality;
let i = await this.getAudioTracks();
return this._currentAudioTrack = i.find((e) => e.selected), this.saveDisabledProperties(this.video), this._endedCallback = this._endedCallback || (() => {
typeof this._videoEndedCallback == "function" && this._videoEndedCallback();
}), this.video.addEventListener("ended", this._endedCallback), !0;
}
}
async duration() {
if (this._videoEnabled) {
await this.waitForLoaded();
let e = this.video.duration;
return e === Infinity && (e = this._hls?.liveSyncPosition || 0), e;
} else return this._disabledProperties.duration;
}
async waitForLoaded() {
if (await v(this.forceNative) === h.NATIVE) return super.waitForLoaded();
await new Promise((e, t) => {
let n = () => {
this._ready && e(null), this.video.readyState >= 2 ? (this._ready = !0, e(null)) : setTimeout(() => n(), 200);
};
n();
});
}
async getQualities() {
let e = [];
return this._autoQuality && e.push(this._autoQuality), await v(this.forceNative) === h.MEDIA_SOURCE_EXTENSIONS && (this._hls.levels.forEach((t, n) => {
e.push(new s({
index: n,
label: `${t.width}x${t.height}`,
shortLabel: `${t.height}p`,
width: t.width,
height: t.height
}));
}), e.sort((e, t) => e.res.h - t.res.h)), e;
}
async setQuality(e) {
let t = await v(this.forceNative);
if (!this._videoEnabled) return !0;
if (!(e instanceof s)) throw Error("Invalid parameter setting video quality. VideoQualityItem object expected.");
return t === h.MEDIA_SOURCE_EXTENSIONS ? (this._currentQualityItem = e, this._hls.currentLevel = e.index, !0) : (this.player.log.warn("Could not set video quality of HLS stream, because the HLS support of this browser is native."), !1);
}
get currentQuality() {
return this._currentQualityItem;
}
async supportsMultiaudio() {
await this.waitForLoaded();
let e = await v(this.forceNative);
return e === h.MEDIA_SOURCE_EXTENSIONS ? this._hls.audioTracks.length > 1 : e === h.NATIVE ? this.video.audioTracks?.length > 1 : !1;
}
async getAudioTracks() {
await this.waitForLoaded();
let t = this._hlsConfig.audioTrackLabel || "name", n = await v(this.forceNative);
return n === h.MEDIA_SOURCE_EXTENSIONS ? this._hls.audioTracks.map((n) => new e({
id: n.id,
name: n[t],
language: n.lang,
selected: this._hls.audioTrack === n.id
})) : n === h.NATIVE ? Array.from(this.video.audioTracks).map((t) => new e({
id: t.id,
name: t.label,
language: t.language,
selected: t.enabled
})) : null;
}
async setCurrentAudioTrack(e) {
await this.waitForLoaded();
let t = (await this.getAudioTracks()).find((t) => t.id === e.id), n = await v(this.forceNative);
return n === h.MEDIA_SOURCE_EXTENSIONS && t ? this._hls.audioTrack = t.id : n === h.NATIVE && t && Array.from(this.video.audioTracks).forEach((e) => {
e.id === t.id ? e.enabled = !0 : e.enabled = !1;
}), this._currentAudioTrack = t, t;
}
get currentAudioTrack() {
return this._currentAudioTrack;
}
async clearStreamData() {
this.video.removeEventListener("canplay", this._hls._videoEventListener), this.video.src = "", this._hls.destroy(), this._ready = !1;
}
}, x = class extends o {
getPluginModuleInstance() {
return f.Get();
}
get name() {
return super.name || "es.upv.paella.hlsVideoFormat";
}
get streamType() {
return "hls";
}
async isCompatible(e) {
let { hls: t } = e.sources;
return t && await v() !== h.UNSUPPORTED;
}
async getVideoInstance(e, t) {
return new b(this.player, e, this.config, t);
}
getCompatibleFileExtensions() {
return ["m3u8"];
}
getManifestData(e) {
return { hls: e.map((e) => ({
src: e,
mimetype: "video/mp4"
})) };
}
}, S = async (e, n, r, i, a) => {
let o = await _();
a.withCredentials && (i.xhrSetup = function(e, t) {
e.withCredentials = a.withCredentials;
for (let t in a.requestHeaders) {
let n = a.requestHeaders[t];
e.setRequestHeader(t, n);
}
});
let s = new o(i), l = n?.sources?.hlsLive?.length > 0 && n.sources.hlsLive[0] || {
src: "",
mimetype: ""
};
return i.initialQualityLevel !== void 0 && i.initialQualityLevel, [s, new Promise((n, a) => {
let u = !1;
s.on(o.Events.LEVEL_SWITCHED, (n, r) => {
e.log.debug(`HLS: quality level switched to ${r.level}`), u ||= (s.currentLevel = -1, !0), c(e, t.VIDEO_QUALITY_CHANGED, {});
}), s.on(o.Events.ERROR, (t, n) => {
if (n.fatal) switch (n.type) {
case o.ErrorTypes.NETWORK_ERROR:
n.details === o.ErrorDetails.MANIFEST_LOAD_ERROR ? a(Error("hlsVideoFormatPlugin: unrecoverable error in HLS player. The video is not available")) : (e.log.warn("hlsVideoFormatPlugin: Fatal network error. Try to recover"), s.startLoad());
break;
case o.ErrorTypes.MEDIA_ERROR:
e.log.warn("hlsVideoFormatPlugin: Fatal media error encountered. Try to recover"), s.recoverMediaError();
break;
default: s.destroy(), a(Error("hlsVideoFormat: Fatal error. Can not recover"));
}
}), s.on(o.Events.MANIFEST_PARSED, () => {
i.autoStartLoad || s.autoStartLoad();
});
let d = Math.floor(Math.random() * 1e11), f = l.src + (i.enableCache ? /\?/.test(l.src) ? `&cache=${d}` : `?cache=${d}` : "");
s.loadSource(f), s.attachMedia(r), s._videoEventListener = () => {
n(null);
}, r.addEventListener("canplay", s._videoEventListener);
})];
}, C = class extends b {
async loadStreamData(e) {
if (await v() === h.NATIVE) return e.sources.hls = e.sources.hlsLive, super.loadStreamData(e);
{
this.player.log.debug("Loading HLS stream");
let [t, n] = await S(this.player, e, this.video, this._config, this._cors);
this._hls = t, await n, this._autoQuality = new s({
label: "auto",
shortLabel: "auto",
index: -1,
width: 1,
height: 1,
isAuto: !0
}), this._currentQualityItem = this._autoQuality;
let r = await this.getAudioTracks();
this._currentAudioTrack = r.find((e) => e.selected), this.saveDisabledProperties(this.video);
}
return !0;
}
}, w = class extends o {
getPluginModuleInstance() {
return f.Get();
}
get name() {
return super.name || "es.upv.paella.hlsLiveVideoFormat";
}
get streamType() {
return "hlsLive";
}
async isCompatible(e) {
let t = await v(), { hlsLive: n } = e.sources;
return !!(n && t);
}
async getVideoInstance(e, t) {
return new C(this.player, e, this.config, t);
}
}, T = "<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 39 32\" version=\"1.1\" stroke=\"none\" fill=\"currentColor\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\">\n <path d=\"M37,9.5C37,5.913 34.087,3 30.5,3L8.5,3C4.913,3 2,5.913 2,9.5L2,22.5C2,26.087 4.913,29 8.5,29L30.5,29C34.087,29 37,26.087 37,22.5L37,9.5ZM18.97,21.884C18.97,21.983 18.891,22.125 18.733,22.308C17.111,24.188 15.102,25.128 12.706,25.128C10.21,25.128 8.214,24.217 6.716,22.395C5.319,20.698 4.62,18.577 4.62,16.031C4.62,13.486 5.331,11.356 6.754,9.642C8.268,7.795 10.269,6.872 12.756,6.872C15.277,6.872 17.227,7.725 18.608,9.43C18.741,9.605 18.808,9.75 18.808,9.867C18.808,10.008 18.587,10.426 18.147,11.121C17.706,11.816 17.439,12.163 17.348,12.163C17.24,12.163 16.986,11.959 16.587,11.551C16.096,11.052 15.634,10.678 15.202,10.428C14.486,10.021 13.696,9.817 12.831,9.817C11.184,9.817 9.902,10.445 8.987,11.701C8.172,12.824 7.765,14.238 7.765,15.944C7.765,17.649 8.168,19.076 8.975,20.224C9.89,21.513 11.167,22.158 12.806,22.158C13.621,22.158 14.407,21.954 15.164,21.547C15.663,21.28 16.171,20.902 16.687,20.411C17.119,20.003 17.356,19.8 17.398,19.8C17.448,19.8 17.722,20.13 18.221,20.792C18.721,21.453 18.97,21.817 18.97,21.884ZM34.38,21.884C34.38,21.983 34.301,22.125 34.143,22.308C32.521,24.188 30.512,25.128 28.116,25.128C25.62,25.128 23.624,24.217 22.126,22.395C20.729,20.698 20.03,18.577 20.03,16.031C20.03,13.486 20.741,11.356 22.164,9.642C23.678,7.795 25.678,6.872 28.166,6.872C30.686,6.872 32.637,7.725 34.018,9.43C34.151,9.605 34.218,9.75 34.218,9.867C34.218,10.008 33.997,10.426 33.556,11.121C33.116,11.816 32.849,12.163 32.758,12.163C32.65,12.163 32.396,11.959 31.997,11.551C31.506,11.052 31.044,10.678 30.612,10.428C29.896,10.021 29.106,9.817 28.241,9.817C26.594,9.817 25.312,10.445 24.397,11.701C23.582,12.824 23.174,14.238 23.174,15.944C23.174,17.649 23.578,19.076 24.385,20.224C25.3,21.513 26.577,22.158 28.216,22.158C29.031,22.158 29.817,21.954 30.574,21.547C31.073,21.28 31.581,20.902 32.096,20.411C32.529,20.003 32.766,19.8 32.808,19.8C32.858,19.8 33.132,20.13 33.631,20.792C34.13,21.453 34.38,21.817 34.38,21.884Z\" />\n</svg>", E = class extends r {
getPluginModuleInstance() {
return f.Get();
}
get name() {
return super.name || "es.upv.paella.hlsCaptionsSelectorPlugin";
}
getAriaLabel() {
return "Select captions";
}
getDescription() {
return this.getAriaLabel();
}
async isEnabled() {
let e = await super.isEnabled();
return this._hls = this.player.videoContainer?.streamProvider?.mainAudioPlayer?._hls, this._video = this.player.videoContainer?.streamProvider?.mainAudioPlayer?.video, this._hls && e;
}
async load() {
this.icon = this.player.getCustomPluginIcon(this.name, "captionsIcon") || T;
let e = this._hls.subtitleTracks || [], t = this._video.textTracks || [];
if (e.length > 0) this._tracks = e, this._trackType = "hls";
else {
this._videoTracks = t;
let e = () => (console.log("getTextTracks"), Array.from(t).map((e, t) => ({
attrs: {
LANGUAGE: e.language,
NAME: e.label
},
language: e.language
})));
this._tracks = e(), this._videoTracks.length > 0 && (this._trackType = "native", this._tracks = e(), this._tracks.length > 0 && this.enable()), t.onaddtrack = () => {
this._trackType = "native", this._tracks = e(), this._tracks.length > 0 && this.enable();
};
}
this._hls.subtitleTrack, this._disabledTrack = {
id: -1,
title: "Disabled",
index: -1,
selected: !0
}, this._selected = null, this._tracks.length == 0 && this.disable();
}
async getMenu() {
let e = [{
id: -1,
title: "Disabled",
index: -1,
selected: this._selected === null
}];
return this._tracks.forEach((t, n) => {
e.push({
id: t.attrs.LANGUAGE || t.attrs.NAME,
title: t.attrs.NAME || t.attrs.LANGUAGE,
index: n,
selected: t.language === this._selected
});
}), e;
}
get buttonType() {
return "radio";
}
itemSelected(e, t) {
!this.config.allowMultipleSelection && e?.index !== -1 && (this._trackType === "hls" ? this._hls.subtitleTrack = -1 : this._trackType === "native" && Array.from(this._videoTracks).forEach((e) => e.mode = "disabled")), e?.index === -1 ? (this._selected = null, this._trackType === "hls" ? this._hls.subtitleTrack = -1 : this._trackType === "native" && Array.from(this._videoTracks).forEach((e) => e.mode = "disabled")) : (this._trackType === "hls" ? this._hls.subtitleTrack = e?.index : this._trackType === "native" && e && e.index !== void 0 && e.index >= 0 && (this._videoTracks[e.index].mode = "showing"), this._selected = this._tracks.find((t) => t.index === e?.index)?.language);
}
}, D = class extends i {
constructor(...e) {
super(...e), this._sources = [], this._qualities = null, this._currentQualityItem = null;
}
async getQualities() {
return this._qualities ||= this._sources.map((e, t) => new s({
index: t,
label: `${e.res.w}x${e.res.h}`,
shortLabel: `${e.res.h}p`,
width: e.res.w,
height: e.res.h,
src: e.src
})), this._qualities;
}
async setQuality(e) {
if (!(e instanceof s)) throw Error("Invalid parameter setting video quality");
this.player.log.debug(`es.upv.paella.mp4MultiQualityVideoFormat: Change video quality to ${e.shortLabel}`), this._currentQualityItem = e;
let t = this.video.currentTime, n = this.video.playbackRate;
return this.clearStreamData(), this.video.src = e.src, this.video.currentTime = t, this.video.playbackRate = n, this._endedCallback && this.video.addEventListener("ended", this._endedCallback), await new Promise((e) => {
let t = () => {
this.video.pause(), this.video.removeEventListener("canplay", t), e(null);
};
this.video.addEventListener("canplay", t);
}), !0;
}
get currentQuality() {
return this._currentQualityItem;
}
async loadStreamData(e = null) {
if (this._sources = e.sources.mp4, this._sources.sort((e, t) => Number(e.res.w) - Number(t.res.w)), !this._qualities) {
let e = await this.getQualities(), t = [window.screen.width, window.screen.height].map((e) => e * window.devicePixelRatio), n = Math.min(t[0], t[1]), r = Math.max(t[0], t[1]);
/Mobi/i.test(window.navigator.userAgent) && (n = Math.max(n, 900), r = Math.max(n, 1600));
let i = 0;
for (let e = 1; e < this._sources.length; e += 1) {
let t = this._sources[e], a = typeof t.res.w == "string" ? parseInt(t.res.w) : t.res.w, o = typeof t.res.h == "string" ? parseInt(t.res.h) : t.res.h;
Math.min(a, o) <= n && Math.max(a, o) <= r && (i = e);
}
this._currentQuality = i, this._currentQualityItem = e[i];
}
return this._currentSource = this._sources[this._currentQuality], await super.loadStreamData(e);
}
}, O = class extends o {
getPluginModuleInstance() {
return f.Get();
}
get streamType() {
return "mp4";
}
get name() {
return "es.upv.paella.mp4MultiQualityVideoFormat";
}
async isCompatible(e) {
let { mp4: t } = e.sources;
return t && l.supportsVideoType(t[0]?.mimetype);
}
async getVideoInstance(e, t) {
return new D(this.player, e, t, this.config);
}
}, k = [
{
plugin: x,
config: { enabled: !1 }
},
{
plugin: w,
config: { enabled: !1 }
},
{
plugin: E,
config: { enabled: !1 }
},
{
plugin: O,
config: { enabled: !1 }
}
], A = k, j = x, M = w, N = E, P = O, F = {
HlsVideo: b,
getHlsSupport: v,
defaultHlsConfig: p,
HlsSupport: h
};
//#endregion
export { N as HlsCaptionsSelectorButtonPlugin, M as HlsLiveVideoFormatPlugin, j as HlsVideoFormatPlugin, P as Mp4MultiQualityVideoFormatPlugin, A as allPlugins, F as hlsTools, k as videoPlugins };
//# sourceMappingURL=paella-video-plugins.js.map