xgplayer 3.1.0-alpha.1 → 3.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/es/defaultConfig.js +1 -0
- package/es/player.js +6 -5
- package/package.json +1 -1
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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/mediaProxy.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/lang/i18n.js","../src/lang/en.js","../src/state.js","../src/player.js","../src/plugins/controls/index.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/common/iconTools.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/time/timesegments.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/plugins/fpsDetect/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 : 0\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 { {[propName: string]: any} } [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}\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\nutil.isNotNull = function (val) {\n return !(val === undefined || val === null)\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<any>} 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<string> } [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 }\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 if (e.touches && e.touches.length > 0) {\n e = e.touches[0]\n }\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\nutil.isBlob = function (url) {\n return typeof url === 'string' && /^blob/.test(url)\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\nutil.createEvent = function (eventName) {\n let event\n if (typeof window.Event === 'function') {\n event = new Event(eventName)\n } else {\n event = document.createEvent('Event')\n event.initEvent(eventName, true, true)\n }\n return event\n}\n\n/**\n * @description Adjust currentTime according to duration, when ended is true and currentTime is less than duration, or\n * currentTime is greater than duration, return duration\n * @param { number } time\n * @param { number } duration\n * @param { boolean } isEnded\n * @returns { number } Adjusted time\n */\nutil.adjustTimeByDuration = function (time, duration, isEnded) {\n if (!duration || !time) {\n return time\n }\n if (time > duration || (isEnded && time < duration)) {\n return duration\n }\n return time\n}\n\nutil.createPositionBar = function (className, root) {\n const dom = util.createDom(\n 'xg-bar',\n '',\n { 'data-index': -1 },\n className\n )\n root.appendChild(dom)\n return dom\n}\n\nutil.getTransformStyle = function (pos = { x: 0, y: 0, scale: 1, rotate: 0 }, transformValue = '') {\n const styles = {\n scale: `${pos.scale || 1}`,\n translate: `${pos.x || 0}%, ${pos.y || 0}%`,\n rotate: `${pos.rotate || 0}deg`\n }\n const stylesKeys = Object.keys(styles)\n\n // 只复写Transform中已知的函数,对于其他函数不修改。解决全屏或者rotate插件执行时,对于镜像插件的影响\n stylesKeys.forEach((key) => {\n const reg = new RegExp(`${key}\\\\([^\\\\(]+\\\\)`, 'g') // reg match: TransformFunc(values)\n const fn = `${key}(${styles[key]})`\n if (reg.test(transformValue)) {\n reg.lastIndex = -1\n transformValue = transformValue.replace(reg, fn)\n } else {\n transformValue += `${fn} `\n }\n })\n return transformValue\n}\n\n/**\n * @description 角度换算\n * @param {number} val\n * @returns {number}\n */\nutil.convertDeg = function (val) {\n if (Math.abs(val) <= 1) {\n return val * 360\n }\n return val % 360\n}\n\nutil.getIndexByTime = function (time, segments) {\n const _len = segments.length\n let _index = -1\n if (_len < 1) {\n return _index\n }\n if (time <= segments[0].end || _len < 2) {\n _index = 0\n } else if (time > segments[_len - 1].end) {\n _index = _len - 1\n } else {\n for (let i = 1; i < _len; i++) {\n if (time > segments[i - 1].end && time <= segments[i].end){\n _index = i\n break\n }\n }\n }\n return _index\n}\nutil.getOffsetCurrentTime = function (currentTime, segments, index = -1) {\n let _index = -1\n if (index >= 0 && index < segments.length) {\n _index = index\n } else {\n _index = util.getIndexByTime(currentTime, segments)\n }\n if (_index < 0) {\n return -1\n }\n const _len = segments.length\n const { start, end, cTime, offset } = segments[_index]\n if (currentTime < start) {\n return cTime\n } else if (currentTime >= start && currentTime <= end) {\n return currentTime - offset\n } else if (currentTime > end && _index >= _len - 1) {\n return end\n }\n return -1\n}\n\n/**\n *\n * @param {*} offsetTime\n * @param {*} segments\n * @returns\n */\nutil.getCurrentTimeByOffset = function (offsetTime, segments) {\n let _index = -1\n if (!segments || segments.length < 0) {\n return offsetTime\n }\n for (let i = 0; i < segments.length; i++) {\n if (offsetTime <= segments[i].duration) {\n _index = i\n break\n }\n }\n if (_index !== -1) {\n const { start } = segments[_index]\n if (_index - 1 < 0) {\n return start + offsetTime\n } else {\n return start + (offsetTime - segments[_index - 1].duration)\n }\n }\n return offsetTime\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<MediaCapabilitiesDecodingInfo>\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 isIpad = /(?:iPad|PlayBook)/.test(ua) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)\n const isTablet =\n isIpad ||\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 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 * @description check is support MediaSource Extends\n * @param {string} [mime]\n * @returns { boolean }\n */\n isMSESupport (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n if (typeof MediaSource === 'undefined' || !MediaSource) return false\n try {\n return MediaSource.isTypeSupported(mime)\n } catch (error) {\n this._logger.error(mime, error)\n return false\n }\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<MediaCapabilitiesDecodingInfo> }\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: 'media',\n 2: 'media',\n 3: 'media',\n 4: 'media',\n 5: 'media',\n 6: 'media'\n}\n\nconst ERROR_MAP = {\n 1: 5101,\n 2: 5102,\n 3: 5103,\n 4: 5104,\n 5: 5105,\n 6: 5106\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.media) {\n const mediaError = errorInfo.mediaError ? errorInfo.mediaError : (player.media.error || {})\n const { duration, currentTime, ended, src, currentSrc } = player\n const { readyState, networkState } = player.media\n let _errc = errorInfo.errorCode || mediaError.code\n if (ERROR_MAP[_errc]) {\n _errc = ERROR_MAP[_errc]\n }\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: _errc,\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 LOADED_METADATA = 'loadedmetadata'\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 SOURCE_ERROR = 'source_error'\n\nexport const SOURCE_SUCCESS = 'source_success'\n\nexport const SWITCH_SUBTITLE = 'switch_subtitle'\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 'loadedmetadata',\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\nexport const FPS_STUCK = 'fps_stuck'","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, SOURCE_ERROR, SOURCE_SUCCESS } 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 * } } IMediaProxy\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.media && player.media.currentTime\n }\n\n // 避免playbackRate和defaultPlaybackRate同时设置导致多次触发事件\n if (eventKey === 'ratechange') {\n const _rate = player.media ? player.media.playbackRate : 0\n if (_rate && player._rate === _rate) {\n return\n }\n player._rate = player.media && player.media.playbackRate\n }\n\n if (eventKey === 'durationchange') {\n player._duration = player.media.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.mediaEventMiddleware[eventKey]) {\n const callback = emitVideoEvent.bind(player, eventKey, eData)\n try {\n player.mediaEventMiddleware[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 MediaProxy 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.mediaConfig = 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: options.tabindex | 0,\n mediaType: options.mediaType || 'video',\n 'data-index': -1\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.mediaConfig['x5-video-player-type'] = playerType\n delete this.mediaConfig.playsinline\n delete this.mediaConfig['webkit-playsinline']\n delete this.mediaConfig['x5-playsinline']\n }\n\n if (options.loop) {\n this.mediaConfig.loop = 'loop'\n }\n\n // Warning:一些移动端浏览器需要设置DOM属性,否则会导致非静音切换频地址后开播失败\n if (options.autoplayMuted && !Object.prototype.hasOwnProperty.call(this.mediaConfig, 'muted')) {\n this.mediaConfig.muted = true\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n */\n this.media = Util.createDom(this.mediaConfig.mediaType, '', this.mediaConfig, '')\n\n if (options.defaultPlaybackRate) {\n this.media.defaultPlaybackRate = this.media.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.media.muted = true\n this._lastMuted = true\n }\n if (options.autoplay) {\n this.media.autoplay = true\n }\n\n /**\n * @private\n */\n this._interval = {}\n /**\n * @readonly\n */\n this.mediaEventMiddleware = {}\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.mediaEventMiddleware[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.mediaEventMiddleware[key]\n })\n }\n\n /**\n * Add media eventListener to the video object\n * @param { any } [media]\n */\n attachVideoEvents (media = this.media) {\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 media.addEventListener(eventKey, item[eventKey], false)\n })\n }\n\n /**\n * @description remove media eventListener from the video object\n * @param { any } [media]\n */\n detachVideoEvents (media = this.media) {\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n media.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 video.load()\n urls.forEach((item, index) => {\n this.media.appendChild(Util.createDom('source', '', {\n src: `${item.src}`,\n type: `${item.type || ''}`,\n 'data-index': index + 1\n }))\n })\n const _c = video.children\n if (!_c) {\n return\n }\n /**\n * @private\n */\n this._videoSourceCount = _c.length\n\n this._videoSourceIndex = _c.length\n\n this._vLoadeddata = (e) => {\n this.emit(SOURCE_SUCCESS, { src: e.target.currentSrc, host: Util.getHostFromUrl(e.target.currentSrc) })\n }\n\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 // safari有些版本不是所有source都请求,导致单独使用_videoSourceIndex计算会报错\n !this._sourceError && (this._sourceError = (e) => {\n const _dIndex = parseInt(e.target.getAttribute('data-index'), 10)\n this._videoSourceIndex--\n if (this._videoSourceIndex === 0 || _dIndex >= this._videoSourceCount) {\n const _err = { code: 4, message: 'sources_load_error' }\n _eHandler ? _eHandler.error(e, _err) : this.errorHandler('error', _err)\n }\n const type = ERROR_TYPE_MAP[4]\n this.emit(SOURCE_ERROR, new Errors(this, {\n errorType: type,\n errorCode: 4,\n errorMessage: 'sources_load_error',\n mediaError: { code: 4, message: 'sources_load_error' },\n src: e.target.src\n }))\n })\n for (let i = 0; i < _c.length; i++) {\n _c[i].addEventListener('error', this._sourceError)\n }\n video.addEventListener('loadeddata', this._vLoadeddata)\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 this._vLoadeddata && video.removeEventListener('loadeddata', this._vLoadeddata)\n }\n\n /**\n * @description Media Error handler\n * @param { string } eventName\n */\n errorHandler (name, error = null) {\n if (this.media && (this.media.error || error)) {\n let _e = this.media.error || error\n const type = _e.code ? ERROR_TYPE_MAP[_e.code] : 'other'\n let message = _e.message\n if (!this.media.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.media) {\n if (this.media.pause) {\n this.media.pause()\n this.media.muted = true\n }\n this.media.removeAttribute('src') // empty source\n this.media.load()\n }\n this._currentTime = 0\n this._duration = 0\n this.mediaConfig = 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.media = null\n this.mediaEventMiddleware = {}\n this.removeAllListeners()\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media\n */\n get video () {\n return this.media\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media= xx\n */\n set video (media) {\n this.media = media\n }\n\n /**\n *\n * @returns { Promise<void> | null }\n */\n play () {\n const ret = this.media ? this.media.play() : null\n return ret\n }\n\n pause () {\n this.media && this.media.pause()\n }\n\n load () {\n this.media && this.media.load()\n }\n\n /**\n *\n * @param { string } type\n * @returns { boolean }\n */\n canPlayType (type) {\n return this.media ? this.media.canPlayType(type) : false\n }\n\n /**\n *\n * @param { any } [buffered]\n * @returns { Array<number> }\n */\n getBufferedRange (buffered) {\n const range = [0, 0]\n if (!this.media) {\n return range\n }\n if (!buffered) {\n buffered = this.media.buffered\n }\n const currentTime = this.media.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.media && (this.media.autoplay = isTrue)\n }\n\n get autoplay () {\n return this.media ? this.media.autoplay : false\n }\n\n /**\n * @type { TimeRanges | null }\n * @description 返回当前缓冲的TimeRange对象集合\n */\n get buffered () {\n return this.media ? this.media.buffered : null\n }\n\n /**\n * @type { Array<{start: number, end: number}> | null}\n * @description 返回当前自定义的缓存列表\n */\n get buffered2 () {\n return this.media && this.media.buffered ? Util.getBuffered2(this.media.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.media) {\n return ret\n }\n const _buffered = this.media.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.media ? this.media.crossOrigin : ''\n }\n\n set crossOrigin (isTrue) {\n this.media && (this.media.crossOrigin = isTrue)\n }\n\n /**\n * @type { string }\n * @description 设置/返回视频播放地址\n * */\n get currentSrc () {\n return this.media ? this.media.currentSrc : ''\n }\n\n set currentSrc (src) {\n this.media && (this.media.currentSrc = src)\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频当前播放时间\n * */\n get currentTime () {\n if (!this.media) {\n return 0\n }\n return this.media.currentTime !== undefined ? this.media.currentTime : this._currentTime\n }\n\n set currentTime (time) {\n this.media && (this.media.currentTime = time)\n }\n\n /**\n * @type { boolean }\n * 设置/返回视频默认静音\n * */\n get defaultMuted () {\n return this.media ? this.media.defaultMuted : false\n }\n\n set defaultMuted (isTrue) {\n this.media && (this.media.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.media ? this.media.ended : false\n }\n\n /**\n * @type { MediaError }\n * @description the player current error\n */\n get error () {\n return this.media.error\n }\n\n /**\n * @type { string }\n * @description return error description text\n */\n get errorNote () {\n const err = this.media.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.media.error.code - 1]\n }\n\n /**\n * @type { boolean }\n * @description 否开启了循环播放\n */\n get loop () {\n return this.media ? this.media.loop : false\n }\n\n set loop (isTrue) {\n this.media && (this.media.loop = isTrue)\n }\n\n /**\n * @type { boolean }\n * @description 静音\n */\n get muted () {\n return this.media ? this.media.muted : false\n }\n\n set muted (isTrue) {\n if (!this.media || this.media.muted === isTrue) {\n return\n }\n this._lastMuted = this.media.muted\n this.media.muted = isTrue\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 }\n * @description 返回视频的当前网络状态\n */\n get networkState () {\n return this.media.networkState\n }\n\n /**\n * @type { boolean }\n * @description 回当前视频是否是暂停状态\n */\n get paused () {\n return this.media ? this.media.paused : true\n }\n\n /**\n * @type { number }\n * @description 返回/设置倍速\n */\n get playbackRate () {\n return this.media ? this.media.playbackRate : 0\n }\n\n set playbackRate (rate) {\n if (!this.media || rate === Infinity) {\n return\n }\n this.media.defaultPlaybackRate = rate\n this.media.playbackRate = rate\n }\n\n /**\n * @type { TimeRanges | null}\n */\n get played () {\n return this.media ? this.media.played : null\n }\n\n /**\n * @type { boolean }\n */\n get preload () {\n return this.media ? this.media.preload : false\n }\n\n set preload (isTrue) {\n this.media && (this.media.preload = isTrue)\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 | 4 }\n * @description 回视频的就绪状态\n */\n get readyState () {\n return this.media.readyState\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否可以seek\n */\n get seekable () {\n return this.media ? this.media.seekable : false\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否处于seeking状态下\n */\n get seeking () {\n return this.media ? this.media.seeking : false\n }\n\n /**\n * @type { any }\n * @description 设置/返回当前视频的地址\n */\n get src () {\n return this.media ? this.media.src : ''\n }\n\n set src (url) {\n if (!this.media) {\n return\n }\n this.emit(URL_CHANGE, url)\n this.emit(WAITING)\n // this.media.pause()\n this._currentTime = 0\n this._duration = 0\n // Some firefox versions firefox Cannot recognize currentSrc of type Blob\n if (Util.isMSE(this.media)) {\n this.onWaiting()\n return\n }\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array') {\n this._attachSourceEvents(this.media, url)\n } else if (url) {\n this.media.src = url\n } else {\n this.media.removeAttribute('src')\n }\n this.load()\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频的音量\n */\n get volume () {\n return this.media ? this.media.volume : 0\n }\n\n set volume (vol) {\n if (vol === Infinity || !this.media) {\n return\n }\n this.media.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 MediaProxy\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<string> } [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<string> } 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<any> } 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<any> } 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<String> } 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<string> } querySelector\n * @param { string | Array<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<string> } querySelector\n * @param { string | Array<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 <any> } 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(player.config.mediaType, player.config.codecType)) {\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 BUILTIN_CLASS: 'xgplayer-built-in',\n MOBILE: 'xgplayer-mobile',\n MINI: 'xgplayer-mini' // mini screen play status\n}\n","import { getLang } from './utils/util'\n\n/**\n * @typedef { string | MediaStream | Array<{src: string, type?:string, [propName: string]: any}> } IUrl\n */\n\n/**\n * @typedef {{\n * url: IUrl,\n * definition: any,\n * bitrate?: number,\n * bandwidth?: number,\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?: IUrl,\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'|'contain',\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 * preProcessUrl?: (url: IUrl, ext?: { [propName: string]: any }) => { url: IUrl, [propName: string]: 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<number> | { [propName: string]: any },\n * definition?: { list: Array<IDefinition> , 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<any>,\n * tabindex?: number,\n * thumbnail?: {\n * urls: Array<string>,\n * pic_num: number,\n * col: number,\n * row: number,\n * height?: number,\n * width?: number,\n * },\n * videoConfig?: { [propName: string]: any },\n * isHideTips?: boolean,\n * minWaitDelay?: number,\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 isCustomRoot: true, // 是否是自定义root\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: true, // 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.media.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 preProcessUrl: null, // url preprocessing callback\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 tabindex: 0, // The order of mediaElement focus\n thumbnail: null, // Preview image configuration\n videoConfig: {}, // video attribute configuration\n isHideTips: false, // if hide the icon tips\n minWaitDelay: 200, // The min threshold of waiting delay time\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","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<string>, // 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<IXGI18nText> } 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<string> }\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","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 MediaProxy from './mediaProxy'\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 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 * @typedef { import ('./defaultConfig').IUrl } IUrl\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 MediaProxy {\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 const { presets } = this.config\n if (presets.length) {\n const defaultIdx = presets.indexOf('default')\n if (defaultIdx >= 0 && defaultPreset) {\n presets[defaultIdx] = defaultPreset\n }\n } else if (defaultPreset) {\n 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._useAutoplay = false\n /**\n * @description 记录起播需要seek的时间点\n * @private\n * @readonly\n */\n this.__startTime = -1\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 this.timeSegments = []\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 this.videoPos = {\n pi: 1, // 宽高比\n scale: 0,\n rotate: -1,\n x: 0,\n y: 0,\n h: -1, // 高度占比\n w: -1, // 宽度占比\n vy: 0, // 画面在y方向的偏移\n vx: 0 // 画面在x方向的偏移\n }\n\n this.sizeInfo = {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\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 * @description 播放器时长、播放时间偏移信息\n */\n this._offsetInfo = {\n currentTime: -1,\n duration: 0\n }\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 控制栏和video不同布局的时候内部容器\n */\n this.innerContainer = 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 /**\n * @private\n * @description seek之后canplay回调函数定义\n * @type { Function | null }\n */\n this._onceSeekCanplay = null\n\n /**\n * @description 记录seek之前是否处于暂停状态\n * @type { number }\n * @private\n */\n this._isPauseBeforeSeek = 0\n\n /**\n * @description 内部状态记录\n * @type { {\n * isActiveLocked: boolean;\n * } }\n * @readonly\n */\n this.innerStates = {\n // 当前的active是否是锁定状态\n isActiveLocked: false\n }\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 const { id, el, isCustomRoot, controls, autoplay, isMobileSimulateMode } = this.config\n this.root = id ? document.getElementById(id) : null\n if (!this.root) {\n if (el && el.nodeType === 1) {\n this.root = el\n } else if (isCustomRoot) {\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 } else {\n this.root = Util.createDom('div', '', { id, class: STATE_CLASS.BUILTIN_CLASS })\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.mediaConfig.mediaType === XgVideoProxy.mediaType) {\n const el = this.innerContainer || this.root\n this.detachVideoEvents(this.media)\n const _nVideo = new XgVideoProxy(el, this.config, this.mediaConfig)\n this.attachVideoEvents(_nVideo)\n this.media = _nVideo\n }\n this.media.setAttribute(PLATER_ID, this.playerId)\n const device = isMobileSimulateMode === 'mobile' ? 'mobile' : Sniffer.device\n this.addClass(\n `${STATE_CLASS.DEFAULT} ${STATE_CLASS.INACTIVE} xgplayer-${device} ${\n controls ? '' : STATE_CLASS.NO_CONTROLS\n }`\n )\n if (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 const { width, height, left, top } = this.root.getBoundingClientRect()\n this.sizeInfo.width = width\n this.sizeInfo.height = height\n this.sizeInfo.left = left\n this.sizeInfo.top = top\n return true\n }\n\n /**\n * @private\n */\n _initBaseDoms () {\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.topBar = null\n /**\n * @readonly\n * @type { HTMLElement |null }\n */\n this.leftBar = null\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.rightBar = null\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\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.media.addEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.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.media.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.media.removeEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.removeEventListener('webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n /**\n *\n * @param { any } url\n * @returns\n */\n _startInit (url) {\n if (!this.media) {\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.media)\n if (Util.typeOf(url) === 'Array' && url.length > 0) {\n this._attachSourceEvents(this.media, url)\n } else if (!this.media.src || this.media.src !== url) {\n this.media.src = url\n } else if (!url) {\n this.media.removeAttribute('src')\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.media instanceof window.Element && !_root.contains(this.media)) {\n _root.insertBefore(this.media, _root.firstChild)\n }\n\n const { readyState } = this.media\n XG_DEBUG.logInfo('_startInit readyState', readyState)\n if (this.config.autoplay) {\n !Util.isMSE(this.media) && this.load();\n // ios端无法自动播放的场景下,不调用play不会触发canplay loadeddata等事件\n (Sniffer.os.isIpad || Sniffer.os.isPhone) && this.mediaPlay()\n }\n\n const { startTime } = this.config\n this.__startTime = startTime > 0 ? startTime : -1\n this.config.startTime = 0\n if (readyState >= 2 && this.duration > 0) {\n this.canPlayFunc()\n } else {\n this.on(Events.CANPLAY, this.canPlayFunc)\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(this, () => {\n this.emit(Events.COMPLETE)\n }, 0)\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 if (!this.rightBar) {\n this.rightBar = Util.createPositionBar('xg-right-bar', this.root)\n }\n _root = this.rightBar\n break\n case POSITIONS.ROOT_LEFT:\n if (!this.leftBar) {\n this.leftBar = Util.createPositionBar('xg-left-bar', this.root)\n }\n _root = this.leftBar\n break\n case POSITIONS.ROOT_TOP:\n if (!this.topBar) {\n this.topBar = Util.createPositionBar('xg-top-bar', this.root)\n if (this.config.topBarAutoHide) {\n Util.addClass(this.topBar, STATE_CLASS.TOP_BAR_AUTOHIDE)\n }\n }\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 = PLUFGIN.pluginName === 'controls' ? this.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> | void }\n * @description 启动播放器,start一般都是播放器内部隐式调用,主要功能是将video添加到DOM\n */\n start (url) {\n // 已经开始初始化播放了 则直接调用play\n if (this.state > STATES.ATTACHING) {\n return\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 _furl = this.preProcessUrl(url)\n const ret = this._startInit(_furl.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 | {\n * seamless?: boolean,\n * currentTime?: number,\n * bitrate?: number\n * } } [options]\n * @returns { Promise | null } 执行结果\n */\n switchURL (url, options) {\n let _src = url\n if (Util.typeOf(url) === 'Object') {\n _src = url.url\n }\n _src = this.preProcessUrl(_src).url\n const curTime = this.currentTime\n this.__startTime = curTime\n const isPaused = this.paused && !this.isError\n this.src = _src\n return new Promise((resolve, reject) => {\n const _error = (e) => {\n this.off('timeupdate', _canplay)\n this.off('canplay', _canplay)\n reject(e)\n }\n const _canplay = () => {\n if (this.duration > 0 && this.__startTime > 0) {\n this.currentTime = this.__startTime\n this.__startTime = -1\n }\n if (isPaused) {\n this.pause()\n }\n this.off('error', _error)\n resolve(true)\n }\n this.once('error', _error)\n if (!_src){\n this.errorHandler('error', {code: 6, message: 'empty_src'})\n return\n }\n if (Sniffer.os.isAndroid) {\n this.once('timeupdate', _canplay)\n } else {\n this.once('canplay', _canplay)\n }\n this.play()\n })\n }\n\n /**\n * @description call play without play hook\n * @deprecated this api renamed to mediaPlay, you can call it as player.mediaPlay()\n */\n videoPlay () {\n this.mediaPlay()\n }\n\n /**\n * @description call play without play hook\n */\n mediaPlay () {\n if (!this.hasStart && this.state < STATES.ATTACHED) {\n this.removeClass(STATE_CLASS.NO_START)\n this.addClass(STATE_CLASS.ENTER)\n this.start()\n this._useAutoplay = true\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.media && this.media.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 /**\n * @description call play without pause hook\n */\n mediaPause () {\n super.pause()\n }\n\n /**\n * @description call play without pause hook\n * @deprecated this api renamed to mediaPause, you can call it as player.mediaPause()\n */\n videoPause () {\n super.pause()\n }\n\n play () {\n this.removeClass(STATE_CLASS.PAUSED)\n return runHooks(this, 'play', () => {\n return this.mediaPlay()\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.media || Number.isNaN(Number(time)) || !this.hasStart) {\n return\n }\n const { isSeekedPlay, seekedStatus } = this.config\n const _status = status || (isSeekedPlay ? 'play' : seekedStatus)\n time = time < 0 ? 0 : time > this.duration ? parseInt(this.duration, 10) : time\n\n !this._isPauseBeforeSeek && (this._isPauseBeforeSeek = this.paused ? 2 : 1)\n\n this._onceSeekCanplay && this.off(Events.SEEKED, this._onceSeekCanplay)\n\n this._onceSeekCanplay = () => {\n // const { seekedStatus } = this.config\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._isPauseBeforeSeek > 1 || this.paused ? this.pause() : this.play()\n }\n this._isPauseBeforeSeek = 0\n this._onceSeekCanplay = null\n }\n\n this.once(Events.SEEKED, this._onceSeekCanplay)\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n this.currentTime = time\n // 未起播状态不论希望保持什么状态,都要触发一次play, 避免ios下起播异常问题\n 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 { import('./defaultConfig').IDefinition } 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 if (to?.bitrate && typeof to.bitrate !== 'number') {\n to.bitrate = parseInt(to.bitrate, 10) || 0\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 seamless: definition.seamless !== false\n && typeof MediaSource !== 'undefined'\n && typeof MediaSource.isTypeSupported === 'function',\n ...to\n })\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._useAutoplay = false\n this.mediaPause()\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.NO_START)\n this.emit(Events.RESET)\n }\n\n /**\n * 重置播放实例\n * @param { Array<string> } 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, media } = this\n if (!root || !media) {\n return\n }\n this.hasStart = false\n this._useAutoplay = false\n root.removeAttribute(PLATER_ID)\n this.updateAcc('destroy')\n this._unbindEvents()\n this._detachSourceEvents(this.media)\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 media instanceof window.Node &&\n root.contains(media) &&\n root.removeChild(media);\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 const isBuildIn = Util.hasClass(this.root, STATE_CLASS.BUILTIN_CLASS)\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 // 内建的root,在销毁的时候需要移除\n isBuildIn && this.root.parentNode && this.root.parentNode.removeChild(this.root)\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.SEEKED, () => {\n const playPromise = this.mediaPlay()\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 const { url } = this.config\n const _srcRet = !Util.isMSE(this.media) ? this.preProcessUrl(url) : { url }\n this.src = _srcRet.url\n !this.config.isLive && (this.currentTime = cur)\n this.once(Events.CANPLAY, () => {\n this.mediaPlay()\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<void> }\n */\n getFullscreen (el = this.config.fullscreenTarget) {\n const { root, media } = 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 Promise.resolve()\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 (media.fullscreenEnabled || media.webkitSupportsFullscreen) {\n media.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<void> }\n */\n exitFullscreen (el) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n }\n if (!this._fullscreenEl && !Util.getFullScreenEl()) {\n return\n }\n const { root, media } = 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 (media && media.webkitSupportsFullscreen) {\n media.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 = this.config.fullscreenTarget) {\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._rootStyle = this.root.getAttribute('style')\n this.root.style.width = `${window.innerHeight}px`\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 if (this._rootStyle) {\n this.root.style.style = this._rootStyle\n this._rootStyle = false\n }\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 * isLock?: boolean // 是否锁定, 锁定之后自动呼出和blur调用都不生效, 默认值false\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, isLock?: boolean } } [data]\n * @returns\n */\n onFocus (data = { autoHide: true, delay: 3000 }) {\n const { innerStates } = this\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 (data.isLock !== undefined) {\n innerStates.isActiveLocked = data.isLock\n }\n if (data.autoHide === false || data.isLock === true || innerStates.isActiveLocked) {\n if (this.userTimer) {\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n return\n }\n const time = data && data.delay ? data.delay : this.config.inactive\n this.userTimer = Util.setTimeout(this, () => {\n this.userTimer = null\n this.blur()\n }, time)\n }\n\n /**\n * @protected\n * @param {{ ignorePaused?: boolean }} [data]\n * @returns\n */\n onBlur ({ ignorePaused = false } = {}) {\n if (!this.isActive || this.innerStates.isActiveLocked) {\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, defaultPlaybackRate } = this.config\n\n XG_DEBUG.logInfo('player', 'canPlayFunc, startTime', this.__startTime)\n if (this.__startTime > 0 && this.duration > 0) {\n this.currentTime = this.__startTime > this.duration ? this.duration : this.__startTime\n this.__startTime = -1\n }\n\n // 解决浏览器安装了一些倍速扩展插件的情况下,倍速设置失效问题\n this.playbackRate = defaultPlaybackRate;\n\n (autoplay || this._useAutoplay) && this.mediaPlay()\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.media.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.media.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.media\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.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.ERROR)\n this.removeClass(STATE_CLASS.LOADING)\n this.isCanplay = true\n this.waitTimer && Util.clearTimeout(this, this.waitTimer)\n }\n\n onDurationchange () {\n if (this.__startTime > 0 && this.duration > 0) {\n this.currentTime = this.__startTime\n this.__startTime = -1\n }\n }\n\n onLoadeddata () {\n this.isError = false\n this.isSeeking = false\n }\n\n onLoadstart () {\n this.removeClass(STATE_CLASS.ERROR)\n this.isCanplay = 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 }, this.config.minWaitDelay)\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 if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n /**\n * @protected\n */\n onTimeupdate () {\n !this._videoHeight && this.media.videoHeight && this.resize()\n if ((this.waitTimer || this.hasClass(STATE_CLASS.LOADING)) &&\n this.media.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.media || !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.media.buffered\n if (!buffered || buffered.length === 0 || !this.duration) {\n return true\n }\n const currentTime = time || this.media.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 resizePosition () {\n const { rotate, vy, vx, h, w } = this.videoPos\n if (rotate < 0 && !vy && !vx) {\n return\n }\n let _pi = this.videoPos._pi\n if (!_pi && this.media.videoHeight) {\n _pi = this.media.videoWidth / this.media.videoHeight * 100\n }\n if (!_pi) {\n return\n }\n this.videoPos.pi = _pi\n const _pos = {\n rotate: rotate\n }\n let offsetY = 0\n let offsetX = 0\n let scale = 1\n const _t = rotate < 0 ? 0 : Math.abs(rotate / 90)\n const { root, innerContainer } = this\n const width = root.offsetWidth\n const height = innerContainer ? innerContainer.offsetHeight : root.offsetHeight\n let rHeight = height\n let rWidth = width\n if (_t % 2 === 0) {\n scale = h > 0 ? 100 / h : (w > 0 ? 100 / w : 1)\n _pos.scale = scale\n offsetY = vy > 0 ? (100 - h) / 2 - vy : 0\n _pos.y = _t === 2 ? 0 - offsetY : offsetY\n offsetX = vx > 0 ? (100 - w) / 2 - vx : 0\n _pos.x = _t === 2 ? 0 - offsetX : offsetX\n this.media.style.width = `${rWidth}px`\n this.media.style.height = `${rHeight}px`\n } else if (_t % 2 === 1) {\n rWidth = height\n rHeight = width\n const offset = height - width\n offsetX = -offset / 2 / rWidth * 100\n _pos.x = _t === 3 ? offsetX + vy / 2 : offsetX - vy / 2\n offsetY = offset / 2 / rHeight * 100\n _pos.y = _t === 3 ? offsetY + vx / 2 : offsetY - vx / 2\n _pos.scale = scale\n this.media.style.width = `${rWidth}px`\n this.media.style.height = `${rHeight}px`\n }\n const formStyle = Util.getTransformStyle(_pos, this.media.style.transform || this.media.style.webkitTransform)\n this.media.style.transform = formStyle\n this.media.style.webkitTransform = formStyle\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.media || !pos || !pos.h) {\n return\n }\n const { videoPos } = this\n videoPos.h = pos.h * 100 || 0\n videoPos.w = pos.w * 100 || 0\n videoPos.vx = pos.x * 100 || 0\n videoPos.vy = pos.y * 100 || 0\n this.resizePosition()\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 runHooks(this, 'playnext', () => {\n this.start()\n this.emit(Events.PLAYNEXT, config)\n })\n }\n\n resize () {\n if (!this.media) {\n return\n }\n const containerSize = this.root.getBoundingClientRect()\n this.sizeInfo.width = containerSize.width\n this.sizeInfo.height = containerSize.height\n this.sizeInfo.left = containerSize.left\n this.sizeInfo.top = containerSize.top\n const { videoWidth, videoHeight } = this.media\n const { fitVideoSize, videoFillMode } = this.config\n\n if (videoFillMode === 'fill' || videoFillMode === 'cover' || videoFillMode === 'contain') {\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 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.resizePosition()\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.media.updateObjectPosition) {\n this.media.updateObjectPosition(left, top)\n return\n }\n this.media.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 * @description url preprocessing\n * @param { IUrl } url\n * @param { {[propName: string]: any} } [ext]\n * @returns { url: IUrl, [propName: string]: any }\n */\n preProcessUrl (url, ext) {\n const { preProcessUrl } = this.config\n return !Util.isBlob(url) && preProcessUrl && typeof preProcessUrl === 'function' ? preProcessUrl(url, ext) : { url }\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.<IDefinition> }\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.media || !this.media.getVideoPlaybackQuality) {\n return ret\n }\n const _quality = this.media.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 { null | Object }\n * @readonly\n * @description 控制栏插件\n */\n get controls () {\n return this.plugins.controls\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 get readyState () {\n return super.readyState\n }\n\n get error () {\n const key = super.error\n return this.i18n[key] || key\n }\n\n get networkState () {\n return super.networkState\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 { acc, t } = this._accPlayed\n return t ? new Date().getTime() - t + acc : 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 * @type {number}\n * @description Media element rotation angle, Only multiples of 90 degrees are supported\n */\n set videoRotateDeg (val) {\n val = Util.convertDeg(val)\n if (val % 90 !== 0 || val === this.videoPos.rotate) {\n return\n }\n this.videoPos.rotate = val\n this.resizePosition()\n }\n\n get videoRotateDeg () {\n return this.videoPos.rotate\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 get offsetCurrentTime () {\n return this._offsetInfo.currentTime || 0\n }\n\n set offsetCurrentTime (val) {\n this._offsetInfo.currentTime = val\n }\n\n get offsetDuration () {\n return this._offsetInfo.duration || 0\n }\n\n set offsetDuration (val) {\n this._offsetInfo.duration = val || 0\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<any> } 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<any> } 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<any> } 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<any> } 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 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 = (e) => {\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 this.root.style.display = ''\n this.player.focus()\n }\n\n hide () {\n this.root.style.display = 'none'\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 `<xg-controls class=\"${className}\" unselectable=\"on\">\n <xg-inner-controls class=\"xg-inner-controls xg-pos\">\n <xg-left-grid class=\"xg-left-grid\">\n </xg-left-grid>\n <xg-center-grid class=\"xg-center-grid\"></xg-center-grid>\n <xg-right-grid class=\"xg-right-grid\">\n </xg-right-grid>\n </xg-inner-controls>\n </xg-controls>`\n }\n}\n\nexport default Controls\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 waitTimeout: 10000\n }\n }\n\n afterCreate () {\n this._onReset()\n this._waitType = 'firstFrame'\n\n this._initOnceEvents()\n\n this.newPointTime = now()\n // 初始化到首帧耗时 new -> loadeddata\n this.loadedCostTime = 0\n // 初始化到开始请求耗时 new -> loadstart\n this.startCostTime = 0\n\n this.on(Events.LOAD_START, () => {\n const { _state } = this\n const { autoplayStart, isFFSend } = _state\n this.startCostTime = now() - this.newPointTime\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOAD_START`, `autoplayStart:${autoplayStart} isFFSend:${isFFSend} startCostTime:${this.startCostTime} newPointTime${this.newPointTime}`)\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 // 首帧耗时 loadstart -> loadeddata\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 this.loadedCostTime = this.vt - this.newPointTime\n const { isTimeUpdate, isFFSend, autoplayStart } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOADED_DATA`, `fvt:${this.fvt} isTimeUpdate:${this._state.isTimeUpdate} loadedCostTime:${this.loadedCostTime}`)\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, startCostTime: this.startCostTime, loadedCostTime: this.loadedCostTime })\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.newPointTime = now()\n this.loadedCostTime = 0\n this.startCostTime = 0\n this._isSeeking = false\n this.seekingStart = 0\n this.waitingStart = 0\n this.fixedWaitingStart = 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.fixedWaitingStart = now()\n this._waitType = 1\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, 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 if (!this.vt) {\n this._waitType = 1\n } else if (this.seekingStart) {\n this._waitType = 2\n } else {\n this._waitType = 0\n }\n // 原始卡顿耗时起始时间\n this.fixedWaitingStart = now()\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 this._startWaitTimeout()\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, 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 }, this.config.waitTimeout)\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 const _fixedCost = _now - this.fixedWaitingStart\n const { waitTimeout } = this.config\n this._isWaiting = false\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this.emitLog(LOG_TYPES.WAIT_END, {\n fixedCostTime: _fixedCost > waitTimeout ? waitTimeout : _fixedCost,\n costTime: _cost > waitTimeout ? waitTimeout : _cost,\n type: endType === 'loadeddata' ? 1 : this._waitType,\n endType: this._waitType === 2 ? 'seek' : endType\n })\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 `<xg-replay class=\"xgplayer-replay\">\n <xg-replay-txt class=\"xgplayer-replay-txt\" lang-key=\"${this.i18nKeys.REPLAY}\">${this.i18n.REPLAY}</xg-replay-txt>\n </xg-replay>`\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 notHidden: false, // 是否一直显示\n poster: '', // 封面图地址\n fillMode: 'fixWidth', // fixWidth / fixHeight / cover / container\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 getBgSize (mode) {\n let _bg = ''\n switch (mode) {\n case 'cover':\n _bg = 'cover'\n break\n case 'container':\n _bg = 'container'\n break\n case 'fixHeight':\n _bg = 'auto 100%'\n break\n default:\n _bg = ''\n }\n return _bg ? `background-size: ${_bg};` : ''\n }\n\n render () {\n const { poster, hideCanplay, fillMode, notHidden } = this.config\n const _bg = this.getBgSize(fillMode)\n const style = poster ? `background-image:url(${poster});${_bg}` : _bg\n const className = notHidden ? 'xg-not-hidden' : (hideCanplay ? 'xg-showplay' : '')\n return `<xg-poster class=\"xgplayer-poster ${className}\" style=\"${style}\">\n </xg-poster>`\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 return AnimateMap[key].id\n}\n\nfunction clearAnimation (id) {\n if (id) {\n window.clearTimeout(id)\n return\n }\n Object.keys(AnimateMap).map(key => {\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n })\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.on(Events.RESET, () => {\n this.onPlayerReset()\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 onPlayerReset = () => {\n this.autoPlayStart = false\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 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 this._animateId = 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 this._animateId = null\n }\n })\n }\n\n endAnimate () {\n Util.removeClass(this.root, 'interact')\n clearAnimation(this._animateId)\n this._animateId = null\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 || 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 this.endAnimate()\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(this._animateId)\n }\n\n render () {\n const className = this.playerConfig.autoplay ? (this.config.mode === 'auto' ? 'auto-hide' : 'hide') : ''\n return `\n <xg-start class=\"xgplayer-start ${className}\">\n <xg-start-inner></xg-start-inner>\n </xg-start>`\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 += `<div class=\"xgplayer-enter-bar${i}\"></div>`\n }\n root.innerHTML = `<div class=\"xgplayer-enter-spinner\">${barStr}</div>`\n }\n return root\n }\n}\n\nexport default Enter\n","export function xgIconTips (plugin, textKey, isShow) {\n try {\n return ` <div class=\"xg-tips ${isShow ? 'hide' : ' '}\" lang-key=\"${plugin.i18nKeys[textKey]}\">\n ${plugin.i18n[textKey]}\n </div>`\n } catch (e) {\n return '<div class=\"xg-tips hide\"></div>'\n }\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 <xg-icon class=\"xgplayer-miniicon\">\n <div class=\"xgplayer-icon btn-text\"><span class=\"icon-text\" lang-key=\"${this.i18nKeys[langKey]}\">${this.i18n[langKey]}</span></div>\n </xg-icon>`\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 { xgIconTips } from '../common/iconTools'\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 <xg-mini-layer class=\"xg-mini-layer\">\n <xg-mini-header class=\"xgplayer-mini-header\">\n ${xgIconTips(this, 'MINI_DRAG', this.playerConfig.isHideTips)}\n </xg-mini-header>\n <div class=\"mini-cancel-btn\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <path fill=\"#fff\" fill-rule=\"evenodd\" d=\"M3.99 3.49a1 1 0 0 1 1.414 0L10 8.085l4.596-4.595a1 1 0 1 1 1.414 1.414L11.414 9.5l4.596 4.596a1 1 0 0 1 .084 1.32l-.084.094a1 1 0 0 1-1.414 0L10 10.914 5.404 15.51a1 1 0 0 1-1.414-1.414L8.585 9.5 3.99 4.904a1 1 0 0 1-.084-1.32z\"></path>\n </svg>\n </div>\n <div class=\"play-icon\">\n </div>\n </xg-mini-layer>`\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 }\n }\n\n afterCreate () {\n this._clickCount = 0\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { isMobileSimulateMode } = this.playerConfig\n if (isMobileSimulateMode === 'mobile' || (Sniffer.device === 'mobile' && !Sniffer.os.isIpad)) {\n return\n }\n this.initEvents()\n }\n\n initEvents () {\n const { media, root } = this.player\n const { enableContextmenu } = this.playerConfig\n\n root && root.addEventListener('click', this.onVideoClick, false)\n root && root.addEventListener('dblclick', this.onVideoDblClick, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.addEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n !enableContextmenu && media && media.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.media.focus()\n }\n }\n\n onMouseEnter = (e) => {\n const { playerConfig, player } = this\n !playerConfig.closeFocusVideoFocus && player.media.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.root || e.target === player.media || e.target === player.innerContainer || e.target === player.media.__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 (playerConfig.closeVideoDblclick || !e.target || (e.target !== player.media && e.target !== player.media.__canvas)) {\n return\n }\n if (!playerConfig.closeVideoClick && 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\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 root.removeEventListener('click', this.onVideoClick, false)\n root.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 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.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 } = 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 } = 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).forEach(key => {\n this.root.removeEventListener(key, this[map[key]])\n })\n }\n}\n\nexport default Touche\n\n","import Plugin, { Events, Util, Sniffer, STATES } from '../../plugin'\nimport Touche from './touch'\nimport SeekTipIcon from '../assets/seekicon.svg'\nimport { runHooks } from '../../plugin/hooksDescriptor'\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\nconst HOOKS = ['videoClick', 'videoDbClick']\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 HOOKS.map(item => {\n this.__hooks[item] = null\n })\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 === 'mouse' ? 'mouse' : 'touch'\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 /**\n * 对根节点做touchmove和touchend绑定,解决控制栏手势无作用的问题\n */\n player.root.addEventListener('touchmove', this.onRootTouchMove, true)\n player.root.addEventListener('touchend', this.onRootTouchEnd, true)\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\n const { disableGesture, gestureX } = this.config\n if (!disableGesture && gestureX) {\n this.endLastMove(pos.scope)\n setTimeout(() => {\n player.getPlugin('progress') && player.getPlugin('progress').resetSeekState()\n }, 10)\n } else {\n pos.time = 0\n }\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 clickHandler (e) {\n const { player, config, playerConfig } = this\n if (player.state < STATES.RUNNING) {\n if (!playerConfig.closeVideoClick) {\n this.sendUseAction(Util.createEvent('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.sendUseAction(Util.createEvent('click'))\n this.switchPlayPause()\n }\n player.focus()\n }\n }\n\n dbClickHandler (e) {\n const { config, player } = this\n if (!config.closedbClick && player.state >= STATES.RUNNING) {\n this.sendUseAction(Util.createEvent('dblclick'))\n this.switchPlayPause()\n }\n }\n\n onClick (e) {\n const { player } = this\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.clickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onDbClick (e) {\n const { player } = this\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.dbClickHandler(data.e)\n }, { e, paused: player.paused })\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 <xg-trigger class=\"trigger\">\n <div class=\"${className}\"></div>\n <div class=\"time-preview\">\n <div class=\"xg-seek-show ${this.config.disableSeekIcon ? ' hide-seek-icon' : ''}\">\n <i class=\"xg-seek-icon\"></i>\n <span class=\"xg-cur\">00:00</span>\n <span>/</span>\n <span class=\"xg-dur\">00:00</span>\n </div>\n <div class=\"xg-bar xg-timebar\">\n <div class=\"xg-curbar\"></div>\n </div>\n </div>\n <div class=\"xg-playbackrate xg-top-note\">\n <span><i>${this.config.pressRate}X</i>${this.i18n.FORWARD}</span>\n </div>\n </xg-trigger>\n `\n }\n}\n\nexport default MobilePlugin\n","import { BasePlugin, Events, Util } from '../../plugin'\n\n/**\n * @typedef {{\n * seekStep?: number,\n * checkVisible?: boolean,\n * disableBodyTrigger?: boolean,\n * keyCodeMap?: { [propName: string]: any },\n * disable: boolean,\n * playbackRate: number,\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: false, // 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: true, // Whether the shortcut key needs to be triggered globally\n keyCodeMap: {},\n disable: false,\n playbackRate: 2, // 长按倍速限制\n isIgnoreUserActive: true // 是否忽略用户激活状态\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', 'pressAction', 'disablePress', '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 disablePress: false,\n noBodyTarget: false\n },\n up: {\n keyCode: 38,\n action: 'upVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n down: {\n keyCode: 40,\n action: 'downVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n left: {\n keyCode: 37,\n action: 'seekBack',\n disablePress: false,\n disable: false\n },\n right: {\n keyCode: 39,\n action: 'seek',\n pressAction: 'changePlaybackRate',\n disablePress: false,\n disable: false\n },\n esc: {\n keyCode: 27,\n action: 'exitFullscreen',\n disablePress: true,\n disable: false\n }\n }\n this.mergekeyCodeMap()\n this._keyState = {\n isKeyDown: false,\n isBodyKeyDown: false,\n isPress: false,\n tt: 0,\n playbackRate: 0\n }\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 if (player.volume <= 0) {\n return\n }\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 if (player.volume >= 1) {\n return\n }\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, offsetCurrentTime, duration, offsetDuration, timeSegments } = this.player\n let _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n const _duration = offsetDuration || duration\n const _step = event.repeat && this.seekStep >= 4 ? parseInt(this.seekStep / 2, 10) : this.seekStep\n if (_time + _step <= _duration) {\n _time = _time + _step\n } else {\n _time = _duration\n }\n const _seekTime = Util.getCurrentTimeByOffset(_time, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n seekBack (event) {\n const { currentTime, offsetCurrentTime, timeSegments } = this.player\n const _step = event.repeat ? parseInt(this.seekStep / 2, 10) : this.seekStep\n const _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n let _seekTime = _time - _step\n if (_seekTime < 0) {\n _seekTime = 0\n }\n _seekTime = Util.getCurrentTimeByOffset(_seekTime, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n changePlaybackRate (event) {\n const { _keyState, config, player } = this\n if (_keyState.playbackRate === 0) {\n _keyState.playbackRate = player.playbackRate\n player.playbackRate = config.playbackRate\n }\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 if (!this.player) {\n return\n }\n const e = event || window.event\n const keyCode = e.keyCode\n const { _keyState, player } = this\n const { disable, disableBodyTrigger, isIgnoreUserActive } = this.config\n // 以下条件不响应\n if (disable || disableBodyTrigger || !(player.isUserActive || isIgnoreUserActive) || isDisableTag(e.target) || !this.checkIsVisible() || e.metaKey || e.altKey || e.ctrlKey) {\n _keyState.isBodyKeyDown = false\n return\n }\n // 首次进入进行是否生效校验\n if (!event.repeat && !_keyState.isKeyDown) {\n if ((e.target === document.body || (this.config.isGlobalTrigger && !isDisableTag(e.target))) && this.checkCode(keyCode, true)) {\n _keyState.isBodyKeyDown = true\n }\n document.addEventListener('keyup', this.onBodyKeyUp)\n }\n _keyState.isBodyKeyDown && this.handleKeyDown(e)\n }\n\n onBodyKeyUp = (event) => {\n if (!this.player) {\n return\n }\n document.removeEventListener('keyup', this.onBodyKeyUp)\n this.handleKeyUp(event)\n }\n\n onKeydown = (event) => {\n if (!this.player) {\n return\n }\n const e = event || window.event\n const { _keyState } = this\n // 首次按下检查是否满足触发他条件\n if (!e.repeat) {\n if (this.config.disable || this.config.disableRootTrigger || e.metaKey || e.altKey || e.ctrlKey) {\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 _keyState.isKeyDown = true\n }\n this.player.root.addEventListener('keyup', this.onKeyup)\n }\n // 长按不满足触发条件直接返回\n if (!_keyState.isKeyDown) {\n return\n }\n this.handleKeyDown(e)\n }\n\n onKeyup = (event) => {\n if (!this.player) {\n return\n }\n this.player.root.removeEventListener('keyup', this.onKeyup)\n this.handleKeyUp(event)\n }\n\n handleKeyDown (e) {\n const { _keyState } = this\n if (e.repeat) {\n _keyState.isPress = true\n const _t = Date.now()\n if (_t - _keyState.tt < 200) {\n return\n }\n _keyState.tt = _t\n }\n this.handleKeyCode(e.keyCode, e, _keyState.isPress)\n }\n\n handleKeyUp (e) {\n const { _keyState } = this\n if (_keyState.playbackRate > 0) {\n this.player.playbackRate = _keyState.playbackRate\n _keyState.playbackRate = 0\n }\n _keyState.isKeyDown = false\n _keyState.isPress = false\n _keyState.tt = 0\n }\n\n handleKeyCode (curKeyCode, event, isPress) {\n const arr = Object.keys(this.keyCodeMap)\n for (let i = 0; i < arr.length; i++) {\n const { action, keyCode, disable, pressAction, disablePress } = this.keyCodeMap[arr[i]]\n if (keyCode === curKeyCode) {\n if (!disable && !(isPress && disablePress)) {\n const _action = !isPress ? action : (pressAction || action)\n if (typeof _action === 'function') {\n action(event, this.player, isPress)\n } else if (typeof _action === 'string') {\n if (typeof this[_action] === 'function') {\n this[_action](event, this.player, isPress)\n }\n }\n this.emit(Events.SHORTCUT, {\n key: arr[i],\n target: event.target,\n isPress: isPress,\n ...this.keyCodeMap[arr[i]]\n })\n }\n preventDefault(event)\n break\n }\n }\n }\n\n destroy () {\n this.player.root.removeEventListener('keydown', this.onKeydown)\n document.removeEventListener('keydown', this.onBodyKeyDown)\n this.player.root.removeEventListener('keyup', this.onKeyup)\n document.removeEventListener('keyup', this.onBodyKeyUp)\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 <xg-loading class=\"xgplayer-loading\">\n <xg-loading-inner></xg-loading-inner>\n </xg-loading>`\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 if (this.fragments.length === 0) {\n this.fragments.push({ percent: 1 })\n }\n this._callBack = args.actionCallback\n this.fragConfig = {\n fragFocusClass: args.fragFocusClass || 'inner-focus-point', // 'inner-focus',\n fragAutoFocus: !!args.fragAutoFocus,\n fragClass: args.fragClass || ''\n }\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 this.focusIndex = -1\n }\n\n updateDuration (duration) {\n this.duration = duration\n let start = 0\n const { fragments } = this\n this.fragments = fragments.map(item => {\n item.start = parseInt(start, 10)\n item.end = parseInt(start + item.percent * this.duration, 10)\n item.duration = parseInt(item.percent * this.duration, 10)\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 if (progressList.length < 1) {\n return\n }\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 updateFocus (data) {\n if (!this.fragConfig.fragAutoFocus || this.fragments.length < 2) {\n return\n }\n if (!data) {\n // 取消焦点\n if (this.focusIndex > -1) {\n this.unHightLight(this.focusIndex)\n const _data = {\n index: -1,\n preIndex: this.focusIndex,\n fragment: null\n }\n this._callBack && this._callBack(_data)\n this.focusIndex = -1\n }\n return\n }\n const newPIndex = this.findIndex(data.currentTime * 1000, this.focusIndex)\n if (newPIndex >= 0 && newPIndex !== this.focusIndex) {\n this.focusIndex > -1 && this.unHightLight(this.focusIndex)\n this.setHightLight(newPIndex)\n const _data = {\n index: newPIndex,\n preIndex: this.focusIndex,\n fragment: this.fragments[this.focusIndex]\n }\n this.focusIndex = newPIndex\n this._callBack && this._callBack(_data)\n }\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(parseInt(duration * 1000, 10))\n }\n const { playedIndex, cachedIndex } = this\n if (Util.typeOf(data.played) !== 'Undefined') {\n const newPIndex = this.findIndex(data.played * 1000, playedIndex)\n if (newPIndex < 0) {\n return\n }\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 if (newCIndex < 0) {\n return\n }\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 || fragments.length === 0) {\n return -1\n }\n if (fragments.length === 1) {\n return 0\n }\n if (curIndex > -1 && curIndex < fragments.length && time > fragments[curIndex].start && time < fragments[curIndex].end) {\n return curIndex\n }\n if (time > fragments[fragments.length - 1].start) {\n return fragments.length - 1\n }\n\n for (let i = 0; i < fragments.length; i++) {\n if (time > fragments[i].start && time <= fragments[i].end) {\n curIndex = i\n break\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.fragConfig.fragFocusClass)) {\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.fragConfig.fragFocusClass)\n }\n }\n\n setHightLight (index) {\n const children = this.root.children\n if (index < children.length) {\n Util.addClass(children[index], this.fragConfig.fragFocusClass)\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 /**\n * 重置当前\n * @param {*} newOptions\n */\n reset (newOptions) {\n // 更新fragConfig\n Object.keys(this.fragConfig).forEach(key => {\n if (newOptions[key] !== undefined) {\n this.fragConfig[key] = newOptions[key]\n }\n })\n if (newOptions.fragments) {\n this.fragments = newOptions.fragments.length === 0 ? [{ percent: 1 }] : newOptions.fragments\n this.updateDuration(this.duration)\n this.playedIndex = 0\n this.cachedIndex = 0\n // 移除分段信息\n if (this.root) {\n const _c = this.root.children\n while (_c.length > 0) {\n this.root.removeChild(_c[0])\n }\n }\n // 重新渲染\n this.render()\n }\n }\n\n render () {\n const { progressColor } = this.style\n if (!this.root) {\n this.root = Util.createDom('xg-inners', '', {}, 'progress-list')\n }\n if (this.fragments) {\n const { fragClass, fragFocusClass } = this.fragConfig\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 ? fragFocusClass : ''} xgplayer-progress-inner ${fragClass}`)\n\n this.root.appendChild(inner)\n\n TPL.forEach(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 } 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 * fragFocusClass?: string, // 进度条分段高亮类名\n * fragAutoFocus?: boolean, // 是否hover的时候自动高亮\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 */\n\n// 分段获取焦点显示的时候的两种class类型\nconst FRAGMENT_FOCUS_CLASS = {\n POINT: 'inner-focus-point',\n HIGHLIGHT: 'inner-focus-highlight'\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 fragFocusClass: FRAGMENT_FOCUS_CLASS.POINT,\n fragClass: '', // 内置进度条类名\n fragAutoFocus: false, // 是否hover的时候自动高亮\n miniMoveStep: 5,\n miniStartStep: 2,\n onMoveStart: () => {\n }, // 手势开始移动回调\n onMoveEnd: () => {}, // 手势移动结束回调\n endedDiff: 0.2\n }\n }\n\n static get FRAGMENT_FOCUS_CLASS () {\n return FRAGMENT_FOCUS_CLASS\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 prePlayTime: -1\n }\n\n this._disableBlur = false\n }\n\n get offsetDuration () {\n return this.playerConfig.customDuration || this.player.offsetDuration || this.player.duration\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 get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : (currentTime + this.timeOffset)\n }\n\n changeState (useable = true) {\n this.useable = useable\n }\n\n show () {\n this.root && (this.root.style.display = 'flex')\n }\n /**\n * @description 创建内部进度条,并挂载到xg-outer上,\n * 并把一些对外API绑定在progress上供外部调用\n *\n */\n _initInner (fragments = [], config = {}) {\n if (!fragments || fragments.length === 0) {\n fragments = [{ percent: 1 }]\n }\n const _c = {\n fragments,\n ...config,\n actionCallback: (data) => {\n this.emitUserAction('fragment_focus', 'fragment_focus', data)\n }\n }\n if (!this.innerList) {\n this.innerList = new InnerList(_c)\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 } else {\n this.innerList.reset(_c)\n }\n }\n\n _updateInnerFocus (data) {\n this.innerList && this.innerList.updateFocus(data)\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 isLocked: false // 是否刚刚锁定回过进度条\n }\n this.outer = this.find('xg-outer')\n const { fragFocusClass, fragAutoFocus, fragClass } = this.config\n this._initInner(this.config.fragments, { fragFocusClass, fragAutoFocus, fragClass, style: this.playerConfig.commonStyle || {} })\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(true)\n this.onTimeupdate(true)\n this._state.now = 0\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n\n this.on(Events.VIDEO_RESIZE, () => {\n this.onVideoResize()\n })\n\n this.bindDomEvents()\n this.initCustomStyle()\n }\n\n /**\n * @description 配置更新响应,插件内置调用api, 播放器整体配置更新的时候调用\n * @param {IProgressConfig} config\n */\n setConfig (config) {\n let frags = null\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n if (key === 'fragments') {\n frags = config[key]\n }\n })\n if (frags) {\n this._initInner(frags, config)\n }\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 /**\n * @description 解除进度条的所动状态\n * @returns\n */\n unlock () {\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 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\n if (this.domEventType === 'touch' || this.domEventType === 'compatible') {\n this.root.addEventListener('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 }\n\n if (this.domEventType === 'mouse' || this.domEventType === 'compatible') {\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 // 避免触发videoClick 暂停/播放切换\n this.player.root.addEventListener('click', this.onBodyClick, true)\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, data) => {\n const { pos, config, player } = this\n let ret = data\n if (e) {\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 ret = this.computeTime(e, x)\n }\n this.triggerCallbacks('dragmove', ret, e)\n this._updateInnerFocus(ret)\n }\n\n /**\n * 避免mouseup的时候触发父辈节点的click事件,和单击视频区域切换暂停/播放互斥\n * @param {*} e\n * @returns\n */\n onBodyClick = (e) => {\n if (!this.pos.isLocked) {\n return\n }\n this.pos.isLocked = false\n e.preventDefault()\n e.stopPropagation()\n }\n\n _mouseDownHandler = (event, data) => {\n this._state.time = data.currentTime\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 0)\n this._updateInnerFocus(data)\n }\n\n _mouseUpHandler = (e, data) => {\n const { pos } = this\n pos.moving && this.updateWidth(data.currentTime, data.seekTime, data.percent, 2)\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 this.emitUserAction('drag', 'dragstart', data)\n }\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 1)\n this.triggerCallbacks('dragmove', data, e)\n this._updateInnerFocus(data)\n }\n\n onMouseDown = (e) => {\n const { _state, 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\n if (!player.duration && !player.isPlaying) {\n player.play()\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 _state.prePlayTime = player.currentTime\n\n // 交互开始 禁止控制栏的自动隐藏功能\n player.focus({ autoHide: false })\n this.isProgressMoving = true\n Util.addClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseDownHandlerHook(e, ret)\n\n const eventType = e.type\n if (eventType === 'touchstart') {\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 // 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, pos.x)\n ret.prePlayTime = _state.prePlayTime\n if (pos.moving) {\n this.triggerCallbacks('dragend', ret, e)\n this.emitUserAction('drag', 'dragend', ret)\n } else {\n this.triggerCallbacks('click', ret, e)\n this.emitUserAction('click', 'click', ret)\n }\n this._mouseUpHandlerHook(e, ret)\n\n pos.moving = false\n pos.isDown = false\n pos.x = 0\n pos.y = 0\n pos.isLocked = true\n _state.prePlayTime = 0\n _state.time = 0\n const eventType = e.type\n if (eventType === 'touchend') {\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 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 { _state, 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, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseMoveHandlerHook(e, 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 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 // 计算预览位置\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const ret = this.computeTime(e, x)\n this.triggerCallbacks('mouseenter', ret, e)\n this.focus()\n }\n\n onMouseLeave = (e) => {\n this.triggerCallbacks('mouseleave', null, e)\n this.unlock()\n this._updateInnerFocus(null)\n }\n\n onVideoResize = () => {\n const { x, isDown, isEnter } = this.pos\n if (isEnter && !isDown) {\n const ret = this.computeTime(null, x)\n this.onMoveOnly(null, ret)\n }\n }\n\n /**\n * @description 根据currenTime和占用百分比更新进度条\n * @param {Number} currentTime 需要更新到的时间\n * @param {Number} seekTime 实际seek的时间\n * @param {Number} percent 更新时间占比\n * @param {Int} type 触发类型 0-down 1-move 2-up\n */\n updateWidth (currentTime, seekTime, percent, type) {\n const { config, player } = this\n if (config.isCloseClickSeek && type === 0) {\n return\n }\n\n const realTime = seekTime = seekTime >= player.duration ? player.duration - config.endedDiff : Number(seekTime).toFixed(1)\n\n this.updatePercent(percent)\n this.updateTime(currentTime)\n if (type === 1 && (!config.isDragingSeek || player.config.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, x) {\n const { player } = this\n const { width, height, top, left } = this.root.getBoundingClientRect()\n let rWidth, rLeft\n const clientX = x\n if (player.rotateDeg === 90) {\n rWidth = height\n rLeft = top\n } else {\n rWidth = width\n rLeft = left\n }\n let offset = clientX - rLeft\n offset = offset > rWidth ? rWidth : (offset < 0 ? 0 : offset)\n let percent = offset / rWidth\n percent = percent < 0 ? 0 : (percent > 1 ? 1 : percent)\n const currentTime = parseInt(percent * this.offsetDuration * 1000, 10) / 1000\n const seekTime = Util.getCurrentTimeByOffset(currentTime, player.timeSegments)\n return {\n percent,\n currentTime,\n seekTime,\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.offsetDuration }, this.offsetDuration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: percent * this.offsetDuration }, this.offsetDuration)\n }\n\n /**\n * @description 播放进度更新\n * @param { boolean } isEnded 是否是播放结束的时候调用\n * @returns\n */\n onTimeupdate (isEnded) {\n const { player, _state, offsetDuration } = this\n if ((player.isSeeking && player.media.seeking) || this.isProgressMoving || !player.hasStart) {\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 let time = this.currentTime // this.timeOffset + player.currentTime\n time = Util.adjustTimeByDuration(time, offsetDuration, isEnded)\n this.innerList.update({ played: time }, offsetDuration)\n this.progressBtn.style.left = `${time / offsetDuration * 100}%`\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: time }, offsetDuration)\n }\n\n /**\n * @description 缓存进度更新\n * @param { boolean } isEnded 是否是结束时触发\n * @returns\n */\n onCacheUpdate (isEnded) {\n const { player, duration } = this\n if (!player) {\n return\n }\n // 兼容设置了customDuration, 实际时长和要显示的时不一致问题\n let _end = player.bufferedPoint.end\n _end = Util.adjustTimeByDuration(_end, duration, isEnded)\n this.innerList.update({ cached: _end }, duration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ cached: _end }, duration)\n }\n\n onReset () {\n this.innerList.update({ played: 0, cached: 0 }, 0)\n this.progressBtn.style.left = '0%'\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ cached: 0, played: 0 }, 0)\n this.progressBtn.style.left = '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 const { domEventType } = this\n if (domEventType === 'touch' || domEventType === 'compatible') {\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 }\n if (domEventType === 'mouse' || domEventType === 'compatible') {\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, true)\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 <xg-progress class=\"xgplayer-progress ${className}\">\n <xg-outer class=\"xgplayer-progress-outer\">\n <xg-progress-btn class=\"xgplayer-progress-btn\"></xg-progress-btn>\n </xg-outer>\n </xg-progress>\n `\n }\n}\n\nexport default Progress\n","import Plugin from '../../plugin'\n\nexport default class Icon 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 { xgIconTips } from '../common/iconTools'\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, Events.ERROR, Events.EMPTIED], () => {\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 if (!this.player) {return}\n const { i18nKeys } = this\n const tipDom = this.find('.xg-tips')\n if (paused) {\n this.setAttr('data-state', 'pause')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PLAY_TIPS)\n } else {\n this.setAttr('data-state', 'play')\n tipDom && this.changeLangTextKey(tipDom, 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 `<xg-icon class=\"xgplayer-play\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'PLAY_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\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 `<xg-icon class=\"xgplayer-back\">\n </xg-icon>`\n }\n}\n","import { Events, POSITIONS, Sniffer, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\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().catch(e=>{})\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 const tipsDom = this.find('.xg-tips')\n tipsDom && this.changeLangTextKey(tipsDom, 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().catch(e=>{})\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 `<xg-icon class=\"xgplayer-fullscreen\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, langKey, this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import Plugin, { Util, Events, POSITIONS } 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 const { offsetDuration, duration } = this.player\n return this.playerConfig.customDuration || offsetDuration || duration\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : currentTime\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.root.style.display = 'none'\n }\n this.durationDom = this.find('.time-duration')\n this.timeDom = this.find('.time-current')\n this.on([Events.DURATION_CHANGE, Events.SEEKED, Events.TIME_UPDATE], (e) => {\n if (e.eventName === 'durationchange') {\n this.isActiving = false\n }\n this.onTimeUpdate()\n })\n\n this.on(Events.ENDED, () => {\n // 因为customDuration存在,最终播放currentTime可能和显示的duration不统一,所以在ended的时候修正\n this.onTimeUpdate(true)\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n }\n\n show () {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'block')\n this.centerDurDom && (this.centerDurDom.style.display = 'block')\n return\n }\n this.root.style.display = 'block'\n }\n\n hide () {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'none')\n this.centerDurDom && (this.centerDurDom.style.display = 'none')\n return\n }\n this.root.style.display = 'none'\n }\n\n onTimeUpdate (isEnded) {\n const { player, config, duration } = this\n if (config.disable || this.isActiving || !player.hasStart) {\n return\n }\n let current = this.currentTime + this.timeOffset\n current = Util.adjustTimeByDuration(current, duration, isEnded)\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.centerDurDom.innerHTML = Util.format(duration)\n }\n } else {\n this.timeDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.durationDom.innerHTML = Util.format(duration)\n }\n }\n }\n\n onReset () {\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(0))\n this.centerDurDom.innerHTML = Util.format(0)\n } else {\n this.timeDom.innerHTML = this.minWidthTime(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(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-left'\n )\n this.centerDurDom = Util.createDom(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-right'\n )\n center.children.length > 0\n ? center.insertBefore(this.centerCurDom, center.children[0])\n : 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 = this.minWidthTime(Util.format(time))\n return\n }\n this.timeDom.innerHTML = this.minWidthTime(Util.format(time))\n }\n\n minWidthTime (timeStr) {\n return timeStr\n .split(':')\n .map(value => `<span class=\"time-min-width\">${value}</span>`)\n .join(':')\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 && player.media.seeking) {\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 `<xg-icon class=\"xgplayer-time\">\n <span class=\"time-current\">00:00</span>\n <span class=\"time-separator\">/</span>\n <span class=\"time-duration\">00:00</span>\n <span class=\"time-live-tag\">${this.i18n.LIVE_TIP}</span>\n </xg-icon>`\n }\n}\nexport default Time\n","import { BasePlugin, Events, Util } from '../../plugin'\n/**\n * 进行事件分段控制\n */\nexport default class TimeSegmentsControls extends BasePlugin {\n static get pluginName () {\n return 'TimeSegmentsControls'\n }\n\n static get defaultConfig () {\n return {\n disable: true,\n segments: []\n }\n }\n\n afterCreate () {\n this.curIndex = -1\n this.curPos = null\n this.lastCurrentTime = 0\n\n this.updateSegments()\n\n this.on(Events.DURATION_CHANGE, this._onDurationChange)\n this.on(Events.LOADED_DATA, this._onLoadedData)\n\n this.on(Events.TIME_UPDATE, this._onTimeupdate)\n\n this.on(Events.SEEKING, this._onSeeking)\n\n this.on(Events.PLAY, this._onPlay)\n }\n\n setConfig (newConfig) {\n if (!newConfig) {\n return\n }\n const keys = Object.keys(newConfig)\n if (keys.length < 1) {\n return\n }\n keys.forEach(key => {\n this.config[key] = newConfig[key]\n })\n this.updateSegments()\n }\n\n updateSegments () {\n const { disable, segments } = this.config\n const { player } = this\n if (disable || !segments || segments.length === 0) {\n player.timeSegments = []\n player.offsetDuration = 0\n player.offsetCurrentTime = -1\n } else {\n const _segs = this.formatTimeSegments(segments, player.duration)\n player.timeSegments = _segs\n player.offsetDuration = _segs.length > 0 ? _segs[_segs.length - 1].duration : 0\n }\n }\n\n formatTimeSegments (timeSegments, duration) {\n const ret = []\n if (!timeSegments) {\n return []\n }\n // console.log('>>>formatTimeSegments', duration)\n timeSegments.sort((a,b) =>{ return a.start - b.start })\n timeSegments.forEach((item, index) => {\n const _item = {}\n _item.start = item.start < 0 ? 0 : item.start\n _item.end = duration > 0 && item.end > duration ? duration : item.end\n if (duration > 0 && _item.start > duration) {\n return\n }\n ret.push(_item)\n const _segDuration = _item.end - _item.start\n if (index === 0) {\n _item.offset = item.start // 偏移量\n _item.cTime = 0\n _item.segDuration = _segDuration\n _item.duration = _segDuration\n } else {\n const last = ret[index - 1]\n _item.offset = last.offset + (_item.start - last.end)\n _item.cTime = last.duration + last.cTime\n _item.segDuration = _segDuration\n _item.duration = last.duration + _segDuration\n }\n })\n return ret\n }\n\n _onDurationChange = () => {\n this.updateSegments()\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const index = Util.getIndexByTime(currentTime,timeSegments)\n const time = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n this.player.offsetCurrentTime = time\n this.changeIndex(index, timeSegments)\n }\n\n _onLoadedData = () => {\n const { timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const time = Util.getOffsetCurrentTime(0, timeSegments)\n this.player.offsetCurrentTime = time\n this.changeIndex(0, timeSegments)\n if (this.curPos.start > 0){\n this.player.currentTime = this.curPos.start\n }\n }\n\n _onTimeupdate = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const _len = timeSegments.length\n this.lastCurrentTime = currentTime\n const index = Util.getIndexByTime(currentTime, timeSegments)\n if (index !== this.curIndex) {\n this.changeIndex(index, timeSegments)\n }\n const curTime = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n\n this.player.offsetCurrentTime = curTime\n\n // 根据分段信息进行放时间点跳转\n if (!this.curPos) {\n return\n }\n const { start, end } = this.curPos\n if (currentTime < start) {\n this.player.currentTime = start\n } else if (currentTime > end && index >= _len - 1) {\n this.player.pause()\n }\n }\n\n _onSeeking = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n if (currentTime < timeSegments[0].start) {\n this.player.currentTime = timeSegments[0].start\n } else if (currentTime > timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[timeSegments.length - 1].end\n } else {\n const _index = Util.getIndexByTime(currentTime, timeSegments)\n if (_index >= 0) {\n const _seekTime = this.getSeekTime(currentTime, this.lastCurrentTime, _index, timeSegments)\n if (_seekTime >= 0 ) {\n this.player.currentTime = _seekTime\n }\n }\n }\n }\n\n _onPlay = () => {\n const { currentTime, timeSegments } = this.player\n if (this._checkIfEnabled(timeSegments) && currentTime >= timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[0].start\n }\n }\n\n getSeekTime (currentTime, lastCurrentTime, index, timeSegments) {\n let _time = -1\n const { start, end } = timeSegments[index]\n if (currentTime >= start && currentTime <= end) {\n // console.log('>>>>_onSeeking noSeek', currentTime, lastCurrentTime, start, end, _time)\n return _time\n }\n const diff = currentTime - lastCurrentTime\n if (diff < 0) {\n if (currentTime < start) {\n const diff2 = lastCurrentTime > start ? lastCurrentTime - start : 0\n _time = index - 1 >= 0 ? timeSegments[index - 1].end + diff + diff2 : 0\n // console.log('>>>>_onSeeking seek3', currentTime, lastCurrentTime, diff, start, end, _time)\n return _time\n }\n }\n return -1\n }\n\n _checkIfEnabled (segments) {\n return !(!segments || segments.length < 1)\n }\n\n changeIndex (index, timeSegments) {\n this.curIndex = index\n if (index >= 0 && timeSegments.length > 0) {\n this.curPos = timeSegments[index]\n } else {\n this.curPos = null\n }\n }\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 this._d = {\n isStart: false,\n isMoving: false,\n isActive: false\n }\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._d.isStart = true\n return false\n }\n\n onBarMouseMove = (e) => {\n const { _d } = this\n if (!_d.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 _d.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 const { _d } = this\n _d.isStart = false\n _d.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 /**\n * @desc 聚焦\n */\n focus () {\n const { player } = this\n player.focus({ autoHide: false })\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n Util.addClass(this.root, 'slide-show')\n }\n\n /**\n * 失去焦点\n * @param { number } delay 延迟隐藏时长,ms\n * @param { boolean } isForce 是否立即隐藏控制栏\n * @param { Event} [e] 事件\n * @returns\n */\n unFocus (delay = 100, isForce = true, e) {\n const { _d, player } = this\n if (_d.isActive) {\n return\n }\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this._timerId = Util.setTimeout(this, () => {\n if (!_d.isActive) {\n isForce ? player.blur() : player.focus()\n Util.removeClass(this.root, 'slide-show')\n _d.isStart && this.onBarMouseUp(e)\n }\n this._timerId = null\n }, delay)\n }\n\n onMouseenter = (e) => {\n this._d.isActive = true\n this.focus()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n onMouseleave = (e) => {\n this._d.isActive = false\n this.unFocus(100, false, e)\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, _d } = this\n // 取消bar的状态\n _d.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._d.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 if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\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 <xg-icon class=\"xgplayer-volume\" data-state=\"normal\">\n <div class=\"xgplayer-icon\">\n </div>\n <xg-slider class=\"xgplayer-slider\">\n ${isShowVolumeValue ? `<div class=\"xgplayer-value-label\">${volume * 100}</div>` : ''}\n <div class=\"xgplayer-bar\">\n <xg-drag class=\"xgplayer-drag\" style=\"height: ${volume * 100}%\"></xg-drag>\n </div>\n </xg-slider>\n </xg-icon>`\n }\n}\nexport default Volume\n","import { POSITIONS, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\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 if (this.rotateDeg && this.config.innerRotate) {\n Util.setTimeout(this, () => {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }, 100)\n }\n })\n\n const root = this.player.root\n this.rootWidth = root.style.width || root.offsetWidth || root.clientWidth\n this.rootHeight = root.style.height || root.offsetHeight || root.clientHeight\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 if (!rotateDeg) {\n rotateDeg = 0\n }\n if (innerRotate) {\n this.player.videoRotateDeg = rotateDeg\n return\n }\n const { player, rootWidth, rootHeight } = this\n const { root, innerContainer } = player\n const video = player.media\n const width = root.offsetWidth\n const height = innerContainer && innerRotate ? innerContainer.offsetHeight : root.offsetHeight\n let rWidth = rootWidth\n let rHeight = rootHeight\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 <xg-icon class=\"xgplayer-rotate\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'ROTATE_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","/* global documentPictureInPicture */\nimport { Events, Util, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\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 * @doc https://wicg.github.io/document-picture-in-picture/\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 preferDocument: false,\n width: undefined,\n height: undefined,\n docPiPNode: undefined,\n docPiPStyle: undefined\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 // 使用mediaPlay避免多次触发 playhooks\n !paused && player.mediaPlay()\n }, 0)\n !paused && player.mediaPlay()\n this.setAttr('data-state', 'normal')\n this.pipWindow = null\n player.emit(Events.PIP_CHANGE, false)\n }\n\n this.enterPIPCallback = (e) => {\n player.emit(Events.PIP_CHANGE, true)\n if (e?.pictureInPictureWindow) {\n this.pipWindow = e.pictureInPictureWindow\n }\n this.setAttr('data-state', 'pip')\n }\n\n this.onWebkitpresentationmodechanged = (e) => {\n const mode = player.media.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.media) {\n player.media.addEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.addEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.addEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n }\n }\n\n switchPIP = (e) => {\n if (!this.isPIPAvailable()) {\n return false\n }\n e.stopPropagation && 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.media.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 copyStyleIntoPiPWindow (pipWin) {\n const textContent = [...document.styleSheets]\n .map((style) => {\n try {\n return [...style.cssRules].map((rule) => rule.cssText).join('')\n } catch (e) {\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.type = style.type\n link.media = style.media\n link.href = style.href\n pipWin.document.head.appendChild(link)\n }\n return ''\n })\n .filter(Boolean)\n .join('\\n')\n const style = document.createElement('style')\n\n style.textContent = textContent\n pipWin.document.head.appendChild(style)\n }\n\n /*\n * 进入画中画\n */\n requestPIP () {\n const { player, playerConfig, config } = this\n if (!this.isPIPAvailable() || this.isPip) {\n return\n }\n try {\n const { poster } = playerConfig\n if (poster) {\n player.media.poster = Util.typeOf(poster) === 'String' ? poster : poster.poster\n }\n\n if (config.preferDocument && this.isDocPIPAvailable()) {\n const pipOptions = {}\n\n if (config.width && config.height) {\n pipOptions.width = config.width\n pipOptions.height = config.height\n } else {\n const playerRect = player.root.getBoundingClientRect()\n pipOptions.width = playerRect.width\n pipOptions.height = playerRect.height\n }\n\n documentPictureInPicture.requestWindow(pipOptions).then((pipWin) => {\n const { docPiPNode, docPiPStyle } = config\n\n this.enterPIPCallback()\n\n // record original position\n const pipRoot = docPiPNode || player.root\n const parentNode = pipRoot.parentElement\n const previousSibling = pipRoot.previousSibling\n const nextSibling = pipRoot.nextSibling\n\n this.copyStyleIntoPiPWindow(pipWin)\n\n // Make sure player fits in the Picture-in-Picture window.\n const styles = document.createElement('style')\n styles.append('body{padding:0; margin:0;}')\n if (docPiPStyle) {\n let cssContent = ''\n if (typeof docPiPStyle === 'string') {\n cssContent = docPiPStyle\n } else if (typeof docPiPStyle === 'function') {\n cssContent = docPiPStyle.call(config)\n }\n if (cssContent) {\n styles.append(cssContent)\n }\n } else if (pipRoot === player.root) {\n styles.append(`\n .xgplayer{width: 100%!important; height: 100%!important;}\n `)\n }\n pipWin.document.head.append(styles)\n\n // Add player to the PiP window.\n pipWin.document.body.append(pipRoot)\n\n // Listen for the PiP closing event to put the video back.\n pipWin.addEventListener('pagehide', (event) => {\n // Restore nodes to their original location\n if (parentNode) {\n if (nextSibling) {\n parentNode.insertBefore(pipRoot, nextSibling)\n } else if (previousSibling) {\n parentNode.insertBefore(pipRoot, previousSibling.nextSibling)\n } else {\n parentNode.appendChild(pipRoot)\n }\n } else {\n // console.log('无法找到原始父节点')\n }\n\n this.leavePIPCallback()\n }, { once: true })\n })\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('picture-in-picture')\n } else {\n player.media.requestPictureInPicture()\n }\n\n\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 if (this.isDocPIPAvailable() && documentPictureInPicture?.window) {\n documentPictureInPicture.window.close()\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('inline')\n } else {\n document.exitPictureInPicture()\n }\n }\n return true\n } catch (reason) {\n console.error('exitPIP', reason)\n return false\n }\n }\n\n /**\n * 处于画中画状态\n */\n get isPip () {\n const { player } = this\n return (\n !!(this.isDocPIPAvailable() && documentPictureInPicture?.window) ||\n (document.pictureInPictureElement &&\n document.pictureInPictureElement === player.media) ||\n player.media.webkitPresentationMode === PresentationMode.PIP\n )\n }\n\n isPIPAvailable () {\n const video = this.player.media\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 this.isDocPIPAvailable()\n }\n\n isDocPIPAvailable () {\n return 'documentPictureInPicture' in window && /^(https|file)/.test(location.protocol)\n }\n\n destroy () {\n super.destroy()\n const { player } = this\n player.media.removeEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.removeEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.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 `<xg-icon class=\"xgplayer-pip\">\n <div class=\"xgplayer-icon xg-icon-disable\">\n </div>\n ${xgIconTips(this, 'PIP', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\nexport default PIP\n","/**\n * 下一个按钮组件\n */\nimport Plugin, { POSITIONS, Sniffer, Events } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\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 <xg-icon class=\"xgplayer-playnext\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'PLAYNEXT_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>\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<mx;++i) tempUiArr[i]= payload.charCodeAt(i);\n\t\t\t \tpayload=new myBlob([tempUiArr], {type: mimeType});\n\t\t\t}\t\t \n\t\t}\n\t\tblob = payload instanceof myBlob ?\n\t\t\tpayload :\n\t\t\tnew myBlob([payload], {type: mimeType}) ;\n\n\n\t\tfunction dataUrlToBlob(strUrl) {\n\t\t\tvar parts= strUrl.split(/[:;,]/),\n\t\t\ttype= parts[1],\n\t\t\tdecoder= parts[2] == \"base64\" ? atob : decodeURIComponent,\n\t\t\tbinData= decoder( parts.pop() ),\n\t\t\tmx= binData.length,\n\t\t\ti= 0,\n\t\t\tuiArr= new Uint8Array(mx);\n\n\t\t\tfor(i;i<mx;++i) uiArr[i]= binData.charCodeAt(i);\n\n\t\t\treturn new myBlob([uiArr], {type: type});\n\t\t }\n\n\t\tfunction saver(url, winMode){\n\n\t\t\tif ('download' in anchor) { //html5 A[download]\n\t\t\t\tanchor.href = url;\n\t\t\t\tanchor.setAttribute(\"download\", fileName);\n\t\t\t\tanchor.className = \"download-js-link\";\n\t\t\t\tanchor.innerHTML = \"downloading...\";\n\t\t\t\tanchor.style.display = \"none\";\n\t\t\t\tdocument.body.appendChild(anchor);\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tanchor.click();\n\t\t\t\t\tdocument.body.removeChild(anchor);\n\t\t\t\t\tif(winMode===true){setTimeout(function(){ self.URL.revokeObjectURL(anchor.href);}, 250 );}\n\t\t\t\t}, 66);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// handle non-a[download] safari as best we can:\n\t\t\tif(/(Version)\\/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*Safari\\//.test(navigator.userAgent)) {\n\t\t\t\tif(/^data:/.test(url))\turl=\"data:\"+url.replace(/^data:([\\w\\/\\-\\+]+)/, defaultMime);\n\t\t\t\tif(!window.open(url)){ // popup blocked, offer direct download:\n\t\t\t\t\tif(confirm(\"Displaying New Document\\n\\nUse Save As... to download, then click back to return to this page.\")){ location.href=url; }\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t//do iframe dataURL download (old ch+FF):\n\t\t\tvar f = document.createElement(\"iframe\");\n\t\t\tdocument.body.appendChild(f);\n\n\t\t\tif(!winMode && /^data:/.test(url)){ // force a mime that will download:\n\t\t\t\turl=\"data:\"+url.replace(/^data:([\\w\\/\\-\\+]+)/, defaultMime);\n\t\t\t}\n\t\t\tf.src=url;\n\t\t\tsetTimeout(function(){ document.body.removeChild(f); }, 333);\n\n\t\t}//end saver\n\n\n\n\n\t\tif (navigator.msSaveBlob) { // IE10+ : (has Blob, but not a[download] or URL)\n\t\t\treturn navigator.msSaveBlob(blob, fileName);\n\t\t}\n\n\t\tif(self.URL){ // simple fast and modern way using Blob and URL:\n\t\t\tsaver(self.URL.createObjectURL(blob), true);\n\t\t}else{\n\t\t\t// handle non-Blob()+non-URL browsers:\n\t\t\tif(typeof blob === \"string\" || blob.constructor===toString ){\n\t\t\t\ttry{\n\t\t\t\t\treturn saver( \"data:\" + mimeType + \";base64,\" + self.btoa(blob) );\n\t\t\t\t}catch(y){\n\t\t\t\t\treturn saver( \"data:\" + mimeType + \",\" + encodeURIComponent(blob) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Blob but not URL support:\n\t\t\treader=new FileReader();\n\t\t\treader.onload=function(e){\n\t\t\t\tsaver(this.result);\n\t\t\t};\n\t\t\treader.readAsDataURL(blob);\n\t\t}\n\t\treturn true;\n\t}; /* end download() */\n}));\n","import downloadUtil from 'downloadjs'\nimport { POSITIONS, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport DownloadSvg from '../assets/download.svg'\nimport './index.scss'\n/**\n * @typedef { {\n * position: string,\n * index: number,\n * disable: boolean,\n * [propName: string]: any\n * } } IDownloadConfig\n */\nexport default class Download extends IconPlugin {\n static get pluginName () {\n return 'download'\n }\n\n /**\n * @type IDownloadConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n disable: true\n }\n }\n\n constructor (args) {\n super(args)\n this.timer = null\n this.isLock = false\n }\n\n afterCreate () {\n super.afterCreate()\n if (this.config.disable) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.download)\n this._handler = this.hook('click', this.download, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this._handler)\n }\n\n registerIcons () {\n return {\n download: DownloadSvg\n }\n }\n download = (e) => {\n if (this.isLock) {\n return\n }\n this.emitUserAction(e, 'download')\n const { url } = this.playerConfig\n let dUrl = ''\n if (Util.typeOf(url) === 'String') {\n dUrl = url\n } else if (Util.typeOf(url) === 'Array' && url.length > 0) {\n dUrl = url[0].src\n }\n const newUrl = this.getAbsoluteURL(dUrl)\n downloadUtil(newUrl)\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 = `<a href=\"${url}\">x</a>`\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 `<xg-icon class=\"xgplayer-download\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'DOWNLOAD_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\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 saveImg: true,\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 createCanvas (width, height) {\n const canvas = document.createElement('canvas')\n const canvasCtx = canvas.getContext('2d')\n\n this.canvasCtx = canvasCtx\n this.canvas = canvas\n\n canvas.width = width || this.config.width\n canvas.height = height || this.config.height\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingQuality\n canvasCtx.imageSmoothingEnabled = true\n if (canvasCtx.imageSmoothingEnabled) {\n canvasCtx.imageSmoothingQuality = 'high'\n }\n }\n\n onClickBtn (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'shot')\n const { config } = this\n this.shot(config.width, config.height).then((data) => {\n this.emit(Events.SCREEN_SHOT, data)\n if (config.saveImg) {\n this.saveScreenShot(data, config.name + config.format)\n }\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 let canvasCtx\n\n if (player.media.canvas) {\n canvas = player.media.canvas\n } else {\n if (!this.canvas) {\n this.createCanvas(width, height)\n } else {\n this.canvas.width = width || config.width\n this.canvas.height = height || config.height\n }\n canvas = this.canvas\n canvasCtx = this.canvasCtx\n\n const mediaRatio = player.media.videoWidth / player.media.videoHeight\n const canvasRatio = canvas.width / canvas.height\n const sx = 0, sy = 0, sw = player.media.videoWidth, sh = player.media.videoHeight\n let dx, dy, dw, dh\n\n if (mediaRatio > canvasRatio) {\n dw = canvas.width\n dh = canvas.width / mediaRatio\n dx = 0\n dy = Math.round((canvas.height - dh) / 2)\n } else if (mediaRatio === canvasRatio) {\n dw = canvas.width\n dh = canvas.height\n dx = 0\n dy = 0\n } else if (mediaRatio < canvasRatio) {\n dw = canvas.height * mediaRatio\n dh = canvas.height\n dx = Math.round((canvas.width - dw) / 2)\n dy = 0\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage\n canvasCtx.drawImage(player.media, sx, sy, sw, sh, dx, dy, dw, dh)\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 <xg-icon class=\"xgplayer-shot\">\n <div class=\"${className}\">\n ${this.icons.screenshotIcon ? '' : `<span lang-key=\"${this.i18nKeys[langKey]}\">${this.i18n[langKey]}</span>`}\n </div>\n </xg-icon>`\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 xg-list-slide-scroll ${this.config.className}`)\n args.root.appendChild(this.root)\n const { maxHeight } = this.config\n if (maxHeight) {\n this.setStyle({ maxHeight })\n }\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', `<span>${item.showText}</span>`, 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 setStyle (style) {\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\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'\n// import './optionsIcon.scss'\n\nconst LIST_TYPES = {\n SIDE: 'side',\n MIDDLE: 'middle'\n}\n\nconst TOGGLE_MODES = {\n CLICK: 'click',\n HOVER: 'hover'\n}\n\nfunction getListClassName (listType, position) {\n if (listType === LIST_TYPES.SIDE) {\n return position === POSITIONS.CONTROLS_LEFT ? 'xg-side-list xg-left-side' : 'xg-side-list xg-right-side'\n } else {\n return ''\n }\n}\n\n/**\n * @typedef {{\n * isShow?: boolean,\n * index?: number,\n * list?: Array<any>,\n * listType?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IOptionsIconConfig\n */\n\nconst IS_MOBILE = Sniffer.device === 'mobile'\n\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', // 模式 side-右侧边栏 middle-中间显示\n listStyle: {},\n hidePortrait: true,\n isShowIcon: false,\n isItemClickHide: true, // 列表点击之后是否隐藏列表\n toggleMode: TOGGLE_MODES.HOVER, // 激活状态切换模式\n heightLimit: true\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 !== LIST_TYPES.MIDDLE) {\n config.listType = LIST_TYPES.SIDE\n }\n\n config.hidePortrait && Util.addClass(this.root, 'portrait')\n\n this.on([Events.VIDEO_RESIZE, Events.FULLSCREEN_CHANGE], () => {\n this._resizeList()\n })\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\n if (IS_MOBILE) {\n config.toggleMode = TOGGLE_MODES.CLICK\n this.activeEvent = 'touchend'\n } else {\n this.activeEvent = config.toggleMode === TOGGLE_MODES.CLICK ? 'click' : 'mouseenter'\n }\n\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.bind(this.activeEvent, this.switchActiveState)\n } else {\n this.bind(this.activeEvent, this.onEnter)\n this.bind('mouseleave', this.onLeave)\n }\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].en\n } else {\n return item[key]\n }\n } catch (err) {\n console.warn(err)\n return ''\n }\n }\n\n onEnter = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n this.switchActiveState(e)\n }\n\n switchActiveState = (e) => {\n e.stopPropagation()\n const { toggleMode } = this.config\n if (toggleMode === TOGGLE_MODES.CLICK) {\n this.toggle(!this.isActive)\n } else {\n this.toggle(true)\n }\n }\n\n onLeave = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n if (this.config.listType !== LIST_TYPES.SIDE) {\n this.isActive && this.toggle(false)\n }\n }\n\n onListEnter = (e) => {\n // console.log('onListEnter')\n this.enterType = 2\n }\n\n onListLeave = (e) => {\n // console.log('onListLeave', e.target)\n this.enterType = 0\n this.isActive && this.toggle(false)\n }\n\n // 状态切换\n toggle (isActive) {\n if (isActive === this.isActive) return\n const { controls } = this.player\n const { listType } = this.config\n if (isActive) {\n listType === LIST_TYPES.SIDE ? controls.blur() : controls.focus()\n this.optionsList && this.optionsList.show()\n } else {\n listType === LIST_TYPES.SIDE ? controls.focus() : controls.focusAwhile()\n this.optionsList && this.optionsList.hide()\n }\n this.isActive = isActive\n }\n\n // 列表点击回调\n onItemClick (e, data) {\n e.stopPropagation()\n const { listType, list } = this.config\n this.curIndex = data.to.index\n this.curItem = list[this.curIndex]\n this.changeCurrentText()\n const { isItemClickHide } = this.config;\n (isItemClickHide || IS_MOBILE || listType === LIST_TYPES.SIDE) && this.toggle(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: getListClassName(config.listType, config.position), // config.listType === LIST_TYPES.SIDE ? 'xg-right-side' : '',\n onItemClick: (e, data) => {\n this.onItemClick(e, data)\n }\n },\n root: config.listType === LIST_TYPES.SIDE ? (player.innerContainer || player.root) : this.root\n }\n\n if (this.config.isShowIcon) {\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n if (_maxH && config.heightLimit) {\n options.config.maxHeight = `${_maxH}px`\n }\n this.optionsList = new OptionList(options)\n this.changeCurrentText()\n this.show()\n }\n this._resizeList()\n }\n\n _resizeList () {\n if (!this.config.heightLimit) {\n return\n }\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = this.config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n this.optionsList && this.optionsList.setStyle({ maxHeight: `${_maxH}px` })\n }\n\n destroy () {\n const { config } = this\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.unbind(this.activeEvent, this.switchActiveState)\n } else {\n this.unbind(this.activeEvent, this.onEnter)\n this.unbind('mouseleave', this.onLeave)\n }\n this.isIcons && this.unbind('click', this.onIconClick)\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 `<xg-icon class=\"xg-options-icon ${this.config.className || ''}\">\n <div class=\"xgplayer-icon\">\n </div>\n </xg-icon>`\n }\n}\n","import { Events, POSITIONS, Util } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {import('../../defaultConfig').IDefinition} IDefinition\n */\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array<IDefinition>,\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 ...OptionsIcon.defaultConfig,\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 show () {\n if (!this.config.list || this.config.list.length < 2){\n return\n }\n Util.addClass(this.root, 'show')\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 ...item,\n showText: this.getTextByLang(item) || item.definition,\n selected: false\n }\n\n if (item.selected || (item.definition\n // eslint-disable-next-line eqeqeq\n && item.definition == targetDef)\n ) {\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<number | { [propName: string]: any }>,\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 ...OptionsIcon.defaultConfig,\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 = -1\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 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 let _text = ''\n // 在列表中没有匹配的选项的时候,默认展示`${playbackRate}x'\n if (!curItem || this.curIndex < 0) {\n _text = `${this.player.playbackRate}x`\n } else {\n _text = this.getTextByLang(curItem, 'iconText')\n }\n this.find('.icon-text').innerHTML = _text\n }\n\n destroy () {\n super.destroy()\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\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 const tipDom = this.find('.xg-tips')\n tipDom && this.changeLangTextKey(tipDom, 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 `<xg-icon class='xgplayer-cssfullscreen'>\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'CSSFULLSCREEN_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import Plugin, { Events } 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\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 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}<span class=\"xgplayer-error-refresh\">${this.i18n.REFRESH}</span>`\n }\n\n destroy () {\n this.unbind('.xgplayer-error-refresh', 'click', this.clickHandler)\n }\n\n render () {\n return `<xg-error class=\"xgplayer-error\">\n <div class=\"xgplayer-errornote\">\n <span class=\"xgplayer-error-text\"></span>\n <span class=\"xgplayer-error-tips\"><em class=\"xgplayer-error-refresh\"></em></span>\n </div>\n </xg-error>`\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 ? `<i class=\"highlight\">${detail.highlight}</i>` : ''}`\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 `<xg-prompt class=\"xgplayer-prompt ${STATE_CLASS.CONTROLS_FOLLOW}\">\n <span class=\"xgplayer-prompt-detail\"></span>\n </xg-prompt>`\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 _updateDotDom (iSpot, dotDom) {\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 },\n initDots () {\n this._ispots.map(item => {\n this.createDot(item, false)\n })\n this.ispotsInit = true\n },\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 _t = iSpot.template ? `<div class=\"xgplayer-spot-pop\">${iSpot.template}</div>` : ''\n const dotDom = Util.createDom('xg-spot', _t, {\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 this.positionDot(dotDom, iSpot.id)\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 this._updateDotDom(iSpot, dotDom)\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.forEach((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 positionDots () {\n const { _ispots, playerSize } = this\n const { sizeInfo } = this.player\n const { progress } = this.player.plugins\n if (!progress || sizeInfo.width === playerSize.width) {\n return\n }\n playerSize.width = sizeInfo.width\n playerSize.left = sizeInfo.left\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n dotDom && this.positionDot(dotDom, item.id)\n })\n },\n\n positionDot (dotDom, id) {\n const _pop = Util.findDom(dotDom, '.xgplayer-spot-pop')\n if (!_pop) {\n return\n }\n const pRect = this.playerSize\n\n const rect1 = dotDom.getBoundingClientRect()\n const rect = _pop.getBoundingClientRect()\n const _left = rect1.left - pRect.left\n const _diff = pRect.width - _left - rect1.width / 2\n if (_left < rect.width / 2 || pRect.width < rect.width) {\n const t = rect.width / 2 - _left\n _pop.style.left = `${t}px`\n } else if (_diff < rect.width / 2) {\n const t = _diff - rect.width / 2 + rect1.width / 2\n _pop.style.left = `${t}px`\n } else {\n _pop.style.left = '50%'\n }\n },\n\n updateDuration () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const { _ispots } = this\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n this._updateDotDom(item, dotDom)\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 plugin.playerSize = {\n left: player.sizeInfo.left,\n width: player.sizeInfo.width\n }\n plugin.on(Events.DURATION_CHANGE, () => {\n if (!plugin.ispotsInit) {\n plugin.initDots()\n } else {\n // 更新节点\n plugin.updateDuration()\n }\n })\n plugin.on(Events.VIDEO_RESIZE, () => {\n plugin.positionDots()\n })\n}\n","import Plugin, { Util, Sniffer, Events } from '../../plugin'\nimport initDotsAPI from './dotsApi'\nimport './index.scss'\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 mouseenter: '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 isHideThumbnailHover: true, // 是否在hover在预览图的时候隐藏\n isShowThumbnail: true, // 是否显示预览图\n isShowCoverPreview: false, // 进度条拖动时是否显示播放区域预览图\n mode: '', // short // production\n disable: false,\n width: 160, // 显示宽度\n height: 90 // 显示高度\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.seekTime) {\n this.player.seek(data.seekTime)\n }\n })\n this.transformTimeHook = this.hook('transformTime', (time) => {\n this.setTimeContent(Util.format(time))\n })\n initDotsAPI(this)\n\n this.on(Events.DURATION_CHANGE, () => {\n this.show()\n })\n if (this.config.disable) {\n this.disable()\n }\n // 用于进度条预览的扩展\n this.extTextRoot = this.find('.xg-spot-ext-text')\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 (Util.hasClass(e.target, 'xg-spot-content') && this.config.isHideThumbnailHover) {\n this.player.plugins.progress.onMouseLeave(e)\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 ['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, player, config } = this\n const { mode } = player.controls\n const isflex = mode === 'flex'\n let lwidth = root.getBoundingClientRect().width\n // 如果当前预览图宽度获取不到,无法计算位移,不做渲染\n if (!lwidth && this._hasThumnail) {\n return\n }\n lwidth = this._hasThumnail && lwidth < config.width ? config.width : lwidth\n let x = offset - lwidth / 2\n let _t\n if (x < 0 && !isflex) {\n x = 0\n _t = offset - lwidth / 2\n } else if (x > cwidth - lwidth && !isflex) {\n _t = x - (cwidth - lwidth)\n x = cwidth - lwidth\n } else {\n _t = 0\n }\n _t !== undefined && (previewLine.style.transform = `translateX(${_t.toFixed(2)}px)`)\n root.style.transform = `translateX(${x.toFixed(2)}px) translateZ(0)`\n }\n\n updateTimeText (timeStr) {\n const { timeText, timePoint } = this\n timeText.innerHTML = timeStr\n !this.thumbnail && (timePoint.innerHTML = timeStr)\n }\n\n updatePosition (offset, cwidth, time, e) {\n const { root, config, _state } = this\n if (!root) {\n return\n }\n\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 this.updateLinePos(offset, cwidth)\n }\n\n /**\n * @description 设置自定义时间显示字符串\n * @param {string} str\n */\n setTimeContent (str) {\n this.timeStr = str\n }\n\n updateThumbnails (time) {\n const { player, videoPreview, config } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, config.width, config.height)\n const rect = videoPreview && videoPreview.getBoundingClientRect()\n this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\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 if (config.mode === 'short') {\n Util.addClass(this.root, 'short-line')\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 this.updateThumbnails(0)\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 `<div class=\"xg-spot-info hide ${this.config.mode === 'short' ? 'short-line' : ''}\">\n <div class=\"xg-spot-content\">\n <div class=\"xg-spot-thumbnail\">\n <span class=\"xg-spot-time\"></span>\n </div>\n <div class=\"xg-spot-text\"><span class=\"spot-inner-text\"></span></div>\n </div>\n <div class=\"xgplayer-progress-point\">00:00</div>\n <div class=\"xg-spot-ext-text\"></div>\n <div class=\"xg-spot-line\"></div>\n </div>`\n }\n}\n","/* eslint-disable camelcase */\nimport BasePlugin, { Util, Events } from '../../plugin'\n/**\n * @typedef {{\n * isShow?: boolean,\n * urls?: Array<string>, // 有多张大图就多个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 height: 90, // 缩略图高度\n width: 160, // 缩略图宽度\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 = null\n this._preloadMark = {}\n }\n\n afterCreate () {\n if (this.usable) {\n this.initThumbnail()\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 const keys = Object.keys(config)\n if (keys.length < 1) {\n return\n }\n keys.forEach(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 this.interval = interval || Math.round(this.player.duration / pic_num)\n this._preloadMark = {}\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 if (this._preloadMark[index]) {\n return\n }\n const { urls } = this.config\n const len = urls.length\n const arr = []\n index > 0 && arr.push(index - 1)\n arr.push(index)\n index > 0 && index < len - 1 && arr.push(index + 1)\n arr.map(item => {\n if (!this._preloadMark[item] && item >= 0 && item < len) {\n this._preloadMark[item] = 1\n Util.preloadImg(urls[item], () => {\n this._preloadMark[item] = 2\n })\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 / pic_num)\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 sHeight = containerHeight\n swidth = sHeight * (width / height)\n // swidth = containerWidth\n // sHeight = swidth / (width / height)\n } else {\n swidth = containerWidth\n sHeight = swidth / (width / height)\n }\n } else if (!containerHeight) {\n swidth = containerWidth || width\n sHeight = swidth / (width / height)\n } else if (!containerWidth) {\n sHeight = containerHeight || height\n swidth = sHeight * (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 <= 0 || !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'\n\nfunction getBgColor (color) {\n return color ? `background:${color};` : ''\n}\n\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 const { commonStyle } = this.playerConfig\n const _style = {\n cached: getBgColor(commonStyle.cachedColor),\n played: getBgColor(commonStyle.playedColor),\n progress: getBgColor(commonStyle.progressColor),\n }\n return `<xg-mini-progress class=\"xg-mini-progress\" style=\"${_style.progress}\">\n <xg-mini-progress-cache class=\"xg-mini-progress-cache\" style=\"${_style.cached}\"></xg-mini-progress-cache>\n <xg-mini-progress-played class=\"xg-mini-progress-played\" style=\"${_style.played}\"></xg-mini-progress-played>\n </xg-mini-progress>`\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 parseInt(window.performance.now(), 10)\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 index: -1,\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 startFrameCount: 2, // 起始连续渲染次数\n startInterval: 0, // 初始渲染间隔\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, frameRate } = 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 this._isLoaded = 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 / frameRate, 10)\n\n /**\n * @readonly\n */\n this.canvas = null\n /**\n * @readonly\n */\n this.canvasCtx = null\n\n this._frameCount = 0\n\n this._loopType = this.config.mode !== MODES.REAL_TIME && this.interval >= 1000 ? 'timer' : 'animation'\n\n this.once(Events.COMPLETE, () => {\n if (!this.player) {\n return\n }\n this.init()\n this.renderByPoster()\n if (!this.player.paused) {\n this.start()\n }\n })\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 const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\n })\n this.on(Events.PAUSE, () => {\n this.stop()\n })\n }\n\n this.on(Events.LOADED_DATA, this.onLoadedData)\n this.on(Events.LOAD_START, () => {\n this._isLoaded = false\n this.stop()\n })\n document.addEventListener('visibilitychange', this.onVisibilitychange)\n }\n\n setConfig (config) {\n Object.keys(config).forEach(key => {\n if (key === 'root' && config[key] !== this.config[key]) {\n this.reRender(config[key])\n } else if (key === 'frameRate') {\n this.interval = parseInt(1000 / config[key], 10)\n } else if (key === 'disable' && config[key]) {\n this.stop()\n }\n this.config[key] = config[key]\n })\n }\n\n onLoadedData = (e) => {\n if (!this.player) { return }\n this._frameCount = this.config.startFrameCount\n this.stop()\n this.renderOnTimeupdate(e)\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n this.on(Events.TIME_UPDATE, this.renderOnTimeupdate)\n }\n\n onVisibilitychange = (e) => {\n if (document.visibilityState === 'visible') {\n this._checkIfCanStart() && this.start()\n } else if (document.visibilityState === 'hidden') {\n this.stop()\n }\n }\n\n /**\n * @private\n * 初始化 canvas对象并使用海报图先渲染首帧w11\n */\n init (_root) {\n const { player, config } = this\n this.canvasFilter = DynamicBg.supportCanvasFilter()\n try {\n // 保证节点插入到video之前\n let parent = _root || config.root\n if (!parent) {\n parent = !config.isInnerRender ? player.root : (player.innerContainer || player.root)\n }\n parent.insertAdjacentHTML('afterbegin',\n `<div class=\"xgplayer-dynamic-bg\" data-index=\"${config.index}\"><canvas>\n </canvas><xgmask></xgmask></div>`)\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 } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n reRender (root) {\n const { disable } = this.config\n if (!disable && !this.root) {\n return\n }\n this.stop()\n const _p = this.root ? this.root.parentElement : null\n if (_p !== root) {\n _p.removeChild(this.root)\n }\n if (!root) {\n this.root = null\n return\n }\n this.init(root)\n this.renderOnce()\n const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\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' && Util.isMSE(_tVideo))) {\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 renderOnTimeupdate = (e) => {\n if (this._frameCount > 0) {\n this.renderOnce()\n this._frameCount--\n } else {\n this._isLoaded = true\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n const { startInterval } = this.config\n !this.player.paused && this._checkIfCanStart() && this.start(0, startInterval)\n }\n }\n\n _checkIfCanStart () {\n const { mode } = this.config\n return this._isLoaded && !this.player.paused && mode !== MODES.FIRST_FRAME && mode !== MODES.POSTER\n }\n\n /**\n * just render once\n * @returns\n */\n renderOnce () {\n const video = this.player.video\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 // console.log('>>>renderOnce, update', _sVideo, this.videoPI)\n _sVideo && this.update(_sVideo, this.videoPI)\n }\n\n start = (time, interval) => {\n const video = this.player.video\n const _now = nowTime()\n const _sVideo = this.checkVideoIsSupport(video)\n if (!_sVideo || !this.canvasCtx) {\n return\n }\n\n if (!interval) {\n interval = this.interval\n }\n this.stop()\n if (video.videoWidth && video.videoHeight) {\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 >= interval) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n }\n }\n this.frameId = this._loopType === 'timer' ? Util.setTimeout(this, this.start, interval) : Util.requestAnimationFrame(this.start)\n }\n\n stop = () => {\n if (this.frameId) {\n this._loopType === 'timer' ? Util.clearTimeout(this, this.frameId) : 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 // console.log('>>>updateImg update', image, pi)\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 !== width && (_pos.width = this.canvas.width = width)\n _pos.height !== height && (_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 document.removeEventListener('visibilitychange', this.onVisibilitychange)\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.media\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.media.readyState === HTMLMediaElement.HAVE_NOTHING) {\n return\n }\n if (player.media.seeking) {\n if (!this.seekingEventReceived) { return }\n } else {\n this.seekingEventReceived = false\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n\n const buffered = player.media.buffered\n const smallGapLimit = config.smallGapLimit || 0.5\n const gapDetectionThreshold = config.gapDetectionThreshold || 0.3\n const currentTime = player.media.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.media.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.media.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.media.currentTime, ' jumpSize:', (currentTime - player.media.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.media.paused && player.media.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.media.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'\nconst DEFAULT_SPEED_TYPE = 'cdn'\nconst SPEED_TYPE = ['cdn'] // 默认的速度的种类,可以通过addSpeedTypeList再继续增加\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 addSpeedTypeList:[] // 需要增加的speed的类型\n }\n }\n\n getSpeed = (type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return 0\n if (this.speedListCache[type].length <= 0) return 0\n let total = 0\n this.speedListCache[type].map(item => {\n total += item\n })\n return Math.floor(total / this.speedListCache[type].length)\n }\n\n afterCreate () {\n const { openSpeed, addSpeedTypeList } = this.config\n if (addSpeedTypeList?.length > 0) {\n SPEED_TYPE.push(...addSpeedTypeList)\n }\n this.initSpeedList()\n this.on('real_time_speed', this._onRealSpeedChange)\n this.timer = null\n this.cnt = 0\n this.xhr = null\n if (!openSpeed) {\n return\n }\n this.on([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n }\n startTimer = () => {\n if (Util.isMSE(this.player.video)) {\n return\n }\n this.initSpeedList()\n this.cnt = 0\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n\n initSpeedList = () => {\n this.speedListCache = {}\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache[type] = []\n })\n }\n\n _onRealSpeedChange = (data) => {\n data.speed && this.appendList(data.speed, data.type || DEFAULT_SPEED_TYPE)\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, type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return\n const { saveSpeedMax } = this.config\n if (this.speedListCache[type].length >= saveSpeedMax) {\n this.speedListCache[type].shift()\n }\n this.speedListCache[type].push(speed)\n const { player } = this\n if (player) {\n type === DEFAULT_SPEED_TYPE ? (player.realTimeSpeed = speed) : (player[this.getSpeedName('realTime', type)] = speed)\n }\n this.updateSpeed(type)\n }\n\n getSpeedName (namePrefix, type){\n return namePrefix + 'Speed' + type.toUpperCase()\n }\n\n updateSpeed = (type = DEFAULT_SPEED_TYPE) => {\n const speed = this.getSpeed(type)\n const { player } = this\n if (player) {\n if (type === DEFAULT_SPEED_TYPE) {\n if ((!player.avgSpeed || speed !== player.avgSpeed)) {\n player.avgSpeed = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n } else {\n const speedName = this.getSpeedName('avg', type)\n if (!player[speedName] || speed !== player[speedName]) {\n player[speedName] = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n }\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 this.off('real_time_speed', this._onRealSpeedChange)\n this.off([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache && this.speedListCache[type] && (this.speedListCache[type] = [])\n })\n this.speedListCache && (this.speedListCache = {})\n clearTimeout(this.timer)\n this.timer = null\n if (this.xhr && this.xhr.readyState !== 4) {\n this.xhr.cancel && this.xhr.cancel()\n this.xhr = null\n }\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\n/**\n * @typedef { {\n * tick?: number,\n * stuckCount?: number,\n * disable?: boolean,\n * reportFrame?: number\n * } } IFullscreenConfig\n */\nexport default class FpsDetect extends BasePlugin {\n static get pluginName () {\n return 'FpsDetect'\n }\n\n static get defaultConfig () {\n return {\n disabled: false,\n tick: 1000, // tick时间,默认1000 ms\n stuckCount: 3, // 三次\n reportFrame: 0 // 每次解码帧率小于多少时统计\n }\n }\n\n afterCreate () {\n const { player, config } = this\n this.timer = null\n this._lastDecodedFrames = 0\n this._currentStuckCount = 0\n this._lastCheckPoint = null\n this._payload = []\n if (config.disabled) return\n const getVideoPlaybackQuality = player.media.getVideoPlaybackQuality\n if (!getVideoPlaybackQuality) return\n this.on(Events.PLAY, () => {\n this._startTick()\n })\n\n this.on(Events.PAUSE, () => {\n this._stopTick()\n })\n\n this.on(Events.ENDED, () => {\n this._stopTick()\n })\n\n this.on(Events.EMPTIED, () => {\n this._stopTick()\n })\n }\n\n _startTick () {\n this._stopTick()\n this._timer = setTimeout(() => {\n this._checkDecodeFPS()\n this._startTick()\n }, this.config.tick)\n }\n\n _stopTick () {\n clearTimeout(this._timer)\n this._timer = null\n }\n\n _checkStuck (curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval) {\n const { media } = this.player\n const hidden = document.hidden\n const paused = media.paused\n if (typeof hidden === 'boolean' && !hidden && !paused) {\n const curTime = media.currentTime\n const buffered = media.buffered\n let enoughBuffer = false\n const bufs = []\n for (let i = 0; i < buffered.length; i++) {\n const start = buffered.start(i)\n const end = buffered.end(i)\n bufs.push({ start, end })\n if (start <= curTime && curTime <= end - 1) {\n enoughBuffer = true\n break\n }\n }\n if (media.readyState === 4 && enoughBuffer) {\n if (this._currentStuckCount > this.config.stuckCount) {\n this.emit(Events.FPS_STUCK, this._payload)\n this._reset()\n } else {\n if (curDecodedFrames <= this.config.reportFrame) {\n this._currentStuckCount++\n this._payload.push({ bufs, currentTime: media.currentTime, curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval })\n } else {\n this._reset()\n }\n }\n }\n }\n }\n\n _reset () {\n this._payload = []\n this._currentStuckCount = 0\n }\n\n _checkDecodeFPS () {\n if (!this.player.media) {\n return\n }\n const { totalVideoFrames, droppedVideoFrames } = this.player.media.getVideoPlaybackQuality()\n const currTime = performance.now()\n if (totalVideoFrames) {\n if (this._lastCheckPoint) {\n const curDecoded = totalVideoFrames - this._lastDecodedFrames\n const checkInterval = currTime - this._lastCheckPoint\n this._checkStuck(curDecoded, totalVideoFrames, droppedVideoFrames, checkInterval)\n }\n }\n this._lastDecodedFrames = totalVideoFrames\n this._lastCheckPoint = currTime\n }\n\n destroy () {\n this._stopTick()\n }\n}\n","import sniffer from '../utils/sniffer'\nimport Controls from '../plugins/controls'\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 TimeSegments from '../plugins/time/timesegments'\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'\nimport FpsDetect from '../plugins/fpsDetect'\n// import Heatmap from '../plugins/heatmap'\n\nI18N.use(ZH)\n\nexport default class DefaultPreset {\n constructor (options, playerConfig) {\n const simulateMode = playerConfig && playerConfig.isMobileSimulateMode === 'mobile'\n const { isLive, controls } = playerConfig\n const basePlugin = controls ? [Controls] : []\n const vodPlugins = isLive ? basePlugin : [...basePlugin, TimeSegments, 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 = [...contolsIcons, Stats, Xglogger, ...layers, GapJump, WaitingTimeoutJump]\n const mode = simulateMode ? 'mobile' : sniffer.device\n switch (mode) {\n case 'pc':\n this.plugins.push(...[Keyboard, PC, CssFullScreen, TestSpeed, FpsDetect])\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","_typeof","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","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","isNotNull","setStyleFromCsstext","text","arr","filterStyleFromText","_cssText","cssText","styleArr","ret","remain","getStyleFromCsstext","preloadImg","onload","onerror","img","Image","stopPropagation","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","isBlob","generateSessionId","did","d","getTime","performance","uuid","c","random","createEvent","Event","initEvent","adjustTimeByDuration","duration","isEnded","createPositionBar","root","appendChild","getTransformStyle","pos","scale","rotate","transformValue","styles","translate","stylesKeys","lastIndex","convertDeg","abs","getIndexByTime","segments","_index","getOffsetCurrentTime","currentTime","_segments$_index","cTime","offset","getCurrentTimeByOffset","offsetTime","VERSION_REG","H264_MIMETYPES","sniffer","device","os","isPc","browser","navigator","ua","userAgent","toLowerCase","ie","firefox","chrome","opera","safari","filter","isWindowsPhone","isSymbian","isAndroid","isFireFox","isIpad","platform","maxTouchPoints","isTablet","isPhone","isIos","osVersion","_match","exec","version","isWeixin","toLocaleLowerCase","isSupportMP4","isSupport","mime","supportResult","canPlayType","isMSESupport","MediaSource","isTypeSupported","_logger","isHevcSupported","probeConfigSupported","defaults","supported","smooth","powerEfficient","Promise","resolve","mediaCapabilities","decodingInfo","videoConfig","audioConfig","audio","videoSupported","contentType","audioSupported","ERROR_TYPE_MAP","ERROR_MAP","Errors","player","errorInfo","errorType","errorCode","errorMessage","originError","ext","mediaError","ERROR_TYPES","i18n","media","ended","_player$media","readyState","networkState","_errc","code","playerVersion","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","SOURCE_ERROR","SOURCE_SUCCESS","VIDEO_EVENTS","STATS_EVENTS","STATS_INFO","STATS_DOWNLOAD","STATS_RESET","FPS_STUCK","emitVideoEvent","eventKey","errorHandler","getVideoEventHandler","_err","eData","originalEvent","detail","timeStamp","paused","isInternalOp","_internalOp","muted","volume","vtype","removeInnerOP","_currentTime","_rate","playbackRate","_duration","isMutedChange","_lastMuted","mediaEventMiddleware","MediaProxy","_EventEmitter","_inherits","_super","_createSuper","_this","_hasStart","mediaConfig","assign","controls","autoplay","playsinline","x5VideoPlayerFullscreen","x5VideoOrientation","airplay","tabindex","mediaType","videoAttributes","playerType","x5VideoPlayerType","Sniffer","loop","autoplayMuted","defaultPlaybackRate","attachVideoEvents","middlewares","_this2","_this3","_this4","_evHandlers","funName","charAt","toUpperCase","_defineProperty","addEventListener","_this5","removeEventListener","urls","_this6","removeAttribute","load","_c","_videoSourceCount","_videoSourceIndex","_vLoadeddata","_eHandler","_sourceError","_dIndex","removeChild","_e","k","pause","detachVideoEvents","set","play","range","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","_objectSpread","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","_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","codecType","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","BUILTIN_CLASS","MOBILE","MINI","getDefaultConfig","isCustomRoot","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","preProcessUrl","ignores","whitelist","inactive","language","marginControls","fullscreenTarget","screenShot","pip","download","mini","cssFullscreen","keyShortcut","presets","definition","customDuration","timeOffset","thumbnail","isHideTips","minWaitDelay","commonStyle","progressColor","playedColor","cachedColor","sliderBtnStyle","volumeColor","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","_i18nLangs","_ret$langKeys","pId","STATES","STATE_ARRAY","PlAYER_HOOKS","REAL_TIME_SPEED","AVG_SPEED","Player","_MediaProxy","_assertThisInitialized","_this$config","__startTime","_useAutoplay","mediaPlay","canPlayFunc","isFullScreen","delayResize","fullEl","_fullActionFrom","props","prop","from","to","isVideo","checkIsCurrentVideo","pid","_fullscreenEl","focus","fullscreen","changeFullStyle","_fullScreenOffset","cssfullscreen","exitCssFullscreen","_assertThisInitialize","needFullscreenScroll","scrollTo","left","top","recoverFullStyle","onFullscreenChange","defaultPreset","defaultIdx","userTimer","waitTimer","_state","isError","isSeeking","isCanplay","rotateDeg","isRotateFullscreen","timeSegments","_cssfullscreenEl","curDefinition","_orgCss","_videoHeight","_videoWidth","videoPos","pi","vy","vx","sizeInfo","_accPlayed","acc","loopAcc","_offsetInfo","innerContainer","topBar","__i18n","database","Database","_onceSeekCanplay","_isPauseBeforeSeek","innerStates","isActiveLocked","_initDOM","_possibleConstructorReturn","_this$config2","_this$config2$definit","defaultDefinitionObj","defaultDefinition","_bindEvents","_registerPresets","_registerPlugins","getInitDefinition","setState","onReady","hasStart","state","_this$config3","vid","line","handle","_initBaseDoms","XgVideoProxy","_nVideo","_this$config4","_width","_height","_this$root$getBoundin","getBoundingClientRect","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","_furl","_startInit","fileName","lineNumber","_this9","_src","curTime","isPaused","_error","_canplay","_this10","playPromise","onError","_errorTimer","_this11","_this12","status","_this13","_this$config5","isSeekedPlay","_status","_this14","_this$config6","_this15","bitrate","switchURL","seamless","reloadFunc","_this16","clsList","mediaPause","cls","_this17","unregisterPlugins","isResetConfig","resetState","pn","de","_this18","updateAcc","_unbindEvents","exitFullscreen","cList","isBuildIn","_this19","onPlay","_this20","cur","_srcRet","rootClass","pClassName","_orgPCss","webkitRequestFullscreen","ALLOW_KEYBOARD_INPUT","fullscreenEnabled","webkitSupportsFullscreen","webkitEnterFullscreen","exitRotateFullscreen","webkitExitFullScreen","_class","_this$config$fullscre","useCssFullscreen","_this$config$fullscre2","setRotateDeg","_rootStyle","innerHeight","deg","orientation","autoHide","delay","onFocus","ignorePaused","onBlur","_this21","isLock","blur","_ref","_ref$ignorePaused","_this22","_this23","videoHeight","endType","_at","_this$videoPos","_pi","videoWidth","_pos","offsetWidth","offsetHeight","rHeight","rWidth","formStyle","transform","webkitTransform","resizePosition","_this24","setConfig","_this25","_this26","containerSize","_this$media","_this$config7","controlsHeight","videoFit","fit","_style","paddingTop","videoScale","vWidth","vHeight","cWidth","cHeight","updateObjectPosition","objectPosition","newState","bool","_this27","curDef","targetDef","_this27$curDefinition","changeDefinition","total","dropped","corrupted","droppedRate","droppedDuration","getVideoPlaybackQuality","_quality","droppedVideoFrames","totalVideoFrames","corruptedVideoFrames","cumulateTime","_l","__url","posterUrl","update","_this$_accPlayed","isMuted","addInnerOP","descriptor","Controls","_Plugin","center","right","innerRoot","isMini","onMouseEnter","onMouseLeave","unbind","initShow","LOG_TYPES","XGLogger","isTimeUpdate","autoplayStart","_sendFF","vt","isFFLoading","isFFSend","isLs","pt","fvt","newPointTime","loadedCostTime","startCostTime","_isSeeking","seekingStart","waitingStart","fixedWaitingStart","_isWaiting","_waitTimer","_waittTimer","_waitType","suspendWaitingStatus","emitLog","suspendSeekingStatus","fixedStart","_startWaitTimeout","_onReset","_initOnceEvents","_onWaitingLoadStart","_this2$_state","_onSeeking","_onSeeked","endState","_onPlaying","_onWaiting","_onError","_onAutoplayStart","_onTimeupdate","s","_this$_state","costTime","waitTimeout","_now","_cost","_fixedCost","fixedCostTime","Replay","replay","ReplaySvg","__handleReplay","preventDefault","path","Poster","isEndedShow","hideCanplay","onTimeUpdate","_bg","fillMode","notHidden","getBgSize","AnimateMap","clearAnimation","Start","autoPlayStart","onPlayPause","initIcons","onAutoplayStart","onPlayerReset","clickHandler","switchPausePlay","cancelable","startPlay","PlaySvg","startPause","PauseSvg","isAnimate","endShow","_animateId","addAnimate","seconds","switchStatus","isShowPause","isShowEnd","endAnimate","disableAnimate","animate","Enter","innerHtml","HTMLElement","barStr","logo","xgIconTips","textKey","isShow","MiniScreenIcon","getMini","exitMini","onClick","getStyleSize","num","measurements","measurementsLength","getSize","elem","getStyle","size","innerWidth","outerWidth","outerHeight","getZeroSize","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","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","initEvents","onVideoClick","onVideoDblClick","onContextmenu","returnValue","cancelBubble","_this$player2","TOUCHS","move","MOUSES","Touche","__setPress","onTouchEnd","onTouchCancel","onTouchMove","trigger","__clearPress","moving","press","__setDb","diffx","diffy","miniStep","pressDelay","dbClickDelay","disablePress","disableDbClick","needPreventDefault","pressIntrvalId","dbIntrvalId","_initEvent","onTouchStart","__clearDb","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","focusVideoClick","dbClickHandler","pressRate","percent","updatePercent","isTouchingSeek","maxDarkness","isForward","focusHide","updateThumbnails","gradient","disableSeekIcon","miniYPer","darkness","isDisableTag","isContentEditable","Keyboard","keyCode","_keyState","disableBodyTrigger","isIgnoreUserActive","checkIsVisible","metaKey","altKey","ctrlKey","isBodyKeyDown","repeat","isKeyDown","isGlobalTrigger","checkCode","onBodyKeyUp","handleKeyDown","handleKeyUp","disableRootTrigger","onKeyup","extendkeyCodeMap","keyCodeMap","key1","seekStep","space","noBodyTarget","up","down","pressAction","esc","mergekeyCodeMap","isPress","tt","onKeydown","onBodyKeyDown","checkVisible","rec","bottom","isBodyTarget","flag","offsetCurrentTime","offsetDuration","_time","_step","_seekTime","handleKeyCode","curKeyCode","_this$keyCodeMap$arr$","_action","Loading","loadingIcon","TPL","styleKey","InnerList","fragments","_callBack","actionCallback","fragConfig","fragFocusClass","fragAutoFocus","fragClass","cachedIndex","playedIndex","focusIndex","newIndex","curIndex","millisecond","progressList","curPFrag","per","newPIndex","findIndex","unHightLight","setHightLight","_data","preIndex","fragment","cached","updateDuration","updateProgress","newCIndex","newOptions","_this$fragConfig","inner","isFocus","FRAGMENT_FOCUS_CLASS","POINT","HIGHLIGHT","Progress","_ePos","computeTime","triggerCallbacks","_updateInnerFocus","isLocked","updateWidth","seekTime","isPauseMoving","closeMoveSeek","isPlaying","onMoveStart","prePlayTime","isProgressMoving","progressBtn","_mouseDownHandlerHook","onMouseMove","onMouseUp","onMoveOnly","_assertThisInitialize5","onMoveEnd","_mouseUpHandlerHook","isEnter","_assertThisInitialize6","miniStartStep","_mouseMoveHandlerHook","_assertThisInitialize7","unlock","_this$pos","useable","__dragCallBacks","direc","_disableBlur","innerList","reset","outer","updateFocus","_initInner","isDragingSeek","isMobile","onTimeupdate","onCacheUpdate","onReset","onVideoResize","bindDomEvents","frags","boxShadow","_mouseDownHandler","_mouseUpHandler","_mouseMoveHandler","onMouseDown","onMouseOver","onMouseOut","onBodyClick","pauseAutoHide","recoverAutoHide","isCloseClickSeek","realTime","endedDiff","rLeft","timeIcon","resetActive","notSeek","_end","bufferedPoint","thumbnailPlugin","controlsMode","Icon","_onMouseenter","_onMouseLeave","Play","_IconPlugin","btnClick","tipDom","changeLangTextKey","IconPlugin","TopBackIcon","screenBack","BackSVG","Fullscreen","rotateFullscreen","handleFullscreen","toggleFullScreen","tipsDom","needBackIcon","topBackIcon","_onOrientationChange","FullScreenSvg","ExitFullScreenSvg","getCssFullscreen","getRotateFullscreen","switchCallback","Time","isActiving","constrolsMode","createCenterTime","durationDom","timeDom","centerCurDom","centerDurDom","current","minWidthTime","timeStr","updateState","TimeSegmentsControls","updateSegments","_checkIfEnabled","changeIndex","curPos","lastCurrentTime","_this$curPos","_this$player3","getSeekTime","_this$player4","_onDurationChange","_onLoadedData","_onPlay","newConfig","_segs","formatTimeSegments","_item","_segDuration","segDuration","last","_timeSegments$index","diff2","Volume","bar","barRect","barH","updateVolumePos","onBarMouseUp","_d","isMoving","unFocus","showValueLabel","updateVolumeValue","volumeSmall","volumeSmallSvg","volumeLarge","volumeLargeSvg","volumeMuted","volumeMutedSvg","_timerId","changeMutedHandler","changeMuted","_onMouseenterHandler","onMouseenter","_onMouseleaveHandler","onMouseleave","onBarMousedown","onBarMouseMove","onVolumeChange","$labelValue","innerText","isForce","miniVolume","isShowVolumeValue","Rotate","onBtnClick","innerRotate","updateRotateDeg","rootWidth","clientWidth","rootHeight","clientHeight","clockwise","videoRotateDeg","_transform","_styles","transformOrigin","times","factor","RotateSvg","PresentationMode","isPIPAvailable","isPip","exitPIP","requestPIP","showIcon","pMode","initPipEvents","switchPIP","pipIcon","PipIcon","pipIconExit","PipIconExit","leavePIPCallback","pipWindow","enterPIPCallback","pictureInPictureWindow","onWebkitpresentationmodechanged","webkitPresentationMode","checkWebkitSetPresentationMode","pipWin","textContent","styleSheets","cssRules","rule","link","rel","head","Boolean","preferDocument","isDocPIPAvailable","pipOptions","playerRect","documentPictureInPicture","requestWindow","docPiPNode","docPiPStyle","pipRoot","parentElement","previousSibling","nextSibling","copyStyleIntoPiPWindow","append","cssContent","webkitSetPresentationMode","requestPictureInPicture","reason","_documentPictureInPic","exitPictureInPicture","_documentPictureInPic2","pictureInPictureElement","pictureInPictureEnabled","disablePictureInPicture","webkitSupportsPresentationMode","protocol","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","dUrl","newUrl","getAbsoluteURL","downloadUtil","_handler","DownloadSvg","div","ScreenShot","screenshotIcon","initSize","fitVideo","onClickBtn","filename","saveLink","initMouseEvent","dispatchEvent","canvas","canvasCtx","getContext","imageSmoothingEnabled","imageSmoothingQuality","shot","saveImg","saveScreenShot","option","quality","createCanvas","dx","dy","dw","dh","mediaRatio","canvasRatio","sw","sh","drawImage","toDataURL","OptionList","maxHeight","onItemClick","renderItemList","_delegates","attrKeys","selected","showText","changeCallback","curSelected","getAttrObj","LIST_TYPES","TOGGLE_MODES","IS_MOBILE","OptionsIcon","switchActiveState","toggleMode","toggle","listType","enterType","isIcons","curValue","hidePortrait","_resizeList","optionsList","activeEvent","onEnter","onLeave","onIconClick","_isIcons","focusAwhile","curItem","changeCurrentText","isItemClickHide","getTextByLang","itemList","_maxH","heightLimit","listStyle","DefinitionIcon","_OptionsIcon","changeDefinitionList","definitionList","items","showItem","PlaybackRate","curRate","itemInfo","_text","CssFullScreen","isCssfullScreen","handleCssFullscreen","contentIcon","switchTips","CssFullSceenSvg","ExitCssFullSceenSvg","ErrorPlugin","errorRetry","handleError","retry","errorNote","Prompt","intervalId","customConfig","customOnClick","showPrompt","hidePrompt","interval","highlight","hideinterval","ISPOT","mergeISPOT","iSpot","APIS","_updateDotDom","dotDom","calcuPosition","initDots","_ispots","createDot","ispotsInit","isNew","template","positionDot","findDot","updateDot","needShow","dot","showDot","deleteDot","del","deleteAllDots","dotDoms","getElementsByTagName","updateAllDots","iSpots","ispot","positionDots","playerSize","_pop","pRect","rect1","_left","_diff","getAllDotsDom","getDotDom","CALLBACK_MAP","dragmove","dragstart","dragend","mouseover","ProgressPreview","isHideThumbnailHover","isDrag","_curDot","onDotMouseLeave","blurDot","enableBlur","focusDot","disableBlur","videoPreview","videothumbnail","handlerSpotClick","_event","transformTimeHook","setTimeContent","ispots","progressDot","initDotsAPI","extTextRoot","previewLine","timePoint","timeText","tipText","_hasThumnail","bindEvents","onMousemove","onMousedown","onMouseup","handlerPreviewClick","updatePosition","cwidth","isflex","lwidth","showTips","isFocusDots","defaultText","hideTips","updateTimeText","updateLinePos","thumbnailConfig","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","getBgColor","MiniProgress","MODES","nowTime","isSupportCanvas","DynamicBg","_frameCount","startFrameCount","stop","renderOnTimeupdate","visibilityState","_checkIfCanStart","renderOnce","_isLoaded","startInterval","_sVideo","checkVideoIsSupport","videoPI","preTime","_loopType","dynamicBg","frameRate","rwidth","rheight","renderByPoster","onLoadedData","onVisibilitychange","canvasFilter","supportCanvasFilter","isInnerRender","webkitFilter","mask","addMask","background","maskBg","_tVideo","HTMLVideoElement","flyVideo","_tagName","updateImg","_this$canvas$getBound","image","sourcePI","_this$canvas$getBound2","multiple","checkIsSupportCanvas","INFO","Stats","actionData","_getTime","_stats","stats","getStats","JSON","stringify","downloadUrl","disabled","timestamp","timeFormat","toISOString","_recordUserActions","_recordInfo","_downloadStats","profile","_infoProfile","_info","startMs","endMs","cat","dur","ph","tid","ts","_this$_stats","mediaElem","mediaInfo","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","onGapJump","threshold","bufferedInfo","_getBuffered","WaitingTimeoutJump","jumpCnt","jumpCntMax","useWaitingTimeoutJump","onJump","waitingTime","DEFAULT_SPEED_TYPE","SPEED_TYPE","TestSpeed","speedListCache","initSpeedList","cnt","testSpeed","testTimeStep","speed","appendList","openSpeed","loadSize","testCnt","testSpeedUrl","xhr","headers","Range","setRequestHeader","onreadystatechange","getResponseHeader","saveSpeedMax","shift","realTimeSpeed","getSpeedName","updateSpeed","getSpeed","avgSpeed","speedName","addSpeedTypeList","_onRealSpeedChange","namePrefix","FpsDetect","_lastDecodedFrames","_currentStuckCount","_lastCheckPoint","_payload","_startTick","_stopTick","_timer","_checkDecodeFPS","tick","curDecodedFrames","checkInterval","hidden","enoughBuffer","bufs","stuckCount","_reset","reportFrame","_this$player$media$ge","currTime","curDecoded","_checkStuck","DefaultPreset","_this$plugins","_this$plugins2","_this$plugins3","simulateMode","basePlugin","vodPlugins","TimeSegments","TimeIcon","contolsIcons","FullScreen","RotateIcon","PlaybackRateIcon","DownLoadIcon","ScreenShotIcon","PIPIcon","layers","Miniscreen","Xglogger","Mobile","PresetPlayer","_Player"],"mappings":"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"}
|
|
1
|
+
{"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/mediaProxy.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/lang/i18n.js","../src/lang/en.js","../src/state.js","../src/player.js","../src/plugins/controls/index.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/common/iconTools.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/time/timesegments.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/plugins/fpsDetect/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 : 0\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 { {[propName: string]: any} } [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}\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\nutil.isNotNull = function (val) {\n return !(val === undefined || val === null)\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<any>} 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<string> } [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 }\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 if (e.touches && e.touches.length > 0) {\n e = e.touches[0]\n }\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\nutil.isBlob = function (url) {\n return typeof url === 'string' && /^blob/.test(url)\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\nutil.createEvent = function (eventName) {\n let event\n if (typeof window.Event === 'function') {\n event = new Event(eventName)\n } else {\n event = document.createEvent('Event')\n event.initEvent(eventName, true, true)\n }\n return event\n}\n\n/**\n * @description Adjust currentTime according to duration, when ended is true and currentTime is less than duration, or\n * currentTime is greater than duration, return duration\n * @param { number } time\n * @param { number } duration\n * @param { boolean } isEnded\n * @returns { number } Adjusted time\n */\nutil.adjustTimeByDuration = function (time, duration, isEnded) {\n if (!duration || !time) {\n return time\n }\n if (time > duration || (isEnded && time < duration)) {\n return duration\n }\n return time\n}\n\nutil.createPositionBar = function (className, root) {\n const dom = util.createDom(\n 'xg-bar',\n '',\n { 'data-index': -1 },\n className\n )\n root.appendChild(dom)\n return dom\n}\n\nutil.getTransformStyle = function (pos = { x: 0, y: 0, scale: 1, rotate: 0 }, transformValue = '') {\n const styles = {\n scale: `${pos.scale || 1}`,\n translate: `${pos.x || 0}%, ${pos.y || 0}%`,\n rotate: `${pos.rotate || 0}deg`\n }\n const stylesKeys = Object.keys(styles)\n\n // 只复写Transform中已知的函数,对于其他函数不修改。解决全屏或者rotate插件执行时,对于镜像插件的影响\n stylesKeys.forEach((key) => {\n const reg = new RegExp(`${key}\\\\([^\\\\(]+\\\\)`, 'g') // reg match: TransformFunc(values)\n const fn = `${key}(${styles[key]})`\n if (reg.test(transformValue)) {\n reg.lastIndex = -1\n transformValue = transformValue.replace(reg, fn)\n } else {\n transformValue += `${fn} `\n }\n })\n return transformValue\n}\n\n/**\n * @description 角度换算\n * @param {number} val\n * @returns {number}\n */\nutil.convertDeg = function (val) {\n if (Math.abs(val) <= 1) {\n return val * 360\n }\n return val % 360\n}\n\nutil.getIndexByTime = function (time, segments) {\n const _len = segments.length\n let _index = -1\n if (_len < 1) {\n return _index\n }\n if (time <= segments[0].end || _len < 2) {\n _index = 0\n } else if (time > segments[_len - 1].end) {\n _index = _len - 1\n } else {\n for (let i = 1; i < _len; i++) {\n if (time > segments[i - 1].end && time <= segments[i].end){\n _index = i\n break\n }\n }\n }\n return _index\n}\nutil.getOffsetCurrentTime = function (currentTime, segments, index = -1) {\n let _index = -1\n if (index >= 0 && index < segments.length) {\n _index = index\n } else {\n _index = util.getIndexByTime(currentTime, segments)\n }\n if (_index < 0) {\n return -1\n }\n const _len = segments.length\n const { start, end, cTime, offset } = segments[_index]\n if (currentTime < start) {\n return cTime\n } else if (currentTime >= start && currentTime <= end) {\n return currentTime - offset\n } else if (currentTime > end && _index >= _len - 1) {\n return end\n }\n return -1\n}\n\n/**\n *\n * @param {*} offsetTime\n * @param {*} segments\n * @returns\n */\nutil.getCurrentTimeByOffset = function (offsetTime, segments) {\n let _index = -1\n if (!segments || segments.length < 0) {\n return offsetTime\n }\n for (let i = 0; i < segments.length; i++) {\n if (offsetTime <= segments[i].duration) {\n _index = i\n break\n }\n }\n if (_index !== -1) {\n const { start } = segments[_index]\n if (_index - 1 < 0) {\n return start + offsetTime\n } else {\n return start + (offsetTime - segments[_index - 1].duration)\n }\n }\n return offsetTime\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<MediaCapabilitiesDecodingInfo>\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 isIpad = /(?:iPad|PlayBook)/.test(ua) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)\n const isTablet =\n isIpad ||\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 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 * @description check is support MediaSource Extends\n * @param {string} [mime]\n * @returns { boolean }\n */\n isMSESupport (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n if (typeof MediaSource === 'undefined' || !MediaSource) return false\n try {\n return MediaSource.isTypeSupported(mime)\n } catch (error) {\n this._logger.error(mime, error)\n return false\n }\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<MediaCapabilitiesDecodingInfo> }\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: 'media',\n 2: 'media',\n 3: 'media',\n 4: 'media',\n 5: 'media',\n 6: 'media'\n}\n\nconst ERROR_MAP = {\n 1: 5101,\n 2: 5102,\n 3: 5103,\n 4: 5104,\n 5: 5105,\n 6: 5106\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.media) {\n const mediaError = errorInfo.mediaError ? errorInfo.mediaError : (player.media.error || {})\n const { duration, currentTime, ended, src, currentSrc } = player\n const { readyState, networkState } = player.media\n let _errc = errorInfo.errorCode || mediaError.code\n if (ERROR_MAP[_errc]) {\n _errc = ERROR_MAP[_errc]\n }\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: _errc,\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 LOADED_METADATA = 'loadedmetadata'\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 SOURCE_ERROR = 'source_error'\n\nexport const SOURCE_SUCCESS = 'source_success'\n\nexport const SWITCH_SUBTITLE = 'switch_subtitle'\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 'loadedmetadata',\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\nexport const FPS_STUCK = 'fps_stuck'","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, SOURCE_ERROR, SOURCE_SUCCESS } 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 * } } IMediaProxy\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.media && player.media.currentTime\n }\n\n // 避免playbackRate和defaultPlaybackRate同时设置导致多次触发事件\n if (eventKey === 'ratechange') {\n const _rate = player.media ? player.media.playbackRate : 0\n if (_rate && player._rate === _rate) {\n return\n }\n player._rate = player.media && player.media.playbackRate\n }\n\n if (eventKey === 'durationchange') {\n player._duration = player.media.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.mediaEventMiddleware[eventKey]) {\n const callback = emitVideoEvent.bind(player, eventKey, eData)\n try {\n player.mediaEventMiddleware[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 MediaProxy 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.mediaConfig = 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: options.tabindex | 0,\n mediaType: options.mediaType || 'video',\n 'data-index': -1\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.mediaConfig['x5-video-player-type'] = playerType\n delete this.mediaConfig.playsinline\n delete this.mediaConfig['webkit-playsinline']\n delete this.mediaConfig['x5-playsinline']\n }\n\n if (options.loop) {\n this.mediaConfig.loop = 'loop'\n }\n\n // Warning:一些移动端浏览器需要设置DOM属性,否则会导致非静音切换频地址后开播失败\n if (options.autoplayMuted && !Object.prototype.hasOwnProperty.call(this.mediaConfig, 'muted')) {\n this.mediaConfig.muted = true\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n */\n this.media = Util.createDom(this.mediaConfig.mediaType, '', this.mediaConfig, '')\n\n if (options.defaultPlaybackRate) {\n this.media.defaultPlaybackRate = this.media.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.media.muted = true\n this._lastMuted = true\n }\n if (options.autoplay) {\n this.media.autoplay = true\n }\n\n /**\n * @private\n */\n this._interval = {}\n /**\n * @readonly\n */\n this.mediaEventMiddleware = {}\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.mediaEventMiddleware[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.mediaEventMiddleware[key]\n })\n }\n\n /**\n * Add media eventListener to the video object\n * @param { any } [media]\n */\n attachVideoEvents (media = this.media) {\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 media.addEventListener(eventKey, item[eventKey], false)\n })\n }\n\n /**\n * @description remove media eventListener from the video object\n * @param { any } [media]\n */\n detachVideoEvents (media = this.media) {\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n media.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 video.load()\n urls.forEach((item, index) => {\n this.media.appendChild(Util.createDom('source', '', {\n src: `${item.src}`,\n type: `${item.type || ''}`,\n 'data-index': index + 1\n }))\n })\n const _c = video.children\n if (!_c) {\n return\n }\n /**\n * @private\n */\n this._videoSourceCount = _c.length\n\n this._videoSourceIndex = _c.length\n\n this._vLoadeddata = (e) => {\n this.emit(SOURCE_SUCCESS, { src: e.target.currentSrc, host: Util.getHostFromUrl(e.target.currentSrc) })\n }\n\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 // safari有些版本不是所有source都请求,导致单独使用_videoSourceIndex计算会报错\n !this._sourceError && (this._sourceError = (e) => {\n const _dIndex = parseInt(e.target.getAttribute('data-index'), 10)\n this._videoSourceIndex--\n if (this._videoSourceIndex === 0 || _dIndex >= this._videoSourceCount) {\n const _err = { code: 4, message: 'sources_load_error' }\n _eHandler ? _eHandler.error(e, _err) : this.errorHandler('error', _err)\n }\n const type = ERROR_TYPE_MAP[4]\n this.emit(SOURCE_ERROR, new Errors(this, {\n errorType: type,\n errorCode: 4,\n errorMessage: 'sources_load_error',\n mediaError: { code: 4, message: 'sources_load_error' },\n src: e.target.src\n }))\n })\n for (let i = 0; i < _c.length; i++) {\n _c[i].addEventListener('error', this._sourceError)\n }\n video.addEventListener('loadeddata', this._vLoadeddata)\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 this._vLoadeddata && video.removeEventListener('loadeddata', this._vLoadeddata)\n }\n\n /**\n * @description Media Error handler\n * @param { string } eventName\n */\n errorHandler (name, error = null) {\n if (this.media && (this.media.error || error)) {\n let _e = this.media.error || error\n const type = _e.code ? ERROR_TYPE_MAP[_e.code] : 'other'\n let message = _e.message\n if (!this.media.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.media) {\n if (this.media.pause) {\n this.media.pause()\n this.media.muted = true\n }\n this.media.removeAttribute('src') // empty source\n this.media.load()\n }\n this._currentTime = 0\n this._duration = 0\n this.mediaConfig = 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.media = null\n this.mediaEventMiddleware = {}\n this.removeAllListeners()\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media\n */\n get video () {\n return this.media\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media= xx\n */\n set video (media) {\n this.media = media\n }\n\n /**\n *\n * @returns { Promise<void> | null }\n */\n play () {\n const ret = this.media ? this.media.play() : null\n return ret\n }\n\n pause () {\n this.media && this.media.pause()\n }\n\n load () {\n this.media && this.media.load()\n }\n\n /**\n *\n * @param { string } type\n * @returns { boolean }\n */\n canPlayType (type) {\n return this.media ? this.media.canPlayType(type) : false\n }\n\n /**\n *\n * @param { any } [buffered]\n * @returns { Array<number> }\n */\n getBufferedRange (buffered) {\n const range = [0, 0]\n if (!this.media) {\n return range\n }\n if (!buffered) {\n buffered = this.media.buffered\n }\n const currentTime = this.media.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.media && (this.media.autoplay = isTrue)\n }\n\n get autoplay () {\n return this.media ? this.media.autoplay : false\n }\n\n /**\n * @type { TimeRanges | null }\n * @description 返回当前缓冲的TimeRange对象集合\n */\n get buffered () {\n return this.media ? this.media.buffered : null\n }\n\n /**\n * @type { Array<{start: number, end: number}> | null}\n * @description 返回当前自定义的缓存列表\n */\n get buffered2 () {\n return this.media && this.media.buffered ? Util.getBuffered2(this.media.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.media) {\n return ret\n }\n const _buffered = this.media.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.media ? this.media.crossOrigin : ''\n }\n\n set crossOrigin (isTrue) {\n this.media && (this.media.crossOrigin = isTrue)\n }\n\n /**\n * @type { string }\n * @description 设置/返回视频播放地址\n * */\n get currentSrc () {\n return this.media ? this.media.currentSrc : ''\n }\n\n set currentSrc (src) {\n this.media && (this.media.currentSrc = src)\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频当前播放时间\n * */\n get currentTime () {\n if (!this.media) {\n return 0\n }\n return this.media.currentTime !== undefined ? this.media.currentTime : this._currentTime\n }\n\n set currentTime (time) {\n this.media && (this.media.currentTime = time)\n }\n\n /**\n * @type { boolean }\n * 设置/返回视频默认静音\n * */\n get defaultMuted () {\n return this.media ? this.media.defaultMuted : false\n }\n\n set defaultMuted (isTrue) {\n this.media && (this.media.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.media ? this.media.ended : false\n }\n\n /**\n * @type { MediaError }\n * @description the player current error\n */\n get error () {\n return this.media.error\n }\n\n /**\n * @type { string }\n * @description return error description text\n */\n get errorNote () {\n const err = this.media.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.media.error.code - 1]\n }\n\n /**\n * @type { boolean }\n * @description 否开启了循环播放\n */\n get loop () {\n return this.media ? this.media.loop : false\n }\n\n set loop (isTrue) {\n this.media && (this.media.loop = isTrue)\n }\n\n /**\n * @type { boolean }\n * @description 静音\n */\n get muted () {\n return this.media ? this.media.muted : false\n }\n\n set muted (isTrue) {\n if (!this.media || this.media.muted === isTrue) {\n return\n }\n this._lastMuted = this.media.muted\n this.media.muted = isTrue\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 }\n * @description 返回视频的当前网络状态\n */\n get networkState () {\n return this.media.networkState\n }\n\n /**\n * @type { boolean }\n * @description 回当前视频是否是暂停状态\n */\n get paused () {\n return this.media ? this.media.paused : true\n }\n\n /**\n * @type { number }\n * @description 返回/设置倍速\n */\n get playbackRate () {\n return this.media ? this.media.playbackRate : 0\n }\n\n set playbackRate (rate) {\n if (!this.media || rate === Infinity) {\n return\n }\n this.media.defaultPlaybackRate = rate\n this.media.playbackRate = rate\n }\n\n /**\n * @type { TimeRanges | null}\n */\n get played () {\n return this.media ? this.media.played : null\n }\n\n /**\n * @type { boolean }\n */\n get preload () {\n return this.media ? this.media.preload : false\n }\n\n set preload (isTrue) {\n this.media && (this.media.preload = isTrue)\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 | 4 }\n * @description 回视频的就绪状态\n */\n get readyState () {\n return this.media.readyState\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否可以seek\n */\n get seekable () {\n return this.media ? this.media.seekable : false\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否处于seeking状态下\n */\n get seeking () {\n return this.media ? this.media.seeking : false\n }\n\n /**\n * @type { any }\n * @description 设置/返回当前视频的地址\n */\n get src () {\n return this.media ? this.media.src : ''\n }\n\n set src (url) {\n if (!this.media) {\n return\n }\n this.emit(URL_CHANGE, url)\n this.emit(WAITING)\n // this.media.pause()\n this._currentTime = 0\n this._duration = 0\n // Some firefox versions firefox Cannot recognize currentSrc of type Blob\n if (Util.isMSE(this.media)) {\n this.onWaiting()\n return\n }\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array') {\n this._attachSourceEvents(this.media, url)\n } else if (url) {\n this.media.src = url\n } else {\n this.media.removeAttribute('src')\n }\n this.load()\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频的音量\n */\n get volume () {\n return this.media ? this.media.volume : 0\n }\n\n set volume (vol) {\n if (vol === Infinity || !this.media) {\n return\n }\n this.media.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 MediaProxy\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<string> } [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<string> } 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<any> } 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<any> } 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<String> } 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<string> } querySelector\n * @param { string | Array<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<string> } querySelector\n * @param { string | Array<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 <any> } 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(player.config.mediaType, player.config.codecType)) {\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 BUILTIN_CLASS: 'xgplayer-built-in',\n MOBILE: 'xgplayer-mobile',\n MINI: 'xgplayer-mini' // mini screen play status\n}\n","import { getLang } from './utils/util'\n\n/**\n * @typedef { string | MediaStream | Array<{src: string, type?:string, [propName: string]: any}> } IUrl\n */\n\n/**\n * @typedef {{\n * url: IUrl,\n * definition: any,\n * bitrate?: number,\n * bandwidth?: number,\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?: IUrl,\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'|'contain',\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 * preProcessUrl?: (url: IUrl, ext?: { [propName: string]: any }) => { url: IUrl, [propName: string]: 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<number> | { [propName: string]: any },\n * definition?: { list: Array<IDefinition> , 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<any>,\n * tabindex?: number,\n * thumbnail?: {\n * urls: Array<string>,\n * pic_num: number,\n * col: number,\n * row: number,\n * height?: number,\n * width?: number,\n * },\n * videoConfig?: { [propName: string]: any },\n * isHideTips?: boolean,\n * minWaitDelay?: number,\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 isNoRoot: false, // 是否是无root状态\n isCustomRoot: true, // 是否是自定义root\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: true, // 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.media.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 preProcessUrl: null, // url preprocessing callback\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 tabindex: 0, // The order of mediaElement focus\n thumbnail: null, // Preview image configuration\n videoConfig: {}, // video attribute configuration\n isHideTips: false, // if hide the icon tips\n minWaitDelay: 200, // The min threshold of waiting delay time\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","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<string>, // 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<IXGI18nText> } 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<string> }\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","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 MediaProxy from './mediaProxy'\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 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 * @typedef { import ('./defaultConfig').IUrl } IUrl\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 MediaProxy {\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 const { presets } = this.config\n if (presets.length) {\n const defaultIdx = presets.indexOf('default')\n if (defaultIdx >= 0 && defaultPreset) {\n presets[defaultIdx] = defaultPreset\n }\n } else if (defaultPreset) {\n 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._useAutoplay = false\n /**\n * @description 记录起播需要seek的时间点\n * @private\n * @readonly\n */\n this.__startTime = -1\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 this.timeSegments = []\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 this.videoPos = {\n pi: 1, // 宽高比\n scale: 0,\n rotate: -1,\n x: 0,\n y: 0,\n h: -1, // 高度占比\n w: -1, // 宽度占比\n vy: 0, // 画面在y方向的偏移\n vx: 0 // 画面在x方向的偏移\n }\n\n this.sizeInfo = {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\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 * @description 播放器时长、播放时间偏移信息\n */\n this._offsetInfo = {\n currentTime: -1,\n duration: 0\n }\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 控制栏和video不同布局的时候内部容器\n */\n this.innerContainer = 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 /**\n * @private\n * @description seek之后canplay回调函数定义\n * @type { Function | null }\n */\n this._onceSeekCanplay = null\n\n /**\n * @description 记录seek之前是否处于暂停状态\n * @type { number }\n * @private\n */\n this._isPauseBeforeSeek = 0\n\n /**\n * @description 内部状态记录\n * @type { {\n * isActiveLocked: boolean;\n * } }\n * @readonly\n */\n this.innerStates = {\n // 当前的active是否是锁定状态\n isActiveLocked: false\n }\n\n const {isNoRoot} = this.config\n const rootInit = !isNoRoot && this._initDOM()\n if (!isNoRoot && !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 const { id, el, isCustomRoot, controls, autoplay, isMobileSimulateMode } = this.config\n this.root = id ? document.getElementById(id) : null\n if (!this.root) {\n if (el && el.nodeType === 1) {\n this.root = el\n } else if (isCustomRoot) {\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 } else {\n this.root = Util.createDom('div', '', { id, class: STATE_CLASS.BUILTIN_CLASS })\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.mediaConfig.mediaType === XgVideoProxy.mediaType) {\n const el = this.innerContainer || this.root\n this.detachVideoEvents(this.media)\n const _nVideo = new XgVideoProxy(el, this.config, this.mediaConfig)\n this.attachVideoEvents(_nVideo)\n this.media = _nVideo\n }\n this.media.setAttribute(PLATER_ID, this.playerId)\n const device = isMobileSimulateMode === 'mobile' ? 'mobile' : Sniffer.device\n this.addClass(\n `${STATE_CLASS.DEFAULT} ${STATE_CLASS.INACTIVE} xgplayer-${device} ${\n controls ? '' : STATE_CLASS.NO_CONTROLS\n }`\n )\n if (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 const { width, height, left, top } = this.root.getBoundingClientRect()\n this.sizeInfo.width = width\n this.sizeInfo.height = height\n this.sizeInfo.left = left\n this.sizeInfo.top = top\n return true\n }\n\n /**\n * @private\n */\n _initBaseDoms () {\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.topBar = null\n /**\n * @readonly\n * @type { HTMLElement |null }\n */\n this.leftBar = null\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.rightBar = null\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\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.media.addEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.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.media.focus()\n }\n }\n this.once(Events.PLAY, this.playFunc)\n }\n\n /**\n * @private\n */\n _unbindEvents () {\n this.root && 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.media.removeEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.removeEventListener('webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n /**\n *\n * @param { any } url\n * @returns\n */\n _startInit (url) {\n if (!this.media) {\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.media)\n if (Util.typeOf(url) === 'Array' && url.length > 0) {\n this._attachSourceEvents(this.media, url)\n } else if (!this.media.src || this.media.src !== url) {\n this.media.src = url\n } else if (!url) {\n this.media.removeAttribute('src')\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 (_root && this.media instanceof window.Element && !_root.contains(this.media)) {\n _root.insertBefore(this.media, _root.firstChild)\n }\n\n const { readyState } = this.media\n XG_DEBUG.logInfo('_startInit readyState', readyState)\n if (this.config.autoplay) {\n !Util.isMSE(this.media) && this.load();\n // ios端无法自动播放的场景下,不调用play不会触发canplay loadeddata等事件\n (Sniffer.os.isIpad || Sniffer.os.isPhone) && this.mediaPlay()\n }\n\n const { startTime } = this.config\n this.__startTime = startTime > 0 ? startTime : -1\n this.config.startTime = 0\n if (readyState >= 2 && this.duration > 0) {\n this.canPlayFunc()\n } else {\n this.on(Events.CANPLAY, this.canPlayFunc)\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(this, () => {\n this.emit(Events.COMPLETE)\n }, 0)\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 if (!this.rightBar) {\n this.rightBar = Util.createPositionBar('xg-right-bar', this.root)\n }\n _root = this.rightBar\n break\n case POSITIONS.ROOT_LEFT:\n if (!this.leftBar) {\n this.leftBar = Util.createPositionBar('xg-left-bar', this.root)\n }\n _root = this.leftBar\n break\n case POSITIONS.ROOT_TOP:\n if (!this.topBar) {\n this.topBar = Util.createPositionBar('xg-top-bar', this.root)\n if (this.config.topBarAutoHide) {\n Util.addClass(this.topBar, STATE_CLASS.TOP_BAR_AUTOHIDE)\n }\n }\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 = PLUFGIN.pluginName === 'controls' ? this.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> | void }\n * @description 启动播放器,start一般都是播放器内部隐式调用,主要功能是将video添加到DOM\n */\n start (url) {\n // 已经开始初始化播放了 则直接调用play\n if (this.state > STATES.ATTACHING) {\n return\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 _furl = this.preProcessUrl(url)\n const ret = this._startInit(_furl.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 | {\n * seamless?: boolean,\n * currentTime?: number,\n * bitrate?: number\n * } } [options]\n * @returns { Promise | null } 执行结果\n */\n switchURL (url, options) {\n let _src = url\n if (Util.typeOf(url) === 'Object') {\n _src = url.url\n }\n _src = this.preProcessUrl(_src).url\n const curTime = this.currentTime\n this.__startTime = curTime\n const isPaused = this.paused && !this.isError\n this.src = _src\n return new Promise((resolve, reject) => {\n const _error = (e) => {\n this.off('timeupdate', _canplay)\n this.off('canplay', _canplay)\n reject(e)\n }\n const _canplay = () => {\n if (this.duration > 0 && this.__startTime > 0) {\n this.currentTime = this.__startTime\n this.__startTime = -1\n }\n if (isPaused) {\n this.pause()\n }\n this.off('error', _error)\n resolve(true)\n }\n this.once('error', _error)\n if (!_src){\n this.errorHandler('error', {code: 6, message: 'empty_src'})\n return\n }\n if (Sniffer.os.isAndroid) {\n this.once('timeupdate', _canplay)\n } else {\n this.once('canplay', _canplay)\n }\n this.play()\n })\n }\n\n /**\n * @description call play without play hook\n * @deprecated this api renamed to mediaPlay, you can call it as player.mediaPlay()\n */\n videoPlay () {\n this.mediaPlay()\n }\n\n /**\n * @description call play without play hook\n */\n mediaPlay () {\n if (!this.hasStart && this.state < STATES.ATTACHED) {\n this.removeClass(STATE_CLASS.NO_START)\n this.addClass(STATE_CLASS.ENTER)\n this.start()\n this._useAutoplay = true\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.media && this.media.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 /**\n * @description call play without pause hook\n */\n mediaPause () {\n super.pause()\n }\n\n /**\n * @description call play without pause hook\n * @deprecated this api renamed to mediaPause, you can call it as player.mediaPause()\n */\n videoPause () {\n super.pause()\n }\n\n play () {\n this.removeClass(STATE_CLASS.PAUSED)\n return runHooks(this, 'play', () => {\n return this.mediaPlay()\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.media || Number.isNaN(Number(time)) || !this.hasStart) {\n return\n }\n const { isSeekedPlay, seekedStatus } = this.config\n const _status = status || (isSeekedPlay ? 'play' : seekedStatus)\n time = time < 0 ? 0 : time > this.duration ? parseInt(this.duration, 10) : time\n\n !this._isPauseBeforeSeek && (this._isPauseBeforeSeek = this.paused ? 2 : 1)\n\n this._onceSeekCanplay && this.off(Events.SEEKED, this._onceSeekCanplay)\n\n this._onceSeekCanplay = () => {\n // const { seekedStatus } = this.config\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._isPauseBeforeSeek > 1 || this.paused ? this.pause() : this.play()\n }\n this._isPauseBeforeSeek = 0\n this._onceSeekCanplay = null\n }\n\n this.once(Events.SEEKED, this._onceSeekCanplay)\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n this.currentTime = time\n // 未起播状态不论希望保持什么状态,都要触发一次play, 避免ios下起播异常问题\n 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 { import('./defaultConfig').IDefinition } 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 if (to?.bitrate && typeof to.bitrate !== 'number') {\n to.bitrate = parseInt(to.bitrate, 10) || 0\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 seamless: definition.seamless !== false\n && typeof MediaSource !== 'undefined'\n && typeof MediaSource.isTypeSupported === 'function',\n ...to\n })\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._useAutoplay = false\n this.mediaPause()\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.NO_START)\n this.emit(Events.RESET)\n }\n\n /**\n * 重置播放实例\n * @param { Array<string> } 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, media } = this\n if (!root || !media) {\n return\n }\n this.hasStart = false\n this._useAutoplay = false\n root.removeAttribute(PLATER_ID)\n this.updateAcc('destroy')\n this._unbindEvents()\n this._detachSourceEvents(this.media)\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 media instanceof window.Node &&\n root.contains(media) &&\n root.removeChild(media);\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 const isBuildIn = Util.hasClass(this.root, STATE_CLASS.BUILTIN_CLASS)\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 // 内建的root,在销毁的时候需要移除\n isBuildIn && this.root.parentNode && this.root.parentNode.removeChild(this.root)\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.SEEKED, () => {\n const playPromise = this.mediaPlay()\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 const { url } = this.config\n const _srcRet = !Util.isMSE(this.media) ? this.preProcessUrl(url) : { url }\n this.src = _srcRet.url\n !this.config.isLive && (this.currentTime = cur)\n this.once(Events.CANPLAY, () => {\n this.mediaPlay()\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<void> }\n */\n getFullscreen (el = this.config.fullscreenTarget) {\n const { root, media } = 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 Promise.resolve()\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 (media.fullscreenEnabled || media.webkitSupportsFullscreen) {\n media.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<void> }\n */\n exitFullscreen (el) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n }\n if (!this._fullscreenEl && !Util.getFullScreenEl()) {\n return\n }\n const { root, media } = 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 (media && media.webkitSupportsFullscreen) {\n media.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 = this.config.fullscreenTarget) {\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._rootStyle = this.root.getAttribute('style')\n this.root.style.width = `${window.innerHeight}px`\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 if (this._rootStyle) {\n this.root.style.style = this._rootStyle\n this._rootStyle = false\n }\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 * isLock?: boolean // 是否锁定, 锁定之后自动呼出和blur调用都不生效, 默认值false\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, isLock?: boolean } } [data]\n * @returns\n */\n onFocus (data = { autoHide: true, delay: 3000 }) {\n const { innerStates } = this\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 (data.isLock !== undefined) {\n innerStates.isActiveLocked = data.isLock\n }\n if (data.autoHide === false || data.isLock === true || innerStates.isActiveLocked) {\n if (this.userTimer) {\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n return\n }\n const time = data && data.delay ? data.delay : this.config.inactive\n this.userTimer = Util.setTimeout(this, () => {\n this.userTimer = null\n this.blur()\n }, time)\n }\n\n /**\n * @protected\n * @param {{ ignorePaused?: boolean }} [data]\n * @returns\n */\n onBlur ({ ignorePaused = false } = {}) {\n if (!this.isActive || this.innerStates.isActiveLocked) {\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, defaultPlaybackRate } = this.config\n\n XG_DEBUG.logInfo('player', 'canPlayFunc, startTime', this.__startTime)\n if (this.__startTime > 0 && this.duration > 0) {\n this.currentTime = this.__startTime > this.duration ? this.duration : this.__startTime\n this.__startTime = -1\n }\n\n // 解决浏览器安装了一些倍速扩展插件的情况下,倍速设置失效问题\n this.playbackRate = defaultPlaybackRate;\n\n (autoplay || this._useAutoplay) && this.mediaPlay()\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.media.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.media.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.media\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.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.ERROR)\n this.removeClass(STATE_CLASS.LOADING)\n this.isCanplay = true\n this.waitTimer && Util.clearTimeout(this, this.waitTimer)\n }\n\n onDurationchange () {\n if (this.__startTime > 0 && this.duration > 0) {\n this.currentTime = this.__startTime\n this.__startTime = -1\n }\n }\n\n onLoadeddata () {\n this.isError = false\n this.isSeeking = false\n }\n\n onLoadstart () {\n this.removeClass(STATE_CLASS.ERROR)\n this.isCanplay = 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 }, this.config.minWaitDelay)\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 if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n /**\n * @protected\n */\n onTimeupdate () {\n !this._videoHeight && this.media.videoHeight && this.resize()\n if ((this.waitTimer || this.hasClass(STATE_CLASS.LOADING)) &&\n this.media.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.media || !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.media.buffered\n if (!buffered || buffered.length === 0 || !this.duration) {\n return true\n }\n const currentTime = time || this.media.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 resizePosition () {\n const { rotate, vy, vx, h, w } = this.videoPos\n if (rotate < 0 && !vy && !vx) {\n return\n }\n let _pi = this.videoPos._pi\n if (!_pi && this.media.videoHeight) {\n _pi = this.media.videoWidth / this.media.videoHeight * 100\n }\n if (!_pi) {\n return\n }\n this.videoPos.pi = _pi\n const _pos = {\n rotate: rotate\n }\n let offsetY = 0\n let offsetX = 0\n let scale = 1\n const _t = rotate < 0 ? 0 : Math.abs(rotate / 90)\n const { root, innerContainer } = this\n const width = root.offsetWidth\n const height = innerContainer ? innerContainer.offsetHeight : root.offsetHeight\n let rHeight = height\n let rWidth = width\n if (_t % 2 === 0) {\n scale = h > 0 ? 100 / h : (w > 0 ? 100 / w : 1)\n _pos.scale = scale\n offsetY = vy > 0 ? (100 - h) / 2 - vy : 0\n _pos.y = _t === 2 ? 0 - offsetY : offsetY\n offsetX = vx > 0 ? (100 - w) / 2 - vx : 0\n _pos.x = _t === 2 ? 0 - offsetX : offsetX\n this.media.style.width = `${rWidth}px`\n this.media.style.height = `${rHeight}px`\n } else if (_t % 2 === 1) {\n rWidth = height\n rHeight = width\n const offset = height - width\n offsetX = -offset / 2 / rWidth * 100\n _pos.x = _t === 3 ? offsetX + vy / 2 : offsetX - vy / 2\n offsetY = offset / 2 / rHeight * 100\n _pos.y = _t === 3 ? offsetY + vx / 2 : offsetY - vx / 2\n _pos.scale = scale\n this.media.style.width = `${rWidth}px`\n this.media.style.height = `${rHeight}px`\n }\n const formStyle = Util.getTransformStyle(_pos, this.media.style.transform || this.media.style.webkitTransform)\n this.media.style.transform = formStyle\n this.media.style.webkitTransform = formStyle\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.media || !pos || !pos.h) {\n return\n }\n const { videoPos } = this\n videoPos.h = pos.h * 100 || 0\n videoPos.w = pos.w * 100 || 0\n videoPos.vx = pos.x * 100 || 0\n videoPos.vy = pos.y * 100 || 0\n this.resizePosition()\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 runHooks(this, 'playnext', () => {\n this.start()\n this.emit(Events.PLAYNEXT, config)\n })\n }\n\n resize () {\n if (!this.media || !this.root) {\n return\n }\n const containerSize = this.root.getBoundingClientRect()\n this.sizeInfo.width = containerSize.width\n this.sizeInfo.height = containerSize.height\n this.sizeInfo.left = containerSize.left\n this.sizeInfo.top = containerSize.top\n const { videoWidth, videoHeight } = this.media\n const { fitVideoSize, videoFillMode } = this.config\n\n if (videoFillMode === 'fill' || videoFillMode === 'cover' || videoFillMode === 'contain') {\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 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.resizePosition()\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.media.updateObjectPosition) {\n this.media.updateObjectPosition(left, top)\n return\n }\n this.media.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 * @description url preprocessing\n * @param { IUrl } url\n * @param { {[propName: string]: any} } [ext]\n * @returns { url: IUrl, [propName: string]: any }\n */\n preProcessUrl (url, ext) {\n const { preProcessUrl } = this.config\n return !Util.isBlob(url) && preProcessUrl && typeof preProcessUrl === 'function' ? preProcessUrl(url, ext) : { url }\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.<IDefinition> }\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.media || !this.media.getVideoPlaybackQuality) {\n return ret\n }\n const _quality = this.media.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 { null | Object }\n * @readonly\n * @description 控制栏插件\n */\n get controls () {\n return this.plugins.controls\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 get readyState () {\n return super.readyState\n }\n\n get error () {\n const key = super.error\n return this.i18n[key] || key\n }\n\n get networkState () {\n return super.networkState\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 { acc, t } = this._accPlayed\n return t ? new Date().getTime() - t + acc : 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 * @type {number}\n * @description Media element rotation angle, Only multiples of 90 degrees are supported\n */\n set videoRotateDeg (val) {\n val = Util.convertDeg(val)\n if (val % 90 !== 0 || val === this.videoPos.rotate) {\n return\n }\n this.videoPos.rotate = val\n this.resizePosition()\n }\n\n get videoRotateDeg () {\n return this.videoPos.rotate\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 get offsetCurrentTime () {\n return this._offsetInfo.currentTime || 0\n }\n\n set offsetCurrentTime (val) {\n this._offsetInfo.currentTime = val\n }\n\n get offsetDuration () {\n return this._offsetInfo.duration || 0\n }\n\n set offsetDuration (val) {\n this._offsetInfo.duration = val || 0\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<any> } 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<any> } 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<any> } 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<any> } 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 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 = (e) => {\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 this.root.style.display = ''\n this.player.focus()\n }\n\n hide () {\n this.root.style.display = 'none'\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 `<xg-controls class=\"${className}\" unselectable=\"on\">\n <xg-inner-controls class=\"xg-inner-controls xg-pos\">\n <xg-left-grid class=\"xg-left-grid\">\n </xg-left-grid>\n <xg-center-grid class=\"xg-center-grid\"></xg-center-grid>\n <xg-right-grid class=\"xg-right-grid\">\n </xg-right-grid>\n </xg-inner-controls>\n </xg-controls>`\n }\n}\n\nexport default Controls\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 waitTimeout: 10000\n }\n }\n\n afterCreate () {\n this._onReset()\n this._waitType = 'firstFrame'\n\n this._initOnceEvents()\n\n this.newPointTime = now()\n // 初始化到首帧耗时 new -> loadeddata\n this.loadedCostTime = 0\n // 初始化到开始请求耗时 new -> loadstart\n this.startCostTime = 0\n\n this.on(Events.LOAD_START, () => {\n const { _state } = this\n const { autoplayStart, isFFSend } = _state\n this.startCostTime = now() - this.newPointTime\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOAD_START`, `autoplayStart:${autoplayStart} isFFSend:${isFFSend} startCostTime:${this.startCostTime} newPointTime${this.newPointTime}`)\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 // 首帧耗时 loadstart -> loadeddata\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 this.loadedCostTime = this.vt - this.newPointTime\n const { isTimeUpdate, isFFSend, autoplayStart } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOADED_DATA`, `fvt:${this.fvt} isTimeUpdate:${this._state.isTimeUpdate} loadedCostTime:${this.loadedCostTime}`)\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, startCostTime: this.startCostTime, loadedCostTime: this.loadedCostTime })\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.newPointTime = now()\n this.loadedCostTime = 0\n this.startCostTime = 0\n this._isSeeking = false\n this.seekingStart = 0\n this.waitingStart = 0\n this.fixedWaitingStart = 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.fixedWaitingStart = now()\n this._waitType = 1\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, 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 if (!this.vt) {\n this._waitType = 1\n } else if (this.seekingStart) {\n this._waitType = 2\n } else {\n this._waitType = 0\n }\n // 原始卡顿耗时起始时间\n this.fixedWaitingStart = now()\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 this._startWaitTimeout()\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, 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 }, this.config.waitTimeout)\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 const _fixedCost = _now - this.fixedWaitingStart\n const { waitTimeout } = this.config\n this._isWaiting = false\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this.emitLog(LOG_TYPES.WAIT_END, {\n fixedCostTime: _fixedCost > waitTimeout ? waitTimeout : _fixedCost,\n costTime: _cost > waitTimeout ? waitTimeout : _cost,\n type: endType === 'loadeddata' ? 1 : this._waitType,\n endType: this._waitType === 2 ? 'seek' : endType\n })\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 `<xg-replay class=\"xgplayer-replay\">\n <xg-replay-txt class=\"xgplayer-replay-txt\" lang-key=\"${this.i18nKeys.REPLAY}\">${this.i18n.REPLAY}</xg-replay-txt>\n </xg-replay>`\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 notHidden: false, // 是否一直显示\n poster: '', // 封面图地址\n fillMode: 'fixWidth', // fixWidth / fixHeight / cover / container\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 getBgSize (mode) {\n let _bg = ''\n switch (mode) {\n case 'cover':\n _bg = 'cover'\n break\n case 'container':\n _bg = 'container'\n break\n case 'fixHeight':\n _bg = 'auto 100%'\n break\n default:\n _bg = ''\n }\n return _bg ? `background-size: ${_bg};` : ''\n }\n\n render () {\n const { poster, hideCanplay, fillMode, notHidden } = this.config\n const _bg = this.getBgSize(fillMode)\n const style = poster ? `background-image:url(${poster});${_bg}` : _bg\n const className = notHidden ? 'xg-not-hidden' : (hideCanplay ? 'xg-showplay' : '')\n return `<xg-poster class=\"xgplayer-poster ${className}\" style=\"${style}\">\n </xg-poster>`\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 return AnimateMap[key].id\n}\n\nfunction clearAnimation (id) {\n if (id) {\n window.clearTimeout(id)\n return\n }\n Object.keys(AnimateMap).map(key => {\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n })\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.on(Events.RESET, () => {\n this.onPlayerReset()\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 onPlayerReset = () => {\n this.autoPlayStart = false\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 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 this._animateId = 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 this._animateId = null\n }\n })\n }\n\n endAnimate () {\n Util.removeClass(this.root, 'interact')\n clearAnimation(this._animateId)\n this._animateId = null\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 || 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 this.endAnimate()\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(this._animateId)\n }\n\n render () {\n const className = this.playerConfig.autoplay ? (this.config.mode === 'auto' ? 'auto-hide' : 'hide') : ''\n return `\n <xg-start class=\"xgplayer-start ${className}\">\n <xg-start-inner></xg-start-inner>\n </xg-start>`\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 += `<div class=\"xgplayer-enter-bar${i}\"></div>`\n }\n root.innerHTML = `<div class=\"xgplayer-enter-spinner\">${barStr}</div>`\n }\n return root\n }\n}\n\nexport default Enter\n","export function xgIconTips (plugin, textKey, isShow) {\n try {\n return ` <div class=\"xg-tips ${isShow ? 'hide' : ' '}\" lang-key=\"${plugin.i18nKeys[textKey]}\">\n ${plugin.i18n[textKey]}\n </div>`\n } catch (e) {\n return '<div class=\"xg-tips hide\"></div>'\n }\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 <xg-icon class=\"xgplayer-miniicon\">\n <div class=\"xgplayer-icon btn-text\"><span class=\"icon-text\" lang-key=\"${this.i18nKeys[langKey]}\">${this.i18n[langKey]}</span></div>\n </xg-icon>`\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 { xgIconTips } from '../common/iconTools'\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 <xg-mini-layer class=\"xg-mini-layer\">\n <xg-mini-header class=\"xgplayer-mini-header\">\n ${xgIconTips(this, 'MINI_DRAG', this.playerConfig.isHideTips)}\n </xg-mini-header>\n <div class=\"mini-cancel-btn\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <path fill=\"#fff\" fill-rule=\"evenodd\" d=\"M3.99 3.49a1 1 0 0 1 1.414 0L10 8.085l4.596-4.595a1 1 0 1 1 1.414 1.414L11.414 9.5l4.596 4.596a1 1 0 0 1 .084 1.32l-.084.094a1 1 0 0 1-1.414 0L10 10.914 5.404 15.51a1 1 0 0 1-1.414-1.414L8.585 9.5 3.99 4.904a1 1 0 0 1-.084-1.32z\"></path>\n </svg>\n </div>\n <div class=\"play-icon\">\n </div>\n </xg-mini-layer>`\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 }\n }\n\n afterCreate () {\n this._clickCount = 0\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { isMobileSimulateMode } = this.playerConfig\n if (isMobileSimulateMode === 'mobile' || (Sniffer.device === 'mobile' && !Sniffer.os.isIpad)) {\n return\n }\n this.initEvents()\n }\n\n initEvents () {\n const { media, root } = this.player\n const { enableContextmenu } = this.playerConfig\n\n root && root.addEventListener('click', this.onVideoClick, false)\n root && root.addEventListener('dblclick', this.onVideoDblClick, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.addEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n !enableContextmenu && media && media.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.media.focus()\n }\n }\n\n onMouseEnter = (e) => {\n const { playerConfig, player } = this\n !playerConfig.closeFocusVideoFocus && player.media.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.root || e.target === player.media || e.target === player.innerContainer || e.target === player.media.__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 (playerConfig.closeVideoDblclick || !e.target || (e.target !== player.media && e.target !== player.media.__canvas)) {\n return\n }\n if (!playerConfig.closeVideoClick && 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\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 root.removeEventListener('click', this.onVideoClick, false)\n root.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 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.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 } = 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 } = 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).forEach(key => {\n this.root.removeEventListener(key, this[map[key]])\n })\n }\n}\n\nexport default Touche\n\n","import Plugin, { Events, Util, Sniffer, STATES } from '../../plugin'\nimport Touche from './touch'\nimport SeekTipIcon from '../assets/seekicon.svg'\nimport { runHooks } from '../../plugin/hooksDescriptor'\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\nconst HOOKS = ['videoClick', 'videoDbClick']\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 HOOKS.map(item => {\n this.__hooks[item] = null\n })\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 === 'mouse' ? 'mouse' : 'touch'\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 /**\n * 对根节点做touchmove和touchend绑定,解决控制栏手势无作用的问题\n */\n player.root.addEventListener('touchmove', this.onRootTouchMove, true)\n player.root.addEventListener('touchend', this.onRootTouchEnd, true)\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\n const { disableGesture, gestureX } = this.config\n if (!disableGesture && gestureX) {\n this.endLastMove(pos.scope)\n setTimeout(() => {\n player.getPlugin('progress') && player.getPlugin('progress').resetSeekState()\n }, 10)\n } else {\n pos.time = 0\n }\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 clickHandler (e) {\n const { player, config, playerConfig } = this\n if (player.state < STATES.RUNNING) {\n if (!playerConfig.closeVideoClick) {\n this.sendUseAction(Util.createEvent('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.sendUseAction(Util.createEvent('click'))\n this.switchPlayPause()\n }\n player.focus()\n }\n }\n\n dbClickHandler (e) {\n const { config, player } = this\n if (!config.closedbClick && player.state >= STATES.RUNNING) {\n this.sendUseAction(Util.createEvent('dblclick'))\n this.switchPlayPause()\n }\n }\n\n onClick (e) {\n const { player } = this\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.clickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onDbClick (e) {\n const { player } = this\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.dbClickHandler(data.e)\n }, { e, paused: player.paused })\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 <xg-trigger class=\"trigger\">\n <div class=\"${className}\"></div>\n <div class=\"time-preview\">\n <div class=\"xg-seek-show ${this.config.disableSeekIcon ? ' hide-seek-icon' : ''}\">\n <i class=\"xg-seek-icon\"></i>\n <span class=\"xg-cur\">00:00</span>\n <span>/</span>\n <span class=\"xg-dur\">00:00</span>\n </div>\n <div class=\"xg-bar xg-timebar\">\n <div class=\"xg-curbar\"></div>\n </div>\n </div>\n <div class=\"xg-playbackrate xg-top-note\">\n <span><i>${this.config.pressRate}X</i>${this.i18n.FORWARD}</span>\n </div>\n </xg-trigger>\n `\n }\n}\n\nexport default MobilePlugin\n","import { BasePlugin, Events, Util } from '../../plugin'\n\n/**\n * @typedef {{\n * seekStep?: number,\n * checkVisible?: boolean,\n * disableBodyTrigger?: boolean,\n * keyCodeMap?: { [propName: string]: any },\n * disable: boolean,\n * playbackRate: number,\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: false, // 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: true, // Whether the shortcut key needs to be triggered globally\n keyCodeMap: {},\n disable: false,\n playbackRate: 2, // 长按倍速限制\n isIgnoreUserActive: true // 是否忽略用户激活状态\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', 'pressAction', 'disablePress', '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 disablePress: false,\n noBodyTarget: false\n },\n up: {\n keyCode: 38,\n action: 'upVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n down: {\n keyCode: 40,\n action: 'downVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n left: {\n keyCode: 37,\n action: 'seekBack',\n disablePress: false,\n disable: false\n },\n right: {\n keyCode: 39,\n action: 'seek',\n pressAction: 'changePlaybackRate',\n disablePress: false,\n disable: false\n },\n esc: {\n keyCode: 27,\n action: 'exitFullscreen',\n disablePress: true,\n disable: false\n }\n }\n this.mergekeyCodeMap()\n this._keyState = {\n isKeyDown: false,\n isBodyKeyDown: false,\n isPress: false,\n tt: 0,\n playbackRate: 0\n }\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 if (player.volume <= 0) {\n return\n }\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 if (player.volume >= 1) {\n return\n }\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, offsetCurrentTime, duration, offsetDuration, timeSegments } = this.player\n let _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n const _duration = offsetDuration || duration\n const _step = event.repeat && this.seekStep >= 4 ? parseInt(this.seekStep / 2, 10) : this.seekStep\n if (_time + _step <= _duration) {\n _time = _time + _step\n } else {\n _time = _duration\n }\n const _seekTime = Util.getCurrentTimeByOffset(_time, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n seekBack (event) {\n const { currentTime, offsetCurrentTime, timeSegments } = this.player\n const _step = event.repeat ? parseInt(this.seekStep / 2, 10) : this.seekStep\n const _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n let _seekTime = _time - _step\n if (_seekTime < 0) {\n _seekTime = 0\n }\n _seekTime = Util.getCurrentTimeByOffset(_seekTime, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n changePlaybackRate (event) {\n const { _keyState, config, player } = this\n if (_keyState.playbackRate === 0) {\n _keyState.playbackRate = player.playbackRate\n player.playbackRate = config.playbackRate\n }\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 if (!this.player) {\n return\n }\n const e = event || window.event\n const keyCode = e.keyCode\n const { _keyState, player } = this\n const { disable, disableBodyTrigger, isIgnoreUserActive } = this.config\n // 以下条件不响应\n if (disable || disableBodyTrigger || !(player.isUserActive || isIgnoreUserActive) || isDisableTag(e.target) || !this.checkIsVisible() || e.metaKey || e.altKey || e.ctrlKey) {\n _keyState.isBodyKeyDown = false\n return\n }\n // 首次进入进行是否生效校验\n if (!event.repeat && !_keyState.isKeyDown) {\n if ((e.target === document.body || (this.config.isGlobalTrigger && !isDisableTag(e.target))) && this.checkCode(keyCode, true)) {\n _keyState.isBodyKeyDown = true\n }\n document.addEventListener('keyup', this.onBodyKeyUp)\n }\n _keyState.isBodyKeyDown && this.handleKeyDown(e)\n }\n\n onBodyKeyUp = (event) => {\n if (!this.player) {\n return\n }\n document.removeEventListener('keyup', this.onBodyKeyUp)\n this.handleKeyUp(event)\n }\n\n onKeydown = (event) => {\n if (!this.player) {\n return\n }\n const e = event || window.event\n const { _keyState } = this\n // 首次按下检查是否满足触发他条件\n if (!e.repeat) {\n if (this.config.disable || this.config.disableRootTrigger || e.metaKey || e.altKey || e.ctrlKey) {\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 _keyState.isKeyDown = true\n }\n this.player.root.addEventListener('keyup', this.onKeyup)\n }\n // 长按不满足触发条件直接返回\n if (!_keyState.isKeyDown) {\n return\n }\n this.handleKeyDown(e)\n }\n\n onKeyup = (event) => {\n if (!this.player) {\n return\n }\n this.player.root.removeEventListener('keyup', this.onKeyup)\n this.handleKeyUp(event)\n }\n\n handleKeyDown (e) {\n const { _keyState } = this\n if (e.repeat) {\n _keyState.isPress = true\n const _t = Date.now()\n if (_t - _keyState.tt < 200) {\n return\n }\n _keyState.tt = _t\n }\n this.handleKeyCode(e.keyCode, e, _keyState.isPress)\n }\n\n handleKeyUp (e) {\n const { _keyState } = this\n if (_keyState.playbackRate > 0) {\n this.player.playbackRate = _keyState.playbackRate\n _keyState.playbackRate = 0\n }\n _keyState.isKeyDown = false\n _keyState.isPress = false\n _keyState.tt = 0\n }\n\n handleKeyCode (curKeyCode, event, isPress) {\n const arr = Object.keys(this.keyCodeMap)\n for (let i = 0; i < arr.length; i++) {\n const { action, keyCode, disable, pressAction, disablePress } = this.keyCodeMap[arr[i]]\n if (keyCode === curKeyCode) {\n if (!disable && !(isPress && disablePress)) {\n const _action = !isPress ? action : (pressAction || action)\n if (typeof _action === 'function') {\n action(event, this.player, isPress)\n } else if (typeof _action === 'string') {\n if (typeof this[_action] === 'function') {\n this[_action](event, this.player, isPress)\n }\n }\n this.emit(Events.SHORTCUT, {\n key: arr[i],\n target: event.target,\n isPress: isPress,\n ...this.keyCodeMap[arr[i]]\n })\n }\n preventDefault(event)\n break\n }\n }\n }\n\n destroy () {\n this.player.root.removeEventListener('keydown', this.onKeydown)\n document.removeEventListener('keydown', this.onBodyKeyDown)\n this.player.root.removeEventListener('keyup', this.onKeyup)\n document.removeEventListener('keyup', this.onBodyKeyUp)\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 <xg-loading class=\"xgplayer-loading\">\n <xg-loading-inner></xg-loading-inner>\n </xg-loading>`\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 if (this.fragments.length === 0) {\n this.fragments.push({ percent: 1 })\n }\n this._callBack = args.actionCallback\n this.fragConfig = {\n fragFocusClass: args.fragFocusClass || 'inner-focus-point', // 'inner-focus',\n fragAutoFocus: !!args.fragAutoFocus,\n fragClass: args.fragClass || ''\n }\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 this.focusIndex = -1\n }\n\n updateDuration (duration) {\n this.duration = duration\n let start = 0\n const { fragments } = this\n this.fragments = fragments.map(item => {\n item.start = parseInt(start, 10)\n item.end = parseInt(start + item.percent * this.duration, 10)\n item.duration = parseInt(item.percent * this.duration, 10)\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 if (progressList.length < 1) {\n return\n }\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 updateFocus (data) {\n if (!this.fragConfig.fragAutoFocus || this.fragments.length < 2) {\n return\n }\n if (!data) {\n // 取消焦点\n if (this.focusIndex > -1) {\n this.unHightLight(this.focusIndex)\n const _data = {\n index: -1,\n preIndex: this.focusIndex,\n fragment: null\n }\n this._callBack && this._callBack(_data)\n this.focusIndex = -1\n }\n return\n }\n const newPIndex = this.findIndex(data.currentTime * 1000, this.focusIndex)\n if (newPIndex >= 0 && newPIndex !== this.focusIndex) {\n this.focusIndex > -1 && this.unHightLight(this.focusIndex)\n this.setHightLight(newPIndex)\n const _data = {\n index: newPIndex,\n preIndex: this.focusIndex,\n fragment: this.fragments[this.focusIndex]\n }\n this.focusIndex = newPIndex\n this._callBack && this._callBack(_data)\n }\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(parseInt(duration * 1000, 10))\n }\n const { playedIndex, cachedIndex } = this\n if (Util.typeOf(data.played) !== 'Undefined') {\n const newPIndex = this.findIndex(data.played * 1000, playedIndex)\n if (newPIndex < 0) {\n return\n }\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 if (newCIndex < 0) {\n return\n }\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 || fragments.length === 0) {\n return -1\n }\n if (fragments.length === 1) {\n return 0\n }\n if (curIndex > -1 && curIndex < fragments.length && time > fragments[curIndex].start && time < fragments[curIndex].end) {\n return curIndex\n }\n if (time > fragments[fragments.length - 1].start) {\n return fragments.length - 1\n }\n\n for (let i = 0; i < fragments.length; i++) {\n if (time > fragments[i].start && time <= fragments[i].end) {\n curIndex = i\n break\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.fragConfig.fragFocusClass)) {\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.fragConfig.fragFocusClass)\n }\n }\n\n setHightLight (index) {\n const children = this.root.children\n if (index < children.length) {\n Util.addClass(children[index], this.fragConfig.fragFocusClass)\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 /**\n * 重置当前\n * @param {*} newOptions\n */\n reset (newOptions) {\n // 更新fragConfig\n Object.keys(this.fragConfig).forEach(key => {\n if (newOptions[key] !== undefined) {\n this.fragConfig[key] = newOptions[key]\n }\n })\n if (newOptions.fragments) {\n this.fragments = newOptions.fragments.length === 0 ? [{ percent: 1 }] : newOptions.fragments\n this.updateDuration(this.duration)\n this.playedIndex = 0\n this.cachedIndex = 0\n // 移除分段信息\n if (this.root) {\n const _c = this.root.children\n while (_c.length > 0) {\n this.root.removeChild(_c[0])\n }\n }\n // 重新渲染\n this.render()\n }\n }\n\n render () {\n const { progressColor } = this.style\n if (!this.root) {\n this.root = Util.createDom('xg-inners', '', {}, 'progress-list')\n }\n if (this.fragments) {\n const { fragClass, fragFocusClass } = this.fragConfig\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 ? fragFocusClass : ''} xgplayer-progress-inner ${fragClass}`)\n\n this.root.appendChild(inner)\n\n TPL.forEach(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 } 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 * fragFocusClass?: string, // 进度条分段高亮类名\n * fragAutoFocus?: boolean, // 是否hover的时候自动高亮\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 */\n\n// 分段获取焦点显示的时候的两种class类型\nconst FRAGMENT_FOCUS_CLASS = {\n POINT: 'inner-focus-point',\n HIGHLIGHT: 'inner-focus-highlight'\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 fragFocusClass: FRAGMENT_FOCUS_CLASS.POINT,\n fragClass: '', // 内置进度条类名\n fragAutoFocus: false, // 是否hover的时候自动高亮\n miniMoveStep: 5,\n miniStartStep: 2,\n onMoveStart: () => {\n }, // 手势开始移动回调\n onMoveEnd: () => {}, // 手势移动结束回调\n endedDiff: 0.2\n }\n }\n\n static get FRAGMENT_FOCUS_CLASS () {\n return FRAGMENT_FOCUS_CLASS\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 prePlayTime: -1\n }\n\n this._disableBlur = false\n }\n\n get offsetDuration () {\n return this.playerConfig.customDuration || this.player.offsetDuration || this.player.duration\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 get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : (currentTime + this.timeOffset)\n }\n\n changeState (useable = true) {\n this.useable = useable\n }\n\n show () {\n this.root && (this.root.style.display = 'flex')\n }\n /**\n * @description 创建内部进度条,并挂载到xg-outer上,\n * 并把一些对外API绑定在progress上供外部调用\n *\n */\n _initInner (fragments = [], config = {}) {\n if (!fragments || fragments.length === 0) {\n fragments = [{ percent: 1 }]\n }\n const _c = {\n fragments,\n ...config,\n actionCallback: (data) => {\n this.emitUserAction('fragment_focus', 'fragment_focus', data)\n }\n }\n if (!this.innerList) {\n this.innerList = new InnerList(_c)\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 } else {\n this.innerList.reset(_c)\n }\n }\n\n _updateInnerFocus (data) {\n this.innerList && this.innerList.updateFocus(data)\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 isLocked: false // 是否刚刚锁定回过进度条\n }\n this.outer = this.find('xg-outer')\n const { fragFocusClass, fragAutoFocus, fragClass } = this.config\n this._initInner(this.config.fragments, { fragFocusClass, fragAutoFocus, fragClass, style: this.playerConfig.commonStyle || {} })\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(true)\n this.onTimeupdate(true)\n this._state.now = 0\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n\n this.on(Events.VIDEO_RESIZE, () => {\n this.onVideoResize()\n })\n\n this.bindDomEvents()\n this.initCustomStyle()\n }\n\n /**\n * @description 配置更新响应,插件内置调用api, 播放器整体配置更新的时候调用\n * @param {IProgressConfig} config\n */\n setConfig (config) {\n let frags = null\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n if (key === 'fragments') {\n frags = config[key]\n }\n })\n if (frags) {\n this._initInner(frags, config)\n }\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 /**\n * @description 解除进度条的所动状态\n * @returns\n */\n unlock () {\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 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\n if (this.domEventType === 'touch' || this.domEventType === 'compatible') {\n this.root.addEventListener('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 }\n\n if (this.domEventType === 'mouse' || this.domEventType === 'compatible') {\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 // 避免触发videoClick 暂停/播放切换\n this.player.root.addEventListener('click', this.onBodyClick, true)\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, data) => {\n const { pos, config, player } = this\n let ret = data\n if (e) {\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 ret = this.computeTime(e, x)\n }\n this.triggerCallbacks('dragmove', ret, e)\n this._updateInnerFocus(ret)\n }\n\n /**\n * 避免mouseup的时候触发父辈节点的click事件,和单击视频区域切换暂停/播放互斥\n * @param {*} e\n * @returns\n */\n onBodyClick = (e) => {\n if (!this.pos.isLocked) {\n return\n }\n this.pos.isLocked = false\n e.preventDefault()\n e.stopPropagation()\n }\n\n _mouseDownHandler = (event, data) => {\n this._state.time = data.currentTime\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 0)\n this._updateInnerFocus(data)\n }\n\n _mouseUpHandler = (e, data) => {\n const { pos } = this\n pos.moving && this.updateWidth(data.currentTime, data.seekTime, data.percent, 2)\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 this.emitUserAction('drag', 'dragstart', data)\n }\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 1)\n this.triggerCallbacks('dragmove', data, e)\n this._updateInnerFocus(data)\n }\n\n onMouseDown = (e) => {\n const { _state, 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\n if (!player.duration && !player.isPlaying) {\n player.play()\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 _state.prePlayTime = player.currentTime\n\n // 交互开始 禁止控制栏的自动隐藏功能\n player.focus({ autoHide: false })\n this.isProgressMoving = true\n Util.addClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseDownHandlerHook(e, ret)\n\n const eventType = e.type\n if (eventType === 'touchstart') {\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 // 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, pos.x)\n ret.prePlayTime = _state.prePlayTime\n if (pos.moving) {\n this.triggerCallbacks('dragend', ret, e)\n this.emitUserAction('drag', 'dragend', ret)\n } else {\n this.triggerCallbacks('click', ret, e)\n this.emitUserAction('click', 'click', ret)\n }\n this._mouseUpHandlerHook(e, ret)\n\n pos.moving = false\n pos.isDown = false\n pos.x = 0\n pos.y = 0\n pos.isLocked = true\n _state.prePlayTime = 0\n _state.time = 0\n const eventType = e.type\n if (eventType === 'touchend') {\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 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 { _state, 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, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseMoveHandlerHook(e, 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 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 // 计算预览位置\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const ret = this.computeTime(e, x)\n this.triggerCallbacks('mouseenter', ret, e)\n this.focus()\n }\n\n onMouseLeave = (e) => {\n this.triggerCallbacks('mouseleave', null, e)\n this.unlock()\n this._updateInnerFocus(null)\n }\n\n onVideoResize = () => {\n const { x, isDown, isEnter } = this.pos\n if (isEnter && !isDown) {\n const ret = this.computeTime(null, x)\n this.onMoveOnly(null, ret)\n }\n }\n\n /**\n * @description 根据currenTime和占用百分比更新进度条\n * @param {Number} currentTime 需要更新到的时间\n * @param {Number} seekTime 实际seek的时间\n * @param {Number} percent 更新时间占比\n * @param {Int} type 触发类型 0-down 1-move 2-up\n */\n updateWidth (currentTime, seekTime, percent, type) {\n const { config, player } = this\n if (config.isCloseClickSeek && type === 0) {\n return\n }\n\n const realTime = seekTime = seekTime >= player.duration ? player.duration - config.endedDiff : Number(seekTime).toFixed(1)\n\n this.updatePercent(percent)\n this.updateTime(currentTime)\n if (type === 1 && (!config.isDragingSeek || player.config.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, x) {\n const { player } = this\n const { width, height, top, left } = this.root.getBoundingClientRect()\n let rWidth, rLeft\n const clientX = x\n if (player.rotateDeg === 90) {\n rWidth = height\n rLeft = top\n } else {\n rWidth = width\n rLeft = left\n }\n let offset = clientX - rLeft\n offset = offset > rWidth ? rWidth : (offset < 0 ? 0 : offset)\n let percent = offset / rWidth\n percent = percent < 0 ? 0 : (percent > 1 ? 1 : percent)\n const currentTime = parseInt(percent * this.offsetDuration * 1000, 10) / 1000\n const seekTime = Util.getCurrentTimeByOffset(currentTime, player.timeSegments)\n return {\n percent,\n currentTime,\n seekTime,\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.offsetDuration }, this.offsetDuration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: percent * this.offsetDuration }, this.offsetDuration)\n }\n\n /**\n * @description 播放进度更新\n * @param { boolean } isEnded 是否是播放结束的时候调用\n * @returns\n */\n onTimeupdate (isEnded) {\n const { player, _state, offsetDuration } = this\n if ((player.isSeeking && player.media.seeking) || this.isProgressMoving || !player.hasStart) {\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 let time = this.currentTime // this.timeOffset + player.currentTime\n time = Util.adjustTimeByDuration(time, offsetDuration, isEnded)\n this.innerList.update({ played: time }, offsetDuration)\n this.progressBtn.style.left = `${time / offsetDuration * 100}%`\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: time }, offsetDuration)\n }\n\n /**\n * @description 缓存进度更新\n * @param { boolean } isEnded 是否是结束时触发\n * @returns\n */\n onCacheUpdate (isEnded) {\n const { player, duration } = this\n if (!player) {\n return\n }\n // 兼容设置了customDuration, 实际时长和要显示的时不一致问题\n let _end = player.bufferedPoint.end\n _end = Util.adjustTimeByDuration(_end, duration, isEnded)\n this.innerList.update({ cached: _end }, duration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ cached: _end }, duration)\n }\n\n onReset () {\n this.innerList.update({ played: 0, cached: 0 }, 0)\n this.progressBtn.style.left = '0%'\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ cached: 0, played: 0 }, 0)\n this.progressBtn.style.left = '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 const { domEventType } = this\n if (domEventType === 'touch' || domEventType === 'compatible') {\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 }\n if (domEventType === 'mouse' || domEventType === 'compatible') {\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, true)\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 <xg-progress class=\"xgplayer-progress ${className}\">\n <xg-outer class=\"xgplayer-progress-outer\">\n <xg-progress-btn class=\"xgplayer-progress-btn\"></xg-progress-btn>\n </xg-outer>\n </xg-progress>\n `\n }\n}\n\nexport default Progress\n","import Plugin from '../../plugin'\n\nexport default class Icon 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 { xgIconTips } from '../common/iconTools'\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, Events.ERROR, Events.EMPTIED], () => {\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 if (!this.player) {return}\n const { i18nKeys } = this\n const tipDom = this.find('.xg-tips')\n if (paused) {\n this.setAttr('data-state', 'pause')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PLAY_TIPS)\n } else {\n this.setAttr('data-state', 'play')\n tipDom && this.changeLangTextKey(tipDom, 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 `<xg-icon class=\"xgplayer-play\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'PLAY_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\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 `<xg-icon class=\"xgplayer-back\">\n </xg-icon>`\n }\n}\n","import { Events, POSITIONS, Sniffer, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\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().catch(e=>{})\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 const tipsDom = this.find('.xg-tips')\n tipsDom && this.changeLangTextKey(tipsDom, 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().catch(e=>{})\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 `<xg-icon class=\"xgplayer-fullscreen\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, langKey, this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import Plugin, { Util, Events, POSITIONS } 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 const { offsetDuration, duration } = this.player\n return this.playerConfig.customDuration || offsetDuration || duration\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : currentTime\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.root.style.display = 'none'\n }\n this.durationDom = this.find('.time-duration')\n this.timeDom = this.find('.time-current')\n this.on([Events.DURATION_CHANGE, Events.SEEKED, Events.TIME_UPDATE], (e) => {\n if (e.eventName === 'durationchange') {\n this.isActiving = false\n }\n this.onTimeUpdate()\n })\n\n this.on(Events.ENDED, () => {\n // 因为customDuration存在,最终播放currentTime可能和显示的duration不统一,所以在ended的时候修正\n this.onTimeUpdate(true)\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n }\n\n show () {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'block')\n this.centerDurDom && (this.centerDurDom.style.display = 'block')\n return\n }\n this.root.style.display = 'block'\n }\n\n hide () {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'none')\n this.centerDurDom && (this.centerDurDom.style.display = 'none')\n return\n }\n this.root.style.display = 'none'\n }\n\n onTimeUpdate (isEnded) {\n const { player, config, duration } = this\n if (config.disable || this.isActiving || !player.hasStart) {\n return\n }\n let current = this.currentTime + this.timeOffset\n current = Util.adjustTimeByDuration(current, duration, isEnded)\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.centerDurDom.innerHTML = Util.format(duration)\n }\n } else {\n this.timeDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.durationDom.innerHTML = Util.format(duration)\n }\n }\n }\n\n onReset () {\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(0))\n this.centerDurDom.innerHTML = Util.format(0)\n } else {\n this.timeDom.innerHTML = this.minWidthTime(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(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-left'\n )\n this.centerDurDom = Util.createDom(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-right'\n )\n center.children.length > 0\n ? center.insertBefore(this.centerCurDom, center.children[0])\n : 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 = this.minWidthTime(Util.format(time))\n return\n }\n this.timeDom.innerHTML = this.minWidthTime(Util.format(time))\n }\n\n minWidthTime (timeStr) {\n return timeStr\n .split(':')\n .map(value => `<span class=\"time-min-width\">${value}</span>`)\n .join(':')\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 && player.media.seeking) {\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 `<xg-icon class=\"xgplayer-time\">\n <span class=\"time-current\">00:00</span>\n <span class=\"time-separator\">/</span>\n <span class=\"time-duration\">00:00</span>\n <span class=\"time-live-tag\">${this.i18n.LIVE_TIP}</span>\n </xg-icon>`\n }\n}\nexport default Time\n","import { BasePlugin, Events, Util } from '../../plugin'\n/**\n * 进行事件分段控制\n */\nexport default class TimeSegmentsControls extends BasePlugin {\n static get pluginName () {\n return 'TimeSegmentsControls'\n }\n\n static get defaultConfig () {\n return {\n disable: true,\n segments: []\n }\n }\n\n afterCreate () {\n this.curIndex = -1\n this.curPos = null\n this.lastCurrentTime = 0\n\n this.updateSegments()\n\n this.on(Events.DURATION_CHANGE, this._onDurationChange)\n this.on(Events.LOADED_DATA, this._onLoadedData)\n\n this.on(Events.TIME_UPDATE, this._onTimeupdate)\n\n this.on(Events.SEEKING, this._onSeeking)\n\n this.on(Events.PLAY, this._onPlay)\n }\n\n setConfig (newConfig) {\n if (!newConfig) {\n return\n }\n const keys = Object.keys(newConfig)\n if (keys.length < 1) {\n return\n }\n keys.forEach(key => {\n this.config[key] = newConfig[key]\n })\n this.updateSegments()\n }\n\n updateSegments () {\n const { disable, segments } = this.config\n const { player } = this\n if (disable || !segments || segments.length === 0) {\n player.timeSegments = []\n player.offsetDuration = 0\n player.offsetCurrentTime = -1\n } else {\n const _segs = this.formatTimeSegments(segments, player.duration)\n player.timeSegments = _segs\n player.offsetDuration = _segs.length > 0 ? _segs[_segs.length - 1].duration : 0\n }\n }\n\n formatTimeSegments (timeSegments, duration) {\n const ret = []\n if (!timeSegments) {\n return []\n }\n // console.log('>>>formatTimeSegments', duration)\n timeSegments.sort((a,b) =>{ return a.start - b.start })\n timeSegments.forEach((item, index) => {\n const _item = {}\n _item.start = item.start < 0 ? 0 : item.start\n _item.end = duration > 0 && item.end > duration ? duration : item.end\n if (duration > 0 && _item.start > duration) {\n return\n }\n ret.push(_item)\n const _segDuration = _item.end - _item.start\n if (index === 0) {\n _item.offset = item.start // 偏移量\n _item.cTime = 0\n _item.segDuration = _segDuration\n _item.duration = _segDuration\n } else {\n const last = ret[index - 1]\n _item.offset = last.offset + (_item.start - last.end)\n _item.cTime = last.duration + last.cTime\n _item.segDuration = _segDuration\n _item.duration = last.duration + _segDuration\n }\n })\n return ret\n }\n\n _onDurationChange = () => {\n this.updateSegments()\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const index = Util.getIndexByTime(currentTime,timeSegments)\n const time = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n this.player.offsetCurrentTime = time\n this.changeIndex(index, timeSegments)\n }\n\n _onLoadedData = () => {\n const { timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const time = Util.getOffsetCurrentTime(0, timeSegments)\n this.player.offsetCurrentTime = time\n this.changeIndex(0, timeSegments)\n if (this.curPos.start > 0){\n this.player.currentTime = this.curPos.start\n }\n }\n\n _onTimeupdate = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const _len = timeSegments.length\n this.lastCurrentTime = currentTime\n const index = Util.getIndexByTime(currentTime, timeSegments)\n if (index !== this.curIndex) {\n this.changeIndex(index, timeSegments)\n }\n const curTime = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n\n this.player.offsetCurrentTime = curTime\n\n // 根据分段信息进行放时间点跳转\n if (!this.curPos) {\n return\n }\n const { start, end } = this.curPos\n if (currentTime < start) {\n this.player.currentTime = start\n } else if (currentTime > end && index >= _len - 1) {\n this.player.pause()\n }\n }\n\n _onSeeking = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n if (currentTime < timeSegments[0].start) {\n this.player.currentTime = timeSegments[0].start\n } else if (currentTime > timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[timeSegments.length - 1].end\n } else {\n const _index = Util.getIndexByTime(currentTime, timeSegments)\n if (_index >= 0) {\n const _seekTime = this.getSeekTime(currentTime, this.lastCurrentTime, _index, timeSegments)\n if (_seekTime >= 0 ) {\n this.player.currentTime = _seekTime\n }\n }\n }\n }\n\n _onPlay = () => {\n const { currentTime, timeSegments } = this.player\n if (this._checkIfEnabled(timeSegments) && currentTime >= timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[0].start\n }\n }\n\n getSeekTime (currentTime, lastCurrentTime, index, timeSegments) {\n let _time = -1\n const { start, end } = timeSegments[index]\n if (currentTime >= start && currentTime <= end) {\n // console.log('>>>>_onSeeking noSeek', currentTime, lastCurrentTime, start, end, _time)\n return _time\n }\n const diff = currentTime - lastCurrentTime\n if (diff < 0) {\n if (currentTime < start) {\n const diff2 = lastCurrentTime > start ? lastCurrentTime - start : 0\n _time = index - 1 >= 0 ? timeSegments[index - 1].end + diff + diff2 : 0\n // console.log('>>>>_onSeeking seek3', currentTime, lastCurrentTime, diff, start, end, _time)\n return _time\n }\n }\n return -1\n }\n\n _checkIfEnabled (segments) {\n return !(!segments || segments.length < 1)\n }\n\n changeIndex (index, timeSegments) {\n this.curIndex = index\n if (index >= 0 && timeSegments.length > 0) {\n this.curPos = timeSegments[index]\n } else {\n this.curPos = null\n }\n }\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 this._d = {\n isStart: false,\n isMoving: false,\n isActive: false\n }\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._d.isStart = true\n return false\n }\n\n onBarMouseMove = (e) => {\n const { _d } = this\n if (!_d.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 _d.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 const { _d } = this\n _d.isStart = false\n _d.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 /**\n * @desc 聚焦\n */\n focus () {\n const { player } = this\n player.focus({ autoHide: false })\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n Util.addClass(this.root, 'slide-show')\n }\n\n /**\n * 失去焦点\n * @param { number } delay 延迟隐藏时长,ms\n * @param { boolean } isForce 是否立即隐藏控制栏\n * @param { Event} [e] 事件\n * @returns\n */\n unFocus (delay = 100, isForce = true, e) {\n const { _d, player } = this\n if (_d.isActive) {\n return\n }\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this._timerId = Util.setTimeout(this, () => {\n if (!_d.isActive) {\n isForce ? player.blur() : player.focus()\n Util.removeClass(this.root, 'slide-show')\n _d.isStart && this.onBarMouseUp(e)\n }\n this._timerId = null\n }, delay)\n }\n\n onMouseenter = (e) => {\n this._d.isActive = true\n this.focus()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n onMouseleave = (e) => {\n this._d.isActive = false\n this.unFocus(100, false, e)\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, _d } = this\n // 取消bar的状态\n _d.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._d.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 if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\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 <xg-icon class=\"xgplayer-volume\" data-state=\"normal\">\n <div class=\"xgplayer-icon\">\n </div>\n <xg-slider class=\"xgplayer-slider\">\n ${isShowVolumeValue ? `<div class=\"xgplayer-value-label\">${volume * 100}</div>` : ''}\n <div class=\"xgplayer-bar\">\n <xg-drag class=\"xgplayer-drag\" style=\"height: ${volume * 100}%\"></xg-drag>\n </div>\n </xg-slider>\n </xg-icon>`\n }\n}\nexport default Volume\n","import { POSITIONS, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\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 if (this.rotateDeg && this.config.innerRotate) {\n Util.setTimeout(this, () => {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }, 100)\n }\n })\n\n const root = this.player.root\n this.rootWidth = root.style.width || root.offsetWidth || root.clientWidth\n this.rootHeight = root.style.height || root.offsetHeight || root.clientHeight\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 if (!rotateDeg) {\n rotateDeg = 0\n }\n if (innerRotate) {\n this.player.videoRotateDeg = rotateDeg\n return\n }\n const { player, rootWidth, rootHeight } = this\n const { root, innerContainer } = player\n const video = player.media\n const width = root.offsetWidth\n const height = innerContainer && innerRotate ? innerContainer.offsetHeight : root.offsetHeight\n let rWidth = rootWidth\n let rHeight = rootHeight\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 <xg-icon class=\"xgplayer-rotate\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'ROTATE_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","/* global documentPictureInPicture */\nimport { Events, Util, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\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 * @doc https://wicg.github.io/document-picture-in-picture/\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 preferDocument: false,\n width: undefined,\n height: undefined,\n docPiPNode: undefined,\n docPiPStyle: undefined\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 // 使用mediaPlay避免多次触发 playhooks\n !paused && player.mediaPlay()\n }, 0)\n !paused && player.mediaPlay()\n this.setAttr('data-state', 'normal')\n this.pipWindow = null\n player.emit(Events.PIP_CHANGE, false)\n }\n\n this.enterPIPCallback = (e) => {\n player.emit(Events.PIP_CHANGE, true)\n if (e?.pictureInPictureWindow) {\n this.pipWindow = e.pictureInPictureWindow\n }\n this.setAttr('data-state', 'pip')\n }\n\n this.onWebkitpresentationmodechanged = (e) => {\n const mode = player.media.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.media) {\n player.media.addEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.addEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.addEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n }\n }\n\n switchPIP = (e) => {\n if (!this.isPIPAvailable()) {\n return false\n }\n e.stopPropagation && 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.media.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 copyStyleIntoPiPWindow (pipWin) {\n const textContent = [...document.styleSheets]\n .map((style) => {\n try {\n return [...style.cssRules].map((rule) => rule.cssText).join('')\n } catch (e) {\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.type = style.type\n link.media = style.media\n link.href = style.href\n pipWin.document.head.appendChild(link)\n }\n return ''\n })\n .filter(Boolean)\n .join('\\n')\n const style = document.createElement('style')\n\n style.textContent = textContent\n pipWin.document.head.appendChild(style)\n }\n\n /*\n * 进入画中画\n */\n requestPIP () {\n const { player, playerConfig, config } = this\n if (!this.isPIPAvailable() || this.isPip) {\n return\n }\n try {\n const { poster } = playerConfig\n if (poster) {\n player.media.poster = Util.typeOf(poster) === 'String' ? poster : poster.poster\n }\n\n if (config.preferDocument && this.isDocPIPAvailable()) {\n const pipOptions = {}\n\n if (config.width && config.height) {\n pipOptions.width = config.width\n pipOptions.height = config.height\n } else {\n const playerRect = player.root.getBoundingClientRect()\n pipOptions.width = playerRect.width\n pipOptions.height = playerRect.height\n }\n\n documentPictureInPicture.requestWindow(pipOptions).then((pipWin) => {\n const { docPiPNode, docPiPStyle } = config\n\n this.enterPIPCallback()\n\n // record original position\n const pipRoot = docPiPNode || player.root\n const parentNode = pipRoot.parentElement\n const previousSibling = pipRoot.previousSibling\n const nextSibling = pipRoot.nextSibling\n\n this.copyStyleIntoPiPWindow(pipWin)\n\n // Make sure player fits in the Picture-in-Picture window.\n const styles = document.createElement('style')\n styles.append('body{padding:0; margin:0;}')\n if (docPiPStyle) {\n let cssContent = ''\n if (typeof docPiPStyle === 'string') {\n cssContent = docPiPStyle\n } else if (typeof docPiPStyle === 'function') {\n cssContent = docPiPStyle.call(config)\n }\n if (cssContent) {\n styles.append(cssContent)\n }\n } else if (pipRoot === player.root) {\n styles.append(`\n .xgplayer{width: 100%!important; height: 100%!important;}\n `)\n }\n pipWin.document.head.append(styles)\n\n // Add player to the PiP window.\n pipWin.document.body.append(pipRoot)\n\n // Listen for the PiP closing event to put the video back.\n pipWin.addEventListener('pagehide', (event) => {\n // Restore nodes to their original location\n if (parentNode) {\n if (nextSibling) {\n parentNode.insertBefore(pipRoot, nextSibling)\n } else if (previousSibling) {\n parentNode.insertBefore(pipRoot, previousSibling.nextSibling)\n } else {\n parentNode.appendChild(pipRoot)\n }\n } else {\n // console.log('无法找到原始父节点')\n }\n\n this.leavePIPCallback()\n }, { once: true })\n })\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('picture-in-picture')\n } else {\n player.media.requestPictureInPicture()\n }\n\n\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 if (this.isDocPIPAvailable() && documentPictureInPicture?.window) {\n documentPictureInPicture.window.close()\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('inline')\n } else {\n document.exitPictureInPicture()\n }\n }\n return true\n } catch (reason) {\n console.error('exitPIP', reason)\n return false\n }\n }\n\n /**\n * 处于画中画状态\n */\n get isPip () {\n const { player } = this\n return (\n !!(this.isDocPIPAvailable() && documentPictureInPicture?.window) ||\n (document.pictureInPictureElement &&\n document.pictureInPictureElement === player.media) ||\n player.media.webkitPresentationMode === PresentationMode.PIP\n )\n }\n\n isPIPAvailable () {\n const video = this.player.media\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 this.isDocPIPAvailable()\n }\n\n isDocPIPAvailable () {\n return 'documentPictureInPicture' in window && /^(https|file)/.test(location.protocol)\n }\n\n destroy () {\n super.destroy()\n const { player } = this\n player.media.removeEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.removeEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.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 `<xg-icon class=\"xgplayer-pip\">\n <div class=\"xgplayer-icon xg-icon-disable\">\n </div>\n ${xgIconTips(this, 'PIP', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\nexport default PIP\n","/**\n * 下一个按钮组件\n */\nimport Plugin, { POSITIONS, Sniffer, Events } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\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 <xg-icon class=\"xgplayer-playnext\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'PLAYNEXT_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>\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<mx;++i) tempUiArr[i]= payload.charCodeAt(i);\n\t\t\t \tpayload=new myBlob([tempUiArr], {type: mimeType});\n\t\t\t}\t\t \n\t\t}\n\t\tblob = payload instanceof myBlob ?\n\t\t\tpayload :\n\t\t\tnew myBlob([payload], {type: mimeType}) ;\n\n\n\t\tfunction dataUrlToBlob(strUrl) {\n\t\t\tvar parts= strUrl.split(/[:;,]/),\n\t\t\ttype= parts[1],\n\t\t\tdecoder= parts[2] == \"base64\" ? atob : decodeURIComponent,\n\t\t\tbinData= decoder( parts.pop() ),\n\t\t\tmx= binData.length,\n\t\t\ti= 0,\n\t\t\tuiArr= new Uint8Array(mx);\n\n\t\t\tfor(i;i<mx;++i) uiArr[i]= binData.charCodeAt(i);\n\n\t\t\treturn new myBlob([uiArr], {type: type});\n\t\t }\n\n\t\tfunction saver(url, winMode){\n\n\t\t\tif ('download' in anchor) { //html5 A[download]\n\t\t\t\tanchor.href = url;\n\t\t\t\tanchor.setAttribute(\"download\", fileName);\n\t\t\t\tanchor.className = \"download-js-link\";\n\t\t\t\tanchor.innerHTML = \"downloading...\";\n\t\t\t\tanchor.style.display = \"none\";\n\t\t\t\tdocument.body.appendChild(anchor);\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tanchor.click();\n\t\t\t\t\tdocument.body.removeChild(anchor);\n\t\t\t\t\tif(winMode===true){setTimeout(function(){ self.URL.revokeObjectURL(anchor.href);}, 250 );}\n\t\t\t\t}, 66);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// handle non-a[download] safari as best we can:\n\t\t\tif(/(Version)\\/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*Safari\\//.test(navigator.userAgent)) {\n\t\t\t\tif(/^data:/.test(url))\turl=\"data:\"+url.replace(/^data:([\\w\\/\\-\\+]+)/, defaultMime);\n\t\t\t\tif(!window.open(url)){ // popup blocked, offer direct download:\n\t\t\t\t\tif(confirm(\"Displaying New Document\\n\\nUse Save As... to download, then click back to return to this page.\")){ location.href=url; }\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t//do iframe dataURL download (old ch+FF):\n\t\t\tvar f = document.createElement(\"iframe\");\n\t\t\tdocument.body.appendChild(f);\n\n\t\t\tif(!winMode && /^data:/.test(url)){ // force a mime that will download:\n\t\t\t\turl=\"data:\"+url.replace(/^data:([\\w\\/\\-\\+]+)/, defaultMime);\n\t\t\t}\n\t\t\tf.src=url;\n\t\t\tsetTimeout(function(){ document.body.removeChild(f); }, 333);\n\n\t\t}//end saver\n\n\n\n\n\t\tif (navigator.msSaveBlob) { // IE10+ : (has Blob, but not a[download] or URL)\n\t\t\treturn navigator.msSaveBlob(blob, fileName);\n\t\t}\n\n\t\tif(self.URL){ // simple fast and modern way using Blob and URL:\n\t\t\tsaver(self.URL.createObjectURL(blob), true);\n\t\t}else{\n\t\t\t// handle non-Blob()+non-URL browsers:\n\t\t\tif(typeof blob === \"string\" || blob.constructor===toString ){\n\t\t\t\ttry{\n\t\t\t\t\treturn saver( \"data:\" + mimeType + \";base64,\" + self.btoa(blob) );\n\t\t\t\t}catch(y){\n\t\t\t\t\treturn saver( \"data:\" + mimeType + \",\" + encodeURIComponent(blob) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Blob but not URL support:\n\t\t\treader=new FileReader();\n\t\t\treader.onload=function(e){\n\t\t\t\tsaver(this.result);\n\t\t\t};\n\t\t\treader.readAsDataURL(blob);\n\t\t}\n\t\treturn true;\n\t}; /* end download() */\n}));\n","import downloadUtil from 'downloadjs'\nimport { POSITIONS, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport DownloadSvg from '../assets/download.svg'\nimport './index.scss'\n/**\n * @typedef { {\n * position: string,\n * index: number,\n * disable: boolean,\n * [propName: string]: any\n * } } IDownloadConfig\n */\nexport default class Download extends IconPlugin {\n static get pluginName () {\n return 'download'\n }\n\n /**\n * @type IDownloadConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n disable: true\n }\n }\n\n constructor (args) {\n super(args)\n this.timer = null\n this.isLock = false\n }\n\n afterCreate () {\n super.afterCreate()\n if (this.config.disable) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.download)\n this._handler = this.hook('click', this.download, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this._handler)\n }\n\n registerIcons () {\n return {\n download: DownloadSvg\n }\n }\n download = (e) => {\n if (this.isLock) {\n return\n }\n this.emitUserAction(e, 'download')\n const { url } = this.playerConfig\n let dUrl = ''\n if (Util.typeOf(url) === 'String') {\n dUrl = url\n } else if (Util.typeOf(url) === 'Array' && url.length > 0) {\n dUrl = url[0].src\n }\n const newUrl = this.getAbsoluteURL(dUrl)\n downloadUtil(newUrl)\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 = `<a href=\"${url}\">x</a>`\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 `<xg-icon class=\"xgplayer-download\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'DOWNLOAD_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\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 saveImg: true,\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 createCanvas (width, height) {\n const canvas = document.createElement('canvas')\n const canvasCtx = canvas.getContext('2d')\n\n this.canvasCtx = canvasCtx\n this.canvas = canvas\n\n canvas.width = width || this.config.width\n canvas.height = height || this.config.height\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingQuality\n canvasCtx.imageSmoothingEnabled = true\n if (canvasCtx.imageSmoothingEnabled) {\n canvasCtx.imageSmoothingQuality = 'high'\n }\n }\n\n onClickBtn (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'shot')\n const { config } = this\n this.shot(config.width, config.height).then((data) => {\n this.emit(Events.SCREEN_SHOT, data)\n if (config.saveImg) {\n this.saveScreenShot(data, config.name + config.format)\n }\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 let canvasCtx\n\n if (player.media.canvas) {\n canvas = player.media.canvas\n } else {\n if (!this.canvas) {\n this.createCanvas(width, height)\n } else {\n this.canvas.width = width || config.width\n this.canvas.height = height || config.height\n }\n canvas = this.canvas\n canvasCtx = this.canvasCtx\n\n const mediaRatio = player.media.videoWidth / player.media.videoHeight\n const canvasRatio = canvas.width / canvas.height\n const sx = 0, sy = 0, sw = player.media.videoWidth, sh = player.media.videoHeight\n let dx, dy, dw, dh\n\n if (mediaRatio > canvasRatio) {\n dw = canvas.width\n dh = canvas.width / mediaRatio\n dx = 0\n dy = Math.round((canvas.height - dh) / 2)\n } else if (mediaRatio === canvasRatio) {\n dw = canvas.width\n dh = canvas.height\n dx = 0\n dy = 0\n } else if (mediaRatio < canvasRatio) {\n dw = canvas.height * mediaRatio\n dh = canvas.height\n dx = Math.round((canvas.width - dw) / 2)\n dy = 0\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage\n canvasCtx.drawImage(player.media, sx, sy, sw, sh, dx, dy, dw, dh)\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 <xg-icon class=\"xgplayer-shot\">\n <div class=\"${className}\">\n ${this.icons.screenshotIcon ? '' : `<span lang-key=\"${this.i18nKeys[langKey]}\">${this.i18n[langKey]}</span>`}\n </div>\n </xg-icon>`\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 xg-list-slide-scroll ${this.config.className}`)\n args.root.appendChild(this.root)\n const { maxHeight } = this.config\n if (maxHeight) {\n this.setStyle({ maxHeight })\n }\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', `<span>${item.showText}</span>`, 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 setStyle (style) {\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\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'\n// import './optionsIcon.scss'\n\nconst LIST_TYPES = {\n SIDE: 'side',\n MIDDLE: 'middle'\n}\n\nconst TOGGLE_MODES = {\n CLICK: 'click',\n HOVER: 'hover'\n}\n\nfunction getListClassName (listType, position) {\n if (listType === LIST_TYPES.SIDE) {\n return position === POSITIONS.CONTROLS_LEFT ? 'xg-side-list xg-left-side' : 'xg-side-list xg-right-side'\n } else {\n return ''\n }\n}\n\n/**\n * @typedef {{\n * isShow?: boolean,\n * index?: number,\n * list?: Array<any>,\n * listType?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IOptionsIconConfig\n */\n\nconst IS_MOBILE = Sniffer.device === 'mobile'\n\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', // 模式 side-右侧边栏 middle-中间显示\n listStyle: {},\n hidePortrait: true,\n isShowIcon: false,\n isItemClickHide: true, // 列表点击之后是否隐藏列表\n toggleMode: TOGGLE_MODES.HOVER, // 激活状态切换模式\n heightLimit: true\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 !== LIST_TYPES.MIDDLE) {\n config.listType = LIST_TYPES.SIDE\n }\n\n config.hidePortrait && Util.addClass(this.root, 'portrait')\n\n this.on([Events.VIDEO_RESIZE, Events.FULLSCREEN_CHANGE], () => {\n this._resizeList()\n })\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\n if (IS_MOBILE) {\n config.toggleMode = TOGGLE_MODES.CLICK\n this.activeEvent = 'touchend'\n } else {\n this.activeEvent = config.toggleMode === TOGGLE_MODES.CLICK ? 'click' : 'mouseenter'\n }\n\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.bind(this.activeEvent, this.switchActiveState)\n } else {\n this.bind(this.activeEvent, this.onEnter)\n this.bind('mouseleave', this.onLeave)\n }\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].en\n } else {\n return item[key]\n }\n } catch (err) {\n console.warn(err)\n return ''\n }\n }\n\n onEnter = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n this.switchActiveState(e)\n }\n\n switchActiveState = (e) => {\n e.stopPropagation()\n const { toggleMode } = this.config\n if (toggleMode === TOGGLE_MODES.CLICK) {\n this.toggle(!this.isActive)\n } else {\n this.toggle(true)\n }\n }\n\n onLeave = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n if (this.config.listType !== LIST_TYPES.SIDE) {\n this.isActive && this.toggle(false)\n }\n }\n\n onListEnter = (e) => {\n // console.log('onListEnter')\n this.enterType = 2\n }\n\n onListLeave = (e) => {\n // console.log('onListLeave', e.target)\n this.enterType = 0\n this.isActive && this.toggle(false)\n }\n\n // 状态切换\n toggle (isActive) {\n if (isActive === this.isActive) return\n const { controls } = this.player\n const { listType } = this.config\n if (isActive) {\n listType === LIST_TYPES.SIDE ? controls.blur() : controls.focus()\n this.optionsList && this.optionsList.show()\n } else {\n listType === LIST_TYPES.SIDE ? controls.focus() : controls.focusAwhile()\n this.optionsList && this.optionsList.hide()\n }\n this.isActive = isActive\n }\n\n // 列表点击回调\n onItemClick (e, data) {\n e.stopPropagation()\n const { listType, list } = this.config\n this.curIndex = data.to.index\n this.curItem = list[this.curIndex]\n this.changeCurrentText()\n const { isItemClickHide } = this.config;\n (isItemClickHide || IS_MOBILE || listType === LIST_TYPES.SIDE) && this.toggle(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: getListClassName(config.listType, config.position), // config.listType === LIST_TYPES.SIDE ? 'xg-right-side' : '',\n onItemClick: (e, data) => {\n this.onItemClick(e, data)\n }\n },\n root: config.listType === LIST_TYPES.SIDE ? (player.innerContainer || player.root) : this.root\n }\n\n if (this.config.isShowIcon) {\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n if (_maxH && config.heightLimit) {\n options.config.maxHeight = `${_maxH}px`\n }\n this.optionsList = new OptionList(options)\n this.changeCurrentText()\n this.show()\n }\n this._resizeList()\n }\n\n _resizeList () {\n if (!this.config.heightLimit) {\n return\n }\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = this.config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n this.optionsList && this.optionsList.setStyle({ maxHeight: `${_maxH}px` })\n }\n\n destroy () {\n const { config } = this\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.unbind(this.activeEvent, this.switchActiveState)\n } else {\n this.unbind(this.activeEvent, this.onEnter)\n this.unbind('mouseleave', this.onLeave)\n }\n this.isIcons && this.unbind('click', this.onIconClick)\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 `<xg-icon class=\"xg-options-icon ${this.config.className || ''}\">\n <div class=\"xgplayer-icon\">\n </div>\n </xg-icon>`\n }\n}\n","import { Events, POSITIONS, Util } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {import('../../defaultConfig').IDefinition} IDefinition\n */\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array<IDefinition>,\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 ...OptionsIcon.defaultConfig,\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 show () {\n if (!this.config.list || this.config.list.length < 2){\n return\n }\n Util.addClass(this.root, 'show')\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 ...item,\n showText: this.getTextByLang(item) || item.definition,\n selected: false\n }\n\n if (item.selected || (item.definition\n // eslint-disable-next-line eqeqeq\n && item.definition == targetDef)\n ) {\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<number | { [propName: string]: any }>,\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 ...OptionsIcon.defaultConfig,\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 = -1\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 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 let _text = ''\n // 在列表中没有匹配的选项的时候,默认展示`${playbackRate}x'\n if (!curItem || this.curIndex < 0) {\n _text = `${this.player.playbackRate}x`\n } else {\n _text = this.getTextByLang(curItem, 'iconText')\n }\n this.find('.icon-text').innerHTML = _text\n }\n\n destroy () {\n super.destroy()\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\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 const tipDom = this.find('.xg-tips')\n tipDom && this.changeLangTextKey(tipDom, 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 `<xg-icon class='xgplayer-cssfullscreen'>\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'CSSFULLSCREEN_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import Plugin, { Events } 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\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 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}<span class=\"xgplayer-error-refresh\">${this.i18n.REFRESH}</span>`\n }\n\n destroy () {\n this.unbind('.xgplayer-error-refresh', 'click', this.clickHandler)\n }\n\n render () {\n return `<xg-error class=\"xgplayer-error\">\n <div class=\"xgplayer-errornote\">\n <span class=\"xgplayer-error-text\"></span>\n <span class=\"xgplayer-error-tips\"><em class=\"xgplayer-error-refresh\"></em></span>\n </div>\n </xg-error>`\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 ? `<i class=\"highlight\">${detail.highlight}</i>` : ''}`\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 `<xg-prompt class=\"xgplayer-prompt ${STATE_CLASS.CONTROLS_FOLLOW}\">\n <span class=\"xgplayer-prompt-detail\"></span>\n </xg-prompt>`\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 _updateDotDom (iSpot, dotDom) {\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 },\n initDots () {\n this._ispots.map(item => {\n this.createDot(item, false)\n })\n this.ispotsInit = true\n },\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 _t = iSpot.template ? `<div class=\"xgplayer-spot-pop\">${iSpot.template}</div>` : ''\n const dotDom = Util.createDom('xg-spot', _t, {\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 this.positionDot(dotDom, iSpot.id)\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 this._updateDotDom(iSpot, dotDom)\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.forEach((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 positionDots () {\n const { _ispots, playerSize } = this\n const { sizeInfo } = this.player\n const { progress } = this.player.plugins\n if (!progress || sizeInfo.width === playerSize.width) {\n return\n }\n playerSize.width = sizeInfo.width\n playerSize.left = sizeInfo.left\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n dotDom && this.positionDot(dotDom, item.id)\n })\n },\n\n positionDot (dotDom, id) {\n const _pop = Util.findDom(dotDom, '.xgplayer-spot-pop')\n if (!_pop) {\n return\n }\n const pRect = this.playerSize\n\n const rect1 = dotDom.getBoundingClientRect()\n const rect = _pop.getBoundingClientRect()\n const _left = rect1.left - pRect.left\n const _diff = pRect.width - _left - rect1.width / 2\n if (_left < rect.width / 2 || pRect.width < rect.width) {\n const t = rect.width / 2 - _left\n _pop.style.left = `${t}px`\n } else if (_diff < rect.width / 2) {\n const t = _diff - rect.width / 2 + rect1.width / 2\n _pop.style.left = `${t}px`\n } else {\n _pop.style.left = '50%'\n }\n },\n\n updateDuration () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const { _ispots } = this\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n this._updateDotDom(item, dotDom)\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 plugin.playerSize = {\n left: player.sizeInfo.left,\n width: player.sizeInfo.width\n }\n plugin.on(Events.DURATION_CHANGE, () => {\n if (!plugin.ispotsInit) {\n plugin.initDots()\n } else {\n // 更新节点\n plugin.updateDuration()\n }\n })\n plugin.on(Events.VIDEO_RESIZE, () => {\n plugin.positionDots()\n })\n}\n","import Plugin, { Util, Sniffer, Events } from '../../plugin'\nimport initDotsAPI from './dotsApi'\nimport './index.scss'\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 mouseenter: '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 isHideThumbnailHover: true, // 是否在hover在预览图的时候隐藏\n isShowThumbnail: true, // 是否显示预览图\n isShowCoverPreview: false, // 进度条拖动时是否显示播放区域预览图\n mode: '', // short // production\n disable: false,\n width: 160, // 显示宽度\n height: 90 // 显示高度\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.seekTime) {\n this.player.seek(data.seekTime)\n }\n })\n this.transformTimeHook = this.hook('transformTime', (time) => {\n this.setTimeContent(Util.format(time))\n })\n initDotsAPI(this)\n\n this.on(Events.DURATION_CHANGE, () => {\n this.show()\n })\n if (this.config.disable) {\n this.disable()\n }\n // 用于进度条预览的扩展\n this.extTextRoot = this.find('.xg-spot-ext-text')\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 (Util.hasClass(e.target, 'xg-spot-content') && this.config.isHideThumbnailHover) {\n this.player.plugins.progress.onMouseLeave(e)\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 ['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, player, config } = this\n const { mode } = player.controls\n const isflex = mode === 'flex'\n let lwidth = root.getBoundingClientRect().width\n // 如果当前预览图宽度获取不到,无法计算位移,不做渲染\n if (!lwidth && this._hasThumnail) {\n return\n }\n lwidth = this._hasThumnail && lwidth < config.width ? config.width : lwidth\n let x = offset - lwidth / 2\n let _t\n if (x < 0 && !isflex) {\n x = 0\n _t = offset - lwidth / 2\n } else if (x > cwidth - lwidth && !isflex) {\n _t = x - (cwidth - lwidth)\n x = cwidth - lwidth\n } else {\n _t = 0\n }\n _t !== undefined && (previewLine.style.transform = `translateX(${_t.toFixed(2)}px)`)\n root.style.transform = `translateX(${x.toFixed(2)}px) translateZ(0)`\n }\n\n updateTimeText (timeStr) {\n const { timeText, timePoint } = this\n timeText.innerHTML = timeStr\n !this.thumbnail && (timePoint.innerHTML = timeStr)\n }\n\n updatePosition (offset, cwidth, time, e) {\n const { root, config, _state } = this\n if (!root) {\n return\n }\n\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 this.updateLinePos(offset, cwidth)\n }\n\n /**\n * @description 设置自定义时间显示字符串\n * @param {string} str\n */\n setTimeContent (str) {\n this.timeStr = str\n }\n\n updateThumbnails (time) {\n const { player, videoPreview, config } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, config.width, config.height)\n const rect = videoPreview && videoPreview.getBoundingClientRect()\n this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\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 if (config.mode === 'short') {\n Util.addClass(this.root, 'short-line')\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 this.updateThumbnails(0)\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 `<div class=\"xg-spot-info hide ${this.config.mode === 'short' ? 'short-line' : ''}\">\n <div class=\"xg-spot-content\">\n <div class=\"xg-spot-thumbnail\">\n <span class=\"xg-spot-time\"></span>\n </div>\n <div class=\"xg-spot-text\"><span class=\"spot-inner-text\"></span></div>\n </div>\n <div class=\"xgplayer-progress-point\">00:00</div>\n <div class=\"xg-spot-ext-text\"></div>\n <div class=\"xg-spot-line\"></div>\n </div>`\n }\n}\n","/* eslint-disable camelcase */\nimport BasePlugin, { Util, Events } from '../../plugin'\n/**\n * @typedef {{\n * isShow?: boolean,\n * urls?: Array<string>, // 有多张大图就多个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 height: 90, // 缩略图高度\n width: 160, // 缩略图宽度\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 = null\n this._preloadMark = {}\n }\n\n afterCreate () {\n if (this.usable) {\n this.initThumbnail()\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 const keys = Object.keys(config)\n if (keys.length < 1) {\n return\n }\n keys.forEach(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 this.interval = interval || Math.round(this.player.duration / pic_num)\n this._preloadMark = {}\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 if (this._preloadMark[index]) {\n return\n }\n const { urls } = this.config\n const len = urls.length\n const arr = []\n index > 0 && arr.push(index - 1)\n arr.push(index)\n index > 0 && index < len - 1 && arr.push(index + 1)\n arr.map(item => {\n if (!this._preloadMark[item] && item >= 0 && item < len) {\n this._preloadMark[item] = 1\n Util.preloadImg(urls[item], () => {\n this._preloadMark[item] = 2\n })\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 / pic_num)\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 sHeight = containerHeight\n swidth = sHeight * (width / height)\n // swidth = containerWidth\n // sHeight = swidth / (width / height)\n } else {\n swidth = containerWidth\n sHeight = swidth / (width / height)\n }\n } else if (!containerHeight) {\n swidth = containerWidth || width\n sHeight = swidth / (width / height)\n } else if (!containerWidth) {\n sHeight = containerHeight || height\n swidth = sHeight * (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 <= 0 || !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'\n\nfunction getBgColor (color) {\n return color ? `background:${color};` : ''\n}\n\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 const { commonStyle } = this.playerConfig\n const _style = {\n cached: getBgColor(commonStyle.cachedColor),\n played: getBgColor(commonStyle.playedColor),\n progress: getBgColor(commonStyle.progressColor),\n }\n return `<xg-mini-progress class=\"xg-mini-progress\" style=\"${_style.progress}\">\n <xg-mini-progress-cache class=\"xg-mini-progress-cache\" style=\"${_style.cached}\"></xg-mini-progress-cache>\n <xg-mini-progress-played class=\"xg-mini-progress-played\" style=\"${_style.played}\"></xg-mini-progress-played>\n </xg-mini-progress>`\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 parseInt(window.performance.now(), 10)\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 index: -1,\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 startFrameCount: 2, // 起始连续渲染次数\n startInterval: 0, // 初始渲染间隔\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, frameRate } = 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 this._isLoaded = 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 / frameRate, 10)\n\n /**\n * @readonly\n */\n this.canvas = null\n /**\n * @readonly\n */\n this.canvasCtx = null\n\n this._frameCount = 0\n\n this._loopType = this.config.mode !== MODES.REAL_TIME && this.interval >= 1000 ? 'timer' : 'animation'\n\n this.once(Events.COMPLETE, () => {\n if (!this.player) {\n return\n }\n this.init()\n this.renderByPoster()\n if (!this.player.paused) {\n this.start()\n }\n })\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 const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\n })\n this.on(Events.PAUSE, () => {\n this.stop()\n })\n }\n\n this.on(Events.LOADED_DATA, this.onLoadedData)\n this.on(Events.LOAD_START, () => {\n this._isLoaded = false\n this.stop()\n })\n document.addEventListener('visibilitychange', this.onVisibilitychange)\n }\n\n setConfig (config) {\n Object.keys(config).forEach(key => {\n if (key === 'root' && config[key] !== this.config[key]) {\n this.reRender(config[key])\n } else if (key === 'frameRate') {\n this.interval = parseInt(1000 / config[key], 10)\n } else if (key === 'disable' && config[key]) {\n this.stop()\n }\n this.config[key] = config[key]\n })\n }\n\n onLoadedData = (e) => {\n if (!this.player) { return }\n this._frameCount = this.config.startFrameCount\n this.stop()\n this.renderOnTimeupdate(e)\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n this.on(Events.TIME_UPDATE, this.renderOnTimeupdate)\n }\n\n onVisibilitychange = (e) => {\n if (document.visibilityState === 'visible') {\n this._checkIfCanStart() && this.start()\n } else if (document.visibilityState === 'hidden') {\n this.stop()\n }\n }\n\n /**\n * @private\n * 初始化 canvas对象并使用海报图先渲染首帧w11\n */\n init (_root) {\n const { player, config } = this\n this.canvasFilter = DynamicBg.supportCanvasFilter()\n try {\n // 保证节点插入到video之前\n let parent = _root || config.root\n if (!parent) {\n parent = !config.isInnerRender ? player.root : (player.innerContainer || player.root)\n }\n parent.insertAdjacentHTML('afterbegin',\n `<div class=\"xgplayer-dynamic-bg\" data-index=\"${config.index}\"><canvas>\n </canvas><xgmask></xgmask></div>`)\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 } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n reRender (root) {\n const { disable } = this.config\n if (!disable && !this.root) {\n return\n }\n this.stop()\n const _p = this.root ? this.root.parentElement : null\n if (_p !== root) {\n _p.removeChild(this.root)\n }\n if (!root) {\n this.root = null\n return\n }\n this.init(root)\n this.renderOnce()\n const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\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' && Util.isMSE(_tVideo))) {\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 renderOnTimeupdate = (e) => {\n if (this._frameCount > 0) {\n this.renderOnce()\n this._frameCount--\n } else {\n this._isLoaded = true\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n const { startInterval } = this.config\n !this.player.paused && this._checkIfCanStart() && this.start(0, startInterval)\n }\n }\n\n _checkIfCanStart () {\n const { mode } = this.config\n return this._isLoaded && !this.player.paused && mode !== MODES.FIRST_FRAME && mode !== MODES.POSTER\n }\n\n /**\n * just render once\n * @returns\n */\n renderOnce () {\n const video = this.player.video\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 // console.log('>>>renderOnce, update', _sVideo, this.videoPI)\n _sVideo && this.update(_sVideo, this.videoPI)\n }\n\n start = (time, interval) => {\n const video = this.player.video\n const _now = nowTime()\n const _sVideo = this.checkVideoIsSupport(video)\n if (!_sVideo || !this.canvasCtx) {\n return\n }\n\n if (!interval) {\n interval = this.interval\n }\n this.stop()\n if (video.videoWidth && video.videoHeight) {\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 >= interval) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n }\n }\n this.frameId = this._loopType === 'timer' ? Util.setTimeout(this, this.start, interval) : Util.requestAnimationFrame(this.start)\n }\n\n stop = () => {\n if (this.frameId) {\n this._loopType === 'timer' ? Util.clearTimeout(this, this.frameId) : 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 // console.log('>>>updateImg update', image, pi)\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 !== width && (_pos.width = this.canvas.width = width)\n _pos.height !== height && (_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 document.removeEventListener('visibilitychange', this.onVisibilitychange)\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.media\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.media.readyState === HTMLMediaElement.HAVE_NOTHING) {\n return\n }\n if (player.media.seeking) {\n if (!this.seekingEventReceived) { return }\n } else {\n this.seekingEventReceived = false\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n\n const buffered = player.media.buffered\n const smallGapLimit = config.smallGapLimit || 0.5\n const gapDetectionThreshold = config.gapDetectionThreshold || 0.3\n const currentTime = player.media.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.media.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.media.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.media.currentTime, ' jumpSize:', (currentTime - player.media.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.media.paused && player.media.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.media.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'\nconst DEFAULT_SPEED_TYPE = 'cdn'\nconst SPEED_TYPE = ['cdn'] // 默认的速度的种类,可以通过addSpeedTypeList再继续增加\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 addSpeedTypeList:[] // 需要增加的speed的类型\n }\n }\n\n getSpeed = (type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return 0\n if (this.speedListCache[type].length <= 0) return 0\n let total = 0\n this.speedListCache[type].map(item => {\n total += item\n })\n return Math.floor(total / this.speedListCache[type].length)\n }\n\n afterCreate () {\n const { openSpeed, addSpeedTypeList } = this.config\n if (addSpeedTypeList?.length > 0) {\n SPEED_TYPE.push(...addSpeedTypeList)\n }\n this.initSpeedList()\n this.on('real_time_speed', this._onRealSpeedChange)\n this.timer = null\n this.cnt = 0\n this.xhr = null\n if (!openSpeed) {\n return\n }\n this.on([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n }\n startTimer = () => {\n if (Util.isMSE(this.player.video)) {\n return\n }\n this.initSpeedList()\n this.cnt = 0\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n\n initSpeedList = () => {\n this.speedListCache = {}\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache[type] = []\n })\n }\n\n _onRealSpeedChange = (data) => {\n data.speed && this.appendList(data.speed, data.type || DEFAULT_SPEED_TYPE)\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, type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return\n const { saveSpeedMax } = this.config\n if (this.speedListCache[type].length >= saveSpeedMax) {\n this.speedListCache[type].shift()\n }\n this.speedListCache[type].push(speed)\n const { player } = this\n if (player) {\n type === DEFAULT_SPEED_TYPE ? (player.realTimeSpeed = speed) : (player[this.getSpeedName('realTime', type)] = speed)\n }\n this.updateSpeed(type)\n }\n\n getSpeedName (namePrefix, type){\n return namePrefix + 'Speed' + type.toUpperCase()\n }\n\n updateSpeed = (type = DEFAULT_SPEED_TYPE) => {\n const speed = this.getSpeed(type)\n const { player } = this\n if (player) {\n if (type === DEFAULT_SPEED_TYPE) {\n if ((!player.avgSpeed || speed !== player.avgSpeed)) {\n player.avgSpeed = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n } else {\n const speedName = this.getSpeedName('avg', type)\n if (!player[speedName] || speed !== player[speedName]) {\n player[speedName] = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n }\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 this.off('real_time_speed', this._onRealSpeedChange)\n this.off([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache && this.speedListCache[type] && (this.speedListCache[type] = [])\n })\n this.speedListCache && (this.speedListCache = {})\n clearTimeout(this.timer)\n this.timer = null\n if (this.xhr && this.xhr.readyState !== 4) {\n this.xhr.cancel && this.xhr.cancel()\n this.xhr = null\n }\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\n/**\n * @typedef { {\n * tick?: number,\n * stuckCount?: number,\n * disable?: boolean,\n * reportFrame?: number\n * } } IFullscreenConfig\n */\nexport default class FpsDetect extends BasePlugin {\n static get pluginName () {\n return 'FpsDetect'\n }\n\n static get defaultConfig () {\n return {\n disabled: false,\n tick: 1000, // tick时间,默认1000 ms\n stuckCount: 3, // 三次\n reportFrame: 0 // 每次解码帧率小于多少时统计\n }\n }\n\n afterCreate () {\n const { player, config } = this\n this.timer = null\n this._lastDecodedFrames = 0\n this._currentStuckCount = 0\n this._lastCheckPoint = null\n this._payload = []\n if (config.disabled) return\n const getVideoPlaybackQuality = player.media.getVideoPlaybackQuality\n if (!getVideoPlaybackQuality) return\n this.on(Events.PLAY, () => {\n this._startTick()\n })\n\n this.on(Events.PAUSE, () => {\n this._stopTick()\n })\n\n this.on(Events.ENDED, () => {\n this._stopTick()\n })\n\n this.on(Events.EMPTIED, () => {\n this._stopTick()\n })\n }\n\n _startTick () {\n this._stopTick()\n this._timer = setTimeout(() => {\n this._checkDecodeFPS()\n this._startTick()\n }, this.config.tick)\n }\n\n _stopTick () {\n clearTimeout(this._timer)\n this._timer = null\n }\n\n _checkStuck (curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval) {\n const { media } = this.player\n const hidden = document.hidden\n const paused = media.paused\n if (typeof hidden === 'boolean' && !hidden && !paused) {\n const curTime = media.currentTime\n const buffered = media.buffered\n let enoughBuffer = false\n const bufs = []\n for (let i = 0; i < buffered.length; i++) {\n const start = buffered.start(i)\n const end = buffered.end(i)\n bufs.push({ start, end })\n if (start <= curTime && curTime <= end - 1) {\n enoughBuffer = true\n break\n }\n }\n if (media.readyState === 4 && enoughBuffer) {\n if (this._currentStuckCount > this.config.stuckCount) {\n this.emit(Events.FPS_STUCK, this._payload)\n this._reset()\n } else {\n if (curDecodedFrames <= this.config.reportFrame) {\n this._currentStuckCount++\n this._payload.push({ bufs, currentTime: media.currentTime, curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval })\n } else {\n this._reset()\n }\n }\n }\n }\n }\n\n _reset () {\n this._payload = []\n this._currentStuckCount = 0\n }\n\n _checkDecodeFPS () {\n if (!this.player.media) {\n return\n }\n const { totalVideoFrames, droppedVideoFrames } = this.player.media.getVideoPlaybackQuality()\n const currTime = performance.now()\n if (totalVideoFrames) {\n if (this._lastCheckPoint) {\n const curDecoded = totalVideoFrames - this._lastDecodedFrames\n const checkInterval = currTime - this._lastCheckPoint\n this._checkStuck(curDecoded, totalVideoFrames, droppedVideoFrames, checkInterval)\n }\n }\n this._lastDecodedFrames = totalVideoFrames\n this._lastCheckPoint = currTime\n }\n\n destroy () {\n this._stopTick()\n }\n}\n","import sniffer from '../utils/sniffer'\nimport Controls from '../plugins/controls'\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 TimeSegments from '../plugins/time/timesegments'\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'\nimport FpsDetect from '../plugins/fpsDetect'\n// import Heatmap from '../plugins/heatmap'\n\nI18N.use(ZH)\n\nexport default class DefaultPreset {\n constructor (options, playerConfig) {\n const simulateMode = playerConfig && playerConfig.isMobileSimulateMode === 'mobile'\n const { isLive, controls } = playerConfig\n const basePlugin = controls ? [Controls] : []\n const vodPlugins = isLive ? basePlugin : [...basePlugin, TimeSegments, 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 = [...contolsIcons, Stats, Xglogger, ...layers, GapJump, WaitingTimeoutJump]\n const mode = simulateMode ? 'mobile' : sniffer.device\n switch (mode) {\n case 'pc':\n this.plugins.push(...[Keyboard, PC, CssFullScreen, TestSpeed, FpsDetect])\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","_typeof","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","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","isNotNull","setStyleFromCsstext","text","arr","filterStyleFromText","_cssText","cssText","styleArr","ret","remain","getStyleFromCsstext","preloadImg","onload","onerror","img","Image","stopPropagation","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","isBlob","generateSessionId","did","d","getTime","performance","uuid","c","random","createEvent","Event","initEvent","adjustTimeByDuration","duration","isEnded","createPositionBar","root","appendChild","getTransformStyle","pos","scale","rotate","transformValue","styles","translate","stylesKeys","lastIndex","convertDeg","abs","getIndexByTime","segments","_index","getOffsetCurrentTime","currentTime","_segments$_index","cTime","offset","getCurrentTimeByOffset","offsetTime","VERSION_REG","H264_MIMETYPES","sniffer","device","os","isPc","browser","navigator","ua","userAgent","toLowerCase","ie","firefox","chrome","opera","safari","filter","isWindowsPhone","isSymbian","isAndroid","isFireFox","isIpad","platform","maxTouchPoints","isTablet","isPhone","isIos","osVersion","_match","exec","version","isWeixin","toLocaleLowerCase","isSupportMP4","isSupport","mime","supportResult","canPlayType","isMSESupport","MediaSource","isTypeSupported","_logger","isHevcSupported","probeConfigSupported","defaults","supported","smooth","powerEfficient","Promise","resolve","mediaCapabilities","decodingInfo","videoConfig","audioConfig","audio","videoSupported","contentType","audioSupported","ERROR_TYPE_MAP","ERROR_MAP","Errors","player","errorInfo","errorType","errorCode","errorMessage","originError","ext","mediaError","ERROR_TYPES","i18n","media","ended","_player$media","readyState","networkState","_errc","code","playerVersion","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","SOURCE_ERROR","SOURCE_SUCCESS","VIDEO_EVENTS","STATS_EVENTS","STATS_INFO","STATS_DOWNLOAD","STATS_RESET","FPS_STUCK","emitVideoEvent","eventKey","errorHandler","getVideoEventHandler","_err","eData","originalEvent","detail","timeStamp","paused","isInternalOp","_internalOp","muted","volume","vtype","removeInnerOP","_currentTime","_rate","playbackRate","_duration","isMutedChange","_lastMuted","mediaEventMiddleware","MediaProxy","_EventEmitter","_inherits","_super","_createSuper","_this","_hasStart","mediaConfig","assign","controls","autoplay","playsinline","x5VideoPlayerFullscreen","x5VideoOrientation","airplay","tabindex","mediaType","videoAttributes","playerType","x5VideoPlayerType","Sniffer","loop","autoplayMuted","defaultPlaybackRate","attachVideoEvents","middlewares","_this2","_this3","_this4","_evHandlers","funName","charAt","toUpperCase","_defineProperty","addEventListener","_this5","removeEventListener","urls","_this6","removeAttribute","load","_c","_videoSourceCount","_videoSourceIndex","_vLoadeddata","_eHandler","_sourceError","_dIndex","removeChild","_e","k","pause","detachVideoEvents","set","play","range","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","_objectSpread","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","_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","codecType","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","BUILTIN_CLASS","MOBILE","MINI","getDefaultConfig","isNoRoot","isCustomRoot","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","preProcessUrl","ignores","whitelist","inactive","language","marginControls","fullscreenTarget","screenShot","pip","download","mini","cssFullscreen","keyShortcut","presets","definition","customDuration","timeOffset","thumbnail","isHideTips","minWaitDelay","commonStyle","progressColor","playedColor","cachedColor","sliderBtnStyle","volumeColor","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","_i18nLangs","_ret$langKeys","pId","STATES","STATE_ARRAY","PlAYER_HOOKS","REAL_TIME_SPEED","AVG_SPEED","Player","_MediaProxy","_assertThisInitialized","_this$config","__startTime","_useAutoplay","mediaPlay","canPlayFunc","isFullScreen","delayResize","fullEl","_fullActionFrom","props","prop","from","to","isVideo","checkIsCurrentVideo","pid","_fullscreenEl","focus","fullscreen","changeFullStyle","_fullScreenOffset","cssfullscreen","exitCssFullscreen","_assertThisInitialize","needFullscreenScroll","scrollTo","left","top","recoverFullStyle","onFullscreenChange","defaultPreset","defaultIdx","userTimer","waitTimer","_state","isError","isSeeking","isCanplay","rotateDeg","isRotateFullscreen","timeSegments","_cssfullscreenEl","curDefinition","_orgCss","_videoHeight","_videoWidth","videoPos","pi","vy","vx","sizeInfo","_accPlayed","acc","loopAcc","_offsetInfo","innerContainer","topBar","__i18n","database","Database","_onceSeekCanplay","_isPauseBeforeSeek","innerStates","isActiveLocked","rootInit","_initDOM","_possibleConstructorReturn","_this$config2","_this$config2$definit","defaultDefinitionObj","defaultDefinition","_bindEvents","_registerPresets","_registerPlugins","getInitDefinition","setState","onReady","hasStart","state","_this$config3","vid","line","handle","_initBaseDoms","XgVideoProxy","_nVideo","_this$config4","_width","_height","_this$root$getBoundin","getBoundingClientRect","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","_furl","_startInit","fileName","lineNumber","_this9","_src","curTime","isPaused","_error","_canplay","_this10","playPromise","onError","_errorTimer","_this11","_this12","status","_this13","_this$config5","isSeekedPlay","_status","_this14","_this$config6","_this15","bitrate","switchURL","seamless","reloadFunc","_this16","clsList","mediaPause","cls","_this17","unregisterPlugins","isResetConfig","resetState","pn","de","_this18","updateAcc","_unbindEvents","exitFullscreen","cList","isBuildIn","_this19","onPlay","_this20","cur","_srcRet","rootClass","pClassName","_orgPCss","webkitRequestFullscreen","ALLOW_KEYBOARD_INPUT","fullscreenEnabled","webkitSupportsFullscreen","webkitEnterFullscreen","exitRotateFullscreen","webkitExitFullScreen","_class","_this$config$fullscre","useCssFullscreen","_this$config$fullscre2","setRotateDeg","_rootStyle","innerHeight","deg","orientation","autoHide","delay","onFocus","ignorePaused","onBlur","_this21","isLock","blur","_ref","_ref$ignorePaused","_this22","_this23","videoHeight","endType","_at","_this$videoPos","_pi","videoWidth","_pos","offsetWidth","offsetHeight","rHeight","rWidth","formStyle","transform","webkitTransform","resizePosition","_this24","setConfig","_this25","_this26","containerSize","_this$media","_this$config7","controlsHeight","videoFit","fit","_style","paddingTop","videoScale","vWidth","vHeight","cWidth","cHeight","updateObjectPosition","objectPosition","newState","bool","_this27","curDef","targetDef","_this27$curDefinition","changeDefinition","total","dropped","corrupted","droppedRate","droppedDuration","getVideoPlaybackQuality","_quality","droppedVideoFrames","totalVideoFrames","corruptedVideoFrames","cumulateTime","_l","__url","posterUrl","update","_this$_accPlayed","isMuted","addInnerOP","descriptor","Controls","_Plugin","center","right","innerRoot","isMini","onMouseEnter","onMouseLeave","unbind","initShow","LOG_TYPES","XGLogger","isTimeUpdate","autoplayStart","_sendFF","vt","isFFLoading","isFFSend","isLs","pt","fvt","newPointTime","loadedCostTime","startCostTime","_isSeeking","seekingStart","waitingStart","fixedWaitingStart","_isWaiting","_waitTimer","_waittTimer","_waitType","suspendWaitingStatus","emitLog","suspendSeekingStatus","fixedStart","_startWaitTimeout","_onReset","_initOnceEvents","_onWaitingLoadStart","_this2$_state","_onSeeking","_onSeeked","endState","_onPlaying","_onWaiting","_onError","_onAutoplayStart","_onTimeupdate","s","_this$_state","costTime","waitTimeout","_now","_cost","_fixedCost","fixedCostTime","Replay","replay","ReplaySvg","__handleReplay","preventDefault","path","Poster","isEndedShow","hideCanplay","onTimeUpdate","_bg","fillMode","notHidden","getBgSize","AnimateMap","clearAnimation","Start","autoPlayStart","onPlayPause","initIcons","onAutoplayStart","onPlayerReset","clickHandler","switchPausePlay","cancelable","startPlay","PlaySvg","startPause","PauseSvg","isAnimate","endShow","_animateId","addAnimate","seconds","switchStatus","isShowPause","isShowEnd","endAnimate","disableAnimate","animate","Enter","innerHtml","HTMLElement","barStr","logo","xgIconTips","textKey","isShow","MiniScreenIcon","getMini","exitMini","onClick","getStyleSize","num","measurements","measurementsLength","getSize","elem","getStyle","size","innerWidth","outerWidth","outerHeight","getZeroSize","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","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","initEvents","onVideoClick","onVideoDblClick","onContextmenu","returnValue","cancelBubble","_this$player2","TOUCHS","move","MOUSES","Touche","__setPress","onTouchEnd","onTouchCancel","onTouchMove","trigger","__clearPress","moving","press","__setDb","diffx","diffy","miniStep","pressDelay","dbClickDelay","disablePress","disableDbClick","needPreventDefault","pressIntrvalId","dbIntrvalId","_initEvent","onTouchStart","__clearDb","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","focusVideoClick","dbClickHandler","pressRate","percent","updatePercent","isTouchingSeek","maxDarkness","isForward","focusHide","updateThumbnails","gradient","disableSeekIcon","miniYPer","darkness","isDisableTag","isContentEditable","Keyboard","keyCode","_keyState","disableBodyTrigger","isIgnoreUserActive","checkIsVisible","metaKey","altKey","ctrlKey","isBodyKeyDown","repeat","isKeyDown","isGlobalTrigger","checkCode","onBodyKeyUp","handleKeyDown","handleKeyUp","disableRootTrigger","onKeyup","extendkeyCodeMap","keyCodeMap","key1","seekStep","space","noBodyTarget","up","down","pressAction","esc","mergekeyCodeMap","isPress","tt","onKeydown","onBodyKeyDown","checkVisible","rec","bottom","isBodyTarget","flag","offsetCurrentTime","offsetDuration","_time","_step","_seekTime","handleKeyCode","curKeyCode","_this$keyCodeMap$arr$","_action","Loading","loadingIcon","TPL","styleKey","InnerList","fragments","_callBack","actionCallback","fragConfig","fragFocusClass","fragAutoFocus","fragClass","cachedIndex","playedIndex","focusIndex","newIndex","curIndex","millisecond","progressList","curPFrag","per","newPIndex","findIndex","unHightLight","setHightLight","_data","preIndex","fragment","cached","updateDuration","updateProgress","newCIndex","newOptions","_this$fragConfig","inner","isFocus","FRAGMENT_FOCUS_CLASS","POINT","HIGHLIGHT","Progress","_ePos","computeTime","triggerCallbacks","_updateInnerFocus","isLocked","updateWidth","seekTime","isPauseMoving","closeMoveSeek","isPlaying","onMoveStart","prePlayTime","isProgressMoving","progressBtn","_mouseDownHandlerHook","onMouseMove","onMouseUp","onMoveOnly","_assertThisInitialize5","onMoveEnd","_mouseUpHandlerHook","isEnter","_assertThisInitialize6","miniStartStep","_mouseMoveHandlerHook","_assertThisInitialize7","unlock","_this$pos","useable","__dragCallBacks","direc","_disableBlur","innerList","reset","outer","updateFocus","_initInner","isDragingSeek","isMobile","onTimeupdate","onCacheUpdate","onReset","onVideoResize","bindDomEvents","frags","boxShadow","_mouseDownHandler","_mouseUpHandler","_mouseMoveHandler","onMouseDown","onMouseOver","onMouseOut","onBodyClick","pauseAutoHide","recoverAutoHide","isCloseClickSeek","realTime","endedDiff","rLeft","timeIcon","resetActive","notSeek","_end","bufferedPoint","thumbnailPlugin","controlsMode","Icon","_onMouseenter","_onMouseLeave","Play","_IconPlugin","btnClick","tipDom","changeLangTextKey","IconPlugin","TopBackIcon","screenBack","BackSVG","Fullscreen","rotateFullscreen","handleFullscreen","toggleFullScreen","tipsDom","needBackIcon","topBackIcon","_onOrientationChange","FullScreenSvg","ExitFullScreenSvg","getCssFullscreen","getRotateFullscreen","switchCallback","Time","isActiving","constrolsMode","createCenterTime","durationDom","timeDom","centerCurDom","centerDurDom","current","minWidthTime","timeStr","updateState","TimeSegmentsControls","updateSegments","_checkIfEnabled","changeIndex","curPos","lastCurrentTime","_this$curPos","_this$player3","getSeekTime","_this$player4","_onDurationChange","_onLoadedData","_onPlay","newConfig","_segs","formatTimeSegments","_item","_segDuration","segDuration","last","_timeSegments$index","diff2","Volume","bar","barRect","barH","updateVolumePos","onBarMouseUp","_d","isMoving","unFocus","showValueLabel","updateVolumeValue","volumeSmall","volumeSmallSvg","volumeLarge","volumeLargeSvg","volumeMuted","volumeMutedSvg","_timerId","changeMutedHandler","changeMuted","_onMouseenterHandler","onMouseenter","_onMouseleaveHandler","onMouseleave","onBarMousedown","onBarMouseMove","onVolumeChange","$labelValue","innerText","isForce","miniVolume","isShowVolumeValue","Rotate","onBtnClick","innerRotate","updateRotateDeg","rootWidth","clientWidth","rootHeight","clientHeight","clockwise","videoRotateDeg","_transform","_styles","transformOrigin","times","factor","RotateSvg","PresentationMode","isPIPAvailable","isPip","exitPIP","requestPIP","showIcon","pMode","initPipEvents","switchPIP","pipIcon","PipIcon","pipIconExit","PipIconExit","leavePIPCallback","pipWindow","enterPIPCallback","pictureInPictureWindow","onWebkitpresentationmodechanged","webkitPresentationMode","checkWebkitSetPresentationMode","pipWin","textContent","styleSheets","cssRules","rule","link","rel","head","Boolean","preferDocument","isDocPIPAvailable","pipOptions","playerRect","documentPictureInPicture","requestWindow","docPiPNode","docPiPStyle","pipRoot","parentElement","previousSibling","nextSibling","copyStyleIntoPiPWindow","append","cssContent","webkitSetPresentationMode","requestPictureInPicture","reason","_documentPictureInPic","exitPictureInPicture","_documentPictureInPic2","pictureInPictureElement","pictureInPictureEnabled","disablePictureInPicture","webkitSupportsPresentationMode","protocol","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","dUrl","newUrl","getAbsoluteURL","downloadUtil","_handler","DownloadSvg","div","ScreenShot","screenshotIcon","initSize","fitVideo","onClickBtn","filename","saveLink","initMouseEvent","dispatchEvent","canvas","canvasCtx","getContext","imageSmoothingEnabled","imageSmoothingQuality","shot","saveImg","saveScreenShot","option","quality","createCanvas","dx","dy","dw","dh","mediaRatio","canvasRatio","sw","sh","drawImage","toDataURL","OptionList","maxHeight","onItemClick","renderItemList","_delegates","attrKeys","selected","showText","changeCallback","curSelected","getAttrObj","LIST_TYPES","TOGGLE_MODES","IS_MOBILE","OptionsIcon","switchActiveState","toggleMode","toggle","listType","enterType","isIcons","curValue","hidePortrait","_resizeList","optionsList","activeEvent","onEnter","onLeave","onIconClick","_isIcons","focusAwhile","curItem","changeCurrentText","isItemClickHide","getTextByLang","itemList","_maxH","heightLimit","listStyle","DefinitionIcon","_OptionsIcon","changeDefinitionList","definitionList","items","showItem","PlaybackRate","curRate","itemInfo","_text","CssFullScreen","isCssfullScreen","handleCssFullscreen","contentIcon","switchTips","CssFullSceenSvg","ExitCssFullSceenSvg","ErrorPlugin","errorRetry","handleError","retry","errorNote","Prompt","intervalId","customConfig","customOnClick","showPrompt","hidePrompt","interval","highlight","hideinterval","ISPOT","mergeISPOT","iSpot","APIS","_updateDotDom","dotDom","calcuPosition","initDots","_ispots","createDot","ispotsInit","isNew","template","positionDot","findDot","updateDot","needShow","dot","showDot","deleteDot","del","deleteAllDots","dotDoms","getElementsByTagName","updateAllDots","iSpots","ispot","positionDots","playerSize","_pop","pRect","rect1","_left","_diff","getAllDotsDom","getDotDom","CALLBACK_MAP","dragmove","dragstart","dragend","mouseover","ProgressPreview","isHideThumbnailHover","isDrag","_curDot","onDotMouseLeave","blurDot","enableBlur","focusDot","disableBlur","videoPreview","videothumbnail","handlerSpotClick","_event","transformTimeHook","setTimeContent","ispots","progressDot","initDotsAPI","extTextRoot","previewLine","timePoint","timeText","tipText","_hasThumnail","bindEvents","onMousemove","onMousedown","onMouseup","handlerPreviewClick","updatePosition","cwidth","isflex","lwidth","showTips","isFocusDots","defaultText","hideTips","updateTimeText","updateLinePos","thumbnailConfig","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","getBgColor","MiniProgress","MODES","nowTime","isSupportCanvas","DynamicBg","_frameCount","startFrameCount","stop","renderOnTimeupdate","visibilityState","_checkIfCanStart","renderOnce","_isLoaded","startInterval","_sVideo","checkVideoIsSupport","videoPI","preTime","_loopType","dynamicBg","frameRate","rwidth","rheight","renderByPoster","onLoadedData","onVisibilitychange","canvasFilter","supportCanvasFilter","isInnerRender","webkitFilter","mask","addMask","background","maskBg","_tVideo","HTMLVideoElement","flyVideo","_tagName","updateImg","_this$canvas$getBound","image","sourcePI","_this$canvas$getBound2","multiple","checkIsSupportCanvas","INFO","Stats","actionData","_getTime","_stats","stats","getStats","JSON","stringify","downloadUrl","disabled","timestamp","timeFormat","toISOString","_recordUserActions","_recordInfo","_downloadStats","profile","_infoProfile","_info","startMs","endMs","cat","dur","ph","tid","ts","_this$_stats","mediaElem","mediaInfo","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","onGapJump","threshold","bufferedInfo","_getBuffered","WaitingTimeoutJump","jumpCnt","jumpCntMax","useWaitingTimeoutJump","onJump","waitingTime","DEFAULT_SPEED_TYPE","SPEED_TYPE","TestSpeed","speedListCache","initSpeedList","cnt","testSpeed","testTimeStep","speed","appendList","openSpeed","loadSize","testCnt","testSpeedUrl","xhr","headers","Range","setRequestHeader","onreadystatechange","getResponseHeader","saveSpeedMax","shift","realTimeSpeed","getSpeedName","updateSpeed","getSpeed","avgSpeed","speedName","addSpeedTypeList","_onRealSpeedChange","namePrefix","FpsDetect","_lastDecodedFrames","_currentStuckCount","_lastCheckPoint","_payload","_startTick","_stopTick","_timer","_checkDecodeFPS","tick","curDecodedFrames","checkInterval","hidden","enoughBuffer","bufs","stuckCount","_reset","reportFrame","_this$player$media$ge","currTime","curDecoded","_checkStuck","DefaultPreset","_this$plugins","_this$plugins2","_this$plugins3","simulateMode","basePlugin","vodPlugins","TimeSegments","TimeIcon","contolsIcons","FullScreen","RotateIcon","PlaybackRateIcon","DownLoadIcon","ScreenShotIcon","PIPIcon","layers","Miniscreen","Xglogger","Mobile","PresetPlayer","_Player"],"mappings":"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"}
|