From 028be22dec323b23727315ef0c34682192991488 Mon Sep 17 00:00:00 2001 From: Sam Potts Date: Sat, 30 Jan 2021 00:06:42 +1100 Subject: chore: removed dist directories from git --- dist/plyr.mjs | 9137 --------------------------------------------------------- 1 file changed, 9137 deletions(-) delete mode 100644 dist/plyr.mjs (limited to 'dist/plyr.mjs') diff --git a/dist/plyr.mjs b/dist/plyr.mjs deleted file mode 100644 index 4630c445..00000000 --- a/dist/plyr.mjs +++ /dev/null @@ -1,9137 +0,0 @@ -function _typeof(obj) { - "@babel/helpers - typeof"; - - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { - return typeof obj; - }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - } - - return _typeof(obj); -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; -} - -function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; -} - -function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - if (enumerableOnly) symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - }); - keys.push.apply(keys, symbols); - } - - return keys; -} - -function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i] != null ? arguments[i] : {}; - - if (i % 2) { - ownKeys(Object(source), true).forEach(function (key) { - _defineProperty(target, key, source[key]); - }); - } else if (Object.getOwnPropertyDescriptors) { - Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); - } else { - ownKeys(Object(source)).forEach(function (key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); - } - } - - return target; -} - -function _objectWithoutPropertiesLoose(source, excluded) { - if (source == null) return {}; - var target = {}; - var sourceKeys = Object.keys(source); - var key, i; - - for (i = 0; i < sourceKeys.length; i++) { - key = sourceKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - target[key] = source[key]; - } - - return target; -} - -function _objectWithoutProperties(source, excluded) { - if (source == null) return {}; - - var target = _objectWithoutPropertiesLoose(source, excluded); - - var key, i; - - if (Object.getOwnPropertySymbols) { - var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - - for (i = 0; i < sourceSymbolKeys.length; i++) { - key = sourceSymbolKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; - target[key] = source[key]; - } - } - - return target; -} - -function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); -} - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; -} - -function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); -} - -function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -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."); -} - -function _classCallCheck$1(e, t) { - if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); -} - -function _defineProperties$1(e, t) { - for (var n = 0; n < t.length; n++) { - var r = t[n]; - r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); - } -} - -function _createClass$1(e, t, n) { - return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e; -} - -function _defineProperty$1(e, t, n) { - return t in e ? Object.defineProperty(e, t, { - value: n, - enumerable: !0, - configurable: !0, - writable: !0 - }) : e[t] = n, e; -} - -function ownKeys$1(e, t) { - var n = Object.keys(e); - - if (Object.getOwnPropertySymbols) { - var r = Object.getOwnPropertySymbols(e); - t && (r = r.filter(function (t) { - return Object.getOwnPropertyDescriptor(e, t).enumerable; - })), n.push.apply(n, r); - } - - return n; -} - -function _objectSpread2$1(e) { - for (var t = 1; t < arguments.length; t++) { - var n = null != arguments[t] ? arguments[t] : {}; - t % 2 ? ownKeys$1(Object(n), !0).forEach(function (t) { - _defineProperty$1(e, t, n[t]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$1(Object(n)).forEach(function (t) { - Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); - }); - } - - return e; -} - -var defaults = { - addCSS: !0, - thumbWidth: 15, - watch: !0 -}; - -function matches(e, t) { - return function () { - return Array.from(document.querySelectorAll(t)).includes(this); - }.call(e, t); -} - -function trigger(e, t) { - if (e && t) { - var n = new Event(t, { - bubbles: !0 - }); - e.dispatchEvent(n); - } -} - -var getConstructor = function getConstructor(e) { - return null != e ? e.constructor : null; -}, - instanceOf = function instanceOf(e, t) { - return !!(e && t && e instanceof t); -}, - isNullOrUndefined = function isNullOrUndefined(e) { - return null == e; -}, - isObject = function isObject(e) { - return getConstructor(e) === Object; -}, - isNumber = function isNumber(e) { - return getConstructor(e) === Number && !Number.isNaN(e); -}, - isString = function isString(e) { - return getConstructor(e) === String; -}, - isBoolean = function isBoolean(e) { - return getConstructor(e) === Boolean; -}, - isFunction = function isFunction(e) { - return getConstructor(e) === Function; -}, - isArray = function isArray(e) { - return Array.isArray(e); -}, - isNodeList = function isNodeList(e) { - return instanceOf(e, NodeList); -}, - isElement = function isElement(e) { - return instanceOf(e, Element); -}, - isEvent = function isEvent(e) { - return instanceOf(e, Event); -}, - isEmpty = function isEmpty(e) { - return isNullOrUndefined(e) || (isString(e) || isArray(e) || isNodeList(e)) && !e.length || isObject(e) && !Object.keys(e).length; -}, - is = { - nullOrUndefined: isNullOrUndefined, - object: isObject, - number: isNumber, - string: isString, - boolean: isBoolean, - function: isFunction, - array: isArray, - nodeList: isNodeList, - element: isElement, - event: isEvent, - empty: isEmpty -}; - -function getDecimalPlaces(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; -} - -function round(e, t) { - if (1 > t) { - var n = getDecimalPlaces(t); - return parseFloat(e.toFixed(n)); - } - - return Math.round(e / t) * t; -} - -var RangeTouch = function () { - function e(t, n) { - _classCallCheck$1(this, e), is.element(t) ? this.element = t : is.string(t) && (this.element = document.querySelector(t)), is.element(this.element) && is.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults, {}, n), this.init()); - } - - return _createClass$1(e, [{ - key: "init", - value: function value() { - 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 value() { - 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 value(e) { - var t = this, - n = e ? "addEventListener" : "removeEventListener"; - ["touchstart", "touchmove", "touchend"].forEach(function (e) { - t.element[n](e, function (e) { - return t.set(e); - }, !1); - }); - } - }, { - key: "get", - value: function value(t) { - if (!e.enabled || !is.event(t)) return null; - var n, - r = t.target, - i = t.changedTouches[0], - o = parseFloat(r.getAttribute("min")) || 0, - s = parseFloat(r.getAttribute("max")) || 100, - u = parseFloat(r.getAttribute("step")) || 1, - c = r.getBoundingClientRect(), - a = 100 / c.width * (this.config.thumbWidth / 2) / 100; - return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u); - } - }, { - key: "set", - value: function value(t) { - e.enabled && is.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, "touchend" === t.type ? "change" : "input")); - } - }], [{ - key: "setup", - value: function value(t) { - var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {}, - r = null; - if (is.empty(t) || is.string(t) ? r = Array.from(document.querySelectorAll(is.string(t) ? t : 'input[type="range"]')) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null; - - var i = _objectSpread2$1({}, defaults, {}, n); - - if (is.string(t) && i.watch) { - var o = new MutationObserver(function (n) { - Array.from(n).forEach(function (n) { - Array.from(n.addedNodes).forEach(function (n) { - is.element(n) && matches(n, t) && new e(n, i); - }); - }); - }); - o.observe(document.body, { - childList: !0, - subtree: !0 - }); - } - - return r.map(function (t) { - return new e(t, n); - }); - } - }, { - key: "enabled", - get: function get() { - return "ontouchstart" in document.documentElement; - } - }]), e; -}(); - -// ========================================================================== -// Type checking utils -// ========================================================================== -var getConstructor$1 = function getConstructor(input) { - return input !== null && typeof input !== 'undefined' ? input.constructor : null; -}; - -var instanceOf$1 = function instanceOf(input, constructor) { - return Boolean(input && constructor && input instanceof constructor); -}; - -var isNullOrUndefined$1 = function isNullOrUndefined(input) { - return input === null || typeof input === 'undefined'; -}; - -var isObject$1 = function isObject(input) { - return getConstructor$1(input) === Object; -}; - -var isNumber$1 = function isNumber(input) { - return getConstructor$1(input) === Number && !Number.isNaN(input); -}; - -var isString$1 = function isString(input) { - return getConstructor$1(input) === String; -}; - -var isBoolean$1 = function isBoolean(input) { - return getConstructor$1(input) === Boolean; -}; - -var isFunction$1 = function isFunction(input) { - return getConstructor$1(input) === Function; -}; - -var isArray$1 = function isArray(input) { - return Array.isArray(input); -}; - -var isWeakMap = function isWeakMap(input) { - return instanceOf$1(input, WeakMap); -}; - -var isNodeList$1 = function isNodeList(input) { - return instanceOf$1(input, NodeList); -}; - -var isTextNode = function isTextNode(input) { - return getConstructor$1(input) === Text; -}; - -var isEvent$1 = function isEvent(input) { - return instanceOf$1(input, Event); -}; - -var isKeyboardEvent = function isKeyboardEvent(input) { - return instanceOf$1(input, KeyboardEvent); -}; - -var isCue = function isCue(input) { - return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue); -}; - -var isTrack = function isTrack(input) { - return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind); -}; - -var isPromise = function isPromise(input) { - return instanceOf$1(input, Promise) && isFunction$1(input.then); -}; - -var isElement$1 = function isElement(input) { - return input !== null && _typeof(input) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object'; -}; - -var isEmpty$1 = function isEmpty(input) { - return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length; -}; - -var isUrl = function isUrl(input) { - // Accept a URL object - if (instanceOf$1(input, window.URL)) { - return true; - } // Must be string from here - - - if (!isString$1(input)) { - return false; - } // Add the protocol if required - - - var string = input; - - if (!input.startsWith('http://') || !input.startsWith('https://')) { - string = "http://".concat(input); - } - - try { - return !isEmpty$1(new URL(string).hostname); - } catch (e) { - return false; - } -}; - -var is$1 = { - nullOrUndefined: isNullOrUndefined$1, - object: isObject$1, - number: isNumber$1, - string: isString$1, - boolean: isBoolean$1, - function: isFunction$1, - array: isArray$1, - weakMap: isWeakMap, - nodeList: isNodeList$1, - element: isElement$1, - textNode: isTextNode, - event: isEvent$1, - keyboardEvent: isKeyboardEvent, - cue: isCue, - track: isTrack, - promise: isPromise, - url: isUrl, - empty: isEmpty$1 -}; - -// ========================================================================== -var transitionEndEvent = function () { - var element = document.createElement('span'); - var events = { - WebkitTransition: 'webkitTransitionEnd', - MozTransition: 'transitionend', - OTransition: 'oTransitionEnd otransitionend', - transition: 'transitionend' - }; - var type = Object.keys(events).find(function (event) { - return element.style[event] !== undefined; - }); - return is$1.string(type) ? events[type] : false; -}(); // Force repaint of element - -function repaint(element, delay) { - setTimeout(function () { - try { - // eslint-disable-next-line no-param-reassign - element.hidden = true; // eslint-disable-next-line no-unused-expressions - - element.offsetHeight; // eslint-disable-next-line no-param-reassign - - element.hidden = false; - } catch (e) {// Do nothing - } - }, delay); -} - -// ========================================================================== -// Browser sniffing -// Unfortunately, due to mixed support, UA sniffing is required -// ========================================================================== -var browser = { - isIE: - /* @cc_on!@ */ - !!document.documentMode, - isEdge: window.navigator.userAgent.includes('Edge'), - isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent), - isIPhone: /(iPhone|iPod)/gi.test(navigator.platform), - isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform) -}; - -function cloneDeep(object) { - return JSON.parse(JSON.stringify(object)); -} // Get a nested value in an object - -function getDeep(object, path) { - return path.split('.').reduce(function (obj, key) { - return obj && obj[key]; - }, object); -} // Deep extend destination object with N more objects - -function extend() { - var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - - for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - sources[_key - 1] = arguments[_key]; - } - - if (!sources.length) { - return target; - } - - var source = sources.shift(); - - if (!is$1.object(source)) { - return target; - } - - Object.keys(source).forEach(function (key) { - if (is$1.object(source[key])) { - if (!Object.keys(target).includes(key)) { - Object.assign(target, _defineProperty({}, key, {})); - } - - extend(target[key], source[key]); - } else { - Object.assign(target, _defineProperty({}, key, source[key])); - } - }); - return extend.apply(void 0, [target].concat(sources)); -} - -function wrap(elements, wrapper) { - // Convert `elements` to an array, if necessary. - var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the - // first element (see `child` below). - - Array.from(targets).reverse().forEach(function (element, index) { - var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling. - - var parent = element.parentNode; - var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current - // parent). - - child.appendChild(element); // If the element had a sibling, insert the wrapper before - // the sibling to maintain the HTML structure; otherwise, just - // append it to the parent. - - if (sibling) { - parent.insertBefore(child, sibling); - } else { - parent.appendChild(child); - } - }); -} // Set attributes - -function setAttributes(element, attributes) { - if (!is$1.element(element) || is$1.empty(attributes)) { - return; - } // Assume null and undefined attributes should be left out, - // Setting them would otherwise convert them to "null" and "undefined" - - - Object.entries(attributes).filter(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - value = _ref2[1]; - - return !is$1.nullOrUndefined(value); - }).forEach(function (_ref3) { - var _ref4 = _slicedToArray(_ref3, 2), - key = _ref4[0], - value = _ref4[1]; - - return element.setAttribute(key, value); - }); -} // Create a DocumentFragment - -function createElement(type, attributes, text) { - // Create a new - var element = document.createElement(type); // Set all passed attributes - - if (is$1.object(attributes)) { - setAttributes(element, attributes); - } // Add text node - - - if (is$1.string(text)) { - element.innerText = text; - } // Return built element - - - return element; -} // Inaert an element after another - -function insertAfter(element, target) { - if (!is$1.element(element) || !is$1.element(target)) { - return; - } - - target.parentNode.insertBefore(element, target.nextSibling); -} // Insert a DocumentFragment - -function insertElement(type, parent, attributes, text) { - if (!is$1.element(parent)) { - return; - } - - parent.appendChild(createElement(type, attributes, text)); -} // Remove element(s) - -function removeElement(element) { - if (is$1.nodeList(element) || is$1.array(element)) { - Array.from(element).forEach(removeElement); - return; - } - - if (!is$1.element(element) || !is$1.element(element.parentNode)) { - return; - } - - element.parentNode.removeChild(element); -} // Remove all child elements - -function emptyElement(element) { - if (!is$1.element(element)) { - return; - } - - var length = element.childNodes.length; - - while (length > 0) { - element.removeChild(element.lastChild); - length -= 1; - } -} // Replace element - -function replaceElement(newChild, oldChild) { - if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) { - return null; - } - - oldChild.parentNode.replaceChild(newChild, oldChild); - return newChild; -} // Get an attribute object from a string selector - -function getAttributesFromSelector(sel, existingAttributes) { - // For example: - // '.test' to { class: 'test' } - // '#test' to { id: 'test' } - // '[data-test="test"]' to { 'data-test': 'test' } - if (!is$1.string(sel) || is$1.empty(sel)) { - return {}; - } - - var attributes = {}; - var existing = extend({}, existingAttributes); - sel.split(',').forEach(function (s) { - // Remove whitespace - var selector = s.trim(); - var className = selector.replace('.', ''); - var stripped = selector.replace(/[[\]]/g, ''); // Get the parts and value - - var parts = stripped.split('='); - - var _parts = _slicedToArray(parts, 1), - key = _parts[0]; - - var value = parts.length > 1 ? parts[1].replace(/["']/g, '') : ''; // Get the first character - - var start = selector.charAt(0); - - switch (start) { - case '.': - // Add to existing classname - if (is$1.string(existing.class)) { - attributes.class = "".concat(existing.class, " ").concat(className); - } else { - attributes.class = className; - } - - break; - - case '#': - // ID selector - attributes.id = selector.replace('#', ''); - break; - - case '[': - // Attribute selector - attributes[key] = value; - break; - } - }); - return extend(existing, attributes); -} // Toggle hidden - -function toggleHidden(element, hidden) { - if (!is$1.element(element)) { - return; - } - - var hide = hidden; - - if (!is$1.boolean(hide)) { - hide = !element.hidden; - } // eslint-disable-next-line no-param-reassign - - - element.hidden = hide; -} // Mirror Element.classList.toggle, with IE compatibility for "force" argument - -function toggleClass(element, className, force) { - if (is$1.nodeList(element)) { - return Array.from(element).map(function (e) { - return toggleClass(e, className, force); - }); - } - - if (is$1.element(element)) { - var method = 'toggle'; - - if (typeof force !== 'undefined') { - method = force ? 'add' : 'remove'; - } - - element.classList[method](className); - return element.classList.contains(className); - } - - return false; -} // Has class name - -function hasClass(element, className) { - return is$1.element(element) && element.classList.contains(className); -} // Element matches selector - -function matches$1(element, selector) { - var _Element = Element, - prototype = _Element.prototype; - - function match() { - return Array.from(document.querySelectorAll(selector)).includes(this); - } - - var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match; - return method.call(element, selector); -} // Closest ancestor element matching selector (also tests element itself) - -function closest(element, selector) { - var _Element2 = Element, - prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill - - function closestElement() { - var el = this; - - do { - if (matches$1.matches(el, selector)) return el; - el = el.parentElement || el.parentNode; - } while (el !== null && el.nodeType === 1); - - return null; - } - - var method = prototype.closest || closestElement; - return method.call(element, selector); -} // Find all elements - -function getElements(selector) { - return this.elements.container.querySelectorAll(selector); -} // Find a single element - -function getElement(selector) { - return this.elements.container.querySelector(selector); -} // Set focus and tab focus class - -function setFocus() { - var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; - var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (!is$1.element(element)) { - return; - } // Set regular focus - - - element.focus({ - preventScroll: true - }); // If we want to mimic keyboard focus via tab - - if (tabFocus) { - toggleClass(element, this.config.classNames.tabFocus); - } -} - -var defaultCodecs = { - 'audio/ogg': 'vorbis', - 'audio/wav': '1', - 'video/webm': 'vp8, vorbis', - 'video/mp4': 'avc1.42E01E, mp4a.40.2', - 'video/ogg': 'theora' -}; // Check for feature support - -var support = { - // Basic support - audio: 'canPlayType' in document.createElement('audio'), - video: 'canPlayType' in document.createElement('video'), - // Check for support - // Basic functionality vs full UI - check: function check(type, provider, playsinline) { - var canPlayInline = browser.isIPhone && playsinline && support.playsinline; - var api = support[type] || provider !== 'html5'; - var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline); - return { - api: api, - ui: ui - }; - }, - // Picture-in-picture support - // Safari & Chrome only currently - pip: function () { - if (browser.isIPhone) { - return false; - } // Safari - // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls - - - if (is$1.function(createElement('video').webkitSetPresentationMode)) { - return true; - } // Chrome - // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture - - - if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) { - return true; - } - - return false; - }(), - // Airplay support - // Safari only currently - airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent), - // Inline playback support - // https://webkit.org/blog/6784/new-video-policies-for-ios/ - playsinline: 'playsInline' in document.createElement('video'), - // Check for mime type support against a player instance - // Credits: http://diveintohtml5.info/everything.html - // Related: http://www.leanbackplayer.com/test/h5mt.html - mime: function mime(input) { - if (is$1.empty(input)) { - return false; - } - - var _input$split = input.split('/'), - _input$split2 = _slicedToArray(_input$split, 1), - mediaType = _input$split2[0]; - - var type = input; // Verify we're using HTML5 and there's no media type mismatch - - if (!this.isHTML5 || mediaType !== this.type) { - return false; - } // Add codec if required - - - if (Object.keys(defaultCodecs).includes(type)) { - type += "; codecs=\"".concat(defaultCodecs[input], "\""); - } - - try { - return Boolean(type && this.media.canPlayType(type).replace(/no/, '')); - } catch (e) { - return false; - } - }, - // Check for textTracks support - textTracks: 'textTracks' in document.createElement('video'), - // Sliders - rangeInput: function () { - var range = document.createElement('input'); - range.type = 'range'; - return range.type === 'range'; - }(), - // Touch - // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event - touch: 'ontouchstart' in document.documentElement, - // Detect transitions support - transitions: transitionEndEvent !== false, - // Reduced motion iOS & MacOS setting - // https://webkit.org/blog/7551/responsive-design-for-motion/ - reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches -}; - -// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md -// https://www.youtube.com/watch?v=NPM6172J22g - -var supportsPassiveListeners = function () { - // Test via a getter in the options object to see if the passive property is accessed - var supported = false; - - try { - var options = Object.defineProperty({}, 'passive', { - get: function get() { - supported = true; - return null; - } - }); - window.addEventListener('test', null, options); - window.removeEventListener('test', null, options); - } catch (e) {// Do nothing - } - - return supported; -}(); // Toggle event listener - - -function toggleListener(element, event, callback) { - var _this = this; - - var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; - var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; - - // Bail if no element, event, or callback - if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) { - return; - } // Allow multiple events - - - var events = event.split(' '); // Build options - // Default to just the capture boolean for browsers with no passive listener support - - var options = capture; // If passive events listeners are supported - - if (supportsPassiveListeners) { - options = { - // Whether the listener can be passive (i.e. default never prevented) - passive: passive, - // Whether the listener is a capturing listener or not - capture: capture - }; - } // If a single node is passed, bind the event listener - - - events.forEach(function (type) { - if (_this && _this.eventListeners && toggle) { - // Cache event listener - _this.eventListeners.push({ - element: element, - type: type, - callback: callback, - options: options - }); - } - - element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options); - }); -} // Bind event handler - -function on(element) { - var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var callback = arguments.length > 2 ? arguments[2] : undefined; - var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; - toggleListener.call(this, element, events, callback, true, passive, capture); -} // Unbind event handler - -function off(element) { - var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var callback = arguments.length > 2 ? arguments[2] : undefined; - var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; - toggleListener.call(this, element, events, callback, false, passive, capture); -} // Bind once-only event handler - -function once(element) { - var _this2 = this; - - var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var callback = arguments.length > 2 ? arguments[2] : undefined; - var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; - - var onceCallback = function onceCallback() { - off(element, events, onceCallback, passive, capture); - - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - callback.apply(_this2, args); - }; - - toggleListener.call(this, element, events, onceCallback, true, passive, capture); -} // Trigger event - -function triggerEvent(element) { - var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - - // Bail if no element - if (!is$1.element(element) || is$1.empty(type)) { - return; - } // Create and dispatch the event - - - var event = new CustomEvent(type, { - bubbles: bubbles, - detail: _objectSpread2(_objectSpread2({}, detail), {}, { - plyr: this - }) - }); // Dispatch the event - - element.dispatchEvent(event); -} // Unbind all cached event listeners - -function unbindListeners() { - if (this && this.eventListeners) { - this.eventListeners.forEach(function (item) { - var element = item.element, - type = item.type, - callback = item.callback, - options = item.options; - element.removeEventListener(type, callback, options); - }); - this.eventListeners = []; - } -} // Run method when / if player is ready - -function ready() { - var _this3 = this; - - return new Promise(function (resolve) { - return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve); - }).then(function () {}); -} - -/** - * Silence a Promise-like object. - * This is useful for avoiding non-harmful, but potentially confusing "uncaught - * play promise" rejection error messages. - * @param {Object} value An object that may or may not be `Promise`-like. - */ - -function silencePromise(value) { - if (is$1.promise(value)) { - value.then(null, function () {}); - } -} - -function validateRatio(input) { - if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) { - return false; - } - - var ratio = is$1.array(input) ? input : input.split(':'); - return ratio.map(Number).every(is$1.number); -} -function reduceAspectRatio(ratio) { - if (!is$1.array(ratio) || !ratio.every(is$1.number)) { - return null; - } - - var _ratio = _slicedToArray(ratio, 2), - width = _ratio[0], - height = _ratio[1]; - - var getDivider = function getDivider(w, h) { - return h === 0 ? w : getDivider(h, w % h); - }; - - var divider = getDivider(width, height); - return [width / divider, height / divider]; -} -function getAspectRatio(input) { - var parse = function parse(ratio) { - return validateRatio(ratio) ? ratio.split(':').map(Number) : null; - }; // Try provided ratio - - - var ratio = parse(input); // Get from config - - if (ratio === null) { - ratio = parse(this.config.ratio); - } // Get from embed - - - if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) { - ratio = this.embed.ratio; - } // Get from HTML5 video - - - if (ratio === null && this.isHTML5) { - var _this$media = this.media, - videoWidth = _this$media.videoWidth, - videoHeight = _this$media.videoHeight; - ratio = reduceAspectRatio([videoWidth, videoHeight]); - } - - return ratio; -} // Set aspect ratio for responsive container - -function setAspectRatio(input) { - if (!this.isVideo) { - return {}; - } - - var wrapper = this.elements.wrapper; - var ratio = getAspectRatio.call(this, input); - - var _ref = is$1.array(ratio) ? ratio : [0, 0], - _ref2 = _slicedToArray(_ref, 2), - w = _ref2[0], - h = _ref2[1]; - - var padding = 100 / w * h; - wrapper.style.paddingBottom = "".concat(padding, "%"); // For Vimeo we have an extra
to hide the standard controls and UI - - if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) { - var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10); - var offset = (height - padding) / (height / 50); - - if (this.fullscreen.active) { - wrapper.style.paddingBottom = null; - } else { - this.media.style.transform = "translateY(-".concat(offset, "%)"); - } - } else if (this.isHTML5) { - wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null); - } - - return { - padding: padding, - ratio: ratio - }; -} - -// ========================================================================== -var html5 = { - getSources: function getSources() { - var _this = this; - - if (!this.isHTML5) { - return []; - } - - var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified) - - return sources.filter(function (source) { - var type = source.getAttribute('type'); - - if (is$1.empty(type)) { - return true; - } - - return support.mime.call(_this, type); - }); - }, - // Get quality levels - getQualityOptions: function getQualityOptions() { - // Whether we're forcing all options (e.g. for streaming) - if (this.config.quality.forced) { - return this.config.quality.options; - } // Get sizes from elements - - - return html5.getSources.call(this).map(function (source) { - return Number(source.getAttribute('size')); - }).filter(Boolean); - }, - setup: function setup() { - if (!this.isHTML5) { - return; - } - - var player = this; // Set speed options from config - - player.options.speed = player.config.speed.options; // Set aspect ratio if fixed - - if (!is$1.empty(this.config.ratio)) { - setAspectRatio.call(player); - } // Quality - - - Object.defineProperty(player.media, 'quality', { - get: function get() { - // Get sources - var sources = html5.getSources.call(player); - var source = sources.find(function (s) { - return s.getAttribute('src') === player.source; - }); // Return size, if match is found - - return source && Number(source.getAttribute('size')); - }, - set: function set(input) { - if (player.quality === input) { - return; - } // If we're using an an external handler... - - - if (player.config.quality.forced && is$1.function(player.config.quality.onChange)) { - player.config.quality.onChange(input); - } else { - // Get sources - var sources = html5.getSources.call(player); // Get first match for requested size - - var source = sources.find(function (s) { - return Number(s.getAttribute('size')) === input; - }); // No matching source found - - if (!source) { - return; - } // Get current state - - - var _player$media = player.media, - currentTime = _player$media.currentTime, - paused = _player$media.paused, - preload = _player$media.preload, - readyState = _player$media.readyState, - playbackRate = _player$media.playbackRate; // Set new source - - player.media.src = source.getAttribute('src'); // Prevent loading if preload="none" and the current source isn't loaded (#1044) - - if (preload !== 'none' || readyState) { - // Restore time - player.once('loadedmetadata', function () { - player.speed = playbackRate; - player.currentTime = currentTime; // Resume playing - - if (!paused) { - silencePromise(player.play()); - } - }); // Load new source - - player.media.load(); - } - } // Trigger change event - - - triggerEvent.call(player, player.media, 'qualitychange', false, { - quality: input - }); - } - }); - }, - // Cancel current network requests - // See https://github.com/sampotts/plyr/issues/174 - cancelRequests: function cancelRequests() { - if (!this.isHTML5) { - return; - } // Remove child sources - - - removeElement(html5.getSources.call(this)); // Set blank video src attribute - // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error - // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection - - this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source - // This will cancel existing requests - // See https://github.com/sampotts/plyr/issues/174 - - this.media.load(); // Debugging - - this.debug.log('Cancelled network requests'); - } -}; - -// ========================================================================== - -function dedupe(array) { - if (!is$1.array(array)) { - return array; - } - - return array.filter(function (item, index) { - return array.indexOf(item) === index; - }); -} // Get the closest value in an array - -function closest$1(array, value) { - if (!is$1.array(array) || !array.length) { - return null; - } - - return array.reduce(function (prev, curr) { - return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev; - }); -} - -// ========================================================================== - -function generateId(prefix) { - return "".concat(prefix, "-").concat(Math.floor(Math.random() * 10000)); -} // Format string - -function format(input) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - if (is$1.empty(input)) { - return input; - } - - return input.toString().replace(/{(\d+)}/g, function (match, i) { - return args[i].toString(); - }); -} // Get percentage - -function getPercentage(current, max) { - if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) { - return 0; - } - - return (current / max * 100).toFixed(2); -} // Replace all occurances of a string in a string - -var replaceAll = function replaceAll() { - var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString()); -}; // Convert to title case - -var toTitleCase = function toTitleCase() { - var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - return input.toString().replace(/\w\S*/g, function (text) { - return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase(); - }); -}; // Convert string to pascalCase - -function toPascalCase() { - var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - var string = input.toString(); // Convert kebab case - - string = replaceAll(string, '-', ' '); // Convert snake case - - string = replaceAll(string, '_', ' '); // Convert to title case - - string = toTitleCase(string); // Convert to pascal case - - return replaceAll(string, ' ', ''); -} // Convert string to pascalCase - -function toCamelCase() { - var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - var string = input.toString(); // Convert to pascal case - - string = toPascalCase(string); // Convert first character to lowercase - - return string.charAt(0).toLowerCase() + string.slice(1); -} // Remove HTML from a string - -function stripHTML(source) { - var fragment = document.createDocumentFragment(); - var element = document.createElement('div'); - fragment.appendChild(element); - element.innerHTML = source; - return fragment.firstChild.innerText; -} // Like outerHTML, but also works for DocumentFragment - -function getHTML(element) { - var wrapper = document.createElement('div'); - wrapper.appendChild(element); - return wrapper.innerHTML; -} - -var resources = { - pip: 'PIP', - airplay: 'AirPlay', - html5: 'HTML5', - vimeo: 'Vimeo', - youtube: 'YouTube' -}; -var i18n = { - get: function get() { - var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - if (is$1.empty(key) || is$1.empty(config)) { - return ''; - } - - var string = getDeep(config.i18n, key); - - if (is$1.empty(string)) { - if (Object.keys(resources).includes(key)) { - return resources[key]; - } - - return ''; - } - - var replace = { - '{seektime}': config.seekTime, - '{title}': config.title - }; - Object.entries(replace).forEach(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - k = _ref2[0], - v = _ref2[1]; - - string = replaceAll(string, k, v); - }); - return string; - } -}; - -var Storage = /*#__PURE__*/function () { - function Storage(player) { - var _this = this; - - _classCallCheck(this, Storage); - - _defineProperty(this, "get", function (key) { - if (!Storage.supported || !_this.enabled) { - return null; - } - - var store = window.localStorage.getItem(_this.key); - - if (is$1.empty(store)) { - return null; - } - - var json = JSON.parse(store); - return is$1.string(key) && key.length ? json[key] : json; - }); - - _defineProperty(this, "set", function (object) { - // Bail if we don't have localStorage support or it's disabled - if (!Storage.supported || !_this.enabled) { - return; - } // Can only store objectst - - - if (!is$1.object(object)) { - return; - } // Get current storage - - - var storage = _this.get(); // Default to empty object - - - if (is$1.empty(storage)) { - storage = {}; - } // Update the working copy of the values - - - extend(storage, object); // Update storage - - window.localStorage.setItem(_this.key, JSON.stringify(storage)); - }); - - this.enabled = player.config.storage.enabled; - this.key = player.config.storage.key; - } // Check for actual support (see if we can use it) - - - _createClass(Storage, null, [{ - key: "supported", - get: function get() { - try { - if (!('localStorage' in window)) { - return false; - } - - var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode) - // see: https://github.com/sampotts/plyr/issues/131 - - window.localStorage.setItem(test, test); - window.localStorage.removeItem(test); - return true; - } catch (e) { - return false; - } - } - }]); - - return Storage; -}(); - -// ========================================================================== -// Fetch wrapper -// Using XHR to avoid issues with older browsers -// ========================================================================== -function fetch(url) { - var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text'; - return new Promise(function (resolve, reject) { - try { - var request = new XMLHttpRequest(); // Check for CORS support - - if (!('withCredentials' in request)) { - return; - } - - request.addEventListener('load', function () { - if (responseType === 'text') { - try { - resolve(JSON.parse(request.responseText)); - } catch (e) { - resolve(request.responseText); - } - } else { - resolve(request.response); - } - }); - request.addEventListener('error', function () { - throw new Error(request.status); - }); - request.open('GET', url, true); // Set the required response type - - request.responseType = responseType; - request.send(); - } catch (e) { - reject(e); - } - }); -} - -// ========================================================================== - -function loadSprite(url, id) { - if (!is$1.string(url)) { - return; - } - - var prefix = 'cache'; - var hasId = is$1.string(id); - var isCached = false; - - var exists = function exists() { - return document.getElementById(id) !== null; - }; - - var update = function update(container, data) { - // eslint-disable-next-line no-param-reassign - container.innerHTML = data; // Check again incase of race condition - - if (hasId && exists()) { - return; - } // Inject the SVG to the body - - - document.body.insertAdjacentElement('afterbegin', container); - }; // Only load once if ID set - - - if (!hasId || !exists()) { - var useStorage = Storage.supported; // Create container - - var container = document.createElement('div'); - container.setAttribute('hidden', ''); - - if (hasId) { - container.setAttribute('id', id); - } // Check in cache - - - if (useStorage) { - var cached = window.localStorage.getItem("".concat(prefix, "-").concat(id)); - isCached = cached !== null; - - if (isCached) { - var data = JSON.parse(cached); - update(container, data.content); - } - } // Get the sprite - - - fetch(url).then(function (result) { - if (is$1.empty(result)) { - return; - } - - if (useStorage) { - window.localStorage.setItem("".concat(prefix, "-").concat(id), JSON.stringify({ - content: result - })); - } - - update(container, result); - }).catch(function () {}); - } -} - -// ========================================================================== - -var getHours = function getHours(value) { - return Math.trunc(value / 60 / 60 % 60, 10); -}; -var getMinutes = function getMinutes(value) { - return Math.trunc(value / 60 % 60, 10); -}; -var getSeconds = function getSeconds(value) { - return Math.trunc(value % 60, 10); -}; // Format time to UI friendly string - -function formatTime() { - var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - // Bail if the value isn't a number - if (!is$1.number(time)) { - return formatTime(undefined, displayHours, inverted); - } // Format time component to add leading zero - - - var format = function format(value) { - return "0".concat(value).slice(-2); - }; // Breakdown to hours, mins, secs - - - var hours = getHours(time); - var mins = getMinutes(time); - var secs = getSeconds(time); // Do we need to display hours? - - if (displayHours || hours > 0) { - hours = "".concat(hours, ":"); - } else { - hours = ''; - } // Render - - - return "".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), ":").concat(format(secs)); -} - -var controls = { - // Get icon URL - getIconUrl: function getIconUrl() { - var url = new URL(this.config.iconUrl, window.location); - var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody; - return { - url: this.config.iconUrl, - cors: cors - }; - }, - // Find the UI controls - findElements: function findElements() { - try { - this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons - - this.elements.buttons = { - play: getElements.call(this, this.config.selectors.buttons.play), - pause: getElement.call(this, this.config.selectors.buttons.pause), - restart: getElement.call(this, this.config.selectors.buttons.restart), - rewind: getElement.call(this, this.config.selectors.buttons.rewind), - fastForward: getElement.call(this, this.config.selectors.buttons.fastForward), - mute: getElement.call(this, this.config.selectors.buttons.mute), - pip: getElement.call(this, this.config.selectors.buttons.pip), - airplay: getElement.call(this, this.config.selectors.buttons.airplay), - settings: getElement.call(this, this.config.selectors.buttons.settings), - captions: getElement.call(this, this.config.selectors.buttons.captions), - fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen) - }; // Progress - - this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs - - this.elements.inputs = { - seek: getElement.call(this, this.config.selectors.inputs.seek), - volume: getElement.call(this, this.config.selectors.inputs.volume) - }; // Display - - this.elements.display = { - buffer: getElement.call(this, this.config.selectors.display.buffer), - currentTime: getElement.call(this, this.config.selectors.display.currentTime), - duration: getElement.call(this, this.config.selectors.display.duration) - }; // Seek tooltip - - if (is$1.element(this.elements.progress)) { - this.elements.display.seekTooltip = this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip)); - } - - return true; - } catch (error) { - // Log it - this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls - - this.toggleNativeControls(true); - return false; - } - }, - // Create icon - createIcon: function createIcon(type, attributes) { - var namespace = 'http://www.w3.org/2000/svg'; - var iconUrl = controls.getIconUrl.call(this); - var iconPath = "".concat(!iconUrl.cors ? iconUrl.url : '', "#").concat(this.config.iconPrefix); // Create - - var icon = document.createElementNS(namespace, 'svg'); - setAttributes(icon, extend(attributes, { - 'aria-hidden': 'true', - focusable: 'false' - })); // Create the to reference sprite - - var use = document.createElementNS(namespace, 'use'); - var path = "".concat(iconPath, "-").concat(type); // Set `href` attributes - // https://github.com/sampotts/plyr/issues/460 - // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href - - if ('href' in use) { - use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path); - } // Always set the older attribute even though it's "deprecated" (it'll be around for ages) - - - use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add to - - icon.appendChild(use); - return icon; - }, - // Create hidden text label - createLabel: function createLabel(key) { - var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var text = i18n.get(key, this.config); - - var attributes = _objectSpread2(_objectSpread2({}, attr), {}, { - class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ') - }); - - return createElement('span', attributes, text); - }, - // Create a badge - createBadge: function createBadge(text) { - if (is$1.empty(text)) { - return null; - } - - var badge = createElement('span', { - class: this.config.classNames.menu.value - }); - badge.appendChild(createElement('span', { - class: this.config.classNames.menu.badge - }, text)); - return badge; - }, - // Create a
if needed - - if (is$1.empty(source)) { - source = player.media.getAttribute(player.config.attributes.embed.id); - } - - var id = parseId(source); // Build an iframe - - var iframe = createElement('iframe'); - var src = format(player.config.urls.vimeo.iframe, id, params); - iframe.setAttribute('src', src); - iframe.setAttribute('allowfullscreen', ''); - iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; ')); // Set the referrer policy if required - - if (!is$1.empty(referrerPolicy)) { - iframe.setAttribute('referrerPolicy', referrerPolicy); - } // Inject the package - - - if (premium || !config.customControls) { - iframe.setAttribute('data-poster', player.poster); - player.media = replaceElement(iframe, player.media); - } else { - var wrapper = createElement('div', { - class: player.config.classNames.embedContainer, - 'data-poster': player.poster - }); - wrapper.appendChild(iframe); - player.media = replaceElement(wrapper, player.media); - } // Get poster image - - - if (!config.customControls) { - fetch(format(player.config.urls.vimeo.api, src)).then(function (response) { - if (is$1.empty(response) || !response.thumbnail_url) { - return; - } // Set and show poster - - - ui.setPoster.call(player, response.thumbnail_url).catch(function () {}); - }); - } // Setup instance - // https://github.com/vimeo/player.js - - - player.embed = new window.Vimeo.Player(iframe, { - autopause: player.config.autopause, - muted: player.muted - }); - player.media.paused = true; - player.media.currentTime = 0; // Disable native text track rendering - - if (player.supported.ui) { - player.embed.disableTextTrack(); - } // Create a faux HTML5 API using the Vimeo API - - - player.media.play = function () { - assurePlaybackState.call(player, true); - return player.embed.play(); - }; - - player.media.pause = function () { - assurePlaybackState.call(player, false); - return player.embed.pause(); - }; - - player.media.stop = function () { - player.pause(); - player.currentTime = 0; - }; // Seeking - - - var currentTime = player.media.currentTime; - Object.defineProperty(player.media, 'currentTime', { - get: function get() { - return currentTime; - }, - set: function set(time) { - // Vimeo will automatically play on seek if the video hasn't been played before - // Get current paused state and volume etc - var embed = player.embed, - media = player.media, - paused = player.paused, - volume = player.volume; - var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event - - media.seeking = true; - triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete - - Promise.resolve(restorePause && embed.setVolume(0)) // Seek - .then(function () { - return embed.setCurrentTime(time); - }) // Restore paused - .then(function () { - return restorePause && embed.pause(); - }) // Restore volume - .then(function () { - return restorePause && embed.setVolume(volume); - }).catch(function () {// Do nothing - }); - } - }); // Playback speed - - var speed = player.config.speed.selected; - Object.defineProperty(player.media, 'playbackRate', { - get: function get() { - return speed; - }, - set: function set(input) { - player.embed.setPlaybackRate(input).then(function () { - speed = input; - triggerEvent.call(player, player.media, 'ratechange'); - }).catch(function () { - // Cannot set Playback Rate, Video is probably not on Pro account - player.options.speed = [1]; - }); - } - }); // Volume - - var volume = player.config.volume; - Object.defineProperty(player.media, 'volume', { - get: function get() { - return volume; - }, - set: function set(input) { - player.embed.setVolume(input).then(function () { - volume = input; - triggerEvent.call(player, player.media, 'volumechange'); - }); - } - }); // Muted - - var muted = player.config.muted; - Object.defineProperty(player.media, 'muted', { - get: function get() { - return muted; - }, - set: function set(input) { - var toggle = is$1.boolean(input) ? input : false; - player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () { - muted = toggle; - triggerEvent.call(player, player.media, 'volumechange'); - }); - } - }); // Loop - - var loop = player.config.loop; - Object.defineProperty(player.media, 'loop', { - get: function get() { - return loop; - }, - set: function set(input) { - var toggle = is$1.boolean(input) ? input : player.config.loop.active; - player.embed.setLoop(toggle).then(function () { - loop = toggle; - }); - } - }); // Source - - var currentSrc; - player.embed.getVideoUrl().then(function (value) { - currentSrc = value; - controls.setDownloadUrl.call(player); - }).catch(function (error) { - _this.debug.warn(error); - }); - Object.defineProperty(player.media, 'currentSrc', { - get: function get() { - return currentSrc; - } - }); // Ended - - Object.defineProperty(player.media, 'ended', { - get: function get() { - return player.currentTime === player.duration; - } - }); // Set aspect ratio based on video size - - Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) { - var _dimensions = _slicedToArray(dimensions, 2), - width = _dimensions[0], - height = _dimensions[1]; - - player.embed.ratio = [width, height]; - setAspectRatio.call(_this); - }); // Set autopause - - player.embed.setAutopause(player.config.autopause).then(function (state) { - player.config.autopause = state; - }); // Get title - - player.embed.getVideoTitle().then(function (title) { - player.config.title = title; - ui.setTitle.call(_this); - }); // Get current time - - player.embed.getCurrentTime().then(function (value) { - currentTime = value; - triggerEvent.call(player, player.media, 'timeupdate'); - }); // Get duration - - player.embed.getDuration().then(function (value) { - player.media.duration = value; - triggerEvent.call(player, player.media, 'durationchange'); - }); // Get captions - - player.embed.getTextTracks().then(function (tracks) { - player.media.textTracks = tracks; - captions.setup.call(player); - }); - player.embed.on('cuechange', function (_ref) { - var _ref$cues = _ref.cues, - cues = _ref$cues === void 0 ? [] : _ref$cues; - var strippedCues = cues.map(function (cue) { - return stripHTML(cue.text); - }); - captions.updateCues.call(player, strippedCues); - }); - player.embed.on('loaded', function () { - // Assure state and events are updated on autoplay - player.embed.getPaused().then(function (paused) { - assurePlaybackState.call(player, !paused); - - if (!paused) { - triggerEvent.call(player, player.media, 'playing'); - } - }); - - if (is$1.element(player.embed.element) && player.supported.ui) { - var frame = player.embed.element; // Fix keyboard focus issues - // https://github.com/sampotts/plyr/issues/317 - - frame.setAttribute('tabindex', -1); - } - }); - player.embed.on('bufferstart', function () { - triggerEvent.call(player, player.media, 'waiting'); - }); - player.embed.on('bufferend', function () { - triggerEvent.call(player, player.media, 'playing'); - }); - player.embed.on('play', function () { - assurePlaybackState.call(player, true); - triggerEvent.call(player, player.media, 'playing'); - }); - player.embed.on('pause', function () { - assurePlaybackState.call(player, false); - }); - player.embed.on('timeupdate', function (data) { - player.media.seeking = false; - currentTime = data.seconds; - triggerEvent.call(player, player.media, 'timeupdate'); - }); - player.embed.on('progress', function (data) { - player.media.buffered = data.percent; - triggerEvent.call(player, player.media, 'progress'); // Check all loaded - - if (parseInt(data.percent, 10) === 1) { - triggerEvent.call(player, player.media, 'canplaythrough'); - } // Get duration as if we do it before load, it gives an incorrect value - // https://github.com/sampotts/plyr/issues/891 - - - player.embed.getDuration().then(function (value) { - if (value !== player.media.duration) { - player.media.duration = value; - triggerEvent.call(player, player.media, 'durationchange'); - } - }); - }); - player.embed.on('seeked', function () { - player.media.seeking = false; - triggerEvent.call(player, player.media, 'seeked'); - }); - player.embed.on('ended', function () { - player.media.paused = true; - triggerEvent.call(player, player.media, 'ended'); - }); - player.embed.on('error', function (detail) { - player.media.error = detail; - triggerEvent.call(player, player.media, 'error'); - }); // Rebuild UI - - if (config.customControls) { - setTimeout(function () { - return ui.build.call(player); - }, 0); - } - } -}; - -// ========================================================================== - -function parseId$1(url) { - if (is$1.empty(url)) { - return null; - } - - var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/; - return url.match(regex) ? RegExp.$2 : url; -} // Set playback state and trigger change (only on actual change) - - -function assurePlaybackState$1(play) { - if (play && !this.embed.hasPlayed) { - this.embed.hasPlayed = true; - } - - if (this.media.paused === play) { - this.media.paused = !play; - triggerEvent.call(this, this.media, play ? 'play' : 'pause'); - } -} - -function getHost(config) { - if (config.noCookie) { - return 'https://www.youtube-nocookie.com'; - } - - if (window.location.protocol === 'http:') { - return 'http://www.youtube.com'; - } // Use YouTube's default - - - return undefined; -} - -var youtube = { - setup: function setup() { - var _this = this; - - // Add embed class for responsive - toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API - - if (is$1.object(window.YT) && is$1.function(window.YT.Player)) { - youtube.ready.call(this); - } else { - // Reference current global callback - var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue - - window.onYouTubeIframeAPIReady = function () { - // Call global callback if set - if (is$1.function(callback)) { - callback(); - } - - youtube.ready.call(_this); - }; // Load the SDK - - - loadScript(this.config.urls.youtube.sdk).catch(function (error) { - _this.debug.warn('YouTube API failed to load', error); - }); - } - }, - // Get the media title - getTitle: function getTitle(videoId) { - var _this2 = this; - - var url = format(this.config.urls.youtube.api, videoId); - fetch(url).then(function (data) { - if (is$1.object(data)) { - var title = data.title, - height = data.height, - width = data.width; // Set title - - _this2.config.title = title; - ui.setTitle.call(_this2); // Set aspect ratio - - _this2.embed.ratio = [width, height]; - } - - setAspectRatio.call(_this2); - }).catch(function () { - // Set aspect ratio - setAspectRatio.call(_this2); - }); - }, - // API ready - ready: function ready() { - var player = this; - var config = player.config.youtube; // Ignore already setup (race condition) - - var currentId = player.media && player.media.getAttribute('id'); - - if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) { - return; - } // Get the source URL or ID - - - var source = player.media.getAttribute('src'); // Get from
if needed - - if (is$1.empty(source)) { - source = player.media.getAttribute(this.config.attributes.embed.id); - } // Replace the