openplayerjs
Version:
HTML5 video and audio player
1,130 lines (1,059 loc) • 359 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["openplayerjs"] = factory();
else
root["openplayerjs"] = factory();
})(this, function() {
return /******/ (function() { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ 172:
/***/ (function(module) {
function _OverloadYield(e, d) {
this.v = e, this.k = d;
}
module.exports = _OverloadYield, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ 373:
/***/ (function(module) {
function _regeneratorKeys(e) {
var n = Object(e),
r = [];
for (var t in n) r.unshift(t);
return function e() {
for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e;
return e.done = !0, e;
};
}
module.exports = _regeneratorKeys, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ 546:
/***/ (function(module) {
function _regeneratorDefine(e, r, n, t) {
var i = Object.defineProperty;
try {
i({}, "", {});
} catch (e) {
i = 0;
}
module.exports = _regeneratorDefine = function regeneratorDefine(e, r, n, t) {
function o(r, n) {
_regeneratorDefine(e, r, function (e) {
return this._invoke(r, n, e);
});
}
r ? i ? i(e, r, {
value: n,
enumerable: !t,
configurable: !t,
writable: !t
}) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2));
}, module.exports.__esModule = true, module.exports["default"] = module.exports, _regeneratorDefine(e, r, n, t);
}
module.exports = _regeneratorDefine, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ 579:
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var _typeof = (__webpack_require__(738)["default"]);
function _regeneratorValues(e) {
if (null != e) {
var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"],
r = 0;
if (t) return t.call(e);
if ("function" == typeof e.next) return e;
if (!isNaN(e.length)) return {
next: function next() {
return e && r >= e.length && (e = void 0), {
value: e && e[r++],
done: !e
};
}
};
}
throw new TypeError(_typeof(e) + " is not iterable");
}
module.exports = _regeneratorValues, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ 633:
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var OverloadYield = __webpack_require__(172);
var regenerator = __webpack_require__(993);
var regeneratorAsync = __webpack_require__(869);
var regeneratorAsyncGen = __webpack_require__(887);
var regeneratorAsyncIterator = __webpack_require__(791);
var regeneratorKeys = __webpack_require__(373);
var regeneratorValues = __webpack_require__(579);
function _regeneratorRuntime() {
"use strict";
var r = regenerator(),
e = r.m(_regeneratorRuntime),
t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor;
function n(r) {
var e = "function" == typeof r && r.constructor;
return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name));
}
var o = {
"throw": 1,
"return": 2,
"break": 3,
"continue": 3
};
function a(r) {
var e, t;
return function (n) {
e || (e = {
stop: function stop() {
return t(n.a, 2);
},
"catch": function _catch() {
return n.v;
},
abrupt: function abrupt(r, e) {
return t(n.a, o[r], e);
},
delegateYield: function delegateYield(r, o, a) {
return e.resultName = o, t(n.d, regeneratorValues(r), a);
},
finish: function finish(r) {
return t(n.f, r);
}
}, t = function t(r, _t, o) {
n.p = e.prev, n.n = e.next;
try {
return r(_t, o);
} finally {
e.next = n.n;
}
}), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n;
try {
return r.call(this, e);
} finally {
n.p = e.prev, n.n = e.next;
}
};
}
return (module.exports = _regeneratorRuntime = function _regeneratorRuntime() {
return {
wrap: function wrap(e, t, n, o) {
return r.w(a(e), t, n, o && o.reverse());
},
isGeneratorFunction: n,
mark: r.m,
awrap: function awrap(r, e) {
return new OverloadYield(r, e);
},
AsyncIterator: regeneratorAsyncIterator,
async: function async(r, e, t, o, u) {
return (n(e) ? regeneratorAsyncGen : regeneratorAsync)(a(r), e, t, o, u);
},
keys: regeneratorKeys,
values: regeneratorValues
};
}, module.exports.__esModule = true, module.exports["default"] = module.exports)();
}
module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ 738:
/***/ (function(module) {
function _typeof(o) {
"@babel/helpers - typeof";
return module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;
} : function (o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
}, module.exports.__esModule = true, module.exports["default"] = module.exports, _typeof(o);
}
module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ 756:
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
// TODO(Babel 8): Remove this file.
var runtime = __webpack_require__(633)();
module.exports = runtime;
// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=
try {
regeneratorRuntime = runtime;
} catch (accidentalStrictMode) {
if (typeof globalThis === "object") {
globalThis.regeneratorRuntime = runtime;
} else {
Function("r", "regeneratorRuntime = r")(runtime);
}
}
/***/ }),
/***/ 791:
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var OverloadYield = __webpack_require__(172);
var regeneratorDefine = __webpack_require__(546);
function AsyncIterator(t, e) {
function n(r, o, i, f) {
try {
var c = t[r](o),
u = c.value;
return u instanceof OverloadYield ? e.resolve(u.v).then(function (t) {
n("next", t, i, f);
}, function (t) {
n("throw", t, i, f);
}) : e.resolve(u).then(function (t) {
c.value = t, i(c);
}, function (t) {
return n("throw", t, i, f);
});
} catch (t) {
f(t);
}
}
var r;
this.next || (regeneratorDefine(AsyncIterator.prototype), regeneratorDefine(AsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () {
return this;
})), regeneratorDefine(this, "_invoke", function (t, o, i) {
function f() {
return new e(function (e, r) {
n(t, i, e, r);
});
}
return r = r ? r.then(f, f) : f();
}, !0);
}
module.exports = AsyncIterator, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ 869:
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var regeneratorAsyncGen = __webpack_require__(887);
function _regeneratorAsync(n, e, r, t, o) {
var a = regeneratorAsyncGen(n, e, r, t, o);
return a.next().then(function (n) {
return n.done ? n.value : a.next();
});
}
module.exports = _regeneratorAsync, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ 887:
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var regenerator = __webpack_require__(993);
var regeneratorAsyncIterator = __webpack_require__(791);
function _regeneratorAsyncGen(r, e, t, o, n) {
return new regeneratorAsyncIterator(regenerator().w(r, e, t, o), n || Promise);
}
module.exports = _regeneratorAsyncGen, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ 993:
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
var regeneratorDefine = __webpack_require__(546);
function _regenerator() {
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
var e,
t,
r = "function" == typeof Symbol ? Symbol : {},
n = r.iterator || "@@iterator",
o = r.toStringTag || "@@toStringTag";
function i(r, n, o, i) {
var c = n && n.prototype instanceof Generator ? n : Generator,
u = Object.create(c.prototype);
return regeneratorDefine(u, "_invoke", function (r, n, o) {
var i,
c,
u,
f = 0,
p = o || [],
y = !1,
G = {
p: 0,
n: 0,
v: e,
a: d,
f: d.bind(e, 4),
d: function d(t, r) {
return i = t, c = 0, u = e, G.n = r, a;
}
};
function d(r, n) {
for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) {
var o,
i = p[t],
d = G.p,
l = i[2];
r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0));
}
if (o || r > 1) return a;
throw y = !0, n;
}
return function (o, p, l) {
if (f > 1) throw TypeError("Generator is already running");
for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) {
i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u);
try {
if (f = 2, i) {
if (c || (o = "next"), t = i[o]) {
if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object");
if (!t.done) return t;
u = t.value, c < 2 && (c = 0);
} else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1);
i = e;
} else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break;
} catch (t) {
i = e, c = 1, u = t;
} finally {
f = 1;
}
}
return {
value: t,
done: y
};
};
}(r, o, i), !0), u;
}
var a = {};
function Generator() {}
function GeneratorFunction() {}
function GeneratorFunctionPrototype() {}
t = Object.getPrototypeOf;
var c = [][n] ? t(t([][n]())) : (regeneratorDefine(t = {}, n, function () {
return this;
}), t),
u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c);
function f(e) {
return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, regeneratorDefine(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e;
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, regeneratorDefine(u, "constructor", GeneratorFunctionPrototype), regeneratorDefine(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", regeneratorDefine(GeneratorFunctionPrototype, o, "GeneratorFunction"), regeneratorDefine(u), regeneratorDefine(u, o, "Generator"), regeneratorDefine(u, n, function () {
return this;
}), regeneratorDefine(u, "toString", function () {
return "[object Generator]";
}), (module.exports = _regenerator = function _regenerator() {
return {
w: i,
m: f
};
}, module.exports.__esModule = true, module.exports["default"] = module.exports)();
}
module.exports = _regenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ !function() {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function() { return module['default']; } :
/******/ function() { return module; };
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ !function() {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = function(exports, definition) {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ !function() {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ }();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry needs to be wrapped in an IIFE because it needs to be in strict mode.
!function() {
"use strict";
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
"default": function() { return /* binding */ player; }
});
;// ./node_modules/@babel/runtime/helpers/esm/typeof.js
function typeof_typeof(o) {
"@babel/helpers - typeof";
return typeof_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;
} : function (o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
}, typeof_typeof(o);
}
;// ./node_modules/@babel/runtime/helpers/esm/toPrimitive.js
function toPrimitive(t, r) {
if ("object" != typeof_typeof(t) || !t) return t;
var e = t[Symbol.toPrimitive];
if (void 0 !== e) {
var i = e.call(t, r || "default");
if ("object" != typeof_typeof(i)) return i;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return ("string" === r ? String : Number)(t);
}
;// ./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js
function toPropertyKey(t) {
var i = toPrimitive(t, "string");
return "symbol" == typeof_typeof(i) ? i : i + "";
}
;// ./node_modules/@babel/runtime/helpers/esm/defineProperty.js
function _defineProperty(e, r, t) {
return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
value: t,
enumerable: !0,
configurable: !0,
writable: !0
}) : e[r] = t, e;
}
;// ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js
function _classCallCheck(a, n) {
if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");
}
;// ./node_modules/@babel/runtime/helpers/esm/createClass.js
function _defineProperties(e, r) {
for (var t = 0; t < r.length; t++) {
var o = r[t];
o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);
}
}
function _createClass(e, r, t) {
return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
writable: !1
}), e;
}
// EXTERNAL MODULE: ./node_modules/@babel/runtime/regenerator/index.js
var regenerator = __webpack_require__(756);
var regenerator_default = /*#__PURE__*/__webpack_require__.n(regenerator);
;// ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js
function _arrayWithHoles(r) {
if (Array.isArray(r)) return r;
}
;// ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js
function _iterableToArrayLimit(r, l) {
var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
if (null != t) {
var e,
n,
i,
u,
a = [],
f = !0,
o = !1;
try {
if (i = (t = t.call(r)).next, 0 === l) {
if (Object(t) !== t) return;
f = !1;
} else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
} catch (r) {
o = !0, n = r;
} finally {
try {
if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return;
} finally {
if (o) throw n;
}
}
return a;
}
}
;// ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js
function _arrayLikeToArray(r, a) {
(null == a || a > r.length) && (a = r.length);
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
return n;
}
;// ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js
function _unsupportedIterableToArray(r, a) {
if (r) {
if ("string" == typeof r) return _arrayLikeToArray(r, a);
var t = {}.toString.call(r).slice(8, -1);
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
}
}
;// ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js
function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
;// ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js
function _slicedToArray(r, e) {
return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
}
;// ./src/js/utils/constants.ts
var NAV = typeof window !== 'undefined' ? window.navigator : null;
var UA = NAV ? NAV.userAgent.toLowerCase() : null;
var IS_IPAD = UA ? /ipad/i.test(UA) && !window.MSStream : false;
var IS_IPHONE = UA ? /iphone/i.test(UA) && !window.MSStream : false;
var IS_IPOD = UA ? /ipod/i.test(UA) && !window.MSStream : false;
var IS_IOS = UA ? /ipad|iphone|ipod/i.test(UA) && !window.MSStream : false;
var IS_ANDROID = UA ? /android/i.test(UA) : false;
var IS_EDGE = NAV ? 'msLaunchUri' in NAV && !('documentMode' in document) : false;
var IS_CHROME = UA ? /chrome/i.test(UA) : false;
var IS_FIREFOX = UA ? /firefox/i.test(UA) : false;
var IS_SAFARI = UA ? /safari/i.test(UA) && !IS_CHROME : false;
var IS_STOCK_ANDROID = UA ? /^mozilla\/\d+\.\d+\s\(linux;\su;/i.test(UA) : false;
var HAS_MSE = typeof window !== 'undefined' ? 'MediaSource' in window : false;
var SUPPORTS_HLS = function SUPPORTS_HLS() {
if (typeof window === 'undefined') {
return false;
}
var mediaSource = window.MediaSource || window.WebKitMediaSource;
var sourceBuffer = window.SourceBuffer || window.WebKitSourceBuffer;
var isTypeSupported = mediaSource && typeof mediaSource.isTypeSupported === 'function' && mediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"');
var sourceBufferValidAPI = !sourceBuffer || sourceBuffer.prototype && typeof sourceBuffer.prototype.appendBuffer === 'function' && typeof sourceBuffer.prototype.remove === 'function';
return !!isTypeSupported && !!sourceBufferValidAPI && !IS_SAFARI;
};
var DVR_THRESHOLD = 120;
var EVENT_OPTIONS = {
passive: false
};
;// ./src/js/utils/general.ts
function getAbsoluteUrl(url) {
var a = document.createElement('a');
a.href = url;
return a.href;
}
function isVideo(element) {
return element.tagName.toLowerCase() === 'video';
}
function isAudio(element) {
return element.tagName.toLowerCase() === 'audio';
}
function loadScript(url) {
return new Promise(function (resolve, reject) {
var script = document.createElement('script');
script.src = url;
script.async = true;
script.onload = function () {
script.remove();
resolve();
};
script.onerror = function () {
script.remove();
reject(new Error("".concat(url, " could not be loaded")));
};
if (document.head) {
document.head.appendChild(script);
}
});
}
function offset(el) {
var rect = el.getBoundingClientRect();
return {
left: rect.left + (window.pageXOffset || document.documentElement.scrollLeft),
top: rect.top + (window.pageYOffset || document.documentElement.scrollTop)
};
}
function sanitize(html) {
var plainText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var parser = new DOMParser();
var content = parser.parseFromString(html, 'text/html');
var formattedContent = content.body || document.createElement('body');
var scripts = formattedContent.querySelectorAll('script');
for (var i = 0, total = scripts.length; i < total; i++) {
scripts[i].remove();
}
var _clean = function clean(element) {
var nodes = element.children;
for (var _i = 0, _total = nodes.length; _i < _total; _i++) {
var node = nodes[_i];
var attributes = node.attributes;
for (var j = 0, t = attributes.length; j < t; j++) {
var _attributes$j = attributes[j],
name = _attributes$j.name,
value = _attributes$j.value;
var val = value.replace(/\s+/g, '').toLowerCase();
if (['src', 'href', 'xlink:href'].includes(name)) {
if (val.includes('javascript:') || val.includes('data:')) {
node.removeAttribute(name);
}
}
if (name.startsWith('on')) {
node.removeAttribute(name);
}
}
_clean(node);
}
};
_clean(formattedContent);
return plainText ? (formattedContent.textContent || '').replace(/\s{2,}/g, '') : formattedContent.innerHTML;
}
function isXml(input) {
var parsedXml;
if (typeof DOMParser !== 'undefined') {
parsedXml = function parsedXml(text) {
return new DOMParser().parseFromString(text, 'text/xml');
};
} else {
return false;
}
try {
var response = parsedXml(input);
if (response.getElementsByTagName('parsererror').length > 0) {
return false;
}
} catch (e) {
return false;
}
return true;
}
function isJson(item) {
item = typeof item !== 'string' ? JSON.stringify(item) : item;
try {
item = JSON.parse(item);
} catch (e) {
return false;
}
if (_typeof(item) === 'object' && item !== null) {
return true;
}
return false;
}
function addEvent(event, details) {
var detail = {};
if (details && details.detail) {
detail = {
detail: details.detail
};
}
return new CustomEvent(event, detail);
}
;// ./src/js/controls/captions.ts
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = captions_unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
function captions_unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return captions_arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? captions_arrayLikeToArray(r, a) : void 0; } }
function captions_arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
var __classPrivateFieldSet = undefined && undefined.__classPrivateFieldSet || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;
};
var __classPrivateFieldGet = undefined && undefined.__classPrivateFieldGet || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _Captions_player, _Captions_button, _Captions_captions, _Captions_menu, _Captions_events, _Captions_mediaTrackList, _Captions_hasTracks, _Captions_currentTrack, _Captions_default, _Captions_controlPosition, _Captions_controlLayer;
var Captions = function () {
function Captions(player, position, layer) {
_classCallCheck(this, Captions);
_Captions_player.set(this, void 0);
_Captions_button.set(this, void 0);
_Captions_captions.set(this, void 0);
_Captions_menu.set(this, void 0);
_Captions_events.set(this, {
button: {},
global: {},
media: {}
});
_Captions_mediaTrackList.set(this, void 0);
_Captions_hasTracks.set(this, void 0);
_Captions_currentTrack.set(this, void 0);
_Captions_default.set(this, 'off');
_Captions_controlPosition.set(this, void 0);
_Captions_controlLayer.set(this, void 0);
__classPrivateFieldSet(this, _Captions_player, player, "f");
__classPrivateFieldSet(this, _Captions_controlPosition, position, "f");
__classPrivateFieldSet(this, _Captions_controlLayer, layer, "f");
this._formatMenuItems = this._formatMenuItems.bind(this);
this._setDefaultTrack = this._setDefaultTrack.bind(this);
this._showCaptions = this._showCaptions.bind(this);
this._hideCaptions = this._hideCaptions.bind(this);
}
return _createClass(Captions, [{
key: "create",
value: function create() {
var _this = this;
var _a;
var _classPrivateFieldGe = __classPrivateFieldGet(this, _Captions_player, "f").getElement(),
textTracks = _classPrivateFieldGe.textTracks;
var _classPrivateFieldGe2 = __classPrivateFieldGet(this, _Captions_player, "f").getOptions(),
labels = _classPrivateFieldGe2.labels,
detachMenus = _classPrivateFieldGe2.detachMenus;
__classPrivateFieldSet(this, _Captions_mediaTrackList, Object.keys(textTracks).map(function (k) {
return textTracks[Number(k)];
}).filter(function (el) {
return ['subtitles', 'captions'].includes(el.kind) && el.language;
}), "f");
__classPrivateFieldSet(this, _Captions_hasTracks, !!__classPrivateFieldGet(this, _Captions_mediaTrackList, "f").length, "f");
if (!__classPrivateFieldGet(this, _Captions_hasTracks, "f")) {
return;
}
__classPrivateFieldSet(this, _Captions_button, document.createElement('button'), "f");
__classPrivateFieldGet(this, _Captions_button, "f").className = "op-controls__captions op-control__".concat(__classPrivateFieldGet(this, _Captions_controlPosition, "f"));
__classPrivateFieldGet(this, _Captions_button, "f").tabIndex = 0;
__classPrivateFieldGet(this, _Captions_button, "f").type = 'button';
__classPrivateFieldGet(this, _Captions_button, "f").title = (labels === null || labels === void 0 ? void 0 : labels.toggleCaptions) || '';
__classPrivateFieldGet(this, _Captions_button, "f").setAttribute('aria-controls', __classPrivateFieldGet(this, _Captions_player, "f").id);
__classPrivateFieldGet(this, _Captions_button, "f").setAttribute('aria-pressed', 'false');
__classPrivateFieldGet(this, _Captions_button, "f").setAttribute('aria-label', (labels === null || labels === void 0 ? void 0 : labels.toggleCaptions) || '');
__classPrivateFieldGet(this, _Captions_button, "f").setAttribute('data-active-captions', 'off');
__classPrivateFieldSet(this, _Captions_captions, document.createElement('div'), "f");
__classPrivateFieldGet(this, _Captions_captions, "f").className = 'op-captions';
var target = __classPrivateFieldGet(this, _Captions_player, "f").getContainer();
target.insertBefore(__classPrivateFieldGet(this, _Captions_captions, "f"), target.firstChild);
if (detachMenus) {
__classPrivateFieldGet(this, _Captions_button, "f").classList.add('op-control--no-hover');
__classPrivateFieldSet(this, _Captions_menu, document.createElement('div'), "f");
__classPrivateFieldGet(this, _Captions_menu, "f").className = 'op-settings op-captions__menu';
__classPrivateFieldGet(this, _Captions_menu, "f").setAttribute('aria-hidden', 'true');
__classPrivateFieldGet(this, _Captions_menu, "f").innerHTML = "<div class=\"op-settings__menu\" role=\"menu\" id=\"menu-item-captions\">\n <div class=\"op-settings__submenu-item\" tabindex=\"0\" role=\"menuitemradio\" aria-checked=\"".concat(__classPrivateFieldGet(this, _Captions_default, "f") === 'off' ? 'true' : 'false', "\">\n <div class=\"op-settings__submenu-label op-subtitles__option\" data-value=\"captions-off\">").concat(labels === null || labels === void 0 ? void 0 : labels.off, "</div>\n </div>\n </div>");
var itemContainer = document.createElement('div');
itemContainer.className = "op-controls__container op-control__".concat(__classPrivateFieldGet(this, _Captions_controlPosition, "f"));
itemContainer.append(__classPrivateFieldGet(this, _Captions_button, "f"), __classPrivateFieldGet(this, _Captions_menu, "f"));
__classPrivateFieldGet(this, _Captions_player, "f").getControls().getLayer(__classPrivateFieldGet(this, _Captions_controlLayer, "f")).append(itemContainer);
var _iterator = _createForOfIteratorHelper(__classPrivateFieldGet(this, _Captions_mediaTrackList, "f")),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var track = _step.value;
var item = document.createElement('div');
var label = ((_a = labels === null || labels === void 0 ? void 0 : labels.lang) === null || _a === void 0 ? void 0 : _a[track.language]) || null;
item.className = 'op-settings__submenu-item';
item.tabIndex = 0;
item.setAttribute('role', 'menuitemradio');
item.setAttribute('aria-checked', __classPrivateFieldGet(this, _Captions_default, "f") === track.language ? 'true' : 'false');
item.innerHTML = "<div class=\"op-settings__submenu-label op-subtitles__option\"\n data-value=\"captions-".concat(track.language, "\">\n ").concat(label || track.label, "\n </div>");
__classPrivateFieldGet(this, _Captions_menu, "f").append(item);
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
} else {
__classPrivateFieldGet(this, _Captions_player, "f").getControls().getLayer(__classPrivateFieldGet(this, _Captions_controlLayer, "f")).append(__classPrivateFieldGet(this, _Captions_button, "f"));
}
__classPrivateFieldGet(this, _Captions_events, "f").button.click = function (e) {
var _a;
var button = e.target;
if (detachMenus) {
var menus = __classPrivateFieldGet(_this, _Captions_player, "f").getContainer().querySelectorAll('.op-settings');
for (var _i = 0, _Array$from = Array.from(menus); _i < _Array$from.length; _i++) {
var menuItem = _Array$from[_i];
if (menuItem !== __classPrivateFieldGet(_this, _Captions_menu, "f")) {
menuItem.setAttribute('aria-hidden', 'true');
}
}
if (__classPrivateFieldGet(_this, _Captions_menu, "f").getAttribute('aria-hidden') === 'true') {
__classPrivateFieldGet(_this, _Captions_menu, "f").setAttribute('aria-hidden', 'false');
} else {
__classPrivateFieldGet(_this, _Captions_menu, "f").setAttribute('aria-hidden', 'true');
}
} else {
button.setAttribute('aria-pressed', 'true');
if (button.classList.contains('op-controls__captions--on')) {
button.classList.remove('op-controls__captions--on');
button.setAttribute('data-active-captions', 'off');
_this._hideCaptions();
} else {
button.classList.add('op-controls__captions--on');
button.setAttribute('data-active-captions', ((_a = __classPrivateFieldGet(_this, _Captions_currentTrack, "f")) === null || _a === void 0 ? void 0 : _a.language) || 'off');
_this._showCaptions();
}
var _iterator2 = _createForOfIteratorHelper(__classPrivateFieldGet(_this, _Captions_mediaTrackList, "f")),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var _track = _step2.value;
_track.mode = button.getAttribute('data-active-captions') === _track.language ? 'showing' : 'hidden';
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
}
};
__classPrivateFieldGet(this, _Captions_events, "f").button.mouseover = function () {
if (!IS_IOS && !IS_ANDROID && detachMenus) {
var menus = __classPrivateFieldGet(_this, _Captions_player, "f").getContainer().querySelectorAll('.op-settings');
for (var i = 0, total = menus.length; i < total; ++i) {
if (menus[i] !== __classPrivateFieldGet(_this, _Captions_menu, "f")) {
menus[i].setAttribute('aria-hidden', 'true');
}
}
if (__classPrivateFieldGet(_this, _Captions_menu, "f").getAttribute('aria-hidden') === 'true') {
__classPrivateFieldGet(_this, _Captions_menu, "f").setAttribute('aria-hidden', 'false');
}
}
};
__classPrivateFieldGet(this, _Captions_events, "f").button.mouseout = function () {
if (!IS_IOS && !IS_ANDROID && detachMenus) {
var menus = __classPrivateFieldGet(_this, _Captions_player, "f").getContainer().querySelectorAll('.op-settings');
for (var i = 0, total = menus.length; i < total; ++i) {
menus[i].setAttribute('aria-hidden', 'true');
}
if (__classPrivateFieldGet(_this, _Captions_menu, "f").getAttribute('aria-hidden') === 'false') {
__classPrivateFieldGet(_this, _Captions_menu, "f").setAttribute('aria-hidden', 'true');
}
}
};
__classPrivateFieldGet(this, _Captions_button, "f").addEventListener('click', __classPrivateFieldGet(this, _Captions_events, "f").button.click, EVENT_OPTIONS);
__classPrivateFieldGet(this, _Captions_events, "f").global.click = function (e) {
var option = e.target;
if (option.closest("#".concat(__classPrivateFieldGet(_this, _Captions_player, "f").id)) && option.classList.contains('op-subtitles__option')) {
var language = option.getAttribute('data-value').replace('captions-', '');
_this._hideCaptions();
if (language === 'off') {
__classPrivateFieldSet(_this, _Captions_currentTrack, undefined, "f");
}
var _iterator3 = _createForOfIteratorHelper(__classPrivateFieldGet(_this, _Captions_mediaTrackList, "f")),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var _track2 = _step3.value;
_track2.mode = _track2.language === language ? 'showing' : 'hidden';
if (_track2.language === language) {
__classPrivateFieldSet(_this, _Captions_currentTrack, _track2, "f");
_this._showCaptions();
}
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
if (detachMenus) {
if (__classPrivateFieldGet(_this, _Captions_button, "f").classList.contains('op-controls__captions--on')) {
__classPrivateFieldGet(_this, _Captions_button, "f").classList.remove('op-controls__captions--on');
__classPrivateFieldGet(_this, _Captions_button, "f").setAttribute('data-active-captions', 'off');
} else {
__classPrivateFieldGet(_this, _Captions_button, "f").classList.add('op-controls__captions--on');
__classPrivateFieldGet(_this, _Captions_button, "f").setAttribute('data-active-captions', language);
}
var captions = __classPrivateFieldGet(_this, _Captions_menu, "f").querySelectorAll('.op-settings__submenu-item');
for (var _i2 = 0, _Array$from2 = Array.from(captions); _i2 < _Array$from2.length; _i2++) {
var caption = _Array$from2[_i2];
caption.setAttribute('aria-checked', 'false');
}
option.parentElement.setAttribute('aria-checked', 'true');
__classPrivateFieldGet(_this, _Captions_menu, "f").setAttribute('aria-hidden', 'false');
} else {
__classPrivateFieldGet(_this, _Captions_button, "f").setAttribute('data-active-captions', language);
}
var event = addEvent('captionschanged');
__classPrivateFieldGet(_this, _Captions_player, "f").getElement().dispatchEvent(event);
}
};
__classPrivateFieldGet(this, _Captions_events, "f").global.cuechange = function (e) {
var _a;
_this._hideCaptions();
var t = e.target;
if (t.mode !== 'showing' || __classPrivateFieldGet(_this, _Captions_button, "f").getAttribute('data-active-captions') === 'off') {
return;
}
if (t.activeCues && ((_a = t.activeCues) === null || _a === void 0 ? void 0 : _a.length) > 0) {
_this._showCaptions();
}
};
if (detachMenus) {
__classPrivateFieldGet(this, _Captions_button, "f").addEventListener('mouseover', __classPrivateFieldGet(this, _Captions_events, "f").button.mouseover, EVENT_OPTIONS);
__classPrivateFieldGet(this, _Captions_menu, "f").addEventListener('mouseover', __classPrivateFieldGet(this, _Captions_events, "f").button.mouseover, EVENT_OPTIONS);
__classPrivateFieldGet(this, _Captions_menu, "f").addEventListener('mouseout', __classPrivateFieldGet(this, _Captions_events, "f").button.mouseout, EVENT_OPTIONS);
__classPrivateFieldGet(this, _Captions_player, "f").getElement().addEventListener('controlshidden', __classPrivateFieldGet(this, _Captions_events, "f").button.mouseout, EVENT_OPTIONS);
}
document.addEventListener('click', __classPrivateFieldGet(this, _Captions_events, "f").global.click, EVENT_OPTIONS);
var _iterator4 = _createForOfIteratorHelper(__classPrivateFieldGet(this, _Captions_mediaTrackList, "f")),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var _track3 = _step4.value;
_track3.mode = _track3.mode !== 'showing' ? 'hidden' : _track3.mode;
_track3.addEventListener('cuechange', __classPrivateFieldGet(this, _Captions_events, "f").global.cuechange, EVENT_OPTIONS);
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
var targetTrack = __classPrivateFieldGet(this, _Captions_player, "f").getElement().querySelector('track:is([kind="subtitles"],[kind="captions"])[default]');
if (targetTrack) {
var matchTrack = __classPrivateFieldGet(this, _Captions_mediaTrackList, "f").find(function (el) {
return el.language === targetTrack.srclang;
});
if (matchTrack) {
this._setDefaultTrack(matchTrack);
}
}
}
}, {
key: "destroy",
value: function destroy() {
var _classPrivateFieldGe3 = __classPrivateFieldGet(this, _Captions_player, "f").getOptions(),
detachMenus = _classPrivateFieldGe3.detachMenus;
if (!__classPrivateFieldGet(this, _Captions_hasTracks, "f")) {
return;
}
var _iterator5 = _createForOfIteratorHelper(__classPrivateFieldGet(this, _Captions_mediaTrackList, "f")),
_step5;
try {
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
var track = _step5.value;
track.removeEventListener('cuechange', __classPrivateFieldGet(this, _Captions_events, "f").global.cuechange);
}
} catch (err) {
_iterator5.e(err);
} finally {
_iterator5.f();
}
document.removeEventListener('click', __classPrivateFieldGet(this, _Captions_events, "f").global.click);
__classPrivateFieldGet(this, _Captions_button, "f").removeEventListener('click', __classPrivateFieldGet(this, _Captions_events, "f").button.click);
if (detachMenus) {
__classPrivateFieldGet(this, _Captions_button, "f").removeEventListener('mouseover', __classPrivateFieldGet(this, _Captions_events, "f").button.mouseover);
__classPrivateFieldGet(this, _Captions_menu, "f").removeEventListener('mouseover', __classPrivateFieldGet(this, _Captions_events, "f").button.mouseover);
__classPrivateFieldGet(this, _Captions_menu, "f").removeEventListener('mouseout', __classPrivateFieldGet(this, _Captions_events, "f").button.mouseout);
__classPrivateFieldGet(this, _Captions_player, "f").getElement().removeEventListener('controlshidden', __classPrivateFieldGet(this, _Captions_events, "f").button.mouseout);
__classPrivateFieldGet(this, _Captions_menu, "f").remove();
}
__classPrivateFieldGet(this, _Captions_button, "f").remove();
}
}, {
key: "addSettings",
value: function addSettings() {
var _classPrivateFieldGe4 = __classPrivateFieldGet(this, _Captions_player, "f").getOptions(),
detachMenus = _classPrivateFieldGe4.detachMenus,
labels = _classPrivateFieldGe4.labels;
if (detachMenus || __classPrivateFieldGet(this, _Captions_mediaTrackList, "f").length <= 1) {
return {};
}
var subitems = this._formatMenuItems();
return subitems.length > 2 ? {
className: 'op-subtitles__option',
default: __classPrivateFieldGet(this, _Captions_default, "f") || 'off',
key: 'captions',
name: (labels === null || labels === void 0 ? void 0 : labels.captions) || '',
subitems: subitems
} : {};
}
}, {
key: "_formatMenuItems",
value: function _formatMenuItems() {
var _classPrivateFieldGe5 = __classPrivateFieldGet(this, _Captions_player, "f").getOptions(),
labels = _classPrivateFieldGe5.labels,
detachMenus = _classPrivateFieldGe5.detachMenus;
if (__classPrivateFieldGet(this, _Captions_mediaTrackList, "f").length <= 1 && !detachMenus) {
return [];
}
var items = [{
key: 'off',
label: (labels === null || labels === void 0 ? void 0 : labels.off) || ''
}];
var _iterator6 = _createForOfIteratorHelper(__classPrivateFieldGet(this, _Captions_mediaTrackList, "f")),
_step6;
try {
var _loop = function _loop() {
var track = _step6.value;
var label = (labels === null || labels === void 0 ? void 0 : labels.lang) ? labels.lang[track.language] : null;
items = items.filter(function (el) {
return el.key !== track.language;
});
items.push({
key: track.language,
label: label || track.label
});
};
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
_loop();
}
} catch (err) {
_iterator6.e(err);
} finally {
_iterator6.f();
}
return items;
}
}, {
key: "_setDefaultTrack",
value: function _setDefaultTrack(track) {
var _a, _b;
track.mode = 'showing';
__classPrivateFieldSet(this, _Captions_default, track.language, "f");
__classPrivateFieldGet(this, _Captions_button, "f").setAttribute('data-active-captions', __classPrivateFieldGet(this, _Captions_default, "f"));
__classPrivateFieldGet(this, _Captions_button, "f").classList.add('op-controls__captions--on');
__classPrivateFieldGet(this, _Captions_captions, "f").classList.add('op-captions--on');
__classPrivateFieldSet(this, _Captions_currentTrack, track, "f");
var options = document.querySelectorAll('.op-settings__submenu-item') || [];
for (var _i3 = 0, _Array$from3 = Array.from(options); _i3 < _Array$from3.length; _i3++) {
var option = _Array$from3[_i3];
option.setAttribute('aria-checked', 'false');
}
(_b = (_a = document.querySelector(".op-subtitles__option[data-value=\"captions-".concat(track.language, "\"]"))) === null || _a === void 0 ? void 0 : _a.parentElement) === null || _b === void 0 ? void 0 : _b.setAttribute('aria-checked', 'true');
}
}, {
key: "_showCaptions",
value: function _showCaptions() {
var _a;
for (var _i4 = 0, _Array$from4 = Array.from(((_a = __classPrivateFieldGet(this, _Captions_currentTrack, "f")) === null || _a === void 0 ? void 0 : _a.activeCues) || []); _i4 < _Array$from4.length; _i4++) {
var cue = _Array$from4[_i4];
var content = (cue === null || cue === void 0 ? void 0 : cue.text) || '';
if (content && __classPrivateFieldGet(this, _Captions_captions, "f")) {
var caption = document.createElement('span');
caption.innerHTML = content;
__classPrivateFieldGet(this, _Captions_captions, "f").prepend(caption);
__classPrivateFieldGet(this, _Captions_captions, "f").classList.add('op-captions--on');
} else {
this._hideCaptions();
}
}
}
}, {
key: "_hideCaptions",
value: function _hideCaptions() {
var _a;
while ((_a = __classPrivateFieldGet(this, _Captions_captions, "f")) === null || _a === void 0 ? void 0 : _a.lastChild) {
__classPrivateFieldGet(this, _Captions_captions, "f").removeChild(__classPrivateFieldGet(this, _Captions_captions, "f").lastChild);
}
}
}]);
}();
_Captions_player = new WeakMap(), _Captions_button = new WeakMap(), _Captions_captions = new WeakMap(), _Captions_menu = new WeakMap(), _Captions_events = new WeakMap(), _Captions_mediaTrackList = new WeakMap(), _Captions_hasTracks = new WeakMap(), _Captions_currentTrack = new WeakMap(), _Captions_default = new WeakMap(), _Captions_controlPosition = new WeakMap(), _Captions_controlLayer = new WeakMap();
/* harmony default export */ var captions = (Captions);
;// ./src/js/controls/fullscreen.ts
var fullscreen_classPrivateFieldSet = undefined && undefined.__classPrivateFieldSet || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;
};
var fullscreen_classPrivateFieldGet = undefined && undefined.__classPrivateFieldGet || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !sta