{"version":3,"file":"index.min.js","sources":["../../../node_modules/eventemitter3/index.js","../src/utils/debug.js","../src/utils/xgplayerTimeRange.js","../src/utils/util.js","../src/utils/sniffer.js","../src/version.js","../src/error.js","../src/events.js","../src/proxy.js","../src/utils/database.js","../src/constant.js","../src/plugin/hooksDescriptor.js","../src/plugin/basePlugin.js","../../../node_modules/delegate/src/closest.js","../../../node_modules/delegate/src/delegate.js","../src/plugin/plugin.js","../src/plugin/resizeObserver.js","../src/plugin/pluginsManager.js","../src/stateClassMap.js","../src/defaultConfig.js","../src/plugin/preset.js","../src/state.js","../src/plugins/controls/index.js","../src/lang/i18n.js","../src/lang/en.js","../src/player.js","../src/plugins/logger/index.js","../src/plugins/replay/index.js","../src/plugins/poster/index.js","../src/plugins/start/index.js","../src/plugins/enter/index.js","../src/plugins/miniScreen/miniScreenIcon.js","../src/utils/draggabilly.js","../src/plugins/miniScreen/index.js","../src/plugins/pc/index.js","../src/plugins/mobile/touch.js","../src/plugins/mobile/index.js","../src/plugins/keyboard/index.js","../src/plugins/loading/index.js","../src/plugins/progress/innerList.js","../src/plugins/progress/index.js","../src/plugins/common/iconPlugin.js","../src/plugins/play/index.js","../src/plugins/fullscreen/backicon.js","../src/plugins/fullscreen/index.js","../src/plugins/time/index.js","../src/plugins/volume/index.js","../src/plugins/rotate/index.js","../src/plugins/pip/index.js","../src/plugins/playNext/index.js","../../../node_modules/downloadjs/download.js","../src/plugins/download/index.js","../src/plugins/screenShot/index.js","../src/plugins/common/optionList.js","../src/plugins/common/optionsIcon.js","../src/plugins/definition/index.js","../src/plugins/playbackRate/index.js","../src/plugins/cssFullScreen/index.js","../src/plugins/error/index.js","../src/plugins/prompt/index.js","../src/plugins/progressPreview/dotsApi.js","../src/plugins/progressPreview/index.js","../src/plugins/common/thumbnail.js","../src/plugins/progress/miniProgress.js","../src/plugins/dynamicBg/index.js","../src/plugins/stats/index.js","../src/plugins/gapJump/index.js","../src/plugins/waitingTimeoutJump/index.js","../src/plugins/testspeed/index.js","../src/presets/default.js","../src/lang/zh-cn.js","../src/index.umd.js"],"sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","\nconst XG_DEBUG_OPEN = typeof (window) !== 'undefined' && window.location && window.location.href.indexOf('xgplayerdebugger=1') > -1\n\nconst STYLE = {\n info: 'color: #525252; background-color: #90ee90;',\n error: 'color: #525252; background-color: red;',\n warn: 'color: #525252; background-color: yellow; '\n}\n\nconst XGTAG = '%c[xgplayer]'\n\nconst XG_DEBUG = {\n config: {\n debug: XG_DEBUG_OPEN ? 3 : 1\n },\n\n logInfo: function (message, ...optionalParams) {\n this.config.debug >= 3 && console.log(XGTAG, STYLE.info, message, ...optionalParams)\n },\n\n logWarn: function (message, ...optionalParams) {\n this.config.debug >= 1 && console.warn(XGTAG, STYLE.warn, message, ...optionalParams)\n },\n\n logError: function (message, ...optionalParams) {\n if (this.config.debug < 1) {\n return\n }\n const _fun = this.config.debug >= 2 ? 'trace' : 'error'\n console[_fun](XGTAG, STYLE.error, message, ...optionalParams)\n }\n}\n\nfunction bindDebug (player) {\n player.logInfo = XG_DEBUG.logInfo.bind(player)\n player.logWarn = XG_DEBUG.logWarn.bind(player)\n player.logError = XG_DEBUG.logError.bind(player)\n}\n\nexport {\n XG_DEBUG as default,\n bindDebug\n}\n","export default class XgplayerTimeRange {\n constructor (bufferedList) {\n this.bufferedList = bufferedList\n }\n\n start (index) {\n return this.bufferedList[index].start\n }\n\n end (index) {\n return this.bufferedList[index].end\n }\n\n get length () {\n return this.bufferedList.length\n }\n}\n","import XG_DEBUG from './debug'\nimport XgplayerTimeRange from './xgplayerTimeRange'\nconst util = {}\n\n/**\n *\n * @param { string } el\n * @param { string } [tpl=]\n * @param { {[propName: string]: any }} [attrs={}]\n * @param { string } [cname='']\n * @returns { HTMLElement | null }\n */\nutil.createDom = function (el = 'div', tpl = '', attrs = {}, cname = '') {\n const dom = document.createElement(el)\n dom.className = cname\n dom.innerHTML = tpl\n Object.keys(attrs).forEach(item => {\n const key = item\n const value = attrs[item]\n if (el === 'video' || el === 'audio' || el === 'live-video') {\n if (value) {\n dom.setAttribute(key, value)\n }\n } else {\n dom.setAttribute(key, value)\n }\n })\n return dom\n}\n\n/**\n *\n * @param { string } html\n * @param { string } [attrs={}]\n * @param { string } [classname=\"\"]\n * @returns { HTMLElement | null }\n */\nutil.createDomFromHtml = function (html, attrs = {}, classname = '') {\n try {\n let doc = document.createElement('div')\n doc.innerHTML = html\n let dom = doc.children\n doc = null\n if (dom.length > 0) {\n dom = dom[0]\n classname && util.addClass(dom, classname)\n if (attrs) {\n Object.keys(attrs).forEach(key => {\n dom.setAttribute(key, attrs[key])\n })\n }\n return dom\n }\n return null\n } catch (err) {\n XG_DEBUG.logError('util.createDomFromHtml', err)\n return null\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { boolean }\n */\nutil.hasClass = function (el, className) {\n if (!el || !className) {\n return false\n }\n try {\n return Array.prototype.some.call(el.classList, item => item === className)\n } catch (e) {\n const orgClassName = el.className && typeof el.className === 'object' ? el.getAttribute('class') : el.className\n return orgClassName && !!orgClassName.match(new RegExp('(\\\\s|^)' + className + '(\\\\s|$)'))\n }\n // if (el.classList) {\n // return Array.prototype.some.call(el.classList, item => item === className)\n // } else {\n // const orgClassName = el.className && typeof el.className === 'object' ? el.getAttribute('class') : el.className\n // return orgClassName && !!orgClassName.match(new RegExp('(\\\\s|^)' + className + '(\\\\s|$)'))\n // }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.addClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.add(item)\n })\n } catch (e) {\n if (!util.hasClass(el, className)) {\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class') + ' ' + className)\n } else {\n el.className += ' ' + className\n }\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.removeClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.remove(item)\n })\n } catch (e) {\n if (util.hasClass(el, className)) {\n className.split(/\\s+/g).forEach(item => {\n const reg = new RegExp('(\\\\s|^)' + item + '(\\\\s|$)')\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class').replace(reg, ' '))\n } else {\n el.className = el.className.replace(reg, ' ')\n }\n })\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.toggleClass = function (el, className) {\n if (!el) {\n return\n }\n\n className.split(/\\s+/g).forEach(item => {\n if (util.hasClass(el, item)) {\n util.removeClass(el, item)\n } else {\n util.addClass(el, item)\n }\n })\n}\n\n/**\n *\n * @param { string | Object } args0\n * @param { string } [className]\n * @returns { string }\n */\nutil.classNames = function () {\n const classname = []\n for (let i = 0; i < arguments.length; i++) {\n if (util.typeOf(arguments[i]) === 'String') {\n // classname += `${arguments[i]}`\n classname.push(arguments[i])\n } else if (util.typeOf(arguments[i]) === 'Object') {\n Object.keys(arguments[i]).map(key => {\n if (arguments[i][key]) {\n // classname += key\n classname.push(key)\n }\n })\n }\n // if (i < arguments.length - 1) {\n // classname += ' '\n // }\n }\n return classname.join(' ')\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } sel\n * @returns { HTMLElement }\n */\nutil.findDom = function (el = document, sel) {\n let dom\n // fix querySelector IDs that start with a digit\n // https://stackoverflow.com/questions/37270787/uncaught-syntaxerror-failed-to-execute-queryselector-on-document\n try {\n dom = el.querySelector(sel)\n } catch (e) {\n XG_DEBUG.logError('util.findDom', e)\n if (sel.indexOf('#') === 0) {\n dom = el.getElementById(sel.slice(1))\n }\n }\n return dom\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } key\n * @returns { any }\n */\nutil.getCss = function (dom, key) {\n return dom.currentStyle ? dom.currentStyle[key] : document.defaultView.getComputedStyle(dom, false)[key]\n}\n\nutil.padStart = function (str, length, pad) {\n const charstr = String(pad)\n const len = length >> 0\n let maxlen = Math.ceil(len / charstr.length)\n const chars = []\n const r = String(str)\n while (maxlen--) {\n chars.push(charstr)\n }\n return chars.join('').substring(0, len - r.length) + r\n}\n\n/**\n *\n * @param { number } time\n * @returns { string }\n */\nutil.format = function (time) {\n if (window.isNaN(time)) {\n return ''\n }\n time = Math.round(time)\n const hour = util.padStart(Math.floor(time / 3600), 2, 0)\n const minute = util.padStart(Math.floor((time - hour * 3600) / 60), 2, 0)\n const second = util.padStart(Math.floor((time - hour * 3600 - minute * 60)), 2, 0)\n return (hour === '00' ? [minute, second] : [hour, minute, second]).join(':')\n}\n\n/**\n *\n * @param { Object } e\n * @returns { Object }\n */\nutil.event = function (e) {\n if (e.touches) {\n const touch = e.touches[0] || e.changedTouches[0]\n e.clientX = touch.clientX || 0\n e.clientY = touch.clientY || 0\n e.offsetX = touch.pageX - touch.target.offsetLeft\n e.offsetY = touch.pageY - touch.target.offsetTop\n }\n e._target = e.target || e.srcElement\n}\n\n/**\n *\n * @param { any } obj\n * @returns { string }\n */\nutil.typeOf = function (obj) {\n // eslint-disable-next-line no-lookahead-lookbehind-regexp/no-lookahead-lookbehind-regexp\n return Object.prototype.toString.call(obj).match(/([^\\s.*]+)(?=]$)/g)[0]\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepCopy = function (dst, src) {\n if (util.typeOf(src) === 'Object' && util.typeOf(dst) === 'Object') {\n Object.keys(src).forEach(key => {\n // eslint-disable-next-line no-undef\n if (util.typeOf(src[key]) === 'Object' && !(src[key] instanceof Node)) {\n if (dst[key] === undefined || dst[key] === undefined) {\n dst[key] = src[key]\n } else {\n util.deepCopy(dst[key], src[key])\n }\n } else if (util.typeOf(src[key]) === 'Array') {\n dst[key] = util.typeOf(dst[key]) === 'Array' ? dst[key].concat(src[key]) : src[key]\n } else {\n dst[key] = src[key]\n }\n })\n return dst\n }\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepMerge = function (dst, src) {\n Object.keys(src).map(key => {\n if (util.typeOf(src[key]) === 'Array' && util.typeOf(dst[key]) === 'Array') {\n if (util.typeOf(dst[key]) === 'Array') {\n dst[key].push(...src[key])\n }\n } else if (util.typeOf(dst[key]) === util.typeOf(src[key]) && dst[key] !== null && util.typeOf(dst[key]) === 'Object' && !(src[key] instanceof window.Node)) {\n util.deepMerge(dst[key], src[key])\n } else {\n src[key] !== null && (dst[key] = src[key])\n }\n })\n return dst\n}\n\nutil.getBgImage = function (el) {\n // fix: return current page url when url is none\n const url = (el.currentStyle || window.getComputedStyle(el, null)).backgroundImage\n if (!url || url === 'none') {\n return ''\n }\n const a = document.createElement('a')\n a.href = url.replace(/url\\(\"|\"\\)/g, '')\n return a.href\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { HTMLElement | null }\n */\nutil.copyDom = function (dom) {\n if (dom && dom.nodeType === 1) {\n const back = document.createElement(dom.tagName)\n Array.prototype.forEach.call(dom.attributes, (node) => {\n back.setAttribute(node.name, node.value)\n })\n if (dom.innerHTML) {\n back.innerHTML = dom.innerHTML\n }\n return back\n } else {\n return ''\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @param { function } intervalFunc\n * @param { number } frequency\n */\nutil.setInterval = function (context, eventName, intervalFunc, frequency) {\n if (!context._interval[eventName]) {\n context._interval[eventName] = window.setInterval(intervalFunc.bind(context), frequency)\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @returns { void }\n */\nutil.clearInterval = function (context, eventName) {\n clearInterval(context._interval[eventName])\n context._interval[eventName] = null\n}\n\n/**\n *\n * @param { any } context\n * @param { function } fun\n * @param { number } time\n * @returns { number }\n */\nutil.setTimeout = function (context, fun, time) {\n if (!context._timers) {\n context._timers = []\n }\n const id = setTimeout(() => {\n fun()\n util.clearTimeout(context, id)\n }, time)\n context._timers.push(id)\n return id\n}\n\n/**\n *\n * @param { any } context\n * @param { number } id\n */\nutil.clearTimeout = function (context, id) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n for (let i = 0; i < _timers.length; i++) {\n if (_timers[i] === id) {\n _timers.splice(i, 1)\n clearTimeout(id)\n break\n }\n }\n } else {\n clearTimeout(id)\n }\n}\n\n/**\n *\n * @param { any } context\n */\nutil.clearAllTimers = function (context) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n _timers.map(item => {\n clearTimeout(item)\n })\n context._timerIds = []\n }\n}\n\n/**\n *\n * @param { string } name\n * @param { string } imgUrl\n * @param { number } [width]\n * @param { number } [height]\n * @returns { HTMLElement }\n */\nutil.createImgBtn = function (name, imgUrl, width, height) {\n const btn = util.createDom(`xg-${name}`, '', {}, `xgplayer-${name}-img`)\n btn.style.backgroundImage = `url(\"${imgUrl}\")`\n if (width && height) {\n let w, h, unit\n ['px', 'rem', 'em', 'pt', 'dp', 'vw', 'vh', 'vm', '%'].every((item) => {\n if (width.indexOf(item) > -1 && height.indexOf(item) > -1) {\n w = parseFloat(width.slice(0, width.indexOf(item)).trim())\n h = parseFloat(height.slice(0, height.indexOf(item)).trim())\n unit = item\n return false\n } else {\n return true\n }\n })\n btn.style.width = `${w}${unit}`\n btn.style.height = `${h}${unit}`\n btn.style.backgroundSize = `${w}${unit} ${h}${unit}`\n if (name === 'start') {\n btn.style.margin = `-${h / 2}${unit} auto auto -${w / 2}${unit}`\n } else {\n btn.style.margin = 'auto 5px auto 5px'\n }\n }\n return btn\n}\n\n/**\n *\n * @param { string } hex\n * @param { string | number } alpha\n * @returns { string }\n */\nutil.Hex2RGBA = function (hex, alpha) {\n const rgb = [] // 定义rgb数组\n // eslint-disable-next-line no-useless-escape\n if (/^\\#[0-9A-F]{3}$/i.test(hex)) {\n let sixHex = '#'\n hex.replace(/[0-9A-F]/ig, function (kw) {\n sixHex += kw + kw\n })\n hex = sixHex\n }\n if (/^#[0-9A-F]{6}$/i.test(hex)) {\n hex.replace(/[0-9A-F]{2}/ig, function (kw) {\n rgb.push(parseInt(kw, 16))\n })\n return `rgba(${rgb.join(',')}, ${alpha})`\n } else {\n return 'rgba(255, 255, 255, 0.1)'\n }\n}\n\n/**\n *\n * @returns { HTMLElement | null }\n */\nutil.getFullScreenEl = function () {\n return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsFunction = function (fun) {\n return fun && typeof fun === 'function'\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsObject = function (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * @param { HTMLElement }\n */\nutil.hide = function (dom) {\n dom.style.display = 'none'\n}\n\n/**\n * @param { HTMLElement }\n * @param { block | flex | inline-block | inline-flex } [display]\n */\nutil.show = function (dom, display) {\n dom.style.display = display || 'block'\n}\n\n/**\n *\n * @param { any } val\n * @returns { boolean }\n */\nutil.isUndefined = function (val) {\n if (typeof val === 'undefined' || val === null) {\n return true\n }\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } [text]\n * @returns\n */\nutil.setStyleFromCsstext = function (dom, text) {\n // dom.setAttribute(style, text)\n if (!text) {\n return\n }\n if (util.typeOf(text) === 'String') {\n const styleArr = text.replace(/\\s+/g, '').split(';')\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n dom.style[arr[0]] = arr[1]\n }\n }\n })\n } else {\n Object.keys(text).map(key => {\n dom.style[key] = text[key]\n })\n }\n}\n\n/**\n *\n * @param { string } key\n * @param { Array} list\n * @returns { boolean }\n */\nfunction checkIsIn (key, list) {\n for (let i = 0, len = list.length; i < len; i++) {\n if (key.indexOf(list[i]) > -1) {\n return true\n }\n }\n return false\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { Array } [list] attribute names to filter\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.filterStyleFromText = function (dom, list = ['width', 'height', 'top', 'left', 'bottom', 'right', 'position', 'z-index', 'padding', 'margin', 'transform']) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n const remain = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n if (checkIsIn(arr[0], list)) {\n ret[arr[0]] = arr[1]\n // dom.style[arr[0]] = 'initial'\n } else {\n remain[arr[0]] = arr[1]\n }\n }\n }\n })\n dom.setAttribute('style', '')\n Object.keys(remain).map(key => {\n // netStyle += `${key}: ${remain[key]};`\n dom.style[key] = remain[key]\n })\n return ret\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.getStyleFromCsstext = function (dom) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n ret[arr[0]] = arr[1]\n }\n }\n })\n return ret\n}\n\nutil.preloadImg = (url, onload = () => {}, onerror = () => {}) => {\n if (!url) {\n return\n }\n let img = new window.Image()\n img.onload = (e) => {\n img = null\n onload && onload(e)\n }\n img.onerror = (e) => {\n img = null\n onerror && onerror(e)\n }\n img.src = url\n}\n\nutil.stopPropagation = (e) => {\n if (e) {\n e.stopPropagation()\n e.cancelable && e.preventDefault()\n }\n}\n\nutil.scrollTop = function () {\n return window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0\n}\n\nutil.scrollLeft = function () {\n return window.pageXOffset ||\n document.documentElement.scrollLeft ||\n document.body.scrollLeft ||\n 0\n}\n\nutil.checkTouchSupport = function () {\n return 'ontouchstart' in window\n}\n\nutil.getBuffered2 = (vbuffered, maxHoleDuration = 0.5) => { // ref: hls.js\n const buffered = []\n for (let i = 0; i < vbuffered.length; i++) {\n buffered.push({ start: vbuffered.start(i) < 0.5 ? 0 : vbuffered.start(i), end: vbuffered.end(i) })\n }\n buffered.sort(function (a, b) {\n const diff = a.start - b.start\n if (diff) {\n return diff\n } else {\n return b.end - a.end\n }\n })\n let buffered2 = []\n if (maxHoleDuration) {\n for (let i = 0; i < buffered.length; i++) {\n const buf2len = buffered2.length\n if (buf2len) {\n const buf2end = buffered2[buf2len - 1].end\n if ((buffered[i].start - buf2end) < maxHoleDuration) {\n if (buffered[i].end > buf2end) {\n buffered2[buf2len - 1].end = buffered[i].end\n }\n } else {\n buffered2.push(buffered[i])\n }\n } else {\n buffered2.push(buffered[i])\n }\n }\n } else {\n buffered2 = buffered\n }\n return new XgplayerTimeRange(buffered2)\n}\n\n/**\n * @description css中有zoom的时候,位移会等比缩放,但是元素的宽高不会等比缩放,所以通过该api做统一\n * https://bugs.chromium.org/p/chromium/issues/detail?id=429140#c8\n * @param {Events} e\n * @param {number} zoom\n * @returns\n */\nutil.getEventPos = function (e, zoom = 1) {\n return {\n x: e.x / zoom,\n y: e.y / zoom,\n clientX: e.clientX / zoom,\n clientY: e.clientY / zoom,\n offsetX: e.offsetX / zoom,\n offsetY: e.offsetY / zoom,\n pageX: e.pageX / zoom,\n pageY: e.pageY / zoom\n }\n}\n\nutil.requestAnimationFrame = function (callback) {\n const _fun = window.requestAnimationFrame ||\n // Older versions Chrome/Webkit\n window.webkitRequestAnimationFrame ||\n\n // Firefox < 23\n window.mozRequestAnimationFrame ||\n\n // opera\n window.oRequestAnimationFrame ||\n\n // ie\n window.msRequestAnimationFrame\n if (_fun) {\n return _fun(callback)\n }\n}\n\nutil.getHostFromUrl = function (url) {\n if (util.typeOf(url) !== 'String') {\n return ''\n }\n const results = url.split('/') // 以“/”进行分割\n let domain = ''\n if (results.length > 3 && results[2]) {\n domain = results[2]\n }\n return domain\n}\n\nutil.cancelAnimationFrame = function (frameId) {\n const _fun = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.cancelRequestAnimationFrame\n _fun && _fun(frameId)\n}\n\n/**\n * @desc Check whether it is MediaSource start\n * @param { HTMLVideoElement | HTMLAudioElement | HTMLElement } video\n * @returns { Boolean }\n */\nutil.isMSE = function (video) {\n if (!video || !(video instanceof HTMLMediaElement)) {\n return false\n }\n return /^blob/.test(video.currentSrc) || /^blob/.test(video.src)\n}\n\n/**\n * @param { number } did\n * @returns { string }\n */\nutil.generateSessionId = function (did = 0) {\n let d = new Date().getTime()\n try {\n did = parseInt(did)\n } catch (e) {\n did = 0\n }\n d += did\n if (window.performance && typeof window.performance.now === 'function') {\n d += parseInt(window.performance.now()) // use high-precision timer if available\n }\n const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (d + Math.random() * 16) % 16 | 0\n d = Math.floor(d / 16)\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16)\n })\n return uuid\n}\n\nfunction isObject (value) {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\nfunction debounce (func, wait, options) {\n let lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime\n\n let lastInvokeTime = 0\n let leading = false\n let maxing = false\n let trailing = true\n\n // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.\n const useRAF = (!wait && wait !== 0 && typeof window.requestAnimationFrame === 'function')\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n wait = +wait || 0\n if (isObject(options)) {\n leading = !!options.leading\n maxing = 'maxWait' in options\n maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n\n function invokeFunc (time) {\n const args = lastArgs\n const thisArg = lastThis\n\n lastArgs = lastThis = undefined\n lastInvokeTime = time\n result = func.apply(thisArg, args)\n return result\n }\n\n function startTimer (pendingFunc, wait) {\n if (useRAF) {\n window.cancelAnimationFrame(timerId)\n return window.requestAnimationFrame(pendingFunc)\n }\n return setTimeout(pendingFunc, wait)\n }\n\n function cancelTimer (id) {\n if (useRAF) {\n return window.cancelAnimationFrame(id)\n }\n clearTimeout(id)\n }\n\n function leadingEdge (time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time\n // Start the timer for the trailing edge.\n timerId = startTimer(timerExpired, wait)\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result\n }\n\n function remainingWait (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n const timeWaiting = wait - timeSinceLastCall\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting\n }\n\n function shouldInvoke (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait))\n }\n\n function timerExpired () {\n const time = Date.now()\n if (shouldInvoke(time)) {\n return trailingEdge(time)\n }\n // Restart the timer.\n timerId = startTimer(timerExpired, remainingWait(time))\n }\n\n function trailingEdge (time) {\n timerId = undefined\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time)\n }\n lastArgs = lastThis = undefined\n return result\n }\n\n function cancel () {\n if (timerId !== undefined) {\n cancelTimer(timerId)\n }\n lastInvokeTime = 0\n lastArgs = lastCallTime = lastThis = timerId = undefined\n }\n\n function flush () {\n return timerId === undefined ? result : trailingEdge(Date.now())\n }\n\n function pending () {\n return timerId !== undefined\n }\n\n function debounced (...args) {\n const time = Date.now()\n const isInvoking = shouldInvoke(time)\n\n lastArgs = args\n lastThis = this\n lastCallTime = time\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime)\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = startTimer(timerExpired, wait)\n return invokeFunc(lastCallTime)\n }\n }\n if (timerId === undefined) {\n timerId = startTimer(timerExpired, wait)\n }\n return result\n }\n debounced.cancel = cancel\n debounced.flush = flush\n debounced.pending = pending\n return debounced\n}\n\nfunction throttle (func, wait, options) {\n let leading = true\n let trailing = true\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n return debounce(func, wait, {\n leading,\n trailing,\n maxWait: wait\n })\n}\n\n/**\n * @returns { string }\n */\nfunction getLang () {\n let lang = (document.documentElement.getAttribute('lang') || navigator.language || 'zh-cn').toLocaleLowerCase()\n if (lang === 'zh-cn') {\n lang = 'zh'\n }\n return lang\n}\n\nfunction checkIsCurrentVideo (element, playerId, key) {\n if (!element) {\n return\n }\n const pid = element.getAttribute(key)\n if (pid && pid === playerId && (element.tagName === 'VIDEO' || element.tagName === 'AUDIO')) {\n return true\n }\n return false\n}\n\nexport {\n util as default,\n checkIsCurrentVideo,\n debounce,\n throttle,\n getLang\n}\n","/**\n * @typedef {{\n * isSupport: boolean,\n * mime: string\n * }} ICheckResult\n */\n\n/**\n * @typedef {{\n * device: 'pc' | 'mobile',\n * browser: 'ie' | 'firefox' | 'chrome' | 'opera' | 'safari',\n * os: {\n * isTablet: boolean,\n * isPhone: boolean,\n * isIpad: boolean,\n * isIos: boolean,\n * isAndroid: boolean,\n * isPc: boolean,\n * isSymbian: boolean,\n * isWindowsPhone: boolean,\n * isFireFox: boolean\n * },\n * isWeixin: boolean,\n * isSupportMP4(): ICheckResult,\n * isHevcSupported(): boolean\n * probeConfigSupported(info: MediaDecodingConfiguration): Promise\n * }} ISniffer\n */\n\nconst VERSION_REG = {\n android: /(Android)\\s([\\d.]+)/,\n ios: /(Version)\\/([\\d.]+)/\n}\n\nconst H264_MIMETYPES = [\n 'avc1.42E01E, mp4a.40.2',\n 'avc1.58A01E, mp4a.40.2',\n 'avc1.4D401E, mp4a.40.2',\n 'avc1.64001E, mp4a.40.2',\n 'avc1.42E01E',\n 'mp4v.20.8',\n 'avc1.42E01E, mp4a.40.2',\n 'avc1.58A01E, mp4a.40.2',\n 'avc1.4D401E, mp4a.40.2',\n 'avc1.64001E, mp4a.40.2',\n 'mp4v.20.8, mp4a.40.2',\n 'mp4v.20.240, mp4a.40.2'\n]\n\n/**\n * @type ISniffer\n */\nconst sniffer = {\n get device () {\n const r = sniffer.os\n return r.isPc ? 'pc' : 'mobile'\n // return r.isPc ? 'pc' : r.isTablet ? 'tablet' : 'mobile'\n },\n get browser () {\n if (typeof navigator === 'undefined') {\n return ''\n }\n const ua = navigator.userAgent.toLowerCase()\n const reg = {\n ie: /rv:([\\d.]+)\\) like gecko/,\n firefox: /firefox\\/([\\d.]+)/,\n chrome: /chrome\\/([\\d.]+)/,\n opera: /opera.([\\d.]+)/,\n safari: /version\\/([\\d.]+).*safari/\n }\n return [].concat(Object.keys(reg).filter(key => reg[key].test(ua)))[0]\n },\n get os () {\n if (typeof navigator === 'undefined') {\n return {}\n }\n const ua = navigator.userAgent\n const isWindowsPhone = /(?:Windows Phone)/.test(ua)\n const isSymbian = /(?:SymbianOS)/.test(ua) || isWindowsPhone\n const isAndroid = /(?:Android)/.test(ua)\n const isFireFox = /(?:Firefox)/.test(ua)\n const isTablet =\n /(?:iPad|PlayBook)/.test(ua) ||\n (isAndroid && !/(?:Mobile)/.test(ua)) ||\n (isFireFox && /(?:Tablet)/.test(ua))\n const isPhone = /(?:iPhone)/.test(ua) && !isTablet\n const isPc = !isPhone && !isAndroid && !isSymbian && !isTablet\n const isIpad = /(?:iPad|PlayBook)/.test(ua)\n return {\n isTablet,\n isPhone,\n isIpad,\n isIos: isPhone || isIpad,\n isAndroid,\n isPc,\n isSymbian,\n isWindowsPhone,\n isFireFox\n }\n },\n\n get osVersion () {\n if (typeof navigator === 'undefined') {\n return 0\n }\n const ua = navigator.userAgent\n let reg = ''\n // ios\n if (/(?:iPhone)|(?:iPad|PlayBook)/.test(ua)) {\n reg = VERSION_REG.ios\n // android\n } else {\n reg = VERSION_REG.android\n }\n const _match = reg ? reg.exec(ua) : []\n if (_match && _match.length >= 3) {\n const version = _match[2].split('.')\n return version.length > 0 ? parseInt(version[0]) : 0\n }\n return 0\n },\n\n get isWeixin () {\n if (typeof navigator === 'undefined') {\n return false\n }\n const reg = /(micromessenger)\\/([\\d.]+)/\n const match = reg.exec(navigator.userAgent.toLocaleLowerCase())\n if (match) {\n return true\n }\n return false\n },\n\n /**\n *\n * @returns {{\n * isSupport: boolean,\n * mime: string\n * }}\n */\n isSupportMP4 () {\n const result = {\n isSupport: false,\n mime: ''\n }\n if (typeof document === 'undefined') {\n return result\n }\n if (this.supportResult) {\n return this.supportResult\n }\n let a = document.createElement('video')\n if (typeof a.canPlayType === 'function') {\n H264_MIMETYPES.map((key) => {\n if (a.canPlayType(`video/mp4; codecs=\"${key}\"`) === 'probably') {\n result.isSupport = true\n result.mime += `||${key}`\n }\n })\n }\n this.supportResult = result\n a = null\n return result\n },\n\n /**\n * Is HEVC Hardware decoding supported by current browser\n * @returns {boolean}\n */\n isHevcSupported () {\n if (typeof MediaSource === 'undefined' || !MediaSource.isTypeSupported) {\n return false\n }\n return (\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.1.6.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.2.4.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.3.E.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.4.10.L120.90\"')\n )\n },\n\n /**\n * @param { MediaDecodingConfiguration } info\n * @returns { Promise }\n */\n probeConfigSupported (info) {\n const defaults = {\n supported: false,\n smooth: false,\n powerEfficient: false\n }\n if (!info || typeof navigator === 'undefined') {\n return Promise.resolve(defaults)\n }\n if (\n navigator.mediaCapabilities &&\n navigator.mediaCapabilities.decodingInfo\n ) {\n return navigator.mediaCapabilities.decodingInfo(info)\n } else {\n const videoConfig = info.video || {}\n const audioConfig = info.audio || {}\n try {\n const videoSupported = MediaSource.isTypeSupported(\n videoConfig.contentType\n )\n const audioSupported = MediaSource.isTypeSupported(\n audioConfig.contentType\n )\n\n return Promise.resolve({\n supported: videoSupported && audioSupported,\n smooth: false,\n powerEfficient: false\n })\n } catch (e) {\n return Promise.resolve(defaults)\n }\n }\n }\n}\n\nexport default sniffer\n","/**\n * @type {string}\n * */\nexport default __VERSION__\n","// eslint-disable-next-line no-undef\nimport version from './version'\nimport Util from './utils/util'\n/**\n * @typedef { import ('./player').default } Player\n */\n\nconst ERROR_TYPE_MAP = {\n 1: 'network',\n 2: 'network',\n 3: 'decoder',\n 4: 'format'\n}\n\nconst ErrorTypes = {\n network: {\n code: 1\n },\n mse: {\n code: 2\n },\n parse: {\n code: 3\n },\n format: {\n code: 4\n },\n decoder: {\n code: 5\n },\n runtime: {\n code: 6\n },\n timeout: {\n code: 7\n },\n other: {\n code: 8\n }\n}\n\n/**\n * @typedef { {\n * playerVersion: string,\n * currentTime: number,\n * duration: number,\n * ended: boolean,\n * readyState: number,\n * networkState: number,\n * src: any,\n * errorType: string,\n * errorCode: number,\n * message: string,\n * mediaError?: {\n * code: number,\n * message?: string\n * },\n * originError?: any,\n * url?: any,\n * host?: string,\n * [propName: string]: any\n * } } IError\n */\n\n/**\n * @type { IError }\n */\nclass Errors {\n /**\n *\n * @param { Player } player\n * @param { {\n * errorType: string,\n * errorCode: number,\n * errorMessage: string,\n * originError: any,\n * ext: { [propName: string]: any; }\n * } } errorInfo\n * @returns\n */\n constructor (player, errorInfo = { errorType: '', errorCode: 0, errorMessage: '', originError: '', ext: {}, mediaError: null }) {\n const ERROR_TYPES = player && player.i18n ? player.i18n.ERROR_TYPES : null\n if (player.video) {\n const mediaError = errorInfo.mediaError ? errorInfo.mediaError : (player.video.error || {})\n const { duration, currentTime, ended, src, currentSrc } = player\n const { readyState, networkState } = player.video\n const r = {\n playerVersion: version,\n currentTime,\n duration,\n ended,\n readyState,\n networkState,\n src: src || currentSrc,\n errorType: errorInfo.errorType,\n errorCode: errorInfo.errorCode || mediaError.code,\n message: errorInfo.errorMessage || mediaError.message,\n mediaError,\n originError: errorInfo.originError ? errorInfo.originError.stack : '',\n host: Util.getHostFromUrl(src || currentSrc)\n }\n errorInfo.ext && Object.keys(errorInfo.ext).map(key => {\n r[key] = errorInfo.ext[key]\n })\n return r\n } else {\n if (arguments.length > 1) {\n const r = {\n playerVersion: version,\n domain: document.domain\n }\n const arr = ['errorType', 'currentTime', 'duration', 'networkState', 'readyState', 'src', 'currentSrc', 'ended', 'errd', 'errorCode', 'mediaError']\n for (let i = 0; i < arguments.length; i++) {\n r[arr[i]] = arguments[i]\n }\n r.ex = ERROR_TYPES ? (ERROR_TYPES[arguments[0]] || {}).msg : ''// 补充信息\n return r\n }\n }\n }\n}\n\nexport {\n Errors as default,\n ErrorTypes,\n ERROR_TYPE_MAP\n}\n","export const PLAY = 'play'\nexport const PLAYING = 'playing'\nexport const ENDED = 'ended'\nexport const PAUSE = 'pause'\nexport const ERROR = 'error'\nexport const SEEKING = 'seeking'\nexport const SEEKED = 'seeked'\nexport const TIME_UPDATE = 'timeupdate'\nexport const WAITING = 'waiting'\nexport const CANPLAY = 'canplay'\nexport const CANPLAY_THROUGH = 'canplaythrough'\nexport const DURATION_CHANGE = 'durationchange'\nexport const VOLUME_CHANGE = 'volumechange'\nexport const LOADED_DATA = 'loadeddata'\nexport const RATE_CHANGE = 'ratechange'\nexport const PROGRESS = 'progress'\nexport const LOAD_START = 'loadstart'\nexport const EMPTIED = 'emptied'\nexport const STALLED = 'stalled'\nexport const SUSPEND = 'suspend'\nexport const ABORT = 'abort'\n\n// player events\nexport const BUFFER_CHANGE = 'bufferedChange'\nexport const PLAYER_FOCUS = 'focus'\nexport const PLAYER_BLUR = 'blur'\nexport const READY = 'ready'\nexport const URL_NULL = 'urlNull'\nexport const AUTOPLAY_STARTED = 'autoplay_started'\nexport const AUTOPLAY_PREVENTED = 'autoplay_was_prevented'\nexport const COMPLETE = 'complete'\nexport const REPLAY = 'replay'\nexport const DESTROY = 'destroy'\nexport const URL_CHANGE = 'urlchange'\nexport const DOWNLOAD_SPEED_CHANGE = 'download_speed_change'\n\n// screen change evnets\nexport const FULLSCREEN_CHANGE = 'fullscreen_change'\nexport const CSS_FULLSCREEN_CHANGE = 'cssFullscreen_change'\nexport const MINI_STATE_CHANGE = 'mini_state_change'\n\nexport const DEFINITION_CHANGE = 'definition_change'\nexport const BEFORE_DEFINITION_CHANGE = 'before_definition_change'\nexport const AFTER_DEFINITION_CHANGE = 'after_definition_change'\n\n// transmuxer events\nexport const SEI_PARSED = 'SEI_PARSED'\n\nexport const RETRY = 'retry'\n\n// 容器宽高变化\nexport const VIDEO_RESIZE = 'video_resize'\n\n// picture-in-picture状态变化\nexport const PIP_CHANGE = 'pip_change'\n\n// rotate change\nexport const ROTATE = 'rotate'\n\n// screenShot\nexport const SCREEN_SHOT = 'screenShot'\n\n// play next\nexport const PLAYNEXT = 'playnext'\n\nexport const SHORTCUT = 'shortcut'\n\nexport const XGLOG = 'xglog'\n\nexport const USER_ACTION = 'user_action'\n\nexport const RESET = 'reset'\n\nexport const VIDEO_EVENTS = [\n 'play',\n 'playing',\n 'ended',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'timeupdate',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'durationchange',\n 'volumechange',\n 'loadeddata',\n 'ratechange',\n 'progress',\n 'loadstart',\n 'emptied',\n 'stalled',\n 'suspend',\n 'abort',\n 'lowdecode'\n]\n\nexport const STATS_EVENTS = {\n STATS_INFO: 'stats_info',\n STATS_DOWNLOAD: 'stats_download',\n STATS_RESET: 'stats_reset'\n}\n","import EventEmitter from 'eventemitter3'\nimport Util from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Errors, { ERROR_TYPE_MAP } from './error'\nimport { URL_CHANGE, WAITING, VIDEO_EVENTS } from './events'\n/**\n * @typedef { import ('eventemitter3') } EventEmitter\n */\n/**\n * @typedef { {\n * duration: number,\n * currentTime: number,\n * muted: boolean,\n * defaultMuted: boolean,\n * volume: number,\n * playbackRate: number,\n * defaultPlaybackRate: number,\n * autoplay: boolean,\n * readonly paused: boolean,\n * readonly ended: boolean,\n * readonly networkState: number,\n * readonly readyState: number,\n * readonly seeking: boolean,\n * src: any,\n * play: Function,\n * pause: Function,\n * } } IVideoProxy\n */\n\nfunction emitVideoEvent (eventKey, e) {\n if (!this || !this.emit) {\n return\n }\n if (eventKey === 'error') {\n this.errorHandler(eventKey, e.error)\n } else {\n this.emit(eventKey, e)\n }\n}\n\n// 获取包装EventsMiddleware后的VIDEO_EVENT\nfunction getVideoEventHandler (eventKey, player) {\n return (e, _err) => {\n const eData = {\n player,\n eventName: eventKey,\n originalEvent: e,\n detail: e.detail || {},\n timeStamp: e.timeStamp,\n currentTime: player.currentTime,\n duration: player.duration,\n paused: player.paused,\n ended: player.ended,\n isInternalOp: !!player._internalOp[e.type], // 是否是内部操作,不反应到UI上\n muted: player.muted,\n volume: player.volume,\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype\n }\n player.removeInnerOP(e.type)\n if (eventKey === 'timeupdate') {\n player._currentTime = player.video && player.video.currentTime\n }\n\n // 避免playbackRate和defaultPlaybackRate同时设置导致多次触发事件\n if (eventKey === 'ratechange') {\n const _rate = player.video ? player.video.playbackRate : 0\n if (_rate && player._rate === _rate) {\n return\n }\n player._rate = player.video && player.video.playbackRate\n }\n\n if (eventKey === 'durationchange') {\n player._duration = player.video.duration\n }\n\n if (eventKey === 'volumechange') {\n eData.isMutedChange = player._lastMuted !== player.muted\n player._lastMuted = player.muted\n }\n\n if (eventKey === 'error') {\n eData.error = _err || player.video.error\n }\n\n // 执行video相关事件中间件能力\n if (player.videoEventMiddleware[eventKey]) {\n const callback = emitVideoEvent.bind(player, eventKey, eData)\n try {\n player.videoEventMiddleware[eventKey].call(player, eData, callback)\n } catch (err) {\n emitVideoEvent.call(player, eventKey, eData)\n throw err\n }\n } else {\n emitVideoEvent.call(player, eventKey, eData)\n }\n }\n}\n\n/**\n * @extends { EventEmitter }\n */\nclass VideoProxy extends EventEmitter {\n constructor (options) {\n super(options)\n /**\n * @private\n */\n this._hasStart = false\n /**\n * @private\n */\n this._currentTime = 0\n /**\n * @private\n */\n this._duration = 0\n /**\n * @private\n */\n this._internalOp = {}\n /**\n * @private\n */\n this._lastMuted = false\n\n /**\n * @type {string}\n * 当前播放类型\n */\n this.vtype = 'MP4'\n\n /**\n * @type {number}\n * @private\n */\n this._rate = -1\n /**\n * @description 初始化时添加在video上的属性集合\n * @type { {[propName: string]: any } }\n */\n this.videoConfig = Object.assign({}, {\n controls: false,\n autoplay: options.autoplay,\n playsinline: options.playsinline,\n 'x5-playsinline': options.playsinline,\n 'webkit-playsinline': options.playsinline,\n 'x5-video-player-fullscreen': options['x5-video-player-fullscreen'] || options.x5VideoPlayerFullscreen,\n 'x5-video-orientation': options['x5-video-orientation'] || options.x5VideoOrientation,\n airplay: options.airplay,\n 'webkit-airplay': options.airplay,\n tabindex: 2,\n mediaType: options.mediaType || 'video'\n }, options.videoConfig, options.videoAttributes)\n /**\n * @description Compatible with WeChat webview\n * \"x5-playsinline' and 'x5-video-player-type' only one needs to exist\n * @doc https://x5.tencent.com/docs/video.html\n */\n const playerType = options['x5-video-player-type'] || options.x5VideoPlayerType\n if (Sniffer.isWeixin && Sniffer.os.isAndroid && playerType) {\n this.videoConfig['x5-video-player-type'] = playerType\n delete this.videoConfig.playsinline\n delete this.videoConfig['webkit-playsinline']\n delete this.videoConfig['x5-playsinline']\n }\n\n if (options.loop) {\n this.videoConfig.loop = 'loop'\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IVideoProxy | null }\n */\n this.video = Util.createDom(this.videoConfig.mediaType, '', this.videoConfig, '')\n\n if (options.defaultPlaybackRate) {\n this.video.defaultPlaybackRate = this.video.playbackRate = options.defaultPlaybackRate\n }\n\n if (Util.typeOf(options.volume) === 'Number') {\n this.volume = options.volume\n }\n\n if (options.autoplayMuted) {\n this.video.muted = true\n this._lastMuted = true\n }\n if (options.autoplay) {\n this.video.autoplay = true\n }\n\n /**\n * @private\n */\n this._interval = {}\n /**\n * @readonly\n */\n this.videoEventMiddleware = {}\n this.attachVideoEvents()\n }\n\n /**\n * @description set middleware\n * @param { {[propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n setEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n this.videoEventMiddleware[key] = middlewares[key]\n })\n }\n\n /**\n * @description remove middleware\n * @param { { [propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n removeEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n delete this.videoEventMiddleware[key]\n })\n }\n\n /**\n * Add media eventListener to the video object\n * @param { any } [video]\n */\n attachVideoEvents (video = this.video) {\n if (!this._evHandlers) {\n /**\n * @private\n */\n this._evHandlers = VIDEO_EVENTS.map(eventKey => {\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.on(eventKey, this[funName])\n }\n\n return {\n [eventKey]: getVideoEventHandler(eventKey, this)\n }\n })\n }\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n video.addEventListener(eventKey, item[eventKey], false)\n })\n }\n\n /**\n * @description remove media eventListener from the video object\n * @param { any } [video]\n */\n detachVideoEvents (video = this.video) {\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n video.removeEventListener(eventKey, item[eventKey], false)\n })\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.off(eventKey, this[funName])\n }\n })\n\n this._evHandlers = null\n }\n\n /**\n * 针对source列表播放方式添加错误监听\n * @doc https://stackoverflow.com/questions/47557135/html5-detect-the-type-of-error-when-trying-to-load-a-video-using-a-source-elem\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n * @param { Array<{src: string, type: string }>} urls\n */\n _attachSourceEvents (video, urls) {\n video.removeAttribute('src')\n urls.forEach(item => {\n this.video.appendChild(Util.createDom('source', '', {\n src: `${item.src}`,\n type: `${item.type || ''}`\n }))\n })\n const _c = video.children\n if (!_c) {\n return\n }\n /**\n * @private\n */\n this._videoSourceCount = _c.length\n /**\n * @private\n */\n let _eHandler = null\n\n for (let i = 0; i < this._evHandlers.length; i++) {\n if (Object.keys(this._evHandlers[i])[0] === 'error') {\n _eHandler = this._evHandlers[i]\n break\n }\n }\n !this._sourceError && (this._sourceError = (e) => {\n this._videoSourceCount--\n if (this._videoSourceCount === 0) {\n const _err = { code: 4, message: 'sources load error' }\n _eHandler ? _eHandler.error(e, _err) : this.errorHandler('error', _err)\n }\n })\n for (let i = 0; i < _c.length; i++) {\n _c[i].addEventListener('error', this._sourceError)\n }\n }\n\n /**\n * 移除source列表错误事件监听\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n */\n _detachSourceEvents (video) {\n const _c = video.children\n if (!_c || _c.length === 0 || !this._sourceError) {\n return\n }\n for (let i = 0; i < _c.length; i++) {\n _c[i].removeEventListener('error', this._sourceError)\n }\n while (_c.length > 0) {\n video.removeChild(_c[0])\n }\n }\n\n /**\n * @description Media Error handler\n * @param { string } eventName\n */\n errorHandler (name, error = null) {\n if (this.video && (this.video.error || error)) {\n let _e = this.video.error || error\n const type = _e.code ? ERROR_TYPE_MAP[_e.code] : 'other'\n let message = _e.message\n if (!this.video.currentSrc) {\n message = 'empty_src'\n _e = {\n code: 6,\n message\n }\n }\n this.emit(name, new Errors(this, {\n errorType: type,\n errorCode: _e.code,\n errorMessage: _e.message || '',\n mediaError: _e\n }))\n }\n }\n\n destroy () {\n if (this.video) {\n if (this.video.pause) {\n this.video.pause()\n this.video.muted = true\n }\n this.video.removeAttribute('src') // empty source\n this.video.load()\n }\n this._currentTime = 0\n this._duration = 0\n this.videoConfig = null\n for (const k in this._interval) {\n if (Object.prototype.hasOwnProperty.call(this._interval, k)) {\n clearInterval(this._interval[k])\n this._interval[k] = null\n }\n }\n this.detachVideoEvents()\n this.video = null\n this.videoEventMiddleware = {}\n this.removeAllListeners()\n }\n\n /**\n *\n * @returns { Promise | null }\n */\n play () {\n const ret = this.video ? this.video.play() : null\n return ret\n }\n\n pause () {\n this.video && this.video.pause()\n }\n\n load () {\n this.video && this.video.load()\n }\n\n /**\n *\n * @param { string } type\n * @returns { boolean }\n */\n canPlayType (type) {\n return this.video ? this.video.canPlayType(type) : false\n }\n\n /**\n *\n * @param { any } [buffered]\n * @returns { Array }\n */\n getBufferedRange (buffered) {\n const range = [0, 0]\n if (!this.video) {\n return range\n }\n if (!buffered) {\n buffered = this.video.buffered\n }\n const currentTime = this.video.currentTime\n if (buffered) {\n for (let i = 0, len = buffered.length; i < len; i++) {\n range[0] = buffered.start(i)\n range[1] = buffered.end(i)\n if (range[0] <= currentTime && currentTime <= range[1]) {\n break\n }\n }\n }\n if (range[0] - currentTime <= 0 && currentTime - range[1] <= 0) {\n return range\n } else {\n return [0, 0]\n }\n }\n\n /**\n * @type { boolean }\n * @description 设置/返回 自动播放属性\n */\n set autoplay (isTrue) {\n this.video && (this.video.autoplay = isTrue)\n }\n\n get autoplay () {\n return this.video ? this.video.autoplay : false\n }\n\n /**\n * @type { TimeRanges | null }\n * @description 返回当前缓冲的TimeRange对象集合\n */\n get buffered () {\n return this.video ? this.video.buffered : null\n }\n\n /**\n * @type { Array<{start: number, end: number}> | null}\n * @description 返回当前自定义的缓存列表\n */\n get buffered2 () {\n return this.video && this.video.buffered ? Util.getBuffered2(this.video.buffered) : null\n }\n\n /**\n * @type { {start: number, end: number} }\n */\n get bufferedPoint () {\n const ret = {\n start: 0,\n end: 0\n }\n if (!this.video) {\n return ret\n }\n const _buffered = this.video.buffered\n if (!_buffered || _buffered.length === 0) {\n return ret\n }\n for (let i = 0; i < _buffered.length; i++) {\n if ((_buffered.start(i) <= this.currentTime || _buffered.start(i) < 0.1) && _buffered.end(i) >= this.currentTime) {\n return {\n start: _buffered.start(i),\n end: _buffered.end(i)\n }\n }\n }\n return ret\n }\n\n /**\n * @type { string}\n * @description 设置/返回是否跨域\n * */\n get crossOrigin () {\n return this.video ? this.video.crossOrigin : ''\n }\n\n set crossOrigin (isTrue) {\n this.video && (this.video.crossOrigin = isTrue)\n }\n\n /**\n * @type { string }\n * @description 设置/返回视频播放地址\n * */\n get currentSrc () {\n return this.video ? this.video.currentSrc : ''\n }\n\n set currentSrc (src) {\n this.video && (this.video.currentSrc = src)\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频当前播放时间\n * */\n get currentTime () {\n if (!this.video) {\n return 0\n }\n return this.video.currentTime !== undefined ? this.video.currentTime : this._currentTime\n }\n\n set currentTime (time) {\n this.video && (this.video.currentTime = time)\n }\n\n /**\n * @type { boolean }\n * 设置/返回视频默认静音\n * */\n get defaultMuted () {\n return this.video ? this.video.defaultMuted : false\n }\n\n set defaultMuted (isTrue) {\n this.video && (this.video.defaultMuted = isTrue)\n }\n\n /**\n * @type { number }\n * @description 返回视频时长,单位:s\n * */\n get duration () {\n return this._duration\n }\n\n /**\n * @type { boolean }\n * @description 回视频是否播放结束\n * */\n get ended () {\n return this.video ? this.video.ended : false\n }\n\n /**\n * @type { MediaError }\n * @description the player current error\n */\n get error () {\n return this.video.error\n }\n\n /**\n * @type { string }\n * @description return error description text\n */\n get errorNote () {\n const err = this.video.error\n if (!err) {\n return ''\n }\n const status = [\n 'MEDIA_ERR_ABORTED',\n 'MEDIA_ERR_NETWORK',\n 'MEDIA_ERR_DECODE',\n 'MEDIA_ERR_SRC_NOT_SUPPORTED'\n ]\n return status[this.video.error.code - 1]\n }\n\n /**\n * @type { boolean }\n * @description 否开启了循环播放\n */\n get loop () {\n return this.video ? this.video.loop : false\n }\n\n set loop (isTrue) {\n this.video && (this.video.loop = isTrue)\n }\n\n /**\n * @type { boolean }\n * @description 静音\n */\n get muted () {\n return this.video ? this.video.muted : false\n }\n\n set muted (isTrue) {\n if (!this.video || this.video.muted === isTrue) {\n return\n }\n this._lastMuted = this.video.muted\n this.video.muted = isTrue\n }\n\n /**\n * @type { number }\n * @description 返回视频的当前网络状态\n */\n get networkState () {\n return this.video.networkState\n }\n\n /**\n * @type { boolean }\n * @description 回当前视频是否是暂停状态\n */\n get paused () {\n return this.video ? this.video.paused : true\n }\n\n /**\n * @type { number }\n * @description 返回/设置倍速\n */\n get playbackRate () {\n return this.video ? this.video.playbackRate : 0\n }\n\n set playbackRate (rate) {\n if (!this.video || rate === Infinity) {\n return\n }\n this.video.defaultPlaybackRate = rate\n this.video.playbackRate = rate\n }\n\n /**\n * @type { TimeRanges | null}\n */\n get played () {\n return this.video ? this.video.played : null\n }\n\n /**\n * @type { boolean }\n */\n get preload () {\n return this.video ? this.video.preload : false\n }\n\n set preload (isTrue) {\n this.video && (this.video.preload = isTrue)\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 | 4 }\n * @description 回视频的就绪状态\n */\n get readyState () {\n return this.video.readyState\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否可以seek\n */\n get seekable () {\n return this.video ? this.video.seekable : false\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否处于seeking状态下\n */\n get seeking () {\n return this.video ? this.video.seeking : false\n }\n\n /**\n * @type { any }\n * @description 设置/返回当前视频的地址\n */\n get src () {\n return this.video ? this.video.src : ''\n }\n\n set src (url) {\n if (!this.video) {\n return\n }\n this.emit(URL_CHANGE, url)\n this.emit(WAITING)\n // this.video.pause()\n this._currentTime = 0\n this._duration = 0\n // Some firefox versions firefox Cannot recognize currentSrc of type Blob\n if (/^blob/.test(this.video.currentSrc) || /^blob/.test(this.video.src)) { // has transmuxer core\n this.onWaiting()\n return\n }\n this._detachSourceEvents(this.video)\n if (Util.typeOf(url) === 'Array') {\n this._attachSourceEvents(this.video, url)\n } else {\n this.video.src = url\n }\n this.load()\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频的音量\n */\n get volume () {\n return this.video ? this.video.volume : 0\n }\n\n set volume (vol) {\n if (vol === Infinity || !this.video) {\n return\n }\n this.video.volume = vol\n }\n\n addInnerOP (event) {\n this._internalOp[event] = true\n }\n\n removeInnerOP (event) {\n delete this._internalOp[event]\n }\n /** ******************* 以下api只有申明作用,具体实现依赖EventEmitter ******************/\n\n /**\n *\n * @param { string } event\n * @param { any } [data]\n * @returns\n */\n emit (event, data, ...args) {\n super.emit(event, data, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (data?: any) => any } callback\n * @returns\n */\n on (event, callback, ...args) {\n super.on(event, callback, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (data?: any) => any } callback\n * @returns\n */\n once (event, callback, ...args) {\n super.once(event, callback, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (data?: any) => any } callback\n * @returns\n */\n off (event, callback, ...args) {\n super.off(event, callback, ...args)\n }\n\n offAll () {\n super.removeAllListeners()\n }\n}\n\nexport default VideoProxy\n","class INDEXDB {\n constructor (mydb = { name: 'xgplayer', version: 1, db: null, ojstore: { name: 'xg-m4a', keypath: 'vid' } }) {\n this.indexedDB = window.indexedDB || window.webkitindexedDB\n this.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange // 键范围\n this.myDB = mydb\n }\n\n openDB (callback) {\n // 建立或打开数据库,建立对象存储空间(ObjectStore)\n const self = this\n const version = this.myDB.version || 1\n const request = self.indexedDB.open(self.myDB.name, version)\n request.onerror = function (e) {\n // console.log('e.currentTarget.error.message')\n }\n request.onsuccess = e => {\n this.myDB.db = e.target.result\n // console.log('成功建立并打开数据库:' + this.myDB.name + ' version' + this.myDB.version)\n callback.call(self)\n }\n request.onupgradeneeded = e => {\n const db = e.target.result\n // eslint-disable-next-line no-unused-vars\n const transaction = e.target.transaction\n // eslint-disable-next-line no-unused-vars\n let store\n if (!db.objectStoreNames.contains(self.myDB.ojstore.name)) {\n // 没有该对象空间时创建该对象空间\n // eslint-disable-next-line no-unused-vars\n store = db.createObjectStore(self.myDB.ojstore.name, { keyPath: self.myDB.ojstore.keypath })\n // console.log('成功建立对象存储空间:' + this.myDB.ojstore.name)\n }\n }\n }\n\n deletedb () {\n // 删除数据库\n const self = this\n self.indexedDB.deleteDatabase(this.myDB.name)\n // console.log(this.myDB.name + '数据库已删除')\n }\n\n closeDB () {\n // 关闭数据库\n this.myDB.db.close()\n // console.log('数据库已关闭')\n }\n\n addData (storename, data) {\n // 添加数据,重复添加会报错\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.add(data[i])\n request.onerror = function () {\n // console.error('add添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('add添加数据已存入数据库')\n }\n }\n }\n\n putData (storename, data) {\n // 添加数据,重复添加会更新原有数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.put(data[i])\n request.onerror = function () {\n // console.error('put添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('put添加数据已存入数据库')\n }\n }\n }\n\n getDataByKey (storename, key, callback) {\n const self = this\n // 根据存储空间的键找到对应数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n const request = store.get(key)\n request.onerror = function () {\n // console.error('getDataByKey error')\n callback.call(self, null)\n }\n request.onsuccess = function (e) {\n const result = e.target.result\n // console.log('查找数据成功')\n callback.call(self, result)\n }\n }\n\n deleteData (storename, key) {\n // 删除某一条记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.delete(key)\n // console.log('已删除存储空间' + storename + '中' + key + '记录')\n }\n\n clearData (storename) {\n // 删除存储空间全部记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.clear()\n // console.log('已删除存储空间' + storename + '全部记录')\n }\n}\n\nexport default INDEXDB\n","export const FULLSCREEN_EVENTS = ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange']\n\nexport const GET_FULLSCREEN_API = ['requestFullscreen', 'webkitRequestFullscreen', 'mozRequestFullScreen', 'msRequestFullscreen']\n\nexport const EXIT_FULLSCREEN_API = ['exitFullscreen', 'webkitExitFullscreen', 'mozCancelFullScreen', 'msExitFullscreen']\n\nexport const PLATER_ID = 'data-xgplayerid'","function callHandler (obj, handler, next, ...args) {\n const ret = handler.call(obj, ...args)\n if (!next || typeof next !== 'function') {\n return\n }\n if (ret && ret.then) {\n ret.then((...args) => {\n next.call(obj, ...args)\n })\n } else {\n next.call(obj, ...args)\n }\n}\n\n/**\n * 给某个处理函数添加hook能力\n * @param { string } hookName\n * @param { Function } handler\n * @param { { pre?: any, next?:any } } preset\n * {\n * pre: () => { // run beafore hook},\n * next: () => { // run after hook return}\n * }\n */\nfunction hook (hookName, handler, preset = { pre: null, next: null }) {\n if (!this.__hooks) {\n this.__hooks = {}\n }\n !this.__hooks[hookName] && (this.__hooks[hookName] = null)\n return function () {\n if (preset.pre) {\n try {\n preset.pre.call(this, ...arguments)\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}:pre error] >> ${e.message}`\n throw e\n }\n }\n if (this.__hooks && this.__hooks[hookName]) {\n try {\n const preRet = this.__hooks[hookName].call(this, this, ...arguments)\n if (preRet) {\n if (preRet.then) {\n preRet.then((isContinue) => {\n if (isContinue !== false) {\n callHandler(this, handler, preset.next, ...arguments)\n // handler.call(this, ...arguments)\n }\n }).catch(e => {\n throw e\n })\n } else {\n callHandler(this, handler, preset.next, ...arguments)\n // handler.call(this, ...arguments)\n }\n } else if (preRet === undefined) {\n callHandler(this, handler, preset.next, ...arguments)\n }\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}] >> ${e.message}`\n throw e\n }\n } else {\n callHandler(this, handler, preset.next, ...arguments)\n }\n }.bind(this)\n}\n\n/**\n * add hooks\n * @param { string } hookName\n * @param { Function } handler\n */\nfunction useHooks (hookName, handler) {\n const { __hooks } = this\n if (!__hooks) {\n return\n }\n // eslint-disable-next-line no-prototype-builtins\n if (!__hooks.hasOwnProperty(hookName)) {\n console.warn(`has no supported hook which name [${hookName}]`)\n return false\n }\n __hooks && (__hooks[hookName] = handler)\n return true\n}\n\n/**\n * remove hook\n * @param { string } hookName\n * @param { (plugin: any, ..args) => {} } handler\n * @returns void\n */\nfunction removeHooks (hookName, handler) {\n const { __hooks } = this\n if (!__hooks) {\n return\n }\n delete __hooks[hookName]\n}\n\n/**\n * Add hooks to a plugin\n * @param { string } pluginName\n * @param {...any} args\n */\nfunction usePluginHooks (pluginName, ...args) {\n if (!this.plugins || !this.plugins[pluginName.toLowerCase()]) {\n return\n }\n const plugin = this.plugins[pluginName.toLowerCase()]\n return plugin.useHooks && plugin.useHooks(...args)\n}\n\nfunction removePluginHooks (pluginName, ...args) {\n if (!this.plugins || !this.plugins[pluginName.toLowerCase()]) {\n return\n }\n const plugin = this.plugins[pluginName.toLowerCase()]\n if (plugin) {\n return plugin.removeHooks && plugin.removeHooks(...args)\n }\n}\n\n/**\n * hook decorator, add hooks props for for an instance\n * @param { any } instance\n * @param { Array } [hookNames]\n */\nfunction hooksDescriptor (instance, presetHooks = []) {\n instance.__hooks = {}\n presetHooks && presetHooks.map(item => {\n instance.__hooks[item] = null\n })\n Object.defineProperty(instance, 'hooks', {\n get: () => {\n return instance.__hooks && Object.keys(instance.__hooks).map(key => {\n if (instance.__hooks[key]) {\n return key\n }\n })\n }\n })\n}\n\nfunction delHooksDescriptor (instance) {\n instance.__hooks = null\n}\n\nfunction runHooks (obj, hookName, handler, ...args) {\n if (obj.__hooks && obj.__hooks[hookName]) {\n const ret = obj.__hooks[hookName].call(obj, obj, ...args)\n if (ret && ret.then) {\n ret.then((data) => {\n return data === false ? null : handler.call(obj, obj, ...args)\n }).catch(e => {\n console.warn(`[runHooks]${hookName} reject`, e.message)\n })\n } else if (ret !== false) {\n return handler.call(obj, obj, ...args)\n }\n } else {\n return handler.call(obj, obj, ...args)\n }\n}\n\nexport {\n hooksDescriptor as default,\n hook,\n useHooks,\n usePluginHooks,\n removePluginHooks,\n removeHooks,\n delHooksDescriptor,\n runHooks\n}\n","import Util from '../utils/util'\nimport Sniffer from '../utils/sniffer'\nimport Errors from '../error'\nimport * as Events from '../events'\nimport XG_DEBUG from '../utils/debug'\nimport hooksDescriptor, { hook, useHooks, removeHooks, delHooksDescriptor } from './hooksDescriptor'\n\nfunction showErrorMsg (pluginName, msg) {\n XG_DEBUG.logError(`[${pluginName}] event or callback cant be undefined or null when call ${msg}`)\n}\n\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef { import ('../defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * [propName: string]: any;\n * }} IBasePluginOptions\n */\nclass BasePlugin {\n static defineGetterOrSetter (Obj, map) {\n for (const key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key)) {\n Object.defineProperty(Obj, key, map[key])\n }\n }\n }\n\n /**\n * @type { { [propName: string]: any } }\n */\n static get defaultConfig () {\n return {}\n }\n\n /**\n * @type { string }\n */\n static get pluginName () {\n return 'pluginName'\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n constructor (args) {\n if (Util.checkIsFunction(this.beforeCreate)) {\n this.beforeCreate(args)\n }\n hooksDescriptor(this)\n /**\n * @private\n */\n this.__args = args\n /**\n * @private\n */\n this.__events = {} // 对player的事件监听缓存\n this.__onceEvents = {}\n this.config = args.config || {}\n /**\n * @readonly\n * @type { Player }\n */\n this.player = null\n /**\n * @readonly\n * @type { IPlayerOptions }\n */\n this.playerConfig = {}\n /**\n * @readonly\n * @type {string}\n */\n this.pluginName = ''\n this.__init(args)\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n beforeCreate (args) {}\n afterCreate () {}\n beforePlayerInit () {}\n onPluginsReady () {}\n afterPlayerInit () {}\n destroy () {}\n\n /**\n * @private\n * @param { any } args\n */\n __init (args) {\n this.player = args.player\n this.playerConfig = args.player && args.player.config\n this.pluginName = args.pluginName ? args.pluginName.toLowerCase() : this.constructor.pluginName.toLowerCase()\n this.logger = args.player && args.player.logger\n // BasePlugin.defineGetterOrSetter(this, {\n // player: {\n // get: () => {\n // return args.player\n // },\n // configurable: true\n // },\n // playerConfig: {\n // get: () => {\n // return args.player && args.player.config\n // },\n // configurable: true\n // },\n\n // pluginName: {\n // get: () => {\n // if (args.pluginName) {\n // return args.pluginName.toLowerCase()\n // } else {\n // return this.constructor.pluginName.toLowerCase()\n // }\n // },\n // configurable: true\n // },\n // logger: {\n // get: () => {\n // return args.player.logger\n // },\n // configurable: true\n // }\n // })\n }\n\n /**\n * 更新语言\n * @param { string } lang\n */\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n }\n\n /**\n * @type { string }\n */\n get lang () {\n return this.player.lang\n }\n\n get i18n () {\n return this.player.i18n\n }\n\n get i18nKeys () {\n return this.player.i18nKeys\n }\n\n /**\n * @description当前支持的事件类型\n * @type { 'touch' | 'mouse' }\n */\n get domEventType () {\n let _e = Util.checkTouchSupport() ? 'touch' : 'mouse'\n if (this.playerConfig && (this.playerConfig.domEventType === 'touch' || this.playerConfig.domEventType === 'mouse')) {\n _e = this.playerConfig.domEventType\n }\n return _e\n }\n\n /**\n *\n * @param { string | Array } event\n * @param { Function } callback\n * @returns\n */\n on (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.on(event, callback)')\n return\n }\n if (typeof event === 'string') {\n this.__events[event] = callback\n this.player.on(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n this.__events[item] = callback\n this.player.on(item, callback)\n })\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } callback\n * @returns\n */\n once (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.once(event, callback)')\n return\n }\n if (typeof event === 'string') {\n this.__onceEvents[event] = callback\n this.player.once(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n this.__onceEvents[item] = callback\n this.player.once(event, callback)\n })\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } callback\n * @returns\n */\n off (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.off(event, callback)')\n return\n }\n if (typeof event === 'string') {\n delete this.__events[event]\n this.player.off(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n delete this.__events[event]\n this.player.off(item, callback)\n })\n }\n }\n\n offAll () {\n ['__events', '__onceEvents'].forEach(key => {\n Object.keys(this[key]).forEach(item => {\n this[key][item] && this.off(item, this[key][item])\n item && delete this[key][item]\n })\n })\n this.__events = {}\n this.__onceEvents = {}\n }\n\n /**\n *\n * @param { string } event\n * @param {...any} res\n * @returns\n */\n emit (event, ...res) {\n if (!this.player) {\n return\n }\n this.player.emit(event, ...res)\n }\n\n emitUserAction (event, action, params = {}) {\n if (!this.player) {\n return\n }\n const nParams = {\n ...params,\n pluginName: this.pluginName\n }\n this.player.emitUserAction(event, action, nParams)\n }\n\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n useHooks (hookName, handler, ...args) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n removeHooks (hookName, handler, ...args) {\n return removeHooks.call(this, ...arguments)\n }\n\n /**\n * 注册子插件\n * @param { any } plugin\n * @param { any } [options]\n * @param { string } [name]\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name = '') {\n if (!this.player) {\n return\n }\n name && (options.pluginName = name)\n return this.player.registerPlugin({ plugin, options })\n }\n\n /**\n *\n * @param { string } name\n * @returns { any | null }\n */\n getPlugin (name) {\n return this.player ? this.player.getPlugin(name) : null\n }\n\n __destroy () {\n const player = this.player\n const pluginName = this.pluginName\n this.offAll()\n Util.clearAllTimers(this)\n if (Util.checkIsFunction(this.destroy)) {\n this.destroy()\n }\n\n ['player', 'playerConfig', 'pluginName', 'logger', '__args', '__hooks'].map(item => {\n this[item] = null\n })\n player.unRegisterPlugin(pluginName)\n delHooksDescriptor(this)\n }\n}\nexport {\n BasePlugin as default,\n Util,\n Sniffer,\n Errors,\n Events,\n XG_DEBUG\n}\n","var DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n","var closest = require('./closest');\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n","/**\n* an ui Plugin class\n*\n**/\nimport BasePlugin, { Util, XG_DEBUG } from './basePlugin'\nimport delegate from 'delegate'\n\nconst ROOT_TYPES = {\n CONTROLS: 'controls',\n ROOT: 'root'\n}\n\nconst POSITIONS = {\n ROOT: 'root',\n ROOT_LEFT: 'rootLeft',\n ROOT_RIGHT: 'rootRight',\n ROOT_TOP: 'rootTop',\n CONTROLS_LEFT: 'controlsLeft',\n CONTROLS_RIGTH: 'controlsRight',\n CONTROLS_RIGHT: 'controlsRight',\n CONTROLS_CENTER: 'controlsCenter',\n CONTROLS: 'controls'\n}\n\n/**\n * Check if the url is a link address\n * @param { string } str\n */\nfunction isUrl (str) {\n if (!str) {\n return false\n }\n return str.indexOf && /^(?:http|data:|\\/)/.test(str)\n}\n\nfunction mergeIconClass (icon, classname) {\n if (typeof icon === 'object' && icon.class && typeof icon.class === 'string') {\n return `${classname} ${icon.class}`\n }\n return classname\n}\n\nfunction mergeIconAttr (icon, attr) {\n if (typeof icon === 'object' && icon.attr && typeof icon.attr === 'object') {\n Object.keys(icon.attr).map(key => {\n attr[key] = icon.attr[key]\n })\n }\n return attr\n}\n\nfunction createIcon (icon, key, classname = '', attr = {}, pluginName = '') {\n let newIcon = null\n if (icon instanceof window.Element) {\n Util.addClass(icon, classname)\n Object.keys(attr).map(key => {\n icon.setAttribute(key, attr[key])\n })\n return icon\n }\n\n if (isUrl(icon) || isUrl(icon.url)) {\n attr.src = isUrl(icon) ? icon : (icon.url || '')\n newIcon = Util.createDom(icon.tag || 'img', '', attr, `xg-img ${classname}`)\n return newIcon\n }\n\n if (typeof icon === 'function') {\n try {\n newIcon = icon()\n if (newIcon instanceof window.Element) {\n Util.addClass(newIcon, classname)\n Object.keys(attr).map(key => {\n newIcon.setAttribute(key, attr[key])\n })\n return newIcon\n } else {\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is a function mast return an Element Object`)\n }\n return null\n } catch (e) {\n XG_DEBUG.logError(`Plugin named [${pluginName}]:createIcon`, e)\n return null\n }\n }\n\n if (typeof icon === 'string') {\n return Util.createDomFromHtml(icon, attr, classname)\n }\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is invalid`)\n return null\n}\n\nfunction registerIconsObj (iconsConfig, plugin) {\n const _icons = plugin.config.icons || plugin.playerConfig.icons\n Object.keys(iconsConfig).map(key => {\n const orgIcon = iconsConfig[key]\n let classname = orgIcon && orgIcon.class ? orgIcon.class : ''\n let attr = orgIcon && orgIcon.attr ? orgIcon.attr : {}\n let newIcon = null\n if (_icons && _icons[key]) {\n classname = mergeIconClass(_icons[key], classname)\n attr = mergeIconAttr(_icons[key], attr)\n newIcon = createIcon(_icons[key], key, classname, attr, plugin.pluginName)\n }\n if (!newIcon && orgIcon) {\n newIcon = createIcon((orgIcon.icon ? orgIcon.icon : orgIcon), attr, classname, {}, plugin.pluginName)\n }\n plugin.icons[key] = newIcon\n })\n}\n\nfunction registerTextObj (textConfig, plugin) {\n Object.keys(textConfig).map((key) => {\n Object.defineProperty(plugin.langText, key, {\n get: () => {\n const { lang, i18n } = plugin\n if (i18n[key]) {\n return i18n[key]\n } else {\n return textConfig[key] ? (textConfig[key][lang] || '') : ''\n }\n }\n })\n })\n}\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * root?: HTMLElement,\n * position?: string,\n * [propName: string]: any\n * }} IPluginOptions\n*/\nclass Plugin extends BasePlugin {\n /**\n * 插入dom结构\n * @param { String | HTMLElement } html html字符串或者dom\n * @param { HTMLElement } parent\n * @param { number } index\n * @returns { HTMLElement }\n */\n static insert (html, parent, index = 0) {\n const len = parent.children.length\n const insertIdx = Number(index)\n const isDomElement = html instanceof window.Node\n\n if (len) {\n let i = 0\n let coordinate = null\n let mode = ''\n for (;i < len; i++) {\n coordinate = parent.children[i]\n const curIdx = Number(coordinate.getAttribute('data-index'))\n if (curIdx >= insertIdx) {\n mode = 'beforebegin'\n break\n } else if (curIdx < insertIdx) {\n mode = 'afterend'\n }\n }\n\n if (isDomElement) {\n if (mode === 'afterend') {\n // as last element\n parent.appendChild(html)\n } else {\n parent.insertBefore(html, coordinate)\n }\n } else {\n coordinate.insertAdjacentHTML(mode, html)\n }\n return mode === 'afterend' ? parent.children[parent.children.length - 1] : parent.children[i]\n } else {\n isDomElement ? parent.appendChild(html) : parent.insertAdjacentHTML('beforeend', html)\n return parent.children[parent.children.length - 1]\n }\n }\n\n static get defaultConfig () {\n return {}\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { String } querySelector\n * @param { String | Array } eventType\n * @param { Function } callback\n * @param { boolean } [capture=false]\n * @returns\n */\n static delegate (root, querySelector, eventType, callback, capture = false) {\n const dels = []\n if (root instanceof window.Node && typeof callback === 'function') {\n if (Array.isArray(eventType)) {\n eventType.forEach((item) => {\n const ret = delegate(root, querySelector, item, callback, capture)\n ret.key = `${querySelector}_${item}`\n dels.push(ret)\n })\n } else {\n const ret = delegate(root, querySelector, eventType, callback, capture)\n ret.key = `${querySelector}_${eventType}`\n dels.push(ret)\n }\n }\n return dels\n }\n\n static get ROOT_TYPES () {\n return ROOT_TYPES\n }\n\n static get POSITIONS () {\n return POSITIONS\n }\n\n /**\n * @param { IPluginOptions } args\n */\n constructor (args = {}) {\n super(args)\n /**\n * @private\n */\n this.__delegates = []\n }\n\n /**\n * @private\n */\n __init (args) {\n super.__init(args)\n if (!args.root) {\n return\n }\n const _parent = args.root\n let _el = null\n /**\n * @readonly\n */\n this.icons = {}\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.root = null\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.parent = null\n\n const _orgicons = this.registerIcons() || {}\n registerIconsObj(_orgicons, this)\n /**\n * @readonly\n */\n this.langText = {}\n const defaultTexConfig = this.registerLanguageTexts() || {}\n registerTextObj(defaultTexConfig, this)\n let renderStr = ''\n try {\n renderStr = this.render()\n } catch (e) {\n XG_DEBUG.logError(`Plugin:${this.pluginName}:render`, e)\n throw (new Error(`Plugin:${this.pluginName}:render:${e.message}`))\n }\n if (renderStr) {\n _el = Plugin.insert(renderStr, _parent, args.index)\n _el.setAttribute('data-index', args.index)\n } else if (args.tag) {\n _el = Util.createDom(args.tag, '', args.attr, args.name)\n _el.setAttribute('data-index', args.index)\n _parent.appendChild(_el)\n } else {\n return\n }\n\n this.root = _el\n this.parent = _parent\n\n // Plugin.defineGetterOrSetter(this, {\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // root: {\n // get: () => {\n // return _el\n // },\n // configurable: true\n // },\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // parent: {\n // get: () => {\n // return _parent\n // },\n // configurable: true\n // }\n // })\n\n const attr = this.config.attr || {}\n const style = this.config.style || {}\n\n this.setAttr(attr)\n this.setStyle(style)\n if (this.config.index) {\n this.root.setAttribute('data-index', this.config.index)\n }\n this.__registerChildren()\n }\n\n /**\n * @private\n */\n __registerChildren () {\n if (!this.root) {\n return\n }\n /**\n * @private\n */\n this._children = []\n const children = this.children()\n if (children && typeof children === 'object') {\n if (Object.keys(children).length > 0) {\n Object.keys(children).map(item => {\n const name = item\n const _plugin = children[name]\n const options = {\n root: this.root\n }\n // eslint-disable-next-line no-unused-vars\n let config, Plugin\n if (typeof _plugin === 'function') {\n config = this.config[name] || {}\n Plugin = _plugin\n } else if (typeof _plugin === 'object' && typeof _plugin.plugin === 'function') {\n config = _plugin.options ? Util.deepCopy((this.config[name] || {}), _plugin.options) : (this.config[name] || {})\n Plugin = _plugin.plugin\n }\n options.config = config\n config.index !== undefined && (options.index = config.index)\n config.root && (options.root = config.root)\n this.registerPlugin(Plugin, options, name)\n })\n }\n }\n }\n\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n function checkChildren (node, callback) {\n for (let i = 0; i < node.children.length; i++) {\n if (node.children[i].children.length > 0) {\n checkChildren(node.children[i], callback)\n } else {\n callback(node.children[i])\n }\n }\n }\n const { root, i18n, langText } = this\n if (root) {\n checkChildren(root, (node) => {\n const langKey = node.getAttribute && node.getAttribute('lang-key')\n if (!langKey) {\n return\n }\n const langTextShow = i18n[langKey.toUpperCase()] || langText[langKey]\n if (langTextShow) {\n node.innerHTML = typeof langTextShow === 'function' ? langTextShow(lang) : langTextShow\n }\n })\n }\n }\n\n get lang () {\n return this.player.lang\n }\n\n changeLangTextKey (dom, key = '') {\n const i18n = this.i18n || {}\n const langText = this.langText\n dom.setAttribute && dom.setAttribute('lang-key', key)\n const text = i18n[key] || langText[key] || ''\n if (text) {\n dom.innerHTML = text\n }\n }\n\n plugins () {\n return this._children\n }\n\n children () {\n return {}\n }\n\n registerPlugin (plugin, options = {}, name = '') {\n options.root = options.root || this.root\n const _c = super.registerPlugin(plugin, options, name)\n this._children.push(_c)\n return _c\n }\n\n registerIcons () {\n return {}\n }\n\n registerLanguageTexts () {\n return {}\n }\n\n /**\n *\n * @param { string } qs\n * @returns { HTMLElement | null }\n */\n find (qs) {\n if (!this.root) {\n return\n }\n return this.root.querySelector(qs)\n }\n\n /**\n * 绑定事件\n * @param { string | Array } querySelector\n * @param { string | Function } eventType\n * @param { Function } [callback]\n */\n bind (querySelector, eventType, callback) {\n if (arguments.length < 3 && typeof eventType === 'function') {\n if (Array.isArray(querySelector)) {\n querySelector.forEach((item) => {\n this.bindEL(item, eventType)\n })\n } else {\n this.bindEL(querySelector, eventType)\n }\n } else {\n const ret = Plugin.delegate.call(this, this.root, querySelector, eventType, callback)\n this.__delegates = this.__delegates.concat(ret)\n }\n }\n\n /**\n * 绑定事件\n * @param { string | Array } querySelector\n * @param { string | Function } eventType\n */\n unbind (querySelector, eventType) {\n if (arguments.length < 3 && typeof eventType === 'function') {\n if (Array.isArray(querySelector)) {\n querySelector.forEach((item) => {\n this.unbindEL(item, eventType)\n })\n } else {\n this.unbindEL(querySelector, eventType)\n }\n } else {\n const key = `${querySelector}_${eventType}`\n for (let i = 0; i < this.__delegates.length; i++) {\n if (this.__delegates[i].key === key) {\n this.__delegates[i].destroy()\n this.__delegates.splice(i, 1)\n break\n }\n }\n }\n }\n\n /**\n * 给插件设置样式\n * @param { string | {[propName: string]: any} } name\n * @param { ? | any } value\n * @returns\n */\n setStyle (name, value) {\n if (!this.root) {\n return\n }\n if (Util.typeOf(name) === 'String') {\n return (this.root.style[name] = value)\n } else if (Util.typeOf(name) === 'Object') {\n Object.keys(name).map(key => {\n this.root.style[key] = name[key]\n })\n }\n }\n\n /**\n * 给插件根节点设置属性\n * @param { string | {[propName: string]: any} } name\n * @param { ? | any } value\n * @returns\n */\n setAttr (name, value) {\n if (!this.root) {\n return\n }\n if (Util.typeOf(name) === 'String') {\n return this.root.setAttribute(name, value)\n } else if (Util.typeOf(name) === 'Object') {\n Object.keys(name).map(key => {\n this.root.setAttribute(key, name[key])\n })\n }\n }\n\n /**\n *\n * @param { string } htmlStr\n * @param { Function } [callback]\n * @returns\n */\n setHtml (htmlStr, callback) {\n if (!this.root) {\n return\n }\n this.root.innerHTML = htmlStr\n if (typeof callback === 'function') {\n callback()\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } eventHandle\n * @param { boolean } [isBubble=false]\n * @returns\n */\n bindEL (event, eventHandle, isBubble = false) {\n if (!this.root) {\n return\n }\n if (`on${event}` in this.root && typeof eventHandle === 'function') {\n this.root.addEventListener(event, eventHandle, isBubble)\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } eventHandle\n * @param { boolean } [isBubble]\n * @returns\n */\n unbindEL (event, eventHandle, isBubble = false) {\n if (!this.root) {\n return\n }\n if (`on${event}` in this.root && typeof eventHandle === 'function') {\n this.root.removeEventListener(event, eventHandle, isBubble)\n }\n }\n\n /**\n *\n * @param { string } [value]\n * @returns\n */\n show (value) {\n if (!this.root) {\n return\n }\n this.root.style.display = value !== undefined ? value : 'block'\n const cs = window.getComputedStyle(this.root, null)\n const cssDisplayValue = cs.getPropertyValue('display')\n if (cssDisplayValue === 'none') {\n return (this.root.style.display = 'block')\n }\n }\n\n hide () {\n this.root && (this.root.style.display = 'none')\n }\n\n /**\n *\n * @param { string | HTMLElement } pdom\n * @param { HTMLElement} child\n * @returns { HTMLElement | null }\n */\n appendChild (pdom, child) {\n if (!this.root) {\n return null\n }\n if (arguments.length < 2 && arguments[0] instanceof window.Element) {\n return this.root.appendChild(arguments[0])\n }\n if (!child || !(child instanceof window.Element)) {\n return null\n }\n try {\n if (typeof pdom === 'string') {\n return this.find(pdom).appendChild(child)\n } else {\n return pdom.appendChild(child)\n }\n } catch (err) {\n XG_DEBUG.logError('Plugin:appendChild', err)\n return null\n }\n }\n\n /**\n *\n * @returns { string | HTMLElement }\n */\n render () {\n return ''\n }\n\n destroy () {}\n\n __destroy () {\n const { player } = this\n this.__delegates.map(item => {\n item.destroy()\n })\n this.__delegates = []\n // destroy the sub-plugin instance\n if (this._children instanceof Array) {\n this._children.map(item => {\n player.unRegisterPlugin(item.pluginName)\n })\n this._children = null\n }\n if (this.root) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.root.hasOwnProperty('remove')) {\n this.root.remove()\n } else if (this.root.parentNode) {\n this.root.parentNode.removeChild(this.root)\n }\n }\n\n super.__destroy()\n this.icons = {};\n ['root', 'parent'].map(item => {\n this[item] = null\n })\n }\n}\n\nexport {\n Plugin as default,\n ROOT_TYPES,\n POSITIONS\n}\n","import { throttle } from '../utils/util'\nimport { PLATER_ID } from '../constant'\n/**\n * 添加\n */\nclass ResizeObserver {\n constructor () {\n this.__handlers = []\n this.timeStamp = 0\n this.observer = null\n if (!window.ResizeObserver) {\n return\n }\n try {\n this.observer = new window.ResizeObserver(throttle(this.__trigger, 100, { trailing: true }))\n this.timeStamp = new Date().getTime()\n } catch (e) {\n console.error(e)\n }\n }\n\n addObserver (target, handler) {\n if (!this.observer) {\n return\n }\n this.observer && this.observer.observe(target)\n const _pid = target.getAttribute(PLATER_ID)\n const { __handlers } = this\n let index = -1\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n index = i\n }\n }\n if (index > -1) {\n this.__handlers[index].handler = handler\n } else {\n this.__handlers.push({\n target,\n handler: handler,\n playerId: _pid\n })\n }\n }\n\n unObserver (target) {\n let i = -1\n this.__handlers.map((item, index) => {\n if (target === item.target) {\n i = index\n }\n })\n try {\n this.observer && this.observer.unobserve(target)\n } catch (e) {}\n this.observer && this.observer.unobserve(target)\n i > -1 && this.__handlers.splice(i, 1)\n }\n\n destroyObserver () {\n this.observer && this.observer.disconnect()\n this.observer = null\n this.__handlers = null\n }\n\n __runHandler (target) {\n const { __handlers } = this\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n try {\n __handlers[i].handler(target)\n } catch (error) {\n console.error(error)\n }\n return true\n }\n }\n return false\n }\n\n __trigger = (entries) => {\n const t = new Date().getTime()\n this.timeStamp = t\n for (let i = 0; i < entries.length; i++) {\n this.__runHandler(entries[i].target)\n }\n }\n}\n\nlet resizeObserver = null\n\nfunction addObserver (target, handler) {\n if (!resizeObserver) {\n resizeObserver = new ResizeObserver()\n // window.___resizeObserver = resizeObserver\n }\n resizeObserver.addObserver(target, handler)\n return resizeObserver\n}\n\nfunction unObserver (target, handler) {\n resizeObserver.unObserver(target, handler)\n}\n\nfunction destroyObserver (target, handler) {\n resizeObserver.destroyObserver(target, handler)\n}\n\nexport {\n addObserver,\n unObserver,\n destroyObserver\n}\n","import { addObserver, unObserver } from './resizeObserver'\nimport Util from '../utils/util'\n\n/**\n* a plugins manager to register and search\n**/\n\nconst pluginsManager = {\n pluginGroup: {},\n init (player) {\n // mark every player instance by _pluginInfoId\n let cgid = player._pluginInfoId\n if (!cgid) {\n cgid = new Date().getTime()\n player._pluginInfoId = cgid\n }\n\n !player.config.closeResizeObserver && addObserver(player.root, () => {\n player.resize()\n })\n\n // 默认第一个是激活状态\n if (Object.keys(this.pluginGroup).length === 0) {\n player.isUserActive = true\n }\n\n this.pluginGroup[cgid] = {\n _player: player,\n _originalOptions: player.config || {},\n _plugins: {}\n }\n },\n\n /**\n * Check whether there is a player instance in the current dom\n * @param {Element} root\n */\n checkPlayerRoot (root) {\n if (this.pluginGroup) {\n const _keys = Object.keys(this.pluginGroup)\n for (let i = 0; i < _keys.length; i++) {\n const _p = this.pluginGroup[_keys[i]]._player\n if (_p.root === root) {\n return _p\n }\n }\n return null\n }\n return null\n },\n\n formatPluginInfo (plugin, config) {\n let PLUFGIN = null\n let options = null\n if (plugin.plugin && typeof plugin.plugin === 'function') {\n PLUFGIN = plugin.plugin\n options = plugin.options\n } else {\n PLUFGIN = plugin\n options = {}\n }\n if (config) {\n options.config = config || {}\n }\n\n return {\n PLUFGIN,\n options\n }\n },\n\n /**\n * check the plugin if exits in plugins\n * @param {string} pluginName\n * @param { Array } plugins\n * @returns boolean\n */\n checkPluginIfExits (pluginName, plugins) {\n for (let i = 0; i < plugins.length; i++) {\n if (pluginName.toLowerCase() === plugins[i].pluginName.toLowerCase()) {\n return true\n }\n }\n return false\n },\n\n /**\n * get plugin Config from playerConfig\n * @param { string } pluginName\n * @param { {[propName: string]: any;} } playerConfig\n * @return { {[propName: string]: any;} } pluginConfig\n */\n getRootByConfig (pluginName, playerConfig) {\n const keys = Object.keys(playerConfig)\n let _pConfig = null\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n _pConfig = playerConfig[keys[i]]\n break\n }\n }\n\n if (Util.typeOf(_pConfig) === 'Object') {\n return {\n root: _pConfig.root,\n position: _pConfig.position\n }\n }\n return {}\n },\n\n /**\n * register a lazy plugin\n * @param { any } player instance\n * @param { any } lazyPlugin config\n *\n */\n lazyRegister (player, lazyPlugin) {\n const timeout = lazyPlugin.timeout || 1500\n return Promise.race([\n lazyPlugin.loader().then((plugin) => {\n let result\n if (plugin && plugin.__esModule) {\n result = plugin.default\n } else {\n result = plugin\n }\n this.register(player, result, plugin.options)\n }),\n new Promise((resolve, reject) => {\n setTimeout(() => {\n reject(new Error('timeout'))\n }, timeout)\n })\n ])\n },\n /**\n * register a Plugin\n * @param { any } player the plugins register\n * @param { any } plugin the plugin contructor\n * @param { any } options the plugin configuration\n * @return { any } Plugin the plugin instance\n **/\n register (player, plugin, options = {}) {\n if (!player || !plugin || typeof plugin !== 'function' || plugin.prototype === undefined) {\n return\n }\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n if (!this.pluginGroup[cgid]._plugins) {\n this.pluginGroup[cgid]._plugins = {}\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const originalOptions = this.pluginGroup[cgid]._originalOptions\n options.player = this.pluginGroup[cgid]._player\n\n const pluginName = options.pluginName || plugin.pluginName\n if (!pluginName) {\n throw new Error('The property pluginName is necessary')\n }\n\n if (plugin.isSupported && !plugin.isSupported()) {\n console.warn(`not supported plugin [${pluginName}]`)\n return\n }\n\n if (!options.config) {\n options.config = {}\n }\n\n // get config items from player.config\n const keys = Object.keys(originalOptions)\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n const config = originalOptions[keys[i]]\n if (Util.typeOf(config) === 'Object') {\n options.config = Object.assign({}, options.config, originalOptions[keys[i]])\n } else if (Util.typeOf(config) === 'Boolean') {\n options.config.disable = !config\n }\n break\n }\n }\n\n // copy the default configuration items of the plugin\n if (plugin.defaultConfig) {\n Object.keys(plugin.defaultConfig).forEach(key => {\n if (typeof options.config[key] === 'undefined') {\n options.config[key] = plugin.defaultConfig[key]\n }\n })\n }\n\n // get the parent dom which added the plugin will be mounted\n if (!options.root) {\n options.root = player.root\n } else if (typeof options.root === 'string') {\n options.root = player[options.root]\n }\n\n options.index = options.config.index || 0\n try {\n // if there is already a plugin instance with the same pluginName, destroy it\n if (plugins[pluginName.toLowerCase()]) {\n this.unRegister(cgid, pluginName.toLowerCase())\n console.warn(`the is one plugin with same pluginName [${pluginName}] exist, destroy the old instance`)\n }\n // eslint-disable-next-line new-cap\n const _instance = new plugin(options)\n plugins[pluginName.toLowerCase()] = _instance\n plugins[pluginName.toLowerCase()].func = plugin\n if (_instance && typeof _instance.afterCreate === 'function') {\n _instance.afterCreate()\n }\n return _instance\n } catch (err) {\n console.error(err)\n throw (err)\n }\n },\n\n /**\n * Unregister a plugin from player instance\n * @param { string } cgid\n * @param { string } name\n */\n unRegister (cgid, name) {\n if (cgid._pluginInfoId) {\n cgid = cgid._pluginInfoId\n }\n name = name.toLowerCase()\n try {\n const plugin = this.pluginGroup[cgid]._plugins[name]\n if (plugin) {\n plugin.pluginName && plugin.__destroy()\n delete this.pluginGroup[cgid]._plugins[name]\n }\n } catch (e) {\n console.error(`[unRegister:${name}] cgid:[${cgid}] error`, e)\n }\n },\n\n /**\n * remove a plugin instance from the player plugin list\n * @param { any } player\n * @param { string } name\n */\n deletePlugin (player, name) {\n const cgid = player._pluginInfoId\n if (cgid && this.pluginGroup[cgid] && this.pluginGroup[cgid]._plugins) {\n delete this.pluginGroup[cgid]._plugins[name]\n }\n },\n\n /**\n * get all plugin instance of player\n * @param { any } player\n */\n getPlugins (player) {\n const cgid = player._pluginInfoId\n return cgid && this.pluginGroup[cgid] ? this.pluginGroup[cgid]._plugins : {}\n },\n\n findPlugin (player, name) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return null\n }\n const cName = name.toLowerCase()\n return this.pluginGroup[cgid]._plugins[cName]\n },\n\n beforeInit (player) {\n function retPromise (fun) {\n if (!fun || !fun.then) {\n return new Promise((resolve) => {\n resolve()\n })\n } else {\n return fun\n }\n }\n return new Promise((resolve) => {\n if (!this.pluginGroup) {\n return\n }\n\n let prevTask\n if (player._loadingPlugins && player._loadingPlugins.length) {\n prevTask = Promise.all(player._loadingPlugins)\n } else {\n prevTask = Promise.resolve()\n }\n\n return prevTask.then(() => {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n resolve()\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const pluginsRet = []\n Object.keys(plugins).forEach(pName => {\n if (plugins[pName] && plugins[pName].beforePlayerInit) {\n try {\n const ret = plugins[pName].beforePlayerInit()\n pluginsRet.push(retPromise(ret))\n } catch (e) {\n pluginsRet.push(retPromise(null))\n throw e\n }\n }\n })\n\n Promise.all([...pluginsRet]).then(() => {\n resolve()\n }).catch((e) => {\n console.error(e)\n resolve()\n })\n })\n })\n },\n\n afterInit (player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(pName => {\n if (plugins[pName] && plugins[pName].afterPlayerInit) {\n plugins[pName].afterPlayerInit()\n }\n })\n },\n\n setLang (lang, player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(item => {\n if (plugins[item].updateLang) {\n plugins[item].updateLang(lang)\n } else {\n // 兼容旧版本通过set lang更新语言的问题\n try {\n plugins[item].lang = lang\n } catch (error) {\n console.warn(`${item} setLang`)\n }\n }\n })\n },\n\n reRender (player) {\n const cgid = player._pluginInfoId\n\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const _pList = []\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(pName => {\n if (pName !== 'controls' && plugins[pName]) {\n _pList.push({\n plugin: plugins[pName].func,\n options: plugins[pName].__args\n })\n this.unRegister(cgid, pName)\n }\n })\n _pList.forEach(item => {\n this.register(player, item.plugin, item.options)\n })\n },\n\n onPluginsReady (player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins || {}\n Object.keys(plugins).forEach(key => {\n if (plugins[key].onPluginsReady && typeof plugins[key].onPluginsReady === 'function') {\n plugins[key].onPluginsReady()\n }\n })\n },\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n * @returns { number | null }\n */\n setCurrentUserActive (playerId, isActive) {\n if (!this.pluginGroup[playerId]) {\n return\n }\n if (!isActive) {\n this.pluginGroup[playerId]._player.isUserActive = isActive\n return playerId\n }\n const keys = Object.keys(this.pluginGroup)\n for (let i = 0; i < keys.length; i++) {\n const c = this.pluginGroup[keys[i]]\n if (c && c._player) {\n this.pluginGroup[keys[i]]._player.isUserActive = false\n }\n }\n this.pluginGroup[playerId]._player.isUserActive = isActive\n return playerId\n },\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | null }\n */\n getCurrentUseActiveId () {\n if (!this.pluginGroup) {\n return\n }\n const keys = Object.keys(this.pluginGroup)\n for (let i = 0; i < keys.length; i++) {\n const c = this.pluginGroup[keys[i]]\n if (c && c._player && c._player.isUserActive) {\n return keys[i]\n }\n }\n return null\n },\n\n destroy (player) {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n return\n }\n unObserver(player.root)\n const plugins = this.pluginGroup[cgid]._plugins\n for (const item of Object.keys(plugins)) {\n this.unRegister(cgid, item)\n }\n\n const _isUseActive = player.isUseActive\n delete this.pluginGroup[cgid]\n delete player._pluginInfoId\n\n if (_isUseActive) {\n const keys = Object.keys(this.pluginGroup)\n if (keys.length > 0) {\n this.setCurrentUserActive(keys[keys.length - 1], true)\n }\n }\n }\n}\n\nexport default pluginsManager\n","export default {\n DEFAULT: 'xgplayer',\n DEFAULT_SKIN: 'xgplayer-skin-default',\n ENTER: 'xgplayer-is-enter',\n PAUSED: 'xgplayer-pause',\n PLAYING: 'xgplayer-playing',\n ENDED: 'xgplayer-ended',\n CANPLAY: 'xgplayer-canplay',\n LOADING: 'xgplayer-isloading',\n ERROR: 'xgplayer-is-error',\n REPLAY: 'xgplayer-replay',\n NO_START: 'xgplayer-nostart',\n ACTIVE: 'xgplayer-active',\n INACTIVE: 'xgplayer-inactive',\n FULLSCREEN: 'xgplayer-is-fullscreen',\n CSS_FULLSCREEN: 'xgplayer-is-cssfullscreen',\n ROTATE_FULLSCREEN: 'xgplayer-rotate-fullscreen',\n PARENT_ROTATE_FULLSCREEN: 'xgplayer-rotate-parent',\n PARENT_FULLSCREEN: 'xgplayer-fullscreen-parent',\n INNER_FULLSCREEN: 'xgplayer-fullscreen-inner',\n NO_CONTROLS: 'no-controls',\n FLEX_CONTROLS: 'flex-controls',\n CONTROLS_FOLLOW: 'controls-follow',\n CONTROLS_AUTOHIDE: 'controls-autohide',\n TOP_BAR_AUTOHIDE: 'top-bar-autohide',\n NOT_ALLOW_AUTOPLAY: 'not-allow-autoplay',\n SEEKING: 'seeking',\n PC: 'xgplayer-pc',\n MOBILE: 'xgplayer-mobile',\n MINI: 'xgplayer-mini' // mini screen play status\n}\n","import { getLang } from './utils/util'\n\n/**\n * @typedef { {\n * url: any,\n * definition: any,\n * bitrate?: number,\n * text?: string,\n * text?: string | { [propName: string]: any },\n * iconText?: string | { [propName: string]: any },\n * [propName: string]: any\n * } } IDefinition\n */\n\n/**\n * @typedef { {\n * id?: string,\n * el?: HTMLElement,\n * url?: any,\n * domEventType?: 'default' | 'touch' | 'mouse',\n * nullUrlStart?: boolean,\n * width?: number | string,\n * height?: number | string,\n * fluid?: boolean,\n * fitVideoSize?: 'fixWidth'|'fixHeight'|'fixed',\n * videoFillMode?: 'auto'|'fillHeight'|'fillWidth'|'fill'|'cover',\n * volume?: number | { [propName: string]: any },\n * autoplay?: boolean,\n * autoplayMuted?: boolean,\n * loop?: boolean,\n * isLive?: boolean,\n * zoom?: number,\n * videoInit?: boolean,\n * poster?: string | { [propName: string]: any },\n * isMobileSimulateMode?: 'mobile' | 'pc',\n * defaultPlaybackRate?: number,\n * execBeforePluginsCall?: () => any,\n * allowSeekAfterEnded?: boolean,\n * enableContextmenu?: boolean,\n * closeVideoClick?: boolean,\n * closeVideoDblclick?: boolean,\n * closePlayerBlur?: boolean,\n * closeDelayBlur?: boolean,\n * leavePlayerTime?: number,\n * closePlayVideoFocus?: boolean,\n * closePauseVideoFocus?: boolean,\n * closeFocusVideoFocus?: boolean,\n * closeControlsBlur?: boolean,\n * topBarAutoHide?: boolean,\n * videoAttributes?: { [propName: string]: any },\n * startTime?: number,\n * seekedStatus?: 'play' | 'pause' | 'auto',\n * miniprogress?: boolean,\n * disableSwipeHandler?: () => any,\n * enableSwipeHandler?: () => any,\n * ignores?: Array<'cssfullscreen' | 'screenshot' | 'pip' | 'miniscreen' | 'keyboard' | 'download' | 'playbackrate' | 'time' | 'definition' | 'error' | 'fullscreen' | 'loading' | 'mobile' | 'pc' | 'play' | 'poster' | 'progress' | 'replay' | 'start' | 'volume' | string>,\n * inactive?: number,\n * lang?: string,\n * controls?: boolean | { [propName: string]: any },\n * marginControls?: boolean,\n * fullscreenTarget?: HTMLElement, // 全屏作用的dom元素\n * screenShot?: boolean | { [propName: string]: any },\n * rotate?: boolean | { [propName: string]: any },\n * pip?: boolean | { [propName: string]: any },\n * download?: boolean | { [propName: string]: any },\n * mini?: boolean | { [propName: string]: any },\n * cssFullscreen?: boolean | { [propName: string]: any },\n * keyShortcut?: boolean,\n * presets?: any[],\n * plugins?: any[]\n * playbackRate?: number | Array | { [propName: string]: any },\n * definition?: { list: Array , defaultDefinition?: IDefinition['definition'], [propName: string]: any},\n * playsinline?: boolean,\n * customDuration?: number,\n * timeOffset?: number,\n * icons?: { [propName: string]: string | HTMLElement | () => HTMLElement | string },\n * i18n?: Array,\n * thumbnail?: {\n * urls: Array,\n * pic_num: number,\n * col: number,\n * row: number,\n * height?: number,\n * width?: number,\n * },\n * videoConfig?: { [propName: string]: any },\n * commonStyle?: {\n * progressColor?: string,\n * playedColor?: string,\n * cachedColor?: string,\n * sliderBtnStyle?: { [propName: string]: any },\n * volumeColor?: string\n * },\n * [propName: string]: any;\n * } } IPlayerOptions\n */\n\n/**\n * @returns { IPlayerOptions }\n */\nexport default function getDefaultConfig () {\n return {\n id: '', // container DOM id\n el: null, // container domElement\n url: '', // the url need to play\n domEventType: 'default', // 事件类型,默认值default, touch | mouse\n nullUrlStart: false, // Whether to start broadcasting with empty url\n width: 600, // Width, unit px\n height: 337.5, // height, unit px\n fluid: false,\n fitVideoSize: 'fixed', // adaptation method of container width and height, fixWidth/fixHeight/fixed/auto\n videoFillMode: 'auto', // video screen fill mode, fillHeight/fillWidth/fill/auto/cover\n volume: 0.6, // default volume or config of plug-in volume\n autoplay: false,\n autoplayMuted: false, // whether to mute the start\n loop: false, // whether to loop\n isLive: false, // whether is live\n zoom: 1,\n videoInit: true, // whether to load the video/audio when initializing\n poster: '', // cover poster url or the configuration object for poster plugin\n isMobileSimulateMode: false, // simulation state, mobile/pc\n defaultPlaybackRate: 1, // default playback rate\n execBeforePluginsCall: null,\n allowSeekAfterEnded: true, // whether to allow seek after the playback ended\n enableContextmenu: false, // whether to allow the right-click function to be enabled\n closeVideoClick: false, // is to close the video’s click/touchend behavior to switch playback and pause\n closeVideoDblclick: false, // is to close the video`s double-click behavior to switch through full screen\n closePlayerBlur: false, // whether to close the behavior of calling player.blur() when the mouse moves out of the player area\n closeDelayBlur: false, // whether to close the automatic hide control bar behavior,only PC\n leavePlayerTime: 3000, // auto hide delay time when the mouse moves out of the player area\n closePlayVideoFocus: false, // whether to close the behavior of calling player.focus() in the play event callback\n closePauseVideoFocus: false, // whether to close the behavior of calling player.focus() in the pause event callback\n closeFocusVideoFocus: true, // whether to close the behavior of calling player.video.focus() when start play\n closeControlsBlur: true, // whether to close the behavior of calling player.focus() when the mouse moves out of the control bar area\n topBarAutoHide: true, // Whether to enable auto hide the top bar when player.blur()\n videoAttributes: {}, // video extended attributes\n startTime: 0, // auto play start time\n seekedStatus: 'play', // play state after seek ends play/pause/auto\n miniprogress: false, // whether to enable the mini progress bar\n disableSwipeHandler: () => {\n },\n enableSwipeHandler: () => {\n },\n ignores: [], // list of plug-in names to be disabled\n whitelist: [],\n inactive: 3000, // delay time for the control bar to disappear automatically\n lang: getLang(),\n controls: true,\n marginControls: false, // Whether the control bar is located at the bottom of the video and does not overlap with the video\n fullscreenTarget: null,\n screenShot: false, // whether to enable the screenshot plug-in\n rotate: false, // whether to enable the rotate plug-in\n pip: false, // whether to enable the picture-in-picture plug-in\n download: false, // whether to enable the download plug-in\n mini: false, // whether to enable the mini-screen plug-in\n cssFullscreen: true, // whether to enable the web page full-screen plug-in\n keyShortcut: true, // whether to open the shortcut key\n presets: [],\n plugins: [],\n playbackRate: 1,\n definition: { list: [] },\n playsinline: true,\n customDuration: 0, // User-defined duration\n timeOffset: 0, // currentTime offset\n icons: {},\n i18n: [],\n thumbnail: null, // Preview image configuration\n videoConfig: {}, // video attribute configuration\n commonStyle: { // General style configuration\n progressColor: '', // Background color of progress bar\n playedColor: '', // The background color of played part in the progress bar\n cachedColor: '', // The background color of cached part in the progress bar\n sliderBtnStyle: {}, // progress bar slider style\n volumeColor: ''\n }\n }\n}\n","export const usePreset = (player, Preset) => {\n let presetInst\n if (Preset.preset && Preset.options) {\n // eslint-disable-next-line new-cap\n presetInst = new (Preset.preset)(Preset.options, player.config)\n } else {\n presetInst = new Preset({}, player.config)\n }\n const { plugins = [], ignores = [], icons = {}, i18n = [] } = presetInst\n if (!player.config.plugins) {\n player.config.plugins = []\n }\n\n if (!player.config.ignores) {\n player.config.ignores = []\n }\n\n player.config.plugins.push(...plugins)\n player.config.ignores.push(...ignores)\n Object.keys(icons).map(key => {\n if (!player.config.icons[key]) {\n player.config.icons[key] = icons[key]\n }\n })\n const _ci18n = player.config.i18n || []\n i18n.push(..._ci18n)\n player.config.i18n = i18n\n}\n","export const STATES = {\n INITIAL: 1,\n READY: 2,\n ATTACHING: 3,\n ATTACHED: 4,\n NOTALLOW: 5,\n RUNNING: 6,\n ENDED: 7,\n DESTROYED: 8\n}\n\nexport const STATE_ARRAY = [\n 'ERROR',\n 'INITIAL',\n 'READY',\n 'ATTACHING',\n 'ATTACHED',\n 'NOTALLOW',\n 'RUNNING',\n 'ENDED',\n 'DESTROYED'\n]\n","import Plugin, { Events, Util, POSITIONS, Sniffer, STATE_CLASS } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * disable?: boolean,\n * autoHide?: boolean,\n * mode?: \"flex\"|\"normal\"|\"bottom\",\n * initShow?: boolean,\n * [propName: string]: any\n * }} IControlsConfig\n */\n\nclass Controls extends Plugin {\n static get pluginName () {\n return 'controls'\n }\n\n /**\n * @type IControlsConfig\n */\n static get defaultConfig () {\n return {\n disable: false,\n autoHide: true, // Whether to hide automatically\n mode: '', // Display mode, flex/normal/bottom\n initShow: false // Display when player is initialized\n }\n }\n\n beforeCreate (args) {\n if (!args.config.mode && Sniffer.device === 'mobile') {\n args.config.mode = 'flex'\n }\n if (args.player.config.marginControls) {\n args.config.autoHide = false\n }\n }\n\n afterCreate () {\n const { disable, height, mode } = this.config\n if (disable) {\n return\n }\n\n mode === 'flex' && this.player.addClass(STATE_CLASS.FLEX_CONTROLS)\n const style = {\n height: `${height}px`\n }\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.left = this.find('xg-left-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.center = this.find('xg-center-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.right = this.find('xg-right-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.innerRoot = this.find('xg-inner-controls')\n\n // The progress bar is switched synchronously when switching to the small window state\n this.on(Events.MINI_STATE_CHANGE, (isMini) => {\n isMini ? Util.addClass(this.root, 'mini-controls') : Util.removeClass(this.root, 'mini-controls')\n })\n\n const { isMobileSimulateMode } = this.playerConfig\n if (Sniffer.device !== 'mobile' && isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseleave', this.onMouseLeave)\n }\n }\n\n onMouseEnter = (e) => {\n const { player, playerConfig } = this\n playerConfig.closeControlsBlur && player.focus({ autoHide: false })\n }\n\n onMouseLeave = () => {\n const { player } = this\n player.focus()\n }\n\n focus () {\n this.player.focus({ autoHide: false })\n }\n\n focusAwhile () {\n this.player.focus({ autoHide: true })\n }\n\n blur () {\n this.player.blur({ ignorePaused: true })\n }\n\n recoverAutoHide () {\n // this.config.autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n this.config.autoHide && Util.addClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n pauseAutoHide () {\n // Util.removeClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n Util.removeClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n show () {\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n /**\n * @type {string}\n */\n get mode () {\n return this.config.mode\n }\n\n /**\n *\n * @param {} plugin\n * @param { {config?: {[propName: string]: any}, position?:string, root?: HTMLElement, pluginName?: string}} options\n * @param { string } name\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name) {\n if (!this.root) {\n return\n }\n const defaultConfig = plugin.defaultConfig || {}\n if (!options.root) {\n const position = options.position ? options.position : options.config && options.config.position ? options.config.position : defaultConfig.position\n switch (position) {\n case POSITIONS.CONTROLS_LEFT:\n options.root = this.left\n break\n case POSITIONS.CONTROLS_RIGHT:\n options.root = this.right\n break\n case POSITIONS.CONTROLS_CENTER:\n options.root = this.center\n break\n case POSITIONS.CONTROLS:\n options.root = this.root\n break\n default:\n options.root = this.left\n }\n return super.registerPlugin(plugin, options, name)\n }\n }\n\n destroy () {\n if (Sniffer.device !== 'mobile') {\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mouseleave', this.onMouseLeave)\n }\n }\n\n render () {\n const { mode, autoHide, initShow, disable } = this.config\n if (disable) {\n return\n }\n\n // autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n const className = Util.classNames(\n { 'xgplayer-controls': true },\n { 'flex-controls': mode === 'flex' },\n { 'bottom-controls': mode === 'bottom' },\n { [STATE_CLASS.CONTROLS_AUTOHIDE]: autoHide },\n { 'xgplayer-controls-initshow': initShow || !autoHide })\n return `\n \n \n \n \n \n \n \n `\n }\n}\n\nexport default Controls\n","import Util from '../utils/util'\nimport EN from './en'\n/**\n * @typedef { {\n * LANG: string,\n * TEXT: {\n * [propName: string]: any\n * }\n * } } IXGI18nText\n */\n\n/**\n * @typedef { {\n * lang: { [propName: string]: IXGI18nText },\n * langKeys: Array, // list of all currently supported languages\n * textKeys: { [propName: string]: string } // list of all currently supported texts\n * } } IXGI18n\n */\n\nconst XGI18nLang = {\n lang: {},\n langKeys: [],\n textKeys: []\n}\n\nfunction deepMerge (dst, src) {\n Object.keys(src).forEach(key => {\n const _s = Util.typeOf(src[key])\n const _t = Util.typeOf(dst[key])\n if (_s === 'Array') {\n if (_t !== 'Array') {\n dst[key] = []\n }\n dst[key].push(...src[key])\n } else if (_s === 'Object') {\n if (_t !== 'Object') {\n dst[key] = {}\n }\n deepMerge(dst[key], src[key])\n } else {\n dst[key] = src[key]\n }\n })\n return dst\n}\n\nfunction updateKeys () {\n Object.keys(XGI18nLang.lang.en).map(key => {\n XGI18nLang.textKeys[key] = key // key.toLowerCase()\n })\n}\n\n/**\n * @param { Array } i18nTextList\n * @param { IXGI18n } [i18nLangs]\n */\nfunction extend (i18nTextList, i18nLangs) {\n let ext = []\n if (!i18nLangs) {\n i18nLangs = XGI18nLang\n }\n if (!i18nLangs.lang) {\n return\n }\n if (Util.typeOf(i18nTextList) !== 'Array') {\n ext = Object.keys(i18nTextList).map(lang => {\n const keyLang = lang === 'zh' ? 'zh-cn' : lang\n return {\n LANG: keyLang,\n TEXT: i18nTextList[lang]\n }\n })\n } else {\n ext = i18nTextList\n }\n const { lang } = i18nLangs\n ext.map(item => {\n if (item.LANG === 'zh') {\n item.LANG = 'zh-cn'\n }\n if (!lang[item.LANG]) {\n use(item, i18nLangs)\n } else {\n deepMerge(lang[item.LANG] || {}, item.TEXT || {})\n }\n })\n updateKeys()\n}\n\n/**\n * @param { IXGI18nText } langData\n * @param { IXGI18n } [i18nLangs]\n */\nfunction use (langData, i18nLangs) {\n let _clang = langData.LANG\n if (!i18nLangs) {\n i18nLangs = XGI18nLang\n }\n if (!i18nLangs.lang) {\n return\n }\n const texts = langData.TEXT || {}\n if (_clang === 'zh') {\n _clang = 'zh-cn'\n }\n if (!i18nLangs.lang[_clang]) {\n i18nLangs.langKeys.push(_clang)\n i18nLangs.lang[_clang] = texts\n } else {\n deepMerge(i18nLangs.lang[_clang], texts)\n }\n updateKeys()\n}\n\n/**\n *\n * @returns { IXGI18n }\n */\nfunction init (id) {\n const ret = {\n lang: {},\n langKeys: [],\n textKeys: {},\n pId: id\n }\n deepMerge(ret.lang, XGI18nLang.lang)\n ret.langKeys.push(...XGI18nLang.langKeys)\n deepMerge(ret.textKeys, XGI18nLang.textKeys)\n return ret\n}\n\nuse(EN)\n\nconst I18N = {\n get textKeys () {\n return XGI18nLang.textKeys\n },\n /**\n * @description List of languages currently supported\n * @type { Array }\n */\n get langKeys () {\n return XGI18nLang.langKeys\n },\n /**\n * @type {{\n * [propName: string]: {\n * [propName: string]: string\n * }\n * }}\n */\n get lang () {\n const ret = {}\n XGI18nLang.langKeys.map(key => {\n ret[key] = XGI18nLang.lang[key]\n })\n if (XGI18nLang.lang['zh-cn']) {\n ret.zh = XGI18nLang.lang['zh-cn'] || {}\n }\n return ret\n },\n\n /**\n * @desc Extend existing languages text\n * @type {(I18nText: IXGI18nText) => {}}\n */\n extend: extend,\n\n /**\n * Add new language text\n * @type {(lang: IXGI18nText) => {}}\n */\n use: use,\n\n /**\n * Initialize a language text\n * @return { IXGI18n }\n */\n init: init\n}\n\nexport default I18N\n","export default {\n LANG: 'en',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: 'video download error'\n },\n mse: {\n code: 2,\n msg: 'stream append error'\n },\n parse: {\n code: 3,\n msg: 'parsing error'\n },\n format: {\n code: 4,\n msg: 'wrong format'\n },\n decoder: {\n code: 5,\n msg: 'decoding error'\n },\n runtime: {\n code: 6,\n msg: 'grammatical errors'\n },\n timeout: {\n code: 7,\n msg: 'play timeout'\n },\n other: {\n code: 8,\n msg: 'other errors'\n }\n },\n HAVE_NOTHING: 'There is no information on whether audio/video is ready',\n HAVE_METADATA: 'Audio/video metadata is ready ',\n HAVE_CURRENT_DATA: 'Data about the current play location is available, but there is not enough data to play the next frame/millisecond',\n HAVE_FUTURE_DATA: 'Current and at least one frame of data is available',\n HAVE_ENOUGH_DATA: 'The available data is sufficient to start playing',\n NETWORK_EMPTY: 'Audio/video has not been initialized',\n NETWORK_IDLE: 'Audio/video is active and has been selected for resources, but no network is used',\n NETWORK_LOADING: 'The browser is downloading the data',\n NETWORK_NO_SOURCE: 'No audio/video source was found',\n MEDIA_ERR_ABORTED: 'The fetch process is aborted by the user',\n MEDIA_ERR_NETWORK: 'An error occurred while downloading',\n MEDIA_ERR_DECODE: 'An error occurred while decoding',\n MEDIA_ERR_SRC_NOT_SUPPORTED: 'Audio/video is not supported',\n REPLAY: 'Replay',\n ERROR: 'Network is offline',\n PLAY_TIPS: 'Play',\n PAUSE_TIPS: 'Pause',\n PLAYNEXT_TIPS: 'Play next',\n DOWNLOAD_TIPS: 'Download',\n ROTATE_TIPS: 'Rotate',\n RELOAD_TIPS: 'Reload',\n FULLSCREEN_TIPS: 'Fullscreen',\n EXITFULLSCREEN_TIPS: 'Exit fullscreen',\n CSSFULLSCREEN_TIPS: 'Cssfullscreen',\n EXITCSSFULLSCREEN_TIPS: 'Exit cssfullscreen',\n TEXTTRACK: 'Caption',\n PIP: 'PIP',\n SCREENSHOT: 'Screenshot',\n LIVE: 'LIVE',\n OFF: 'Off',\n OPEN: 'Open',\n MINI_DRAG: 'Click and hold to drag',\n MINISCREEN: 'Miniscreen',\n REFRESH_TIPS: 'Please Try',\n REFRESH: 'Refresh',\n FORWARD: 'forward',\n LIVE_TIP: 'Live'\n }\n}\n","import VideoProxy from './proxy'\nimport Util, { checkIsCurrentVideo } from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Database from './utils/database'\nimport Errors from './error'\nimport * as Events from './events'\nimport { FULLSCREEN_EVENTS, GET_FULLSCREEN_API, EXIT_FULLSCREEN_API, PLATER_ID } from './constant'\nimport Plugin, { POSITIONS } from './plugin/plugin'\nimport BasePlugin from './plugin/basePlugin'\nimport pluginsManager from './plugin/pluginsManager'\nimport STATE_CLASS from './stateClassMap'\nimport getDefaultConfig from './defaultConfig'\nimport { usePreset } from './plugin/preset'\nimport hooksDescriptor, { runHooks, useHooks, removeHooks, delHooksDescriptor, usePluginHooks, removePluginHooks, hook } from './plugin/hooksDescriptor'\nimport Controls from './plugins/controls/index'\nimport XG_DEBUG, { bindDebug } from './utils/debug'\nimport I18N from './lang/i18n'\nimport version from './version'\nimport { STATES, STATE_ARRAY } from './state'\n\n/**\n * @typedef { import ('./defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef { import ('./defaultConfig').IDefinition } IDefinition\n */\n\n/* eslint-disable camelcase */\nconst PlAYER_HOOKS = ['play', 'pause', 'replay', 'retry']\nlet REAL_TIME_SPEED = 0 // 实时下载速率, kb/s\nlet AVG_SPEED = 0 // 平均下载速率, kb/s\n\nclass Player extends VideoProxy {\n /**\n * @type {number}\n * @description set debugger level\n * 1 - only print error logs\n * 2 - print warn logs and error logs\n * 3 - print all debug logs and error stack logs\n */\n static set debugger (value) {\n XG_DEBUG.config.debug = value\n }\n\n static get debugger () {\n return XG_DEBUG.config.debug\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | string | null }\n */\n static getCurrentUserActivePlayerId () {\n return pluginsManager.getCurrentUseActiveId()\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n */\n static setCurrentUserActive (playerId, isActive) {\n pluginsManager.setCurrentUserActive(playerId, isActive)\n }\n\n /**\n * @param { IPlayerOptions } options\n */\n constructor (options) {\n const config = Util.deepMerge(getDefaultConfig(), options)\n super(config)\n hooksDescriptor(this, PlAYER_HOOKS)\n\n /**\n * @type { IPlayerOptions }\n * @description 当前播放器的配置信息\n */\n this.config = config\n\n /**\n * @type { string }\n * @private\n */\n this._pluginInfoId = Util.generateSessionId()\n\n bindDebug(this)\n // resolve default preset\n const defaultPreset = this.constructor.defaultPreset\n if (this.config.presets.length) {\n const defaultIdx = this.config.presets.indexOf('default')\n if (defaultIdx >= 0 && defaultPreset) {\n this.config.presets[defaultIdx] = defaultPreset\n }\n } else if (defaultPreset) {\n this.config.presets.push(defaultPreset)\n }\n\n // timer and flags\n this.userTimer = null\n /**\n * @private\n */\n this.waitTimer = null\n\n /**\n * @private\n */\n this._state = STATES.INITIAL\n\n /**\n * @public\n * @readonly\n * @type { boolean }\n */\n this.isError = false\n\n /**\n * @private\n */\n this._hasStart = false\n /**\n * Whether the player is in the seeking state\n * @type { boolean }\n * @readonly\n */\n this.isSeeking = false\n\n /**\n * @type { boolean }\n * @readonly\n */\n this.isCanplay = false\n /**\n * @private\n * @readonly\n */\n this._runPending = false\n /**\n * @type { number }\n */\n this.rotateDeg = 0\n /**\n * Whether the player is focus\n * @type { boolean }\n * @readonly\n */\n this.isActive = false\n\n /**\n * Whether player is currently in fullscreen\n * @type { boolean }\n * @readonly\n */\n this.fullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.cssfullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.isRotateFullscreen = false\n\n /**\n * fullscreenElement\n * @type { HTMLElement | null }\n * @readonly\n */\n this._fullscreenEl = null\n\n /**\n * cssfullscreen target Element\n * @type { HTMLElement | null }\n * @readonly\n */\n this._cssfullscreenEl = null\n\n /**\n * @type { IDefinition | null }\n * @readonly\n */\n this.curDefinition = null\n /**\n * @private\n * @type { string }\n */\n this._orgCss = ''\n /**\n * @readonly\n * @type { number }\n */\n this._fullScreenOffset = null\n /**\n * @private\n * @type { number }\n */\n this._videoHeight = 0\n /**\n * @private\n * @type { number }\n */\n this._videoWidth = 0\n\n /**\n * @private\n * @type { { t: number, acc:number, acc: number, loopAcc: number, [propName: string]: any;} }\n */\n this._accPlayed = {\n t: 0,\n acc: 0,\n loopAcc: 0\n }\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 控制栏和video不同布局的时候内部容器\n */\n this.innerContainer = null\n\n /**\n * @type { null | Object }\n * @readonly\n * @description 控制栏插件\n */\n this.controls = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n */\n this.topBar = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 当前播放器根节点\n */\n this.root = null\n\n this.__i18n = I18N.init(this._pluginInfoId)\n\n // android 6以下不支持自动播放\n if (\n Sniffer.os.isAndroid &&\n Sniffer.osVersion > 0 &&\n Sniffer.osVersion < 6\n ) {\n this.config.autoplay = false\n }\n\n /**\n * @readonly\n * @type {any}\n */\n this.database = new Database()\n\n /**\n * @readonly\n * @type { boolean }\n */\n this.isUserActive = false\n\n const rootInit = this._initDOM()\n if (!rootInit) {\n console.error(\n new Error(\n `can't find the dom which id is ${this.config.id} or this.config.el does not exist`\n )\n )\n return\n }\n\n // url为空的情况下 根据definition或playnext.urlList设置播放地址\n // 若未配置definition.defaultDefinition,默认将配置为definition.list[0].definition\n const { definition = {}, url } = this.config\n\n if (!url && definition.list && definition.list.length > 0) {\n let defaultDefinitionObj = definition.list.find(\n (e) => e.definition && e.definition === definition.defaultDefinition\n )\n if (!defaultDefinitionObj) {\n definition.defaultDefinition = definition.list[0].definition\n defaultDefinitionObj = definition.list[0]\n }\n this.config.url = defaultDefinitionObj.url\n this.curDefinition = defaultDefinitionObj\n }\n\n this._bindEvents()\n this._registerPresets()\n this._registerPlugins()\n pluginsManager.onPluginsReady(this)\n\n // url为空的情况下 根据definition设置播放地址\n this.getInitDefinition()\n\n this.setState(STATES.READY)\n Util.setTimeout(this, () => {\n this.emit(Events.READY)\n }, 0)\n this.onReady && this.onReady()\n\n if (this.config.videoInit || this.config.autoplay) {\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n this.start()\n }\n }\n }\n\n /**\n * init control domElement\n * @private\n */\n _initDOM () {\n this.root = this.config.id ? document.getElementById(this.config.id) : null\n if (!this.root) {\n const el = this.config.el\n if (el && el.nodeType === 1) {\n this.root = el\n } else {\n this.emit(\n Events.ERROR,\n new Errors('use', this.config.vid, {\n line: 32,\n handle: 'Constructor',\n msg: 'container id can\\'t be empty'\n })\n )\n console.error('this.confg.id or this.config.el can\\'t be empty')\n return false\n }\n }\n const ret = pluginsManager.checkPlayerRoot(this.root)\n if (ret) {\n XG_DEBUG.logWarn(\n 'The is an Player instance already exists in this.root, destroy it and reinitialize'\n )\n ret.destroy()\n }\n this.root.setAttribute(PLATER_ID, this.playerId)\n pluginsManager.init(this)\n this._initBaseDoms()\n\n // 允许自定义video对象的构造\n const XgVideoProxy = this.constructor.XgVideoProxy\n if (XgVideoProxy && this.videoConfig.mediaType === XgVideoProxy.mediaType) {\n const el = this.innerContainer || this.root\n this.detachVideoEvents(this.video)\n const _nVideo = new XgVideoProxy(el, this.config, this.videoConfig)\n this.attachVideoEvents(_nVideo)\n this.video = _nVideo\n }\n this.video.setAttribute(PLATER_ID, this.playerId)\n if (this.config.controls) {\n const controls = pluginsManager.register(this, Controls)\n this.controls = controls\n }\n const device =\n this.config.isMobileSimulateMode === 'mobile' ? 'mobile' : Sniffer.device\n this.addClass(\n `${STATE_CLASS.DEFAULT} ${STATE_CLASS.INACTIVE} xgplayer-${device} ${\n this.config.controls ? '' : STATE_CLASS.NO_CONTROLS\n }`\n )\n if (this.config.autoplay) {\n this.addClass(STATE_CLASS.ENTER)\n } else {\n this.addClass(STATE_CLASS.NO_START)\n }\n if (this.config.fluid) {\n let { width, height } = this.config\n if (typeof width !== 'number' || typeof height !== 'number') {\n width = 600\n height = 337.5\n }\n const style = {\n width: '100%',\n height: '0',\n 'max-width': '100%',\n 'padding-top': `${(height * 100) / width}%`\n // position: 'relative',\n // top: '0',\n // left: '0'\n }\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\n } else {\n ['width', 'height'].forEach((key) => {\n if (this.config[key]) {\n if (typeof this.config[key] !== 'number') {\n this.root.style[key] = this.config[key]\n } else {\n this.root.style[key] = `${this.config[key]}px`\n }\n }\n })\n }\n return true\n }\n\n /**\n * @private\n */\n _initBaseDoms () {\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.topBar = Util.createDom(\n 'xg-bar',\n '',\n { 'data-index': -1 },\n 'xg-top-bar'\n )\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.leftBar = Util.createDom(\n 'xg-bar',\n '',\n { 'data-index': -1 },\n 'xg-left-bar'\n )\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.rightBar = Util.createDom(\n 'xg-bar',\n '',\n { 'data-index': -1 },\n 'xg-right-bar'\n )\n if (this.config.marginControls) {\n this.innerContainer = Util.createDom(\n 'xg-video-container',\n '',\n { 'data-index': -1 },\n 'xg-video-container'\n )\n this.root.appendChild(this.innerContainer)\n }\n\n if (this.config.topBarAutoHide) {\n Util.addClass(this.topBar, STATE_CLASS.TOP_BAR_AUTOHIDE)\n }\n\n this.root.appendChild(this.topBar)\n this.root.appendChild(this.leftBar)\n this.root.appendChild(this.rightBar)\n }\n\n /**\n * @private\n */\n _bindEvents () {\n ['focus', 'blur'].forEach((item) => {\n this.on(item, this['on' + item.charAt(0).toUpperCase() + item.slice(1)])\n })\n\n FULLSCREEN_EVENTS.forEach((item) => {\n document && document.addEventListener(item, this.onFullscreenChange)\n })\n\n if (Sniffer.os.isIos) {\n this.video.addEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.video.addEventListener( 'webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n this.once(Events.LOADED_DATA, this.resize)\n\n this.playFunc = () => {\n if (!this.config.closeFocusVideoFocus) {\n this.video.focus()\n }\n }\n this.once(Events.PLAY, this.playFunc)\n }\n\n /**\n * @private\n */\n _unbindEvents () {\n this.root.removeEventListener('mousemove', this.mousemoveFunc)\n FULLSCREEN_EVENTS.forEach((item) => {\n document.removeEventListener(item, this.onFullscreenChange)\n })\n this.playFunc && this.off(Events.PLAY, this.playFunc)\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.video.removeEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.video.removeEventListener('webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n /**\n *\n * @param { any } url\n * @returns\n */\n _startInit (url) {\n if (!this.video) {\n return\n }\n if (\n !url ||\n url === '' ||\n (Util.typeOf(url) === 'Array' && url.length === 0)\n ) {\n url = ''\n this.emit(Events.URL_NULL)\n XG_DEBUG.logWarn(\n 'config.url is null, please get url and run player._startInit(url)'\n )\n if (this.config.nullUrlStart) {\n return\n }\n }\n this._detachSourceEvents(this.video)\n if (Util.typeOf(url) === 'Array' && url.length > 0) {\n this._attachSourceEvents(this.video, url)\n } else if (!this.video.src || this.video.src !== url) {\n this.video.src = url\n }\n\n if (Util.typeOf(this.config.volume) === 'Number') {\n this.volume = this.config.volume\n }\n\n const _root = this.innerContainer ? this.innerContainer : this.root\n if (this.video instanceof window.Element && !_root.contains(this.video)) {\n _root.insertBefore(this.video, _root.firstChild)\n }\n\n const { readyState } = this.video\n XG_DEBUG.logInfo('_startInit readyState', readyState)\n if (this.config.autoplay) {\n !(/^blob/.test(this.video.currentSrc) || /^blob/.test(this.video.src)) &&\n this.load();\n // ios端无法自动播放的场景下,不调用play不会触发canplay loadeddata等事件\n (Sniffer.os.isIpad || Sniffer.os.isPhone) && this.videoPlay()\n }\n\n if (readyState >= 2) {\n this.canPlayFunc()\n } else {\n this.once(Events.CANPLAY, this.canPlayFunc)\n }\n\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n pluginsManager.afterInit(this)\n }\n this.hasStart = true\n this.setState(STATES.ATTACHED)\n Util.setTimeout(\n this,\n () => {\n this.emit(Events.COMPLETE)\n },\n 0\n )\n }\n\n /**\n * @description 注册组件 组件列表config.plugins\n * @param { {boolean} } [isInit] 是否是首次初始化\n * @private\n */\n _registerPlugins (isInit = true) {\n /**\n * @private\n */\n this._loadingPlugins = []\n const ignores = this.config.ignores || []\n const plugins = this.config.plugins || []\n const i18n = this.config.i18n || []\n isInit && I18N.extend(i18n, this.__i18n)\n const ignoresStr = ignores.join('||').toLowerCase().split('||')\n const cuPlugins = this.plugins\n plugins.forEach((plugin) => {\n try {\n const pluginName = plugin.plugin\n ? plugin.plugin.pluginName\n : plugin.pluginName\n // 在ignores中的不做组装\n if (pluginName && ignoresStr.indexOf(pluginName.toLowerCase()) > -1) {\n return null\n }\n\n if (!isInit && cuPlugins[pluginName.toLowerCase()]) {\n return\n }\n\n if (plugin.lazy && plugin.loader) {\n const loadingPlugin = pluginsManager.lazyRegister(this, plugin)\n if (plugin.forceBeforeInit) {\n loadingPlugin\n .then(() => {\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n .catch((e) => {\n XG_DEBUG.logError('_registerPlugins:loadingPlugin', e)\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n this._loadingPlugins.push(loadingPlugin)\n }\n\n return\n }\n return this.registerPlugin(plugin)\n } catch (err) {\n XG_DEBUG.logError('_registerPlugins:', err)\n // return\n }\n })\n }\n\n /**\n * @private\n */\n _registerPresets () {\n this.config.presets.forEach((preset) => {\n usePreset(this, preset)\n })\n }\n\n /**\n * @private\n * @param { string } position ]\n */\n _getRootByPosition (position) {\n let _root = null\n switch (position) {\n case POSITIONS.ROOT_RIGHT:\n _root = this.rightBar\n break\n case POSITIONS.ROOT_LEFT:\n _root = this.leftBar\n break\n case POSITIONS.ROOT_TOP:\n _root = this.topBar\n break\n default:\n _root = this.innerContainer || this.root\n break\n }\n return _root\n }\n\n /**\n *\n * @param { {plugin: function, options:object} | function } plugin\n * @param { {[propName: string]: any;} } [config]\n * @returns { any } plugin\n */\n registerPlugin (plugin, config) {\n const _retPlugin = pluginsManager.formatPluginInfo(plugin, config)\n const { PLUFGIN, options } = _retPlugin\n\n // 如果当前配置plugins中不存在该组件, 则将其push\n const { plugins } = this.config\n const exits = pluginsManager.checkPluginIfExits(PLUFGIN.pluginName, plugins)\n !exits && plugins.push(PLUFGIN)\n\n // 获取配置的position或者root\n const _pConfig = pluginsManager.getRootByConfig(PLUFGIN.pluginName, this.config)\n _pConfig.root && (options.root = _pConfig.root)\n _pConfig.position && (options.position = _pConfig.position)\n\n const position = options.position\n ? options.position\n : (options.config && options.config.position) ||\n (PLUFGIN.defaultConfig && PLUFGIN.defaultConfig.position)\n if (\n !options.root &&\n typeof position === 'string' &&\n position.indexOf('controls') > -1\n ) {\n return (\n this.controls &&\n this.controls.registerPlugin(PLUFGIN, options, PLUFGIN.pluginName)\n )\n }\n if (!options.root) {\n options.root = this._getRootByPosition(position)\n }\n return pluginsManager.register(this, PLUFGIN, options)\n }\n\n /**\n *\n * @param { any } plugin\n */\n deregister (plugin) {\n if (typeof plugin === 'string') {\n pluginsManager.unRegister(this, plugin)\n } else if (plugin instanceof BasePlugin) {\n pluginsManager.unRegister(this, plugin.pluginName)\n }\n }\n\n /**\n *\n * @param { any } plugin\n * @param { boolean } removedFromConfig\n */\n unRegisterPlugin (plugin, removedFromConfig = false) {\n this.deregister(plugin)\n if (removedFromConfig) {\n this.removePluginFromConfig(plugin)\n }\n }\n\n removePluginFromConfig (plugin) {\n let pluginName\n if (typeof plugin === 'string') {\n pluginName = plugin\n } else if (plugin instanceof BasePlugin) {\n pluginName = plugin.pluginName\n }\n if (!pluginName) {\n return\n }\n for (let i = this.config.plugins.length - 1; i > -1; i--) {\n const plugin = this.config.plugins[i]\n if (plugin.pluginName.toLowerCase() === pluginName.toLowerCase()) {\n this.config.plugins.splice(i, 1)\n break\n }\n }\n }\n\n /**\n * 当前播放器挂载的插件实例列表\n * @type { {[propName: string]: any | null } }\n */\n get plugins () {\n return pluginsManager.getPlugins(this)\n }\n\n /**\n * get a plugin instance\n * @param { string } pluginName\n * @return { null | any } plugin\n */\n getPlugin (pluginName) {\n const plugin = pluginsManager.findPlugin(this, pluginName)\n return plugin && plugin.pluginName ? plugin : null\n }\n\n /**\n *\n * @param { string } className\n */\n addClass (className) {\n if (!this.root) {\n return\n }\n if (!Util.hasClass(this.root, className)) {\n Util.addClass(this.root, className)\n }\n }\n\n /**\n *\n * @param { string } className\n * @returns\n */\n removeClass (className) {\n if (!this.root) {\n return\n }\n Util.removeClass(this.root, className)\n }\n\n /**\n *\n * @param { string } className\n * @returns { boolean } has\n */\n hasClass (className) {\n if (!this.root) {\n return\n }\n return Util.hasClass(this.root, className)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n setAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.setAttribute(key, value)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n removeAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.removeAttribute(key, value)\n }\n\n /**\n *\n * @param { any } url\n * @returns { Promise | void }\n * @description 启动播放器,start一般都是播放器内部隐式调用,主要功能是将video添加到DOM\n */\n start (url) {\n // 已经开始初始化播放了 则直接调用play\n if (this.hasStart || this.state >= STATES.ATTACHING) {\n return Promise.resolve()\n }\n if (!url && !this.config.url) {\n this.getInitDefinition()\n }\n this.hasStart = true\n this.setState(STATES.ATTACHING)\n\n this._registerPlugins(false)\n return pluginsManager\n .beforeInit(this)\n .then(() => {\n // this.config为空即已经销毁,不再执行后面的异步流程\n if (!this.config) {\n return\n }\n if (!url) {\n url = this.url || this.config.url\n }\n const ret = this._startInit(url)\n return ret\n })\n .catch((e) => {\n e.fileName = 'player'\n e.lineNumber = '236'\n XG_DEBUG.logError('start:beforeInit:', e)\n throw e\n })\n }\n\n /**\n * @param { string | object } url\n * @param { boolean } seamless\n * @returns { Promise | null } 执行结果\n */\n switchURL (url, seamless = false) {\n let _src = url\n if (Util.typeOf(url) === 'Object') {\n _src = url.url\n }\n const curTime = this.currentTime\n const isPaused = this.paused && !this.isError\n this.src = _src\n return new Promise((resolve) => {\n const _canplay = () => {\n this.currentTime = curTime\n if (isPaused) {\n this.once('canplay', () => {\n this.pause()\n })\n }\n resolve()\n }\n if (Sniffer.os.isAndroid) {\n this.once('timeupdate', () => {\n _canplay()\n })\n } else {\n this.once('canplay', () => {\n _canplay()\n })\n }\n this.play()\n })\n }\n\n videoPlay () {\n if (!this.hasStart && this.state < STATES.ATTACHED) {\n this.removeClass(STATE_CLASS.NO_START)\n this.addClass(STATE_CLASS.ENTER)\n const ret = this.start()\n ret &&\n ret.then((resolve) => {\n !this.config.autoplay && this.videoPlay()\n })\n return\n }\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n !this.isCanplay && this.addClass(STATE_CLASS.ENTER)\n }\n const playPromise = super.play()\n if (playPromise !== undefined && playPromise && playPromise.then) {\n playPromise\n .then(() => {\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.addClass(STATE_CLASS.PLAYING)\n if (this.state < STATES.RUNNING) {\n XG_DEBUG.logInfo('>>>>playPromise.then')\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n })\n .catch((e) => {\n XG_DEBUG.logWarn('>>>>playPromise.catch', e.name)\n if (this.video && this.video.error) {\n this.onError()\n // this.errorHandler('error')\n this.removeClass(STATE_CLASS.ENTER)\n // this.setState(STATES.ERROR)\n return\n }\n // 避免AUTOPLAY_PREVENTED先于playing和play触发\n if (e.name === 'NotAllowedError') {\n /**\n * @private\n */\n this._errorTimer = Util.setTimeout(\n this,\n () => {\n this._errorTimer = null\n this.emit(Events.AUTOPLAY_PREVENTED)\n this.addClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.ENTER)\n this.pause()\n this.setState(STATES.NOTALLOW)\n },\n 0\n )\n }\n })\n } else {\n XG_DEBUG.logWarn('video.play not return promise')\n if (this.state < STATES.RUNNING) {\n this.setState(STATES.RUNNING)\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.addClass(STATE_CLASS.PLAYING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n }\n return playPromise\n }\n\n videoPause () {\n super.pause()\n }\n\n play () {\n this.removeClass(STATE_CLASS.PAUSED)\n runHooks(this, 'play', () => {\n this.videoPlay()\n })\n }\n\n pause () {\n runHooks(this, 'pause', () => {\n super.pause()\n })\n }\n\n /**\n *\n * @param { number } time\n * @param { 'play' | 'pause' | 'auto' } [status]\n * @returns\n */\n seek (time, status) {\n if (!this.video || Number.isNaN(Number(time) || !this.hasStart)) {\n return\n }\n const { isSeekedPlay, seekedStatus } = this.config\n const _status = status || (isSeekedPlay ? 'play' : seekedStatus)\n time =\n time < 0 ? 0 : time > this.duration ? parseInt(this.duration, 10) : time\n this.once(Events.CANPLAY, () => {\n this.removeClass(STATE_CLASS.ENTER)\n this.isSeeking = false\n switch (_status) {\n case 'play':\n this.play()\n break\n case 'pause':\n this.pause()\n break\n default:\n !this.paused && this.play()\n }\n })\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n this.addClass(STATE_CLASS.ENTER)\n this.currentTime = time\n _status === 'play' && this.play()\n } else {\n this.currentTime = time\n }\n }\n\n getInitDefinition () {\n // url为空的情况下 根据definition设置播放地址\n const { definition, url } = this.config\n if (\n !url &&\n definition &&\n definition.list &&\n definition.list.length > 0 &&\n definition.defaultDefinition\n ) {\n definition.list.map((item) => {\n if (item.definition === definition.defaultDefinition) {\n this.config.url = item.url\n this.curDefinition = item\n }\n })\n }\n }\n\n /**\n * @typedef { {\n * url: any,\n * definition: any,\n * [propName: string]: any\n * } } definition\n */\n /**\n * @description change the definition of the current playback\n * @param { definition } to\n * @param { definition } [from]\n */\n changeDefinition (to, from) {\n const { definition } = this.config\n\n if (Array.isArray(definition?.list)) {\n definition.list.forEach((item) => {\n if (to?.definition === item.definition) {\n this.curDefinition = item\n }\n })\n }\n\n this.emit(Events.DEFINITION_CHANGE, { from, to })\n if (!this.hasStart) {\n this.config.url = to.url\n return\n }\n const ret = this.switchURL(to.url)\n if (ret && ret.then) {\n ret.then(() => {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n })\n } else {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n }\n }\n\n reload () {\n this.load()\n /**\n * @private\n */\n this.reloadFunc = function () {\n this.play()\n }\n this.once(Events.LOADED_DATA, this.reloadFunc)\n }\n\n resetState () {\n const {\n NOT_ALLOW_AUTOPLAY,\n PLAYING,\n NO_START,\n PAUSED,\n REPLAY,\n ENTER,\n ENDED,\n ERROR,\n LOADING\n } = STATE_CLASS\n const clsList = [\n NOT_ALLOW_AUTOPLAY,\n PLAYING,\n NO_START,\n PAUSED,\n REPLAY,\n ENTER,\n ENDED,\n ERROR,\n LOADING\n ]\n this.hasStart = false\n this.isError = false\n this.videoPause()\n this._accPlayed.acc = 0\n this._accPlayed.t = 0\n this._accPlayed.loopAcc = 0\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n this.addClass(STATE_CLASS.ENTER)\n this.emit(Events.RESET)\n }\n\n /**\n * 重置播放实例\n * @param { Array } unregisterPlugins 重置的时候需要卸载重新初始化的插件列表\n * @param { boolean } [isResetConfig] 是否需要重置配置列表\n * @returns\n */\n reset (unregisterPlugins = [], isResetConfig) {\n this.resetState()\n const { plugins } = this\n\n if (!plugins) {\n return\n }\n\n unregisterPlugins.map((pn) => {\n this.deregister(pn)\n })\n\n if (isResetConfig) {\n const de = getDefaultConfig()\n Object.keys(this.config).keys((k) => {\n if (\n this.config[k] !== 'undefined' &&\n (k === 'plugins' || k === 'presets' || k === 'el' || k === 'id')\n ) {\n this.config[k] = de[k]\n }\n })\n }\n }\n\n /**\n * @description destroy the player instance\n * @returns\n */\n destroy () {\n const { innerContainer, root, video } = this\n if (!root || !video) {\n return\n }\n this._hasStart = false\n root.removeAttribute(PLATER_ID)\n this.updateAcc('destroy')\n this._unbindEvents()\n this._detachSourceEvents(this.video)\n Util.clearAllTimers(this)\n this.emit(Events.DESTROY)\n pluginsManager.destroy(this)\n delHooksDescriptor(this)\n super.destroy()\n // 退出全屏\n if (this.fullscreen && this._fullscreenEl === this.root) {\n this.exitFullscreen()\n }\n\n if (innerContainer) {\n const _c = innerContainer.children\n for (let i = 0; i < _c.length; i++) {\n innerContainer.removeChild(_c[i])\n }\n }\n !innerContainer &&\n video instanceof window.Node &&\n root.contains(video) &&\n root.removeChild(video);\n ['topBar', 'leftBar', 'rightBar', 'innerContainer'].map((item) => {\n this[item] && root.removeChild(this[item])\n this[item] = null\n })\n const cList = root.className.split(' ')\n if (cList.length > 0) {\n root.className = cList\n .filter((name) => name.indexOf('xgplayer') < 0)\n .join(' ')\n } else {\n root.className = ''\n }\n this.removeAttribute('data-xgfill');\n\n [\n 'isSeeking',\n 'isCanplay',\n 'isActive',\n 'cssfullscreen',\n 'fullscreen'\n ].forEach((key) => {\n this[key] = false\n })\n }\n\n replay () {\n this.removeClass(STATE_CLASS.ENDED)\n this.currentTime = 0\n this.isSeeking = false\n runHooks(this, 'replay', () => {\n this.once(Events.CANPLAY, () => {\n const playPromise = this.videoPlay()\n if (playPromise && playPromise.catch) {\n playPromise.catch((err) => {\n console.log(err)\n })\n }\n })\n this.play()\n this.emit(Events.REPLAY)\n this.onPlay()\n })\n }\n\n retry () {\n this.removeClass(STATE_CLASS.ERROR)\n this.addClass(STATE_CLASS.LOADING)\n runHooks(this, 'retry', () => {\n const cur = this.currentTime\n // this.videoPause()\n this.src = this.config.url\n !this.config.isLive && (this.currentTime = cur)\n this.once(Events.CANPLAY, () => {\n this.videoPlay()\n })\n })\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n changeFullStyle (root, el, rootClass, pClassName) {\n if (!root) {\n return\n }\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (!this._orgCss) {\n this._orgCss = Util.filterStyleFromText(root)\n }\n Util.addClass(root, rootClass)\n if (el && el !== root && !this._orgPCss) {\n /**\n * @private\n */\n this._orgPCss = Util.filterStyleFromText(el)\n Util.addClass(el, pClassName)\n el.setAttribute(PLATER_ID, this.playerId)\n }\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n recoverFullStyle (root, el, rootClass, pClassName) {\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (this._orgCss) {\n Util.setStyleFromCsstext(root, this._orgCss)\n this._orgCss = ''\n }\n Util.removeClass(root, rootClass)\n if (el && el !== root && this._orgPCss) {\n Util.setStyleFromCsstext(el, this._orgPCss)\n this._orgPCss = ''\n Util.removeClass(el, pClassName)\n el.removeAttribute(PLATER_ID)\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise }\n */\n getFullscreen (el = this.config.fullscreenTarget) {\n const { root, video } = this\n if (!el) {\n el = root\n }\n this._fullScreenOffset = {\n top: Util.scrollTop(),\n left: Util.scrollLeft()\n }\n\n this._fullscreenEl = el\n /**\n * @private\n */\n this._fullActionFrom = 'get'\n const fullEl = Util.getFullScreenEl()\n if (fullEl === this._fullscreenEl) {\n this.onFullscreenChange()\n return\n }\n try {\n for (let i = 0; i < GET_FULLSCREEN_API.length; i++) {\n const key = GET_FULLSCREEN_API[i]\n if (el[key]) {\n const ret =\n key === 'webkitRequestFullscreen'\n ? el.webkitRequestFullscreen(window.Element.ALLOW_KEYBOARD_INPUT)\n : el[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (video.fullscreenEnabled || video.webkitSupportsFullscreen) {\n video.webkitEnterFullscreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call getFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call getFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise }\n */\n exitFullscreen (el) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n }\n if (!this._fullscreenEl && !Util.getFullScreenEl()) {\n return\n }\n const { root, video } = this\n if (el) {\n el = root\n }\n this._fullActionFrom = 'exit'\n try {\n for (let i = 0; i < EXIT_FULLSCREEN_API.length; i++) {\n const key = EXIT_FULLSCREEN_API[i]\n if (document[key]) {\n const ret = document[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (video && video.webkitSupportsFullscreen) {\n video.webkitExitFullScreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call exitFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call exitFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n getCssFullscreen (el = this.config.fullscreenTarget) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n } else if (this.fullscreen) {\n this.exitFullscreen()\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n this.changeFullStyle(this.root, el, _class)\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.fullscreen = true\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n this._cssfullscreenEl = el\n this.cssfullscreen = true\n this.emit(Events.CSS_FULLSCREEN_CHANGE, true)\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n exitCssFullscreen () {\n const _class = this._cssfullscreenEl\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n if (!this.fullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n } else {\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n this.fullscreen = false\n this.emit(Events.FULLSCREEN_CHANGE, false)\n } else {\n this.removeClass(_class)\n }\n }\n this._cssfullscreenEl = null\n this.cssfullscreen = false\n this.emit(Events.CSS_FULLSCREEN_CHANGE, false)\n }\n\n /**\n * 进入旋转全屏\n * @param { HTMLElement } [el]\n */\n getRotateFullscreen (el) {\n if (this.cssfullscreen) {\n this.exitCssFullscreen(el)\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this._fullscreenEl = el || this.root\n this.changeFullStyle(\n this.root,\n el,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = true\n this.fullscreen = true\n this.setRotateDeg(90)\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n\n /**\n * 退出旋转全屏\n * @param { HTMLElement } [el]\n */\n exitRotateFullscreen (el) {\n const _class =\n this._fullscreenEl !== this.root\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this.recoverFullStyle(\n this.root,\n this._fullscreenEl,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = false\n this.fullscreen = false\n this.setRotateDeg(0)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n }\n\n setRotateDeg (deg) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.rotateDeg = 0\n } else {\n this.rotateDeg = deg\n }\n }\n\n /**\n * @description 播放器焦点状态,控制栏显示\n * @param { {\n * autoHide?: boolean, // 是否可以自动隐藏\n * delay?: number // 自动隐藏的延迟时间, ms, 不传默认使用3000ms\n * } } [data]\n */\n focus (\n data = {\n autoHide: !this.config.closeDelayBlur,\n delay: this.config.inactive\n }\n ) {\n if (this.isActive) {\n this.onFocus(data)\n return\n }\n this.emit(Events.PLAYER_FOCUS, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @description 取消播放器当前焦点状态\n * @param { { ignorePaused?: boolean } } [data]\n */\n blur (data = { ignorePaused: false }) {\n if (!this.isActive) {\n this.onBlur(data)\n return\n }\n this.emit(Events.PLAYER_BLUR, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @protected\n * @param { { autoHide?: boolean, delay?: number} } [data]\n * @returns\n */\n onFocus ({\n autoHide = !this.config.closePlayerBlur,\n delay = this.config.inactive\n } = {}) {\n this.isActive = true\n this.removeClass(STATE_CLASS.INACTIVE)\n if (this.userTimer) {\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n if (!autoHide) {\n if (this.userTimer) {\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n return\n }\n this.userTimer = Util.setTimeout(\n this,\n () => {\n this.userTimer = null\n this.blur()\n },\n delay\n )\n }\n\n /**\n * @protected\n * @param {{ ignorePaused?: boolean }} [data]\n * @returns\n */\n onBlur ({ ignorePaused = false } = {}) {\n if (!this.isActive) {\n return\n }\n const { closePauseVideoFocus } = this.config\n this.isActive = false\n if (ignorePaused || closePauseVideoFocus || (!this.paused && !this.ended)) {\n this.addClass(STATE_CLASS.INACTIVE)\n }\n }\n\n canPlayFunc = () => {\n if (!this.config) {\n return\n }\n const { autoplay, startTime, defaultPlaybackRate } = this.config\n\n XG_DEBUG.logInfo('player', 'canPlayFunc, startTime', startTime)\n if (startTime) {\n this.currentTime = startTime > this.duration ? this.duration : startTime\n this.config.startTime = 0 // 仅仅使用一次\n }\n\n // 解决浏览器安装了一些倍速扩展插件的情况下,倍速设置失效问题\n this.playbackRate = defaultPlaybackRate\n\n autoplay && this.videoPlay()\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.removeClass(STATE_CLASS.ENTER)\n }\n\n /**\n *\n */\n onFullscreenChange = (event, isFullScreen) => {\n const delayResize = () => {\n Util.setTimeout(this, () => {\n this.resize()\n }, 100)\n }\n const fullEl = Util.getFullScreenEl()\n if (this._fullActionFrom) {\n this._fullActionFrom = ''\n } else {\n // 快捷键触发\n this.emit(Events.USER_ACTION, {\n eventType: 'system',\n action: 'switch_fullscreen',\n pluginName: 'player',\n currentTime: this.currentTime,\n duration: this.duration,\n props: [{\n prop: 'fullscreen',\n from: true,\n to: false\n }]\n })\n }\n const isVideo = checkIsCurrentVideo(fullEl, this.playerId, PLATER_ID)\n if (isFullScreen || (fullEl && (fullEl === this._fullscreenEl || isVideo))) {\n delayResize()\n !this.config.closeFocusVideoFocus && this.video.focus()\n this.fullscreen = true\n // this.addClass(STATE_CLASS.FULLSCREEN)\n this.changeFullStyle(this.root, fullEl, STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, true, this._fullScreenOffset)\n if (this.cssfullscreen) {\n this.exitCssFullscreen()\n }\n } else if (this.fullscreen) {\n delayResize()\n const { _fullScreenOffset, config } = this\n if (config.needFullscreenScroll) {\n // 保证页面scroll的情况下退出全屏 页面回到原位置\n window.scrollTo(_fullScreenOffset.left, _fullScreenOffset.top)\n Util.setTimeout( this, () => {\n this.fullscreen = false\n this._fullScreenOffset = null\n }, 100)\n } else {\n // 保证页面scroll的情况下退出全屏 页面定位在播放器位置\n !this.config.closeFocusVideoFocus && this.video.focus()\n this.fullscreen = false\n this._fullScreenOffset = null\n }\n if (!this.cssfullscreen) {\n this.recoverFullStyle( this.root,this._fullscreenEl, STATE_CLASS.FULLSCREEN)\n } else {\n this.removeClass(STATE_CLASS.FULLSCREEN)\n }\n this._fullscreenEl = null\n // this.removeClass(STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n }\n }\n\n _onWebkitbeginfullscreen = (e) => {\n this._fullscreenEl = this.video\n this.onFullscreenChange(e, true)\n }\n\n _onWebkitendfullscreen = (e) => {\n this.onFullscreenChange(e, false)\n }\n\n onEmptied () {\n this.updateAcc('emptied')\n }\n\n /**\n * @protected\n */\n onCanplay () {\n this.state >= STATES.RUNNING && this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.LOADING)\n this.isCanplay = true\n this.waitTimer && Util.clearTimeout(this, this.waitTimer)\n }\n\n onLoadedData () {\n this.isError = false\n }\n\n /**\n * @protected\n */\n onPlay () {\n if (this.state === STATES.ENDED) {\n this.setState(STATES.RUNNING)\n }\n this.removeClass(STATE_CLASS.PAUSED)\n this.ended && this.removeClass(STATE_CLASS.ENDED)\n !this.config.closePlayVideoFocus && this.focus()\n }\n\n /**\n * @protected\n */\n onPause () {\n this.addClass(STATE_CLASS.PAUSED)\n this.updateAcc('pause')\n if (!this.config.closePauseVideoFocus) {\n if (this.userTimer) {\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n this.focus()\n }\n }\n\n /**\n * @protected\n */\n onEnded () {\n this.updateAcc('ended')\n this.addClass(STATE_CLASS.ENDED)\n this.setState(STATES.ENDED)\n // this.removeClass(STATE_CLASS.PLAYING)\n }\n\n /**\n * @protected\n */\n onError () {\n // this.setState(STATES.ERROR)\n this.isError = true\n this.updateAcc('error')\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.LOADING)\n this.addClass(STATE_CLASS.ERROR)\n }\n\n /**\n * @protected\n */\n onSeeking () {\n if (!this.isSeeking) {\n this.updateAcc('seeking')\n }\n this.isSeeking = true\n this.addClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onSeeked () {\n this.isSeeking = false\n // for ie,playing fired before waiting\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.removeClass(STATE_CLASS.LOADING)\n this.removeClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onWaiting () {\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.updateAcc('waiting')\n this.waitTimer = Util.setTimeout(this, () => {\n this.addClass(STATE_CLASS.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }, 200)\n }\n\n /**\n * @protected\n */\n onPlaying () {\n this.isError = false\n const { NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING } = STATE_CLASS\n const clsList = [NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING]\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n }\n\n /**\n * @protected\n */\n onTimeupdate () {\n !this._videoHeight && this.resize()\n if ((this.waitTimer || this.hasClass(STATE_CLASS.LOADING)) &&\n this.video.readyState > 2\n ) {\n this.removeClass(STATE_CLASS.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }\n\n // 兼容safari在调整为静音之后未调用play自动起播问题\n if (!this.paused && this.state < STATES.RUNNING && this.duration) {\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n\n if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n onVolumechange () {\n Util.typeOf(this.config.volume) === 'Number' &&\n (this.config.volume = this.volume)\n }\n\n onRatechange () {\n this.config.defaultPlaybackRate = this.playbackRate\n }\n\n /**\n * 触发用户行为事件,第一个参数是Dom事件\n * @param { Event } event\n * @param { string } action\n * @param {[propName: string]: any; } [params]\n * @returns\n */\n emitUserAction (event, action, params) {\n if (!this.video || !action || !event) {\n return\n }\n const eventType =\n Util.typeOf(event) === 'String' ? event : event.type || ''\n\n // if (action === 'switch_play_pause') {\n // Util.typeOf(params.paused) === 'Undefined' && (params.paused = this.paused)\n // params.isFirstStart = !this.playing\n // }\n\n if (params.props && Util.typeOf(params.props) !== 'Array') {\n params.props = [params.props]\n }\n this.emit(Events.USER_ACTION, {\n eventType,\n action,\n // pluginName: this.pluginName,\n currentTime: this.currentTime,\n duration: this.duration,\n ended: this.ended,\n event,\n ...params\n })\n }\n\n updateAcc (endType) {\n if (this._accPlayed.t) {\n const _at = new Date().getTime() - this._accPlayed.t\n this._accPlayed.acc += _at\n this._accPlayed.t = 0\n if (endType === 'ended' || this.ended) {\n this._accPlayed.loopAcc = this._accPlayed.acc\n }\n }\n }\n\n /**\n *\n * @param { number } time\n * @returns { boolean }\n */\n checkBuffer (time) {\n const buffered = this.video.buffered\n if (!buffered || buffered.length === 0 || !this.duration) {\n return true\n }\n const currentTime = time || this.video.currentTime || 0.2\n const len = buffered.length\n for (let i = 0; i < len; i++) {\n if (buffered.start(i) <= currentTime && buffered.end(i) > currentTime) {\n return true\n }\n }\n return false\n }\n\n /**\n * @description position video/audio according to height ratio and y coordinate\n * @param { { h: number, y?: number, x?:number, w?:number} } pos\n * @returns\n */\n position (pos = { h: 0, y: 0, x: 0, w: 0 }) {\n if (!this.video || !pos || !pos.h) {\n return\n }\n const rvH = 1 / pos.h\n let _transform = rvH !== 1 ? `scale(${rvH})` : ''\n let _tx = 0\n let _ty = 0\n if (pos.y) {\n _ty = (100 - pos.h * 100) / 2 - pos.y * 100\n }\n if (pos.w && pos.x) {\n _tx = (100 - pos.w * 100) / 2 - pos.x * 100\n }\n _transform += ` translate(${_tx}%, ${_ty}%)`\n this.video.style.transform = _transform\n this.video.style.webkitTransform = _transform\n }\n\n /**\n * @description Update configuration parameters\n * @param { IPlayerOptions } config\n */\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map((key) => {\n if (key !== 'plugins') {\n this.config[key] = config[key]\n const plugin = this.plugins[key.toLowerCase()]\n if (plugin && Util.typeOf(plugin.setConfig) === 'Function') {\n plugin.setConfig(config[key])\n }\n }\n })\n }\n\n /**\n * @description play another video resource\n * @param { IPlayerOptions } config\n */\n playNext (config) {\n this.resetState()\n this.setConfig(config)\n this._currentTime = 0\n this._duration = 0\n this.play()\n this.emit(Events.PLAYNEXT, config)\n }\n\n resize () {\n if (!this.video) {\n return\n }\n const { videoWidth, videoHeight } = this.video\n const { fitVideoSize, videoFillMode } = this.config\n\n if (videoFillMode === 'fill' || videoFillMode === 'cover') {\n this.setAttribute('data-xgfill', videoFillMode)\n }\n\n if (!videoHeight || !videoWidth) {\n return\n }\n this._videoHeight = videoHeight\n this._videoWidth = videoWidth\n const containerSize = this.root.getBoundingClientRect()\n const controlsHeight =\n this.controls && this.innerContainer\n ? this.controls.root.getBoundingClientRect().height\n : 0\n const width = containerSize.width\n const height = containerSize.height - controlsHeight\n const videoFit = parseInt((videoWidth / videoHeight) * 1000, 10)\n const fit = parseInt((width / height) * 1000, 10)\n let rWidth = width\n let rHeight = height\n const _style = {}\n if (\n (fitVideoSize === 'auto' && fit > videoFit) ||\n fitVideoSize === 'fixWidth'\n ) {\n rHeight = (width / videoFit) * 1000\n if (this.config.fluid) {\n _style.paddingTop = `${(rHeight * 100) / rWidth}%`\n } else {\n _style.height = `${rHeight + controlsHeight}px`\n }\n } else if (\n (fitVideoSize === 'auto' && fit < videoFit) ||\n fitVideoSize === 'fixHeight'\n ) {\n rWidth = (videoFit * height) / 1000\n _style.width = `${rWidth}px`\n }\n // 全屏不做行间css设置\n if (!this.fullscreen && !this.cssfullscreen) {\n Object.keys(_style).forEach((key) => {\n this.root.style[key] = _style[key]\n })\n }\n // video填充模式\n if (\n (videoFillMode === 'fillHeight' && fit < videoFit) ||\n (videoFillMode === 'fillWidth' && fit > videoFit)\n ) {\n this.setAttribute('data-xgfill', 'cover')\n }\n const data = {\n videoScale: videoFit,\n vWidth: rWidth,\n vHeight: rHeight,\n cWidth: rWidth,\n cHeight: rHeight + controlsHeight\n }\n this.emit(Events.VIDEO_RESIZE, data)\n }\n\n /**\n *\n * @param { number } left\n * @param { number } top\n * @returns\n */\n updateObjectPosition (left = 0, top = 0) {\n if (this.video.updateObjectPosition) {\n this.video.updateObjectPosition(left, top)\n return\n }\n this.video.style.objectPosition = `${left * 100}% ${top * 100}%`\n }\n\n /**\n * @protected\n * @param { number } newState\n */\n setState (newState) {\n XG_DEBUG.logInfo(\n 'setState',\n `state from:${STATE_ARRAY[this.state]} to:${STATE_ARRAY[newState]}`\n )\n this._state = newState\n }\n\n /**\n * @type { number }\n */\n get state () {\n return this._state\n }\n\n /**\n * @type { boolean }\n */\n get isFullscreen () {\n return this.fullscreen\n }\n\n /**\n * @type { boolean }\n */\n get isCssfullScreen () {\n return this.cssfullscreen\n }\n\n /**\n * @type { boolean }\n * @description 是否开始播放\n */\n get hasStart () {\n return this._hasStart\n }\n\n set hasStart (bool) {\n if (typeof bool === 'boolean') {\n this._hasStart = bool\n if (bool === false) {\n this.setState(STATES.READY)\n }\n this.emit('hasstart')\n }\n }\n\n /**\n * @type { boolean }\n * @description 是否已经进入起播状态\n */\n get isPlaying () {\n return this._state === STATES.RUNNING || this._state === STATES.ENDED\n }\n\n set isPlaying (value) {\n if (value) {\n this.setState(STATES.RUNNING)\n } else {\n this._state >= STATES.RUNNING && (this.setState(STATES.ATTACHED))\n }\n }\n\n /**\n * @type { Array. }\n */\n set definitionList (list) {\n const { definition } = this.config\n let curDef = null\n let targetDef = null\n\n definition.list = list\n this.emit('resourceReady', list)\n\n list.forEach((item) => {\n if (this.curDefinition?.definition === item.definition) {\n curDef = item\n }\n if (definition.defaultDefinition === item.definition) {\n targetDef = item\n }\n })\n if (!targetDef && list.length > 0) {\n targetDef = list[0]\n }\n curDef\n ? this.changeDefinition(curDef)\n : targetDef && this.changeDefinition(targetDef)\n }\n\n get definitionList () {\n if (!this.config || !this.config.definition) {\n return []\n }\n return this.config.definition.list || []\n }\n\n /**\n * @description VideoFrames infos\n * @type { {\n * total: number,\n * dropped: number,\n * corrupted: number,\n * droppedRate: number,\n * droppedDuration: number\n * } }\n */\n get videoFrameInfo () {\n const ret = {\n total: 0,\n dropped: 0,\n corrupted: 0,\n droppedRate: 0,\n droppedDuration: 0\n }\n if (!this.video || !this.video.getVideoPlaybackQuality) {\n return ret\n }\n const _quality = this.video.getVideoPlaybackQuality()\n ret.dropped = _quality.droppedVideoFrames || 0\n ret.total = _quality.totalVideoFrames || 0\n ret.corrupted = _quality.corruptedVideoFrames || 0\n if (ret.total > 0) {\n ret.droppedRate = (ret.dropped / ret.total) * 100\n ret.droppedDuration = parseInt(\n (this.cumulateTime / ret.total) * ret.dropped,\n 0\n )\n }\n return ret\n }\n\n /**\n * @type { string }\n */\n set lang (lang) {\n const result = I18N.langKeys.filter((key) => key === lang)\n if (result.length === 0 && lang !== 'zh') {\n console.error(\n `Sorry, set lang fail, because the language [${lang}] is not supported now, list of all supported languages is [${I18N.langKeys.join()}] `\n )\n return\n }\n this.config.lang = lang\n pluginsManager.setLang(lang, this)\n }\n\n get lang () {\n return this.config.lang\n }\n\n get i18n () {\n let _l = this.config.lang\n if (_l === 'zh') {\n _l = 'zh-cn'\n }\n return this.__i18n.lang[_l] || this.__i18n.lang.en\n }\n\n get i18nKeys () {\n return this.__i18n.textKeys || {}\n }\n\n /**\n * @type { string }\n */\n get version () {\n return version\n }\n\n /**\n * @type { number | string }\n */\n get playerId () {\n return this._pluginInfoId\n }\n\n /**\n * @type { any }\n */\n set url (url) {\n /**\n * @private\n */\n this.__url = url\n }\n\n get url () {\n return this.__url || this.config.url\n }\n\n /**\n * @type { string }\n */\n set poster (posterUrl) {\n this.plugins.poster && this.plugins.poster.update(posterUrl)\n }\n\n get poster () {\n return this.plugins.poster\n ? this.plugins.poster.config.poster\n : this.config.poster\n }\n\n /**\n * @type { string }\n */\n get readyState () {\n const key = super.readyState\n return this.i18n[key] || key\n }\n\n get error () {\n const key = super.error\n return this.i18n[key] || key\n }\n\n get networkState () {\n const key = super.networkState\n return this.i18n[key] || key\n }\n\n /**\n * @type { boolean }\n */\n get fullscreenChanging () {\n return !(this._fullScreenOffset === null)\n }\n\n /**\n * 累计观看时长\n * @type number\n */\n get cumulateTime () {\n const { _accPlayed } = this\n this.updateAcc('get')\n return _accPlayed.acc\n }\n\n /**\n * @type { number }\n */\n get zoom () {\n return this.config.zoom\n }\n\n /**\n * @type { number }\n */\n set zoom (value) {\n this.config.zoom = value\n }\n\n /**\n * @description 均衡下载速度,单位kb/s, 根据10条最新下载速度计算出来的加权值,如果没有测速能力则默认是0\n * @type { number }\n */\n set avgSpeed (val) {\n AVG_SPEED = val\n }\n\n get avgSpeed () {\n return AVG_SPEED\n }\n\n /**\n * @type { number }\n * 最新一次下载速度,单位kb/s, 如果没有测速能力则默认是0\n */\n set realTimeSpeed (val) {\n REAL_TIME_SPEED = val\n }\n\n get realTimeSpeed () {\n return REAL_TIME_SPEED\n }\n\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns {boolean} isSuccess\n */\n useHooks (hookName, handler) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise } handler\n * @returns\n */\n removeHooks (hookName, handler) {\n return removeHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n usePluginHooks (pluginName, hookName, handler, ...args) {\n return usePluginHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n removePluginHooks (pluginName, hookName, handler, ...args) {\n return removePluginHooks.call(this, ...arguments)\n }\n\n /**\n * 设置当前实例的用户激活态\n * @param { boolean } isActive\n * @param { boolean } [isMuted]\n */\n setUserActive (isActive, isMuted) {\n if (typeof isMuted === 'boolean' && isMuted !== this.muted) {\n this.addInnerOP('volumechange')\n this.muted = isMuted\n }\n pluginsManager.setCurrentUserActive(this.playerId, isActive)\n }\n\n /**\n * 当前浏览器是否支持hevc编码\n * @returns {boolean}\n */\n static isHevcSupported () {\n return Sniffer.isHevcSupported()\n }\n\n /**\n * 检测编码参数是否被当前浏览器支持\n * @doc https://developer.mozilla.org/en-US/docs/Web/API/MediaCapabilities/decodingInfo\n * @param {MediaDecodingConfiguration} info\n * @returns {MediaCapabilitiesDecodingInfo}\n */\n static probeConfigSupported (info) {\n return Sniffer.probeConfigSupported(info)\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static install (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n if (!Player.plugins[name]) {\n Player.plugins[name] = descriptor\n }\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static use (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n Player.plugins[name] = descriptor\n }\n\n static defaultPreset = null;\n\n /**\n * @description 自定义media构造函数\n */\n static XgVideoProxy = null;\n}\n\nexport {\n Player as default,\n Plugin,\n BasePlugin,\n Events,\n Errors,\n Sniffer,\n Util,\n STATE_CLASS,\n I18N\n}\n","import BasePlugin, { Events, Util } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nfunction now () {\n return new Date().getTime()\n}\n\nconst LOG_TYPES = {\n LOAD_START: 'loadstart',\n LOADED_DATA: 'loadeddata',\n FIRST_FRAME: 'firstFrame',\n WAIT_START: 'waitingStart',\n WAIT_END: 'waitingEnd',\n SEEK_START: 'seekStart',\n SEEK_END: 'seekEnd'\n}\nclass XGLogger extends BasePlugin {\n static get pluginName () {\n return 'xgLogger'\n }\n\n static get defaultConfig () {\n return {}\n }\n\n afterCreate () {\n this._onReset()\n this._waitType = 'firstFrame'\n\n this._initOnceEvents()\n\n this.on(Events.LOAD_START, () => {\n const { _state } = this\n const { autoplayStart, isFFSend } = _state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOAD_START`, `autoplayStart:${autoplayStart} isFFSend:${isFFSend}`)\n if (isFFSend) {\n return\n }\n !_state.isLs && this.emitLog(LOG_TYPES.LOAD_START, {})\n _state.isLs = true\n _state.isTimeUpdate = false\n _state.isFFLoading = true\n this.pt = now()\n this.vt = 0\n this.fvt = 0\n this._initOnceEvents()\n this._onWaitingLoadStart()\n })\n\n this.on(Events.LOADED_DATA, () => {\n this.vt = now()\n this.fvt = this.vt - this.pt\n const { isTimeUpdate, isFFSend, autoplayStart } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOADED_DATA`, `fvt:${this.fvt} isTimeUpdate:${this._state.isTimeUpdate}`)\n if (isTimeUpdate && autoplayStart) {\n this._sendFF('loadedData')\n }\n if (!isFFSend) {\n this.emitLog(LOG_TYPES.LOADED_DATA, {})\n }\n this.suspendWaitingStatus('loadeddata')\n })\n\n this.on(Events.SEEKING, this._onSeeking)\n this.on(Events.SEEKED, this._onSeeked)\n\n this.on(Events.DESTROY, () => {\n this.endState('destroy')\n })\n\n this.on(Events.URL_CHANGE, () => {\n this.endState('urlChange')\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} URL_CHANGE`)\n this._state.isFFSend && this._onReset()\n })\n\n this.on([Events.PLAYING, Events.CANPLAY], this._onPlaying)\n\n this.on(Events.WAITING, this._onWaiting)\n this.on(Events.ERROR, this._onError)\n this.on(Events.RESET, () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} RESET`)\n this.endState('reset')\n this._initOnceEvents()\n this._onReset()\n })\n }\n\n _initOnceEvents () {\n this.off(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.off(Events.TIME_UPDATE, this._onTimeupdate)\n this.once(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.once(Events.TIME_UPDATE, this._onTimeupdate)\n }\n\n _sendFF (endType) {\n this.s = now()\n const { isFFLoading, isFFSend } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _sendFF`, `${endType} fvt:${this.fvt} isFFLoading:${isFFLoading} !isFFSend:${!isFFSend}`)\n if (this.vt > 0 && isFFLoading && !isFFSend) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} emitLog_firstFrame`, endType)\n this._state.isFFLoading = false\n this._state.isFFSend = true\n this.emitLog(LOG_TYPES.FIRST_FRAME, { fvt: this.fvt, costTime: this.fvt, vt: this.vt })\n }\n }\n\n _onTimeupdate = () => {\n this._state.isTimeUpdate = true\n if (this._state.autoplayStart) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onTimeupdate`)\n this._sendFF('onTimeupdate')\n }\n }\n\n _onAutoplayStart = () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onAutoplayStart`)\n this._state.autoplayStart = true\n this.vt && this._sendFF('onAutoplayStart')\n }\n\n _onReset = () => {\n this._state = {\n autoplayStart: false, // 是否已经自动起播\n isFFLoading: false, // LOAD_START是否已经触发\n isTimeUpdate: false, // 第一次timeupdate是否已经触发\n isFFSend: false, // 首帧事件是否已经触发\n isLs: false // loadstart是否已经发送\n }\n this.vt = 0\n this.pt = 0\n this.fvt = 0\n this._isSeeking = false\n this.seekingStart = 0\n this.waitingStart = 0\n this._isWaiting = false\n this._waitTimer && Util.clearTimeout(this, this._waitTimer)\n this._waittTimer && Util.clearTimeout(this, this._waittTimer)\n this._waitTimer = null\n this._waittTimer = null\n this._waitType = 0 // 0 - 普通卡顿 1-起播卡顿 2-seek卡顿\n }\n\n _onSeeking = () => {\n if (this.seekingStart) {\n return\n }\n this.suspendWaitingStatus('seek')\n this.seekingStart = now()\n this.emitLog(LOG_TYPES.SEEK_START, { start: now() })\n }\n\n _onSeeked = () => {\n this.suspendSeekingStatus('seeked')\n }\n\n _onWaitingLoadStart = () => {\n if (this._isWaiting || this.vt) {\n return\n }\n this._isWaiting = true\n this.waitingStart = now()\n this._waitType = 1\n this.emitLog(LOG_TYPES.WAIT_START, { start: this.waitingStart, type: 1, endType: 'loadstart' })\n }\n\n _onWaiting = () => {\n // 普通卡顿起播之前不产生\n if (this._isWaiting || !this.vt) {\n return\n }\n // 卡顿标记开始\n this._isWaiting = true\n this._waitTimer = Util.setTimeout(this, () => {\n if (this._isWaiting) {\n this.waitingStart = now()\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n if (!this.vt) {\n this._waitType = 1\n } else if (this.seekingStart) {\n this._waitType = 2\n } else {\n this._waitType = 0\n }\n this._startWaitTimeout()\n this.emitLog(LOG_TYPES.WAIT_START, { start: this.waitingStart, type: this._waitType, endType: this._waitType === 2 ? 'seek' : 'playing' })\n }\n }, 200)\n }\n\n _onError = () => {\n this.suspendSeekingStatus('error')\n this.suspendWaitingStatus('error')\n }\n\n _startWaitTimeout () {\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n }\n this._waittTimer = Util.setTimeout(this, () => {\n this.suspendWaitingStatus('timeout')\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }, 30000)\n }\n\n _onPlaying = () => {\n this._isWaiting && this.suspendWaitingStatus('playing')\n }\n\n endState (endType) {\n this.suspendWaitingStatus(endType)\n this.suspendSeekingStatus(endType)\n }\n\n suspendSeekingStatus (endType) {\n if (!this.seekingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.seekingStart\n this.seekingStart = 0\n this.emitLog(LOG_TYPES.SEEK_END, { end: _now, costTime: _cost, endType })\n }\n\n suspendWaitingStatus (endType) {\n if (this._waitTimer) {\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n }\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }\n this._isWaiting = false\n if (!this.waitingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.waitingStart\n this._isWaiting = false\n this.waitingStart = 0\n // switch (endType) {\n // case 'timeout':\n // break\n // case 'playing':\n // this._isWaiting = false\n // this.waitingStart = false\n // break\n // }\n this.emitLog(LOG_TYPES.WAIT_END, { costTime: _cost, type: this._waitType, endType: this._waitType === 2 ? 'seek' : endType })\n }\n\n emitLog (eventType, data) {\n const { player } = this\n this.emit(Events.XGLOG, {\n t: now(),\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype,\n eventType,\n currentTime: this.player.currentTime,\n readyState: player.video.readyState,\n networkState: player.video.networkState,\n ...data\n })\n }\n}\nexport {\n LOG_TYPES,\n XGLogger as default\n}\n","import Plugin, { Events, Util } from '../../plugin'\nimport ReplaySvg from '../assets/replay.svg'\nimport './index.scss'\n\nclass Replay extends Plugin {\n static get pluginName () {\n return 'replay'\n }\n\n static get defaultConfig () {\n return {\n disable: false\n }\n }\n\n registerIcons () {\n return {\n replay: ReplaySvg\n }\n }\n\n afterCreate () {\n Plugin.insert(this.icons.replay, this.root, 0)\n this.__handleReplay = this.hook('replayClick', () => {\n this.player.replay()\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.bind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n // this.bind('svg', ['click', 'touchend'], this.__handleReplay)\n // this.bind('.xgplayer-replay-txt', ['click', 'touchend'], this.__handleReplay)\n\n this.on(Events.ENDED, () => {\n if (!this.playerConfig.loop) {\n Util.addClass(this.player.root, 'replay')\n }\n if (this.config.disable) {\n return\n }\n this.show()\n const path = this.root.querySelector('path')\n if (path) {\n const transform = window.getComputedStyle(path).getPropertyValue('transform')\n if (typeof transform === 'string' && transform.indexOf('none') > -1) {\n return null\n } else {\n path.setAttribute('transform', transform)\n }\n }\n })\n\n this.on(Events.PLAY, () => {\n this.hide()\n })\n }\n\n handleReplay (e) {\n e.preventDefault()\n e.stopPropagation()\n this.player.replay()\n Util.removeClass(this.player.root, 'replay')\n }\n\n show () {\n if (this.config.disable) {\n return\n }\n this.root.style.display = 'flex'\n }\n\n enable () {\n this.config.disable = false\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n this.unbind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n }\n\n render () {\n return `\n ${this.i18n.REPLAY}\n `\n }\n}\nexport default Replay\n","import Plugin, { Events, Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * isEndedShow?: boolean, // 是否在播放结束之后显示\n * hideCanplay?: boolean, // cnaplay 时间大于1的时候才隐藏\n * poster?: string // 封面图地址\n * }} IPosterConfig\n */\nclass Poster extends Plugin {\n static get pluginName () {\n return 'poster'\n }\n\n /**\n * @type IPosterConfig\n */\n static get defaultConfig () {\n return {\n isEndedShow: true, // 是否在播放结束之后显示\n hideCanplay: false, // cnaplay 时间大于1的时候才隐藏\n poster: '' // 封面图地址\n }\n }\n\n set isEndedShow (value) {\n this.config.isEndedShow = value\n }\n\n get isEndedShow () {\n return this.config.isEndedShow\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n show () {\n Util.removeClass(this.root, 'hide')\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.poster === 'string') {\n args.config.poster = args.player.config.poster\n }\n }\n\n afterCreate () {\n this.on(Events.ENDED, () => {\n if (this.isEndedShow) {\n Util.removeClass(this.root, 'hide')\n }\n })\n\n if (this.config.hideCanplay) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n this.on(Events.URL_CHANGE, () => {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'xg-showplay')\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n })\n } else {\n this.on(Events.PLAY, () => {\n Util.addClass(this.root, 'hide')\n })\n }\n }\n\n onTimeUpdate () {\n if (!this.player.currentTime) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n } else {\n Util.removeClass(this.root, 'xg-showplay')\n }\n }\n\n update (poster) {\n if (!poster) {\n return\n }\n this.config.poster = poster\n this.root.style.backgroundImage = `url(${poster})`\n }\n\n render () {\n const { poster, hideCanplay } = this.config\n const style = poster ? `background-image:url(${poster});` : ''\n return `\n `\n }\n}\n\nexport default Poster\n","import Plugin, { Util, Events, STATES } from '../../plugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * isShowPause?: boolean, // 暂停是否常驻\n * isShowEnd?: boolean, // 播放结束常驻\n * disableAnimate?: boolean, // 禁用点击动画\n * mode?: 'hide' | 'show' | 'auto' // 控制模式: hide 常驻: show 跟随:auto\n * [propName: string]: any\n * }} IStartConfig\n */\n\nconst AnimateMap = {}\nfunction addAnimate (key, seconds, callback = { start: null, end: null }) {\n if (AnimateMap[key]) {\n window.clearTimeout(AnimateMap[key].id)\n }\n AnimateMap[key] = {}\n callback.start && callback.start()\n AnimateMap[key].id = window.setTimeout(() => {\n callback.end && callback.end()\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n }, seconds)\n}\n\nfunction clearAnimation () {\n Object.keys(AnimateMap).map(key => {\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n })\n}\n\nclass Start extends Plugin {\n static get pluginName () {\n return 'start'\n }\n\n /**\n * @type IStartConfig\n */\n static get defaultConfig () {\n return {\n isShowPause: false, // 暂停是否常驻\n isShowEnd: false, // 播放结束常驻\n disableAnimate: false, // 禁用点击动画\n mode: 'hide' // 控制模式: hide 常驻: show 跟随:auto\n }\n }\n\n constructor (args) {\n super(args)\n this.autoPlayStart = false\n }\n\n afterCreate () {\n const { player, playerConfig } = this\n\n this.initIcons()\n this.once(Events.READY, () => {\n if (playerConfig) {\n if (playerConfig.lang && playerConfig.lang === 'en') {\n Util.addClass(player.root, 'lang-is-en')\n } else if (playerConfig.lang === 'jp') {\n Util.addClass(player.root, 'lang-is-jp')\n }\n }\n })\n\n this.on(Events.AUTOPLAY_STARTED, this.onAutoplayStart)\n\n if (!playerConfig.autoplay) {\n this.show()\n }\n\n this.on(Events.AUTOPLAY_PREVENTED, () => {\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n })\n\n this.on(Events.PLAY, () => {\n this.onPlayPause('play')\n })\n\n this.on(Events.PAUSE, () => {\n this.onPlayPause('pause')\n })\n\n this.clickHandler = this.hook('startClick', this.switchPausePlay, {\n pre: (e) => {\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n const { paused } = this.player\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: paused, to: !paused })\n }\n })\n\n this.bind(['click', 'touchend'], this.clickHandler)\n }\n\n onAutoplayStart = () => {\n if (this.autoPlayStart) {\n return\n }\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n Util.addClass(this.root, className)\n this.autoPlayStart = true\n this.onPlayPause('play')\n }\n\n registerIcons () {\n return {\n startPlay: { icon: PlaySvg, class: 'xg-icon-play' },\n startPause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('xg-start-inner', icons.startPlay)\n this.appendChild('xg-start-inner', icons.startPause)\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n show () {\n Util.removeClass(this.root, 'hide')\n }\n\n focusHide () {\n Util.addClass(this.root, 'focus-hide')\n }\n\n recover () {\n Util.removeClass(this.root, 'focus-hide')\n }\n\n switchStatus (isAnimate) {\n if (isAnimate) {\n this.setAttr('data-state', !this.player.paused ? 'play' : 'pause')\n } else {\n this.setAttr('data-state', this.player.paused ? 'play' : 'pause')\n }\n }\n\n animate (endShow) {\n addAnimate('pauseplay', 400, {\n start: () => {\n Util.addClass(this.root, 'interact')\n this.show()\n this.switchStatus(true)\n },\n end: () => {\n Util.removeClass(this.root, 'interact')\n !endShow && this.hide()\n }\n })\n }\n\n switchPausePlay (e) {\n const { player } = this\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n if (player.state < STATES.READY) {\n return\n }\n const paused = this.player.paused\n if (!paused && player.state === STATES.RUNNING) {\n player.pause()\n } else {\n player.play()\n }\n }\n\n onPlayPause (status) {\n const { config, player } = this\n if (player.state < STATES.RUNNING || !this.autoPlayStart) {\n return\n }\n // 一直显示\n if (config.mode === 'show') {\n this.switchStatus()\n this.show()\n return\n }\n\n // 跟随播放器的focus状态显示和隐藏\n if (config.mode === 'auto') {\n this.switchStatus()\n return\n }\n // 暂停/播放结束状态强制显示\n if ((config.isShowPause && player.paused && !player.ended) || (config.isShowEnd && player.ended)) {\n this.switchStatus()\n this.show()\n return\n }\n\n if (config.disableAnimate) {\n this.switchStatus()\n this.hide()\n return\n }\n\n if (status === 'play') {\n this.autoPlayStart ? this.animate() : this.hide()\n } else {\n if (!this.autoPlayStart || player.ended) {\n return\n }\n this.animate()\n }\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.clickHandler)\n clearAnimation()\n }\n\n render () {\n const className = this.playerConfig.autoplay ? (this.config.mode === 'auto' ? 'auto-hide' : 'hide') : ''\n return `\n \n \n `\n }\n}\n\nexport default Start\n","import Plugin, { Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef { {\n * innerHtml?: string,\n * [propName: string]: any\n * } } IEnterConfig\n */\n\nclass Enter extends Plugin {\n static get pluginName () {\n return 'enter'\n }\n\n /**\n * @type IEnterConfig\n */\n static get defaultConfig () {\n return {\n innerHtml: '',\n logo: ''\n }\n }\n\n render () {\n const { innerHtml } = this.config\n const root = Util.createDom('xg-enter', '', {}, 'xgplayer-enter')\n\n if (innerHtml && innerHtml instanceof window.HTMLElement) {\n root.appendChild(innerHtml)\n } else if (innerHtml && typeof innerHtml === 'string') {\n root.innerHTML = innerHtml\n } else {\n let barStr = ''\n for (let i = 1; i <= 12; i++) {\n barStr += `
`\n }\n root.innerHTML = `
${barStr}
`\n }\n return root\n }\n}\n\nexport default Enter\n","import Plugin, { POSITIONS } from '../../plugin'\n\nclass MiniScreenIcon extends Plugin {\n static get pluginName () {\n return 'miniscreenIcon'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 10\n }\n }\n\n afterCreate () {\n this.getMini = this.getMini.bind(this)\n this.exitMini = this.exitMini.bind(this)\n this.bind('click', this.getMini)\n }\n\n getMini () {\n this.config.onClick && this.config.onClick()\n }\n\n exitMini () {\n this.config.onClick && this.config.onClick()\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.getMini)\n }\n\n render () {\n const langKey = 'MINISCREEN'\n return `\n \n
${this.i18n[langKey]}
\n
`\n }\n}\n\nexport default MiniScreenIcon\n","import EventEmitter from 'eventemitter3'\n\nfunction getStyleSize (value) {\n const num = parseFloat(value)\n // not a percent like '100%', and a number\n const isValid = value.indexOf('%') === -1 && !Number.isNaN(num)\n return isValid && num\n}\n\nconst measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n]\n\nconst measurementsLength = measurements.length\n\nfunction getZeroSize () {\n const size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n }\n for (let i = 0; i < measurementsLength; i++) {\n const measurement = measurements[i]\n size[measurement] = 0\n }\n return size\n}\n\nfunction getStyle (elem) {\n const style = window.getComputedStyle(elem)\n // if ( !style ) {\n // logError( 'Style returned ' + style +\n // '. Are you running this code in a hidden iframe on Firefox? ' +\n // 'See http://bit.ly/getsizebug1' );\n // }\n return style\n}\n\nfunction getSize (elem) {\n // use querySeletor if elem is string\n if (typeof elem === 'string') {\n elem = document.querySelector(elem)\n }\n\n // do not proceed on non-objects\n if (!elem || typeof elem !== 'object' || !elem.nodeType) {\n return\n }\n\n const style = getStyle(elem)\n\n // if hidden, everything is 0\n if (style.display === 'none') {\n return getZeroSize()\n }\n\n const size = {}\n size.width = elem.offsetWidth\n size.height = elem.offsetHeight\n\n const isBorderBox = size.isBorderBox = style.boxSizing === 'border-box'\n\n // get all measurements\n for (let i = 0; i < measurementsLength; i++) {\n const measurement = measurements[i]\n const value = style[measurement]\n const num = parseFloat(value)\n // any 'auto', 'medium' value will be 0\n size[measurement] = !Number.isNaN(num) ? num : 0\n }\n\n const paddingWidth = size.paddingLeft + size.paddingRight\n const paddingHeight = size.paddingTop + size.paddingBottom\n const marginWidth = size.marginLeft + size.marginRight\n const marginHeight = size.marginTop + size.marginBottom\n const borderWidth = size.borderLeftWidth + size.borderRightWidth\n const borderHeight = size.borderTopWidth + size.borderBottomWidth\n\n const isBorderBoxSizeOuter = isBorderBox// isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n const styleWidth = getStyleSize(style.width)\n if (styleWidth !== false) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n (isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth)\n }\n\n const styleHeight = getStyleSize(style.height)\n if (styleHeight !== false) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n (isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight)\n }\n\n size.innerWidth = size.width - (paddingWidth + borderWidth)\n size.innerHeight = size.height - (paddingHeight + borderHeight)\n\n size.outerWidth = size.width + marginWidth\n size.outerHeight = size.height + marginHeight\n\n return size\n}\n\nfunction getTouch (touches, dentifier) {\n for (let i = 0; i < touches.length; i++) {\n const touch = touches[i]\n if (touch.identifier === dentifier) {\n return touch\n }\n }\n}\n\nconst EVENTS = {\n START: 'dragStart',\n MOVE: 'dragMove',\n ENDED: 'dragEnded'\n}\n\nconst POST_START_EVENTS = {\n mousedown: ['mousemove', 'mouseup'],\n touchstart: ['touchmove', 'touchend', 'touchcancel'],\n pointerdown: ['pointermove', 'pointerup', 'pointercancel']\n}\n\nexport default class Draggabilly extends EventEmitter {\n constructor (root, options = {}) {\n super()\n this.isEnabled = true\n this.isDragging = false\n this.isDown = false\n this.position = {}\n this.downPoint = {}\n this.dragPoint = { x: 0, y: 0 }\n this.startPos = { x: 0, y: 0 }\n // eslint-disable-next-line no-undef\n this._root = root instanceof Element ? root : document.querySelector(root)\n // eslint-disable-next-line no-undef\n this._handlerDom = options.handle instanceof Element ? options.handle : document.querySelector(options.handle)\n if (!this._root || !this._handlerDom) {\n return\n }\n // ['onDown', 'onUp', 'onMove', 'onCancel', 'onDocUp'].map(key => {\n // this[key] = this[key].bind(this)\n // })\n\n // if ('ontouchstart' in window) {\n // this._handlerKeys = TOUCH_HANDLERS\n // this._startKey = 'touchstart'\n // this._endKey = 'touchend'\n // } else {\n // this._handlerKeys = HANDLERS\n // this._startKey = 'mousedown'\n // this._endKey = 'mouseup'\n // }\n // this._handlerDom.addEventListener(this._startKey, this.onDown)\n this._bindStartEvent()\n }\n\n _bindStartEvent () {\n if ('ontouchstart' in window) {\n this._startKey = 'touchstart'\n } else {\n this._startKey = 'mousedown'\n }\n this[`on${this._startKey}`] = this[`on${this._startKey}`].bind(this)\n this._handlerDom.addEventListener(this._startKey, this[`on${this._startKey}`])\n POST_START_EVENTS[this._startKey].map(key => {\n this[`on${key}`] = this[`on${key}`].bind(this)\n })\n }\n\n _unbindStartEvent () {\n this._handlerDom.removeEventListener(this._startKey, this[`on${this._startKey}`])\n }\n\n _bindPostStartEvents (event) {\n if (!event) {\n return\n }\n const events = POST_START_EVENTS[this._startKey]\n // bind events to node\n events.map(eventName => {\n window.addEventListener(eventName, this[`on${eventName}`])\n })\n // save these arguments\n this._boundPointerEvents = events\n }\n\n _unbindPostStartEvents () {\n if (!this._boundPointerEvents) {\n return\n }\n this._boundPointerEvents.map(eventName => {\n // console.log('eventName', eventName, this[`on${eventName}`])\n window.removeEventListener(eventName, this[`on${eventName}`])\n })\n\n delete this._boundPointerEvents\n }\n\n enable () {\n this.isEnabled = true\n }\n\n disable () {\n this.isEnabled = false\n if (this.isDragging) {\n this.onUp()\n }\n }\n\n onDocUp (e) {\n this.onUp()\n }\n\n animate () {\n // only render and animate if dragging\n if (!this.isDragging) {\n return\n }\n\n this.positionDrag()\n\n window.requestAnimationFrame(() => {\n this.animate()\n })\n }\n\n positionDrag () {\n // this._root.style.transform = 'translate3d( ' + this.dragPoint.x +\n // 'px, ' + this.dragPoint.y + 'px, 0)';\n const transform = `translate3d(${this.dragPoint.x}px, ${this.dragPoint.y}px, 0)`\n this._root.style.transform = transform\n this._root.style.webKitTransform = transform\n }\n\n setLeftTop () {\n this._root.style.left = this.position.x + 'px'\n this._root.style.top = this.position.y + 'px'\n }\n\n onmousedown (e) {\n this.dragStart(e, e)\n }\n\n onmousemove (e) {\n this.dragMove(e, e)\n }\n\n onmouseup (e) {\n this.dragEnd(e, e)\n }\n\n ontouchstart (e) {\n const touch = e.changedTouches[0]\n this.dragStart(e, touch)\n this.touchIdentifier = touch.pointerId !== undefined\n ? touch.pointerId\n : touch.identifier\n e.preventDefault()\n }\n\n ontouchmove (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragMove(e, touch)\n }\n }\n\n ontouchend (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragEnd(e, touch)\n }\n e.preventDefault()\n }\n\n ontouchcancel (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragCancel(e, touch)\n }\n }\n\n dragStart (e, pointer) {\n if (!this._root || this.isDown || !this.isEnabled) {\n return\n }\n this.downPoint = pointer\n this.dragPoint.x = 0\n this.dragPoint.y = 0\n\n this._getPosition()\n\n const size = getSize(this._root)\n\n this.startPos.x = this.position.x\n this.startPos.y = this.position.y\n this.startPos.maxY = window.innerHeight - size.height\n this.startPos.maxX = window.innerWidth - size.width\n this.setLeftTop()\n\n this.isDown = true\n this._bindPostStartEvents(e)\n }\n\n dragRealStart (e, pointer) {\n this.isDragging = true\n this.animate()\n this.emit(EVENTS.START, this.startPos)\n }\n\n dragEnd (e, pointer) {\n if (!this._root) {\n return\n }\n this._unbindPostStartEvents()\n if (this.isDragging) {\n this._root.style.transform = ''\n this.setLeftTop()\n this.emit(EVENTS.ENDED)\n }\n this.presetInfo()\n }\n\n _dragPointerMove (e, pointer) {\n const moveVector = {\n x: pointer.pageX - this.downPoint.pageX,\n y: pointer.pageY - this.downPoint.pageY\n }\n // 检测是否有移动\n if (!this.isDragging && this.hasDragStarted(moveVector)) {\n this.dragRealStart(e, pointer)\n }\n return moveVector\n }\n\n dragMove (e, pointer) {\n e = e || window.event\n if (!this.isDown) {\n return\n }\n const { x, y } = this.startPos\n const moveVector = this._dragPointerMove(e, pointer)\n let dragX = moveVector.x\n let dragY = moveVector.y\n dragX = this.checkContain('x', dragX, x)\n dragY = this.checkContain('y', dragY, y)\n this.position.x = x + dragX\n this.position.y = y + dragY\n this.dragPoint.x = dragX\n this.dragPoint.y = dragY\n this.emit(EVENTS.MOVE, this.position)\n }\n\n dragCancel (e, pointer) {\n this.dragEnd(e, pointer)\n }\n\n presetInfo () {\n this.isDragging = false\n this.startPos = {\n x: 0,\n y: 0\n }\n this.dragPoint = {\n x: 0,\n y: 0\n }\n this.isDown = false\n }\n\n destroy () {\n this._unbindStartEvent()\n this._unbindPostStartEvents()\n if (this.isDragging) {\n this.dragEnd()\n }\n this.removeAllListeners()\n this._handlerDom = null\n }\n\n hasDragStarted (moveVector) {\n return Math.abs(moveVector.x) > 3 || Math.abs(moveVector.y) > 3\n }\n\n checkContain (axis, drag, grid) {\n if (drag + grid < 0) {\n return 0 - grid\n }\n\n if (axis === 'x' && drag + grid > this.startPos.maxX) {\n return this.startPos.maxX - grid\n }\n if (axis === 'y' && drag + grid > this.startPos.maxY) {\n return this.startPos.maxY - grid\n }\n return drag\n }\n\n _getPosition () {\n const style = window.getComputedStyle(this._root)\n const x = this._getPositionCoord(style.left, 'width')\n const y = this._getPositionCoord(style.top, 'height')\n // clean up 'auto' or other non-integer values\n this.position.x = Number.isNaN(x) ? 0 : x\n this.position.y = Number.isNaN(y) ? 0 : y\n\n this._addTransformPosition(style)\n }\n\n _addTransformPosition (style) {\n const transform = style.transform\n // bail out if value is 'none'\n if (transform.indexOf('matrix') !== 0) {\n return\n }\n // split matrix(1, 0, 0, 1, x, y)\n const matrixValues = transform.split(',')\n // translate X value is in 12th or 4th position\n const xIndex = transform.indexOf('matrix3d') === 0 ? 12 : 4\n const translateX = parseInt(matrixValues[xIndex], 10)\n // translate Y value is in 13th or 5th position\n const translateY = parseInt(matrixValues[xIndex + 1], 10)\n this.position.x += translateX\n this.position.y += translateY\n }\n\n _getPositionCoord (styleSide, measure) {\n if (styleSide.indexOf('%') !== -1) {\n // convert percent into pixel for Safari, #75\n const parentSize = getSize(this._root.parentNode)\n // prevent not-in-DOM element throwing bug, #131\n return !parentSize\n ? 0\n : (parseFloat(styleSide) / 100) * parentSize[measure]\n }\n return parseInt(styleSide, 10)\n }\n}\n","import Plugin, { Util, Events } from '../../plugin'\nimport PlayIcon from '../assets/play.svg'\nimport PauseIcon from '../assets/pause.svg'\nimport MiniScreenIcon from './miniScreenIcon'\nimport Draggabilly from '../../utils/draggabilly'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disable?: boolean,\n * width?: number,\n * height?: number,\n * left?: number, // 默认左下角\n * top?: number, // 默认左下角\n * isShowIcon?: boolean, // 是否显示icon\n * isScrollSwitch?: boolean, // 滚动自动切换自动切换\n * scrollTop?: number, // 触发滚动的高度\n * disableDrag?: boolean, // 禁用拖拽\n * [propName: string]: any\n * }} IMiniScreenConfig\n */\nclass MiniScreen extends Plugin {\n static get pluginName () {\n return 'miniscreen'\n }\n\n /**\n * @type IMiniScreenConfig\n */\n static get defaultConfig () {\n return {\n index: 10,\n disable: false,\n width: 320,\n height: 180,\n left: -1, // Default bottom left corner\n top: -1, // Default bottom left corner\n isShowIcon: false, // Whether to show icon\n isScrollSwitch: false,\n scrollTop: 0, // Height to trigger scroll\n disableDrag: false // Disable drag and drop\n }\n }\n\n constructor (args) {\n super(args)\n this.isMini = false\n this.isClose = false\n const { config } = this\n this.pos = {\n left: config.left < 0 ? window.innerWidth - config.width - 20 : config.left,\n top: config.top < 0 ? window.innerHeight - config.height - 20 : config.top,\n height: this.config.height,\n width: this.config.width,\n scrollY: window.scrollY || 0\n }\n this.lastStyle = null\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.mini === 'boolean') {\n args.config.isShowIcon = args.player.config.mini\n }\n }\n\n afterCreate () {\n this.initIcons()\n this.on(Events.PAUSE, () => {\n this.setAttr('data-state', 'pause')\n })\n this.on(Events.PLAY, () => {\n this.setAttr('data-state', 'play')\n })\n }\n\n onPluginsReady () {\n const { player, config } = this\n if (config.disable) {\n return\n }\n if (this.config.isShowIcon) {\n const options = {\n config: {\n onClick: () => {\n this.getMini()\n }\n }\n }\n player.controls.registerPlugin(MiniScreenIcon, options, MiniScreenIcon.pluginName)\n }\n const eventName = Util.checkTouchSupport() ? 'touchend' : 'click'\n this.bind('.mini-cancel-btn', eventName, this.onCancelClick)\n this.bind('.play-icon', eventName, this.onCenterClick)\n if (!this.config.disableDrag) {\n this._draggabilly = new Draggabilly(this.player.root, {\n handle: this.root\n })\n }\n if (this.config.isScrollSwitch) {\n window.addEventListener('scroll', this.onScroll)\n }\n }\n\n registerIcons () {\n return {\n play: { icon: PlayIcon, class: 'xg-icon-play' },\n pause: { icon: PauseIcon, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.play-icon', icons.play)\n this.appendChild('.play-icon', icons.pause)\n }\n\n onCancelClick = (e) => {\n // e.preventDefault()\n // e.stopPropagation()\n this.exitMini()\n this.isClose = true\n }\n\n onCenterClick = (e) => {\n const { player } = this\n player.paused ? player.play() : player.pause()\n }\n\n onScroll = (e) => {\n if ((!window.scrollY && window.scrollY !== 0) || Math.abs(window.scrollY - this.pos.scrollY) < 50) {\n return\n }\n let scrollHeight = parseInt(Util.getCss(this.player.root, 'height'))\n scrollHeight += this.config.scrollTop\n this.pos.scrollY = window.scrollY\n if (window.scrollY > scrollHeight + 5) {\n !this.isMini && !this.isClose && this.getMini()\n } else if (window.scrollY <= scrollHeight) {\n this.isMini && this.exitMini()\n this.isClose = false\n }\n }\n\n getMini () {\n if (this.isMini) {\n return\n }\n const { player, playerConfig } = this\n const target = this.config.target || this.player.root\n this.lastStyle = {}\n Util.addClass(player.root, 'xgplayer-mini');\n ['width', 'height', 'top', 'left'].map(key => {\n this.lastStyle[key] = target.style[key]\n target.style[key] = `${this.pos[key]}px`\n })\n if (playerConfig.fluid) {\n target.style['padding-top'] = ''\n }\n this.emit(Events.MINI_STATE_CHANGE, true)\n player.isMini = this.isMini = true\n }\n\n exitMini () {\n if (!this.isMini) {\n return false\n }\n const { player, playerConfig } = this\n const target = this.config.target || this.player.root\n Util.removeClass(player.root, 'xgplayer-mini')\n if (this.lastStyle) {\n Object.keys(this.lastStyle).map(key => {\n target.style[key] = this.lastStyle[key]\n })\n }\n this.lastStyle = null\n if (playerConfig.fluid) {\n player.root.style.width = '100%'\n player.root.style.height = '0'\n player.root.style['padding-top'] = `${playerConfig.height * 100 / playerConfig.width}%`\n }\n this.emit(Events.MINI_STATE_CHANGE, false)\n this.isMini = player.isMini = false\n }\n\n destroy () {\n window.removeEventListener('scroll', this.onScroll)\n const eventName = Util.checkTouchSupport() ? 'touchend' : 'click'\n this.unbind('.mini-cancel-btn', eventName, this.onCancelClick)\n this.unbind('.play-icon', eventName, this.onCenterClick)\n this._draggabilly && this._draggabilly.destroy()\n this._draggabilly = null\n this.exitMini()\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n \n \n
${this.i18n.MINI_DRAG}
\n
\n
\n \n \n \n
\n
\n
\n
`\n }\n}\n\nexport {\n MiniScreen as default,\n MiniScreenIcon\n}\n","import { BasePlugin, Sniffer } from '../../plugin'\nimport { runHooks } from '../../plugin/hooksDescriptor'\nimport './index.scss'\n\nconst MOUSE_EVENTS = {\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousemove: 'onMouseMove'\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nexport default class PCPlugin extends BasePlugin {\n static get pluginName () {\n return 'pc'\n }\n\n static get defaultConfig () {\n return {\n disableContextmenu: true\n }\n }\n\n afterCreate () {\n this._clickCount = 0\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { enableContextmenu, isMobileSimulateMode } = this.playerConfig\n if (isMobileSimulateMode === 'mobile' || (Sniffer.device === 'mobile' && !Sniffer.os.isIpad)) {\n return\n }\n this.config.disableContextmenu = !enableContextmenu\n this.initEvents()\n }\n\n initEvents () {\n const { video, root } = this.player\n\n video && video.addEventListener('click', this.onVideoClick, false)\n video && video.addEventListener('dblclick', this.onVideoDblClick, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.addEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n this.config.disableContextmenu && video && video.addEventListener('contextmenu', this.onContextmenu, false)\n }\n\n switchPlayPause (e) {\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: player.paused, to: !player.paused })\n if (!player.ended) {\n player.paused ? player.play() : player.pause()\n } else {\n player.duration !== Infinity && player.duration > 0 && player.replay()\n }\n }\n\n onMouseMove = (e) => {\n const { player, playerConfig } = this\n if (!player.isActive) {\n player.focus({ autoHide: !playerConfig.closeDelayBlur })\n !playerConfig.closeFocusVideoFocus && player.video.focus()\n }\n }\n\n onMouseEnter = (e) => {\n const { playerConfig, player } = this\n !playerConfig.closeFocusVideoFocus && player.video.focus()\n if (playerConfig.closeDelayBlur) {\n player.focus({ autoHide: false })\n } else {\n player.focus()\n }\n }\n\n onMouseLeave = (e) => {\n const { closePlayerBlur, leavePlayerTime, closeDelayBlur } = this.playerConfig\n if (!closePlayerBlur && !closeDelayBlur) {\n if (leavePlayerTime) {\n this.player.focus({ autoHide: true, delay: leavePlayerTime })\n } else {\n this.player.blur()\n }\n }\n }\n\n onContextmenu (e) {\n e = e || window.event\n if (e.preventDefault) {\n e.preventDefault()\n }\n if (e.stopPropagation) {\n e.stopPropagation()\n } else {\n e.returnValue = false // 解决IE8右键弹出\n e.cancelBubble = true\n }\n }\n\n onVideoClick = (e) => {\n const { player, playerConfig } = this\n if (e.target && playerConfig.closeVideoClick) {\n return\n }\n if (e.target === player.video || e.target === player.innerContainer || e.target === player.video.__canvas) {\n e.preventDefault()\n if (!playerConfig.closeVideoStopPropagation) {\n e.stopPropagation()\n }\n this._clickCount++\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n this.clickTimer = setTimeout(() => {\n if (!this._clickCount) {\n return\n }\n this._clickCount--\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.switchPlayPause(data.e)\n }, { e, paused: player.paused })\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }, 300)\n }\n }\n\n onVideoDblClick = (e) => {\n const { player, playerConfig } = this\n if (!e.target || (e.target !== player.video && e.target !== player.video.__canvas)) {\n return\n }\n if (this._clickCount < 2) {\n this._clickCount = 0\n return\n }\n this._clickCount = 0\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n e.preventDefault()\n e.stopPropagation()\n if (playerConfig.closeVideoDblclick) {\n return\n }\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.emitUserAction(data.e, 'switch_fullscreen', { props: 'fullscreen', from: player.fullscreen, to: !player.fullscreen })\n player.fullscreen ? player.exitFullscreen() : player.getFullscreen()\n }, { e, fullscreen: player.fullscreen })\n }\n\n destroy () {\n const { video, root } = this.player\n this.clickTimer && clearTimeout(this.clickTimer)\n video.removeEventListener('click', this.onVideoClick, false)\n video.removeEventListener('dblclick', this.onVideoDblClick, false)\n video.removeEventListener('contextmenu', this.onContextmenu, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.removeEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n }\n}\n","\nconst EVENTS = {\n PRESS: 'press',\n PRESS_END: 'pressend',\n DOUBlE_CLICK: 'doubleclick',\n CLICK: 'click',\n TOUCH_MOVE: 'touchmove',\n TOUCH_START: 'touchstart',\n TOUCH_END: 'touchend'\n}\n\nconst TOUCHS = {\n start: 'touchstart',\n end: 'touchend',\n move: 'touchmove',\n cancel: 'touchcancel'\n}\n\nconst MOUSES = {\n start: 'mousedown',\n end: 'mouseup',\n move: 'mousemove',\n cancel: 'mouseleave'\n}\n\nfunction getTouch (touches) {\n if (touches && touches.length > 0) {\n return touches[touches.length - 1]\n } else {\n return null\n }\n}\n\nfunction preventToucheDefault (e) {\n const ua = navigator.userAgent;\n /(?:iPhone|iPad)/.test(ua) && e.cancelable && e.preventDefault()\n}\n\nfunction getDefaultConfig () {\n return {\n pressDelay: 600,\n dbClickDelay: 200,\n disablePress: false,\n disableDbClick: false,\n miniStep: 2,\n needPreventDefault: true\n }\n}\n\nclass Touche {\n constructor (dom, config = { eventType: 'touch' }) {\n this._pos = {\n moving: false,\n start: false,\n x: 0,\n y: 0\n }\n this.config = getDefaultConfig()\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n this.root = dom\n this.events = config.eventType === 'mouse' ? MOUSES : TOUCHS\n this.pressIntrvalId = null\n this.dbIntrvalId = null\n this.__handlers = {}\n this._initEvent()\n }\n\n _initEvent () {\n this.onTouchStart = this.onTouchStart.bind(this)\n this.onTouchMove = this.onTouchMove.bind(this)\n this.onTouchEnd = this.onTouchEnd.bind(this)\n this.onTouchCancel = this.onTouchCancel.bind(this)\n this.root.addEventListener(this.events.start, this.onTouchStart)\n }\n\n __setPress (e) {\n const { config } = this\n if (this.pressIntrvalId) {\n this.__clearPress()\n }\n this.pressIntrvalId = setTimeout(() => {\n this.trigger(EVENTS.PRESS, e)\n this._pos.press = true\n this.__clearPress()\n }, config.pressDelay)\n }\n\n __clearPress () {\n window.clearTimeout(this.pressIntrvalId)\n this.pressIntrvalId = null\n }\n\n __setDb (e) {\n const { config } = this\n if (this.dbIntrvalId) {\n this.__clearDb()\n this.trigger(EVENTS.DOUBlE_CLICK, e)\n return\n }\n this.dbIntrvalId = setTimeout(() => {\n this.__clearDb()\n if (!this._pos.start && !this._pos.press && !this._pos.moving) {\n this.trigger(EVENTS.CLICK, e)\n }\n }, config.dbClickDelay)\n }\n\n __clearDb () {\n clearTimeout(this.dbIntrvalId)\n this.dbIntrvalId = null\n }\n\n on (event, handler) {\n if (!this.__handlers[event]) {\n this.__handlers[event] = []\n }\n this.__handlers[event].push(handler)\n }\n\n off (event, handler) {\n if (!this.__handlers[event]) {\n return\n }\n const handlers = this.__handlers[event]\n let index = -1\n for (let i = 0; i < handlers.length; i++) {\n if (handlers[i] === handler) {\n index = i\n break\n }\n }\n if (index >= 0) {\n this.__handlers[event].splice(index, 1)\n }\n }\n\n trigger (event, e) {\n if (!this.__handlers[event]) {\n return\n }\n this.__handlers[event].map(handler => {\n try {\n handler(e)\n } catch (error) {\n console.error(`trigger>>:${event}`, error)\n }\n })\n }\n\n onTouchStart (e) {\n const { _pos, root, config } = this\n config.needPreventDefault && preventToucheDefault(e)\n const touch = getTouch(e.touches)\n _pos.x = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.y = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.start = true\n this.__setPress(e)\n root.addEventListener(this.events.end, this.onTouchEnd)\n root.addEventListener(this.events.cancel, this.onTouchCancel)\n root.addEventListener(this.events.move, this.onTouchMove)\n this.trigger(EVENTS.TOUCH_START, e)\n }\n\n onTouchCancel (e) {\n this.onTouchEnd(e)\n }\n\n onTouchEnd (e) {\n const { _pos, root, config } = this\n config.needPreventDefault && preventToucheDefault(e)\n this.__clearPress()\n root.removeEventListener(this.events.cancel, this.onTouchCancel)\n root.removeEventListener(this.events.end, this.onTouchEnd)\n root.removeEventListener(this.events.move, this.onTouchMove)\n e.moving = _pos.moving\n e.press = _pos.press\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n this.trigger(EVENTS.TOUCH_END, e)\n !_pos.press && !_pos.moving && this.__setDb(e)\n _pos.press = false\n _pos.start = false\n _pos.moving = false\n }\n\n onTouchMove (e) {\n const { _pos, config } = this\n const touch = getTouch(e.touches)\n const x = touch ? parseInt(touch.pageX, 10) : e.pageX\n const y = touch ? parseInt(touch.pageY, 10) : e.pageX\n const diffx = x - _pos.x\n const diffy = y - _pos.y\n if (Math.abs(diffy) < config.miniStep && Math.abs(diffx) < config.miniStep) {\n return\n }\n this.__clearPress()\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n _pos.press = false\n _pos.moving = true\n this.trigger(EVENTS.TOUCH_MOVE, e)\n }\n\n destroy () {\n const map = {\n touchend: 'onTouchEnd',\n touchmove: 'onTouchMove',\n touchstart: 'onTouchStart'\n }\n Object.keys(map).map(key => {\n this.root.removeEventListener('touchend', this[map[key]])\n })\n }\n}\n\nexport default Touche\n","import Plugin, { Events, Util, Sniffer, STATES } from '../../plugin'\nimport Touche from './touch'\nimport SeekTipIcon from '../assets/seekicon.svg'\n// import BackSvg from './back.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disableGesture?: boolean,\n * gestureX?: boolean,\n * gestureY?: boolean,\n * gradient?: 'normal' | 'none' | 'top' | 'bottom',\n * isTouchingSeek?: boolean,\n * miniMoveStep?: number,\n * miniYPer?: number,\n * scopeL?: number,\n * scopeR?: number,\n * pressRate?: number,\n * darkness?: boolean,\n * maxDarkness?: number,\n * disableActive?: boolean,\n * disableTimeProgress?: boolean,\n * hideControlsActive?: boolean,\n * hideControlsEnd?: boolean,\n * moveDuration?: number,\n * closedbClick?: boolean,\n * disablePress?: boolean,\n * disableSeekIcon?: boolean,\n * focusVideoClick?: boolean,\n * [propName: string]: any\n * }} IMobileConfig\n */\n\nconst ACTIONS = {\n AUTO: 'auto',\n SEEKING: 'seeking',\n PLAYBACK: 'playbackrate',\n LIGHT: ''\n}\n\nclass MobilePlugin extends Plugin {\n static get pluginName () {\n return 'mobile'\n }\n\n /**\n * @type IMobileConfig & { [propName: string]: any}\n */\n static get defaultConfig () {\n return {\n index: 0,\n disableGesture: false, // Whether to disable gestures\n gestureX: true, // Whether to enable horizontal gestures\n gestureY: true, // Whether to enable vertical gestures\n gradient: 'normal', // Gradient shadow, 'none'/'top'/'bottom'\n isTouchingSeek: false, // Whether to update currentTime at the same time as touchMove\n miniMoveStep: 5, // Minimum moving distance, used for move throttling\n miniYPer: 5, // Percentage of minimum displacement in y direction\n scopeL: 0.25, // Gesture range on the left\n scopeR: 0.25, // Gesture range on the right\n scopeM: 0.9, // Middle gesture range\n pressRate: 2, // playbackRate when long press\n darkness: true, // Whether to enable the dimming function on the right\n maxDarkness: 0.8, // Maximum darkness,maximum transparency of the mask\n disableActive: false, // Whether to disable the time prompt\n disableTimeProgress: false, // Whether to disable the time progress bar\n hideControlsActive: false, // Whether to hide the control bar when dragging by gesture\n hideControlsEnd: false, // Whether to hide the control bar when the gesture ended\n moveDuration: 60 * 6 * 1000, // The duration corresponding to the dragging width of the player\n closedbClick: false, // Whether to turn off the double tap gesture\n disablePress: true, // Whether to turn off the long press gesture\n disableSeekIcon: false, // Disable seek prompt\n focusVideoClick: false // Click on force toggle to pause/play\n }\n }\n\n constructor (options) {\n super(options)\n /**\n * @readonly\n */\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n time: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1\n }\n /**\n * @private\n */\n this.timer = null\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n /**\n * @private\n * @returns {[propName: string]: any}\n */\n registerIcons () {\n return {\n seekTipIcon: { icon: SeekTipIcon, class: 'xg-seek-pre' }\n }\n }\n\n afterCreate () {\n const { playerConfig, config, player } = this\n if (playerConfig.closeVideoDblclick === true) {\n config.closedbClick = true\n }\n this.resetPos()\n if (!Util.isUndefined(playerConfig.disableGesture)) {\n config.disableGesture = !!playerConfig.disableGesture\n }\n this.appendChild('.xg-seek-icon', this.icons.seekTipIcon)\n\n this.xgMask = Util.createDom('xg-mask', '', {}, 'xgmask')\n player.root.appendChild(this.xgMask)\n\n this.initCustomStyle()\n\n this.registerThumbnail()\n\n const eventType = this.domEventType\n this.touch = new Touche(this.root, { eventType, needPreventDefault: !this.config.disableGesture })\n\n this.root.addEventListener('contextmenu', e => {\n e.preventDefault()\n })\n\n player.root.addEventListener('touchmove', this.onRootTouchMove, true)\n player.root.addEventListener('touchend', this.onRootTouchEnd, true)\n\n this.on(Events.DURATION_CHANGE, () => {\n const { player, config } = this\n if (player.duration * 1000 < config.moveDuration) {\n config.moveDuration = player.duration * 1000\n }\n })\n\n this.on([Events.CANPLAY, Events.ENDED], () => {\n const { time, isStart } = this.pos\n if (!isStart && time > 0) {\n this.pos.time = 0\n }\n })\n\n const eventsMap = {\n touchstart: 'onTouchStart',\n touchmove: 'onTouchMove',\n touchend: 'onTouchEnd',\n press: 'onPress',\n pressend: 'onPressEnd',\n click: 'onClick',\n doubleclick: 'onDbClick'\n }\n\n Object.keys(eventsMap).map(key => {\n this.touch.on(key, (e) => {\n this[eventsMap[key]](e)\n })\n })\n\n if (!config.disableActive) {\n // Add progress bar drag event callback\n const progressPlugin = player.plugins.progress\n if (progressPlugin) {\n progressPlugin.addCallBack('dragmove', (data) => {\n this.activeSeekNote(data.currentTime, data.forward)\n })\n progressPlugin.addCallBack('dragend', () => {\n this.changeAction(ACTIONS.AUTO)\n })\n }\n }\n }\n\n registerThumbnail () {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail = thumbnail.createThumbnail(null, 'mobile-thumbnail')\n const timePreview = this.find('.time-preview')\n timePreview.insertBefore(this.thumbnail, timePreview.children[0])\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { playedColor, progressColor } = commonStyle\n if (playedColor) {\n this.find('.xg-curbar').style.backgroundColor = playedColor\n this.find('.xg-cur').style.color = playedColor\n }\n if (progressColor) {\n this.find('.xg-bar').style.backgroundColor = progressColor\n this.find('.time-preview').style.color = progressColor\n }\n this.config.disableTimeProgress && Util.addClass(this.find('.xg-timebar'), 'hide')\n }\n\n resetPos (time = 0) {\n if (this.pos) {\n this.pos.isStart = false\n this.pos.scope = -1;\n ['x', 'y', 'width', 'height', 'scopeL', 'scopeR', 'scopeM1', 'scopeM2'].map(item => {\n this.pos[item] = 0\n })\n } else {\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1,\n time: 0\n }\n }\n }\n\n changeAction (action) {\n const { player, root } = this\n root.setAttribute('data-xg-action', action)\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.recover()\n }\n\n getTouche (e) {\n const rotateDeg = this.player.rotateDeg\n const touche = e.touches && e.touches.length > 0 ? e.touches[e.touches.length - 1] : e\n // if (touches && touches.length > 0) {\n // const touche = touches[touches.length - 1]\n // if (rotateDeg === 0) {\n // return {\n // pageX: touche.pageX,\n // pageY: touche.pageY\n // }\n // } else {\n // return {\n // pageX: touche.pageY,\n // pageY: touche.pageX\n // }\n // }\n // } else {\n // }\n return rotateDeg === 0\n ? {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n : {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n }\n\n /**\n * 校验具体的操作范围\n * @param { number } x 方向位移\n * @param { number } y 方向位移\n * @param { number } diffx 方向位移差\n * @param { number } diffy 方向位移差\n * @param { any } pos 当前操作区域位置信息 包含{width, height}\n * @return { number } scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n */\n checkScope (x, y, diffx, diffy, pos) {\n const { width } = pos\n let scope = -1\n if (x < 0 || x > width) {\n return scope\n }\n const mold = diffy === 0 ? Math.abs(diffx) : Math.abs(diffx / diffy)\n if (Math.abs(diffx) > 0 && mold >= 1.73 && x > pos.scopeM1 && x < pos.scopeM2) {\n scope = 0\n } else if (Math.abs(diffx) === 0 || mold <= 0.57) {\n scope = x < pos.scopeL ? 1 : (x > pos.scopeR ? 2 : 3)\n }\n return scope\n }\n\n /**\n * 根据位移和操作类型进行对应处理\n * @param {number} diffx x方向位移差\n * @param {number} diffy y方向位移差\n * @param {number} scope scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} width 总体宽度\n * @param {number} height 总高度\n */\n executeMove (diffx, diffy, scope, width, height) {\n switch (scope) {\n case 0:\n this.updateTime(diffx / width * this.config.scopeM)\n break\n case 1:\n this.updateBrightness(diffy / height)\n break\n case 2:\n // ios系统不支持音量调节\n if (!Sniffer.os.isIos) {\n this.updateVolume(diffy / height)\n }\n break\n default:\n }\n }\n\n /**\n * 结束手势操作\n * @param {number} scope 当前手势类型 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} lastScope 上一次手势类型\n */\n endLastMove (lastScope) {\n const { pos, player, config } = this\n const time = (pos.time - this.timeOffset) / 1000\n switch (lastScope) {\n case 0:\n player.seek(Number(time).toFixed(1))\n config.hideControlsEnd ? player.blur() : player.focus()\n this.timer = setTimeout(() => {\n this.pos.time = 0\n }, 500)\n break\n case 1:\n case 2:\n default:\n }\n this.changeAction(ACTIONS.AUTO)\n }\n\n onTouchStart = (e) => {\n const { player, config, pos, playerConfig } = this\n const touche = this.getTouche(e)\n if (touche && !config.disableGesture && this.duration > 0 && !player.ended) {\n pos.isStart = true\n // e.cancelable && e.preventDefault()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n // pos.volume = player.volume * 100\n const rect = this.root.getBoundingClientRect()\n if (player.rotateDeg === 90) {\n pos.top = rect.left\n pos.left = rect.top\n pos.width = rect.height\n pos.height = rect.width\n } else {\n pos.top = rect.top\n pos.left = rect.left\n pos.width = rect.width\n pos.height = rect.height\n }\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n pos.x = player.rotateDeg === 90 ? _y : _x // parseInt(touche.pageX - pos.left, 10)\n pos.y = player.rotateDeg === 90 ? _x : _y // parseInt(touche.pageY - pos.top, 10)\n pos.scopeL = config.scopeL * pos.width\n pos.scopeR = (1 - config.scopeR) * pos.width\n pos.scopeM1 = pos.width * (1 - config.scopeM) / 2\n pos.scopeM2 = pos.width - pos.scopeM1\n }\n }\n\n onTouchMove = (e) => {\n const touche = this.getTouche(e)\n const { pos, config, player } = this\n if (!touche || config.disableGesture || !this.duration || !pos.isStart) {\n return\n }\n const { miniMoveStep, hideControlsActive } = config\n\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n const x = player.rotateDeg === 90 ? _y : _x\n const y = player.rotateDeg === 90 ? _x : _y\n\n if (Math.abs(x - pos.x) > miniMoveStep || Math.abs(y - pos.y) > miniMoveStep) {\n const diffx = x - pos.x\n const diffy = y - pos.y\n let scope = pos.scope\n if (scope === -1) {\n scope = this.checkScope(x, y, diffx, diffy, pos)\n // 手势为快进快退记录起始操作时间\n if (scope === 0) {\n !hideControlsActive ? player.focus({ autoHide: false }) : player.blur()\n !pos.time && (pos.time = parseInt(player.currentTime * 1000, 10) + this.timeOffset * 1000)\n }\n pos.scope = scope\n }\n if (scope === -1 || (scope > 0 && !config.gestureY) || (scope === 0 && !config.gestureX)) {\n return\n }\n e.cancelable && e.preventDefault()\n this.executeMove(diffx, diffy, scope, pos.width, pos.height)\n pos.x = x\n pos.y = y\n } else {\n // console.log('touche.pageX - pos.x', touche.pageX - pos.x)\n }\n }\n\n onTouchEnd = (e) => {\n const { player, pos, playerConfig } = this\n if (!pos.isStart) {\n return\n }\n if (pos.scope > -1) {\n e.cancelable && e.preventDefault()\n }\n this.endLastMove(pos.scope)\n setTimeout(() => {\n player.getPlugin('progress') && player.getPlugin('progress').resetSeekState()\n }, 10)\n pos.scope = -1\n this.resetPos()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n this.changeAction(ACTIONS.AUTO)\n }\n\n checkIsRootTarget (e) {\n const plugins = this.player.plugins || {}\n if (plugins.progress && plugins.progress.root.contains(e.target)) {\n return false\n }\n return (plugins.start && plugins.start.root.contains(e.target)) || (plugins.controls && plugins.controls.root.contains(e.target))\n }\n\n onRootTouchMove = (e) => {\n if (this.config.disableGesture || !this.config.gestureX) {\n return\n }\n if (this.checkIsRootTarget(e)) {\n e.stopPropagation()\n if (!this.pos.isStart) {\n this.onTouchStart(e)\n } else {\n this.onTouchMove(e)\n }\n }\n }\n\n onRootTouchEnd = (e) => {\n if (this.pos.isStart && this.checkIsRootTarget(e)) {\n e.stopPropagation()\n this.onTouchEnd(e)\n // const { controls } = this.player\n // controls && controls.recoverAutoHide()\n }\n }\n\n sendUseAction (event) {\n const { paused } = this.player\n this.emitUserAction(event, 'switch_play_pause', {\n prop: 'paused',\n from: paused,\n to: !paused\n })\n }\n\n onClick (e) {\n const { player, config, playerConfig } = this\n if (player.state < STATES.RUNNING) {\n if (!playerConfig.closeVideoClick) {\n this.sendUseAction(new Event('click'))\n player.play()\n }\n return\n }\n\n if (!config.closedbClick || playerConfig.closeVideoClick) {\n player.isActive ? player.blur() : player.focus()\n } else if (!playerConfig.closeVideoClick) {\n if (player.isActive || config.focusVideoClick) {\n this.emitUserAction('click', 'switch_play_pause')\n this.switchPlayPause()\n }\n player.focus()\n }\n }\n\n onDbClick (e) {\n const { config, player } = this\n if (!config.closedbClick && player.state >= STATES.RUNNING) {\n this.sendUseAction(new Event('dblclick'))\n this.switchPlayPause()\n }\n }\n\n onPress (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n pos.rate = this.player.playbackRate\n this.emitUserAction('press', 'change_rate', {\n prop: 'playbackRate',\n from: player.playbackRate,\n to: config.pressRate\n })\n player.playbackRate = config.pressRate\n this.changeAction(ACTIONS.PLAYBACK)\n }\n\n onPressEnd (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n this.emitUserAction('pressend', 'change_rate', { prop: 'playbackRate', from: player.playbackRate, to: pos.rate })\n player.playbackRate = pos.rate\n pos.rate = 1\n this.changeAction(ACTIONS.AUTO)\n }\n\n updateTime (percent) {\n const { player, config } = this\n const { duration } = this.player\n percent = Number(percent.toFixed(4))\n let time = parseInt(percent * config.moveDuration, 10) + this.timeOffset\n time += this.pos.time\n time = time < 0 ? 0 : (time > duration * 1000 ? duration * 1000 - 200 : time)\n player.getPlugin('time') && player.getPlugin('time').updateTime(time / 1000)\n player.getPlugin('progress') && player.getPlugin('progress').updatePercent(time / 1000 / this.duration, true)\n this.activeSeekNote(time / 1000, percent > 0)\n // 在滑动的同时实时seek\n if (config.isTouchingSeek) {\n // player.currentTime = time / 1000\n player.seek(Number((time - this.timeOffset) / 1000).toFixed(1))\n }\n this.pos.time = time\n }\n\n updateVolume (percent) {\n if (this.player.rotateDeg) {\n percent = -percent\n }\n const { player, pos } = this\n percent = parseInt(percent * 100, 10)\n pos.volume += percent\n if (Math.abs(pos.volume) < 10) {\n return\n }\n let volume = parseInt(player.volume * 10, 10) - parseInt(pos.volume / 10, 10)\n volume = volume > 10 ? 10 : (volume < 1 ? 0 : volume)\n player.volume = volume / 10\n pos.volume = 0\n }\n\n updateBrightness (percent) {\n if (this.player.rotateDeg) {\n percent = -percent\n }\n const { pos, config, xgMask } = this\n let light = pos.light + (0.8 * percent)\n light = light > config.maxDarkness ? config.maxDarkness : (light < 0 ? 0 : light)\n if (xgMask) {\n xgMask.style.backgroundColor = `rgba(0,0,0,${light})`\n }\n pos.light = light\n }\n\n activeSeekNote (time, isForward = true) {\n const { player, config } = this\n const isLive = !(this.duration !== Infinity && this.duration > 0)\n if (!time || typeof time !== 'number' || isLive || config.disableActive) {\n return\n }\n if (time < 0) {\n time = 0\n } else if (time > player.duration) {\n time = player.duration - 0.2\n }\n this.changeAction(ACTIONS.SEEKING)\n\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.focusHide()\n\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n this.find('.xg-cur').innerHTML = Util.format(time)\n this.find('.xg-curbar').style.width = `${time / this.duration * 100}%`\n if (isForward) {\n Util.removeClass(this.find('.xg-seek-show'), 'xg-back')\n } else {\n Util.addClass(this.find('.xg-seek-show'), 'xg-back')\n }\n this.updateThumbnails(time)\n // const {thumbnail} = player.plugins\n // this.thumbnailPlugin && thumbnail.update(time)\n }\n\n updateThumbnails (time) {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, 160, 90)\n // this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n switchPlayPause () {\n const { player } = this\n if (player.state < STATES.ATTACHED) {\n return false\n } else if (!player.ended) {\n if (player.paused) {\n player.play()\n } else {\n player.pause()\n }\n }\n }\n\n // 动态禁用手势\n disableGesture () {\n this.config.disableGesture = false\n }\n\n // 动态启用手势\n enableGesture () {\n this.config.disableGesture = true\n }\n\n destroy () {\n const { player } = this\n this.timer && clearTimeout(this.timer)\n this.thumbnail = null\n player.root.removeChild(this.xgMask)\n this.xgMask = null\n this.touch && this.touch.destroy()\n this.touch = null\n player.root.removeEventListener('touchmove', this.onRootTouchMove, true)\n player.root.removeEventListener('touchend', this.onRootTouchEnd, true)\n }\n\n render () {\n const className = this.config.gradient !== 'normal' ? `gradient ${this.config.gradient}` : 'gradient'\n return `\n \n
\n
\n
\n \n 00:00\n /\n 00:00\n
\n
\n
\n
\n
\n
\n ${this.config.pressRate}X${this.i18n.FORWARD}\n
\n
\n `\n }\n}\n\nexport default MobilePlugin\n","import { BasePlugin, Events } from '../../plugin'\n/**\n * @typedef {{\n * seekStep?: number,\n * checkVisible?: boolean,\n * disableBodyTrigger?: boolean,\n * keyCodeMap?: { [propName: string]: any },\n * disable: boolean,\n * isIgnoreUserActive: boolean,\n * [propName: string]: any\n * }} IKeyboardConfig\n */\n\nfunction preventDefault (e) {\n e.preventDefault()\n e.returnValue = false\n}\n\nfunction isDisableTag (el) {\n const tagName = el.tagName\n\n if (tagName === 'INPUT' || tagName === 'TEXTAREA' || el.isContentEditable) {\n return true\n }\n\n return false\n}\n\nclass Keyboard extends BasePlugin {\n static get pluginName () {\n return 'keyboard'\n }\n\n /**\n * @type IKeyboardConfig\n */\n static get defaultConfig () {\n return {\n seekStep: 10, // Left/right fast forward each operation time\n checkVisible: true, // Whether to check the visibility when the shortcut key takes effect\n disableBodyTrigger: false, // Whether to monitor the shortcut keys on the body\n disableRootTrigger: false, // 是否在player.root上做快捷键监听\n isGlobalTrigger: false, // Whether the shortcut key needs to be triggered globally\n keyCodeMap: {},\n disable: false,\n isIgnoreUserActive: false // 是否忽略用户激活状态\n }\n }\n\n mergekeyCodeMap () {\n const extendkeyCodeMap = this.config.keyCodeMap\n if (extendkeyCodeMap) {\n Object.keys(extendkeyCodeMap).map(key => {\n if (!this.keyCodeMap[key]) {\n this.keyCodeMap[key] = extendkeyCodeMap[key]\n } else {\n ['keyCode', 'action', 'disable', 'isBodyTarget'].map(key1 => {\n extendkeyCodeMap[key][key1] && (this.keyCodeMap[key][key1] = extendkeyCodeMap[key][key1])\n })\n }\n })\n }\n }\n\n afterCreate () {\n this.config.disable = !this.playerConfig.keyShortcut\n const seekStep = typeof this.config.seekStep === 'function' ? this.config.seekStep(this.player) : this.config.seekStep\n if (!(!seekStep || typeof seekStep !== 'number')) {\n this.seekStep = seekStep\n }\n this.keyCodeMap = {\n space: {\n keyCode: 32,\n action: 'playPause',\n disable: false,\n noBodyTarget: false\n },\n up: {\n keyCode: 38,\n action: 'upVolume',\n disable: false,\n noBodyTarget: true\n },\n down: {\n keyCode: 40,\n action: 'downVolume',\n disable: false,\n noBodyTarget: true\n },\n left: {\n keyCode: 37,\n action: 'seekBack',\n disable: false\n },\n right: {\n keyCode: 39,\n action: 'seek',\n disable: false\n },\n esc: {\n keyCode: 27,\n action: 'exitFullscreen',\n disable: false\n }\n }\n this.mergekeyCodeMap()\n this.player.root.addEventListener('keydown', this.onKeydown)\n document.addEventListener('keydown', this.onBodyKeyDown)\n }\n\n checkIsVisible () {\n if (!this.config.checkVisible) {\n return true\n }\n const rec = this.player.root.getBoundingClientRect()\n const { height, top, bottom } = rec\n const h = window.innerHeight\n if ((top < 0 && top < 0 - height * 0.9) || (bottom > 0 && bottom - h > height * 0.9)) {\n return false\n }\n return true\n }\n\n checkCode (code, isBodyTarget) {\n let flag = false\n Object.keys(this.keyCodeMap).map(key => {\n if (this.keyCodeMap[key] && code === this.keyCodeMap[key].keyCode && !this.keyCodeMap[key].disable) {\n flag = !isBodyTarget || (isBodyTarget && !this.keyCodeMap[key].noBodyTarget)\n }\n })\n return flag\n }\n\n downVolume (event) {\n const { player } = this\n const val = parseFloat((player.volume - 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val >= 0) {\n player.volume = val\n } else {\n player.volume = 0\n }\n }\n\n upVolume (event) {\n const { player } = this\n const val = parseFloat((player.volume + 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val <= 1) {\n player.volume = val\n } else {\n player.volume = 1\n }\n }\n\n seek (event) {\n const { currentTime, duration } = this.player\n let _time = currentTime\n if (currentTime + this.seekStep <= duration) {\n _time = currentTime + this.seekStep\n } else {\n _time = duration - 1\n }\n const props = {\n currentTime: {\n from: currentTime,\n to: _time\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _time\n }\n\n seekBack (event) {\n const { currentTime } = this.player\n let _time = 0\n if (currentTime - this.seekStep >= 0) {\n _time = currentTime - this.seekStep\n }\n const props = {\n currentTime: {\n from: currentTime,\n to: _time\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _time\n }\n\n playPause (event) {\n const { player } = this\n if (!player) {\n return\n }\n this.emitUserAction(event, 'switch_play_pause')\n if (player.paused) {\n // eslint-disable-next-line handle-callback-err\n player.play()\n } else {\n player.pause()\n }\n }\n\n exitFullscreen (event) {\n const { player } = this\n const { fullscreen, cssfullscreen } = player\n if (fullscreen) {\n this.emitUserAction('keyup', 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n player.exitFullscreen()\n }\n if (cssfullscreen) {\n this.emitUserAction('keyup', 'switch_css_fullscreen', {\n prop: 'cssfullscreen',\n from: cssfullscreen,\n to: !cssfullscreen\n })\n player.exitCssFullscreen()\n }\n }\n\n onBodyKeyDown = (event) => {\n const e = event || window.event\n if (!this.player || (!this.player.isUserActive && !this.config.isIgnoreUserActive)) {\n return\n }\n if (this.config.disable || this.config.disableBodyTrigger || !this.checkIsVisible() || e.metaKey || e.altKey || e.ctrlKey) {\n return\n }\n const keyCode = e.keyCode\n if ((e.target === document.body || (this.config.isGlobalTrigger && !isDisableTag(e.target))) && this.checkCode(keyCode, true)) {\n preventDefault(e)\n this.handleKeyCode(keyCode, event)\n return false\n }\n return false\n }\n\n onKeydown = (event) => {\n const e = event || window.event\n if (this.config.disable || this.config.disableRootTrigger || e.metaKey || e.altKey || e.ctrlKey) {\n return\n }\n if (!this.player.isUserActive && !this.config.isIgnoreUserActive) {\n return\n }\n if (!this.player.isUserActive && !this.config.isIgnoreUserActive) {\n return\n }\n if (e && (e.keyCode === 37 || this.checkCode(e.keyCode)) && (e.target === this.player.root || e.target === this.player.video || e.target === this.player.controls.el)) {\n preventDefault(e)\n } else {\n return true\n }\n this.handleKeyCode(e.keyCode, event)\n }\n\n handleKeyCode (curKeyCode, event) {\n Object.keys(this.keyCodeMap).map(key => {\n const { action, keyCode, disable } = this.keyCodeMap[key]\n if (keyCode === curKeyCode && !disable) {\n if (typeof action === 'function') {\n action(event, this.player)\n } else if (typeof action === 'string') {\n if (typeof this[action] === 'function') {\n this[action](event, this.player)\n }\n }\n this.emit(Events.SHORTCUT, {\n key: key,\n target: event.target,\n ...this.keyCodeMap[key]\n })\n }\n })\n }\n\n destroy () {\n this.player.root.removeEventListener('keydown', this.onKeydown)\n document.removeEventListener('keydown', this.onBodyKeyDown)\n }\n\n disable () {\n this.config.disable = true\n }\n\n enable () {\n this.config.disable = false\n }\n}\n\nexport default Keyboard\n","import Plugin, { POSITIONS } from '../../plugin/plugin'\nimport loadingIcon from '../assets/loading.svg'\nimport './index.scss'\n\nclass Loading extends Plugin {\n static get pluginName () {\n return 'loading'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT\n }\n }\n\n registerIcons () {\n return {\n loadingIcon: loadingIcon\n }\n }\n\n afterCreate () {\n this.appendChild('xg-loading-inner', this.icons.loadingIcon)\n }\n\n render () {\n return `\n \n \n `\n }\n}\n\nexport default Loading\n","import { Util } from '../../plugin'\n\nconst TPL = [\n { tag: 'xg-cache', className: 'xgplayer-progress-cache', styleKey: 'cachedColor' },\n { tag: 'xg-played', className: 'xgplayer-progress-played', styleKey: 'playedColor' }\n]\n\nexport default class InnerList {\n constructor (args) {\n this.fragments = args.fragments || []\n this.focusClass = 'inner-focus'\n this.style = args.style || {\n playedColor: '',\n cachedColor: '',\n progressColor: ''\n }\n this.duration = 0\n this.cachedIndex = 0\n this.playedIndex = 0\n }\n\n updateDuration (duration) {\n this.duration = parseInt(duration * 1000)\n let start = 0\n const { fragments } = this\n this.fragments = fragments.map(item => {\n item.start = start\n item.end = start + item.percent * this.duration\n item.duration = item.percent * this.duration\n start += item.percent * this.duration\n return item\n })\n }\n\n updateProgress (type = 'played', data = { newIndex: 0, curIndex: 0, millisecond: 0 }) {\n const { progressList, fragments } = this\n const { newIndex, curIndex, millisecond } = data\n if (newIndex !== curIndex) {\n progressList.map((item, index) => {\n if (index < newIndex) {\n item[type].style.width = '100%'\n } else if (index > newIndex) {\n item[type].style.width = 0\n }\n })\n }\n const curPFrag = fragments[newIndex]\n const per = millisecond === 0 ? 0 : (millisecond - curPFrag.start) / curPFrag.duration\n progressList[newIndex][type].style.width = per < 0 ? 0 : `${per * 100}%`\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!this.duration || parseInt(duration * 1000, 10) !== this.duration) {\n if (!duration && duration !== 0) {\n return\n }\n this.updateDuration(duration)\n }\n const { playedIndex, cachedIndex } = this\n if (Util.typeOf(data.played) !== 'Undefined') {\n const newPIndex = this.findIndex(data.played * 1000, playedIndex)\n this.updateProgress('played', {\n newIndex: newPIndex,\n curIndex: playedIndex,\n millisecond: parseInt(data.played * 1000, 10)\n })\n this.playedIndex = newPIndex\n }\n\n if (Util.typeOf(data.cached) !== 'Undefined') {\n const newCIndex = this.findIndex(data.cached * 1000, cachedIndex)\n this.updateProgress('cached', {\n newIndex: newCIndex,\n curIndex: cachedIndex,\n millisecond: parseInt(data.cached * 1000, 10)\n })\n this.cachedIndex = newCIndex\n }\n }\n\n findIndex (time, curIndex) {\n const { fragments } = this\n if (fragments.length === 1) {\n return 0\n }\n if (time > fragments[curIndex].start && time < fragments[curIndex].end) {\n return curIndex\n }\n this.fragments.map((item, index) => {\n if (time > item.start && time <= item.end) {\n curIndex = index\n }\n })\n return curIndex\n }\n\n findHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n if (Util.hasClass(children[i], this.focusClass)) {\n return {\n dom: children[i],\n pos: children[i].getBoundingClientRect()\n }\n }\n }\n }\n\n // 根据索引获取进度条片段\n findFragment (index) {\n const children = this.root.children\n if (index < 0 || index >= children.length) {\n return null\n }\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n\n unHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n Util.removeClass(children[i], this.focusClass)\n }\n }\n\n setHightLight (index) {\n const children = this.root.children\n if (index < children.length) {\n Util.addClass(children[index], this.focusClass)\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n }\n\n destroy () {\n this.progressList = null\n this.fragments = null\n this.root.innerHTML = ''\n }\n\n render () {\n const { progressColor } = this.style\n this.root = Util.createDom('xg-inners', '', {}, 'progress-list')\n if (this.fragments) {\n this.progressList = this.fragments.map((item) => {\n const inner = Util.createDom('xg-inner', '', {\n style: progressColor ? `background:${progressColor}; flex: ${item.percent}` : `flex: ${item.percent}`\n }, `${item.isFocus ? 'inner-focus' : ''} xgplayer-progress-inner`)\n\n this.root.appendChild(inner)\n\n TPL.map(item => {\n inner.appendChild(Util.createDom(item.tag, '', {\n style: item.styleKey ? `background: ${this.style[item.styleKey]}; width:0;` : 'width:0;'\n }, item.className))\n })\n\n return {\n cached: inner.children[0],\n played: inner.children[1]\n }\n })\n }\n return this.root\n }\n}\n","import Plugin, { Events, Util, POSITIONS, Sniffer, STATES } from '../../plugin'\nimport InnerList from './innerList'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?:string,\n * disable?: boolean,\n * isDragingSeek?: boolean, // 是否在拖拽的过程中更新currentTime\n * closeMoveSeek?: boolean, // 是否关闭滑块seek能力\n * isPauseMoving?: boolean, // 是否在move的时候暂停视频内容\n * isCloseClickSeek?: boolean, // 是否关闭点击进度条的时候seek\n * fragments?: Array<{percent: number}>,\n * miniMoveStep?: number,\n * miniStartStep?: number,\n * onMoveStart?: () => any, // 手势开始移动回调,\n * onMoveEnd?: () => any, // 手势移动结束回调\n * endedDiff?: number,\n * [propName: string]: any\n * }} IProgressConfig\n */\n/**\n * 进度条组件\n */\nclass Progress extends Plugin {\n static get pluginName () {\n return 'progress'\n }\n\n /**\n * @type IProgressConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_CENTER,\n index: 0,\n disable: false,\n isDragingSeek: true, // 是否在拖拽的过程中更新currentTime\n closeMoveSeek: false, // 是否关闭滑块seek能力\n isPauseMoving: false, // 是否在move的时候暂停视频内容\n isCloseClickSeek: false, // 是否关闭点击进度条的时候seek\n fragments: [{ percent: 1 }],\n miniMoveStep: 5,\n miniStartStep: 2,\n onMoveStart: () => {\n }, // 手势开始移动回调\n onMoveEnd: () => {}, // 手势移动结束回调\n endedDiff: 0.2\n }\n }\n\n constructor (args) {\n super(args)\n /**\n * @readonly\n */\n this.useable = false\n /**\n * @readonly\n */\n this.isProgressMoving = false\n\n /**\n * @private\n */\n this.__dragCallBacks = []\n /**\n * @private\n */\n this._state = {\n now: -1,\n direc: 0,\n time: 0\n }\n\n this._disableBlur = false\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n changeState (useable = true) {\n this.useable = useable\n }\n\n /**\n * @description 创建内部进度条,并挂载到xg-outer上,\n * 并把一些对外API绑定在progress上供外部调用\n *\n */\n createInner () {\n this.innerList = new InnerList({\n fragments: this.config.fragments,\n style: this.playerConfig.commonStyle || {}\n })\n this.outer.insertBefore(this.innerList.render(), this.outer.children[0]);\n ['findHightLight', 'unHightLight', 'setHightLight', 'findFragment'].map(item => {\n this[item] = this.innerList[item].bind(this.innerList)\n })\n }\n\n afterCreate () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n this.pos = {\n x: 0, // 水平方向位移\n y: 0, // 垂直方向位移\n moving: false, // 是否正在移动\n isDown: false, // 是否mouseDown\n isEnter: false // 是否触发了mouseEnter\n }\n this.outer = this.find('xg-outer')\n this.createInner()\n if (Sniffer.device === 'mobile') {\n this.config.isDragingSeek = false\n this.isMobile = true\n }\n\n this.progressBtn = this.find('.xgplayer-progress-btn')\n\n this.on(Events.DURATION_CHANGE, () => {\n this.onMouseLeave()\n })\n\n this.on(Events.TIME_UPDATE, () => {\n this.onTimeupdate()\n })\n\n this.on(Events.SEEKED, () => {\n this.onTimeupdate()\n this.onCacheUpdate()\n })\n\n this.on(Events.PROGRESS, () => {\n this.onCacheUpdate()\n })\n\n this.on(Events.ENDED, () => {\n this.onCacheUpdate()\n this._state.now = 0\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n\n this.bindDomEvents()\n this.initCustomStyle()\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { sliderBtnStyle } = commonStyle\n const { progressBtn } = this\n if (sliderBtnStyle) {\n if (typeof sliderBtnStyle === 'string') {\n progressBtn.style.boxShadow = sliderBtnStyle\n } else if (typeof sliderBtnStyle === 'object') {\n Object.keys(sliderBtnStyle).map(key => {\n progressBtn.style[key] = sliderBtnStyle[key]\n })\n }\n }\n }\n\n /**\n * 触发某一类回调监听\n * @param { string } type 类型 drag/dragend\n * @param { any} data 具体数据\n */\n triggerCallbacks (type, data, event) {\n if (this.__dragCallBacks.length > 0) {\n this.__dragCallBacks.map(item => {\n if (item && item.handler && item.type === type) {\n try {\n item.handler(data, event)\n } catch (error) {\n console.error(`[XGPLAYER][triggerCallbacks] ${item} error`, error)\n }\n }\n })\n }\n }\n\n /**\n * 供外部插件添加回调\n * @param {string} type 类型 drag/dragend\n * @param {function} handle 回调函数句柄\n */\n addCallBack (type, handle) {\n if (handle && typeof handle === 'function') {\n this.__dragCallBacks.push({ type: type, handler: handle })\n }\n }\n\n /**\n * 供外部插件移除回调\n * @param {string} type 类型 drag/dragend\n * @param {Function} event 回调函数句柄\n */\n removeCallBack (type, event) {\n const { __dragCallBacks } = this\n let _index = -1\n __dragCallBacks.map((item, index) => {\n if (item && item.type === type && item.handler === event) {\n _index = index\n }\n })\n if (_index > -1) {\n __dragCallBacks.splice(_index, 1)\n }\n }\n\n bindDomEvents () {\n const { controls, config } = this.player\n this._mouseDownHandlerHook = this.hook('dragstart', this._mouseDownHandler)\n this._mouseUpHandlerHook = this.hook('dragend', this._mouseUpHandler)\n this._mouseMoveHandlerHook = this.hook('drag', this._mouseMoveHandler)\n if (this.domEventType === 'touch') {\n this.root.addEventListener('touchstart', this.onMouseDown)\n // this.bind('touchstart', this.onMouseDown)\n if (controls) {\n controls.root && controls.root.addEventListener('touchmove', Util.stopPropagation)\n controls.center && controls.center.addEventListener('touchend', Util.stopPropagation)\n }\n } else {\n this.bind('mousedown', this.onMouseDown)\n config.isMobileSimulateMode !== 'mobile' && this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseover', this.onMouseOver)\n this.bind('mouseout', this.onMouseOut)\n }\n }\n\n focus () {\n // this.player.controls.pauseAutoHide()\n Util.addClass(this.root, 'active')\n }\n\n blur () {\n if (this._disableBlur) {\n return\n }\n this.player.controls.recoverAutoHide()\n Util.removeClass(this.root, 'active')\n }\n\n disableBlur () {\n this._disableBlur = true\n }\n\n enableBlur () {\n this._disableBlur = false\n }\n\n onMoveOnly = (e) => {\n const { pos, config, player } = this\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (pos.moving && Math.abs(pos.x - x) < config.miniMoveStep) {\n return\n }\n pos.moving = true\n pos.x = x\n const ret = this.computeTime(e)\n this.triggerCallbacks('dragmove', ret, e)\n }\n\n onBodyClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n\n _mouseDownHandler = (event, data) => {\n this._state.time = data.currentTime\n this.updateWidth(data.currentTime, data.percent, 0)\n }\n\n _mouseUpHandler = (e, data) => {\n const { pos } = this\n if (pos.moving) {\n this.updateWidth(data.currentTime, data.percent, 2)\n // this.triggerCallbacks('dragend', data, e)\n } else {\n // this.updateWidth(ret.currentTime, ret.percent, 2)\n // this.triggerCallbacks('click', data, e)\n }\n }\n\n _mouseMoveHandler = (e, data) => {\n const { _state, pos, config, player } = this\n if (_state.time < data.currentTime) {\n data.forward = true\n } else {\n data.forward = false\n }\n _state.time = data.currentTime\n if (pos.isDown && !pos.moving) {\n pos.moving = true\n config.isPauseMoving && player.pause()\n this.triggerCallbacks('dragstart', data, e)\n }\n this.updateWidth(data.currentTime, data.percent, 1)\n this.triggerCallbacks('dragmove', data, e)\n }\n\n onMouseDown = (e) => {\n const { player, pos, config, playerConfig } = this\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (player.isMini || config.closeMoveSeek || (!playerConfig.allowSeekAfterEnded && player.ended)) {\n return\n }\n e.stopPropagation()\n // e.preventDefault()\n this.focus()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n Util.checkIsFunction(config.onMoveStart) && config.onMoveStart()\n Util.event(e)\n pos.x = x\n pos.isDown = true\n pos.moving = false\n\n // 交互开始 禁止控制栏的自动隐藏功能\n player.focus({ autoHide: false })\n this.isProgressMoving = true\n Util.addClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e)\n this._mouseDownHandlerHook(e, ret)\n // this._state.time = ret.currentTime\n // this.updateWidth(ret.currentTime, ret.percent, 0)\n if (this.domEventType === 'touch') {\n this.root.addEventListener('touchmove', this.onMouseMove)\n this.root.addEventListener('touchend', this.onMouseUp)\n } else {\n this.unbind('mousemove', this.onMoveOnly)\n\n document.addEventListener('mousemove', this.onMouseMove, false)\n document.addEventListener('mouseup', this.onMouseUp, false)\n // 避免触发videoClick 暂停/播放切换\n player.root.addEventListener('click', this.onBodyClick, false)\n // this.bind('mouseup', this.onMouseUp, false)\n }\n return true\n }\n\n onMouseUp = (e) => {\n const { player, config, pos, playerConfig, _state } = this\n e.stopPropagation()\n e.preventDefault()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n Util.checkIsFunction(config.onMoveEnd) && config.onMoveEnd()\n Util.event(e)\n Util.removeClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e)\n // if (pos.moving) {\n // this.updateWidth(ret.currentTime, ret.percent, 2)\n // this.triggerCallbacks('dragend', ret)\n // } else {\n // // this.updateWidth(ret.currentTime, ret.percent, 2)\n // this.triggerCallbacks('click', ret)\n // }\n if (pos.moving) {\n this.triggerCallbacks('dragend', ret, e)\n } else {\n this.triggerCallbacks('click', ret, e)\n }\n this._mouseUpHandlerHook(e, ret)\n\n pos.moving = false\n pos.isDown = false\n pos.x = 0\n pos.y = 0\n _state.time = 0\n if (this.domEventType === 'touch') {\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n // 交互结束 恢复控制栏的隐藏流程\n this.blur()\n } else {\n document.removeEventListener('mousemove', this.onMouseMove, false)\n document.removeEventListener('mouseup', this.onMouseUp, false)\n player.root.removeEventListener('click', this.onBodyClick, false)\n if (!pos.isEnter) {\n this.onMouseLeave(e)\n } else {\n playerConfig.isMobileSimulateMode !== 'mobile' && this.bind('mousemove', this.onMoveOnly)\n }\n }\n // 延迟复位,状态复位要在dom相关时间回调执行之后\n Util.setTimeout(this, () => {\n this.resetSeekState()\n }, 10)\n // 交互结束 恢复控制栏的隐藏流程\n player.focus()\n }\n\n onMouseMove = (e) => {\n const { pos, player, config } = this\n if (Util.checkTouchSupport()) {\n // e.stopPropagation()\n e.preventDefault()\n }\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const diff = Math.abs(pos.x - x)\n if ((pos.moving && diff < config.miniMoveStep) || (!pos.moving && diff < config.miniStartStep)) {\n return\n }\n pos.x = x\n const ret = this.computeTime(e)\n this._mouseMoveHandlerHook(e, ret)\n // if (_state.time < ret.currentTime) {\n // ret.forward = true\n // } else {\n // ret.forward = false\n // }\n // _state.time = ret.currentTime\n // if (pos.isDown && !pos.moving) {\n // pos.moving = true\n // config.isPauseMoving && player.pause()\n // this.triggerCallbacks('dragstart', ret)\n // }\n // this.updateWidth(ret.currentTime, ret.percent, 1)\n // this.triggerCallbacks('dragmove', ret)\n }\n\n onMouseOut = (e) => {\n this.triggerCallbacks('mouseout', null, e)\n }\n\n onMouseOver = (e) => {\n this.triggerCallbacks('mouseover', null, e)\n }\n\n onMouseEnter = (e) => {\n const { player, pos } = this\n this.triggerCallbacks('mouseenter', null, e)\n if (pos.isDown || pos.isEnter || player.isMini || (!player.config.allowSeekAfterEnded && player.ended)) {\n return\n }\n pos.isEnter = true\n this.bind('mousemove', this.onMoveOnly)\n this.bind('mouseleave', this.onMouseLeave)\n this.focus()\n }\n\n onMouseLeave = (e) => {\n this.triggerCallbacks('mouseleave', null, e)\n const { player, pos } = this\n pos.isEnter = false\n if (player.isMini) {\n return\n }\n this.unbind('mousemove', this.onMoveOnly)\n if (pos.isDown) {\n this.unbind('mouseleave', this.onMouseLeave)\n return\n }\n this.blur()\n }\n\n /**\n * @description 根据currenTime和占用百分比更新进度条\n * @param {Number} currentTime 需要更新到的时间\n * @param {Number} percent 更新时间占比\n * @param {Int} type 触发类型 0-down 1-move 2-up\n */\n updateWidth (currentTime, percent, type) {\n const { config, player } = this\n if (config.isCloseClickSeek && type === 0) {\n return\n }\n const realTime = currentTime >= player.duration ? player.duration - config.endedDiff : Number(currentTime).toFixed(1)\n // currentTime = currentTime > player.duration ? player.duration - 0.2 : Number(currentTime).toFixed(1)\n this.updatePercent(percent)\n this.updateTime(currentTime)\n if (type === 1 && (!config.isDragingSeek || player.videoConfig.mediaType === 'audio')) {\n return\n }\n this._state.now = realTime\n this._state.direc = realTime > player.currentTime ? 0 : 1\n player.seek(realTime)\n }\n\n computeTime (e) {\n const { player } = this\n const { width, height, top, left } = this.root.getBoundingClientRect()\n const _ePos = Util.getEventPos(e, player.zoom)\n let rWidth, rLeft, clientX\n if (player.rotateDeg === 90) {\n rWidth = height\n rLeft = top\n clientX = _ePos.clientY\n } else {\n rWidth = width\n rLeft = left\n clientX = _ePos.clientX\n }\n let offset = clientX - rLeft\n offset = offset > rWidth ? rWidth : (offset < 0 ? 0 : offset)\n\n let percent = offset / rWidth\n percent = percent < 0 ? 0 : (percent > 1 ? 1 : percent)\n // 单位:秒,精确到毫秒\n const currentTime = parseInt(percent * this.duration * 1000, 10) / 1000\n return {\n percent,\n currentTime,\n offset,\n width: rWidth,\n left: rLeft,\n e\n }\n }\n\n /**\n * @description 更新时间插件,在拖拽状态下要接管时间插件的更新状态\n * 本位置会和time插件交互\n * @param {number} time 根据拖拽距离计算出的时间\n */\n updateTime (time) {\n const { player, duration } = this\n if (time > duration) {\n time = duration\n } else if (time < 0) {\n time = 0\n }\n const timeIcon = player.plugins.time\n if (timeIcon) {\n timeIcon.updateTime(time)\n }\n }\n\n /**\n * @description 复位正在拖拽状态 ,拖拽的时候要避免timeupdate更新\n */\n resetSeekState () {\n this.isProgressMoving = false\n const timeIcon = this.player.plugins.time\n timeIcon && timeIcon.resetActive()\n }\n\n /**\n * @description 拖拽过程中更新UI\n * @param {number} percent 小于0的小数\n *\n */\n updatePercent (percent, notSeek) {\n this.isProgressMoving = true\n if (this.config.disable) {\n return\n }\n percent = percent > 1 ? 1 : (percent < 0 ? 0 : percent)\n this.progressBtn.style.left = `${percent * 100}%`\n this.innerList.update({ played: percent * this.duration }, this.duration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: percent * this.duration }, this.duration)\n }\n\n /**\n * @description 播放进度更新\n */\n onTimeupdate () {\n const { player, _state, duration } = this\n if (player.isSeeking || this.isProgressMoving || player.state < STATES.RUNNING) {\n return\n }\n if (_state.now > -1) {\n const abs = parseInt(_state.now * 1000, 10) - parseInt(player.currentTime * 1000, 10)\n if ((_state.direc === 0 && abs > 300) || (_state.direc === 1 && abs > -300)) {\n _state.now = -1\n return\n } else {\n _state.now = -1\n }\n }\n const time = this.timeOffset + player.currentTime\n this.innerList.update({ played: time }, duration)\n this.progressBtn.style.left = `${time / duration * 100}%`\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: time }, duration)\n }\n\n /**\n * @description 缓存进度更新\n */\n onCacheUpdate () {\n const { player, duration } = this\n const point = player.bufferedPoint\n this.innerList.update({ cached: point.end }, duration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ cached: point.end }, duration)\n }\n\n onReset () {\n this.innerList.update({ played: 0, cached: 0 }, 0)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ cached: 0, played: 0 }, 0)\n }\n\n destroy () {\n const { player } = this\n const { controls } = player\n this.thumbnailPlugin = null\n this.innerList.destroy()\n this.innerList = null\n // if (this.isMobile) {\n const { domEventType } = this\n if (domEventType === 'touch') {\n this.root.removeEventListener('touchstart', this.onMouseDown)\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n if (controls) {\n controls.root && controls.root.removeEventListener('touchmove', Util.stopPropagation)\n controls.center && controls.center.removeEventListener('touchend', Util.stopPropagation)\n }\n } else {\n this.unbind('mousedown', this.onMouseDown)\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mousemove', this.onMoveOnly)\n this.unbind('mouseleave', this.onMouseLeave)\n document.removeEventListener('mousemove', this.onMouseMove, false)\n document.removeEventListener('mouseup', this.onMouseUp, false)\n player.root.removeEventListener('click', this.onBodyClick, false)\n }\n }\n\n render () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n const controlsMode = this.player.controls ? this.player.controls.config.mode : ''\n const className = controlsMode === 'bottom' ? 'xgplayer-progress-bottom' : ''\n return `\n \n \n \n \n \n `\n }\n}\n\nexport default Progress\n","import Plugin from '../../plugin'\n\nexport default class Fullscreen extends Plugin {\n afterCreate () {\n this.bind('mouseenter', this._onMouseenter)\n this.bind('mouseleave', this._onMouseLeave)\n }\n\n _onMouseenter = (e) => {\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n _onMouseLeave = (e) => {\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n destroy () {\n this.unbind('mouseenter', this._onMouseenter)\n this.unbind('mouseleave', this._onMouseLeave)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport IconPlugin from '../common/iconPlugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\nclass Play extends IconPlugin {\n static get pluginName () {\n return 'play'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 0,\n disable: false\n }\n }\n\n afterCreate () {\n super.afterCreate()\n const { player, config } = this\n if (config.disable) {\n return\n }\n this.initIcons()\n this.btnClick = this.btnClick.bind(this)\n this.bind(['touchend', 'click'], this.btnClick)\n\n this.on(Events.PAUSE, () => {\n this.animate(player.paused)\n })\n this.on(Events.PLAY, () => {\n this.animate(player.paused)\n })\n this.animate(true)\n }\n\n registerIcons () {\n return {\n play: { icon: PlaySvg, class: 'xg-icon-play' },\n pause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n btnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { prop: 'paused', from: player.paused, to: !player.paused })\n if (player.ended) {\n player.replay()\n } else if (player.paused) {\n player.play()\n this.animate(false)\n } else {\n player.pause()\n this.animate(true)\n }\n return false\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.play)\n this.appendChild('.xgplayer-icon', icons.pause)\n }\n\n animate (paused) {\n const { i18nKeys } = this\n if (paused) {\n this.setAttr('data-state', 'pause')\n this.changeLangTextKey(this.find('.xg-tips'), i18nKeys.PLAY_TIPS)\n } else {\n this.setAttr('data-state', 'play')\n this.changeLangTextKey(this.find('.xg-tips'), i18nKeys.PAUSE_TIPS)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['touchend', 'click'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n
\n
\n
${this.i18n.PLAY_TIPS}
\n
`\n }\n}\nexport default Play\n","import Plugin, { POSITIONS, Util } from '../../plugin'\nimport BackSVG from '../assets/back.svg'\n\nexport default class TopBackIcon extends Plugin {\n static get pluginName () {\n return 'topbackicon'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT_TOP,\n index: 0\n }\n }\n\n afterCreate () {\n this.initIcons()\n this.onClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n this.config.onClick(e)\n }\n\n this.bind(['click', 'touchend'], this.onClick)\n }\n\n registerIcons () {\n return {\n screenBack: { icon: BackSVG, class: 'xg-fullscreen-back' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild(this.root, icons.screenBack)\n }\n\n show () {\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n render () {\n return `\n `\n }\n}\n","import { Events, POSITIONS, Sniffer, Util } from '../../plugin'\nimport IconPlugin from '../common/iconPlugin'\nimport TopBackIcon from './backicon'\nimport FullScreenSvg from '../assets/requestFull.svg'\nimport ExitFullScreenSvg from '../assets/exitFull.svg'\nimport './index.scss'\n\n/**\n * @typedef { {\n * position?: string,\n * index?: number,\n * useCssFullscreen?: boolean,\n * rotateFullscreen?: boolean,\n * switchCallback?: () => any,\n * target?: null | HTMLElement,\n * disable?: boolean,\n * needBackIcon?: boolean,\n * [propName: string]: any\n * } } IFullscreenConfig\n */\nexport default class Fullscreen extends IconPlugin {\n static get pluginName () {\n return 'fullscreen'\n }\n\n /**\n * @type IFullscreenConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 0,\n useCssFullscreen: false, // Whether to use the page full screen\n rotateFullscreen: false, // Whether to enable rotating full screen\n switchCallback: null, // Custom switch function\n target: null, // Trigger Dom element\n disable: false,\n needBackIcon: false // Whether to enable the return button in the upper left corner of the full screen exit\n }\n }\n\n /**\n * @private\n */\n afterCreate () {\n super.afterCreate()\n const { config, playerConfig } = this\n if (config.disable) {\n return\n }\n\n if (config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n const fullEl = Util.getFullScreenEl()\n\n if (playerConfig.fullscreenTarget === fullEl) {\n this.player.getFullscreen()\n }\n\n this.initIcons()\n\n this.handleFullscreen = this.hook('fullscreenChange', this.toggleFullScreen, {\n pre: (e) => {\n const { fullscreen } = this.player\n this.emitUserAction(e, 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n }\n })\n\n this.bind('.xgplayer-fullscreen', ['touchend', 'click'], this.handleFullscreen)\n\n this.on(Events.FULLSCREEN_CHANGE, (isFullScreen) => {\n this.changeLangTextKey(this.find('.xg-tips'), isFullScreen ? this.i18nKeys.EXITFULLSCREEN_TIPS : this.i18nKeys.FULLSCREEN_TIPS)\n this.animate(isFullScreen)\n })\n if (this.config.needBackIcon) {\n this.topBackIcon = this.player.registerPlugin({\n plugin: TopBackIcon,\n options: {\n config: {\n onClick: (e) => {\n this.handleFullscreen(e)\n }\n }\n }\n })\n }\n if (Sniffer.device === 'mobile') {\n window.addEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n /**\n * @private\n */\n _onOrientationChange = (e) => {\n if (this.player.fullscreen && this.config.rotateFullscreen) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.player.setRotateDeg(0)\n } else {\n this.player.setRotateDeg(90)\n }\n }\n }\n\n /**\n * @private\n */\n registerIcons () {\n return {\n fullscreen: { icon: FullScreenSvg, class: 'xg-get-fullscreen' },\n exitFullscreen: { icon: ExitFullScreenSvg, class: 'xg-exit-fullscreen' }\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.handleFullscreen)\n if (Sniffer.device === 'mobile') {\n window.removeEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.fullscreen)\n this.appendChild('.xgplayer-icon', icons.exitFullscreen)\n }\n\n /**\n * 切换全屏\n * @param { Event } [e]\n */\n toggleFullScreen (e) {\n if (e) {\n e.preventDefault()\n e.stopPropagation()\n }\n const { player, config } = this\n const useCssFullscreen = config.useCssFullscreen === true || (typeof config.useCssFullscreen === 'function' && config.useCssFullscreen())\n if (useCssFullscreen) {\n if (player.fullscreen) {\n player.exitCssFullscreen()\n } else {\n player.getCssFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.rotateFullscreen) {\n if (player.fullscreen) {\n player.exitRotateFullscreen()\n } else {\n player.getRotateFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.switchCallback && typeof config.switchCallback === 'function') {\n config.switchCallback(player.fullscreen)\n } else {\n if (player.fullscreen) {\n player.exitFullscreen()\n } else {\n player.getFullscreen()\n }\n }\n }\n\n /**\n *\n * @param { boolean } isFullScreen\n */\n animate (isFullScreen) {\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n if (this.topBackIcon) {\n if (isFullScreen) {\n this.topBackIcon.show()\n this.hide()\n } else {\n this.topBackIcon.hide()\n this.show()\n }\n }\n }\n\n show () {\n super.show()\n }\n\n hide () {\n super.hide()\n }\n\n /**\n * @private\n * @returns\n */\n render () {\n if (this.config.disable) {\n return\n }\n const langKey = 'FULLSCREEN_TIPS'\n return `\n
\n
\n
${this.i18n[langKey]}
\n
`\n }\n}\n","import Plugin, { Util, Events, POSITIONS, STATES } from '../../plugin'\nimport './index.scss'\n\nclass Time extends Plugin {\n static get pluginName () {\n return 'time'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 2,\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.isActiving = false\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get currentTime () {\n return this.player.currentTime || 0\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n afterCreate () {\n const constrolsMode = this.player.controls.config.mode\n this.mode = constrolsMode === 'flex' ? 'flex' : 'normal'\n if (this.config.disable) {\n return\n }\n if (this.mode === 'flex') {\n this.createCenterTime()\n this.hide()\n }\n this.durationDom = this.find('.time-duration')\n this.timeDom = this.find('.time-current')\n this.on(Events.DURATION_CHANGE, () => {\n this.onTimeUpdate()\n })\n this.on(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n }\n\n show () {\n if (this.mode === 'flex') {\n return\n }\n super.show()\n }\n\n onTimeUpdate () {\n const { player, config } = this\n if (config.disable || this.isActiving || (player.state < STATES.RUNNING && player.state !== STATES.ATTACHED)) {\n return\n }\n const current = this.currentTime + this.timeOffset\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = Util.format(current)\n if (this.duration !== Infinity && this.duration > 0) {\n this.centerDurDom.innerHTML = Util.format(this.duration)\n }\n } else {\n this.timeDom.innerHTML = Util.format(current)\n if (this.duration !== Infinity && this.duration > 0) {\n this.durationDom.innerHTML = Util.format(this.duration)\n }\n }\n }\n\n onReset () {\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = Util.format(0)\n this.centerDurDom.innerHTML = Util.format(0)\n } else {\n this.timeDom.innerHTML = Util.format(0)\n this.durationDom.innerHTML = Util.format(0)\n }\n }\n\n createCenterTime () {\n const { player } = this\n if (!player.controls || !player.controls.center) {\n return\n }\n const center = player.controls.center\n this.centerCurDom = Util.createDom('xg-icon', '00:00', {}, 'xgplayer-time left')\n this.centerDurDom = Util.createDom('xg-icon', '00:00', {}, 'xgplayer-time right')\n center.children.length > 0 ? center.insertBefore(this.centerCurDom, center.children[0]) : center.appendChild(this.centerCurDom)\n center.appendChild(this.centerDurDom)\n }\n\n afterPlayerInit () {\n const { config } = this\n if (this.duration === Infinity || this.playerConfig.isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n }\n if (config.hide) {\n this.hide()\n return\n }\n this.show()\n }\n\n changeLiveState (isLive) {\n if (isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n Util.show(this.find('.time-separator'))\n Util.show(this.durationDom)\n Util.show(this.timeDom)\n }\n }\n\n updateTime (time) {\n this.isActiving = true\n if ((!time && time !== 0) || time > this.duration) {\n return\n }\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = Util.format(time)\n return\n }\n this.timeDom.innerHTML = Util.format(time)\n }\n\n resetActive () {\n const { player } = this\n const updateState = () => {\n this.isActiving = false\n }\n this.off(Events.SEEKED, updateState)\n if (player.isSeeking) {\n this.once(Events.SEEKED, updateState)\n } else {\n this.isActiving = false\n }\n }\n\n destroy () {\n const { center } = this.player.controls\n this.centerCurDom && center.removeChild(this.centerCurDom)\n this.centerCurDom = null\n this.centerDurDom && center.removeChild(this.centerDurDom)\n this.centerDurDom = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n 00:00\n /\n 00:00\n ${this.i18n.LIVE_TIP}\n `\n }\n}\nexport default Time\n","import Plugin, { Util, Events, Sniffer, POSITIONS } from '../../plugin'\nimport volumeLargeSvg from '../assets/volumeLarge.svg'\nimport volumeSmallSvg from '../assets/volumeSmall.svg'\nimport volumeMutedSvg from '../assets/volumeMuted.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string, // [可选]插件挂载的dom\n * index?: number // [可选]插件在播放器中挂载的位置\n * disable?: boolean, // [可选]是否禁用插件交互行为\n * showValueLabel?: boolean, // [可选]是否显示当前滑动的音量数值\n * default?: number // [可选]默认\n * [propName: string]: any\n * }} IVolumeConfig\n */\n\nclass Volume extends Plugin {\n static get pluginName () {\n return 'volume'\n }\n\n /**\n * @type IVolumeConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT, // [可选]插件挂载的dom\n index: 1, // [可选]插件在播放器中挂载的位置\n disable: false, // [可选]是否禁用插件交互行为\n showValueLabel: false, // [可选]是否显示当前滑动的音量数值\n default: 0.6, // [可选]默认音量\n miniVolume: 0.2 // 静音恢复的时候最小音量\n }\n }\n\n registerIcons () {\n return {\n volumeSmall: { icon: volumeSmallSvg, class: 'xg-volume-small' },\n volumeLarge: { icon: volumeLargeSvg, class: 'xg-volume' },\n volumeMuted: { icon: volumeMutedSvg, class: 'xg-volume-mute' }\n }\n }\n\n afterCreate () {\n this._timerId = null\n if (this.config.disable) {\n return\n }\n\n this.initIcons()\n\n const { commonStyle, volume } = this.playerConfig\n if (commonStyle.volumeColor) {\n this.find('.xgplayer-drag').style.backgroundColor = commonStyle.volumeColor\n }\n this.changeMutedHandler = this.hook('mutedChange', (e) => {\n this.changeMuted(e)\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this._onMouseenterHandler = this.hook('mouseenter', this.onMouseenter)\n this._onMouseleaveHandler = this.hook('mouseleave', this.onMouseleave)\n\n if (!(Sniffer.device === 'mobile') && this.playerConfig.isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this._onMouseenterHandler)\n\n this.bind(['blur', 'mouseleave'], this._onMouseleaveHandler)\n\n this.bind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.bind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.bind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n }\n\n this.bind('.xgplayer-icon', ['touchend', 'click'], this.changeMutedHandler)\n\n this.on(Events.VOLUME_CHANGE, this.onVolumeChange)\n this.once(Events.LOADED_DATA, this.onVolumeChange)\n\n if (Util.typeOf(volume) !== 'Number') {\n this.player.volume = this.config.default\n }\n\n this.onVolumeChange()\n }\n\n onBarMousedown = (e) => {\n const { player } = this\n const bar = this.find('.xgplayer-bar')\n Util.event(e)\n\n const barRect = bar.getBoundingClientRect()\n const pos = Util.getEventPos(e, player.zoom)\n const height = barRect.height - (pos.clientY - barRect.top)\n pos.h = height\n pos.barH = barRect.height\n this.pos = pos\n // 差值小于0,说明点击的不是音量滑块位置 不做响应\n if (height < -2) {\n return\n }\n this.updateVolumePos(height, e)\n document.addEventListener('mouseup', this.onBarMouseUp)\n this.isStart = true\n return false\n }\n\n onBarMouseMove = (e) => {\n if (!this.isStart) {\n return\n }\n const { pos, player } = this\n e.preventDefault()\n e.stopPropagation()\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n this.isMoving = true\n const w = pos.h - _ePos.clientY + pos.clientY\n if (w > pos.barH) {\n return\n }\n this.updateVolumePos(w, e)\n }\n\n onBarMouseUp = (e) => {\n Util.event(e)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n this.isStart = false\n this.isMoving = false\n }\n\n updateVolumePos (height, event) {\n const { player } = this\n const drag = this.find('.xgplayer-drag')\n const bar = this.find('.xgplayer-bar')\n if (!bar || !drag) {\n return\n }\n const now = parseInt(height / bar.getBoundingClientRect().height * 1000, 10)\n drag.style.height = `${height}px`\n const to = Math.max(Math.min(now / 1000, 1), 0)\n const props = {\n volume: {\n from: player.volume,\n to\n }\n }\n if (player.muted) {\n props.muted = {\n from: true,\n to: false\n }\n }\n this.emitUserAction(event, 'change_volume', { muted: player.muted, volume: player.volume, props })\n player.volume = Math.max(Math.min(now / 1000, 1), 0)\n player.muted && (player.muted = false)\n\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n\n /**\n * 修改音量数值标签\n *\n * @memberof Volume\n */\n updateVolumeValue () {\n const { volume, muted } = this.player\n const $labelValue = this.find('.xgplayer-value-label')\n const vol = Math.max(Math.min(volume, 1), 0)\n\n $labelValue.innerText = muted ? 0 : Math.ceil(vol * 100)\n }\n\n onMouseenter = (e) => {\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n Util.addClass(this.root, 'slide-show')\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n onMouseleave = (e) => {\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this._timerId = Util.setTimeout(this, () => {\n Util.removeClass(this.root, 'slide-show')\n this.isStart && this.onBarMouseUp(e)\n this._timerId = null\n }, 100)\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n changeMuted (e) {\n // e.preventDefault()\n e && e.stopPropagation()\n const { player } = this\n // 取消bar的状态\n this.isStart && this.onBarMouseUp(e)\n this.emitUserAction(e, 'change_muted', {\n muted: player.muted,\n volume: player.volume,\n props: {\n muted: {\n from: player.muted,\n to: !player.muted\n }\n }\n })\n if (player.volume > 0) {\n player.muted = !player.muted\n }\n if (player.volume < 0.01) {\n player.volume = this.config.miniVolume\n }\n }\n\n onVolumeChange = (e) => {\n if (!this.player) {\n return\n }\n const { muted, volume } = this.player\n if (!this.isMoving) {\n this.find('.xgplayer-drag').style.height = muted || volume === 0 ? '4px' : `${volume * 100}%`\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n this.animate(muted, volume)\n }\n\n animate (muted, volume) {\n if (muted || volume === 0) {\n this.setAttr('data-state', 'mute')\n } else if (volume < 0.5 && this.icons.volumeSmall) {\n this.setAttr('data-state', 'small')\n } else {\n this.setAttr('data-state', 'normal')\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.volumeSmall)\n this.appendChild('.xgplayer-icon', icons.volumeLarge)\n this.appendChild('.xgplayer-icon', icons.volumeMuted)\n }\n\n destroy () {\n this.unbind('mouseenter', this.onMouseenter)\n\n this.unbind(['blur', 'mouseleave'], this.onMouseleave)\n\n this.unbind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.unbind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.unbind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.changeMutedHandler)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const volume = this.config.default || this.player.volume\n const isShowVolumeValue = this.config.showValueLabel\n return `\n \n
\n
\n \n ${isShowVolumeValue ? `
${volume * 100}
` : ''}\n
\n \n
\n
\n
`\n }\n}\nexport default Volume\n","import { POSITIONS, Util } from '../../plugin'\nimport IconPlugin from '../common/iconPlugin'\nimport { Events } from '../../plugin/basePlugin'\nimport RotateSvg from '../assets/rotate.svg'\nimport './index.scss'\n\nexport default class Rotate extends IconPlugin {\n static get pluginName () {\n return 'rotate'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n innerRotate: true, // true为只有画面旋转,false为整个播放器旋转\n clockwise: false,\n rotateDeg: 0, // 初始旋转角度\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.rotateDeg = this.config.rotateDeg || 0\n }\n\n afterCreate () {\n if (this.config.disable) {\n return\n }\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.rotate)\n this.onBtnClick = this.onBtnClick.bind(this)\n this.bind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n // 全屏/css全屏/容器宽高发生变化 需要重新计算\n this.on(Events.VIDEO_RESIZE, () => {\n // console.log('Events.VIDEO_RESIZE')\n if (this.rotateDeg) {\n Util.setTimeout(this, () => {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }, 100)\n }\n })\n if (this.rotateDeg) {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n }\n\n onBtnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'rotate')\n this.rotate(this.config.clockwise, this.config.innerRotate, 1)\n }\n\n updateRotateDeg (rotateDeg, innerRotate) {\n const player = this.player\n if (!rotateDeg) {\n rotateDeg = 0\n }\n const { root, innerContainer, video } = this.player\n const width = root.offsetWidth\n const height = innerContainer && innerRotate ? innerContainer.offsetHeight : root.offsetHeight\n let rWidth = '100%'\n let rHeight = '100%'\n let x = 0\n let y = 0\n if (rotateDeg === 0.75 || rotateDeg === 0.25) {\n rWidth = `${height}px`\n rHeight = `${width}px`\n x = -(height - width) / 2\n y = -(width - height) / 2\n }\n const _transform = `translate(${x}px,${y}px) rotate(${rotateDeg}turn)`\n const _styles = {\n transformOrigin: 'center center',\n transform: _transform,\n webKitTransform: _transform,\n height: rHeight,\n width: rWidth\n }\n\n const _target = innerRotate ? video : root\n const poster = innerRotate ? player.getPlugin('poster') : null\n Object.keys(_styles).map(key => {\n _target.style[key] = _styles[key]\n poster && poster.root && (poster.root.style[key] = _styles[key])\n })\n }\n\n rotate (clockwise = false, innerRotate = true, times = 1) {\n const player = this.player\n if (!this.rotateDeg) {\n this.rotateDeg = 0\n }\n const factor = clockwise ? 1 : -1\n\n this.rotateDeg = (this.rotateDeg + 1 + factor * 0.25 * times) % 1\n this.updateRotateDeg(this.rotateDeg, innerRotate)\n player.emit(Events.ROTATE, this.rotateDeg * 360)\n }\n\n registerIcons () {\n return {\n rotate: RotateSvg\n }\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n \n
\n
\n
\n ${this.i18n.ROTATE_TIPS}\n
\n
`\n }\n}\n","import { Events, Util, POSITIONS } from '../../plugin'\nimport IconPlugin from '../common/iconPlugin'\nimport PipIcon from '../assets/pipIcon.svg'\nimport PipIconExit from '../assets/pipIconExit.svg'\nimport './index.scss'\n\n/**\n * @description picture-in-picture plugin\n * @doc https://www.w3.org/TR/picture-in-picture/\n * @doc https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n */\n\nconst PresentationMode = {\n PIP: 'picture-in-picture',\n INLINE: 'inline',\n FULLSCREEN: 'fullscreen'\n}\n\nclass PIP extends IconPlugin {\n static get pluginName () {\n return 'pip'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n showIcon: false\n }\n }\n\n static checkWebkitSetPresentationMode (video) {\n return typeof video.webkitSetPresentationMode === 'function'\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.pip === 'boolean') {\n args.config.showIcon = args.player.config.pip\n }\n }\n\n afterCreate () {\n // 非可用状态不做初始化\n if (!this.isPIPAvailable()) {\n return\n }\n super.afterCreate()\n this.pMode = PresentationMode.INLINE\n this.initPipEvents()\n // 确认开启按钮的情况下才初始化按钮\n if (this.config.showIcon) {\n this.initIcons()\n }\n // video初始化之后再做判断是否显示\n this.once(Events.COMPLETE, () => {\n if (this.config.showIcon) {\n Util.removeClass(this.find('.xgplayer-icon'), 'xg-icon-disable')\n this.bind('click', this.switchPIP)\n }\n })\n }\n\n registerIcons () {\n return {\n pipIcon: { icon: PipIcon, class: 'xg-get-pip' },\n pipIconExit: { icon: PipIconExit, class: 'xg-exit-pip' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.pipIcon)\n this.appendChild('.xgplayer-icon', icons.pipIconExit)\n }\n\n initPipEvents () {\n const { player } = this\n this.leavePIPCallback = () => {\n // 处理点击x关闭画中画的时候暂停问题\n const paused = player.paused\n Util.setTimeout(this, () => {\n // 使用videoPlay避免多次触发 playhooks\n !paused && player.videoPlay()\n }, 0)\n !paused && player.videoPlay()\n this.setAttr('data-state', 'normal')\n player.emit(Events.PIP_CHANGE, false)\n }\n\n this.enterPIPCallback = (e) => {\n player.emit(Events.PIP_CHANGE, true)\n this.pipWindow = e.pictureInPictureWindow\n this.setAttr('data-state', 'pip')\n }\n\n this.onWebkitpresentationmodechanged = (e) => {\n const mode = player.video.webkitPresentationMode\n // 如果在全屏下进入了该逻辑,调用退出全屏处理\n if (this.pMode === PresentationMode.FULLSCREEN && mode !== PresentationMode.FULLSCREEN) {\n player.onFullscreenChange(null, false)\n }\n this.pMode = mode\n if (mode === PresentationMode.PIP) {\n this.enterPIPCallback(e)\n } else if (mode === PresentationMode.INLINE) {\n this.leavePIPCallback(e)\n }\n }\n\n if (player.video) {\n player.video.addEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.video.addEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.video) && player.video.addEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n }\n }\n\n switchPIP = (e) => {\n if (!this.isPIPAvailable()) {\n return false\n }\n e.stopPropagation()\n if (this.isPip) {\n this.exitPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: true, to: false })\n this.setAttr('data-state', 'normal')\n } else if (this.player.video.readyState === 4) {\n this.requestPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: false, to: true })\n this.setAttr('data-state', 'pip')\n }\n }\n\n /*\n * 进入画中画\n */\n requestPIP () {\n const { player, playerConfig } = this\n if (!this.isPIPAvailable() || this.isPip) {\n return\n }\n try {\n const { poster } = playerConfig\n if (poster) {\n player.video.poster = Util.typeOf(poster) === 'String' ? poster : poster.poster\n }\n PIP.checkWebkitSetPresentationMode(player.video) ? player.video.webkitSetPresentationMode('picture-in-picture') : player.video.requestPictureInPicture()\n return true\n } catch (reason) {\n console.error('requestPiP', reason)\n return false\n }\n }\n\n /**\n * 退出画中画\n */\n exitPIP () {\n const { player } = this\n try {\n if (this.isPIPAvailable() && this.isPip) {\n PIP.checkWebkitSetPresentationMode(player.video) ? player.video.webkitSetPresentationMode('inline') : document.exitPictureInPicture()\n }\n return true\n } catch (reason) {\n console.error('exitPIP', reason)\n return false\n }\n }\n\n get isPip () {\n const { player } = this\n return (document.pictureInPictureElement && document.pictureInPictureElement === player.video) || player.video.webkitPresentationMode === PresentationMode.PIP\n }\n\n isPIPAvailable () {\n const { video } = this.player\n const _isEnabled = Util.typeOf(document.pictureInPictureEnabled) === 'Boolean' ? document.pictureInPictureEnabled : true\n return _isEnabled &&\n ((Util.typeOf(video.disablePictureInPicture) === 'Boolean' && !video.disablePictureInPicture) ||\n (video.webkitSupportsPresentationMode && Util.typeOf(video.webkitSetPresentationMode) === 'Function'))\n }\n\n destroy () {\n super.destroy()\n const { player } = this\n player.video.removeEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.video.removeEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.video) && player.video.removeEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n this.exitPIP()\n this.unbind('click', this.btnClick)\n }\n\n render () {\n if (!this.config.showIcon || !this.isPIPAvailable()) {\n return\n }\n return `\n
\n
\n
${this.i18n.PIP}
\n
`\n }\n}\nexport default PIP\n","/**\n * 下一个按钮组件\n */\nimport Plugin, { POSITIONS, Sniffer, Events } from '../../plugin'\nimport Next from '../assets/playNext.svg'\nimport './index.scss'\n\nexport default class PlayNextIcon extends Plugin {\n static get pluginName () {\n return 'playNext'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 1,\n url: null,\n urlList: []\n }\n }\n\n constructor (options) {\n super(options)\n this.idx = -1\n }\n\n afterCreate () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.playNext)\n this.initEvents()\n }\n\n registerIcons () {\n return {\n playNext: Next\n }\n }\n\n initEvents () {\n this.nextHandler = this.hook('nextClick', this.changeSrc)\n const event = Sniffer.device === 'mobile' ? 'touchend' : 'click'\n this.bind(event, this.playNext)\n this.show()\n }\n\n playNext = (e) => {\n const { player } = this\n e.preventDefault()\n e.stopPropagation()\n if (this.idx + 1 < this.config.urlList.length) {\n this.idx++\n this.nextHandler(this.config.urlList[this.idx], this.idx)\n player.emit(Events.PLAYNEXT, this.idx + 1)\n } else {\n this.nextHandler()\n player.emit(Events.PLAYNEXT)\n }\n }\n\n changeSrc (url) {\n const { player } = this\n if (!url) {\n return\n }\n player.pause()\n player.currentTime = 0\n if (player.switchURL) {\n player.switchURL(url)\n } else {\n player.src = url\n }\n player.config.url = url\n player.play()\n }\n\n destroy () {\n this.unbind(['touchend', 'click'], this.playNext)\n }\n\n render () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n return `\n \n
\n
\n
${this.i18n.PLAYNEXT_TIPS}
\n
\n `\n }\n}\n","//download.js v4.2, by dandavis; 2008-2016. [MIT] see http://danml.com/download.html for tests/usage\n// v1 landed a FF+Chrome compat way of downloading strings to local un-named files, upgraded to use a hidden frame and optional mime\n// v2 added named files via a[download], msSaveBlob, IE (10+) support, and window.URL support for larger+faster saves than dataURLs\n// v3 added dataURL and Blob Input, bind-toggle arity, and legacy dataURL fallback was improved with force-download mime and base64 support. 3.1 improved safari handling.\n// v4 adds AMD/UMD, commonJS, and plain browser support\n// v4.1 adds url download capability via solo URL argument (same domain/CORS only)\n// v4.2 adds semantic variable names, long (over 2MB) dataURL support, and hidden by default temp anchors\n// https://github.com/rndme/download\n\n(function (root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([], factory);\n\t} else if (typeof exports === 'object') {\n\t\t// Node. Does not work with strict CommonJS, but\n\t\t// only CommonJS-like environments that support module.exports,\n\t\t// like Node.\n\t\tmodule.exports = factory();\n\t} else {\n\t\t// Browser globals (root is window)\n\t\troot.download = factory();\n }\n}(this, function () {\n\n\treturn function download(data, strFileName, strMimeType) {\n\n\t\tvar self = window, // this script is only for browsers anyway...\n\t\t\tdefaultMime = \"application/octet-stream\", // this default mime also triggers iframe downloads\n\t\t\tmimeType = strMimeType || defaultMime,\n\t\t\tpayload = data,\n\t\t\turl = !strFileName && !strMimeType && payload,\n\t\t\tanchor = document.createElement(\"a\"),\n\t\t\ttoString = function(a){return String(a);},\n\t\t\tmyBlob = (self.Blob || self.MozBlob || self.WebKitBlob || toString),\n\t\t\tfileName = strFileName || \"download\",\n\t\t\tblob,\n\t\t\treader;\n\t\t\tmyBlob= myBlob.call ? myBlob.bind(self) : Blob ;\n\t \n\t\tif(String(this)===\"true\"){ //reverse arguments, allowing download.bind(true, \"text/xml\", \"export.xml\") to act as a callback\n\t\t\tpayload=[payload, mimeType];\n\t\t\tmimeType=payload[0];\n\t\t\tpayload=payload[1];\n\t\t}\n\n\n\t\tif(url && url.length< 2048){ // if no filename and no mime, assume a url was passed as the only argument\n\t\t\tfileName = url.split(\"/\").pop().split(\"?\")[0];\n\t\t\tanchor.href = url; // assign href prop to temp anchor\n\t\t \tif(anchor.href.indexOf(url) !== -1){ // if the browser determines that it's a potentially valid url path:\n \t\tvar ajax=new XMLHttpRequest();\n \t\tajax.open( \"GET\", url, true);\n \t\tajax.responseType = 'blob';\n \t\tajax.onload= function(e){ \n\t\t\t\t download(e.target.response, fileName, defaultMime);\n\t\t\t\t};\n \t\tsetTimeout(function(){ ajax.send();}, 0); // allows setting custom ajax headers using the return:\n\t\t\t return ajax;\n\t\t\t} // end if valid url?\n\t\t} // end if url?\n\n\n\t\t//go ahead and download dataURLs right away\n\t\tif(/^data:([\\w+-]+\\/[\\w+.-]+)?[,;]/.test(payload)){\n\t\t\n\t\t\tif(payload.length > (1024*1024*1.999) && myBlob !== toString ){\n\t\t\t\tpayload=dataUrlToBlob(payload);\n\t\t\t\tmimeType=payload.type || defaultMime;\n\t\t\t}else{\t\t\t\n\t\t\t\treturn navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs:\n\t\t\t\t\tnavigator.msSaveBlob(dataUrlToBlob(payload), fileName) :\n\t\t\t\t\tsaver(payload) ; // everyone else can save dataURLs un-processed\n\t\t\t}\n\t\t\t\n\t\t}else{//not data url, is it a string with special needs?\n\t\t\tif(/([\\x80-\\xff])/.test(payload)){\t\t\t \n\t\t\t\tvar i=0, tempUiArr= new Uint8Array(payload.length), mx=tempUiArr.length;\n\t\t\t\tfor(i;i {\n if (this.isLock) {\n return\n }\n this.emitUserAction(e, 'download')\n const url = this.getAbsoluteURL(this.player.src)\n downloadUtil(url)\n this.isLock = true\n this.timer = window.setTimeout(() => {\n this.isLock = false\n window.clearTimeout(this.timer)\n this.timer = null\n }, 300)\n }\n\n getAbsoluteURL (url) {\n // Check if absolute URL\n if (!url.match(/^https?:\\/\\//)) {\n const div = document.createElement('div')\n div.innerHTML = `x`\n url = div.firstChild.href\n }\n return url\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.download)\n window.clearTimeout(this.timer)\n this.timer = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n
\n
\n
${this.i18n.DOWNLOAD_TIPS}
\n
`\n }\n}\n","import { POSITIONS, Events } from '../../plugin'\nimport IconPlugin from '../common/iconPlugin'\nimport './index.scss'\n\nexport default class ScreenShot extends IconPlugin {\n static get pluginName () {\n return 'screenShot'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 5,\n quality: 0.92,\n type: 'image/png',\n format: '.png',\n width: 600,\n height: 337,\n fitVideo: true,\n disable: false,\n name: 'screenshot'\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.screenShot === 'boolean') {\n args.config.disable = !args.player.config.screenShot\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.screenshotIcon)\n const { config } = this\n this.initSize = (data) => {\n if (config.fitVideo) {\n config.width = data.vWidth\n config.height = data.vHeight\n }\n }\n this.once(Events.VIDEO_RESIZE, this.initSize)\n }\n\n onPluginsReady () {\n this.show()\n this.onClickBtn = this.onClickBtn.bind(this)\n this.bind(['click', 'touchend'], this.onClickBtn)\n }\n\n saveScreenShot (data, filename) {\n const saveLink = document.createElement('a')\n saveLink.href = data\n saveLink.download = filename\n const event = document.createEvent('MouseEvents')\n event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)\n saveLink.dispatchEvent(event)\n }\n\n createCanvans (width, height) {\n const canvas = document.createElement('canvas')\n this.canvasCtx = canvas.getContext('2d')\n this.canvas = canvas\n canvas.width = width || this.config.width\n canvas.height = height || this.config.height\n }\n\n onClickBtn (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'shot')\n this.shot().then((data) => {\n this.emit(Events.SCREEN_SHOT, data)\n this.saveScreenShot(data, this.config.name + this.config.format)\n })\n }\n\n shot (width, height, option = { quality: 0.92, type: 'image/png' }) {\n const { config, player } = this\n const quality = option.quality || config.quality\n const type = option.type || config.type\n return new Promise((resolve, reject) => {\n let canvas = null\n if (player.video.canvas) {\n canvas = player.video.canvas\n } else {\n if (!this.canvas) {\n this.createCanvans(width, height)\n } else {\n this.canvas.width = width || config.width\n this.canvas.height = height || config.height\n }\n this.canvasCtx.drawImage(player.video, 0, 0, width || config.width, height || config.height)\n canvas = this.canvas\n }\n let src = canvas.toDataURL(type, quality).replace(type, 'image/octet-stream')\n src = src.replace(/^data:image\\/[^;]+/, 'data:application/octet-stream')\n resolve(src)\n })\n }\n\n registerIcons () {\n return {\n screenshotIcon: null\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.onClickBtn)\n this.off(Events.VIDEO_RESIZE, this.initSize)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const className = this.icons.screenshotIcon ? 'xgplayer-icon' : 'xgplayer-icon btn-text'\n const langKey = 'SCREENSHOT'\n return `\n \n
\n ${this.icons.screenshotIcon ? '' : `${this.i18n[langKey]}`} \n
\n
`\n }\n}\n","import Plugin, { Util, Sniffer } from '../../plugin'\n\nexport default class OptionList {\n constructor (args) {\n this.config = args.config\n this.parent = args.root\n this.root = Util.createDom('ul', '', {}, `xg-options-list ${this.config.className}`)\n args.root.appendChild(this.root)\n this.onItemClick = this.onItemClick.bind(this)\n this.renderItemList()\n const eventName = Sniffer.device === 'mobile' ? 'touchend' : 'click'\n this._delegates = Plugin.delegate.call(this, this.root, 'li', eventName, this.onItemClick)\n }\n\n renderItemList (data) {\n const { config, root } = this\n if (data) {\n config.data = data\n } else {\n data = config.data\n }\n\n if (config.style) {\n Object.keys(config.style).map(key => {\n root.style[key] = config[key]\n })\n }\n\n if (data.length > 0) {\n this.attrKeys = Object.keys(data[0])\n }\n\n this.root.innerHTML = ''\n\n data.map((item, index) => {\n const className = item.selected ? 'option-item selected' : 'option-item'\n item['data-index'] = index\n this.root.appendChild(Util.createDom('li', `${item.showText}`, item, className))\n })\n }\n\n onItemClick (e) {\n if (!e.delegateTarget) {\n e.delegateTarget = e.target\n }\n const target = e.delegateTarget\n if (target && Util.hasClass(target, 'selected')) {\n return false\n }\n const changeCallback = typeof this.config.onItemClick === 'function' ? this.config.onItemClick : null\n const curSelected = this.root.querySelector('.selected')\n Util.addClass(target, 'selected')\n curSelected && Util.removeClass(curSelected, 'selected')\n changeCallback(e, {\n from: curSelected ? this.getAttrObj(curSelected, this.attrKeys) : null,\n to: this.getAttrObj(target, this.attrKeys)\n })\n }\n\n getAttrObj (dom, keys) {\n if (!dom || !keys) {\n return {}\n }\n const obj = {}\n keys.map(key => {\n obj[key] = dom.getAttribute(key)\n })\n const index = dom.getAttribute('data-index')\n if (index) {\n obj.index = Number(index)\n }\n return obj\n }\n\n show () {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'active')\n }\n\n hide () {\n Util.removeClass(this.root, 'active')\n Util.addClass(this.root, 'hide')\n }\n\n destroy () {\n if (this._delegates) {\n this._delegates.map(item => {\n item.destroy && item.destroy()\n })\n this._delegates = null\n }\n this.root.innerHTML = null\n this.parent.removeChild(this.root)\n this.root = null\n }\n}\n","\nimport Plugin, { Events, Util, Sniffer, POSITIONS } from '../../plugin'\nimport OptionList from './optionList'\nimport './optionsIcon.scss'\n\n/**\n * @typedef {{\n * isShow?: boolean,\n * index?: number,\n * list?: Array,\n * listType?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IOptionsIconConfig\n */\n\nconst IS_MOBILE = Sniffer.device === 'mobile'\nexport default class OptionsIcon extends Plugin {\n static get pluginName () {\n return 'optionsIcon'\n }\n\n /**\n * @type { IOptionsIconConfig }\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 100,\n list: [],\n listType: 'middle', // 模式 rightSide-右侧边栏 middle-中间显示\n listStyle: {},\n hidePortrait: true,\n isShowIcon: false\n }\n }\n\n constructor (args) {\n super(args)\n this.isIcons = false\n this.isActive = false\n this.curValue = null // 当前值\n this.curIndex = 0\n }\n\n updateLang (value) {\n this.renderItemList(this.config.list, this.curIndex)\n }\n\n afterCreate () {\n const { config } = this\n this.initIcons()\n if (IS_MOBILE && config.listType !== 'middle') {\n config.listType = 'rightSide'\n }\n\n config.hidePortrait && Util.addClass(this.root, 'portrait')\n\n this.once(Events.CANPLAY, () => {\n if (config.list && config.list.length > 0) {\n this.renderItemList(config.list)\n this.show()\n }\n })\n // 移动端控制栏和列表互斥\n IS_MOBILE && this.on(Events.PLAYER_FOCUS, () => {\n if (!this.isActive) {\n return\n }\n this.optionsList && this.optionsList.hide()\n this.isActive = false\n })\n this.activeEvent = IS_MOBILE ? 'touchend' : 'mouseenter'\n this.bind(this.activeEvent, this.onEnter)\n this.bind('mouseleave', this.onLeave)\n this.isIcons && this.bind('click', this.onIconClick)\n }\n\n initIcons () {\n const { icons } = this\n const _c = Object.keys(icons)\n let _isIcons = false\n if (_c.length > 0) {\n _c.forEach(key => {\n this.appendChild('.xgplayer-icon', icons[key])\n !_isIcons && (_isIcons = icons[key])\n })\n this.isIcons = _isIcons\n }\n if (_isIcons) {\n return\n }\n this.appendChild('.xgplayer-icon', Util.createDom('span', '', {}, 'icon-text'))\n Util.addClass(this.find('.xgplayer-icon'), 'btn-text')\n }\n\n show () {\n if (!this.config.list || this.config.list.length < 2) {\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n getTextByLang (item, key, lang) {\n if (item === undefined) {\n return ''\n }\n const { list } = this.config\n !lang && (lang = this.player.lang)\n key = (!key || Util.isUndefined(item[key])) ? 'text' : key\n typeof item === 'number' && (item = list[item])\n try {\n if (typeof item[key] === 'object') {\n return item[key][lang] || item[key].zh\n } else {\n return item[key]\n }\n } catch (err) {\n console.warn(err)\n return ''\n }\n }\n\n onEnter = (e) => {\n e.preventDefault()\n e.stopPropagation()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n this.onToggle(true)\n }\n\n onLeave = (e) => {\n e.preventDefault()\n e.stopPropagation()\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n this.isActive && this.onToggle(false)\n }\n\n // 状态切换\n onToggle (isActive) {\n if (isActive === this.isActive) return\n const { controls } = this.player\n const { listType } = this.config\n if (isActive) {\n listType === 'rightSide' ? controls.blur() : controls.focus()\n this.optionsList && this.optionsList.show()\n } else {\n listType === 'rightSide' ? controls.focus() : controls.focusAwhile()\n this.optionsList && this.optionsList.hide()\n }\n this.isActive = isActive\n }\n\n // 列表点击回调\n onItemClick (e, data) {\n e.preventDefault()\n e.stopPropagation()\n const { listType, list } = this.config;\n (IS_MOBILE || listType === 'rightSide') && this.onToggle(false)\n this.curIndex = data.to.index\n this.curItem = list[this.curIndex]\n this.changeCurrentText()\n this.onToggle(false)\n }\n\n onIconClick (e) {\n //\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n if (!curItem) return\n this.find('.icon-text').innerHTML = this.getTextByLang(curItem, 'iconText')\n }\n\n renderItemList (itemList, curIndex) {\n const { config, optionsList, player } = this\n if (typeof curIndex === 'number') {\n this.curIndex = curIndex\n this.curItem = config.list[curIndex]\n }\n\n if (optionsList) {\n optionsList.renderItemList(itemList)\n this.changeCurrentText()\n return\n }\n\n const options = {\n config: {\n data: itemList || [],\n className: config.listType === 'rightSide' ? 'right-side' : '',\n onItemClick: (e, data) => {\n this.onItemClick(e, data)\n }\n },\n root: config.listType === 'rightSide' ? player.root : this.root\n }\n\n if (this.config.isShowIcon) {\n this.optionsList = new OptionList(options)\n this.changeCurrentText()\n this.show()\n }\n }\n\n destroy () {\n this.unbind(this.activeEvent, this.onToggle)\n this.unbind('mouseleave', this.onToggle)\n if (this.optionsList) {\n this.optionsList.destroy()\n this.optionsList = null\n }\n }\n\n render () {\n if (!this.config.isShowIcon) {\n return\n }\n return `\n
\n
\n
`\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {{\n * text?: string,\n * definition?: any,\n * url: any,\n * text: string | {\n * [propName: string]: any\n * },\n * iconText: string | {\n * [propName: string]: any\n * }\n * }} IDefinition\n */\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array,\n * defaultDefinition?: any,\n * disable?: any,\n * hidePortrait?: boolean,\n * className?: string\n * }} IDefinitionConfig\n */\nexport default class DefinitionIcon extends OptionsIcon {\n static get pluginName () {\n return 'definition'\n }\n\n /**\n * @type IDefinitionConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n list: [],\n defaultDefinition: '',\n disable: false,\n hidePortrait: false, // Whether to hide in the vertical screen state of the mobile terminal\n className: 'xgplayer-definition',\n isShowIcon: true\n }\n }\n\n beforeCreate (args) {\n const { list } = args.config\n if (Array.isArray(list) && list.length > 0) {\n args.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n }\n }\n\n constructor (args) {\n super(args)\n // 记录切换的时候的播放器状态\n this.curTime = 0\n this.isPaused = true\n }\n\n afterCreate () {\n super.afterCreate()\n this.on('resourceReady', (list) => {\n this.changeDefinitionList(list)\n })\n\n this.on(Events.DEFINITION_CHANGE, (data) => {\n this.renderItemList(this.config.list, data.to)\n })\n if (this.player.definitionList.length < 2) {\n this.hide()\n }\n }\n\n initDefinition () {\n const { list, defaultDefinition } = this.config\n if (list.length > 0) {\n let to = null\n list.map(item => {\n if (item.definition === defaultDefinition) {\n to = item\n }\n })\n if (!to) {\n to = list[0]\n }\n this.changeDefinition(to)\n }\n }\n\n renderItemList (list = this.config.list || [], to) {\n const targetDef = to && to.definition ? to.definition : this.config.defaultDefinition\n if (to) {\n list.forEach((item) => {\n item.selected = false\n })\n }\n let curIndex = 0\n const items = list.map((item, index) => {\n const showItem = {\n url: item.url,\n definition: item.definition || '',\n showText: this.getTextByLang(item) || item.definition,\n selected: false\n }\n if (item.selected || (item.definition && item.definition === targetDef)) {\n showItem.selected = true\n curIndex = index\n }\n return showItem\n })\n super.renderItemList(items, curIndex)\n }\n\n // 对外暴露 切换清晰度\n changeDefinitionList (list) {\n if (!Array.isArray(list)) {\n return\n }\n this.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n this.renderItemList()\n this.config.list.length < 2 ? this.hide() : this.show()\n }\n\n changeDefinition (to, from) {\n this.player.changeDefinition(to, from)\n }\n\n onItemClick (e, data) {\n const { definitionList } = this.player\n super.onItemClick(...arguments)\n this.emitUserAction(e, 'change_definition', { from: data.from, to: data.to })\n for (let i = 0; i < definitionList.length; i++) {\n if (data.to && definitionList[i].definition === data.to.definition) {\n data.to.url = definitionList[i].url\n }\n\n if (data.from && (definitionList[i].definition === data.from.definition)) {\n data.from.url = definitionList[i].url\n }\n }\n this.player.changeDefinition(data.to, data.from)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array,\n * className?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IPlaybackRateConfig\n */\n\nexport default class PlaybackRate extends OptionsIcon {\n static get pluginName () {\n return 'playbackRate'\n }\n\n /**\n * @type IPlaybackRateConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 4,\n list: [2, 1.5, 1, 0.75, 0.5],\n className: 'xgplayer-playbackrate',\n isShowIcon: true,\n hidePortrait: false\n }\n }\n\n constructor (args) {\n super(args)\n this.curRate = 1\n }\n\n beforeCreate (args) {\n const { playbackRate } = args.player.config\n const list = !playbackRate ? [] : Array.isArray(playbackRate) ? playbackRate : args.config.list\n if (Array.isArray(list)) {\n args.config.list = list.map(item => {\n if (typeof item === 'number') {\n item = {\n rate: item,\n text: `${item}x`\n }\n } else if (!item.text && item.rate) {\n item.text = `${item.rate}x`\n }\n return item\n })\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.on(Events.RATE_CHANGE, () => {\n if (this.curValue === this.player.playbackRate) {\n return\n }\n this.renderItemList()\n })\n this.renderItemList()\n }\n\n show () {\n if (!this.config.list || this.config.list.length === 0) {\n return\n }\n super.show()\n }\n\n onItemClick (e, data) {\n super.onItemClick(...arguments)\n const target = e.delegateTarget\n const rate = Number(target.getAttribute('rate'))\n if (!rate || rate === this.curValue) {\n return false\n }\n const props = {\n playbackRate: {\n from: this.player.playbackRate,\n to: rate\n }\n }\n this.emitUserAction(e, 'change_rate', { props })\n this.curValue = rate\n this.player.playbackRate = rate\n }\n\n renderItemList () {\n const playbackRate = this.player.playbackRate || 1\n this.curValue = playbackRate\n let curIndex = 0\n const items = this.config.list.map((item, index) => {\n const itemInfo = {\n rate: item.rate\n }\n if (itemInfo.rate === playbackRate) {\n itemInfo.selected = true\n curIndex = index\n }\n itemInfo.showText = this.getTextByLang(item)\n return itemInfo\n })\n super.renderItemList(items, curIndex)\n }\n\n destroy () {\n super.destroy()\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport IconPlugin from '../common/iconPlugin'\nimport CssFullSceenSvg from '../assets/requestCssFull.svg'\nimport ExitCssFullSceenSvg from '../assets/exitCssFull.svg'\nimport './index.scss'\n\n/**\n * @typedef { {\n * position: string,\n * index: number,\n * disable: boolean,\n * target: null | HTMLElement,\n * [propName: string]: any\n * } } ICssConfig\n */\n\nexport default class CssFullScreen extends IconPlugin {\n static get pluginName () {\n return 'cssFullscreen'\n }\n\n /**\n * @type ICssConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 1,\n disable: false,\n target: null\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.cssFullscreen === 'boolean') {\n args.config.disable = !args.player.config.cssFullscreen\n }\n }\n\n afterCreate () {\n super.afterCreate()\n if (this.config.disable) {\n return\n }\n\n if (this.config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n this.initIcons()\n this.on(Events.CSS_FULLSCREEN_CHANGE, (isCssfullScreen) => {\n this.animate(isCssfullScreen)\n })\n this.btnClick = this.btnClick.bind(this)\n this.handleCssFullscreen = this.hook('cssFullscreen_change', this.btnClick, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this.handleCssFullscreen)\n }\n\n initIcons () {\n const { icons } = this\n const contentIcon = this.find('.xgplayer-icon')\n contentIcon.appendChild(icons.cssFullscreen)\n contentIcon.appendChild(icons.exitCssFullscreen)\n }\n\n btnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n const { isCssfullScreen } = this.player\n this.emitUserAction(e, 'switch_cssfullscreen', { cssfullscreen: isCssfullScreen })\n if (!isCssfullScreen) {\n this.player.getCssFullscreen()\n } else {\n this.player.exitCssFullscreen()\n }\n }\n\n animate (isFullScreen) {\n if (!this.root) {\n return\n }\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n this.switchTips(isFullScreen)\n }\n\n switchTips (isFullScreen) {\n const { i18nKeys } = this\n this.changeLangTextKey(this.find('.xg-tips'), isFullScreen ? i18nKeys.EXITCSSFULLSCREEN_TIPS : i18nKeys.CSSFULLSCREEN_TIPS)\n }\n\n registerIcons () {\n return {\n cssFullscreen: { icon: CssFullSceenSvg, class: 'xg-get-cssfull' },\n exitCssFullscreen: { icon: ExitCssFullSceenSvg, class: 'xg-exit-cssfull' }\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n
\n
\n
${this.i18n.CSSFULLSCREEN_TIPS}
\n
`\n }\n}\n","import Plugin, { Events, Util } from '../../plugin'\nimport './index.scss'\n\nexport default class ErrorPlugin extends Plugin {\n static get pluginName () {\n return 'error'\n }\n\n afterCreate () {\n this.clickHandler = this.hook('errorRetry', this.errorRetry, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.onError = this.hook('showError', this.handleError)\n\n this.bind('.xgplayer-error-refresh', 'click', this.clickHandler)\n this.on(Events.CANPLAY, () => {\n this.handleCanPlay()\n })\n\n this.on(Events.ERROR, (error) => {\n this.onError(error)\n })\n }\n\n errorRetry (e) {\n this.emitUserAction(e, 'error_retry', {})\n this.player.retry()\n }\n\n handleCanPlay () {\n Util.removeClass(this.player.root, 'xgplayer-is-error')\n }\n\n handleError (error = {}) {\n const { player } = this\n const type = error.errorType\n let errorNote = player.errorNote ? this.i18n[player.errorNote] : ''\n if (!errorNote) {\n switch (type) {\n case 'decoder':\n errorNote = this.i18n.MEDIA_ERR_DECODE\n break\n case 'network':\n errorNote = this.i18n.MEDIA_ERR_NETWORK\n break\n default:\n errorNote = this.i18n.MEDIA_ERR_SRC_NOT_SUPPORTED\n }\n }\n this.find('.xgplayer-error-text').innerHTML = errorNote\n this.find('.xgplayer-error-tips').innerHTML = `${this.i18n.REFRESH_TIPS}${this.i18n.REFRESH}`\n }\n\n destroy () {\n this.unbind('.xgplayer-error-refresh', 'click', this.clickHandler)\n }\n\n render () {\n return `\n
\n \n \n
\n
`\n }\n}\n","import Plugin, { STATE_CLASS, Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * 消息组件\n */\nclass Prompt extends Plugin {\n static get pluginName () {\n return 'prompt'\n }\n\n static get defaultConfig () {\n return {\n interval: 3000,\n style: {},\n mode: 'arrow',\n autoHide: true,\n detail: {\n text: '',\n highlight: ''\n },\n onClick: () => {\n }\n }\n }\n\n afterCreate () {\n this.intervalId = 0\n this.customConfig = null\n this.bind('.highlight', ['click', 'touchend'], (e) => {\n if (this.config.onClick || this.customOnClick) {\n e.preventDefault()\n e.stopPropagation()\n this.customOnClick ? this.customOnClick(e) : this.config.onClick(e)\n }\n })\n\n this.player.showPrompt = (...args) => {\n this.show(...args)\n }\n\n this.player.hidePrompt = () => {\n this.hide()\n }\n }\n\n setStyle (style) {\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n }\n\n show (detail, config = {}, onClick = () => {}) {\n if (!detail) {\n return\n }\n this.customOnClick = onClick\n const { interval } = this.config\n if (this.intervalId) {\n clearTimeout(this.intervalId)\n this.intervalId = null\n }\n Util.addClass(this.root, 'show')\n config.mode === 'arrow' && Util.addClass(this.root, 'arrow')\n if (typeof detail === 'string') {\n this.find('.xgplayer-prompt-detail').innerHTML = detail\n } else {\n this.find('.xgplayer-prompt-detail').innerHTML = `${detail.text || ''}` + `${detail.highlight ? `${detail.highlight}` : ''}`\n }\n\n config.style && this.setStyle(config.style)\n\n const autoHide = typeof config.autoHide === 'boolean' ? config.autoHide : this.config.autoHide\n if (autoHide) {\n const hideinterval = config.interval || interval\n this.intervalId = setTimeout(() => {\n this.hide()\n }, hideinterval)\n }\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n Util.removeClass(this.root, 'arrow')\n this.root.removeAttribute('style')\n this.customOnClick = null\n }\n\n render () {\n return `\n \n `\n }\n}\n\nexport default Prompt\n","import { Util, Events } from '../../plugin'\n\nconst ISPOT = {\n time: 0, // 进度条在此时间戳打点 单位为s\n text: '', // 打点处的自定义文案\n id: 1, // 标记唯一标识,用于删除的时候索引\n duration: 1, // 进度条标识点的时长 默认1s【可选】单位为s\n color: '#fff', // 进度条标识点的显示颜色【可选】\n style: {}, // 指定样式\n width: 6,\n height: 6\n}\n\nfunction mergeISPOT (iSpot) {\n Object.keys(ISPOT).map(key => {\n if (iSpot[key] === undefined) {\n iSpot[key] = ISPOT[key]\n }\n })\n}\n\nconst APIS = {\n initDots () {\n this._ispots.map(item => {\n this.createDot(item, false)\n })\n this._ispotsInit = true\n },\n /**\n * 创建一个故事点\n * @param { object } iSpot\n * @param { boolean } isNew\n */\n createDot (iSpot, isNew = true) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (isNew) {\n mergeISPOT(iSpot)\n this._ispots.push(iSpot)\n }\n if (!this._ispotsInit && isNew) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n let className = `xgspot_${iSpot.id} xgplayer-spot`\n ret.isMini && (className += ' mini')\n const dotDom = Util.createDom('xg-spot', iSpot.template || '', {\n 'data-text': iSpot.text,\n 'data-time': iSpot.time,\n 'data-id': iSpot.id\n }, className)\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n progress.outer && progress.outer.appendChild(dotDom)\n },\n\n /**\n * 根据id查找节点\n * @param {string} id\n */\n findDot (id) {\n if (!this.player.plugins.progress) {\n return\n }\n const ret = this._ispots.filter((cur, index) => {\n return cur.id === id\n })\n return ret.length > 0 ? ret[0] : null\n },\n\n /**\n * 更新故事点\n * @param {any} iSpot\n * @param {boolean} needShow\n */\n updateDot (iSpot, needShow = false) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const dot = this.findDot(iSpot.id)\n if (dot) {\n Object.keys(iSpot).map(key => {\n dot[key] = iSpot[key]\n })\n }\n if (!this._ispotsInit) {\n return\n }\n const dotDom = progress.find(`xg-spot[data-id=\"${iSpot.id}\"]`)\n if (!dotDom) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n dotDom.setAttribute('data-text', iSpot.text)\n dotDom.setAttribute('data-time', iSpot.time)\n if (ret.isMini) {\n Util.addClass(dotDom, 'mini')\n } else {\n Util.removeClass(dotDom, 'mini')\n }\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n if (needShow) {\n this.showDot(iSpot.id)\n }\n },\n\n /**\n * 删除某个故事点\n * @param {string | number } id\n */\n deleteDot (id) {\n const { _ispots } = this\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const del = []\n for (let i = 0; i < _ispots.length; i++) {\n if (_ispots[i].id === id) {\n del.push(i)\n }\n }\n const len = del.length\n for (let i = len - 1; i >= 0; i--) {\n _ispots.splice(del[i], 1)\n if (this._ispotsInit) {\n const dotDom = progress.find(`xg-spot[data-id=\"${id}\"]`)\n if (dotDom) {\n dotDom.parentElement.removeChild(dotDom)\n }\n }\n }\n },\n\n /**\n * 移除所有的故事点\n */\n deleteAllDots () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this._ispotsInit) {\n this._ispots = []\n return\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n for (let i = dotDoms.length - 1; i >= 0; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n this._ispots = []\n },\n /**\n * 批量全部更新当前故事点\n * @param {Array} iSpots\n */\n updateAllDots (iSpots = []) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this._ispotsInit) {\n this._ispots = iSpots\n return\n }\n this._ispots = []\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n const len = dotDoms.length\n if (len > iSpots.length) {\n for (let i = len - 1; i > iSpots.length - 1; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n }\n iSpots.map((ispot, index) => {\n if (index < len) {\n dotDoms[index].setAttribute('data-id', `${ispot.id}`)\n this._ispots.push(ispot)\n this.updateDot(ispot)\n } else {\n this.createDot(ispot)\n }\n })\n },\n\n getAllDotsDom () {\n const { progress } = this.player.plugins\n if (!progress) {\n return []\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n return dotDoms\n },\n\n getDotDom (id) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n return progress.find(`xg-spot[data-id=\"${id}\"]`)\n }\n}\n\nexport default function initDotsAPI (plugin) {\n const { config, player } = plugin\n Object.keys(APIS).map(item => {\n plugin[item] = APIS[item].bind(plugin)\n })\n const ispots = player.config.progressDot || config.ispots || []\n plugin._ispots = ispots.map(item => {\n mergeISPOT(item)\n return item\n })\n plugin._ispotsInit = false\n player.once(Events.DURATION_CHANGE, () => {\n plugin.initDots()\n })\n}\n","import Plugin, { Util, Sniffer } from '../../plugin'\nimport initDotsAPI from './dotsApi'\nimport './index.scss'\n\n/**\n * @typedef {{\n * miniWidth?: number, // 故事点显示最小宽度\n * ispots?: Array<{ //故事点列表\n * time?: number, // 进度条在此时间戳打点 单位为s\n * text?: string, // 打点处的自定义文案\n * id?: number | string, // 标记唯一标识,用于删除的时候索引\n * duration:? number, // 进度条标识点的时长 默认1s【可选】单位为s\n * color?: string, // 进度条标识点的显示颜色【可选】\n * style?: { [propName: string]: any }, // 指定样式\n * width?: number,\n * height?: number\n * }>,\n * defaultText?: '', // 故事点hover默认文案\n * isFocusDots?: true, //\n * isShowThumbnail?: true, // 是否显示预览图\n * isShowCoverPreview?: false, // 进度条拖动时是否显示播放区域预览图\n * mode?: 'short' | 'production', // short // production\n * [propName: string]: any\n * }} IProgressPreviewConfig\n */\n\nconst CALLBACK_MAP = {\n dragmove: 'onProgressMove',\n dragstart: 'onProgressDragStart',\n dragend: 'onProgressDragEnd',\n click: 'onProgressClick',\n mouseover: 'onProgressMouseOver'\n}\n\n/** */\nexport default class ProgressPreview extends Plugin {\n constructor (args) {\n super(args)\n this._ispots = []\n this.videoPreview = null\n this.videothumbnail = null\n this.thumbnail = null\n this.timeStr = ''\n this._state = {\n now: 0,\n f: false\n }\n }\n\n static get pluginName () {\n return 'progresspreview'\n }\n\n /**\n * @type IProgressPreviewConfig\n */\n static get defaultConfig () {\n return {\n index: 1,\n miniWidth: 6, // 故事点显示最小宽度\n ispots: [], // 故事点列表\n defaultText: '', // 故事点hover默认文案\n isFocusDots: true, //\n isShowThumbnail: true, // 是否显示预览图\n isShowCoverPreview: false, // 进度条拖动时是否显示播放区域预览图\n mode: '', // short // production\n disable: false\n }\n }\n\n beforeCreate (args) {\n const progress = args.player.plugins.progress\n if (progress) {\n args.root = progress.root\n }\n }\n\n afterCreate () {\n this._curDot = null\n this.handlerSpotClick = this.hook('spotClick', (_event, data) => {\n if (data.time) {\n this.player.seek(data.time)\n }\n })\n this.transformTimeHook = this.hook('transformTime', (time) => {\n this.setTimeContent(Util.format(time))\n })\n\n initDotsAPI(this)\n if (this.config.disable) {\n this.disable()\n }\n }\n\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n }\n\n onPluginsReady () {\n const { player } = this\n if (!player.plugins.progress) {\n return\n }\n this.previewLine = this.find('.xg-spot-line')\n this.timePoint = this.find('.xgplayer-progress-point')\n this.timeText = this.find('.xg-spot-time')\n this.tipText = this.find('.spot-inner-text')\n\n this._hasThumnail = false\n\n this.registerThumbnail()\n\n this.bindEvents()\n }\n\n bindEvents () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n Object.keys(CALLBACK_MAP).map(key => {\n this[CALLBACK_MAP[key]] = this[CALLBACK_MAP[key]].bind(this)\n progress.addCallBack(key, this[CALLBACK_MAP[key]])\n })\n\n if (Sniffer.device === 'mobile') return\n\n this.bind('.xg-spot-info', 'mousemove', this.onMousemove)\n\n this.bind('.xg-spot-info', 'mousedown', this.onMousedown)\n\n this.bind('.xg-spot-info', 'mouseup', this.onMouseup)\n\n const fun = this.hook('previewClick', (...args) => {\n // console.log('args', args)\n })\n\n this.handlerPreviewClick = (e) => {\n e.stopPropagation()\n fun(parseInt(this._state.now * 1000, 10) / 1000, e)\n }\n\n this.bind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n onMousemove = (e) => {\n if (this.config.disable) {\n return\n }\n if (this._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onMousedown = (e) => {\n if (this.config.disable) {\n return\n }\n if (this._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onMouseup = (e) => {\n if (!this.isDrag) {\n return\n }\n const { progress } = this.player.plugins\n if (progress && progress.pos) {\n progress.onMouseUp(e)\n !progress.pos.isEnter && progress.onMouseLeave(e)\n }\n }\n\n onDotMouseLeave = (e) => {\n if (this.config.disable) {\n return\n }\n this._curDot.removeEventListener('mouseleave', this.onDotMouseLeave)\n this.blurDot(e.target)\n this._curDot = null\n const { progress } = this.player.plugins\n progress && progress.enableBlur()\n this.show()\n }\n\n onProgressMouseOver = (data, e) => {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xgplayer-spot') && !this._curDot) {\n this._curDot = e.target\n this.focusDot(e.target)\n if (this._curDot.children.length > 0) {\n this.hide()\n }\n const { progress } = this.player.plugins\n progress && progress.disableBlur()\n this._curDot.addEventListener('mouseleave', this.onDotMouseLeave)\n }\n }\n\n onProgressMove (data, e) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.updatePosition(data.offset, data.width, data.currentTime, data.e)\n }\n\n onProgressDragStart (data) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.isDrag = true\n this.videoPreview && Util.addClass(this.videoPreview, 'show')\n }\n\n onProgressDragEnd (data) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.isDrag = false\n this.videoPreview && Util.removeClass(this.videoPreview, 'show')\n }\n\n onProgressClick (data, e) {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xgplayer-spot')) {\n e.stopPropagation()\n e.preventDefault()\n const data = {};\n ['time', 'id', 'text'].map(key => {\n data[key] = e.target.getAttribute(`data-${key}`)\n })\n data.time && (data.time = Number(data.time))\n this.handlerSpotClick(e, data)\n }\n }\n\n updateLinePos (offset, cwidth) {\n const { root, previewLine, timePoint, player } = this\n const { mode } = player.controls\n const isflex = mode === 'flex'\n const lwidth = root.getBoundingClientRect().width\n const tWidth = timePoint.getBoundingClientRect().width\n let x = offset - lwidth / 2\n let _t, _tt\n if (x < 0 && !isflex) {\n x = 0\n _t = offset - lwidth / 2\n !this.thumbnail && (_tt = offset - lwidth / 2 - tWidth / 2)\n } else if (x > cwidth - lwidth && !isflex) {\n _t = x - (cwidth - lwidth)\n !this.thumbnail && (_tt = x - (cwidth - lwidth) - tWidth / 2)\n x = cwidth - lwidth\n } else {\n // _t = 0\n !this.thumbnail && (_tt = -tWidth / 2)\n }\n _t !== undefined ? (previewLine.style.transform = `translateX(${_t}px)`) : (previewLine.style.transform = '')\n _tt !== undefined ? (timePoint.style.transform = `translateX(${_tt}px)`) : (timePoint.style.transform = '')\n root.style.transform = `translateX(${x}px)`\n }\n\n updateTimeText (timeStr) {\n const { timeText, timePoint } = this\n timeText.textContent = timeStr\n !this.thumbnail && (timePoint.textContent = timeStr)\n }\n\n /**\n * @param {number} offset\n * @param {number} cwidth\n * @param {number} time\n * @param {?MouseEvent} e\n */\n updatePosition (offset, cwidth, time, e) {\n const { root, config, _state } = this\n if (!root) {\n return\n }\n\n this.updateLinePos(offset, cwidth)\n // let now = offset / cwidth * player.duration\n // now = now < 0 ? 0 : (now > player.duration ? player.duration : now)\n _state.now = time\n this.transformTimeHook(time)\n const timeStr = this.timeStr\n if (e && e.target && Util.hasClass(e.target, 'xgplayer-spot')) {\n this.showTips(e.target.getAttribute('data-text'), false, timeStr)\n this.focusDot(e.target)\n _state.f = true\n config.isFocusDots && _state.f && (_state.now = parseInt(e.target.getAttribute('data-time'), 10))\n } else if (config.defaultText) {\n _state.f = false\n this.showTips(config.defaultText, true, timeStr)\n } else {\n _state.f = false\n this.hideTips('')\n // this.blurDot()\n }\n this.updateTimeText(timeStr)\n this.updateThumbnails(_state.now)\n }\n\n /**\n * @param {string} str\n */\n setTimeContent (str) {\n this.timeStr = str\n }\n\n updateThumbnails (time) {\n const { player, videoPreview } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, 160, 90)\n const rect = videoPreview && videoPreview.getBoundingClientRect()\n this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n changeThumbnail (thumbnailConfig = {}) {\n if (Sniffer.device === 'mobile') {\n return\n }\n const { player, config } = this\n const thumbnail = player.getPlugin('thumbnail')\n thumbnail.changeConfig(thumbnailConfig)\n\n if (!thumbnail || !thumbnail.usable || !config.isShowThumbnail) {\n Util.addClass(this.root, 'short-line no-thumbnail')\n const tRoot = this.find('.xg-spot-thumbnail')\n this.videoPreview && this.player.root.removeChild(this.videoPreview)\n this.thumbnail && tRoot.removeChild(this.thumbnail)\n this.videothumbnail = null\n this.thumbnail = null\n this._hasThumnail = false\n } else {\n Util.removeClass(this.root, 'short-line no-thumbnail')\n this._hasThumnail = true\n const tRoot = this.find('.xg-spot-thumbnail')\n this.videoPreview && this.player.root.removeChild(this.videoPreview)\n this.thumbnail && tRoot.removeChild(this.thumbnail)\n this.thumbnail = thumbnail.createThumbnail(tRoot, 'progress-thumbnail')\n if (config.isShowCoverPreview) {\n this.videoPreview = Util.createDom('xg-video-preview', '', {}, 'xgvideo-preview')\n player.root.appendChild(this.videoPreview)\n this.videothumbnail = thumbnail.createThumbnail(this.videoPreview, 'xgvideo-thumbnail')\n }\n }\n }\n\n registerThumbnail (thumbnailConfig = {}) {\n if (Sniffer.device === 'mobile') {\n return\n }\n const { player, config } = this\n const thumbnail = player.getPlugin('thumbnail')\n if (thumbnail) {\n thumbnail.setConfig(thumbnailConfig)\n }\n if (!thumbnail || !thumbnail.usable || !config.isShowThumbnail) {\n Util.addClass(this.root, 'short-line no-thumbnail')\n return\n } else {\n Util.removeClass(this.root, 'short-line no-thumbnail')\n }\n this._hasThumnail = true\n const tRoot = this.find('.xg-spot-thumbnail')\n this.thumbnail = thumbnail.createThumbnail(tRoot, 'progress-thumbnail')\n if (config.isShowCoverPreview) {\n this.videoPreview = Util.createDom('xg-video-preview', '', {}, 'xgvideo-preview')\n player.root.appendChild(this.videoPreview)\n this.videothumbnail = thumbnail.createThumbnail(this.videoPreview, 'xgvideo-thumbnail')\n }\n }\n\n calcuPosition (time, duration) {\n const { progress } = this.player.plugins\n const { player } = this\n const totalWidth = progress.root.getBoundingClientRect().width\n const widthPerSeconds = player.duration / totalWidth * 6\n const ret = {}\n if (time + duration > player.duration) {\n duration = player.duration - time\n }\n ret.left = time / player.duration * 100\n ret.width = duration / player.duration\n ret.isMini = widthPerSeconds > duration\n return {\n left: time / player.duration * 100,\n width: duration / player.duration * 100,\n isMini: duration < widthPerSeconds\n }\n }\n\n showDot (id) {\n const dot = this.findDot(id)\n if (dot) {\n const rect = this.root.getBoundingClientRect()\n const { width } = rect\n const offset = dot.time / this.player.duration * width\n this.updatePosition(offset, width, dot.time)\n }\n }\n\n focusDot (target, id) {\n if (!target) {\n return\n }\n if (!id) {\n id = target.getAttribute('data-id')\n }\n Util.addClass(target, 'active')\n this._activeDotId = id\n }\n\n blurDot (target) {\n if (!target) {\n const id = this._activeDotId\n target = this.getDotDom(id)\n }\n if (!target) {\n return\n }\n Util.removeClass(target, 'active')\n this._activeDotId = null\n }\n\n showTips (text, isDefault, timeStr = '') {\n Util.addClass(this.root, 'no-timepoint')\n if (!text) {\n return\n }\n Util.addClass(this.find('.xg-spot-content'), 'show-text')\n if (isDefault && this.config.mode === 'production') {\n Util.addClass(this.root, 'product')\n this.tipText.textContent = text\n } else {\n Util.removeClass(this.root, 'product')\n this.tipText.textContent = this._hasThumnail ? text : `${timeStr} ${text}`\n }\n }\n\n hideTips () {\n Util.removeClass(this.root, 'no-timepoint')\n this.tipText.textContent = ''\n Util.removeClass(this.find('.xg-spot-content'), 'show-text')\n Util.removeClass(this.root, 'product')\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n show () {\n Util.removeClass(this.root, 'hide')\n }\n\n enable () {\n const { config, playerConfig } = this\n this.config.disable = false\n this.show()\n if (!this.thumbnail && config.isShowThumbnail) {\n this.registerThumbnail(playerConfig.thumbnail || {})\n }\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n const { progress } = this.player.plugins\n progress && Object.keys(CALLBACK_MAP).map(key => {\n progress.removeCallBack(key, this[CALLBACK_MAP[key]])\n })\n this.videothumbnail = null\n this.thumbnail = null\n this.videoPreview && this.player.root.removeChild(this.videoPreview)\n this.unbind('.xg-spot-info', 'mousemove', this.onMousemove)\n this.unbind('.xg-spot-info', 'mousedown', this.onMousedown)\n this.unbind('.xg-spot-info', 'mouseup', this.onMouseup)\n this.unbind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n render () {\n if (Sniffer.device === 'mobile' || this.playerConfig.isMobileSimulateMode === 'mobile') {\n return ''\n }\n\n return `
\n
\n
\n \n
\n
\n
\n
00:00
\n
\n
`\n }\n}\n","/* eslint-disable camelcase */\nimport BasePlugin, { Events, Util } from '../../plugin'\n/**\n * @typedef {{\n * isShow?: boolean,\n * urls?: Array, // 有多张大图就多个url\n * pic_num?: number, // 每张图含有几个雪碧图\n * col?: number, // 截图列数\n * row?: number, // 截图行数\n * height?: number, // 缩略图高度\n * width?: number, // 缩略图宽度\n * scale?: number, // 缩放\n * className?: string, // 额外添加在dom上的class\n * hidePortrait?: boolean, // 是否在竖屏的时候隐藏\n * [propName: string]: any\n * }} IThumbnailConfig\n */\nexport default class Thumbnail extends BasePlugin {\n static get pluginName () {\n return 'thumbnail'\n }\n\n /**\n * @type IThumbnailConfig\n */\n static get defaultConfig () {\n return {\n isShow: false,\n urls: [], // 有多张大图就多个url就好\n pic_num: 0, // 雪碧图总数\n col: 0, // 截图列数\n row: 0, // 截图行数\n width: 160, // 缩略图宽度\n height: 90, // 缩略图高度\n scale: 1, // 缩放\n className: '', // 额外添加在dom上的class\n hidePortrait: false // 是否在竖屏的时候隐藏\n }\n }\n\n constructor (args) {\n super(args)\n this.ratio = 1\n this.interval = -1 // 间隔,单位:秒\n this.preloadMark = {}\n }\n\n afterCreate () {\n if (this.usable) {\n this.initThumbnail()\n }\n\n this.on([Events.DURATION_CHANGE], () => {\n const { pic_num, interval } = this.config\n this.usable && (this.interval = interval > 0 ? interval : Math.round(this.player.duration * 1000 / pic_num) / 1000)\n })\n }\n\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n this.usable && this.initThumbnail()\n }\n\n get usable () {\n const { urls, pic_num } = this.config\n return urls && urls.length > 0 && pic_num > 0\n }\n\n initThumbnail () {\n const { width, height, pic_num, interval } = this.config\n this.ratio = width / height * 100\n // 单位:秒,精确到毫秒\n this.interval = interval > 0 ? interval : Math.round(this.player.duration * 1000 / pic_num) / 1000\n this.preload(0)\n // this.preIndex = new Array(urls.length)\n // this.interval = interval || Math.round(this.player.duration / pic_num)\n // this.ratio = width / height * 100\n // className && Util.addClass(this.root, className)\n // hidePortrait && Util.addClass(this.root, 'portrait')\n // width && (this.root.style.width = `${width}px`)\n // height && (this.root.style.height = `${height}px`)\n // this.root.style.backgroundSize = `${width * col}px auto`\n }\n\n getUrlByIndex (index) {\n return index >= 0 && index < this.config.urls.length ? this.config.urls[index] : ''\n }\n\n preload (index) {\n const { urls } = this.config\n const len = urls.length\n const arr = [index - 1, index, index + 1, index + 2]\n arr.map(item => {\n if (!this.preloadMark[item] && item >= 0 && item < len) {\n Util.preloadImg(urls[item])\n this.preloadMark[item] = true\n }\n })\n }\n\n getPosition (now, containerWidth = 0, containerHeight = 0) {\n const { pic_num, row, col, width, height } = this.config\n // this.interval = Math.round(this.player.duration * 1000 / pic_num) / 1000\n let index = Math.ceil(now / this.interval) // 当前时间对应的图像索引\n index = index > pic_num ? pic_num : index\n const urlIndex = index < row * col ? 0 : (Math.ceil(index / (row * col)) - 1)// 当前图像所在的url索引\n const indexInPage = index - urlIndex * (col * row) // 当前图像在当前url中的索引\n const rowIndex = indexInPage > 0 ? Math.ceil(indexInPage / col) - 1 : 0// 当前图像在当前url中的行索引\n const colIndex = indexInPage > 0 ? indexInPage - rowIndex * col - 1 : 0 // 当前图像在当前url中的列索引\n let swidth = 0 // containerWidth || width\n let sHeight = 0 // swidth * height / width\n\n // 根据入参的宽高适配样式\n if (containerWidth && containerHeight) {\n const per = containerWidth / containerHeight\n if (per < width / height) {\n swidth = containerWidth\n sHeight = swidth / (width / height)\n } else {\n sHeight = containerHeight\n swidth = sHeight * (width / height)\n }\n } else {\n swidth = containerWidth || width\n sHeight = swidth / (width / height)\n }\n const url = this.getUrlByIndex(urlIndex)\n return {\n urlIndex,\n rowIndex,\n colIndex,\n url,\n height: sHeight,\n width: swidth,\n style: {\n backgroundImage: `url(${url})`,\n backgroundSize: `${swidth * col}px auto`,\n backgroundPosition: `-${colIndex * swidth}px -${rowIndex * sHeight}px`,\n width: `${swidth}px`,\n height: `${sHeight}px`\n }\n }\n }\n\n update (dom, now, containerWidth = 0, containerHeight = 0, customStyle = {}) {\n const { pic_num, urls } = this.config\n if (pic_num < 1 || !urls || urls.length === 0) {\n return\n }\n const pos = this.getPosition(now, containerWidth, containerHeight)\n this.preload(pos.urlIndex)\n\n Object.keys(pos.style).map((key) => {\n dom.style[key] = pos.style[key]\n })\n Object.keys(customStyle).map(key => {\n dom.style[key] = customStyle[key]\n })\n }\n\n // 对外暴露 切换缩略图配置\n changeConfig (newConfig = {}) {\n this.setConfig(newConfig)\n }\n\n createThumbnail (root, className) {\n const dom = Util.createDom('xg-thumbnail', '', {}, `thumbnail ${className}`)\n root && root.appendChild(dom)\n return dom\n }\n}\n","import Plugin from '../../plugin'\nclass MiniProgress extends Plugin {\n static get pluginName () {\n return 'MiniProgress'\n }\n\n static get defaultConfig () {\n return {}\n }\n\n afterCreate () {\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!duration || !this.root) {\n return\n }\n if (data.cached) {\n this.find('xg-mini-progress-cache').style.width = `${data.cached / duration * 100}%`\n }\n if (data.played) {\n this.find('xg-mini-progress-played').style.width = `${data.played / duration * 100}%`\n }\n }\n\n render () {\n if (!this.playerConfig.progress || !this.playerConfig.miniprogress) {\n return\n }\n return `\n \n \n `\n }\n}\n\nexport default MiniProgress\n","import Plugin, { Events, Util, Sniffer } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nimport './index.scss'\n\nconst MODES = {\n REAL_TIME: 'realtime',\n FIRST_FRAME: 'firstframe',\n FRAME_RATE: 'framerate',\n POSTER: 'poster'\n}\n\nfunction nowTime () {\n try {\n return window.performance.now()\n } catch (e) {\n return new Date().getTime()\n }\n}\n\n/**\n * Check whether the current environment supports canvas\n * @returns { Boolean }\n */\nfunction checkIsSupportCanvas () {\n try {\n const ctx = document.createElement('canvas').getContext\n if (ctx) {\n return true\n }\n return false\n } catch (e) {\n return false\n }\n}\n\n/**\n * @typedef { {\n * disable?: boolean,\n * mode?: \"realtime\" | \"firstframe\" | \"framerate\",\n * frameRate?: number\n * filter?: string,\n * addMask?: boolean,\n * maskBg?: string,\n * multiple? : number,\n * [propName: string]: any\n * } } IDynamicBgConfig\n */\n\nlet isSupportCanvas = null\nclass DynamicBg extends Plugin {\n static get pluginName () {\n return 'dynamicBg'\n }\n\n /**\n * @type IDynamicBgConfig\n */\n static get defaultConfig () {\n return {\n isInnerRender: false,\n disable: true,\n /**\n * Rendering method\n * realtime - Realtime rendering\n * firstframe - Render only the first frame\n * framerate - Render by frame\n * poster - Render by poster only\n */\n mode: 'framerate',\n frameRate: 10, // Frame rate when mode=framerate\n filter: 'blur(50px)', // Filter settings\n addMask: true, // Whether need a mask\n multiple: 1.2, // 画面放大倍数\n maskBg: 'rgba(0,0,0,0.7)' // Mask background color\n }\n }\n\n /**\n * @type {boolean}\n * @description Does the current environment support Canvas\n */\n static get isSupport () {\n if (typeof isSupportCanvas === 'boolean') {\n return isSupportCanvas\n }\n isSupportCanvas = checkIsSupportCanvas()\n return isSupportCanvas\n }\n\n static supportCanvasFilter () {\n return !(Sniffer.browser === 'safari' || Sniffer.browser === 'firefox')\n }\n\n afterCreate () {\n if (this.playerConfig.dynamicBg === true) {\n this.config.disable = false\n }\n if (!DynamicBg.isSupport) {\n this.config.disable = true\n }\n const { disable, mode } = this.config\n if (disable) {\n return\n }\n /**\n * @private\n */\n this._pos = {\n width: 0,\n height: 0,\n rwidth: 0,\n rheight: 0,\n x: 0,\n y: 0,\n pi: 0\n }\n /**\n * @readonly\n */\n this.isStart = false\n /**\n * @readonly\n */\n this.videoPI = 0\n /**\n * @readonly\n */\n this.preTime = 0\n /**\n * @readonly\n */\n this.interval = parseInt(1000 / this.config.frameRate, 10)\n\n /**\n * @readonly\n */\n this.canvas = null\n /**\n * @readonly\n */\n this.canvasCtx = null\n\n this.once(Events.COMPLETE, () => {\n if (!this.player) {\n return\n }\n this.init()\n })\n\n // this.once(Events.LOADED_DATA, this.onLoadedData)\n\n if (mode === MODES.POSTER) {\n return\n }\n\n if (mode !== MODES.FIRST_FRAME) {\n this.on(Events.EMPTIED, () => {\n this.stop()\n })\n this.on(Events.PLAY, () => {\n this.start()\n })\n this.on(Events.PAUSE, () => {\n this.stop()\n })\n }\n\n // First frame rendering\n if (mode === MODES.FIRST_FRAME) {\n this.once(Events.TIME_UPDATE, () => {\n this.renderOnce()\n })\n }\n }\n\n // onLoadedData = () => {\n // if (!this.player) { return }\n // this.isStart = true\n // this.renderOnce()\n // }\n\n /**\n * @private\n * 初始化 canvas对象并使用海报图先渲染首帧w11\n */\n init () {\n const { player, config } = this\n this.canvasFilter = DynamicBg.supportCanvasFilter()\n try {\n // 保证节点插入到video之前\n const parent = !this.config.isInnerRender ? player.root : (player.innerContainer || player.root)\n parent.insertAdjacentHTML('afterbegin',\n `
\n
`)\n this.root = parent.children[0]\n this.canvas = this.find('canvas')\n // safari中canvas filter不生效, 使用css滤镜\n if (!this.canvasFilter) {\n this.canvas.style.filter = config.filter\n this.canvas.style.webkitFilter = config.filter\n }\n this.mask = this.find('xgmask')\n\n config.addMask && (this.mask.style.background = config.maskBg)\n this.canvasCtx = this.canvas.getContext('2d')\n this.renderByPoster()\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n /**\n * Check whether the current video object supports screenshots\n * @param { Object } video\n * @returns { DomElement | null }\n */\n checkVideoIsSupport (video) {\n if (!video) {\n return null\n }\n const _tVideo = video && video instanceof window.HTMLVideoElement ? video : (video.canvas ? video.canvas : (video.flyVideo ? video.flyVideo : null))\n if (_tVideo && !(Sniffer.browser === 'safari' && (/^blob/.test(_tVideo.currentSrc) || /^blob/.test(_tVideo.src)))) {\n return _tVideo\n }\n\n const _tagName = _tVideo ? _tVideo.tagName.toLowerCase() : ''\n if (_tagName === 'canvas' || _tagName === 'img') {\n return _tVideo\n }\n\n return null\n }\n\n renderByPoster () {\n const { poster } = this.playerConfig\n if (poster) {\n const url = Util.typeOf(poster) === 'String' ? poster : (Util.typeOf(poster.poster) === 'String' ? poster.poster : null)\n this.updateImg(url)\n }\n }\n\n /**\n * just render once\n * @returns\n */\n renderOnce () {\n const { video } = this.player\n if (!video.videoWidth || !video.videoHeight) {\n return\n }\n this.videoPI = parseInt(video.videoWidth / video.videoHeight * 100, 10)\n const _sVideo = this.checkVideoIsSupport(video)\n _sVideo && video.videoWidth && this.update(_sVideo, this.videoPI)\n }\n\n start = () => {\n const { video } = this.player\n const _now = nowTime()\n const _sVideo = this.checkVideoIsSupport(video)\n if (!_sVideo || !this.canvasCtx || !video.videoWidth || !video.videoHeight) {\n return\n }\n this.stop()\n this.videoPI = video.videoHeight > 0 ? parseInt(video.videoWidth / video.videoHeight * 100, 10) : 0\n if (this.config.mode === MODES.REAL_TIME) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n } else if (_now - this.preTime >= this.interval) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n }\n this.frameId = Util.requestAnimationFrame(this.start)\n }\n\n stop = () => {\n if (this.frameId) {\n Util.cancelAnimationFrame(this.frameId)\n // window.clearTimeout(this.frameId)\n this.frameId = null\n }\n }\n\n updateImg (url) {\n // TODO: 需要改造,使用domcss样式渲染,不再使用canvas渲染\n if (!url) {\n return\n }\n // Render using the image\n const { width, height } = this.canvas.getBoundingClientRect()\n let image = new window.Image()\n image.onload = () => {\n if (!this.canvas || this.frameId || this.isStart) {\n return\n }\n this.canvas.height = height\n this.canvas.width = width\n const pi = parseInt(width / height * 100, 10)\n this.update(image, pi)\n image = null\n }\n image.src = url\n }\n\n update (video, sourcePI) {\n if (!this.canvas || !this.canvasCtx || !sourcePI) {\n return\n }\n try {\n const { _pos, config } = this\n const { width, height } = this.canvas.getBoundingClientRect()\n if (width !== _pos.width || height !== _pos.height || _pos.pi !== sourcePI) {\n const pi = parseInt(width / height * 100, 10)\n _pos.pi = sourcePI\n _pos.width = this.canvas.width = width\n _pos.height = this.canvas.height = height\n let rheight = height\n let rwidth = width\n if (pi < sourcePI) {\n rwidth = parseInt(height * sourcePI / 100, 10)\n } else if (pi > sourcePI) {\n rheight = parseInt(width * 100 / sourcePI, 10)\n }\n _pos.rwidth = rwidth * config.multiple\n _pos.rheight = rheight * config.multiple\n _pos.x = (width - _pos.rwidth) / 2\n _pos.y = (height - _pos.rheight) / 2\n }\n // console.log(`x:${_pos.x} y:${_pos.y} rwidth:${_pos.rwidth} rheight:${_pos.rheight}`)\n this.canvasFilter && (this.canvasCtx.filter = config.filter)\n this.canvasCtx.drawImage(video, _pos.x, _pos.y, _pos.rwidth, _pos.rheight)\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n destroy () {\n this.stop()\n this.canvasCtx = null\n this.canvas = null\n }\n\n render () {\n return ''\n }\n}\n\nexport default DynamicBg\n","import { BasePlugin, Events } from '../../plugin'\nconst INFO = 'info'\n\nconst { STATS_EVENTS } = Events\nexport default class Stats extends BasePlugin {\n static get pluginName () {\n return 'stats'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n _recordUserActions = (actionData) => {\n const time = this._getTime()\n const payload = Object.assign({}, actionData, { msg: actionData.msg || actionData.action })\n this._stats[INFO].push({\n type: 'userAction',\n ...time,\n payload\n })\n }\n\n _getTime () {\n return {\n timestamp: Date.now(),\n timeFormat: new Date().toISOString()\n }\n }\n\n afterCreate () {\n this.reset()\n this.on(Events.USER_ACTION, this._recordUserActions)\n this.on(STATS_EVENTS.STATS_INFO, this._recordInfo)\n this.on(STATS_EVENTS.STATS_DOWNLOAD, this._downloadStats)\n this.on(STATS_EVENTS.STATS_RESET, this._onReset)\n }\n\n destroy () {\n this.offAll()\n }\n\n _onReset = () => {\n this.reset()\n }\n\n _recordInfo = (data) => {\n this.info(data)\n }\n\n _downloadStats = () => {\n const stats = this.getStats()\n const blob = new Blob([JSON.stringify(stats)], { type: 'application/json' })\n const downloadUrl = window.URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.style.display = 'none'\n link.href = downloadUrl\n link.download = 'player.txt'\n link.disabled = false\n link.click()\n }\n\n downloadStats () {\n this._downloadStats()\n }\n\n /**\n * @params type\n */\n info (data) {\n if (data.profile) {\n this._infoProfile(data)\n } else {\n this._info(data)\n }\n }\n\n _info (data) {\n const time = this._getTime()\n this._stats[INFO].push({\n ...time,\n payload: data\n })\n }\n\n _infoProfile (data) {\n if (data && data.startMs) {\n const endMs = Date.now()\n const dur = endMs - data.startMs\n const profile = {\n cat: 'function',\n dur: dur,\n name: data.name || data.msg,\n ph: 'X',\n pid: 0,\n tid: 0,\n ts: data.startMs,\n profile: true,\n ...data\n }\n this._info(profile)\n } else {\n console.warn('infoProfile need object data, include startMs')\n }\n }\n\n reset () {\n this._stats = {\n [INFO]: [],\n media: {}\n }\n }\n\n getStats () {\n const { player } = this\n const mediaElem = player.video\n const buffered = []\n for (let i = 0; i < mediaElem.buffered.length; i++) {\n buffered.push({\n start: mediaElem.buffered.start(i),\n end: mediaElem.buffered.end(i)\n })\n }\n const mediaInfo = {\n currentTime: mediaElem.currentTime,\n readyState: mediaElem.readyState,\n buffered,\n paused: mediaElem.paused,\n ended: mediaElem.ended\n }\n\n this._stats.media = mediaInfo\n return {\n raw: this._stats,\n timestat: this._getTimeStats(),\n profile: this._getProfile()\n }\n }\n\n _getTimeStats () {\n const allStat = this._stats[INFO]\n const msgs = allStat.map(stat => {\n const data = stat.payload.data\n let msg = ''\n try {\n if (data instanceof Error) {\n msg = data.msg\n } else if (data !== undefined) {\n msg = JSON.stringify(data)\n }\n } catch (error) {\n console.log('err', error)\n }\n\n return `[${stat.timeFormat}] : ${stat.payload.msg} ${msg} `\n })\n return msgs\n }\n\n _getProfile () {\n const profile = {\n traceEvents: []\n }\n const allStat = this._stats[INFO]\n allStat.forEach(stat => {\n if (stat.payload.profile) {\n profile.traceEvents.push(stat.payload)\n }\n })\n return profile\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class GapJump extends BasePlugin {\n static get pluginName () {\n return 'gapJump'\n }\n\n static get defaultConfig () {\n return {\n useGapJump: false,\n smallGapLimit: 0.5,\n gapDetectionThreshold: 0.3\n }\n }\n\n afterCreate () {\n const { useGapJump } = this.config\n if (useGapJump === false) {\n return\n }\n this.hasPlayed = false\n this.seekingEventReceived = false\n this.isSafari = /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform)\n this.on(Events.WAITING, this.onGapJump)\n\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n\n this.on(Events.SEEKING, () => {\n this.seekingEventReceived = true\n })\n }\n\n onGapJump = () => {\n const { player, config } = this\n if (player.video.readyState === HTMLMediaElement.HAVE_NOTHING) {\n return\n }\n if (player.video.seeking) {\n if (!this.seekingEventReceived) { return }\n } else {\n this.seekingEventReceived = false\n }\n\n if (player.video.paused && player.video.currentTime !== 0 && this.hasPlayed) {\n return\n }\n\n const buffered = player.video.buffered\n const smallGapLimit = config.smallGapLimit || 0.5\n const gapDetectionThreshold = config.gapDetectionThreshold || 0.3\n const currentTime = player.video.currentTime\n const idx = this._getIndex(buffered, currentTime, gapDetectionThreshold)\n if (idx === null || idx === 0) {\n return\n }\n console.log('GapJump bufferRange ', buffered.start(idx), buffered.end(idx))\n const jumpTo = buffered.start(idx) + 0.1\n const seekEnd = player.video.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n const jumpSize = jumpTo - currentTime\n const isGapSmall = jumpSize <= smallGapLimit\n if (jumpSize < GapJump.BROWSER_GAP_TOLERANCE) {\n return\n }\n\n if (isGapSmall) {\n if (config.useGapJump !== false) {\n player.video.currentTime = this.isSafari ? jumpTo + 0.1 : jumpTo\n }\n this.player && this.player.emit('detectGap')\n console.log('gapJump gapIndex', idx, ' isGapSamll:', isGapSmall, ' currentTime:', player.video.currentTime, ' jumpSize:', (currentTime - player.video.currentTime))\n // 目前转码视频首个分片cts存在,在Safari下为0.08,先忽略\n if (jumpTo !== 0.08) {\n player && player.emit('log', {\n type: 'oneevent', // 事件类型\n end_type: 'gap',\n vid: player.config.vid,\n ext: {\n video_postion: Math.floor(jumpTo * 1000) // ms\n }\n })\n }\n }\n }\n\n _getIndex (buffered, time, threshold) {\n if (!buffered || !buffered.length) {\n return null\n }\n if (buffered.length === 1 && buffered.end(0) - buffered.start(0) < 1e-6) {\n return null\n }\n const bufferedInfo = this._getBuffered(buffered)\n let idx = null\n for (let i = 0; i < bufferedInfo.length; i++) {\n const item = bufferedInfo[i]\n if (item.start > time && (i === 0 || bufferedInfo[i - 1].end - time <= threshold)) {\n idx = i\n break\n }\n }\n return idx\n }\n\n _getBuffered (b) {\n if (!b) {\n return []\n }\n const ret = []\n for (let i = 0; i < b.length; i++) {\n ret.push({\n start: b.start(i),\n end: b.end(i)\n })\n }\n return ret\n }\n}\nGapJump.BROWSER_GAP_TOLERANCE = 0.001\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class WaitingTimeoutJump extends BasePlugin {\n static get pluginName () {\n return 'waitingTimeoutJump'\n }\n\n static get defaultConfig () {\n return {\n useWaitingTimeoutJump: false,\n waitingTime: 15, // wait超过此时间没恢复,则向前跳jumpSize,单位s\n jumpSize: 2, // 单位s,\n jumpCntMax: 4 // 一次播放最大向前跳几次\n }\n }\n\n afterCreate () {\n const { useWaitingTimeoutJump, jumpSize } = this.config\n if (useWaitingTimeoutJump === false) {\n return\n }\n this.hasPlayed = false\n this.jumpCnt = 0\n this.timer = null\n this.jumpSize = jumpSize\n this.on(Events.WAITING, this.onWaiting)\n this.on([Events.PLAYING, Events.CANPLAY], () => {\n clearTimeout(this.timer)\n this.timer = null\n this.jumpSize = this.config.jumpSize\n })\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n }\n\n onWaiting = () => {\n const { config } = this\n if (this.jumpCnt > config.jumpCntMax || this.timer || config.useWaitingTimeoutJump === false) {\n return\n }\n this.timer = setTimeout(this.onJump, config.waitingTime * 1000)\n }\n\n onJump = () => {\n const { player, config } = this\n clearTimeout(this.timer)\n this.timer = null\n if (this.jumpCnt > config.jumpCntMax || config.useWaitingTimeoutJump === false) {\n return\n }\n\n if (player.video.paused && player.video.currentTime !== 0 && this.hasPlayed) {\n return\n }\n this.jumpSize = config.jumpSize * (this.jumpCnt + 1)\n if (this.jumpCnt === config.jumpSize && this.jumpSize < 6) {\n this.jumpSize = 6\n }\n const jumpTo = player.currentTime + this.jumpSize\n const seekEnd = player.video.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n console.log('waitintTimeout, currentTime:', player.currentTime, ', jumpTo:', jumpTo)\n this.jumpCnt++\n player.currentTime = jumpTo\n }\n}\n","import BasePlugin, { Events, Util } from '../../plugin'\n\nexport default class TestSpeed extends BasePlugin {\n static get pluginName () {\n return 'testspeed'\n }\n\n static get defaultConfig () {\n return {\n openSpeed: false, // 测速开关,默认关\n testCnt: 3, // 一次播放的测速次数,默认1次\n loadSize: 200 * 1024, // 一次播放的测速请求的数据量大小,单位字节,默认200k\n testTimeStep: 3000, // 每次测速的时间间隔,第一次在开播后的testTimeStep 秒,默认是3s\n url: '', // 每次测速的url,一般传播放的备用地址测速\n saveSpeedMax: 5 // 保留最近多少次测速记录,最后的速度求这个记录列表平均值,默认5条\n }\n }\n\n getSpeed = (speedList) => {\n if (this.speedListCache.length <= 0) return 0\n let total = 0\n this.speedListCache.map(item => {\n total += item\n })\n return Math.floor(total / this.speedListCache.length)\n }\n\n afterCreate () {\n this.speedListCache = []\n const { openSpeed, testTimeStep } = this.config\n this.timer = null\n this.cnt = 0\n this.xhr = null\n if (!openSpeed) {\n return\n }\n this.on('real_time_speed', this._onRealSpeedChange)\n\n this.on([Events.LOADED_DATA, Events.REPLAY], () => {\n if (Util.isMSE(this.player.video)) {\n return\n }\n this.speedListCache = []\n this.cnt = 0\n this.timer = setTimeout(this.testSpeed, testTimeStep)\n })\n }\n\n _onRealSpeedChange = (data) => {\n data.speed && this.appendList(data.speed)\n }\n\n testSpeed = () => {\n clearTimeout(this.timer)\n this.timer = null\n if (!this.player || !this.config.openSpeed) return\n const { url, loadSize, testCnt, testTimeStep } = this.config\n const testSpeedUrl = url + (url.indexOf('?') < 0 ? '?testst=' : '&testst=') + Date.now()\n if (this.cnt >= testCnt) {\n return\n }\n this.cnt++\n try {\n const start = new Date().getTime()\n let end = null\n const xhr = new XMLHttpRequest()\n this.xhr = xhr\n xhr.open('GET', testSpeedUrl)\n const headers = {}\n const random = Math.floor(Math.random() * 10)\n headers.Range = 'bytes=' + random + '-' + (loadSize + random)\n if (headers) {\n Object.keys(headers).forEach(k => {\n xhr.setRequestHeader(k, headers[k])\n })\n }\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4) {\n this.xhr = null\n end = new Date().getTime()\n const size = xhr.getResponseHeader('Content-Length') / 1024 * 8\n const speed = Math.round(size * 1000 / (end - start))\n this.appendList(speed)\n this.timer = setTimeout(this.testSpeed, testTimeStep)\n }\n }\n xhr.send()\n } catch (e) {\n console.error(e)\n }\n }\n\n appendList = (speed) => {\n const { saveSpeedMax } = this.config\n if (this.speedListCache.length >= saveSpeedMax) {\n this.speedListCache.shift()\n }\n this.speedListCache.push(speed)\n this.player && (this.player.realTimeSpeed = speed)\n this.updateSpeed()\n }\n\n updateSpeed = () => {\n const speed = this.getSpeed()\n const { player } = this\n if (player && (!player.avgSpeed || speed !== player.avgSpeed)) {\n player.avgSpeed = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, { speed: speed, realTimeSpeed: player.realTimeSpeed })\n }\n }\n\n set openSpeed (value) {\n this.config.openSpeed = value\n if (!value && this.timer) {\n clearTimeout(this.timer)\n this.timer = null\n return\n }\n if (this.config.openSpeed) {\n if (this.timer) return\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n }\n\n get openSpeed () {\n return this.config.openSpeed\n }\n\n destroy () {\n clearTimeout(this.timer)\n this.timer = null\n if (this.xhr && this.xhr.readyState !== 4) {\n this.xhr.cancel()\n this.xhr = null\n }\n }\n}\n","import sniffer from '../utils/sniffer'\n// import Danmu from '../plugins/danmu'\nimport Xglogger from '../plugins/logger'\nimport Replay from '../plugins/replay'\nimport Poster from '../plugins/poster'\nimport Start from '../plugins/start'\nimport Enter from '../plugins/enter'\nimport Miniscreen from '../plugins/miniScreen'\nimport PC from '../plugins/pc'\nimport Mobile from '../plugins/mobile'\nimport Keyboard from '../plugins/keyboard'\nimport Loading from '../plugins/loading'\nimport Progress from '../plugins/progress'\nimport PlayIcon from '../plugins/play'\nimport FullScreen from '../plugins/fullscreen'\nimport TimeIcon from '../plugins/time'\nimport Volume from '../plugins/volume'\nimport RotateIcon from '../plugins/rotate'\nimport PIPIcon from '../plugins/pip'\nimport PlayNextIcon from '../plugins/playNext'\nimport DownLoadIcon from '../plugins/download'\nimport ScreenShotIcon from '../plugins/screenShot'\nimport DefinitionIcon from '../plugins/definition'\nimport PlaybackRateIcon from '../plugins/playbackRate'\nimport CssFullScreen from '../plugins/cssFullScreen'\nimport Error from '../plugins/error'\nimport Prompt from '../plugins/prompt'\nimport ProgressPreview from '../plugins/progressPreview'\nimport Thumbnail from '../plugins/common/thumbnail'\nimport MiniProgress from '../plugins/progress/miniProgress'\nimport DynamicBg from '../plugins/dynamicBg'\nimport ZH from '../lang/zh-cn'\nimport Stats from '../plugins/stats'\nimport GapJump from '../plugins/gapJump'\nimport WaitingTimeoutJump from '../plugins/waitingTimeoutJump'\nimport TestSpeed from '../plugins/testspeed'\nimport I18N from '../lang/i18n'\n\nI18N.use(ZH)\n\nexport default class DefaultPreset {\n constructor (options, playerConfig) {\n const simulateMode = playerConfig && playerConfig.isMobileSimulateMode === 'mobile'\n const { isLive } = playerConfig\n const vodPlugins = isLive ? [] : [Progress, MiniProgress, ProgressPreview, TimeIcon]\n\n const contolsIcons = [...vodPlugins, PlayIcon, FullScreen,\n RotateIcon, PlayNextIcon, DefinitionIcon, PlaybackRateIcon, DownLoadIcon, ScreenShotIcon, Volume, PIPIcon]\n\n const layers = [Replay, Poster, Start, Loading, Enter, Error, Prompt, Thumbnail, Miniscreen]\n\n this.plugins = [Stats, Xglogger, ...contolsIcons, ...layers, GapJump, WaitingTimeoutJump]\n const mode = simulateMode ? 'mobile' : sniffer.device\n switch (mode) {\n case 'pc':\n this.plugins.push(...[Keyboard, PC, CssFullScreen, TestSpeed])\n break\n case 'mobile':\n this.plugins.push(...[Mobile])\n break\n default:\n this.plugins.push(...[Keyboard, PC, CssFullScreen])\n }\n if (sniffer.os.isIpad || mode === 'pc') {\n this.plugins.push(DynamicBg)\n }\n if (sniffer.os.isIpad) {\n this.plugins.push(PC)\n }\n this.ignores = []\n this.i18n = []\n }\n}\n","export default {\n LANG: 'zh-cn',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: '视频下载错误'\n },\n mse: {\n code: 2,\n msg: '流追加错误'\n },\n parse: {\n code: 3,\n msg: '解析错误'\n },\n format: {\n code: 4,\n msg: '格式错误'\n },\n decoder: {\n code: 5,\n msg: '解码错误'\n },\n runtime: {\n code: 6,\n msg: '语法错误'\n },\n timeout: {\n code: 7,\n msg: '播放超时'\n },\n other: {\n code: 8,\n msg: '其他错误'\n }\n },\n HAVE_NOTHING: '没有关于音频/视频是否就绪的信息',\n HAVE_METADATA: '音频/视频的元数据已就绪',\n HAVE_CURRENT_DATA: '关于当前播放位置的数据是可用的,但没有足够的数据来播放下一帧/毫秒',\n HAVE_FUTURE_DATA: '当前及至少下一帧的数据是可用的',\n HAVE_ENOUGH_DATA: '可用数据足以开始播放',\n NETWORK_EMPTY: '音频/视频尚未初始化',\n NETWORK_IDLE: '音频/视频是活动的且已选取资源,但并未使用网络',\n NETWORK_LOADING: '浏览器正在下载数据',\n NETWORK_NO_SOURCE: '未找到音频/视频来源',\n MEDIA_ERR_ABORTED: '取回过程被用户中止',\n MEDIA_ERR_NETWORK: '网络错误',\n MEDIA_ERR_DECODE: '解码错误',\n MEDIA_ERR_SRC_NOT_SUPPORTED: '不支持的音频/视频格式',\n REPLAY: '重播',\n ERROR: '网络连接似乎出现了问题',\n PLAY_TIPS: '播放',\n PAUSE_TIPS: '暂停',\n PLAYNEXT_TIPS: '下一集',\n DOWNLOAD_TIPS: '下载',\n ROTATE_TIPS: '旋转',\n RELOAD_TIPS: '重新载入',\n FULLSCREEN_TIPS: '进入全屏',\n EXITFULLSCREEN_TIPS: '退出全屏',\n CSSFULLSCREEN_TIPS: '进入样式全屏',\n EXITCSSFULLSCREEN_TIPS: '退出样式全屏',\n TEXTTRACK: '字幕',\n PIP: '画中画',\n SCREENSHOT: '截图',\n LIVE: '正在直播',\n OFF: '关闭',\n OPEN: '开启',\n MINI_DRAG: '点击按住可拖动视频',\n MINISCREEN: '小屏幕',\n REFRESH_TIPS: '请试试',\n REFRESH: '刷新',\n FORWARD: '快进中',\n LIVE_TIP: '直播'\n }\n}\n","import Player from './player'\nimport Plugin from './plugin/plugin'\nimport BasePlugin from './plugin/basePlugin'\nimport * as Events from './events'\nimport STATE_CLASS from './stateClassMap'\nimport I18N from './lang/i18n'\nimport Errors from './error'\nimport Sniffer from './utils/sniffer'\nimport Util from './utils/util'\nimport './index.scss'\n\nimport defaultPreset from './presets/default'\n\nclass PresetPlayer extends Player {\n static defaultPreset = defaultPreset;\n static Util = Util;\n static Sniffer = Sniffer\n static Errors = Errors\n static Events = Events\n static Plugin = Plugin\n static BasePlugin = BasePlugin\n static I18N = I18N\n static STATE_CLASS = STATE_CLASS\n}\n\nexport default PresetPlayer\n"],"names":["has","Object","prototype","hasOwnProperty","prefix","Events","EE","fn","context","once","this","addListener","emitter","event","TypeError","listener","evt","_events","push","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","names","events","name","call","slice","getOwnPropertySymbols","concat","listeners","handlers","i","l","length","ee","Array","listenerCount","emit","a1","a2","a3","a4","a5","args","len","arguments","removeListener","undefined","apply","j","on","removeAllListeners","off","prefixed","module","exports","XG_DEBUG_OPEN","window","location","href","indexOf","STYLE","info","error","warn","XGTAG","XG_DEBUG","config","debug","logInfo","message","_console","_len","optionalParams","_key","console","log","logWarn","_console2","_len2","_key2","logError","_console3","_fun","_len3","_key3","XgplayerTimeRange","bufferedList","_classCallCheck","_createClass","key","value","index","start","end","get","util","checkIsIn","list","isObject","type","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","useRAF","requestAnimationFrame","invokeFunc","time","thisArg","startTimer","pendingFunc","cancelAnimationFrame","setTimeout","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","Date","now","trailingEdge","timeSinceLastInvoke","timeWaiting","Math","min","remainingWait","debounced","isInvoking","max","cancel","id","clearTimeout","cancelTimer","flush","pending","createDom","el","tpl","attrs","cname","dom","document","createElement","className","innerHTML","keys","forEach","item","setAttribute","createDomFromHtml","html","classname","doc","children","addClass","err","hasClass","some","classList","e","orgClassName","_typeof","getAttribute","match","RegExp","replace","split","add","removeClass","remove","reg","toggleClass","classNames","_arguments","_loop","typeOf","map","join","findDom","sel","querySelector","getElementById","getCss","currentStyle","defaultView","getComputedStyle","padStart","str","pad","charstr","String","maxlen","ceil","chars","r","substring","format","isNaN","round","hour","floor","minute","second","touches","touch","changedTouches","clientX","clientY","offsetX","pageX","target","offsetLeft","offsetY","pageY","offsetTop","_target","srcElement","obj","toString","deepCopy","dst","src","Node","deepMerge","_dst$key","_toConsumableArray","getBgImage","url","backgroundImage","a","copyDom","nodeType","back","tagName","attributes","node","setInterval","eventName","intervalFunc","frequency","_interval","bind","clearInterval","fun","_timers","splice","clearAllTimers","_timerIds","createImgBtn","imgUrl","width","height","w","h","unit","btn","style","every","parseFloat","trim","backgroundSize","margin","Hex2RGBA","hex","alpha","rgb","test","sixHex","kw","parseInt","getFullScreenEl","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","checkIsFunction","checkIsObject","hide","display","show","isUndefined","val","setStyleFromCsstext","text","arr","filterStyleFromText","_cssText","cssText","styleArr","ret","remain","getStyleFromCsstext","preloadImg","onload","onerror","img","Image","stopPropagation","cancelable","preventDefault","scrollTop","pageYOffset","documentElement","body","scrollLeft","pageXOffset","checkTouchSupport","getBuffered2","vbuffered","maxHoleDuration","buffered","sort","b","diff","buffered2","buf2len","buf2end","getEventPos","zoom","x","y","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","getHostFromUrl","results","domain","frameId","mozCancelAnimationFrame","cancelRequestAnimationFrame","isMSE","video","HTMLMediaElement","currentSrc","generateSessionId","did","d","getTime","performance","uuid","c","random","VERSION_REG","H264_MIMETYPES","sniffer","device","os","isPc","browser","navigator","ua","userAgent","toLowerCase","ie","firefox","chrome","opera","safari","filter","isWindowsPhone","isSymbian","isAndroid","isFireFox","isTablet","isPhone","isIpad","isIos","osVersion","_match","exec","version","isWeixin","toLocaleLowerCase","isSupportMP4","isSupport","mime","supportResult","canPlayType","isHevcSupported","MediaSource","isTypeSupported","probeConfigSupported","defaults","supported","smooth","powerEfficient","Promise","resolve","mediaCapabilities","decodingInfo","videoConfig","audioConfig","audio","videoSupported","contentType","audioSupported","ERROR_TYPE_MAP","Errors","player","errorInfo","errorType","errorCode","errorMessage","originError","ext","mediaError","ERROR_TYPES","i18n","duration","currentTime","ended","readyState","networkState","playerVersion","code","stack","host","Util","ex","msg","PLAY","PLAYING","ENDED","PAUSE","ERROR","SEEKING","SEEKED","TIME_UPDATE","WAITING","CANPLAY","DURATION_CHANGE","VOLUME_CHANGE","LOADED_DATA","RATE_CHANGE","PROGRESS","LOAD_START","EMPTIED","PLAYER_FOCUS","PLAYER_BLUR","READY","URL_NULL","AUTOPLAY_STARTED","AUTOPLAY_PREVENTED","COMPLETE","REPLAY","DESTROY","URL_CHANGE","DOWNLOAD_SPEED_CHANGE","FULLSCREEN_CHANGE","CSS_FULLSCREEN_CHANGE","MINI_STATE_CHANGE","DEFINITION_CHANGE","AFTER_DEFINITION_CHANGE","VIDEO_RESIZE","PIP_CHANGE","ROTATE","SCREEN_SHOT","PLAYNEXT","SHORTCUT","XGLOG","USER_ACTION","RESET","VIDEO_EVENTS","STATS_EVENTS","STATS_INFO","STATS_DOWNLOAD","STATS_RESET","emitVideoEvent","eventKey","errorHandler","getVideoEventHandler","_err","eData","originalEvent","detail","timeStamp","paused","isInternalOp","_internalOp","muted","volume","vtype","removeInnerOP","_currentTime","_rate","playbackRate","_duration","isMutedChange","_lastMuted","videoEventMiddleware","VideoProxy","_EventEmitter","_inherits","_super","_createSuper","_this","_hasStart","assign","controls","autoplay","playsinline","x5VideoPlayerFullscreen","x5VideoOrientation","airplay","tabindex","mediaType","videoAttributes","playerType","x5VideoPlayerType","Sniffer","loop","defaultPlaybackRate","autoplayMuted","attachVideoEvents","middlewares","_this2","_this3","_this4","_evHandlers","funName","charAt","toUpperCase","_defineProperty","addEventListener","_this5","removeEventListener","urls","_this6","removeAttribute","appendChild","_c","_videoSourceCount","_eHandler","_sourceError","removeChild","_e","k","pause","load","detachVideoEvents","play","range","set","isTrue","_buffered","crossOrigin","defaultMuted","rate","Infinity","played","preload","seekable","seeking","onWaiting","_detachSourceEvents","_attachSourceEvents","vol","data","_get2","_get","_getPrototypeOf","_get3","_get4","_get5","_len4","_key4","INDEXDB","mydb","db","ojstore","keypath","indexedDB","webkitindexedDB","IDBKeyRange","webkitIDBKeyRange","myDB","self","request","open","onsuccess","onupgradeneeded","transaction","objectStoreNames","contains","createObjectStore","keyPath","deleteDatabase","close","storename","store","objectStore","put","delete","clear","FULLSCREEN_EVENTS","GET_FULLSCREEN_API","EXIT_FULLSCREEN_API","PLATER_ID","callHandler","handler","next","then","hook","hookName","preset","pre","__hooks","_preset$pre","pluginName","_this$__hooks$hookNam","preRet","isContinue","catch","useHooks","removeHooks","usePluginHooks","plugins","plugin","removePluginHooks","hooksDescriptor","instance","presetHooks","defineProperty","delHooksDescriptor","runHooks","_len5","_key5","_obj$__hooks$hookName","showErrorMsg","BasePlugin","beforeCreate","__args","__events","__onceEvents","playerConfig","__init","constructor","logger","lang","i18nKeys","domEventType","isArray","_this$player","res","action","params","nParams","emitUserAction","registerPlugin","getPlugin","offAll","destroy","unRegisterPlugin","Obj","Element","matches","proto","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","closest","element","selector","parentNode","_delegate","useCapture","listenerFn","delegateTarget","delegate_1","elements","querySelectorAll","ROOT_TYPES","CONTROLS","ROOT","POSITIONS","ROOT_LEFT","ROOT_RIGHT","ROOT_TOP","CONTROLS_LEFT","CONTROLS_RIGTH","CONTROLS_RIGHT","CONTROLS_CENTER","isUrl","createIcon","icon","attr","newIcon","tag","registerIconsObj","iconsConfig","_icons","icons","orgIcon","class","mergeIconClass","mergeIconAttr","Plugin","_BasePlugin","__delegates","root","_parent","_el","parent","registerIcons","langText","textConfig","defaultTexConfig","registerLanguageTexts","renderStr","render","Error","insert","setAttr","setStyle","__registerChildren","_children","_plugin","checkChildren","langKey","langTextShow","qs","eventType","bindEL","delegate","unbindEL","htmlStr","eventHandle","isBubble","getPropertyValue","pdom","child","find","_this7","insertIdx","Number","isDomElement","coordinate","mode","curIdx","insertBefore","insertAdjacentHTML","capture","dels","ResizeObserver","entries","t","__runHandler","__handlers","observer","throttle","__trigger","observe","_pid","playerId","unobserve","disconnect","resizeObserver","pluginsManager","pluginGroup","init","cgid","_pluginInfoId","closeResizeObserver","resize","addObserver","isUserActive","_player","_originalOptions","_plugins","checkPlayerRoot","_keys","_p","formatPluginInfo","PLUFGIN","checkPluginIfExits","getRootByConfig","_pConfig","position","lazyRegister","lazyPlugin","timeout","race","loader","__esModule","default","register","reject","originalOptions","isSupported","disable","defaultConfig","unRegister","_instance","afterCreate","__destroy","deletePlugin","getPlugins","findPlugin","cName","beforeInit","retPromise","prevTask","_loadingPlugins","all","pluginsRet","pName","beforePlayerInit","afterInit","afterPlayerInit","setLang","updateLang","reRender","_pList","onPluginsReady","setCurrentUserActive","isActive","getCurrentUseActiveId","unObserver","_i","_Object$keys","_isUseActive","isUseActive","STATE_CLASS","DEFAULT","DEFAULT_SKIN","ENTER","PAUSED","LOADING","NO_START","ACTIVE","INACTIVE","FULLSCREEN","CSS_FULLSCREEN","ROTATE_FULLSCREEN","PARENT_ROTATE_FULLSCREEN","PARENT_FULLSCREEN","INNER_FULLSCREEN","NO_CONTROLS","FLEX_CONTROLS","CONTROLS_FOLLOW","CONTROLS_AUTOHIDE","TOP_BAR_AUTOHIDE","NOT_ALLOW_AUTOPLAY","PC","MOBILE","MINI","getDefaultConfig","nullUrlStart","fluid","fitVideoSize","videoFillMode","isLive","videoInit","poster","isMobileSimulateMode","execBeforePluginsCall","allowSeekAfterEnded","enableContextmenu","closeVideoClick","closeVideoDblclick","closePlayerBlur","closeDelayBlur","leavePlayerTime","closePlayVideoFocus","closePauseVideoFocus","closeFocusVideoFocus","closeControlsBlur","topBarAutoHide","startTime","seekedStatus","miniprogress","disableSwipeHandler","enableSwipeHandler","ignores","whitelist","inactive","language","marginControls","fullscreenTarget","screenShot","rotate","pip","download","mini","cssFullscreen","keyShortcut","presets","definition","customDuration","timeOffset","thumbnail","commonStyle","progressColor","playedColor","cachedColor","sliderBtnStyle","volumeColor","STATES","STATE_ARRAY","Controls","_Plugin","_assertThisInitialized","_assertThisInitialize","focus","autoHide","_this$config","left","center","right","innerRoot","isMini","onMouseEnter","onMouseLeave","blur","ignorePaused","unbind","_this$config2","initShow","XGI18nLang","langKeys","textKeys","_s","_t","updateKeys","en","use","langData","i18nLangs","_clang","LANG","texts","TEXT","network","mse","parse","decoder","runtime","other","HAVE_NOTHING","HAVE_METADATA","HAVE_CURRENT_DATA","HAVE_FUTURE_DATA","HAVE_ENOUGH_DATA","NETWORK_EMPTY","NETWORK_IDLE","NETWORK_LOADING","NETWORK_NO_SOURCE","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","PLAY_TIPS","PAUSE_TIPS","PLAYNEXT_TIPS","DOWNLOAD_TIPS","ROTATE_TIPS","RELOAD_TIPS","FULLSCREEN_TIPS","EXITFULLSCREEN_TIPS","CSSFULLSCREEN_TIPS","EXITCSSFULLSCREEN_TIPS","TEXTTRACK","PIP","SCREENSHOT","LIVE","OFF","OPEN","MINI_DRAG","MINISCREEN","REFRESH_TIPS","REFRESH","FORWARD","LIVE_TIP","I18N","zh","extend","i18nTextList","_ret$langKeys","pId","PlAYER_HOOKS","REAL_TIME_SPEED","AVG_SPEED","Player","_VideoProxy","videoPlay","canPlayFunc","isFullScreen","delayResize","fullEl","_fullActionFrom","props","prop","from","to","isVideo","checkIsCurrentVideo","pid","_fullscreenEl","fullscreen","changeFullStyle","_fullScreenOffset","cssfullscreen","exitCssFullscreen","needFullscreenScroll","scrollTo","top","recoverFullStyle","onFullscreenChange","defaultPreset","defaultIdx","userTimer","waitTimer","_state","isError","isSeeking","isCanplay","_runPending","rotateDeg","isRotateFullscreen","_cssfullscreenEl","curDefinition","_orgCss","_videoHeight","_videoWidth","_accPlayed","acc","loopAcc","innerContainer","topBar","__i18n","database","Database","_initDOM","_possibleConstructorReturn","_this$config2$definit","defaultDefinitionObj","defaultDefinition","_bindEvents","_registerPresets","_registerPlugins","getInitDefinition","setState","onReady","hasStart","state","vid","line","handle","_initBaseDoms","XgVideoProxy","_nVideo","_this$config3","leftBar","rightBar","_onWebkitbeginfullscreen","_onWebkitendfullscreen","playFunc","mousemoveFunc","_root","firstChild","isInit","ignoresStr","cuPlugins","lazy","loadingPlugin","forceBeforeInit","Preset","_player$config$plugin","_player$config$ignore","_presetInst","_presetInst$plugins","_presetInst$ignores","_presetInst$icons","_presetInst$i18n","_ci18n","usePreset","_retPlugin","_getRootByPosition","removedFromConfig","deregister","removePluginFromConfig","_this8","_startInit","fileName","lineNumber","_this9","_src","curTime","isPaused","_canplay","_this10","playPromise","onError","_errorTimer","_this11","_this12","status","_this13","_this$config4","isSeekedPlay","_status","_this14","_this$config5","_this15","switchURL","reloadFunc","_this16","clsList","videoPause","cls","_this17","unregisterPlugins","isResetConfig","resetState","pn","de","_this18","updateAcc","_unbindEvents","exitFullscreen","cList","_this19","onPlay","_this20","cur","rootClass","pClassName","_orgPCss","webkitRequestFullscreen","ALLOW_KEYBOARD_INPUT","fullscreenEnabled","webkitSupportsFullscreen","webkitEnterFullscreen","exitRotateFullscreen","webkitExitFullScreen","_class","_this$config$fullscre","useCssFullscreen","_this$config$fullscre2","setRotateDeg","deg","orientation","delay","onFocus","_objectSpread","onBlur","_this21","_ref","_ref$autoHide","_ref$delay","_ref2","_ref2$ignorePaused","_this22","_this23","endType","_at","pos","rvH","_transform","_tx","_ty","transform","webkitTransform","_this24","setConfig","_this25","_this$video","videoWidth","videoHeight","_this$config6","containerSize","getBoundingClientRect","controlsHeight","videoFit","fit","rWidth","rHeight","_style","paddingTop","videoScale","vWidth","vHeight","cWidth","cHeight","updateObjectPosition","objectPosition","newState","bool","_this26","curDef","targetDef","_this26$curDefinition","changeDefinition","total","dropped","corrupted","droppedRate","droppedDuration","getVideoPlaybackQuality","_quality","droppedVideoFrames","totalVideoFrames","corruptedVideoFrames","cumulateTime","_l","__url","posterUrl","update","isMuted","addInnerOP","descriptor","LOG_TYPES","XGLogger","isTimeUpdate","autoplayStart","_sendFF","vt","isFFLoading","isFFSend","isLs","pt","fvt","_isSeeking","seekingStart","waitingStart","_isWaiting","_waitTimer","_waittTimer","_waitType","suspendWaitingStatus","emitLog","suspendSeekingStatus","_startWaitTimeout","_onReset","_initOnceEvents","_onWaitingLoadStart","_this2$_state","_onSeeking","_onSeeked","endState","_onPlaying","_onWaiting","_onError","_onAutoplayStart","_onTimeupdate","s","_this$_state","costTime","_now","_cost","Replay","replay","ReplaySvg","__handleReplay","path","Poster","isEndedShow","hideCanplay","onTimeUpdate","AnimateMap","Start","autoPlayStart","onPlayPause","initIcons","onAutoplayStart","clickHandler","switchPausePlay","startPlay","PlaySvg","startPause","PauseSvg","isAnimate","endShow","addAnimate","seconds","switchStatus","isShowPause","isShowEnd","disableAnimate","animate","Enter","innerHtml","HTMLElement","barStr","logo","MiniScreenIcon","getMini","exitMini","onClick","getStyleSize","num","measurements","measurementsLength","getSize","elem","getStyle","size","innerWidth","innerHeight","outerWidth","outerHeight","getZeroSize","offsetWidth","offsetHeight","isBorderBox","boxSizing","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderWidth","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","getTouch","dentifier","identifier","EVENTS","POST_START_EVENTS","mousedown","touchstart","pointerdown","Draggabilly","isEnabled","isDragging","isDown","downPoint","dragPoint","startPos","_handlerDom","_bindStartEvent","_startKey","_boundPointerEvents","onUp","positionDrag","webKitTransform","dragStart","dragMove","dragEnd","touchIdentifier","pointerId","dragCancel","pointer","_getPosition","maxY","maxX","setLeftTop","_bindPostStartEvents","_unbindPostStartEvents","presetInfo","moveVector","hasDragStarted","dragRealStart","_this$startPos","_dragPointerMove","dragX","dragY","checkContain","_unbindStartEvent","abs","axis","drag","grid","_getPositionCoord","_addTransformPosition","matrixValues","xIndex","translateX","translateY","styleSide","measure","parentSize","MiniScreen","isClose","scrollY","scrollHeight","lastStyle","isShowIcon","onCancelClick","onCenterClick","disableDrag","_draggabilly","isScrollSwitch","onScroll","PlayIcon","PauseIcon","MOUSE_EVENTS","mouseenter","mouseleave","mousemove","HOOKS","PCPlugin","_assertThisInitialize2","_this$playerConfig","_assertThisInitialize3","__canvas","closeVideoStopPropagation","_clickCount","clickTimer","switchPlayPause","_assertThisInitialize4","getFullscreen","_this$playerConfig2","disableContextmenu","initEvents","onVideoClick","onVideoDblClick","onContextmenu","returnValue","cancelBubble","_this$player2","TOUCHS","move","MOUSES","preventToucheDefault","Touche","_pos","moving","pressDelay","dbClickDelay","disablePress","disableDbClick","miniStep","needPreventDefault","pressIntrvalId","dbIntrvalId","_initEvent","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel","__clearPress","trigger","press","__clearDb","__setPress","__setDb","diffx","diffy","touchend","touchmove","ACTIONS","MobilePlugin","touche","getTouche","disableGesture","isStart","rect","_x","_y","scopeL","scopeR","scopeM1","scopeM","scopeM2","miniMoveStep","hideControlsActive","scope","checkScope","gestureY","gestureX","executeMove","endLastMove","resetSeekState","resetPos","changeAction","checkIsRootTarget","light","timer","seekTipIcon","SeekTipIcon","closedbClick","xgMask","initCustomStyle","registerThumbnail","onRootTouchMove","onRootTouchEnd","moveDuration","_this2$pos","eventsMap","pressend","click","doubleclick","disableActive","progressPlugin","progress","addCallBack","activeSeekNote","forward","usable","createThumbnail","timePreview","backgroundColor","color","disableTimeProgress","startPlugin","recover","mold","updateTime","updateBrightness","updateVolume","lastScope","seek","toFixed","hideControlsEnd","sendUseAction","Event","focusVideoClick","pressRate","percent","updatePercent","isTouchingSeek","maxDarkness","isForward","focusHide","updateThumbnails","gradient","disableSeekIcon","miniYPer","darkness","isDisableTag","isContentEditable","Keyboard","isIgnoreUserActive","disableBodyTrigger","checkIsVisible","metaKey","altKey","ctrlKey","keyCode","isGlobalTrigger","checkCode","handleKeyCode","disableRootTrigger","extendkeyCodeMap","keyCodeMap","key1","seekStep","space","noBodyTarget","up","down","esc","mergekeyCodeMap","onKeydown","onBodyKeyDown","checkVisible","rec","bottom","isBodyTarget","flag","_time","curKeyCode","_this4$keyCodeMap$key","Loading","loadingIcon","TPL","styleKey","InnerList","fragments","focusClass","cachedIndex","playedIndex","newIndex","curIndex","millisecond","progressList","curPFrag","per","cached","updateDuration","newPIndex","findIndex","updateProgress","newCIndex","inner","isFocus","Progress","_ePos","computeTime","triggerCallbacks","updateWidth","isPauseMoving","closeMoveSeek","onMoveStart","isProgressMoving","progressBtn","_mouseDownHandlerHook","onMouseMove","onMouseUp","onMoveOnly","onBodyClick","_assertThisInitialize5","onMoveEnd","_mouseUpHandlerHook","isEnter","_assertThisInitialize6","miniStartStep","_mouseMoveHandlerHook","_assertThisInitialize7","_assertThisInitialize8","useable","__dragCallBacks","direc","_disableBlur","innerList","outer","createInner","isDragingSeek","isMobile","onTimeupdate","onCacheUpdate","onReset","bindDomEvents","boxShadow","_index","_mouseDownHandler","_mouseUpHandler","_mouseMoveHandler","onMouseDown","onMouseOver","onMouseOut","recoverAutoHide","isCloseClickSeek","realTime","endedDiff","rLeft","_this$root$getBoundin","offset","timeIcon","resetActive","notSeek","point","bufferedPoint","thumbnailPlugin","controlsMode","Fullscreen","_onMouseenter","_onMouseLeave","Play","_IconPlugin","btnClick","changeLangTextKey","IconPlugin","TopBackIcon","screenBack","BackSVG","rotateFullscreen","handleFullscreen","toggleFullScreen","needBackIcon","topBackIcon","_onOrientationChange","FullScreenSvg","ExitFullScreenSvg","getCssFullscreen","getRotateFullscreen","switchCallback","Time","isActiving","constrolsMode","createCenterTime","durationDom","timeDom","current","centerCurDom","centerDurDom","updateState","Volume","bar","barRect","barH","updateVolumePos","onBarMouseUp","isMoving","_timerId","showValueLabel","updateVolumeValue","volumeSmall","volumeSmallSvg","volumeLarge","volumeLargeSvg","volumeMuted","volumeMutedSvg","changeMutedHandler","changeMuted","_onMouseenterHandler","onMouseenter","_onMouseleaveHandler","onMouseleave","onBarMousedown","onBarMouseMove","onVolumeChange","$labelValue","innerText","miniVolume","isShowVolumeValue","Rotate","onBtnClick","updateRotateDeg","innerRotate","clockwise","_styles","transformOrigin","times","factor","RotateSvg","PresentationMode","isPIPAvailable","isPip","exitPIP","requestPIP","showIcon","pMode","initPipEvents","switchPIP","pipIcon","PipIcon","pipIconExit","PipIconExit","leavePIPCallback","enterPIPCallback","pipWindow","pictureInPictureWindow","onWebkitpresentationmodechanged","webkitPresentationMode","checkWebkitSetPresentationMode","webkitSetPresentationMode","requestPictureInPicture","reason","exitPictureInPicture","pictureInPictureElement","pictureInPictureEnabled","disablePictureInPicture","webkitSupportsPresentationMode","PlayNextIcon","idx","urlList","nextHandler","playNext","Next","changeSrc","strFileName","strMimeType","blob","reader","defaultMime","mimeType","payload","anchor","myBlob","Blob","MozBlob","WebKitBlob","pop","ajax","XMLHttpRequest","responseType","response","send","msSaveBlob","dataUrlToBlob","saver","tempUiArr","Uint8Array","mx","charCodeAt","strUrl","parts","binData","atob","decodeURIComponent","uiArr","winMode","URL","revokeObjectURL","confirm","f","createObjectURL","btoa","encodeURIComponent","FileReader","readAsDataURL","Download","isLock","getAbsoluteURL","downloadUtil","DownloadSvg","div","ScreenShot","screenshotIcon","initSize","fitVideo","onClickBtn","filename","saveLink","createEvent","initMouseEvent","dispatchEvent","canvas","canvasCtx","getContext","shot","saveScreenShot","option","quality","createCanvans","drawImage","toDataURL","OptionList","onItemClick","renderItemList","_delegates","attrKeys","selected","showText","changeCallback","curSelected","getAttrObj","IS_MOBILE","OptionsIcon","onToggle","isIcons","curValue","listType","hidePortrait","optionsList","activeEvent","onEnter","onLeave","onIconClick","_isIcons","focusAwhile","curItem","changeCurrentText","getTextByLang","itemList","listStyle","DefinitionIcon","_OptionsIcon","changeDefinitionList","definitionList","items","showItem","PlaybackRate","curRate","itemInfo","CssFullScreen","isCssfullScreen","handleCssFullscreen","contentIcon","switchTips","CssFullSceenSvg","ExitCssFullSceenSvg","ErrorPlugin","errorRetry","handleError","handleCanPlay","retry","errorNote","Prompt","intervalId","customConfig","customOnClick","showPrompt","hidePrompt","interval","highlight","hideinterval","ISPOT","mergeISPOT","iSpot","APIS","initDots","_ispots","createDot","_ispotsInit","isNew","calcuPosition","dotDom","template","findDot","updateDot","needShow","dot","showDot","deleteDot","del","parentElement","deleteAllDots","dotDoms","getElementsByTagName","updateAllDots","iSpots","ispot","getAllDotsDom","getDotDom","CALLBACK_MAP","dragmove","dragstart","dragend","mouseover","ProgressPreview","isDrag","_curDot","onDotMouseLeave","blurDot","enableBlur","focusDot","disableBlur","videoPreview","videothumbnail","timeStr","handlerSpotClick","_event","transformTimeHook","setTimeContent","ispots","progressDot","initDotsAPI","previewLine","timePoint","timeText","tipText","_hasThumnail","bindEvents","onMousemove","onMousedown","onMouseup","handlerPreviewClick","updatePosition","cwidth","_tt","isflex","lwidth","tWidth","textContent","updateLinePos","showTips","isFocusDots","defaultText","hideTips","updateTimeText","thumbnailConfig","changeConfig","isShowThumbnail","tRoot","isShowCoverPreview","totalWidth","widthPerSeconds","_activeDotId","isDefault","removeCallBack","miniWidth","Thumbnail","ratio","preloadMark","initThumbnail","_this2$config","pic_num","containerWidth","containerHeight","row","col","urlIndex","indexInPage","rowIndex","colIndex","swidth","sHeight","getUrlByIndex","backgroundPosition","customStyle","getPosition","newConfig","isShow","scale","MiniProgress","MODES","nowTime","isSupportCanvas","DynamicBg","_sVideo","checkVideoIsSupport","stop","videoPI","preTime","dynamicBg","rwidth","rheight","pi","frameRate","renderOnce","canvasFilter","supportCanvasFilter","isInnerRender","webkitFilter","mask","addMask","background","maskBg","renderByPoster","_tVideo","HTMLVideoElement","flyVideo","_tagName","updateImg","_this$canvas$getBound","image","sourcePI","_this$canvas$getBound2","multiple","checkIsSupportCanvas","INFO","Stats","actionData","_getTime","_stats","reset","stats","getStats","JSON","stringify","downloadUrl","link","disabled","timestamp","timeFormat","toISOString","_recordUserActions","_recordInfo","_downloadStats","profile","_infoProfile","_info","startMs","endMs","cat","dur","ph","tid","ts","_this$_stats","mediaElem","mediaInfo","media","raw","timestat","_getTimeStats","_getProfile","msgs","stat","traceEvents","GapJump","seekingEventReceived","hasPlayed","smallGapLimit","gapDetectionThreshold","_getIndex","jumpTo","jumpSize","isGapSmall","BROWSER_GAP_TOLERANCE","useGapJump","isSafari","end_type","video_postion","platform","onGapJump","threshold","bufferedInfo","_getBuffered","WaitingTimeoutJump","jumpCnt","jumpCntMax","useWaitingTimeoutJump","onJump","waitingTime","TestSpeed","speedList","speedListCache","speed","appendList","openSpeed","loadSize","testCnt","testTimeStep","testSpeedUrl","cnt","xhr","headers","Range","setRequestHeader","onreadystatechange","getResponseHeader","testSpeed","saveSpeedMax","shift","realTimeSpeed","updateSpeed","getSpeed","avgSpeed","_onRealSpeedChange","DefaultPreset","_this$plugins","_this$plugins2","_this$plugins3","simulateMode","contolsIcons","TimeIcon","FullScreen","RotateIcon","PlaybackRateIcon","DownLoadIcon","ScreenShotIcon","PIPIcon","layers","Miniscreen","Xglogger","Mobile","PresetPlayer","_Player"],"mappings":"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"}