Current File : /home/quantums/bodyguardslosangeles.net/wp-content/plugins/embedpress/assets/js/plyr.js |
"object" == typeof navigator &&
(function (e, t) {
"object" == typeof exports && "undefined" != typeof module ? (module.exports = t()) : "function" == typeof define && define.amd ? define("Plyr", t) : ((e = "undefined" != typeof globalThis ? globalThis : e || self).Plyr = t());
})(this, function () {
"use strict";
!(function () {
if ("undefined" != typeof window)
try {
var e = new window.CustomEvent("test", { cancelable: !0 });
if ((e.preventDefault(), !0 !== e.defaultPrevented)) throw new Error("Could not prevent default");
} catch (e) {
var t = function (e, t) {
var i, s;
return (
((t = t || {}).bubbles = !!t.bubbles),
(t.cancelable = !!t.cancelable),
(i = document.createEvent("CustomEvent")).initCustomEvent(e, t.bubbles, t.cancelable, t.detail),
(s = i.preventDefault),
(i.preventDefault = function () {
s.call(this);
try {
Object.defineProperty(this, "defaultPrevented", {
get: function () {
return !0;
},
});
} catch (e) {
this.defaultPrevented = !0;
}
}),
i
);
};
(t.prototype = window.Event.prototype), (window.CustomEvent = t);
}
})();
var e = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : {};
function t(e, t, i) {
return (
(t = (function (e) {
var t = (function (e, t) {
if ("object" != typeof e || null === e) return e;
var i = e[Symbol.toPrimitive];
if (void 0 !== i) {
var s = i.call(e, t || "default");
if ("object" != typeof s) return s;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return ("string" === t ? String : Number)(e);
})(e, "string");
return "symbol" == typeof t ? t : String(t);
})(t)) in e
? Object.defineProperty(e, t, { value: i, enumerable: !0, configurable: !0, writable: !0 })
: (e[t] = i),
e
);
}
function i(e, t) {
for (var i = 0; i < t.length; i++) {
var s = t[i];
(s.enumerable = s.enumerable || !1), (s.configurable = !0), "value" in s && (s.writable = !0), Object.defineProperty(e, s.key, s);
}
}
function s(e, t, i) {
return t in e ? Object.defineProperty(e, t, { value: i, enumerable: !0, configurable: !0, writable: !0 }) : (e[t] = i), e;
}
function n(e, t) {
var i = Object.keys(e);
if (Object.getOwnPropertySymbols) {
var s = Object.getOwnPropertySymbols(e);
t &&
(s = s.filter(function (t) {
return Object.getOwnPropertyDescriptor(e, t).enumerable;
})),
i.push.apply(i, s);
}
return i;
}
function a(e) {
for (var t = 1; t < arguments.length; t++) {
var i = null != arguments[t] ? arguments[t] : {};
t % 2
? n(Object(i), !0).forEach(function (t) {
s(e, t, i[t]);
})
: Object.getOwnPropertyDescriptors
? Object.defineProperties(e, Object.getOwnPropertyDescriptors(i))
: n(Object(i)).forEach(function (t) {
Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(i, t));
});
}
return e;
}
!(function (e) {
var t = (function () {
try {
return !!Symbol.iterator;
} catch (e) {
return !1;
}
})(),
i = function (e) {
var i = {
next: function () {
var t = e.shift();
return { done: void 0 === t, value: t };
},
};
return (
t &&
(i[Symbol.iterator] = function () {
return i;
}),
i
);
},
s = function (e) {
return encodeURIComponent(e).replace(/%20/g, "+");
},
n = function (e) {
return decodeURIComponent(String(e).replace(/\+/g, " "));
};
(function () {
try {
var t = e.URLSearchParams;
return "a=1" === new t("?a=1").toString() && "function" == typeof t.prototype.set && "function" == typeof t.prototype.entries;
} catch (e) {
return !1;
}
})() ||
(function () {
var n = function (e) {
Object.defineProperty(this, "_entries", { writable: !0, value: {} });
var t = typeof e;
if ("undefined" === t);
else if ("string" === t) "" !== e && this._fromString(e);
else if (e instanceof n) {
var i = this;
e.forEach(function (e, t) {
i.append(t, e);
});
} else {
if (null === e || "object" !== t) throw new TypeError("Unsupported input's type for URLSearchParams");
if ("[object Array]" === Object.prototype.toString.call(e))
for (var s = 0; s < e.length; s++) {
var a = e[s];
if ("[object Array]" !== Object.prototype.toString.call(a) && 2 === a.length) throw new TypeError("Expected [string, any] as entry at index " + s + " of URLSearchParams's input");
this.append(a[0], a[1]);
}
else for (var r in e) e.hasOwnProperty(r) && this.append(r, e[r]);
}
},
a = n.prototype;
(a.append = function (e, t) {
e in this._entries ? this._entries[e].push(String(t)) : (this._entries[e] = [String(t)]);
}),
(a.delete = function (e) {
delete this._entries[e];
}),
(a.get = function (e) {
return e in this._entries ? this._entries[e][0] : null;
}),
(a.getAll = function (e) {
return e in this._entries ? this._entries[e].slice(0) : [];
}),
(a.has = function (e) {
return e in this._entries;
}),
(a.set = function (e, t) {
this._entries[e] = [String(t)];
}),
(a.forEach = function (e, t) {
var i;
for (var s in this._entries)
if (this._entries.hasOwnProperty(s)) {
i = this._entries[s];
for (var n = 0; n < i.length; n++) e.call(t, i[n], s, this);
}
}),
(a.keys = function () {
var e = [];
return (
this.forEach(function (t, i) {
e.push(i);
}),
i(e)
);
}),
(a.values = function () {
var e = [];
return (
this.forEach(function (t) {
e.push(t);
}),
i(e)
);
}),
(a.entries = function () {
var e = [];
return (
this.forEach(function (t, i) {
e.push([i, t]);
}),
i(e)
);
}),
t && (a[Symbol.iterator] = a.entries),
(a.toString = function () {
var e = [];
return (
this.forEach(function (t, i) {
e.push(s(i) + "=" + s(t));
}),
e.join("&")
);
}),
(e.URLSearchParams = n);
})();
var a = e.URLSearchParams.prototype;
"function" != typeof a.sort &&
(a.sort = function () {
var e = this,
t = [];
this.forEach(function (i, s) {
t.push([s, i]), e._entries || e.delete(s);
}),
t.sort(function (e, t) {
return e[0] < t[0] ? -1 : e[0] > t[0] ? 1 : 0;
}),
e._entries && (e._entries = {});
for (var i = 0; i < t.length; i++) this.append(t[i][0], t[i][1]);
}),
"function" != typeof a._fromString &&
Object.defineProperty(a, "_fromString", {
enumerable: !1,
configurable: !1,
writable: !1,
value: function (e) {
if (this._entries) this._entries = {};
else {
var t = [];
this.forEach(function (e, i) {
t.push(i);
});
for (var i = 0; i < t.length; i++) this.delete(t[i]);
}
var s,
a = (e = e.replace(/^\?/, "")).split("&");
for (i = 0; i < a.length; i++) (s = a[i].split("=")), this.append(n(s[0]), s.length > 1 ? n(s[1]) : "");
},
});
})(void 0 !== e ? e : "undefined" != typeof window ? window : "undefined" != typeof self ? self : e),
(function (e) {
if (
((function () {
try {
var t = new e.URL("b", "http://a");
return (t.pathname = "c d"), "http://a/c%20d" === t.href && t.searchParams;
} catch (e) {
return !1;
}
})() ||
(function () {
var t = e.URL,
i = function (t, i) {
"string" != typeof t && (t = String(t)), i && "string" != typeof i && (i = String(i));
var s,
n = document;
if (i && (void 0 === e.location || i !== e.location.href)) {
(i = i.toLowerCase()), ((s = (n = document.implementation.createHTMLDocument("")).createElement("base")).href = i), n.head.appendChild(s);
try {
if (0 !== s.href.indexOf(i)) throw new Error(s.href);
} catch (e) {
throw new Error("URL unable to set base " + i + " due to " + e);
}
}
var a = n.createElement("a");
(a.href = t), s && (n.body.appendChild(a), (a.href = a.href));
var r = n.createElement("input");
if (((r.type = "url"), (r.value = t), ":" === a.protocol || !/:/.test(a.href) || (!r.checkValidity() && !i))) throw new TypeError("Invalid URL");
Object.defineProperty(this, "_anchorElement", { value: a });
var o = new e.URLSearchParams(this.search),
l = !0,
c = !0,
u = this;
["append", "delete", "set"].forEach(function (e) {
var t = o[e];
o[e] = function () {
t.apply(o, arguments), l && ((c = !1), (u.search = o.toString()), (c = !0));
};
}),
Object.defineProperty(this, "searchParams", { value: o, enumerable: !0 });
var h = void 0;
Object.defineProperty(this, "_updateSearchParams", {
enumerable: !1,
configurable: !1,
writable: !1,
value: function () {
this.search !== h && ((h = this.search), c && ((l = !1), this.searchParams._fromString(this.search), (l = !0)));
},
});
},
s = i.prototype;
["hash", "host", "hostname", "port", "protocol"].forEach(function (e) {
!(function (e) {
Object.defineProperty(s, e, {
get: function () {
return this._anchorElement[e];
},
set: function (t) {
this._anchorElement[e] = t;
},
enumerable: !0,
});
})(e);
}),
Object.defineProperty(s, "search", {
get: function () {
return this._anchorElement.search;
},
set: function (e) {
(this._anchorElement.search = e), this._updateSearchParams();
},
enumerable: !0,
}),
Object.defineProperties(s, {
toString: {
get: function () {
var e = this;
return function () {
return e.href;
};
},
},
href: {
get: function () {
return this._anchorElement.href.replace(/\?$/, "");
},
set: function (e) {
(this._anchorElement.href = e), this._updateSearchParams();
},
enumerable: !0,
},
pathname: {
get: function () {
return this._anchorElement.pathname.replace(/(^\/?)/, "/");
},
set: function (e) {
this._anchorElement.pathname = e;
},
enumerable: !0,
},
origin: {
get: function () {
var e = { "http:": 80, "https:": 443, "ftp:": 21 }[this._anchorElement.protocol],
t = this._anchorElement.port != e && "" !== this._anchorElement.port;
return this._anchorElement.protocol + "//" + this._anchorElement.hostname + (t ? ":" + this._anchorElement.port : "");
},
enumerable: !0,
},
password: {
get: function () {
return "";
},
set: function (e) { },
enumerable: !0,
},
username: {
get: function () {
return "";
},
set: function (e) { },
enumerable: !0,
},
}),
(i.createObjectURL = function (e) {
return t.createObjectURL.apply(t, arguments);
}),
(i.revokeObjectURL = function (e) {
return t.revokeObjectURL.apply(t, arguments);
}),
(e.URL = i);
})(),
void 0 !== e.location && !("origin" in e.location))
) {
var t = function () {
return e.location.protocol + "//" + e.location.hostname + (e.location.port ? ":" + e.location.port : "");
};
try {
Object.defineProperty(e.location, "origin", { get: t, enumerable: !0 });
} catch (i) {
setInterval(function () {
e.location.origin = t();
}, 100);
}
}
})(void 0 !== e ? e : "undefined" != typeof window ? window : "undefined" != typeof self ? self : e);
var r = { addCSS: !0, thumbWidth: 15, watch: !0 };
var o = function (e) {
return null != e ? e.constructor : null;
},
l = function (e, t) {
return !!(e && t && e instanceof t);
},
c = function (e) {
return null == e;
},
u = function (e) {
return o(e) === Object;
},
h = function (e) {
return o(e) === String;
},
d = function (e) {
return Array.isArray(e);
},
m = function (e) {
return l(e, NodeList);
},
p = {
nullOrUndefined: c,
object: u,
number: function (e) {
return o(e) === Number && !Number.isNaN(e);
},
string: h,
boolean: function (e) {
return o(e) === Boolean;
},
function: function (e) {
return o(e) === Function;
},
array: d,
nodeList: m,
element: function (e) {
return l(e, Element);
},
event: function (e) {
return l(e, Event);
},
empty: function (e) {
return c(e) || ((h(e) || d(e) || m(e)) && !e.length) || (u(e) && !Object.keys(e).length);
},
};
function g(e, t) {
if (1 > t) {
var i = (function (e) {
var t = "".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;
})(t);
return parseFloat(e.toFixed(i));
}
return Math.round(e / t) * t;
}
var f = (function () {
function e(t, i) {
(function (e, t) {
if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function");
})(this, e),
p.element(t) ? (this.element = t) : p.string(t) && (this.element = document.querySelector(t)),
p.element(this.element) && p.empty(this.element.rangeTouch) && ((this.config = a({}, r, {}, i)), this.init());
}
return (
(function (e, t, s) {
t && i(e.prototype, t), s && i(e, s);
})(
e,
[
{
key: "init",
value: function () {
e.enabled &&
(this.config.addCSS && ((this.element.style.userSelect = "none"), (this.element.style.webKitUserSelect = "none"), (this.element.style.touchAction = "manipulation")),
this.listeners(!0),
(this.element.rangeTouch = this));
},
},
{
key: "destroy",
value: function () {
e.enabled &&
(this.config.addCSS && ((this.element.style.userSelect = ""), (this.element.style.webKitUserSelect = ""), (this.element.style.touchAction = "")), this.listeners(!1), (this.element.rangeTouch = null));
},
},
{
key: "listeners",
value: function (e) {
var t = this,
i = e ? "addEventListener" : "removeEventListener";
["touchstart", "touchmove", "touchend"].forEach(function (e) {
t.element[i](
e,
function (e) {
return t.set(e);
},
!1
);
});
},
},
{
key: "get",
value: function (t) {
if (!e.enabled || !p.event(t)) return null;
var i,
s = t.target,
n = t.changedTouches[0],
a = parseFloat(s.getAttribute("min")) || 0,
r = parseFloat(s.getAttribute("max")) || 100,
o = parseFloat(s.getAttribute("step")) || 1,
l = s.getBoundingClientRect(),
c = ((100 / l.width) * (this.config.thumbWidth / 2)) / 100;
return 0 > (i = (100 / l.width) * (n.clientX - l.left)) ? (i = 0) : 100 < i && (i = 100), 50 > i ? (i -= (100 - 2 * i) * c) : 50 < i && (i += 2 * (i - 50) * c), a + g((i / 100) * (r - a), o);
},
},
{
key: "set",
value: function (t) {
e.enabled &&
p.event(t) &&
!t.target.disabled &&
(t.preventDefault(),
(t.target.value = this.get(t)),
(function (e, t) {
if (e && t) {
var i = new Event(t, { bubbles: !0 });
e.dispatchEvent(i);
}
})(t.target, "touchend" === t.type ? "change" : "input"));
},
},
],
[
{
key: "setup",
value: function (t) {
var i = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},
s = null;
if (
(p.empty(t) || p.string(t)
? (s = Array.from(document.querySelectorAll(p.string(t) ? t : 'input[type="range"]')))
: p.element(t)
? (s = [t])
: p.nodeList(t)
? (s = Array.from(t))
: p.array(t) && (s = t.filter(p.element)),
p.empty(s))
)
return null;
var n = a({}, r, {}, i);
if (p.string(t) && n.watch) {
var o = new MutationObserver(function (i) {
Array.from(i).forEach(function (i) {
Array.from(i.addedNodes).forEach(function (i) {
p.element(i) &&
(function (e, t) {
return function () {
return Array.from(document.querySelectorAll(t)).includes(this);
}.call(e, t);
})(i, t) &&
new e(i, n);
});
});
});
o.observe(document.body, { childList: !0, subtree: !0 });
}
return s.map(function (t) {
return new e(t, i);
});
},
},
{
key: "enabled",
get: function () {
return "ontouchstart" in document.documentElement;
},
},
]
),
e
);
})();
const y = (e) => (null != e ? e.constructor : null),
b = (e, t) => Boolean(e && t && e instanceof t),
v = (e) => null == e,
w = (e) => y(e) === Object,
T = (e) => y(e) === String,
k = (e) => "function" == typeof e,
E = (e) => Array.isArray(e),
C = (e) => b(e, NodeList),
S = (e) => v(e) || ((T(e) || E(e) || C(e)) && !e.length) || (w(e) && !Object.keys(e).length);
var A = {
nullOrUndefined: v,
object: w,
number: (e) => y(e) === Number && !Number.isNaN(e),
string: T,
boolean: (e) => y(e) === Boolean,
function: k,
array: E,
weakMap: (e) => b(e, WeakMap),
nodeList: C,
element: (e) => null !== e && "object" == typeof e && 1 === e.nodeType && "object" == typeof e.style && "object" == typeof e.ownerDocument,
textNode: (e) => y(e) === Text,
event: (e) => b(e, Event),
keyboardEvent: (e) => b(e, KeyboardEvent),
cue: (e) => b(e, window.TextTrackCue) || b(e, window.VTTCue),
track: (e) => b(e, TextTrack) || (!v(e) && T(e.kind)),
promise: (e) => b(e, Promise) && k(e.then),
url: (e) => {
if (b(e, window.URL)) return !0;
if (!T(e)) return !1;
let t = e;
(e.startsWith("http://") && e.startsWith("https://")) || (t = `http://${e}`);
try {
return !S(new URL(t).hostname);
} catch (e) {
return !1;
}
},
empty: S,
};
const P = (() => {
const e = document.createElement("span"),
t = { WebkitTransition: "webkitTransitionEnd", MozTransition: "transitionend", OTransition: "oTransitionEnd otransitionend", transition: "transitionend" },
i = Object.keys(t).find((t) => void 0 !== e.style[t]);
return !!A.string(i) && t[i];
})();
function M(e, t) {
setTimeout(() => {
try {
(e.hidden = !0), e.offsetHeight, (e.hidden = !1);
} catch (e) { }
}, t);
}
var x = {
isIE: Boolean(window.document.documentMode),
isEdge: /Edge/g.test(navigator.userAgent),
isWebKit: "WebkitAppearance" in document.documentElement.style && !/Edge/g.test(navigator.userAgent),
isIPhone: /iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1,
isIPadOS: "MacIntel" === navigator.platform && navigator.maxTouchPoints > 1,
isIos: /iPad|iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1,
};
function L(e, t) {
return t.split(".").reduce((e, t) => e && e[t], e);
}
function N(e = {}, ...t) {
if (!t.length) return e;
const i = t.shift();
return A.object(i)
? (Object.keys(i).forEach((t) => {
A.object(i[t]) ? (Object.keys(e).includes(t) || Object.assign(e, { [t]: {} }), N(e[t], i[t])) : Object.assign(e, { [t]: i[t] });
}),
N(e, ...t))
: e;
}
function _(e, t) {
const i = e.length ? e : [e];
Array.from(i)
.reverse()
.forEach((e, i) => {
const s = i > 0 ? t.cloneNode(!0) : t,
n = e.parentNode,
a = e.nextSibling;
s.appendChild(e), a ? n.insertBefore(s, a) : n.appendChild(s);
});
}
function I(e, t) {
A.element(e) &&
!A.empty(t) &&
Object.entries(t)
.filter(([, e]) => !A.nullOrUndefined(e))
.forEach(([t, i]) => e.setAttribute(t, i));
}
function O(e, t, i) {
const s = document.createElement(e);
return A.object(t) && I(s, t), A.string(i) && (s.innerText = i), s;
}
function $(e, t, i, s) {
A.element(t) && t.appendChild(O(e, i, s));
}
function j(e) {
A.nodeList(e) || A.array(e) ? Array.from(e).forEach(j) : A.element(e) && A.element(e.parentNode) && e.parentNode.removeChild(e);
}
function R(e) {
if (!A.element(e)) return;
let { length: t } = e.childNodes;
for (; t > 0;) e.removeChild(e.lastChild), (t -= 1);
}
function D(e, t) {
return A.element(t) && A.element(t.parentNode) && A.element(e) ? (t.parentNode.replaceChild(e, t), e) : null;
}
function q(e, t) {
if (!A.string(e) || A.empty(e)) return {};
const i = {},
s = N({}, t);
return (
e.split(",").forEach((e) => {
const t = e.trim(),
n = t.replace(".", ""),
a = t.replace(/[[\]]/g, "").split("="),
[r] = a,
o = a.length > 1 ? a[1].replace(/["']/g, "") : "";
switch (t.charAt(0)) {
case ".":
A.string(s.class) ? (i.class = `${s.class} ${n}`) : (i.class = n);
break;
case "#":
i.id = t.replace("#", "");
break;
case "[":
i[r] = o;
}
}),
N(s, i)
);
}
function H(e, t) {
if (!A.element(e)) return;
let i = t;
A.boolean(i) || (i = !e.hidden), (e.hidden = i);
}
function F(e, t, i) {
if (A.nodeList(e)) return Array.from(e).map((e) => F(e, t, i));
if (A.element(e)) {
let s = "toggle";
return void 0 !== i && (s = i ? "add" : "remove"), e.classList[s](t), e.classList.contains(t);
}
return !1;
}
function U(e, t) {
return A.element(e) && e.classList.contains(t);
}
function V(e, t) {
const { prototype: i } = Element;
return (
i.matches ||
i.webkitMatchesSelector ||
i.mozMatchesSelector ||
i.msMatchesSelector ||
function () {
return Array.from(document.querySelectorAll(t)).includes(this);
}
).call(e, t);
}
function B(e) {
return this.elements.container.querySelectorAll(e);
}
function W(e) {
return this.elements.container.querySelector(e);
}
function z(e = null, t = !1) {
A.element(e) && e.focus({ preventScroll: !0, focusVisible: t });
}
const K = { "audio/ogg": "vorbis", "audio/wav": "1", "video/webm": "vp8, vorbis", "video/mp4": "avc1.42E01E, mp4a.40.2", "video/ogg": "theora" },
Y = {
audio: "canPlayType" in document.createElement("audio"),
video: "canPlayType" in document.createElement("video"),
check(e, t) {
const i = Y[e] || "html5" !== t;
return { api: i, ui: i && Y.rangeInput };
},
pip: !(x.isIPhone || (!A.function(O("video").webkitSetPresentationMode) && (!document.pictureInPictureEnabled || O("video").disablePictureInPicture))),
airplay: A.function(window.WebKitPlaybackTargetAvailabilityEvent),
playsinline: "playsInline" in document.createElement("video"),
mime(e) {
if (A.empty(e)) return !1;
const [t] = e.split("/");
let i = e;
if (!this.isHTML5 || t !== this.type) return !1;
Object.keys(K).includes(i) && (i += `; codecs="${K[e]}"`);
try {
return Boolean(i && this.media.canPlayType(i).replace(/no/, ""));
} catch (e) {
return !1;
}
},
textTracks: "textTracks" in document.createElement("video"),
rangeInput: (() => {
const e = document.createElement("input");
return (e.type = "range"), "range" === e.type;
})(),
touch: "ontouchstart" in document.documentElement,
transitions: !1 !== P,
reducedMotion: "matchMedia" in window && window.matchMedia("(prefers-reduced-motion)").matches,
},
Q = (() => {
let e = !1;
try {
const t = Object.defineProperty({}, "passive", { get: () => ((e = !0), null) });
window.addEventListener("test", null, t), window.removeEventListener("test", null, t);
} catch (e) { }
return e;
})();
function X(e, t, i, s = !1, n = !0, a = !1) {
if (!e || !("addEventListener" in e) || A.empty(t) || !A.function(i)) return;
const r = t.split(" ");
let o = a;
Q && (o = { passive: n, capture: a }),
r.forEach((t) => {
this && this.eventListeners && s && this.eventListeners.push({ element: e, type: t, callback: i, options: o }), e[s ? "addEventListener" : "removeEventListener"](t, i, o);
});
}
function J(e, t = "", i, s = !0, n = !1) {
X.call(this, e, t, i, !0, s, n);
}
function G(e, t = "", i, s = !0, n = !1) {
X.call(this, e, t, i, !1, s, n);
}
function Z(e, t = "", i, s = !0, n = !1) {
const a = (...r) => {
G(e, t, a, s, n), i.apply(this, r);
};
X.call(this, e, t, a, !0, s, n);
}
function ee(e, t = "", i = !1, s = {}) {
if (!A.element(e) || A.empty(t)) return;
const n = new CustomEvent(t, { bubbles: i, detail: { ...s, plyr: this } });
e.dispatchEvent(n);
}
function te() {
this &&
this.eventListeners &&
(this.eventListeners.forEach((e) => {
const { element: t, type: i, callback: s, options: n } = e;
t.removeEventListener(i, s, n);
}),
(this.eventListeners = []));
}
function ie() {
return new Promise((e) => (this.ready ? setTimeout(e, 0) : J.call(this, this.elements.container, "ready", e))).then(() => { });
}
function se(e) {
A.promise(e) && e.then(null, () => { });
}
function ne(e) {
return A.array(e) ? e.filter((t, i) => e.indexOf(t) === i) : e;
}
function ae(e, t) {
return A.array(e) && e.length ? e.reduce((e, i) => (Math.abs(i - t) < Math.abs(e - t) ? i : e)) : null;
}
function re(e) {
return !(!window || !window.CSS) && window.CSS.supports(e);
}
const oe = [
[1, 1],
[4, 3],
[3, 4],
[5, 4],
[4, 5],
[3, 2],
[2, 3],
[16, 10],
[10, 16],
[16, 9],
[9, 16],
[21, 9],
[9, 21],
[32, 9],
[9, 32],
].reduce((e, [t, i]) => ({ ...e, [t / i]: [t, i] }), {});
function le(e) {
if (!(A.array(e) || (A.string(e) && e.includes(":")))) return !1;
return (A.array(e) ? e : e.split(":")).map(Number).every(A.number);
}
function ce(e) {
if (!A.array(e) || !e.every(A.number)) return null;
const [t, i] = e,
s = (e, t) => (0 === t ? e : s(t, e % t)),
n = s(t, i);
return [t / n, i / n];
}
function ue(e) {
const t = (e) => (le(e) ? e.split(":").map(Number) : null);
let i = t(e);
if ((null === i && (i = t(this.config.ratio)), null === i && !A.empty(this.embed) && A.array(this.embed.ratio) && ({ ratio: i } = this.embed), null === i && this.isHTML5)) {
const { videoWidth: e, videoHeight: t } = this.media;
i = [e, t];
}
return ce(i);
}
function he(e) {
if (!this.isVideo) return {};
const { wrapper: t } = this.elements,
i = ue.call(this, e);
if (!A.array(i)) return {};
const [s, n] = ce(i),
a = (100 / s) * n;
if ((re(`aspect-ratio: ${s}/${n}`) ? (t.style.aspectRatio = `${s}/${n}`) : (t.style.paddingBottom = `${a}%`), this.isVimeo && !this.config.vimeo.premium && this.supported.ui)) {
const e = (100 / this.media.offsetWidth) * parseInt(window.getComputedStyle(this.media).paddingBottom, 10),
i = (e - a) / (e / 50);
this.fullscreen.active ? (t.style.paddingBottom = null) : (this.media.style.transform = `translateY(-${i}%)`);
} else this.isHTML5 && t.classList.add(this.config.classNames.videoFixedRatio);
return { padding: a, ratio: i };
}
function de(e, t, i = 0.05) {
const s = e / t,
n = ae(Object.keys(oe), s);
return Math.abs(n - s) <= i ? oe[n] : [e, t];
}
const me = {
getSources() {
if (!this.isHTML5) return [];
return Array.from(this.media.querySelectorAll("source")).filter((e) => {
const t = e.getAttribute("type");
return !!A.empty(t) || Y.mime.call(this, t);
});
},
getQualityOptions() {
return this.config.quality.forced
? this.config.quality.options
: me.getSources
.call(this)
.map((e) => Number(e.getAttribute("size")))
.filter(Boolean);
},
setup() {
if (!this.isHTML5) return;
const e = this;
(e.options.speed = e.config.speed.options),
A.empty(this.config.ratio) || he.call(e),
Object.defineProperty(e.media, "quality", {
get() {
const t = me.getSources.call(e).find((t) => t.getAttribute("src") === e.source);
return t && Number(t.getAttribute("size"));
},
set(t) {
if (e.quality !== t) {
if (e.config.quality.forced && A.function(e.config.quality.onChange)) e.config.quality.onChange(t);
else {
const i = me.getSources.call(e).find((e) => Number(e.getAttribute("size")) === t);
if (!i) return;
const { currentTime: s, paused: n, preload: a, readyState: r, playbackRate: o } = e.media;
(e.media.src = i.getAttribute("src")),
("none" !== a || r) &&
(e.once("loadedmetadata", () => {
(e.speed = o), (e.currentTime = s), n || se(e.play());
}),
e.media.load());
}
ee.call(e, e.media, "qualitychange", !1, { quality: t });
}
},
});
},
cancelRequests() {
this.isHTML5 && (j(me.getSources.call(this)), this.media.setAttribute("src", this.config.blankVideo), this.media.load(), this.debug.log("Cancelled network requests"));
},
};
function pe(e, ...t) {
return A.empty(e) ? e : e.toString().replace(/{(\d+)}/g, (e, i) => t[i].toString());
}
const ge = (e = "", t = "", i = "") => e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, "\\$1"), "g"), i.toString()),
fe = (e = "") => e.toString().replace(/\w\S*/g, (e) => e.charAt(0).toUpperCase() + e.slice(1).toLowerCase());
function ye(e = "") {
let t = e.toString();
return (
(t = (function (e = "") {
let t = e.toString();
return (t = ge(t, "-", " ")), (t = ge(t, "_", " ")), (t = fe(t)), ge(t, " ", "");
})(t)),
t.charAt(0).toLowerCase() + t.slice(1)
);
}
function be(e) {
const t = document.createElement("div");
return t.appendChild(e), t.innerHTML;
}
const ve = { pip: "PIP", airplay: "AirPlay", html5: "HTML5", vimeo: "Vimeo", youtube: "YouTube" },
we = {
get(e = "", t = {}) {
if (A.empty(e) || A.empty(t)) return "";
let i = L(t.i18n, e);
if (A.empty(i)) return Object.keys(ve).includes(e) ? ve[e] : "";
const s = { "{seektime}": t.seekTime, "{title}": t.title };
return (
Object.entries(s).forEach(([e, t]) => {
i = ge(i, e, t);
}),
i
);
},
};
class Te {
constructor(e) {
t(this, "get", (e) => {
if (!Te.supported || !this.enabled) return null;
const t = window.localStorage.getItem(this.key);
if (A.empty(t)) return null;
const i = JSON.parse(t);
return A.string(e) && e.length ? i[e] : i;
}),
t(this, "set", (e) => {
if (!Te.supported || !this.enabled) return;
if (!A.object(e)) return;
let t = this.get();
A.empty(t) && (t = {}), N(t, e);
try {
window.localStorage.setItem(this.key, JSON.stringify(t));
} catch (e) { }
}),
(this.enabled = e.config.storage.enabled),
(this.key = e.config.storage.key);
}
static get supported() {
try {
if (!("localStorage" in window)) return !1;
const e = "___test";
return window.localStorage.setItem(e, e), window.localStorage.removeItem(e), !0;
} catch (e) {
return !1;
}
}
}
function ke(e, t = "text") {
return new Promise((i, s) => {
try {
const s = new XMLHttpRequest();
if (!("withCredentials" in s)) return;
s.addEventListener("load", () => {
if ("text" === t)
try {
i(JSON.parse(s.responseText));
} catch (e) {
i(s.responseText);
}
else i(s.response);
}),
s.addEventListener("error", () => {
throw new Error(s.status);
}),
s.open("GET", e, !0),
(s.responseType = t),
s.send();
} catch (e) {
s(e);
}
});
}
function Ee(e, t) {
if (!A.string(e)) return;
const i = "cache",
s = A.string(t);
let n = !1;
const a = () => null !== document.getElementById(t),
r = (e, t) => {
(e.innerHTML = t), (s && a()) || document.body.insertAdjacentElement("afterbegin", e);
};
if (!s || !a()) {
const a = Te.supported,
o = document.createElement("div");
if ((o.setAttribute("hidden", ""), s && o.setAttribute("id", t), a)) {
const e = window.localStorage.getItem(`${i}-${t}`);
if (((n = null !== e), n)) {
const t = JSON.parse(e);
r(o, t.content);
}
}
ke(e)
.then((e) => {
if (!A.empty(e)) {
if (a)
try {
window.localStorage.setItem(`${i}-${t}`, JSON.stringify({ content: e }));
} catch (e) { }
r(o, e);
}
})
.catch(() => { });
}
}
const Ce = (e) => Math.trunc((e / 60 / 60) % 60, 10),
Se = (e) => Math.trunc((e / 60) % 60, 10),
Ae = (e) => Math.trunc(e % 60, 10);
function Pe(e = 0, t = !1, i = !1) {
if (!A.number(e)) return Pe(void 0, t, i);
const s = (e) => `0${e}`.slice(-2);
let n = Ce(e);
const a = Se(e),
r = Ae(e);
return (n = t || n > 0 ? `${n}:` : ""), `${i && e > 0 ? "-" : ""}${n}${s(a)}:${s(r)}`;
}
const Me = {
getIconUrl() {
const e = new URL(this.config.iconUrl, window.location),
t = window.location.host ? window.location.host : window.top.location.host,
i = e.host !== t || (x.isIE && !window.svg4everybody);
return { url: this.config.iconUrl, cors: i };
},
findElements() {
try {
return (
(this.elements.controls = W.call(this, this.config.selectors.controls.wrapper)),
(this.elements.buttons = {
play: B.call(this, this.config.selectors.buttons.play),
pause: W.call(this, this.config.selectors.buttons.pause),
restart: W.call(this, this.config.selectors.buttons.restart),
rewind: W.call(this, this.config.selectors.buttons.rewind),
fastForward: W.call(this, this.config.selectors.buttons.fastForward),
mute: W.call(this, this.config.selectors.buttons.mute),
pip: W.call(this, this.config.selectors.buttons.pip),
airplay: W.call(this, this.config.selectors.buttons.airplay),
settings: W.call(this, this.config.selectors.buttons.settings),
captions: W.call(this, this.config.selectors.buttons.captions),
fullscreen: W.call(this, this.config.selectors.buttons.fullscreen),
}),
(this.elements.progress = W.call(this, this.config.selectors.progress)),
(this.elements.inputs = { seek: W.call(this, this.config.selectors.inputs.seek), volume: W.call(this, this.config.selectors.inputs.volume) }),
(this.elements.display = {
buffer: W.call(this, this.config.selectors.display.buffer),
currentTime: W.call(this, this.config.selectors.display.currentTime),
duration: W.call(this, this.config.selectors.display.duration),
}),
A.element(this.elements.progress) && (this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`)),
!0
);
} catch (e) {
return this.debug.warn("It looks like there is a problem with your custom controls HTML", e), this.toggleNativeControls(!0), !1;
}
},
createIcon(e, t) {
const i = "http://www.w3.org/2000/svg",
s = Me.getIconUrl.call(this),
n = `${s.cors ? "" : s.url}#${this.config.iconPrefix}`,
a = document.createElementNS(i, "svg");
I(a, N(t, { "aria-hidden": "true", focusable: "false" }));
const r = document.createElementNS(i, "use"),
o = `${n}-${e}`;
return "href" in r && r.setAttributeNS("http://www.w3.org/1999/xlink", "href", o), r.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", o), a.appendChild(r), a;
},
createLabel(e, t = {}) {
const i = we.get(e, this.config);
return O("span", { ...t, class: [t.class, this.config.classNames.hidden].filter(Boolean).join(" ") }, i);
},
createBadge(e) {
if (A.empty(e)) return null;
const t = O("span", { class: this.config.classNames.menu.value });
return t.appendChild(O("span", { class: this.config.classNames.menu.badge }, e)), t;
},
createButton(e, t) {
const i = N({}, t);
let s = ye(e);
const n = { element: "button", toggle: !1, label: null, icon: null, labelPressed: null, iconPressed: null };
switch (
(["element", "icon", "label"].forEach((e) => {
Object.keys(i).includes(e) && ((n[e] = i[e]), delete i[e]);
}),
"button" !== n.element || Object.keys(i).includes("type") || (i.type = "button"),
Object.keys(i).includes("class") ? i.class.split(" ").some((e) => e === this.config.classNames.control) || N(i, { class: `${i.class} ${this.config.classNames.control}` }) : (i.class = this.config.classNames.control),
e)
) {
case "play":
(n.toggle = !0), (n.label = "play"), (n.labelPressed = "pause"), (n.icon = "play"), (n.iconPressed = "pause");
break;
case "mute":
(n.toggle = !0), (n.label = "mute"), (n.labelPressed = "unmute"), (n.icon = "volume"), (n.iconPressed = "muted");
break;
case "captions":
(n.toggle = !0), (n.label = "enableCaptions"), (n.labelPressed = "disableCaptions"), (n.icon = "captions-off"), (n.iconPressed = "captions-on");
break;
case "fullscreen":
(n.toggle = !0), (n.label = "enterFullscreen"), (n.labelPressed = "exitFullscreen"), (n.icon = "enter-fullscreen"), (n.iconPressed = "exit-fullscreen");
break;
case "play-large":
(i.class += ` ${this.config.classNames.control}--overlaid`), (s = "play"), (n.label = "play"), (n.icon = "play");
break;
default:
A.empty(n.label) && (n.label = s), A.empty(n.icon) && (n.icon = e);
}
const a = O(n.element);
return (
n.toggle
? (a.appendChild(Me.createIcon.call(this, n.iconPressed, { class: "icon--pressed" })),
a.appendChild(Me.createIcon.call(this, n.icon, { class: "icon--not-pressed" })),
a.appendChild(Me.createLabel.call(this, n.labelPressed, { class: "label--pressed" })),
a.appendChild(Me.createLabel.call(this, n.label, { class: "label--not-pressed" })))
: (a.appendChild(Me.createIcon.call(this, n.icon)), a.appendChild(Me.createLabel.call(this, n.label))),
N(i, q(this.config.selectors.buttons[s], i)),
I(a, i),
"play" === s ? (A.array(this.elements.buttons[s]) || (this.elements.buttons[s] = []), this.elements.buttons[s].push(a)) : (this.elements.buttons[s] = a),
a
);
},
createRange(e, t) {
const i = O(
"input",
N(
q(this.config.selectors.inputs[e]),
{ type: "range", min: 0, max: 100, step: 0.01, value: 0, autocomplete: "off", role: "slider", "aria-label": we.get(e, this.config), "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": 0 },
t
)
);
return (this.elements.inputs[e] = i), Me.updateRangeFill.call(this, i), f.setup(i), i;
},
createProgress(e, t) {
const i = O("progress", N(q(this.config.selectors.display[e]), { min: 0, max: 100, value: 0, role: "progressbar", "aria-hidden": !0 }, t));
if ("volume" !== e) {
i.appendChild(O("span", null, "0"));
const t = { played: "played", buffer: "buffered" }[e],
s = t ? we.get(t, this.config) : "";
i.innerText = `% ${s.toLowerCase()}`;
}
return (this.elements.display[e] = i), i;
},
createTime(e, t) {
const i = q(this.config.selectors.display[e], t),
s = O("div", N(i, { class: `${i.class ? i.class : ""} ${this.config.classNames.display.time} `.trim(), "aria-label": we.get(e, this.config), role: "timer" }), "00:00");
return (this.elements.display[e] = s), s;
},
bindMenuItemShortcuts(e, t) {
J.call(
this,
e,
"keydown keyup",
(i) => {
if (![" ", "ArrowUp", "ArrowDown", "ArrowRight"].includes(i.key)) return;
if ((i.preventDefault(), i.stopPropagation(), "keydown" === i.type)) return;
const s = V(e, '[role="menuitemradio"]');
if (!s && [" ", "ArrowRight"].includes(i.key)) Me.showMenuPanel.call(this, t, !0);
else {
let t;
" " !== i.key &&
("ArrowDown" === i.key || (s && "ArrowRight" === i.key)
? ((t = e.nextElementSibling), A.element(t) || (t = e.parentNode.firstElementChild))
: ((t = e.previousElementSibling), A.element(t) || (t = e.parentNode.lastElementChild)),
z.call(this, t, !0));
}
},
!1
),
J.call(this, e, "keyup", (e) => {
"Return" === e.key && Me.focusFirstMenuItem.call(this, null, !0);
});
},
createMenuItem({ value: e, list: t, type: i, title: s, badge: n = null, checked: a = !1 }) {
const r = q(this.config.selectors.inputs[i]),
o = O("button", N(r, { type: "button", role: "menuitemradio", class: `${this.config.classNames.control} ${r.class ? r.class : ""}`.trim(), "aria-checked": a, value: e })),
l = O("span");
(l.innerHTML = s),
A.element(n) && l.appendChild(n),
o.appendChild(l),
Object.defineProperty(o, "checked", {
enumerable: !0,
get: () => "true" === o.getAttribute("aria-checked"),
set(e) {
e &&
Array.from(o.parentNode.children)
.filter((e) => V(e, '[role="menuitemradio"]'))
.forEach((e) => e.setAttribute("aria-checked", "false")),
o.setAttribute("aria-checked", e ? "true" : "false");
},
}),
this.listeners.bind(
o,
"click keyup",
(t) => {
if (!A.keyboardEvent(t) || " " === t.key) {
switch ((t.preventDefault(), t.stopPropagation(), (o.checked = !0), i)) {
case "language":
this.currentTrack = Number(e);
break;
case "quality":
this.quality = e;
break;
case "speed":
this.speed = parseFloat(e);
}
Me.showMenuPanel.call(this, "home", A.keyboardEvent(t));
}
},
i,
!1
),
Me.bindMenuItemShortcuts.call(this, o, i),
t.appendChild(o);
},
formatTime(e = 0, t = !1) {
if (!A.number(e)) return e;
return Pe(e, Ce(this.duration) > 0, t);
},
updateTimeDisplay(e = null, t = 0, i = !1) {
A.element(e) && A.number(t) && (e.innerText = Me.formatTime(t, i));
},
updateVolume() {
this.supported.ui &&
(A.element(this.elements.inputs.volume) && Me.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume),
A.element(this.elements.buttons.mute) && (this.elements.buttons.mute.pressed = this.muted || 0 === this.volume));
},
setRange(e, t = 0) {
A.element(e) && ((e.value = t), Me.updateRangeFill.call(this, e));
},
updateProgress(e) {
if (!this.supported.ui || !A.event(e)) return;
let t = 0;
const i = (e, t) => {
const i = A.number(t) ? t : 0,
s = A.element(e) ? e : this.elements.display.buffer;
if (A.element(s)) {
s.value = i;
const e = s.getElementsByTagName("span")[0];
A.element(e) && (e.childNodes[0].nodeValue = i);
}
};
if (e)
switch (e.type) {
case "timeupdate":
case "seeking":
case "seeked":
(s = this.currentTime),
(n = this.duration),
(t = 0 === s || 0 === n || Number.isNaN(s) || Number.isNaN(n) ? 0 : ((s / n) * 100).toFixed(2)),
"timeupdate" === e.type && Me.setRange.call(this, this.elements.inputs.seek, t);
break;
case "playing":
case "progress":
i(this.elements.display.buffer, 100 * this.buffered);
}
var s, n;
},
updateRangeFill(e) {
const t = A.event(e) ? e.target : e;
if (A.element(t) && "range" === t.getAttribute("type")) {
if (V(t, this.config.selectors.inputs.seek)) {
t.setAttribute("aria-valuenow", this.currentTime);
const e = Me.formatTime(this.currentTime),
i = Me.formatTime(this.duration),
s = we.get("seekLabel", this.config);
t.setAttribute("aria-valuetext", s.replace("{currentTime}", e).replace("{duration}", i));
} else if (V(t, this.config.selectors.inputs.volume)) {
const e = 100 * t.value;
t.setAttribute("aria-valuenow", e), t.setAttribute("aria-valuetext", `${e.toFixed(1)}%`);
} else t.setAttribute("aria-valuenow", t.value);
(x.isWebKit || x.isIPadOS) && t.style.setProperty("--value", (t.value / t.max) * 100 + "%");
}
},
updateSeekTooltip(e) {
var t, i;
if (!this.config.tooltips.seek || !A.element(this.elements.inputs.seek) || !A.element(this.elements.display.seekTooltip) || 0 === this.duration) return;
const s = this.elements.display.seekTooltip,
n = `${this.config.classNames.tooltip}--visible`,
a = (e) => F(s, n, e);
if (this.touch) return void a(!1);
let r = 0;
const o = this.elements.progress.getBoundingClientRect();
if (A.event(e)) r = (100 / o.width) * (e.pageX - o.left);
else {
if (!U(s, n)) return;
r = parseFloat(s.style.left, 10);
}
r < 0 ? (r = 0) : r > 100 && (r = 100);
const l = (this.duration / 100) * r;
s.innerText = Me.formatTime(l);
const c = null === (t = this.config.markers) || void 0 === t || null === (i = t.points) || void 0 === i ? void 0 : i.find(({ time: e }) => e === Math.round(l));
c && s.insertAdjacentHTML("afterbegin", `${c.label}<br>`), (s.style.left = `${r}%`), A.event(e) && ["mouseenter", "mouseleave"].includes(e.type) && a("mouseenter" === e.type);
},
timeUpdate(e) {
const t = !A.element(this.elements.display.duration) && this.config.invertTime;
Me.updateTimeDisplay.call(this, this.elements.display.currentTime, t ? this.duration - this.currentTime : this.currentTime, t), (e && "timeupdate" === e.type && this.media.seeking) || Me.updateProgress.call(this, e);
},
durationUpdate() {
if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) return;
if (this.duration >= 2 ** 32) return H(this.elements.display.currentTime, !0), void H(this.elements.progress, !0);
A.element(this.elements.inputs.seek) && this.elements.inputs.seek.setAttribute("aria-valuemax", this.duration);
const e = A.element(this.elements.display.duration);
!e && this.config.displayDuration && this.paused && Me.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration),
e && Me.updateTimeDisplay.call(this, this.elements.display.duration, this.duration),
this.config.markers.enabled && Me.setMarkers.call(this),
Me.updateSeekTooltip.call(this);
},
toggleMenuButton(e, t) {
H(this.elements.settings.buttons[e], !t);
},
updateSetting(e, t, i) {
const s = this.elements.settings.panels[e];
let n = null,
a = t;
if ("captions" === e) n = this.currentTrack;
else {
if (((n = A.empty(i) ? this[e] : i), A.empty(n) && (n = this.config[e].default), !A.empty(this.options[e]) && !this.options[e].includes(n))) return void this.debug.warn(`Unsupported value of '${n}' for ${e}`);
if (!this.config[e].options.includes(n)) return void this.debug.warn(`Disabled value of '${n}' for ${e}`);
}
if ((A.element(a) || (a = s && s.querySelector('[role="menu"]')), !A.element(a))) return;
this.elements.settings.buttons[e].querySelector(`.${this.config.classNames.menu.value}`).innerHTML = Me.getLabel.call(this, e, n);
const r = a && a.querySelector(`[value="${n}"]`);
A.element(r) && (r.checked = !0);
},
getLabel(e, t) {
switch (e) {
case "speed":
return 1 === t ? we.get("normal", this.config) : `${t}×`;
case "quality":
if (A.number(t)) {
const e = we.get(`qualityLabel.${t}`, this.config);
return e.length ? e : `${t}p`;
}
return fe(t);
case "captions":
return Ne.getLabel.call(this);
default:
return null;
}
},
setQualityMenu(e) {
if (!A.element(this.elements.settings.panels.quality)) return;
const t = "quality",
i = this.elements.settings.panels.quality.querySelector('[role="menu"]');
A.array(e) && (this.options.quality = ne(e).filter((e) => this.config.quality.options.includes(e)));
const s = !A.empty(this.options.quality) && this.options.quality.length > 1;
if ((Me.toggleMenuButton.call(this, t, s), R(i), Me.checkMenu.call(this), !s)) return;
const n = (e) => {
const t = we.get(`qualityBadge.${e}`, this.config);
return t.length ? Me.createBadge.call(this, t) : null;
};
this.options.quality
.sort((e, t) => {
const i = this.config.quality.options;
return i.indexOf(e) > i.indexOf(t) ? 1 : -1;
})
.forEach((e) => {
Me.createMenuItem.call(this, { value: e, list: i, type: t, title: Me.getLabel.call(this, "quality", e), badge: n(e) });
}),
Me.updateSetting.call(this, t, i);
},
setCaptionsMenu() {
if (!A.element(this.elements.settings.panels.captions)) return;
const e = "captions",
t = this.elements.settings.panels.captions.querySelector('[role="menu"]'),
i = Ne.getTracks.call(this),
s = Boolean(i.length);
if ((Me.toggleMenuButton.call(this, e, s), R(t), Me.checkMenu.call(this), !s)) return;
const n = i.map((e, i) => ({
value: i,
checked: this.captions.toggled && this.currentTrack === i,
title: Ne.getLabel.call(this, e),
badge: e.language && Me.createBadge.call(this, e.language.toUpperCase()),
list: t,
type: "language",
}));
n.unshift({ value: -1, checked: !this.captions.toggled, title: we.get("disabled", this.config), list: t, type: "language" }), n.forEach(Me.createMenuItem.bind(this)), Me.updateSetting.call(this, e, t);
},
setSpeedMenu() {
if (!A.element(this.elements.settings.panels.speed)) return;
const e = "speed",
t = this.elements.settings.panels.speed.querySelector('[role="menu"]');
this.options.speed = this.options.speed.filter((e) => e >= this.minimumSpeed && e <= this.maximumSpeed);
const i = !A.empty(this.options.speed) && this.options.speed.length > 1;
Me.toggleMenuButton.call(this, e, i),
R(t),
Me.checkMenu.call(this),
i &&
(this.options.speed.forEach((i) => {
Me.createMenuItem.call(this, { value: i, list: t, type: e, title: Me.getLabel.call(this, "speed", i) });
}),
Me.updateSetting.call(this, e, t));
},
checkMenu() {
const { buttons: e } = this.elements.settings,
t = !A.empty(e) && Object.values(e).some((e) => !e.hidden);
H(this.elements.settings.menu, !t);
},
focusFirstMenuItem(e, t = !1) {
if (this.elements.settings.popup.hidden) return;
let i = e;
A.element(i) || (i = Object.values(this.elements.settings.panels).find((e) => !e.hidden));
const s = i.querySelector('[role^="menuitem"]');
z.call(this, s, t);
},
toggleMenu(e) {
const { popup: t } = this.elements.settings,
i = this.elements.buttons.settings;
if (!A.element(t) || !A.element(i)) return;
const { hidden: s } = t;
let n = s;
if (A.boolean(e)) n = e;
else if (A.keyboardEvent(e) && "Escape" === e.key) n = !1;
else if (A.event(e)) {
const s = A.function(e.composedPath) ? e.composedPath()[0] : e.target,
a = t.contains(s);
if (a || (!a && e.target !== i && n)) return;
}
i.setAttribute("aria-expanded", n),
H(t, !n),
F(this.elements.container, this.config.classNames.menu.open, n),
n && A.keyboardEvent(e) ? Me.focusFirstMenuItem.call(this, null, !0) : n || s || z.call(this, i, A.keyboardEvent(e));
},
getMenuSize(e) {
const t = e.cloneNode(!0);
(t.style.position = "absolute"), (t.style.opacity = 0), t.removeAttribute("hidden"), e.parentNode.appendChild(t);
const i = t.scrollWidth,
s = t.scrollHeight;
return j(t), { width: i, height: s };
},
showMenuPanel(e = "", t = !1) {
const i = this.elements.container.querySelector(`#plyr-settings-${this.id}-${e}`);
if (!A.element(i)) return;
const s = i.parentNode,
n = Array.from(s.children).find((e) => !e.hidden);
if (Y.transitions && !Y.reducedMotion) {
(s.style.width = `${n.scrollWidth}px`), (s.style.height = `${n.scrollHeight}px`);
const e = Me.getMenuSize.call(this, i),
t = (e) => {
e.target === s && ["width", "height"].includes(e.propertyName) && ((s.style.width = ""), (s.style.height = ""), G.call(this, s, P, t));
};
J.call(this, s, P, t), (s.style.width = `${e.width}px`), (s.style.height = `${e.height}px`);
}
H(n, !0), H(i, !1), Me.focusFirstMenuItem.call(this, i, t);
},
setDownloadUrl() {
const e = this.elements.buttons.download;
A.element(e) && e.setAttribute("href", this.download);
},
create(e) {
const { bindMenuItemShortcuts: t, createButton: i, createProgress: s, createRange: n, createTime: a, setQualityMenu: r, setSpeedMenu: o, showMenuPanel: l } = Me;
(this.elements.controls = null), A.array(this.config.controls) && this.config.controls.includes("play-large") && this.elements.container.appendChild(i.call(this, "play-large"));
const c = O("div", q(this.config.selectors.controls.wrapper));
this.elements.controls = c;
const u = { class: "plyr__controls__item" };
return (
ne(A.array(this.config.controls) ? this.config.controls : []).forEach((r) => {
if (
("restart" === r && c.appendChild(i.call(this, "restart", u)),
"rewind" === r && c.appendChild(i.call(this, "rewind", u)),
"play" === r && c.appendChild(i.call(this, "play", u)),
"fast-forward" === r && c.appendChild(i.call(this, "fast-forward", u)),
"progress" === r)
) {
const t = O("div", { class: `${u.class} plyr__progress__container` }),
i = O("div", q(this.config.selectors.progress));
if ((i.appendChild(n.call(this, "seek", { id: `plyr-seek-${e.id}` })), i.appendChild(s.call(this, "buffer")), this.config.tooltips.seek)) {
const e = O("span", { class: this.config.classNames.tooltip }, "00:00");
i.appendChild(e), (this.elements.display.seekTooltip = e);
}
(this.elements.progress = i), t.appendChild(this.elements.progress), c.appendChild(t);
}
if (("current-time" === r && c.appendChild(a.call(this, "currentTime", u)), "duration" === r && c.appendChild(a.call(this, "duration", u)), "mute" === r || "volume" === r)) {
let { volume: t } = this.elements;
if (
((A.element(t) && c.contains(t)) || ((t = O("div", N({}, u, { class: `${u.class} plyr__volume`.trim() }))), (this.elements.volume = t), c.appendChild(t)),
"mute" === r && t.appendChild(i.call(this, "mute")),
"volume" === r && !x.isIos && !x.isIPadOS)
) {
const i = { max: 1, step: 0.05, value: this.config.volume };
t.appendChild(n.call(this, "volume", N(i, { id: `plyr-volume-${e.id}` })));
}
}
if (("captions" === r && c.appendChild(i.call(this, "captions", u)), "settings" === r && !A.empty(this.config.settings))) {
const s = O("div", N({}, u, { class: `${u.class} plyr__menu`.trim(), hidden: "" }));
s.appendChild(i.call(this, "settings", { "aria-haspopup": !0, "aria-controls": `plyr-settings-${e.id}`, "aria-expanded": !1 }));
const n = O("div", { class: "plyr__menu__container", id: `plyr-settings-${e.id}`, hidden: "" }),
a = O("div"),
r = O("div", { id: `plyr-settings-${e.id}-home` }),
o = O("div", { role: "menu" });
r.appendChild(o),
a.appendChild(r),
(this.elements.settings.panels.home = r),
this.config.settings.forEach((i) => {
const s = O(
"button",
N(q(this.config.selectors.buttons.settings), {
type: "button",
class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,
role: "menuitem",
"aria-haspopup": !0,
hidden: "",
})
);
t.call(this, s, i),
J.call(this, s, "click", () => {
l.call(this, i, !1);
});
const n = O("span", null, we.get(i, this.config)),
r = O("span", { class: this.config.classNames.menu.value });
(r.innerHTML = e[i]), n.appendChild(r), s.appendChild(n), o.appendChild(s);
const c = O("div", { id: `plyr-settings-${e.id}-${i}`, hidden: "" }),
u = O("button", { type: "button", class: `${this.config.classNames.control} ${this.config.classNames.control}--back` });
u.appendChild(O("span", { "aria-hidden": !0 }, we.get(i, this.config))),
u.appendChild(O("span", { class: this.config.classNames.hidden }, we.get("menuBack", this.config))),
J.call(
this,
c,
"keydown",
(e) => {
"ArrowLeft" === e.key && (e.preventDefault(), e.stopPropagation(), l.call(this, "home", !0));
},
!1
),
J.call(this, u, "click", () => {
l.call(this, "home", !1);
}),
c.appendChild(u),
c.appendChild(O("div", { role: "menu" })),
a.appendChild(c),
(this.elements.settings.buttons[i] = s),
(this.elements.settings.panels[i] = c);
}),
n.appendChild(a),
s.appendChild(n),
c.appendChild(s),
(this.elements.settings.popup = n),
(this.elements.settings.menu = s);
}
if (("pip" === r && Y.pip && c.appendChild(i.call(this, "pip", u)), "airplay" === r && Y.airplay && c.appendChild(i.call(this, "airplay", u)), "download" === r)) {
const e = N({}, u, { element: "a", href: this.download, target: "_blank" });
this.isHTML5 && (e.download = "");
const { download: t } = this.config.urls;
!A.url(t) && this.isEmbed && N(e, { icon: `logo-${this.provider}`, label: this.provider }), c.appendChild(i.call(this, "download", e));
}
"fullscreen" === r && c.appendChild(i.call(this, "fullscreen", u));
}),
this.isHTML5 && r.call(this, me.getQualityOptions.call(this)),
o.call(this),
c
);
},
inject() {
if (this.config.loadSprite) {
const e = Me.getIconUrl.call(this);
e.cors && Ee(e.url, "sprite-plyr");
}
this.id = Math.floor(1e4 * Math.random());
let e = null;
this.elements.controls = null;
const t = { id: this.id, seektime: this.config.seekTime, title: this.config.title };
let i = !0;
A.function(this.config.controls) && (this.config.controls = this.config.controls.call(this, t)),
this.config.controls || (this.config.controls = []),
A.element(this.config.controls) || A.string(this.config.controls)
? (e = this.config.controls)
: ((e = Me.create.call(this, { id: this.id, seektime: this.config.seekTime, speed: this.speed, quality: this.quality, captions: Ne.getLabel.call(this) })), (i = !1));
let s;
i &&
A.string(this.config.controls) &&
(e = ((e) => {
let i = e;
return (
Object.entries(t).forEach(([e, t]) => {
i = ge(i, `{${e}}`, t);
}),
i
);
})(e)),
A.string(this.config.selectors.controls.container) && (s = document.querySelector(this.config.selectors.controls.container)),
A.element(s) || (s = this.elements.container);
if ((s[A.element(e) ? "insertAdjacentElement" : "insertAdjacentHTML"]("afterbegin", e), A.element(this.elements.controls) || Me.findElements.call(this), !A.empty(this.elements.buttons))) {
const e = (e) => {
const t = this.config.classNames.controlPressed;
e.setAttribute("aria-pressed", "false"),
Object.defineProperty(e, "pressed", {
configurable: !0,
enumerable: !0,
get: () => U(e, t),
set(i = !1) {
F(e, t, i), e.setAttribute("aria-pressed", i ? "true" : "false");
},
});
};
Object.values(this.elements.buttons)
.filter(Boolean)
.forEach((t) => {
A.array(t) || A.nodeList(t) ? Array.from(t).filter(Boolean).forEach(e) : e(t);
});
}
if ((x.isEdge && M(s), this.config.tooltips.controls)) {
const { classNames: e, selectors: t } = this.config,
i = `${t.controls.wrapper} ${t.labels} .${e.hidden}`,
s = B.call(this, i);
Array.from(s).forEach((e) => {
F(e, this.config.classNames.hidden, !1), F(e, this.config.classNames.tooltip, !0);
});
}
},
setMediaMetadata() {
try {
"mediaSession" in navigator &&
(navigator.mediaSession.metadata = new window.MediaMetadata({
title: this.config.mediaMetadata.title,
artist: this.config.mediaMetadata.artist,
album: this.config.mediaMetadata.album,
artwork: this.config.mediaMetadata.artwork,
}));
} catch (e) { }
},
setMarkers() {
var e, t;
if (!this.duration || this.elements.markers) return;
const i = null === (e = this.config.markers) || void 0 === e || null === (t = e.points) || void 0 === t ? void 0 : t.filter(({ time: e }) => e > 0 && e < this.duration);
if (null == i || !i.length) return;
const s = document.createDocumentFragment(),
n = document.createDocumentFragment();
let a = null;
const r = `${this.config.classNames.tooltip}--visible`,
o = (e) => F(a, r, e);
i.forEach((e) => {
const t = O("span", { class: this.config.classNames.marker }, ""),
i = (e.time / this.duration) * 100 + "%";
a &&
(t.addEventListener("mouseenter", () => {
e.label || ((a.style.left = i), (a.innerHTML = e.label), o(!0));
}),
t.addEventListener("mouseleave", () => {
o(!1);
})),
t.addEventListener("click", () => {
this.currentTime = e.time;
}),
(t.style.left = i),
n.appendChild(t);
}),
s.appendChild(n),
this.config.tooltips.seek || ((a = O("span", { class: this.config.classNames.tooltip }, "")), s.appendChild(a)),
(this.elements.markers = { points: n, tip: a }),
this.elements.progress.appendChild(s);
},
};
function xe(e, t = !0) {
let i = e;
if (t) {
const e = document.createElement("a");
(e.href = i), (i = e.href);
}
try {
return new URL(i);
} catch (e) {
return null;
}
}
function Le(e) {
const t = new URLSearchParams();
return (
A.object(e) &&
Object.entries(e).forEach(([e, i]) => {
t.set(e, i);
}),
t
);
}
const Ne = {
setup() {
if (!this.supported.ui) return;
if (!this.isVideo || this.isYouTube || (this.isHTML5 && !Y.textTracks))
return void (A.array(this.config.controls) && this.config.controls.includes("settings") && this.config.settings.includes("captions") && Me.setCaptionsMenu.call(this));
var e, t;
if (
(A.element(this.elements.captions) ||
((this.elements.captions = O("div", q(this.config.selectors.captions))),
this.elements.captions.setAttribute("dir", "auto"),
(e = this.elements.captions),
(t = this.elements.wrapper),
A.element(e) && A.element(t) && t.parentNode.insertBefore(e, t.nextSibling)),
x.isIE && window.URL)
) {
const e = this.media.querySelectorAll("track");
Array.from(e).forEach((e) => {
const t = e.getAttribute("src"),
i = xe(t);
null !== i &&
i.hostname !== window.location.href.hostname &&
["http:", "https:"].includes(i.protocol) &&
ke(t, "blob")
.then((t) => {
e.setAttribute("src", window.URL.createObjectURL(t));
})
.catch(() => {
j(e);
});
});
}
const i = ne((navigator.languages || [navigator.language || navigator.userLanguage || "en"]).map((e) => e.split("-")[0]));
let s = (this.storage.get("language") || this.config.captions.language || "auto").toLowerCase();
"auto" === s && ([s] = i);
let n = this.storage.get("captions");
if ((A.boolean(n) || ({ active: n } = this.config.captions), Object.assign(this.captions, { toggled: !1, active: n, language: s, languages: i }), this.isHTML5)) {
const e = this.config.captions.update ? "addtrack removetrack" : "removetrack";
J.call(this, this.media.textTracks, e, Ne.update.bind(this));
}
setTimeout(Ne.update.bind(this), 0);
},
update() {
const e = Ne.getTracks.call(this, !0),
{ active: t, language: i, meta: s, currentTrackNode: n } = this.captions,
a = Boolean(e.find((e) => e.language === i));
this.isHTML5 &&
this.isVideo &&
e
.filter((e) => !s.get(e))
.forEach((e) => {
this.debug.log("Track added", e), s.set(e, { default: "showing" === e.mode }), "showing" === e.mode && (e.mode = "hidden"), J.call(this, e, "cuechange", () => Ne.updateCues.call(this));
}),
((a && this.language !== i) || !e.includes(n)) && (Ne.setLanguage.call(this, i), Ne.toggle.call(this, t && a)),
this.elements && F(this.elements.container, this.config.classNames.captions.enabled, !A.empty(e)),
A.array(this.config.controls) && this.config.controls.includes("settings") && this.config.settings.includes("captions") && Me.setCaptionsMenu.call(this);
},
toggle(e, t = !0) {
if (!this.supported.ui) return;
const { toggled: i } = this.captions,
s = this.config.classNames.captions.active,
n = A.nullOrUndefined(e) ? !i : e;
if (n !== i) {
if ((t || ((this.captions.active = n), this.storage.set({ captions: n })), !this.language && n && !t)) {
const e = Ne.getTracks.call(this),
t = Ne.findTrack.call(this, [this.captions.language, ...this.captions.languages], !0);
return (this.captions.language = t.language), void Ne.set.call(this, e.indexOf(t));
}
this.elements.buttons.captions && (this.elements.buttons.captions.pressed = n),
F(this.elements.container, s, n),
(this.captions.toggled = n),
Me.updateSetting.call(this, "captions"),
ee.call(this, this.media, n ? "captionsenabled" : "captionsdisabled");
}
setTimeout(() => {
n && this.captions.toggled && (this.captions.currentTrackNode.mode = "hidden");
});
},
set(e, t = !0) {
const i = Ne.getTracks.call(this);
if (-1 !== e)
if (A.number(e))
if (e in i) {
if (this.captions.currentTrack !== e) {
this.captions.currentTrack = e;
const s = i[e],
{ language: n } = s || {};
(this.captions.currentTrackNode = s),
Me.updateSetting.call(this, "captions"),
t || ((this.captions.language = n), this.storage.set({ language: n })),
this.isVimeo && this.embed.enableTextTrack(n),
ee.call(this, this.media, "languagechange");
}
Ne.toggle.call(this, !0, t), this.isHTML5 && this.isVideo && Ne.updateCues.call(this);
} else this.debug.warn("Track not found", e);
else this.debug.warn("Invalid caption argument", e);
else Ne.toggle.call(this, !1, t);
},
setLanguage(e, t = !0) {
if (!A.string(e)) return void this.debug.warn("Invalid language argument", e);
const i = e.toLowerCase();
this.captions.language = i;
const s = Ne.getTracks.call(this),
n = Ne.findTrack.call(this, [i]);
Ne.set.call(this, s.indexOf(n), t);
},
getTracks(e = !1) {
return Array.from((this.media || {}).textTracks || [])
.filter((t) => !this.isHTML5 || e || this.captions.meta.has(t))
.filter((e) => ["captions", "subtitles"].includes(e.kind));
},
findTrack(e, t = !1) {
const i = Ne.getTracks.call(this),
s = (e) => Number((this.captions.meta.get(e) || {}).default),
n = Array.from(i).sort((e, t) => s(t) - s(e));
let a;
return e.every((e) => ((a = n.find((t) => t.language === e)), !a)), a || (t ? n[0] : void 0);
},
getCurrentTrack() {
return Ne.getTracks.call(this)[this.currentTrack];
},
getLabel(e) {
let t = e;
return (
!A.track(t) && Y.textTracks && this.captions.toggled && (t = Ne.getCurrentTrack.call(this)),
A.track(t) ? (A.empty(t.label) ? (A.empty(t.language) ? we.get("enabled", this.config) : e.language.toUpperCase()) : t.label) : we.get("disabled", this.config)
);
},
updateCues(e) {
if (!this.supported.ui) return;
if (!A.element(this.elements.captions)) return void this.debug.warn("No captions element to render to");
if (!A.nullOrUndefined(e) && !Array.isArray(e)) return void this.debug.warn("updateCues: Invalid input", e);
let t = e;
if (!t) {
const e = Ne.getCurrentTrack.call(this);
t = Array.from((e || {}).activeCues || [])
.map((e) => e.getCueAsHTML())
.map(be);
}
const i = t.map((e) => e.trim()).join("\n");
if (i !== this.elements.captions.innerHTML) {
R(this.elements.captions);
const e = O("span", q(this.config.selectors.caption));
(e.innerHTML = i), this.elements.captions.appendChild(e), ee.call(this, this.media, "cuechange");
}
},
},
_e = {
enabled: !0,
title: "",
debug: !1,
autoplay: !1,
autopause: !0,
playsinline: !0,
seekTime: 10,
volume: 1,
muted: !1,
duration: null,
displayDuration: !0,
invertTime: !0,
toggleInvert: !0,
ratio: null,
clickToPlay: !0,
hideControls: !0,
resetOnEnd: !1,
disableContextMenu: !0,
loadSprite: !0,
iconPrefix: "plyr",
iconUrl: "https://cdn.plyr.io/3.7.8/plyr.svg",
blankVideo: "https://cdn.plyr.io/static/blank.mp4",
quality: { default: 576, options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240], forced: !1, onChange: null },
loop: { active: !1 },
speed: { selected: 1, options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4] },
keyboard: { focused: !0, global: !1 },
tooltips: { controls: !1, seek: !0 },
captions: { active: !1, language: "auto", update: !1 },
fullscreen: { enabled: !0, fallback: !0, iosNative: !1 },
storage: { enabled: !0, key: "plyr" },
controls: ["play-large", "play", "progress", "current-time", "mute", "volume", "captions", "settings", "pip", "airplay", "fullscreen"],
settings: ["captions", "quality", "speed"],
i18n: {
restart: "Restart",
rewind: "Rewind {seektime}s",
play: "Play",
pause: "Pause",
fastForward: "Forward {seektime}s",
seek: "Seek",
seekLabel: "{currentTime} of {duration}",
played: "Played",
buffered: "Buffered",
currentTime: "Current time",
duration: "Duration",
volume: "Volume",
mute: "Mute",
unmute: "Unmute",
enableCaptions: "Enable captions",
disableCaptions: "Disable captions",
download: "Download",
enterFullscreen: "Fullscreen",
exitFullscreen: "Exit fullscreen",
frameTitle: "Player for {title}",
captions: "Captions",
settings: "Settings",
pip: "Pop-up",
menuBack: "Go back to previous menu",
speed: "Speed",
normal: "Normal",
quality: "Quality",
loop: "Loop",
start: "Start",
end: "End",
all: "All",
reset: "Reset",
disabled: "Disabled",
enabled: "Enabled",
advertisement: "Ad",
qualityBadge: { 2160: "4K", 1440: "HD", 1080: "HD", 720: "HD", 576: "SD", 480: "SD" },
},
urls: {
download: null,
vimeo: { sdk: "https://player.vimeo.com/api/player.js", iframe: "https://player.vimeo.com/video/{0}?{1}", api: "https://vimeo.com/api/oembed.json?url={0}" },
youtube: { sdk: "https://www.youtube.com/iframe_api", api: "https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}" },
googleIMA: { sdk: "https://imasdk.googleapis.com/js/sdkloader/ima3.js" },
},
listeners: {
seek: null,
play: null,
pause: null,
restart: null,
rewind: null,
fastForward: null,
mute: null,
volume: null,
captions: null,
download: null,
fullscreen: null,
pip: null,
airplay: null,
speed: null,
quality: null,
loop: null,
language: null,
},
events: [
"ended",
"progress",
"stalled",
"playing",
"waiting",
"canplay",
"canplaythrough",
"loadstart",
"loadeddata",
"loadedmetadata",
"timeupdate",
"volumechange",
"play",
"pause",
"error",
"seeking",
"seeked",
"emptied",
"ratechange",
"cuechange",
"download",
"enterfullscreen",
"exitfullscreen",
"captionsenabled",
"captionsdisabled",
"languagechange",
"controlshidden",
"controlsshown",
"ready",
"statechange",
"qualitychange",
"adsloaded",
"adscontentpause",
"adscontentresume",
"adstarted",
"adsmidpoint",
"adscomplete",
"adsallcomplete",
"adsimpression",
"adsclick",
],
selectors: {
editable: "input, textarea, select, [contenteditable]",
container: ".plyr",
controls: { container: null, wrapper: ".plyr__controls" },
labels: "[data-plyr]",
buttons: {
play: '[data-plyr="play"]',
pause: '[data-plyr="pause"]',
restart: '[data-plyr="restart"]',
rewind: '[data-plyr="rewind"]',
fastForward: '[data-plyr="fast-forward"]',
mute: '[data-plyr="mute"]',
captions: '[data-plyr="captions"]',
download: '[data-plyr="download"]',
fullscreen: '[data-plyr="fullscreen"]',
pip: '[data-plyr="pip"]',
airplay: '[data-plyr="airplay"]',
settings: '[data-plyr="settings"]',
loop: '[data-plyr="loop"]',
},
inputs: { seek: '[data-plyr="seek"]', volume: '[data-plyr="volume"]', speed: '[data-plyr="speed"]', language: '[data-plyr="language"]', quality: '[data-plyr="quality"]' },
display: { currentTime: ".plyr__time--current", duration: ".plyr__time--duration", buffer: ".plyr__progress__buffer", loop: ".plyr__progress__loop", volume: ".plyr__volume--display" },
progress: ".plyr__progress",
captions: ".plyr__captions",
caption: ".plyr__caption",
},
classNames: {
type: "plyr--{0}",
provider: "plyr--{0}",
video: "plyr__video-wrapper",
embed: "plyr__video-embed",
videoFixedRatio: "plyr__video-wrapper--fixed-ratio",
embedContainer: "plyr__video-embed__container",
poster: "plyr__poster",
posterEnabled: "plyr__poster-enabled",
ads: "plyr__ads",
control: "plyr__control",
controlPressed: "plyr__control--pressed",
playing: "plyr--playing",
paused: "plyr--paused",
stopped: "plyr--stopped",
loading: "plyr--loading",
hover: "plyr--hover",
tooltip: "plyr__tooltip",
cues: "plyr__cues",
marker: "plyr__progress__marker",
hidden: "plyr__sr-only",
hideControls: "plyr--hide-controls",
isTouch: "plyr--is-touch",
uiSupported: "plyr--full-ui",
noTransition: "plyr--no-transition",
display: { time: "plyr__time" },
menu: { value: "plyr__menu__value", badge: "plyr__badge", open: "plyr--menu-open" },
captions: { enabled: "plyr--captions-enabled", active: "plyr--captions-active" },
fullscreen: { enabled: "plyr--fullscreen-enabled", fallback: "plyr--fullscreen-fallback" },
pip: { supported: "plyr--pip-supported", active: "plyr--pip-active" },
airplay: { supported: "plyr--airplay-supported", active: "plyr--airplay-active" },
posterThumbnails: {
thumbContainer: "plyr__preview-thumb",
thumbContainerShown: "plyr__preview-thumb--is-shown",
imageContainer: "plyr__preview-thumb__image-container",
timeContainer: "plyr__preview-thumb__time-container",
scrubbingContainer: "plyr__preview-scrubbing",
scrubbingContainerShown: "plyr__preview-scrubbing--is-shown",
},
},
attributes: { embed: { provider: "data-plyr-provider", id: "data-plyr-embed-id", hash: "data-plyr-embed-hash" } },
ads: { enabled: !1, publisherId: "", tagUrl: "" },
posterThumbnails: { enabled: !1, src: "" },
vimeo: { byline: !1, portrait: !1, title: !1, speed: !0, transparent: !1, customControls: !0, referrerPolicy: null, premium: !1 },
youtube: { rel: 0, showinfo: 0, iv_load_policy: 3, modestbranding: 1, customControls: !0, noCookie: !1 },
mediaMetadata: { title: "", artist: "", album: "", artwork: [] },
markers: { enabled: !1, points: [] },
},
Ie = "picture-in-picture",
Oe = "inline",
$e = { html5: "html5", youtube: "youtube", vimeo: "vimeo" },
je = "audio",
Re = "video";
const De = () => { };
class qe {
constructor(e = !1) {
(this.enabled = window.console && e), this.enabled && this.log("Debugging enabled");
}
get log() {
return this.enabled ? Function.prototype.bind.call(console.log, console) : De;
}
get warn() {
return this.enabled ? Function.prototype.bind.call(console.warn, console) : De;
}
get error() {
return this.enabled ? Function.prototype.bind.call(console.error, console) : De;
}
}
class He {
constructor(e) {
t(this, "onChange", () => {
if (!this.supported) return;
const e = this.player.elements.buttons.fullscreen;
A.element(e) && (e.pressed = this.active);
const t = this.target === this.player.media ? this.target : this.player.elements.container;
ee.call(this.player, t, this.active ? "enterfullscreen" : "exitfullscreen", !0);
}),
t(this, "toggleFallback", (e = !1) => {
if (
(e ? (this.scrollPosition = { x: window.scrollX ?? 0, y: window.scrollY ?? 0 }) : window.scrollTo(this.scrollPosition.x, this.scrollPosition.y),
(document.body.style.overflow = e ? "hidden" : ""),
F(this.target, this.player.config.classNames.fullscreen.fallback, e),
x.isIos)
) {
let t = document.head.querySelector('meta[name="viewport"]');
const i = "viewport-fit=cover";
t || ((t = document.createElement("meta")), t.setAttribute("name", "viewport"));
const s = A.string(t.content) && t.content.includes(i);
e
? ((this.cleanupViewport = !s), s || (t.content += `,${i}`))
: this.cleanupViewport &&
(t.content = t.content
.split(",")
.filter((e) => e.trim() !== i)
.join(","));
}
this.onChange();
}),
t(this, "trapFocus", (e) => {
if (x.isIos || x.isIPadOS || !this.active || "Tab" !== e.key) return;
const t = document.activeElement,
i = B.call(this.player, "a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),
[s] = i,
n = i[i.length - 1];
t !== n || e.shiftKey ? t === s && e.shiftKey && (n.focus(), e.preventDefault()) : (s.focus(), e.preventDefault());
}),
t(this, "update", () => {
if (this.supported) {
let e;
(e = this.forceFallback ? "Fallback (forced)" : He.nativeSupported ? "Native" : "Fallback"), this.player.debug.log(`${e} fullscreen enabled`);
} else this.player.debug.log("Fullscreen not supported and fallback disabled");
F(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.supported);
}),
t(this, "enter", () => {
this.supported &&
(x.isIos && this.player.config.fullscreen.iosNative
? this.player.isVimeo
? this.player.embed.requestFullscreen()
: this.target.webkitEnterFullscreen()
: !He.nativeSupported || this.forceFallback
? this.toggleFallback(!0)
: this.prefix
? A.empty(this.prefix) || this.target[`${this.prefix}Request${this.property}`]()
: this.target.requestFullscreen({ navigationUI: "hide" }));
}),
t(this, "exit", () => {
if (this.supported)
if (x.isIos && this.player.config.fullscreen.iosNative) this.player.isVimeo ? this.player.embed.exitFullscreen() : this.target.webkitEnterFullscreen(), se(this.player.play());
else if (!He.nativeSupported || this.forceFallback) this.toggleFallback(!1);
else if (this.prefix) {
if (!A.empty(this.prefix)) {
const e = "moz" === this.prefix ? "Cancel" : "Exit";
document[`${this.prefix}${e}${this.property}`]();
}
} else (document.cancelFullScreen || document.exitFullscreen).call(document);
}),
t(this, "toggle", () => {
this.active ? this.exit() : this.enter();
}),
(this.player = e),
(this.prefix = He.prefix),
(this.property = He.property),
(this.scrollPosition = { x: 0, y: 0 }),
(this.forceFallback = "force" === e.config.fullscreen.fallback),
(this.player.elements.fullscreen =
e.config.fullscreen.container &&
(function (e, t) {
const { prototype: i } = Element;
return (
i.closest ||
function () {
let e = this;
do {
if (V.matches(e, t)) return e;
e = e.parentElement || e.parentNode;
} while (null !== e && 1 === e.nodeType);
return null;
}
).call(e, t);
})(this.player.elements.container, e.config.fullscreen.container)),
J.call(this.player, document, "ms" === this.prefix ? "MSFullscreenChange" : `${this.prefix}fullscreenchange`, () => {
this.onChange();
}),
J.call(this.player, this.player.elements.container, "dblclick", (e) => {
(A.element(this.player.elements.controls) && this.player.elements.controls.contains(e.target)) || this.player.listeners.proxy(e, this.toggle, "fullscreen");
}),
J.call(this, this.player.elements.container, "keydown", (e) => this.trapFocus(e)),
this.update();
}
static get nativeSupported() {
return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
}
get useNative() {
return He.nativeSupported && !this.forceFallback;
}
static get prefix() {
if (A.function(document.exitFullscreen)) return "";
let e = "";
return ["webkit", "moz", "ms"].some((t) => !(!A.function(document[`${t}ExitFullscreen`]) && !A.function(document[`${t}CancelFullScreen`])) && ((e = t), !0)), e;
}
static get property() {
return "moz" === this.prefix ? "FullScreen" : "Fullscreen";
}
get supported() {
return [
this.player.config.fullscreen.enabled,
this.player.isVideo,
He.nativeSupported || this.player.config.fullscreen.fallback,
!this.player.isYouTube || He.nativeSupported || !x.isIos || (this.player.config.playsinline && !this.player.config.fullscreen.iosNative),
].every(Boolean);
}
get active() {
if (!this.supported) return !1;
if (!He.nativeSupported || this.forceFallback) return U(this.target, this.player.config.classNames.fullscreen.fallback);
const e = this.prefix ? this.target.getRootNode()[`${this.prefix}${this.property}Element`] : this.target.getRootNode().fullscreenElement;
return e && e.shadowRoot ? e === this.target.getRootNode().host : e === this.target;
}
get target() {
return x.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen ?? this.player.elements.container;
}
}
function Fe(e, t = 1) {
return new Promise((i, s) => {
const n = new Image(),
a = () => {
delete n.onload, delete n.onerror, (n.naturalWidth >= t ? i : s)(n);
};
Object.assign(n, { onload: a, onerror: a, src: e });
});
}
const Ue = {
addStyleHook() {
F(this.elements.container, this.config.selectors.container.replace(".", ""), !0), F(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
},
toggleNativeControls(e = !1) {
e && this.isHTML5 ? this.media.setAttribute("controls", "") : this.media.removeAttribute("controls");
},
build() {
if ((this.listeners.media(), !this.supported.ui)) return this.debug.warn(`Basic support only for ${this.provider} ${this.type}`), void Ue.toggleNativeControls.call(this, !0);
A.element(this.elements.controls) || (Me.inject.call(this), this.listeners.controls()),
Ue.toggleNativeControls.call(this),
this.isHTML5 && Ne.setup.call(this),
(this.volume = null),
(this.muted = null),
(this.loop = null),
(this.quality = null),
(this.speed = null),
Me.updateVolume.call(this),
Me.timeUpdate.call(this),
Me.durationUpdate.call(this),
Ue.checkPlaying.call(this),
F(this.elements.container, this.config.classNames.pip.supported, Y.pip && this.isHTML5 && this.isVideo),
F(this.elements.container, this.config.classNames.airplay.supported, Y.airplay && this.isHTML5),
F(this.elements.container, this.config.classNames.isTouch, this.touch),
(this.ready = !0),
setTimeout(() => {
ee.call(this, this.media, "ready");
}, 0),
Ue.setTitle.call(this),
this.poster && Ue.setPoster.call(this, this.poster, !1).catch(() => { }),
this.config.duration && Me.durationUpdate.call(this),
this.config.mediaMetadata && Me.setMediaMetadata.call(this);
},
setTitle() {
let e = we.get("play", this.config);
if (
(A.string(this.config.title) && !A.empty(this.config.title) && (e += `, ${this.config.title}`),
Array.from(this.elements.buttons.play || []).forEach((t) => {
t.setAttribute("aria-label", e);
}),
this.isEmbed)
) {
const e = W.call(this, "iframe");
if (!A.element(e)) return;
const t = A.empty(this.config.title) ? "video" : this.config.title,
i = we.get("frameTitle", this.config);
e.setAttribute("title", i.replace("{title}", t));
}
},
togglePoster(e) {
F(this.elements.container, this.config.classNames.posterEnabled, e);
},
setPoster(e, t = !0) {
return t && this.poster
? Promise.reject(new Error("Poster already set"))
: (this.media.setAttribute("data-poster", e),
this.elements.poster.removeAttribute("hidden"),
ie
.call(this)
.then(() => Fe(e))
.catch((t) => {
throw (e === this.poster && Ue.togglePoster.call(this, !1), t);
})
.then(() => {
if (e !== this.poster) throw new Error("setPoster cancelled by later call to setPoster");
})
.then(() => (Object.assign(this.elements.poster.style, { backgroundImage: `url('${e}')`, backgroundSize: "" }), Ue.togglePoster.call(this, !0), e)));
},
checkPlaying(e) {
F(this.elements.container, this.config.classNames.playing, this.playing),
F(this.elements.container, this.config.classNames.paused, this.paused),
F(this.elements.container, this.config.classNames.stopped, this.stopped),
Array.from(this.elements.buttons.play || []).forEach((e) => {
Object.assign(e, { pressed: this.playing }), e.setAttribute("aria-label", we.get(this.playing ? "pause" : "play", this.config));
}),
(A.event(e) && "timeupdate" === e.type) || Ue.toggleControls.call(this);
},
checkLoading(e) {
(this.loading = ["stalled", "waiting"].includes(e.type)),
clearTimeout(this.timers.loading),
(this.timers.loading = setTimeout(
() => {
F(this.elements.container, this.config.classNames.loading, this.loading), Ue.toggleControls.call(this);
},
this.loading ? 250 : 0
));
},
toggleControls(e) {
const { controls: t } = this.elements;
if (t && this.config.hideControls) {
const i = this.touch && this.lastSeekTime + 2e3 > Date.now();
this.toggleControls(Boolean(e || this.loading || this.paused || t.pressed || t.hover || i));
}
},
migrateStyles() {
Object.values({ ...this.media.style })
.filter((e) => !A.empty(e) && A.string(e) && e.startsWith("--plyr"))
.forEach((e) => {
this.elements.container.style.setProperty(e, this.media.style.getPropertyValue(e)), this.media.style.removeProperty(e);
}),
A.empty(this.media.style) && this.media.removeAttribute("style");
},
};
class Ve {
constructor(e) {
t(this, "firstTouch", () => {
const { player: e } = this,
{ elements: t } = e;
(e.touch = !0), F(t.container, e.config.classNames.isTouch, !0);
}),
t(this, "global", (e = !0) => {
const { player: t } = this;
t.config.keyboard.global && X.call(t, window, "keydown keyup", this.handleKey, e, !1), X.call(t, document.body, "click", this.toggleMenu, e), Z.call(t, document.body, "touchstart", this.firstTouch);
}),
t(this, "container", () => {
const { player: e } = this,
{ config: t, elements: i, timers: s } = e;
!t.keyboard.global && t.keyboard.focused && J.call(e, i.container, "keydown keyup", this.handleKey, !1),
J.call(e, i.container, "mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen", (t) => {
const { controls: n } = i;
n && "enterfullscreen" === t.type && ((n.pressed = !1), (n.hover = !1));
let a = 0;
["touchstart", "touchmove", "mousemove"].includes(t.type) && (Ue.toggleControls.call(e, !0), (a = e.touch ? 3e3 : 2e3)),
clearTimeout(s.controls),
(s.controls = setTimeout(() => Ue.toggleControls.call(e, !1), a));
});
const n = () => {
if (!e.isVimeo || e.config.vimeo.premium) return;
const t = i.wrapper,
{ active: s } = e.fullscreen,
[n, a] = ue.call(e),
r = re(`aspect-ratio: ${n} / ${a}`);
if (!s) return void (r ? ((t.style.width = null), (t.style.height = null)) : ((t.style.maxWidth = null), (t.style.margin = null)));
const [o, l] = [Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0), Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0)],
c = o / l > n / a;
r ? ((t.style.width = c ? "auto" : "100%"), (t.style.height = c ? "100%" : "auto")) : ((t.style.maxWidth = c ? (l / a) * n + "px" : null), (t.style.margin = c ? "0 auto" : null));
},
a = () => {
clearTimeout(s.resized), (s.resized = setTimeout(n, 50));
};
J.call(e, i.container, "enterfullscreen exitfullscreen", (t) => {
const { target: s } = e.fullscreen;
if (s !== i.container) return;
if (!e.isEmbed && A.empty(e.config.ratio)) return;
n();
("enterfullscreen" === t.type ? J : G).call(e, window, "resize", a);
});
}),
t(this, "media", () => {
const { player: e } = this,
{ elements: t } = e;
if (
(J.call(e, e.media, "timeupdate seeking seeked", (t) => Me.timeUpdate.call(e, t)),
J.call(e, e.media, "durationchange loadeddata loadedmetadata", (t) => Me.durationUpdate.call(e, t)),
J.call(e, e.media, "ended", () => {
e.isHTML5 && e.isVideo && e.config.resetOnEnd && (e.restart(), e.pause());
}),
J.call(e, e.media, "progress playing seeking seeked", (t) => Me.updateProgress.call(e, t)),
J.call(e, e.media, "volumechange", (t) => Me.updateVolume.call(e, t)),
J.call(e, e.media, "playing play pause ended emptied timeupdate", (t) => Ue.checkPlaying.call(e, t)),
J.call(e, e.media, "waiting canplay seeked playing", (t) => Ue.checkLoading.call(e, t)),
e.supported.ui && e.config.clickToPlay && !e.isAudio)
) {
const i = W.call(e, `.${e.config.classNames.video}`);
if (!A.element(i)) return;
J.call(e, t.container, "click", (s) => {
([t.container, i].includes(s.target) || i.contains(s.target)) &&
((e.touch && e.config.hideControls) ||
(e.ended
? (this.proxy(s, e.restart, "restart"),
this.proxy(
s,
() => {
se(e.play());
},
"play"
))
: this.proxy(
s,
() => {
se(e.togglePlay());
},
"play"
)));
});
}
e.supported.ui &&
e.config.disableContextMenu &&
J.call(
e,
t.wrapper,
"contextmenu",
(e) => {
e.preventDefault();
},
!1
),
J.call(e, e.media, "volumechange", () => {
e.storage.set({ volume: e.volume, muted: e.muted });
}),
J.call(e, e.media, "ratechange", () => {
Me.updateSetting.call(e, "speed"), e.storage.set({ speed: e.speed });
}),
J.call(e, e.media, "qualitychange", (t) => {
Me.updateSetting.call(e, "quality", null, t.detail.quality);
}),
J.call(e, e.media, "ready qualitychange", () => {
Me.setDownloadUrl.call(e);
});
const i = e.config.events.concat(["keyup", "keydown"]).join(" ");
J.call(e, e.media, i, (i) => {
let { detail: s = {} } = i;
"error" === i.type && (s = e.media.error), ee.call(e, t.container, i.type, !0, s);
});
}),
t(this, "proxy", (e, t, i) => {
const { player: s } = this,
n = s.config.listeners[i];
let a = !0;
A.function(n) && (a = n.call(s, e)), !1 !== a && A.function(t) && t.call(s, e);
}),
t(this, "bind", (e, t, i, s, n = !0) => {
const { player: a } = this,
r = a.config.listeners[s],
o = A.function(r);
J.call(a, e, t, (e) => this.proxy(e, i, s), n && !o);
}),
t(this, "controls", () => {
const { player: e } = this,
{ elements: t } = e,
i = x.isIE ? "change" : "input";
if (
(t.buttons.play &&
Array.from(t.buttons.play).forEach((t) => {
this.bind(
t,
"click",
() => {
se(e.togglePlay());
},
"play"
);
}),
this.bind(t.buttons.restart, "click", e.restart, "restart"),
this.bind(
t.buttons.rewind,
"click",
() => {
(e.lastSeekTime = Date.now()), e.rewind();
},
"rewind"
),
this.bind(
t.buttons.fastForward,
"click",
() => {
(e.lastSeekTime = Date.now()), e.forward();
},
"fastForward"
),
this.bind(
t.buttons.mute,
"click",
() => {
e.muted = !e.muted;
},
"mute"
),
this.bind(t.buttons.captions, "click", () => e.toggleCaptions()),
this.bind(
t.buttons.download,
"click",
() => {
ee.call(e, e.media, "download");
},
"download"
),
this.bind(
t.buttons.fullscreen,
"click",
() => {
e.fullscreen.toggle();
},
"fullscreen"
),
this.bind(
t.buttons.pip,
"click",
() => {
e.pip = "toggle";
},
"pip"
),
this.bind(t.buttons.airplay, "click", e.airplay, "airplay"),
this.bind(
t.buttons.settings,
"click",
(t) => {
t.stopPropagation(), t.preventDefault(), Me.toggleMenu.call(e, t);
},
null,
!1
),
this.bind(
t.buttons.settings,
"keyup",
(t) => {
[" ", "Enter"].includes(t.key) && ("Enter" !== t.key ? (t.preventDefault(), t.stopPropagation(), Me.toggleMenu.call(e, t)) : Me.focusFirstMenuItem.call(e, null, !0));
},
null,
!1
),
this.bind(t.settings.menu, "keydown", (t) => {
"Escape" === t.key && Me.toggleMenu.call(e, t);
}),
this.bind(t.inputs.seek, "mousedown mousemove", (e) => {
const i = t.progress.getBoundingClientRect(),
s = (100 / i.width) * (e.pageX - i.left);
e.currentTarget.setAttribute("seek-value", s);
}),
this.bind(t.inputs.seek, "mousedown mouseup keydown keyup touchstart touchend", (t) => {
const i = t.currentTarget,
s = "play-on-seeked";
if (A.keyboardEvent(t) && !["ArrowLeft", "ArrowRight"].includes(t.key)) return;
e.lastSeekTime = Date.now();
const n = i.hasAttribute(s),
a = ["mouseup", "touchend", "keyup"].includes(t.type);
n && a ? (i.removeAttribute(s), se(e.play())) : !a && e.playing && (i.setAttribute(s, ""), e.pause());
}),
x.isIos)
) {
const t = B.call(e, 'input[type="range"]');
Array.from(t).forEach((e) => this.bind(e, i, (e) => M(e.target)));
}
this.bind(
t.inputs.seek,
i,
(t) => {
const i = t.currentTarget;
let s = i.getAttribute("seek-value");
A.empty(s) && (s = i.value), i.removeAttribute("seek-value"), (e.currentTime = (s / i.max) * e.duration);
},
"seek"
),
this.bind(t.progress, "mouseenter mouseleave mousemove", (t) => Me.updateSeekTooltip.call(e, t)),
this.bind(t.progress, "mousemove touchmove", (t) => {
const { posterThumbnails: i } = e;
i && i.loaded && i.startMove(t);
}),
this.bind(t.progress, "mouseleave touchend click", () => {
const { posterThumbnails: t } = e;
t && t.loaded && t.endMove(!1, !0);
}),
this.bind(t.progress, "mousedown touchstart", (t) => {
const { posterThumbnails: i } = e;
i && i.loaded && i.startScrubbing(t);
}),
this.bind(t.progress, "mouseup touchend", (t) => {
const { posterThumbnails: i } = e;
i && i.loaded && i.endScrubbing(t);
}),
x.isWebKit &&
Array.from(B.call(e, 'input[type="range"]')).forEach((t) => {
this.bind(t, "input", (t) => Me.updateRangeFill.call(e, t.target));
}),
e.config.toggleInvert &&
!A.element(t.display.duration) &&
this.bind(t.display.currentTime, "click", () => {
0 !== e.currentTime && ((e.config.invertTime = !e.config.invertTime), Me.timeUpdate.call(e));
}),
this.bind(
t.inputs.volume,
i,
(t) => {
e.volume = t.target.value;
},
"volume"
),
this.bind(t.controls, "mouseenter mouseleave", (i) => {
t.controls.hover = !e.touch && "mouseenter" === i.type;
}),
t.fullscreen &&
Array.from(t.fullscreen.children)
.filter((e) => !e.contains(t.container))
.forEach((i) => {
this.bind(i, "mouseenter mouseleave", (i) => {
t.controls && (t.controls.hover = !e.touch && "mouseenter" === i.type);
});
}),
this.bind(t.controls, "mousedown mouseup touchstart touchend touchcancel", (e) => {
t.controls.pressed = ["mousedown", "touchstart"].includes(e.type);
}),
this.bind(t.controls, "focusin", () => {
const { config: i, timers: s } = e;
F(t.controls, i.classNames.noTransition, !0),
Ue.toggleControls.call(e, !0),
setTimeout(() => {
F(t.controls, i.classNames.noTransition, !1);
}, 0);
const n = this.touch ? 3e3 : 4e3;
clearTimeout(s.controls), (s.controls = setTimeout(() => Ue.toggleControls.call(e, !1), n));
}),
this.bind(
t.inputs.volume,
"wheel",
(t) => {
const i = t.webkitDirectionInvertedFromDevice,
[s, n] = [t.deltaX, -t.deltaY].map((e) => (i ? -e : e)),
a = Math.sign(Math.abs(s) > Math.abs(n) ? s : n);
e.increaseVolume(a / 50);
const { volume: r } = e.media;
((1 === a && r < 1) || (-1 === a && r > 0)) && t.preventDefault();
},
"volume",
!1
);
}),
(this.player = e),
(this.lastKey = null),
(this.focusTimer = null),
(this.lastKeyDown = null),
(this.handleKey = this.handleKey.bind(this)),
(this.toggleMenu = this.toggleMenu.bind(this)),
(this.firstTouch = this.firstTouch.bind(this));
}
handleKey(e) {
const { player: t } = this,
{ elements: i } = t,
{ key: s, type: n, altKey: a, ctrlKey: r, metaKey: o, shiftKey: l } = e,
c = "keydown" === n,
u = c && s === this.lastKey;
if (a || r || o || l) return;
if (!s) return;
if (c) {
const n = document.activeElement;
if (A.element(n)) {
const { editable: s } = t.config.selectors,
{ seek: a } = i.inputs;
if (n !== a && V(n, s)) return;
if (" " === e.key && V(n, 'button, [role^="menuitem"]')) return;
}
switch (([" ", "ArrowLeft", "ArrowUp", "ArrowRight", "ArrowDown", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "c", "f", "k", "l", "m"].includes(s) && (e.preventDefault(), e.stopPropagation()), s)) {
case "0":
case "1":
case "2":
case "3":
case "4":
case "5":
case "6":
case "7":
case "8":
case "9":
u || ((h = parseInt(s, 10)), (t.currentTime = (t.duration / 10) * h));
break;
case " ":
case "k":
u || se(t.togglePlay());
break;
case "ArrowUp":
t.increaseVolume(0.1);
break;
case "ArrowDown":
t.decreaseVolume(0.1);
break;
case "m":
u || (t.muted = !t.muted);
break;
case "ArrowRight":
t.forward();
break;
case "ArrowLeft":
t.rewind();
break;
case "f":
t.fullscreen.toggle();
break;
case "c":
u || t.toggleCaptions();
break;
case "l":
t.loop = !t.loop;
}
"Escape" === s && !t.fullscreen.usingNative && t.fullscreen.active && t.fullscreen.toggle(), (this.lastKey = s);
} else this.lastKey = null;
var h;
}
toggleMenu(e) {
Me.toggleMenu.call(this.player, e);
}
}
var Be = (function (e, t) {
return e((t = { exports: {} }), t.exports), t.exports;
})(function (e, t) {
e.exports = (function () {
var e = function () { },
t = {},
i = {},
s = {};
function n(e, t) {
e = e.push ? e : [e];
var n,
a,
r,
o = [],
l = e.length,
c = l;
for (
n = function (e, i) {
i.length && o.push(e), --c || t(o);
};
l--;
)
(a = e[l]), (r = i[a]) ? n(a, r) : (s[a] = s[a] || []).push(n);
}
function a(e, t) {
if (e) {
var n = s[e];
if (((i[e] = t), n)) for (; n.length;) n[0](e, t), n.splice(0, 1);
}
}
function r(t, i) {
t.call && (t = { success: t }), i.length ? (t.error || e)(i) : (t.success || e)(t);
}
function o(t, i, s, n) {
var a,
r,
l = document,
c = s.async,
u = (s.numRetries || 0) + 1,
h = s.before || e,
d = t.replace(/[\?|#].*$/, ""),
m = t.replace(/^(css|img)!/, "");
(n = n || 0),
/(^css!|\.css$)/.test(d)
? (((r = l.createElement("link")).rel = "stylesheet"), (r.href = m), (a = "hideFocus" in r) && r.relList && ((a = 0), (r.rel = "preload"), (r.as = "style")))
: /(^img!|\.(png|gif|jpg|svg|webp)$)/.test(d)
? ((r = l.createElement("img")).src = m)
: (((r = l.createElement("script")).src = t), (r.async = void 0 === c || c)),
(r.onload = r.onerror = r.onbeforeload = function (e) {
var l = e.type[0];
if (a)
try {
r.sheet.cssText.length || (l = "e");
} catch (e) {
18 != e.code && (l = "e");
}
if ("e" == l) {
if ((n += 1) < u) return o(t, i, s, n);
} else if ("preload" == r.rel && "style" == r.as) return (r.rel = "stylesheet");
i(t, l, e.defaultPrevented);
}),
!1 !== h(t, r) && l.head.appendChild(r);
}
function l(e, t, i) {
var s,
n,
a = (e = e.push ? e : [e]).length,
r = a,
l = [];
for (
s = function (e, i, s) {
if (("e" == i && l.push(e), "b" == i)) {
if (!s) return;
l.push(e);
}
--a || t(l);
},
n = 0;
n < r;
n++
)
o(e[n], s, i);
}
function c(e, i, s) {
var n, o;
if ((i && i.trim && (n = i), (o = (n ? s : i) || {}), n)) {
if (n in t) throw "LoadJS";
t[n] = !0;
}
function c(t, i) {
l(
e,
function (e) {
r(o, e), t && r({ success: t, error: i }, e), a(n, e);
},
o
);
}
if (o.returnPromise) return new Promise(c);
c();
}
return (
(c.ready = function (e, t) {
return (
n(e, function (e) {
r(t, e);
}),
c
);
}),
(c.done = function (e) {
a(e, []);
}),
(c.reset = function () {
(t = {}), (i = {}), (s = {});
}),
(c.isDefined = function (e) {
return e in t;
}),
c
);
})();
});
function We(e) {
return new Promise((t, i) => {
Be(e, { success: t, error: i });
});
}
function ze(e) {
e && !this.embed.hasPlayed && (this.embed.hasPlayed = !0), this.media.paused === e && ((this.media.paused = !e), ee.call(this, this.media, e ? "play" : "pause"));
}
const Ke = {
setup() {
const e = this;
F(e.elements.wrapper, e.config.classNames.embed, !0),
(e.options.speed = e.config.speed.options),
he.call(e),
A.object(window.Vimeo)
? Ke.ready.call(e)
: We(e.config.urls.vimeo.sdk)
.then(() => {
Ke.ready.call(e);
})
.catch((t) => {
e.debug.warn("Vimeo SDK (player.js) failed to load", t);
});
},
ready() {
const e = this,
t = e.config.vimeo,
{ premium: i, referrerPolicy: s, ...n } = t;
let a = e.media.getAttribute("src"),
r = "";
A.empty(a)
? ((a = e.media.getAttribute(e.config.attributes.embed.id)), (r = e.media.getAttribute(e.config.attributes.embed.hash)))
: (r = (function (e) {
const t = e.match(/^.*(vimeo.com\/|video\/)(\d+)(\?.*&*h=|\/)+([\d,a-f]+)/);
return t && 5 === t.length ? t[4] : null;
})(a));
const o = r ? { h: r } : {};
i && Object.assign(n, { controls: !1, sidedock: !1 });
const l = Le({ loop: e.config.loop.active, autoplay: e.autoplay, muted: e.muted, gesture: "media", playsinline: e.config.playsinline, ...o, ...n }),
c = ((u = a), A.empty(u) ? null : A.number(Number(u)) ? u : u.match(/^.*(vimeo.com\/|video\/)(\d+).*/) ? RegExp.$2 : u);
var u;
const h = O("iframe"),
d = pe(e.config.urls.vimeo.iframe, c, l);
if (
(h.setAttribute("src", d),
h.setAttribute("allowfullscreen", ""),
h.setAttribute("allow", ["autoplay", "fullscreen", "picture-in-picture", "encrypted-media", "accelerometer", "gyroscope"].join("; ")),
A.empty(s) || h.setAttribute("referrerPolicy", s),
i || !t.customControls)
)
h.setAttribute("data-poster", e.poster), (e.media = D(h, e.media));
else {
const t = O("div", { class: e.config.classNames.embedContainer, "data-poster": e.poster });
t.appendChild(h), (e.media = D(t, e.media));
}
t.customControls ||
ke(pe(e.config.urls.vimeo.api, d)).then((t) => {
!A.empty(t) && t.thumbnail_url && Ue.setPoster.call(e, t.thumbnail_url).catch(() => { });
}),
(e.embed = new window.Vimeo.Player(h, { autopause: e.config.autopause, muted: e.muted })),
(e.media.paused = !0),
(e.media.currentTime = 0),
e.supported.ui && e.embed.disableTextTrack(),
(e.media.play = () => (ze.call(e, !0), e.embed.play())),
(e.media.pause = () => (ze.call(e, !1), e.embed.pause())),
(e.media.stop = () => {
e.pause(), (e.currentTime = 0);
});
let { currentTime: m } = e.media;
Object.defineProperty(e.media, "currentTime", {
get: () => m,
set(t) {
const { embed: i, media: s, paused: n, volume: a } = e,
r = n && !i.hasPlayed;
(s.seeking = !0),
ee.call(e, s, "seeking"),
Promise.resolve(r && i.setVolume(0))
.then(() => i.setCurrentTime(t))
.then(() => r && i.pause())
.then(() => r && i.setVolume(a))
.catch(() => { });
},
});
let p = e.config.speed.selected;
Object.defineProperty(e.media, "playbackRate", {
get: () => p,
set(t) {
e.embed
.setPlaybackRate(t)
.then(() => {
(p = t), ee.call(e, e.media, "ratechange");
})
.catch(() => {
e.options.speed = [1];
});
},
});
let { volume: g } = e.config;
Object.defineProperty(e.media, "volume", {
get: () => g,
set(t) {
e.embed.setVolume(t).then(() => {
(g = t), ee.call(e, e.media, "volumechange");
});
},
});
let { muted: f } = e.config;
Object.defineProperty(e.media, "muted", {
get: () => f,
set(t) {
const i = !!A.boolean(t) && t;
e.embed.setMuted(!!i || e.config.muted).then(() => {
(f = i), ee.call(e, e.media, "volumechange");
});
},
});
let y,
{ loop: b } = e.config;
Object.defineProperty(e.media, "loop", {
get: () => b,
set(t) {
const i = A.boolean(t) ? t : e.config.loop.active;
e.embed.setLoop(i).then(() => {
b = i;
});
},
}),
e.embed
.getVideoUrl()
.then((t) => {
(y = t), Me.setDownloadUrl.call(e);
})
.catch((e) => {
this.debug.warn(e);
}),
Object.defineProperty(e.media, "currentSrc", { get: () => y }),
Object.defineProperty(e.media, "ended", { get: () => e.currentTime === e.duration }),
Promise.all([e.embed.getVideoWidth(), e.embed.getVideoHeight()]).then((t) => {
const [i, s] = t;
(e.embed.ratio = de(i, s)), he.call(this);
}),
e.embed.setAutopause(e.config.autopause).then((t) => {
e.config.autopause = t;
}),
e.embed.getVideoTitle().then((t) => {
(e.config.title = t), Ue.setTitle.call(this);
}),
e.embed.getCurrentTime().then((t) => {
(m = t), ee.call(e, e.media, "timeupdate");
}),
e.embed.getDuration().then((t) => {
(e.media.duration = t), ee.call(e, e.media, "durationchange");
}),
e.embed.getTextTracks().then((t) => {
(e.media.textTracks = t), Ne.setup.call(e);
}),
e.embed.on("cuechange", ({ cues: t = [] }) => {
const i = t.map((e) =>
(function (e) {
const t = document.createDocumentFragment(),
i = document.createElement("div");
return t.appendChild(i), (i.innerHTML = e), t.firstChild.innerText;
})(e.text)
);
Ne.updateCues.call(e, i);
}),
e.embed.on("loaded", () => {
if (
(e.embed.getPaused().then((t) => {
ze.call(e, !t), t || ee.call(e, e.media, "playing");
}),
A.element(e.embed.element) && e.supported.ui)
) {
e.embed.element.setAttribute("tabindex", -1);
}
}),
e.embed.on("bufferstart", () => {
ee.call(e, e.media, "waiting");
}),
e.embed.on("bufferend", () => {
ee.call(e, e.media, "playing");
}),
e.embed.on("play", () => {
ze.call(e, !0), ee.call(e, e.media, "playing");
}),
e.embed.on("pause", () => {
ze.call(e, !1);
}),
e.embed.on("timeupdate", (t) => {
(e.media.seeking = !1), (m = t.seconds), ee.call(e, e.media, "timeupdate");
}),
e.embed.on("progress", (t) => {
(e.media.buffered = t.percent),
ee.call(e, e.media, "progress"),
1 === parseInt(t.percent, 10) && ee.call(e, e.media, "canplaythrough"),
e.embed.getDuration().then((t) => {
t !== e.media.duration && ((e.media.duration = t), ee.call(e, e.media, "durationchange"));
});
}),
e.embed.on("seeked", () => {
(e.media.seeking = !1), ee.call(e, e.media, "seeked");
}),
e.embed.on("ended", () => {
(e.media.paused = !0), ee.call(e, e.media, "ended");
}),
e.embed.on("error", (t) => {
(e.media.error = t), ee.call(e, e.media, "error");
}),
t.customControls && setTimeout(() => Ue.build.call(e), 0);
},
};
function Ye(e) {
e && !this.embed.hasPlayed && (this.embed.hasPlayed = !0), this.media.paused === e && ((this.media.paused = !e), ee.call(this, this.media, e ? "play" : "pause"));
}
function Qe(e) {
return e.noCookie ? "https://www.youtube-nocookie.com" : "http:" === window.location.protocol ? "http://www.youtube.com" : void 0;
}
const Xe = {
setup() {
if ((F(this.elements.wrapper, this.config.classNames.embed, !0), A.object(window.YT) && A.function(window.YT.Player))) Xe.ready.call(this);
else {
const e = window.onYouTubeIframeAPIReady;
(window.onYouTubeIframeAPIReady = () => {
A.function(e) && e(), Xe.ready.call(this);
}),
We(this.config.urls.youtube.sdk).catch((e) => {
this.debug.warn("YouTube API failed to load", e);
});
}
},
getTitle(e) {
ke(pe(this.config.urls.youtube.api, e))
.then((e) => {
if (A.object(e)) {
const { title: t, height: i, width: s } = e;
(this.config.title = t), Ue.setTitle.call(this), (this.embed.ratio = de(s, i));
}
he.call(this);
})
.catch(() => {
he.call(this);
});
},
ready() {
const e = this,
t = e.config.youtube,
i = e.media && e.media.getAttribute("id");
if (!A.empty(i) && i.startsWith("youtube-")) return;
let s = e.media.getAttribute("src");
A.empty(s) && (s = e.media.getAttribute(this.config.attributes.embed.id));
const n = ((a = s), A.empty(a) ? null : a.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/) ? RegExp.$2 : a);
var a;
const r = O("div", { id: `${e.provider}-${Math.floor(1e4 * Math.random())}`, "data-poster": t.customControls ? e.poster : void 0 });
if (((e.media = D(r, e.media)), t.customControls)) {
const t = (e) => `https://i.ytimg.com/vi/${n}/${e}default.jpg`;
Fe(t("maxres"), 121)
.catch(() => Fe(t("sd"), 121))
.catch(() => Fe(t("hq")))
.then((t) => Ue.setPoster.call(e, t.src))
.then((t) => {
t.includes("maxres") || (e.elements.poster.style.backgroundSize = "cover");
})
.catch(() => { });
}
e.embed = new window.YT.Player(e.media, {
videoId: n,
host: Qe(t),
playerVars: N(
{},
{
autoplay: e.config.autoplay ? 1 : 0,
hl: e.config.hl,
controls: e.supported.ui && t.customControls ? 0 : 1,
disablekb: 1,
playsinline: e.config.playsinline && !e.config.fullscreen.iosNative ? 1 : 0,
cc_load_policy: e.captions.active ? 1 : 0,
cc_lang_pref: e.config.captions.language,
widget_referrer: window ? window.location.href : null,
},
t
),
events: {
onError(t) {
if (!e.media.error) {
const i = t.data,
s =
{
2: "The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",
5: "The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",
100: "The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",
101: "The owner of the requested video does not allow it to be played in embedded players.",
150: "The owner of the requested video does not allow it to be played in embedded players.",
}[i] || "An unknown error occurred";
(e.media.error = { code: i, message: s }), ee.call(e, e.media, "error");
}
},
onPlaybackRateChange(t) {
const i = t.target;
(e.media.playbackRate = i.getPlaybackRate()), ee.call(e, e.media, "ratechange");
},
onReady(i) {
if (A.function(e.media.play)) return;
const s = i.target;
Xe.getTitle.call(e, n),
(e.media.play = () => {
Ye.call(e, !0), s.playVideo();
}),
(e.media.pause = () => {
Ye.call(e, !1), s.pauseVideo();
}),
(e.media.stop = () => {
s.stopVideo();
}),
(e.media.duration = s.getDuration()),
(e.media.paused = !0),
(e.media.currentTime = 0),
Object.defineProperty(e.media, "currentTime", {
get: () => Number(s.getCurrentTime()),
set(t) {
e.paused && !e.embed.hasPlayed && e.embed.mute(), (e.media.seeking = !0), ee.call(e, e.media, "seeking"), s.seekTo(t);
},
}),
Object.defineProperty(e.media, "playbackRate", {
get: () => s.getPlaybackRate(),
set(e) {
s.setPlaybackRate(e);
},
});
let { volume: a } = e.config;
Object.defineProperty(e.media, "volume", {
get: () => a,
set(t) {
(a = t), s.setVolume(100 * a), ee.call(e, e.media, "volumechange");
},
});
let { muted: r } = e.config;
Object.defineProperty(e.media, "muted", {
get: () => r,
set(t) {
const i = A.boolean(t) ? t : r;
(r = i), s[i ? "mute" : "unMute"](), s.setVolume(100 * a), ee.call(e, e.media, "volumechange");
},
}),
Object.defineProperty(e.media, "currentSrc", { get: () => s.getVideoUrl() }),
Object.defineProperty(e.media, "ended", { get: () => e.currentTime === e.duration });
const o = s.getAvailablePlaybackRates();
(e.options.speed = o.filter((t) => e.config.speed.options.includes(t))),
e.supported.ui && t.customControls && e.media.setAttribute("tabindex", -1),
ee.call(e, e.media, "timeupdate"),
ee.call(e, e.media, "durationchange"),
clearInterval(e.timers.buffering),
(e.timers.buffering = setInterval(() => {
(e.media.buffered = s.getVideoLoadedFraction()),
(null === e.media.lastBuffered || e.media.lastBuffered < e.media.buffered) && ee.call(e, e.media, "progress"),
(e.media.lastBuffered = e.media.buffered),
1 === e.media.buffered && (clearInterval(e.timers.buffering), ee.call(e, e.media, "canplaythrough"));
}, 200)),
t.customControls && setTimeout(() => Ue.build.call(e), 50);
},
onStateChange(i) {
const s = i.target;
clearInterval(e.timers.playing);
switch ((e.media.seeking && [1, 2].includes(i.data) && ((e.media.seeking = !1), ee.call(e, e.media, "seeked")), i.data)) {
case -1:
ee.call(e, e.media, "timeupdate"), (e.media.buffered = s.getVideoLoadedFraction()), ee.call(e, e.media, "progress");
break;
case 0:
Ye.call(e, !1), e.media.loop ? (s.stopVideo(), s.playVideo()) : ee.call(e, e.media, "ended");
break;
case 1:
t.customControls && !e.config.autoplay && e.media.paused && !e.embed.hasPlayed
? e.media.pause()
: (Ye.call(e, !0),
ee.call(e, e.media, "playing"),
(e.timers.playing = setInterval(() => {
ee.call(e, e.media, "timeupdate");
}, 50)),
e.media.duration !== s.getDuration() && ((e.media.duration = s.getDuration()), ee.call(e, e.media, "durationchange")));
break;
case 2:
e.muted || e.embed.unMute(), Ye.call(e, !1);
break;
case 3:
ee.call(e, e.media, "waiting");
}
ee.call(e, e.elements.container, "statechange", !1, { code: i.data });
},
},
});
},
},
Je = {
setup() {
this.media
? (F(this.elements.container, this.config.classNames.type.replace("{0}", this.type), !0),
F(this.elements.container, this.config.classNames.provider.replace("{0}", this.provider), !0),
this.isEmbed && F(this.elements.container, this.config.classNames.type.replace("{0}", "video"), !0),
this.isVideo &&
((this.elements.wrapper = O("div", { class: this.config.classNames.video })),
_(this.media, this.elements.wrapper),
(this.elements.poster = O("div", { class: this.config.classNames.poster })),
this.elements.wrapper.appendChild(this.elements.poster)),
this.isHTML5 ? me.setup.call(this) : this.isYouTube ? Xe.setup.call(this) : this.isVimeo && Ke.setup.call(this))
: this.debug.warn("No media element found!");
},
};
class Ge {
constructor(e) {
t(this, "load", () => {
this.enabled &&
(A.object(window.google) && A.object(window.google.ima)
? this.ready()
: We(this.player.config.urls.googleIMA.sdk)
.then(() => {
this.ready();
})
.catch(() => {
this.trigger("error", new Error("Google IMA SDK failed to load"));
}));
}),
t(this, "ready", () => {
var e;
this.enabled || ((e = this).manager && e.manager.destroy(), e.elements.displayContainer && e.elements.displayContainer.destroy(), e.elements.container.remove()),
this.startSafetyTimer(12e3, "ready()"),
this.managerPromise.then(() => {
this.clearSafetyTimer("onAdsManagerLoaded()");
}),
this.listeners(),
this.setupIMA();
}),
t(this, "setupIMA", () => {
(this.elements.container = O("div", { class: this.player.config.classNames.ads })),
this.player.elements.container.appendChild(this.elements.container),
google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),
google.ima.settings.setLocale(this.player.config.ads.language),
google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),
(this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media)),
(this.loader = new google.ima.AdsLoader(this.elements.displayContainer)),
this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, (e) => this.onAdsManagerLoaded(e), !1),
this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, (e) => this.onAdError(e), !1),
this.requestAds();
}),
t(this, "requestAds", () => {
const { container: e } = this.player.elements;
try {
const t = new google.ima.AdsRequest();
(t.adTagUrl = this.tagUrl),
(t.linearAdSlotWidth = e.offsetWidth),
(t.linearAdSlotHeight = e.offsetHeight),
(t.nonLinearAdSlotWidth = e.offsetWidth),
(t.nonLinearAdSlotHeight = e.offsetHeight),
(t.forceNonLinearFullSlot = !1),
t.setAdWillPlayMuted(!this.player.muted),
this.loader.requestAds(t);
} catch (e) {
this.onAdError(e);
}
}),
t(this, "pollCountdown", (e = !1) => {
if (!e) return clearInterval(this.countdownTimer), void this.elements.container.removeAttribute("data-badge-text");
this.countdownTimer = setInterval(() => {
const e = Pe(Math.max(this.manager.getRemainingTime(), 0)),
t = `${we.get("advertisement", this.player.config)} - ${e}`;
this.elements.container.setAttribute("data-badge-text", t);
}, 100);
}),
t(this, "onAdsManagerLoaded", (e) => {
if (!this.enabled) return;
const t = new google.ima.AdsRenderingSettings();
(t.restoreCustomPlaybackStateOnAdBreakComplete = !0),
(t.enablePreloading = !0),
(this.manager = e.getAdsManager(this.player, t)),
(this.cuePoints = this.manager.getCuePoints()),
this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, (e) => this.onAdError(e)),
Object.keys(google.ima.AdEvent.Type).forEach((e) => {
this.manager.addEventListener(google.ima.AdEvent.Type[e], (e) => this.onAdEvent(e));
}),
this.trigger("loaded");
}),
t(this, "addCuePoints", () => {
A.empty(this.cuePoints) ||
this.cuePoints.forEach((e) => {
if (0 !== e && -1 !== e && e < this.player.duration) {
const t = this.player.elements.progress;
if (A.element(t)) {
const i = (100 / this.player.duration) * e,
s = O("span", { class: this.player.config.classNames.cues });
(s.style.left = `${i.toString()}%`), t.appendChild(s);
}
}
});
}),
t(this, "onAdEvent", (e) => {
const { container: t } = this.player.elements,
i = e.getAd(),
s = e.getAdData();
switch (
(((e) => {
ee.call(this.player, this.player.media, `ads${e.replace(/_/g, "").toLowerCase()}`);
})(e.type),
e.type)
) {
case google.ima.AdEvent.Type.LOADED:
this.trigger("loaded"), this.pollCountdown(!0), i.isLinear() || ((i.width = t.offsetWidth), (i.height = t.offsetHeight));
break;
case google.ima.AdEvent.Type.STARTED:
this.manager.setVolume(this.player.volume);
break;
case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
this.player.ended ? this.loadAds() : this.loader.contentComplete();
break;
case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
this.pauseContent();
break;
case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
this.pollCountdown(), this.resumeContent();
break;
case google.ima.AdEvent.Type.LOG:
s.adError && this.player.debug.warn(`Non-fatal ad error: ${s.adError.getMessage()}`);
}
}),
t(this, "onAdError", (e) => {
this.cancel(), this.player.debug.warn("Ads error", e);
}),
t(this, "listeners", () => {
const { container: e } = this.player.elements;
let t;
this.player.on("canplay", () => {
this.addCuePoints();
}),
this.player.on("ended", () => {
this.loader.contentComplete();
}),
this.player.on("timeupdate", () => {
t = this.player.currentTime;
}),
this.player.on("seeked", () => {
const e = this.player.currentTime;
A.empty(this.cuePoints) ||
this.cuePoints.forEach((i, s) => {
t < i && i < e && (this.manager.discardAdBreak(), this.cuePoints.splice(s, 1));
});
}),
window.addEventListener("resize", () => {
this.manager && this.manager.resize(e.offsetWidth, e.offsetHeight, google.ima.ViewMode.NORMAL);
});
}),
t(this, "play", () => {
const { container: e } = this.player.elements;
this.managerPromise || this.resumeContent(),
this.managerPromise
.then(() => {
this.manager.setVolume(this.player.volume), this.elements.displayContainer.initialize();
try {
this.initialized || (this.manager.init(e.offsetWidth, e.offsetHeight, google.ima.ViewMode.NORMAL), this.manager.start()), (this.initialized = !0);
} catch (e) {
this.onAdError(e);
}
})
.catch(() => { });
}),
t(this, "resumeContent", () => {
(this.elements.container.style.zIndex = ""), (this.playing = !1), se(this.player.media.play());
}),
t(this, "pauseContent", () => {
(this.elements.container.style.zIndex = 3), (this.playing = !0), this.player.media.pause();
}),
t(this, "cancel", () => {
this.initialized && this.resumeContent(), this.trigger("error"), this.loadAds();
}),
t(this, "loadAds", () => {
this.managerPromise
.then(() => {
this.manager && this.manager.destroy(),
(this.managerPromise = new Promise((e) => {
this.on("loaded", e), this.player.debug.log(this.manager);
})),
(this.initialized = !1),
this.requestAds();
})
.catch(() => { });
}),
t(this, "trigger", (e, ...t) => {
const i = this.events[e];
A.array(i) &&
i.forEach((e) => {
A.function(e) && e.apply(this, t);
});
}),
t(this, "on", (e, t) => (A.array(this.events[e]) || (this.events[e] = []), this.events[e].push(t), this)),
t(this, "startSafetyTimer", (e, t) => {
this.player.debug.log(`Safety timer invoked from: ${t}`),
(this.safetyTimer = setTimeout(() => {
this.cancel(), this.clearSafetyTimer("startSafetyTimer()");
}, e));
}),
t(this, "clearSafetyTimer", (e) => {
A.nullOrUndefined(this.safetyTimer) || (this.player.debug.log(`Safety timer cleared from: ${e}`), clearTimeout(this.safetyTimer), (this.safetyTimer = null));
}),
(this.player = e),
(this.config = e.config.ads),
(this.playing = !1),
(this.initialized = !1),
(this.elements = { container: null, displayContainer: null }),
(this.manager = null),
(this.loader = null),
(this.cuePoints = null),
(this.events = {}),
(this.safetyTimer = null),
(this.countdownTimer = null),
(this.managerPromise = new Promise((e, t) => {
this.on("loaded", e), this.on("error", t);
})),
this.load();
}
get enabled() {
const { config: e } = this;
return this.player.isHTML5 && this.player.isVideo && e.enabled && (!A.empty(e.publisherId) || A.url(e.tagUrl));
}
get tagUrl() {
const { config: e } = this;
if (A.url(e.tagUrl)) return e.tagUrl;
return `https://go.aniview.com/api/adserver6/vast/?${Le({
AV_PUBLISHERID: "58c25bb0073ef448b1087ad6",
AV_CHANNELID: "5a0458dc28a06145e4519d21",
AV_URL: window.location.hostname,
cb: Date.now(),
AV_WIDTH: 640,
AV_HEIGHT: 480,
AV_CDIM2: e.publisherId,
})}`;
}
}
function Ze(e = 0, t = 0, i = 255) {
return Math.min(Math.max(e, t), i);
}
const et = (e) => {
const t = [];
return (
e.split(/\r\n\r\n|\n\n|\r\r/).forEach((e) => {
const i = {};
e.split(/\r\n|\n|\r/).forEach((e) => {
if (A.number(i.startTime)) {
if (!A.empty(e.trim()) && A.empty(i.text)) {
const t = e.trim().split("#xywh=");
([i.text] = t), t[1] && ([i.x, i.y, i.w, i.h] = t[1].split(","));
}
} else {
const t = e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);
t && ((i.startTime = 60 * Number(t[1] || 0) * 60 + 60 * Number(t[2]) + Number(t[3]) + Number(`0.${t[4]}`)), (i.endTime = 60 * Number(t[6] || 0) * 60 + 60 * Number(t[7]) + Number(t[8]) + Number(`0.${t[9]}`)));
}
}),
i.text && t.push(i);
}),
t
);
},
tt = (e, t) => {
const i = {};
return e > t.width / t.height ? ((i.width = t.width), (i.height = (1 / e) * t.width)) : ((i.height = t.height), (i.width = e * t.height)), i;
};
class it {
constructor(e) {
t(this, "load", () => {
this.player.elements.display.seekTooltip && (this.player.elements.display.seekTooltip.hidden = this.enabled),
this.enabled &&
this.getThumbnails().then(() => {
this.enabled && (this.render(), this.determineContainerAutoSizing(), this.listeners(), (this.loaded = !0));
});
}),
t(
this,
"getThumbnails",
() =>
new Promise((e) => {
const { src: t } = this.player.config.posterThumbnails;
if (A.empty(t)) throw new Error("Missing posterThumbnails.src config attribute");
const i = () => {
this.thumbnails.sort((e, t) => e.height - t.height), this.player.debug.log("Preview thumbnails", this.thumbnails), e();
};
if (A.function(t))
t((e) => {
(this.thumbnails = e), i();
});
else {
const e = (A.string(t) ? [t] : t).map((e) => this.getThumbnail(e));
Promise.all(e).then(i);
}
})
),
t(
this,
"getThumbnail",
(e) =>
new Promise((t) => {
ke(e).then((i) => {
const s = { frames: et(i), height: null, urlPrefix: "" };
s.frames[0].text.startsWith("/") || s.frames[0].text.startsWith("http://") || s.frames[0].text.startsWith("https://") || (s.urlPrefix = e.substring(0, e.lastIndexOf("/") + 1));
const n = new Image();
(n.onload = () => {
(s.height = n.naturalHeight), (s.width = n.naturalWidth), this.thumbnails.push(s), t();
}),
(n.src = s.urlPrefix + s.frames[0].text);
});
})
),
t(this, "startMove", (e) => {
if (this.loaded && A.event(e) && ["touchmove", "mousemove"].includes(e.type) && this.player.media.duration) {
if ("touchmove" === e.type) this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);
else {
var t, i;
const s = this.player.elements.progress.getBoundingClientRect(),
n = (100 / s.width) * (e.pageX - s.left);
(this.seekTime = this.player.media.duration * (n / 100)),
this.seekTime < 0 && (this.seekTime = 0),
this.seekTime > this.player.media.duration - 1 && (this.seekTime = this.player.media.duration - 1),
(this.mousePosX = e.pageX),
(this.elements.thumb.time.innerText = Pe(this.seekTime));
const a = null === (t = this.player.config.markers) || void 0 === t || null === (i = t.points) || void 0 === i ? void 0 : i.find(({ time: e }) => e === Math.round(this.seekTime));
a && this.elements.thumb.time.insertAdjacentHTML("afterbegin", `${a.label}<br>`);
}
this.showImageAtCurrentTime();
}
}),
t(this, "endMove", () => {
this.toggleThumbContainer(!1, !0);
}),
t(this, "startScrubbing", (e) => {
(A.nullOrUndefined(e.button) || !1 === e.button || 0 === e.button) &&
((this.mouseDown = !0), this.player.media.duration && (this.toggleScrubbingContainer(!0), this.toggleThumbContainer(!1, !0), this.showImageAtCurrentTime()));
}),
t(this, "endScrubbing", () => {
(this.mouseDown = !1),
Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)
? this.toggleScrubbingContainer(!1)
: Z.call(this.player, this.player.media, "timeupdate", () => {
this.mouseDown || this.toggleScrubbingContainer(!1);
});
}),
t(this, "listeners", () => {
this.player.on("play", () => {
this.toggleThumbContainer(!1, !0);
}),
this.player.on("seeked", () => {
this.toggleThumbContainer(!1);
}),
this.player.on("timeupdate", () => {
this.lastTime = this.player.media.currentTime;
});
}),
t(this, "render", () => {
(this.elements.thumb.container = O("div", { class: this.player.config.classNames.posterThumbnails.thumbContainer })),
(this.elements.thumb.imageContainer = O("div", { class: this.player.config.classNames.posterThumbnails.imageContainer })),
this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);
const e = O("div", { class: this.player.config.classNames.posterThumbnails.timeContainer });
(this.elements.thumb.time = O("span", {}, "00:00")),
e.appendChild(this.elements.thumb.time),
this.elements.thumb.imageContainer.appendChild(e),
A.element(this.player.elements.progress) && this.player.elements.progress.appendChild(this.elements.thumb.container),
(this.elements.scrubbing.container = O("div", { class: this.player.config.classNames.posterThumbnails.scrubbingContainer })),
this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);
}),
t(this, "destroy", () => {
this.elements.thumb.container && this.elements.thumb.container.remove(), this.elements.scrubbing.container && this.elements.scrubbing.container.remove();
}),
t(this, "showImageAtCurrentTime", () => {
this.mouseDown ? this.setScrubbingContainerSize() : this.setThumbContainerSizeAndPos();
const e = this.thumbnails[0].frames.findIndex((e) => this.seekTime >= e.startTime && this.seekTime <= e.endTime),
t = e >= 0;
let i = 0;
this.mouseDown || this.toggleThumbContainer(t),
t &&
(this.thumbnails.forEach((t, s) => {
this.loadedImages.includes(t.frames[e].text) && (i = s);
}),
e !== this.showingThumb && ((this.showingThumb = e), this.loadImage(i)));
}),
t(this, "loadImage", (e = 0) => {
const t = this.showingThumb,
i = this.thumbnails[e],
{ urlPrefix: s } = i,
n = i.frames[t],
a = i.frames[t].text,
r = s + a;
if (this.currentImageElement && this.currentImageElement.dataset.filename === a)
this.showImage(this.currentImageElement, n, e, t, a, !1), (this.currentImageElement.dataset.index = t), this.removeOldImages(this.currentImageElement);
else {
this.loadingImage && this.usingSprites && (this.loadingImage.onload = null);
const i = new Image();
(i.src = r),
(i.dataset.index = t),
(i.dataset.filename = a),
(this.showingThumbFilename = a),
this.player.debug.log(`Loading image: ${r}`),
(i.onload = () => this.showImage(i, n, e, t, a, !0)),
(this.loadingImage = i),
this.removeOldImages(i);
}
}),
t(this, "showImage", (e, t, i, s, n, a = !0) => {
this.player.debug.log(`Showing thumb: ${n}. num: ${s}. qual: ${i}. newimg: ${a}`),
this.setImageSizeAndOffset(e, t),
a && (this.currentImageContainer.appendChild(e), (this.currentImageElement = e), this.loadedImages.includes(n) || this.loadedImages.push(n)),
this.preloadNearby(s, !0).then(this.preloadNearby(s, !1)).then(this.getHigherQuality(i, e, t, n));
}),
t(this, "removeOldImages", (e) => {
Array.from(this.currentImageContainer.children).forEach((t) => {
if ("img" !== t.tagName.toLowerCase()) return;
const i = this.usingSprites ? 500 : 1e3;
if (t.dataset.index !== e.dataset.index && !t.dataset.deleting) {
t.dataset.deleting = !0;
const { currentImageContainer: e } = this;
setTimeout(() => {
e.removeChild(t), this.player.debug.log(`Removing thumb: ${t.dataset.filename}`);
}, i);
}
});
}),
t(
this,
"preloadNearby",
(e, t = !0) =>
new Promise((i) => {
setTimeout(() => {
const s = this.thumbnails[0].frames[e].text;
if (this.showingThumbFilename === s) {
let n;
n = t ? this.thumbnails[0].frames.slice(e) : this.thumbnails[0].frames.slice(0, e).reverse();
let a = !1;
n.forEach((e) => {
const t = e.text;
if (t !== s && !this.loadedImages.includes(t)) {
(a = !0), this.player.debug.log(`Preloading thumb filename: ${t}`);
const { urlPrefix: e } = this.thumbnails[0],
s = e + t,
n = new Image();
(n.src = s),
(n.onload = () => {
this.player.debug.log(`Preloaded thumb filename: ${t}`), this.loadedImages.includes(t) || this.loadedImages.push(t), i();
});
}
}),
a || i();
}
}, 300);
})
),
t(this, "getHigherQuality", (e, t, i, s) => {
if (e < this.thumbnails.length - 1) {
let n = t.naturalHeight;
this.usingSprites && (n = i.h),
n < this.thumbContainerHeight &&
setTimeout(() => {
this.showingThumbFilename === s && (this.player.debug.log(`Showing higher quality thumb for: ${s}`), this.loadImage(e + 1));
}, 300);
}
}),
t(this, "toggleThumbContainer", (e = !1, t = !1) => {
const i = this.player.config.classNames.posterThumbnails.thumbContainerShown;
this.elements.thumb.container.classList.toggle(i, e), !e && t && ((this.showingThumb = null), (this.showingThumbFilename = null));
}),
t(this, "toggleScrubbingContainer", (e = !1) => {
const t = this.player.config.classNames.posterThumbnails.scrubbingContainerShown;
this.elements.scrubbing.container.classList.toggle(t, e), e || ((this.showingThumb = null), (this.showingThumbFilename = null));
}),
t(this, "determineContainerAutoSizing", () => {
(this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) && (this.sizeSpecifiedInCSS = !0);
}),
t(this, "setThumbContainerSizeAndPos", () => {
const { imageContainer: e } = this.elements.thumb;
if (this.sizeSpecifiedInCSS) {
if (e.clientHeight > 20 && e.clientWidth < 20) {
const t = Math.floor(e.clientHeight * this.thumbAspectRatio);
e.style.width = `${t}px`;
} else if (e.clientHeight < 20 && e.clientWidth > 20) {
const t = Math.floor(e.clientWidth / this.thumbAspectRatio);
e.style.height = `${t}px`;
}
} else {
const t = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);
(e.style.height = `${this.thumbContainerHeight}px`), (e.style.width = `${t}px`);
}
this.setThumbContainerPos();
}),
t(this, "setThumbContainerPos", () => {
const e = this.player.elements.progress.getBoundingClientRect(),
t = this.player.elements.container.getBoundingClientRect(),
{ container: i } = this.elements.thumb,
s = t.left - e.left + 10,
n = t.right - e.left - i.clientWidth - 10,
a = this.mousePosX - e.left - i.clientWidth / 2,
r = Ze(a, s, n);
(i.style.left = `${r}px`), i.style.setProperty("--preview-arrow-offset", a - r + "px");
}),
t(this, "setScrubbingContainerSize", () => {
const { width: e, height: t } = tt(this.thumbAspectRatio, { width: this.player.media.clientWidth, height: this.player.media.clientHeight });
(this.elements.scrubbing.container.style.width = `${e}px`), (this.elements.scrubbing.container.style.height = `${t}px`);
}),
t(this, "setImageSizeAndOffset", (e, t) => {
if (!this.usingSprites) return;
const i = this.thumbContainerHeight / t.h;
(e.style.height = e.naturalHeight * i + "px"), (e.style.width = e.naturalWidth * i + "px"), (e.style.left = `-${t.x * i}px`), (e.style.top = `-${t.y * i}px`);
}),
(this.player = e),
(this.thumbnails = []),
(this.loaded = !1),
(this.lastMouseMoveTime = Date.now()),
(this.mouseDown = !1),
(this.loadedImages = []),
(this.elements = { thumb: {}, scrubbing: {} }),
this.load();
}
get enabled() {
return this.player.isHTML5 && this.player.isVideo && this.player.config.posterThumbnails.enabled;
}
get currentImageContainer() {
return this.mouseDown ? this.elements.scrubbing.container : this.elements.thumb.imageContainer;
}
get usingSprites() {
return Object.keys(this.thumbnails[0].frames[0]).includes("w");
}
get thumbAspectRatio() {
return this.usingSprites ? this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h : this.thumbnails[0].width / this.thumbnails[0].height;
}
get thumbContainerHeight() {
if (this.mouseDown) {
const { height: e } = tt(this.thumbAspectRatio, { width: this.player.media.clientWidth, height: this.player.media.clientHeight });
return e;
}
return this.sizeSpecifiedInCSS ? this.elements.thumb.imageContainer.clientHeight : Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);
}
get currentImageElement() {
return this.mouseDown ? this.currentScrubbingImageElement : this.currentThumbnailImageElement;
}
set currentImageElement(e) {
this.mouseDown ? (this.currentScrubbingImageElement = e) : (this.currentThumbnailImageElement = e);
}
}
const st = {
insertElements(e, t) {
A.string(t)
? $(e, this.media, { src: t })
: A.array(t) &&
t.forEach((t) => {
$(e, this.media, t);
});
},
change(e) {
L(e, "sources.length")
? (me.cancelRequests.call(this),
this.destroy.call(
this,
() => {
(this.options.quality = []), j(this.media), (this.media = null), A.element(this.elements.container) && this.elements.container.removeAttribute("class");
const { sources: t, type: i } = e,
[{ provider: s = $e.html5, src: n }] = t,
a = "html5" === s ? i : "div",
r = "html5" === s ? {} : { src: n };
Object.assign(this, { provider: s, type: i, supported: Y.check(i, s, this.config.playsinline), media: O(a, r) }),
this.elements.container.appendChild(this.media),
A.boolean(e.autoplay) && (this.config.autoplay = e.autoplay),
this.isHTML5 &&
(this.config.crossorigin && this.media.setAttribute("crossorigin", ""),
this.config.autoplay && this.media.setAttribute("autoplay", ""),
A.empty(e.poster) || (this.poster = e.poster),
this.config.loop.active && this.media.setAttribute("loop", ""),
this.config.muted && this.media.setAttribute("muted", ""),
this.config.playsinline && this.media.setAttribute("playsinline", "")),
Ue.addStyleHook.call(this),
this.isHTML5 && st.insertElements.call(this, "source", t),
(this.config.title = e.title),
Je.setup.call(this),
this.isHTML5 && Object.keys(e).includes("tracks") && st.insertElements.call(this, "track", e.tracks),
(this.isHTML5 || (this.isEmbed && !this.supported.ui)) && Ue.build.call(this),
this.isHTML5 && this.media.load(),
A.empty(e.posterThumbnails) ||
(Object.assign(this.config.posterThumbnails, e.posterThumbnails),
this.posterThumbnails && this.posterThumbnails.loaded && (this.posterThumbnails.destroy(), (this.posterThumbnails = null)),
this.config.posterThumbnails.enabled && (this.posterThumbnails = new it(this))),
this.fullscreen.update();
},
!0
))
: this.debug.warn("Invalid source format");
},
};
class nt {
constructor(e, i) {
if (
(t(this, "play", () => (A.function(this.media.play) ? (this.ads && this.ads.enabled && this.ads.managerPromise.then(() => this.ads.play()).catch(() => se(this.media.play())), this.media.play()) : null)),
t(this, "pause", () => (this.playing && A.function(this.media.pause) ? this.media.pause() : null)),
t(this, "togglePlay", (e) => ((A.boolean(e) ? e : !this.playing) ? this.play() : this.pause())),
t(this, "stop", () => {
this.isHTML5 ? (this.pause(), this.restart()) : A.function(this.media.stop) && this.media.stop();
}),
t(this, "restart", () => {
this.currentTime = 0;
}),
t(this, "rewind", (e) => {
this.currentTime -= A.number(e) ? e : this.config.seekTime;
}),
t(this, "forward", (e) => {
this.currentTime += A.number(e) ? e : this.config.seekTime;
}),
t(this, "increaseVolume", (e) => {
const t = this.media.muted ? 0 : this.volume;
this.volume = t + (A.number(e) ? e : 0);
}),
t(this, "decreaseVolume", (e) => {
this.increaseVolume(-e);
}),
t(this, "airplay", () => {
Y.airplay && this.media.webkitShowPlaybackTargetPicker();
}),
t(this, "toggleControls", (e) => {
if (this.supported.ui && !this.isAudio) {
const t = U(this.elements.container, this.config.classNames.hideControls),
i = void 0 === e ? void 0 : !e,
s = F(this.elements.container, this.config.classNames.hideControls, i);
if ((s && A.array(this.config.controls) && this.config.controls.includes("settings") && !A.empty(this.config.settings) && Me.toggleMenu.call(this, !1), s !== t)) {
const e = s ? "controlshidden" : "controlsshown";
ee.call(this, this.media, e);
}
return !s;
}
return !1;
}),
t(this, "on", (e, t) => {
J.call(this, this.elements.container, e, t);
}),
t(this, "once", (e, t) => {
Z.call(this, this.elements.container, e, t);
}),
t(this, "off", (e, t) => {
G(this.elements.container, e, t);
}),
t(this, "destroy", (e, t = !1) => {
if (!this.ready) return;
const i = () => {
(document.body.style.overflow = ""),
(this.embed = null),
t
? (Object.keys(this.elements).length &&
(j(this.elements.buttons.play),
j(this.elements.captions),
j(this.elements.controls),
j(this.elements.wrapper),
(this.elements.buttons.play = null),
(this.elements.captions = null),
(this.elements.controls = null),
(this.elements.wrapper = null)),
A.function(e) && e())
: (te.call(this),
me.cancelRequests.call(this),
D(this.elements.original, this.elements.container),
ee.call(this, this.elements.original, "destroyed", !0),
A.function(e) && e.call(this.elements.original),
(this.ready = !1),
setTimeout(() => {
(this.elements = null), (this.media = null);
}, 200));
};
this.stop(),
clearTimeout(this.timers.loading),
clearTimeout(this.timers.controls),
clearTimeout(this.timers.resized),
this.isHTML5
? (Ue.toggleNativeControls.call(this, !0), i())
: this.isYouTube
? (clearInterval(this.timers.buffering), clearInterval(this.timers.playing), null !== this.embed && A.function(this.embed.destroy) && this.embed.destroy(), i())
: this.isVimeo && (null !== this.embed && this.embed.unload().then(i), setTimeout(i, 200));
}),
t(this, "supports", (e) => Y.mime.call(this, e)),
(this.timers = {}),
(this.ready = !1),
(this.loading = !1),
(this.failed = !1),
(this.touch = Y.touch),
(this.media = e),
A.string(this.media) && (this.media = document.querySelectorAll(this.media)),
((window.jQuery && this.media instanceof jQuery) || A.nodeList(this.media) || A.array(this.media)) && (this.media = this.media[0]),
(this.config = N(
{},
_e,
nt.defaults,
i || {},
(() => {
try {
return JSON.parse(this.media.getAttribute("data-plyr-config"));
} catch (e) {
return {};
}
})()
)),
(this.elements = { container: null, fullscreen: null, captions: null, buttons: {}, display: {}, progress: {}, inputs: {}, settings: { popup: null, menu: null, panels: {}, buttons: {} } }),
(this.captions = { active: null, currentTrack: -1, meta: new WeakMap() }),
(this.fullscreen = { active: !1 }),
(this.options = { speed: [], quality: [] }),
(this.debug = new qe(this.config.debug)),
this.debug.log("Config", this.config),
this.debug.log("Support", Y),
A.nullOrUndefined(this.media) || !A.element(this.media))
)
return void this.debug.error("Setup failed: no suitable element passed");
if (this.media.plyr) return void this.debug.warn("Target already setup");
if (!this.config.enabled) return void this.debug.error("Setup failed: disabled by config");
if (!Y.check().api) return void this.debug.error("Setup failed: no support");
const s = this.media.cloneNode(!0);
(s.autoplay = !1), (this.elements.original = s);
const n = this.media.tagName.toLowerCase();
let a = null,
r = null;
switch (n) {
case "div":
if (((a = this.media.querySelector("iframe")), A.element(a))) {
if (
((r = xe(a.getAttribute("src"))),
(this.provider = (function (e) {
return /^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e) ? $e.youtube : /^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e) ? $e.vimeo : null;
})(r.toString())),
(this.elements.container = this.media),
(this.media = a),
(this.elements.container.className = ""),
r.search.length)
) {
const e = ["1", "true"];
e.includes(r.searchParams.get("autoplay")) && (this.config.autoplay = !0),
e.includes(r.searchParams.get("loop")) && (this.config.loop.active = !0),
this.isYouTube ? ((this.config.playsinline = e.includes(r.searchParams.get("playsinline"))), (this.config.youtube.hl = r.searchParams.get("hl"))) : (this.config.playsinline = !0);
}
} else (this.provider = this.media.getAttribute(this.config.attributes.embed.provider)), this.media.removeAttribute(this.config.attributes.embed.provider);
if (A.empty(this.provider) || !Object.values($e).includes(this.provider)) return void this.debug.error("Setup failed: Invalid provider");
this.type = Re;
break;
case "video":
case "audio":
(this.type = n),
(this.provider = $e.html5),
this.media.hasAttribute("crossorigin") && (this.config.crossorigin = !0),
this.media.hasAttribute("autoplay") && (this.config.autoplay = !0),
(this.media.hasAttribute("playsinline") || this.media.hasAttribute("webkit-playsinline")) && (this.config.playsinline = !0),
this.media.hasAttribute("muted") && (this.config.muted = !0),
this.media.hasAttribute("loop") && (this.config.loop.active = !0);
break;
default:
return void this.debug.error("Setup failed: unsupported type");
}
(this.supported = Y.check(this.type, this.provider)),
this.supported.api
? ((this.eventListeners = []),
(this.listeners = new Ve(this)),
(this.storage = new Te(this)),
(this.media.plyr = this),
A.element(this.elements.container) || ((this.elements.container = O("div")), _(this.media, this.elements.container)),
Ue.migrateStyles.call(this),
Ue.addStyleHook.call(this),
Je.setup.call(this),
this.config.debug &&
J.call(this, this.elements.container, this.config.events.join(" "), (e) => {
this.debug.log(`event: ${e.type}`);
}),
(this.fullscreen = new He(this)),
(this.isHTML5 || (this.isEmbed && !this.supported.ui)) && Ue.build.call(this),
this.listeners.container(),
this.listeners.global(),
this.config.ads.enabled && (this.ads = new Ge(this)),
this.isHTML5 && this.config.autoplay && this.once("canplay", () => se(this.play())),
(this.lastSeekTime = 0),
this.config.posterThumbnails.enabled && (this.posterThumbnails = new it(this)))
: this.debug.error("Setup failed: no support");
}
get isHTML5() {
return this.provider === $e.html5;
}
get isEmbed() {
return this.isYouTube || this.isVimeo;
}
get isYouTube() {
return this.provider === $e.youtube;
}
get isVimeo() {
return this.provider === $e.vimeo;
}
get isVideo() {
return this.type === Re;
}
get isAudio() {
return this.type === je;
}
get playing() {
return Boolean(this.ready && !this.paused && !this.ended);
}
get paused() {
return Boolean(this.media.paused);
}
get stopped() {
return Boolean(this.paused && 0 === this.currentTime);
}
get ended() {
return Boolean(this.media.ended);
}
set currentTime(e) {
if (!this.duration) return;
const t = A.number(e) && e > 0;
(this.media.currentTime = t ? Math.min(e, this.duration) : 0), this.debug.log(`Seeking to ${this.currentTime} seconds`);
}
get currentTime() {
return Number(this.media.currentTime);
}
get buffered() {
const { buffered: e } = this.media;
return A.number(e) ? e : e && e.length && this.duration > 0 ? e.end(0) / this.duration : 0;
}
get seeking() {
return Boolean(this.media.seeking);
}
get duration() {
const e = parseFloat(this.config.duration),
t = (this.media || {}).duration,
i = A.number(t) && t !== 1 / 0 ? t : 0;
return e || i;
}
set volume(e) {
let t = e;
A.string(t) && (t = Number(t)),
A.number(t) || (t = this.storage.get("volume")),
A.number(t) || ({ volume: t } = this.config),
t > 1 && (t = 1),
t < 0 && (t = 0),
(this.config.volume = t),
(this.media.volume = t),
!A.empty(e) && this.muted && t > 0 && (this.muted = !1);
}
get volume() {
return Number(this.media.volume);
}
set muted(e) {
let t = e;
A.boolean(t) || (t = this.storage.get("muted")), A.boolean(t) || (t = this.config.muted), (this.config.muted = t), (this.media.muted = t);
}
get muted() {
return Boolean(this.media.muted);
}
get hasAudio() {
return !this.isHTML5 || !!this.isAudio || Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);
}
set speed(e) {
let t = null;
A.number(e) && (t = e), A.number(t) || (t = this.storage.get("speed")), A.number(t) || (t = this.config.speed.selected);
const { minimumSpeed: i, maximumSpeed: s } = this;
(t = Ze(t, i, s)),
(this.config.speed.selected = t),
setTimeout(() => {
this.media && (this.media.playbackRate = t);
}, 0);
}
get speed() {
return Number(this.media.playbackRate);
}
get minimumSpeed() {
return this.isYouTube ? Math.min(...this.options.speed) : this.isVimeo ? 0.5 : 0.0625;
}
get maximumSpeed() {
return this.isYouTube ? Math.max(...this.options.speed) : this.isVimeo ? 2 : 16;
}
set quality(e) {
const t = this.config.quality,
i = this.options.quality;
if (!i.length) return;
let s = [!A.empty(e) && Number(e), this.storage.get("quality"), t.selected, t.default].find(A.number),
n = !0;
if (!i.includes(s)) {
const e = ae(i, s);
this.debug.warn(`Unsupported quality option: ${s}, using ${e} instead`), (s = e), (n = !1);
}
(t.selected = s), (this.media.quality = s), n && this.storage.set({ quality: s });
}
get quality() {
return this.media.quality;
}
set loop(e) {
const t = A.boolean(e) ? e : this.config.loop.active;
(this.config.loop.active = t), (this.media.loop = t);
}
get loop() {
return Boolean(this.media.loop);
}
set source(e) {
st.change.call(this, e);
}
get source() {
return this.media.currentSrc;
}
get download() {
const { download: e } = this.config.urls;
return A.url(e) ? e : this.source;
}
set download(e) {
A.url(e) && ((this.config.urls.download = e), Me.setDownloadUrl.call(this));
}
set poster(e) {
this.isVideo ? Ue.setPoster.call(this, e, !1).catch(() => { }) : this.debug.warn("Poster can only be set for video");
}
get poster() {
return this.isVideo ? this.media.getAttribute("poster") || this.media.getAttribute("data-poster") : null;
}
get ratio() {
if (!this.isVideo) return null;
const e = ce(ue.call(this));
return A.array(e) ? e.join(":") : e;
}
set ratio(e) {
this.isVideo ? (A.string(e) && le(e) ? ((this.config.ratio = ce(e)), he.call(this)) : this.debug.error(`Invalid aspect ratio specified (${e})`)) : this.debug.warn("Aspect ratio can only be set for video");
}
set autoplay(e) {
this.config.autoplay = A.boolean(e) ? e : this.config.autoplay;
}
get autoplay() {
return Boolean(this.config.autoplay);
}
toggleCaptions(e) {
Ne.toggle.call(this, e, !1);
}
set currentTrack(e) {
Ne.set.call(this, e, !1), Ne.setup.call(this);
}
get currentTrack() {
const { toggled: e, currentTrack: t } = this.captions;
return e ? t : -1;
}
set language(e) {
Ne.setLanguage.call(this, e, !1);
}
get language() {
return (Ne.getCurrentTrack.call(this) || {}).language;
}
set pip(e) {
if (!Y.pip) return;
const t = A.boolean(e) ? e : !this.pip;
A.function(this.media.webkitSetPresentationMode) && this.media.webkitSetPresentationMode(t ? Ie : Oe),
A.function(this.media.requestPictureInPicture) && (!this.pip && t ? this.media.requestPictureInPicture() : this.pip && !t && document.exitPictureInPicture());
}
get pip() {
return Y.pip ? (A.empty(this.media.webkitPresentationMode) ? this.media === document.pictureInPictureElement : this.media.webkitPresentationMode === Ie) : null;
}
setposterThumbnails(e) {
this.posterThumbnails && this.posterThumbnails.loaded && (this.posterThumbnails.destroy(), (this.posterThumbnails = null)),
Object.assign(this.config.posterThumbnails, e),
this.config.posterThumbnails.enabled && (this.posterThumbnails = new it(this));
}
static supported(e, t) {
return Y.check(e, t);
}
static loadSprite(e, t) {
return Ee(e, t);
}
static setup(e, t = {}) {
let i = null;
return A.string(e) ? (i = Array.from(document.querySelectorAll(e))) : A.nodeList(e) ? (i = Array.from(e)) : A.array(e) && (i = e.filter(A.element)), A.empty(i) ? null : i.map((e) => new nt(e, t));
}
}
var at;
return (nt.defaults = ((at = _e), JSON.parse(JSON.stringify(at)))), nt;
});;