{"version":3,"file":"index.min.js","sources":["../../../node_modules/eventemitter3/index.js","../src/utils/debug.js","../src/utils/xgplayerTimeRange.js","../src/utils/util.js","../src/utils/sniffer.js","../src/version.js","../src/error.js","../src/events.js","../src/proxy.js","../src/utils/database.js","../src/constant.js","../src/plugin/hooksDescriptor.js","../src/plugin/basePlugin.js","../../../node_modules/delegate/src/closest.js","../../../node_modules/delegate/src/delegate.js","../src/plugin/plugin.js","../src/plugin/resizeObserver.js","../src/plugin/pluginsManager.js","../src/stateClassMap.js","../src/plugin/preset.js","../src/state.js","../src/plugins/controls/index.js","../src/lang/i18n.js","../src/lang/en.js","../src/player.js","../src/defaultConfig.js","../src/plugins/logger/index.js","../src/plugins/replay/index.js","../src/plugins/poster/index.js","../src/plugins/start/index.js","../src/plugins/enter/index.js","../src/plugins/miniScreen/miniScreenIcon.js","../src/utils/draggabilly.js","../src/plugins/miniScreen/index.js","../src/plugins/pc/index.js","../src/plugins/mobile/touch.js","../src/plugins/mobile/index.js","../src/plugins/keyboard/index.js","../src/plugins/loading/index.js","../src/plugins/progress/innerList.js","../src/plugins/progress/index.js","../src/plugins/play/index.js","../src/plugins/fullscreen/backicon.js","../src/plugins/fullscreen/index.js","../src/plugins/time/index.js","../src/plugins/volume/index.js","../src/plugins/rotate/index.js","../src/plugins/pip/index.js","../src/plugins/playNext/index.js","../../../node_modules/downloadjs/download.js","../src/plugins/download/index.js","../src/plugins/screenShot/index.js","../src/plugins/common/optionList.js","../src/plugins/common/optionsIcon.js","../src/plugins/definition/index.js","../src/plugins/playbackRate/index.js","../src/plugins/cssFullScreen/index.js","../src/plugins/error/index.js","../src/plugins/prompt/index.js","../src/plugins/progressPreview/dotsApi.js","../src/plugins/progressPreview/index.js","../src/plugins/common/thumbnail.js","../src/plugins/progress/miniProgress.js","../src/plugins/dynamicBg/index.js","../src/lang/zh-cn.js","../src/plugins/stats/index.js","../src/index.umd.js","../src/presets/default.js"],"sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","\nconst XG_DEBUG_OPEN = typeof (window) !== 'undefined' && window.location && window.location.href.indexOf('xgplayerdebugger=1') > -1\n\nconst STYLE = {\n info: 'color: #525252; background-color: #90ee90;',\n error: 'color: #525252; background-color: red;',\n warn: 'color: #525252; background-color: yellow; '\n}\n\nconst XGTAG = '%c[xgplayer]'\n\nconst XG_DEBUG = {\n config: {\n debug: XG_DEBUG_OPEN ? 3 : 1\n },\n\n logInfo: function (message, ...optionalParams) {\n this.config.debug >= 3 && console.log(XGTAG, STYLE.info, message, ...optionalParams)\n },\n\n logWarn: function (message, ...optionalParams) {\n this.config.debug >= 1 && console.warn(XGTAG, STYLE.warn, message, ...optionalParams)\n },\n\n logError: function (message, ...optionalParams) {\n if (this.config.debug < 1) {\n return\n }\n const _fun = this.config.debug >= 2 ? 'trace' : 'error'\n console[_fun](XGTAG, STYLE.error, message, ...optionalParams)\n }\n}\n\nfunction bindDebug (player) {\n player.logInfo = XG_DEBUG.logInfo.bind(player)\n player.logWarn = XG_DEBUG.logWarn.bind(player)\n player.logError = XG_DEBUG.logError.bind(player)\n}\n\nexport {\n XG_DEBUG as default,\n bindDebug\n}\n","export default class XgplayerTimeRange {\n constructor (bufferedList) {\n this.bufferedList = bufferedList\n }\n\n start (index) {\n return this.bufferedList[index].start\n }\n\n end (index) {\n return this.bufferedList[index].end\n }\n\n get length () {\n return this.bufferedList.length\n }\n}\n","import XG_DEBUG from './debug'\nimport XgplayerTimeRange from './xgplayerTimeRange'\nconst util = {}\n\n/**\n *\n * @param { string } el\n * @param { string } [tpl=]\n * @param { {[propName: string]: any }} [attrs={}]\n * @param { string } [cname='']\n * @returns { HTMLElement | null }\n */\nutil.createDom = function (el = 'div', tpl = '', attrs = {}, cname = '') {\n const dom = document.createElement(el)\n dom.className = cname\n dom.innerHTML = tpl\n Object.keys(attrs).forEach(item => {\n const key = item\n const value = attrs[item]\n if (el === 'video' || el === 'audio' || el === 'live-video') {\n if (value) {\n dom.setAttribute(key, value)\n }\n } else {\n dom.setAttribute(key, value)\n }\n })\n return dom\n}\n\n/**\n *\n * @param { string } html\n * @param { string } [attrs={}]\n * @param { string } [classname=\"\"]\n * @returns { HTMLElement | null }\n */\nutil.createDomFromHtml = function (html, attrs = {}, classname = '') {\n try {\n let doc = document.createElement('div')\n doc.innerHTML = html\n let dom = doc.children\n doc = null\n if (dom.length > 0) {\n dom = dom[0]\n classname && util.addClass(dom, classname)\n if (attrs) {\n Object.keys(attrs).forEach(key => {\n dom.setAttribute(key, attrs[key])\n })\n }\n return dom\n }\n return null\n } catch (err) {\n XG_DEBUG.logError('util.createDomFromHtml', err)\n return null\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { boolean }\n */\nutil.hasClass = function (el, className) {\n if (!el || !className) {\n return false\n }\n try {\n return Array.prototype.some.call(el.classList, item => item === className)\n } catch (e) {\n const orgClassName = el.className && typeof el.className === 'object' ? el.getAttribute('class') : el.className\n return orgClassName && !!orgClassName.match(new RegExp('(\\\\s|^)' + className + '(\\\\s|$)'))\n }\n // if (el.classList) {\n // return Array.prototype.some.call(el.classList, item => item === className)\n // } else {\n // const orgClassName = el.className && typeof el.className === 'object' ? el.getAttribute('class') : el.className\n // return orgClassName && !!orgClassName.match(new RegExp('(\\\\s|^)' + className + '(\\\\s|$)'))\n // }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.addClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n // className.replace(/(^\\s+|\\s+$)/g, '')\n className.trim().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, '')\n className.trim().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 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] = setInterval(intervalFunc.bind(context), frequency)\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @returns { void }\n */\nutil.clearInterval = function (context, eventName) {\n clearInterval(context._interval[eventName])\n context._interval[eventName] = null\n}\n\n/**\n *\n * @param { any } context\n * @param { function } fun\n * @param { number } time\n * @returns { number }\n */\nutil.setTimeout = function (context, fun, time) {\n if (!context._timers) {\n context._timers = []\n }\n const id = setTimeout(() => {\n fun()\n util.clearTimeout(context, id)\n }, time)\n context._timers.push(id)\n return id\n}\n\n/**\n *\n * @param { any } context\n * @param { number } id\n */\nutil.clearTimeout = function (context, id) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n for (let i = 0; i < _timers.length; i++) {\n if (_timers[i] === id) {\n _timers.splice(i, 1)\n clearTimeout(id)\n break\n }\n }\n } else {\n clearTimeout(id)\n }\n}\n\n/**\n *\n * @param { any } context\n */\nutil.clearAllTimers = function (context) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n _timers.map(item => {\n clearTimeout(item)\n })\n context._timerIds = []\n }\n}\n\n/**\n *\n * @param { string } name\n * @param { string } imgUrl\n * @param { number } [width]\n * @param { number } [height]\n * @returns { HTMLElement }\n */\nutil.createImgBtn = function (name, imgUrl, width, height) {\n const btn = util.createDom(`xg-${name}`, '', {}, `xgplayer-${name}-img`)\n btn.style.backgroundImage = `url(\"${imgUrl}\")`\n if (width && height) {\n let w, h, unit\n ['px', 'rem', 'em', 'pt', 'dp', 'vw', 'vh', 'vm', '%'].every((item) => {\n if (width.indexOf(item) > -1 && height.indexOf(item) > -1) {\n w = parseFloat(width.slice(0, width.indexOf(item)).trim())\n h = parseFloat(height.slice(0, height.indexOf(item)).trim())\n unit = item\n return false\n } else {\n return true\n }\n })\n btn.style.width = `${w}${unit}`\n btn.style.height = `${h}${unit}`\n btn.style.backgroundSize = `${w}${unit} ${h}${unit}`\n if (name === 'start') {\n btn.style.margin = `-${h / 2}${unit} auto auto -${w / 2}${unit}`\n } else {\n btn.style.margin = 'auto 5px auto 5px'\n }\n }\n return btn\n}\n\n/**\n *\n * @param { string } hex\n * @param { string | number } alpha\n * @returns { string }\n */\nutil.Hex2RGBA = function (hex, alpha) {\n const rgb = [] // 定义rgb数组\n // eslint-disable-next-line no-useless-escape\n if (/^\\#[0-9A-F]{3}$/i.test(hex)) {\n let sixHex = '#'\n hex.replace(/[0-9A-F]/ig, function (kw) {\n sixHex += kw + kw\n })\n hex = sixHex\n }\n if (/^#[0-9A-F]{6}$/i.test(hex)) {\n hex.replace(/[0-9A-F]{2}/ig, function (kw) {\n rgb.push(parseInt(kw, 16))\n })\n return `rgba(${rgb.join(',')}, ${alpha})`\n } else {\n return 'rgba(255, 255, 255, 0.1)'\n }\n}\n\n/**\n *\n * @returns { HTMLElement | null }\n */\nutil.getFullScreenEl = function () {\n return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsFunction = function (fun) {\n return fun && typeof fun === 'function'\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsObject = function (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * @param { HTMLElement }\n */\nutil.hide = function (dom) {\n dom.style.display = 'none'\n}\n\n/**\n * @param { HTMLElement }\n * @param { block | flex | inline-block | inline-flex } [display]\n */\nutil.show = function (dom, display) {\n dom.style.display = display || 'block'\n}\n\n/**\n *\n * @param { any } val\n * @returns { boolean }\n */\nutil.isUndefined = function (val) {\n if (typeof val === 'undefined' || val === null) {\n return true\n }\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } [text]\n * @returns\n */\nutil.setStyleFromCsstext = function (dom, text) {\n // dom.setAttribute(style, text)\n if (!text) {\n return\n }\n if (util.typeOf(text) === 'String') {\n const styleArr = text.replace(/\\s+/g, '').split(';')\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n dom.style[arr[0]] = arr[1]\n }\n }\n })\n } else {\n Object.keys(text).map(key => {\n dom.style[key] = text[key]\n })\n }\n}\n\n/**\n *\n * @param { string } key\n * @param { Array} list\n * @returns { boolean }\n */\nfunction checkIsIn (key, list) {\n for (let i = 0, len = list.length; i < len; i++) {\n if (key.indexOf(list[i]) > -1) {\n return true\n }\n }\n return false\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { Array } [list] attribute names to filter\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.filterStyleFromText = function (dom, list = ['width', 'height', 'top', 'left', 'bottom', 'right', 'position', 'z-index', 'padding', 'margin', 'transform']) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n const remain = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n if (checkIsIn(arr[0], list)) {\n ret[arr[0]] = arr[1]\n // dom.style[arr[0]] = 'initial'\n } else {\n remain[arr[0]] = arr[1]\n }\n }\n }\n })\n dom.setAttribute('style', '')\n Object.keys(remain).map(key => {\n // netStyle += `${key}: ${remain[key]};`\n dom.style[key] = remain[key]\n })\n return ret\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.getStyleFromCsstext = function (dom) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n ret[arr[0]] = arr[1]\n }\n }\n })\n return ret\n}\n\nutil.preloadImg = (url, onload = () => {}, onerror = () => {}) => {\n if (!url) {\n return\n }\n let img = new window.Image()\n if (img.complete) {\n // 图片已经加载过了,可以使用图片\n // do something here\n // img = null\n onload && onload()\n } else {\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 }\n img.src = url\n}\n\nutil.stopPropagation = (e) => {\n if (e) {\n e.stopPropagation()\n e.cancelable && e.preventDefault()\n }\n}\n\nutil.scrollTop = function () {\n return window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0\n}\n\nutil.scrollLeft = function () {\n return window.pageXOffset ||\n document.documentElement.scrollLeft ||\n document.body.scrollLeft ||\n 0\n}\n\nutil.checkTouchSupport = function () {\n return 'ontouchstart' in window\n}\n\nutil.getBuffered2 = (vbuffered, maxHoleDuration = 0.5) => { // ref: hls.js\n const buffered = []\n for (let i = 0; i < vbuffered.length; i++) {\n buffered.push({ start: vbuffered.start(i) < 0.5 ? 0 : vbuffered.start(i), end: vbuffered.end(i) })\n }\n buffered.sort(function (a, b) {\n const diff = a.start - b.start\n if (diff) {\n return diff\n } else {\n return b.end - a.end\n }\n })\n let buffered2 = []\n if (maxHoleDuration) {\n for (let i = 0; i < buffered.length; i++) {\n const buf2len = buffered2.length\n if (buf2len) {\n const buf2end = buffered2[buf2len - 1].end\n if ((buffered[i].start - buf2end) < maxHoleDuration) {\n if (buffered[i].end > buf2end) {\n buffered2[buf2len - 1].end = buffered[i].end\n }\n } else {\n buffered2.push(buffered[i])\n }\n } else {\n buffered2.push(buffered[i])\n }\n }\n } else {\n buffered2 = buffered\n }\n return new XgplayerTimeRange(buffered2)\n}\n\n/**\n * @description css中有zoom的时候,位移会等比缩放,但是元素的宽高不会等比缩放,所以通过该api做统一\n * https://bugs.chromium.org/p/chromium/issues/detail?id=429140#c8\n * @param {Events} e\n * @param {number} zoom\n * @returns\n */\nutil.getEventPos = function (e, zoom = 1) {\n return {\n x: e.x / zoom,\n y: e.y / zoom,\n clientX: e.clientX / zoom,\n clientY: e.clientY / zoom,\n offsetX: e.offsetX / zoom,\n offsetY: e.offsetY / zoom,\n pageX: e.pageX / zoom,\n pageY: e.pageY / zoom\n }\n}\n\nutil.requestAnimationFrame = function (callback) {\n const _fun = window.requestAnimationFrame ||\n // Older versions Chrome/Webkit\n window.webkitRequestAnimationFrame ||\n\n // Firefox < 23\n window.mozRequestAnimationFrame ||\n\n // opera\n window.oRequestAnimationFrame ||\n\n // ie\n window.msRequestAnimationFrame\n if (_fun) {\n return _fun(callback)\n }\n}\n\nutil.getHostFromUrl = function (url) {\n if (url === null || url === undefined || url === '' || 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\nexport default util\n","/**\n * @typedef {{\n * isSupport: boolean,\n * mime: string\n * }} ICheckResult\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 * }} ISniffer\n */\n\nconst VERSION_REG = {\n android: /(Android)\\s([\\d.]+)/,\n ios: /(Version)\\/([\\d.]+)/\n}\n\nconst H264_MIMETYPES = [\n 'avc1.42E01E, mp4a.40.2',\n 'avc1.58A01E, mp4a.40.2',\n 'avc1.4D401E, mp4a.40.2',\n 'avc1.64001E, mp4a.40.2',\n 'avc1.42E01E',\n 'mp4v.20.8',\n 'avc1.42E01E, mp4a.40.2',\n 'avc1.58A01E, mp4a.40.2',\n 'avc1.4D401E, mp4a.40.2',\n 'avc1.64001E, mp4a.40.2',\n 'mp4v.20.8, mp4a.40.2',\n 'mp4v.20.240, mp4a.40.2'\n]\n\n/**\n * @type ISniffer\n */\nconst sniffer = {\n get device () {\n const r = sniffer.os\n return r.isPc ? 'pc' : 'mobile'\n // return r.isPc ? 'pc' : r.isTablet ? 'tablet' : 'mobile'\n },\n get browser () {\n if (typeof navigator === 'undefined') {\n return ''\n }\n const ua = navigator.userAgent.toLowerCase()\n const reg = {\n ie: /rv:([\\d.]+)\\) like gecko/,\n firefox: /firefox\\/([\\d.]+)/,\n chrome: /chrome\\/([\\d.]+)/,\n opera: /opera.([\\d.]+)/,\n safari: /version\\/([\\d.]+).*safari/\n }\n return [].concat(Object.keys(reg).filter(key => reg[key].test(ua)))[0]\n },\n get os () {\n if (typeof navigator === 'undefined') {\n return {}\n }\n const ua = navigator.userAgent\n const isWindowsPhone = /(?:Windows Phone)/.test(ua)\n const isSymbian = /(?:SymbianOS)/.test(ua) || isWindowsPhone\n const isAndroid = /(?:Android)/.test(ua)\n const isFireFox = /(?:Firefox)/.test(ua)\n const isTablet = /(?:iPad|PlayBook)/.test(ua) || (isAndroid && !/(?:Mobile)/.test(ua)) || (isFireFox && /(?:Tablet)/.test(ua))\n const isPhone = /(?:iPhone)/.test(ua) && !isTablet\n const isPc = !isPhone && !isAndroid && !isSymbian && !isTablet\n const isIpad = /(?:iPad|PlayBook)/.test(ua)\n return {\n isTablet,\n isPhone,\n isIpad,\n isIos: isPhone || isIpad,\n isAndroid,\n isPc,\n isSymbian,\n isWindowsPhone,\n isFireFox\n }\n },\n\n get osVersion () {\n 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 },\n\n isSupportMP4 () {\n if (this.supportResult) {\n return this.supportResult\n }\n let a = document.createElement('video')\n const result = {\n isSupport: false,\n mime: ''\n }\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\nexport default sniffer\n","/**\n * @type {string}\n * */\nexport default __VERSION__\n","// eslint-disable-next-line no-undef\nimport version from './version'\n/**\n * @typedef { import ('./player').default } Player\n */\n\nconst ERROR_TYPE_MAP = {\n 1: 'network',\n 2: 'network',\n 3: 'decoder',\n 4: 'format'\n}\n\nconst ErrorTypes = {\n network: {\n code: 1\n },\n mse: {\n code: 2\n },\n parse: {\n code: 3\n },\n format: {\n code: 4\n },\n decoder: {\n code: 5\n },\n runtime: {\n code: 6\n },\n timeout: {\n code: 7\n },\n other: {\n code: 8\n }\n}\n\n/**\n * @typedef { {\n * playerVersion: string,\n * currentTime: number,\n * duration: number,\n * ended: boolean,\n * readyState: number,\n * networkState: number,\n * src: any,\n * errorType: string,\n * errorCode: number,\n * message: string,\n * mediaError?: {\n * code: number,\n * message?: string\n * },\n * originError?: any,\n * url?: any,\n * [propName: string]: any\n * } } IError\n */\n\n/**\n * @type { IError }\n */\nclass Errors {\n /**\n *\n * @param { Player } player\n * @param { {\n * errorType: string,\n * errorCode: number,\n * errorMessage: string,\n * originError: any,\n * ext: { [propName: string]: any; }\n * } } errorInfo\n * @returns\n */\n constructor (player, errorInfo = { errorType: '', errorCode: 0, errorMessage: '', originError: '', ext: {}, mediaError: null }) {\n const ERROR_TYPES = player && player.i18n ? player.i18n.ERROR_TYPES : null\n if (player.video) {\n const mediaError = errorInfo.mediaError ? errorInfo.mediaError : (player.video.error || {})\n const { duration, currentTime, ended, src, currentSrc } = player\n const { readyState, networkState } = player.video\n const r = {\n playerVersion: version,\n currentTime,\n duration,\n ended,\n readyState,\n networkState,\n src: src || currentSrc,\n errorType: errorInfo.errorType,\n errorCode: errorInfo.errorCode || mediaError.code,\n message: errorInfo.errorMessage || mediaError.message,\n mediaError,\n originError: errorInfo.originError ? errorInfo.originError.stack : ''\n }\n errorInfo.ext && Object.keys(errorInfo.ext).map(key => {\n r[key] = errorInfo.ext[key]\n })\n return r\n } else {\n if (arguments.length > 1) {\n const r = {\n playerVersion: version,\n domain: document.domain\n }\n const arr = ['errorType', 'currentTime', 'duration', 'networkState', 'readyState', 'src', 'currentSrc', 'ended', 'errd', 'errorCode', 'mediaError']\n for (let i = 0; i < arguments.length; i++) {\n r[arr[i]] = arguments[i]\n }\n r.ex = ERROR_TYPES ? (ERROR_TYPES[arguments[0]] || {}).msg : ''// 补充信息\n return r\n }\n }\n }\n}\n\nexport {\n Errors as default,\n ErrorTypes,\n ERROR_TYPE_MAP\n}\n","export const PLAY = 'play'\nexport const PLAYING = 'playing'\nexport const ENDED = 'ended'\nexport const PAUSE = 'pause'\nexport const ERROR = 'error'\nexport const SEEKING = 'seeking'\nexport const SEEKED = 'seeked'\nexport const TIME_UPDATE = 'timeupdate'\nexport const WAITING = 'waiting'\nexport const CANPLAY = 'canplay'\nexport const CANPLAY_THROUGH = 'canplaythrough'\nexport const DURATION_CHANGE = 'durationchange'\nexport const VOLUME_CHANGE = 'volumechange'\nexport const LOADED_DATA = 'loadeddata'\nexport const RATE_CHANGE = 'ratechange'\nexport const PROGRESS = 'progress'\nexport const LOAD_START = 'loadstart'\nexport const EMPTIED = 'emptied'\nexport const STALLED = 'stalled'\nexport const SUSPEND = 'suspend'\nexport const ABORT = 'abort'\n\n// player events\nexport const BUFFER_CHANGE = 'bufferedChange'\nexport const PLAYER_FOCUS = 'focus'\nexport const PLAYER_BLUR = 'blur'\nexport const READY = 'ready'\nexport const URL_NULL = 'urlNull'\nexport const AUTOPLAY_STARTED = 'autoplay_started'\nexport const AUTOPLAY_PREVENTED = 'autoplay_was_prevented'\nexport const COMPLETE = 'complete'\nexport const REPLAY = 'replay'\nexport const DESTROY = 'destroy'\nexport const URL_CHANGE = 'urlchange'\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 USER_ACTION1 = 'user_action1'\n\nexport const VIDEO_EVENTS = [\n 'play',\n 'playing',\n 'ended',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'timeupdate',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'durationchange',\n 'volumechange',\n 'loadeddata',\n 'ratechange',\n 'progress',\n 'loadstart',\n 'emptied',\n 'stalled',\n 'suspend',\n 'abort'\n]\n\nexport const STATS_EVENTS = {\n STATS_INFO: 'stats_info',\n STATS_DOWNLOAD: 'stats_download',\n STATS_RESET: 'stats_reset'\n}\n","import EventEmitter from 'eventemitter3'\nimport Util from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Errors, { ERROR_TYPE_MAP } from './error'\nimport { URL_CHANGE, WAITING, VIDEO_EVENTS } from './events'\n/**\n * @typedef { import ('eventemitter3') } EventEmitter\n */\n/**\n * @typedef { {\n * duration: number,\n * currentTime: number,\n * muted: boolean,\n * defaultMuted: boolean,\n * volume: number,\n * playbackRate: number,\n * defaultPlaybackRate: number,\n * autoplay: boolean,\n * readonly paused: boolean,\n * readonly ended: boolean,\n * readonly networkState: number,\n * readonly readyState: number,\n * readonly seeking: boolean,\n * src: any,\n * play: Function,\n * pause: Function,\n * } } IVideoProxy\n */\n\nfunction emitVideoEvent (eventKey, e) {\n if (!this || !this.emit) {\n return\n }\n if (eventKey === 'error') {\n this.errorHandler(eventKey)\n } else {\n this.emit(eventKey, e)\n }\n}\n\n// 获取包装EventsMiddleware后的VIDEO_EVENT\nfunction getVideoEventHandler (eventKey, player) {\n return (e) => {\n const eData = {\n player,\n eventName: eventKey,\n originalEvent: e,\n detail: e.detail || {},\n timeStamp: e.timeStamp,\n currentTime: player.currentTime,\n duration: player.duration,\n paused: player.paused,\n ended: player.ended,\n isInternalOp: !!player._internalOp[e.type], // 是否是内部操作,不反应到UI上\n muted: player.muted,\n volume: player.volume,\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype\n }\n player.removeInnerOP(e.type)\n if (eventKey === 'timeupdate') {\n player._currentTime = player.video && player.video.currentTime\n }\n\n if (eventKey === 'durationchange') {\n player._duration = player.video.duration\n }\n\n if (eventKey === 'volumechange') {\n eData.isMutedChange = player._lastMuted !== player.muted\n player._lastMuted = player.muted\n }\n\n // 执行video相关事件中间件能力\n if (player.videoEventMiddleware[eventKey]) {\n try {\n player.videoEventMiddleware[eventKey].call(player, eData, emitVideoEvent.bind(player))\n } catch (err) {\n emitVideoEvent.call(player, eventKey, eData)\n throw err\n }\n } else {\n emitVideoEvent.call(player, eventKey, eData)\n }\n }\n}\n\n/**\n * @extends { EventEmitter }\n */\nclass VideoProxy extends EventEmitter {\n /**\n * @param {any} options\n */\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 * @description 初始化时添加在video上的属性集合\n * @type { {[propName: string]: any } }\n */\n this.videoConfig = Object.assign({}, {\n controls: false,\n autoplay: options.autoplay,\n playsinline: options.playsinline,\n 'x5-playsinline': options.playsinline,\n 'webkit-playsinline': options.playsinline,\n 'x5-video-player-fullscreen': options['x5-video-player-fullscreen'] || options.x5VideoPlayerFullscreen,\n 'x5-video-orientation': options['x5-video-orientation'] || options.x5VideoOrientation,\n airplay: options.airplay,\n 'webkit-airplay': options.airplay,\n tabindex: 2,\n mediaType: options.mediaType || 'video'\n }, options.videoConfig, options.videoAttributes)\n /**\n * @description Compatible with WeChat webview\n * \"x5-playsinline' and 'x5-video-player-type' only one needs to exist\n * @doc https://x5.tencent.com/docs/video.html\n */\n const playerType = options['x5-video-player-type'] || options.x5VideoPlayerType\n if (Sniffer.isWeixin && Sniffer.os.isAndroid && playerType) {\n this.videoConfig['x5-video-player-type'] = playerType\n delete this.videoConfig.playsinline\n delete this.videoConfig['webkit-playsinline']\n delete this.videoConfig['x5-playsinline']\n }\n\n if (options.loop) {\n this.videoConfig.loop = 'loop'\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IVideoProxy | null }\n */\n this.video = Util.createDom(this.videoConfig.mediaType, '', this.videoConfig, '')\n\n if (options.defaultPlaybackRate) {\n this.video.defaultPlaybackRate = this.video.playbackRate = options.defaultPlaybackRate\n }\n\n if (Util.typeOf(options.volume) === 'Number') {\n this.volume = options.volume\n }\n\n if (options.autoplayMuted) {\n this.video.muted = true\n this._lastMuted = true\n }\n if (options.autoplay) {\n this.video.autoplay = true\n }\n\n /**\n * @private\n */\n this._interval = {}\n /**\n * @readonly\n */\n this.videoEventMiddleware = {}\n this.attachVideoEvents()\n }\n\n /**\n * @description set middleware\n * @param { {[propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n setEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n this.videoEventMiddleware[key] = middlewares[key]\n })\n }\n\n /**\n * @description remove middleware\n * @param { { [propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n removeEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n delete this.videoEventMiddleware[key]\n })\n }\n\n /**\n * Add media eventListener to the video object\n * @param { any } [video]\n */\n attachVideoEvents (video = this.video) {\n if (!this._evHandlers) {\n /**\n * @private\n */\n this._evHandlers = VIDEO_EVENTS.map(eventKey => {\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.on(eventKey, this[funName])\n }\n\n return {\n [eventKey]: getVideoEventHandler(eventKey, this)\n }\n })\n }\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n video.addEventListener(eventKey, item[eventKey], false)\n })\n }\n\n /**\n * @description remove media eventListener from the video object\n * @param { any } [video]\n */\n detachVideoEvents (video = this.video) {\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n video.removeEventListener(eventKey, item[eventKey], false)\n })\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.off(eventKey, this[funName])\n }\n })\n\n this._evHandlers = null\n }\n\n /**\n * 针对source列表播放方式添加错误监听\n * @doc https://stackoverflow.com/questions/47557135/html5-detect-the-type-of-error-when-trying-to-load-a-video-using-a-source-elem\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n */\n /**\n * 针对source列表播放方式添加错误监听\n * @doc https://stackoverflow.com/questions/47557135/html5-detect-the-type-of-error-when-trying-to-load-a-video-using-a-source-elem\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n * @param { Array<{src: string, type: string }>} urls\n */\n _attachSourceEvents (video, urls) {\n video.removeAttribute('src')\n urls.forEach(item => {\n this.video.appendChild(Util.createDom('source', '', {\n src: `${item.src}`,\n type: `${item.type || ''}`\n }))\n })\n const _c = video.children\n if (!_c) {\n return\n }\n /**\n * @private\n */\n this._videoSourceCount = _c.length\n /**\n * @private\n */\n !this._sourceError && (this._sourceError = (e) => {\n this._videoSourceCount--\n if (this._videoSourceCount === 0) {\n if (this.videoEventMiddleware.error) {\n this.videoEventMiddleware.error.call(this, e, () => {\n this.errorHandler('error')\n })\n } else {\n this.errorHandler('error', { code: 4, message: 'sources load error' })\n }\n }\n })\n for (let i = 0; i < _c.length; i++) {\n _c[i].addEventListener('error', this._sourceError)\n }\n }\n\n /**\n * 移除source列表错误事件监听\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n */\n _detachSourceEvents (video) {\n const _c = video.children\n if (!_c || _c.length === 0 || !this._sourceError) {\n return\n }\n for (let i = 0; i < _c.length; i++) {\n _c[i].removeEventListener('error', this._sourceError)\n }\n while (_c.length > 0) {\n video.removeChild(_c[0])\n }\n }\n\n /**\n * @description Media Error handler\n * @param { string } eventName\n */\n errorHandler (name, error = null) {\n if (this.video && (this.video.error || error)) {\n let _e = this.video.error || error\n const type = _e.code ? ERROR_TYPE_MAP[_e.code] : 'other'\n let message = _e.message\n if (!this.video.currentSrc) {\n message = 'empty_src'\n _e = {\n code: 6,\n message\n }\n }\n this.emit(name, new Errors(this, {\n errorType: type,\n errorCode: _e.code,\n errorMessage: _e.message || '',\n mediaError: _e\n }))\n }\n }\n\n destroy () {\n if (this.video) {\n if (this.video.pause) {\n this.video.pause()\n this.video.muted = true\n }\n this.video.removeAttribute('src') // empty source\n this.video.load()\n }\n this._currentTime = 0\n this._duration = 0\n this.videoConfig = null\n for (const k in this._interval) {\n clearInterval(this._interval[k])\n this._interval[k] = null\n }\n this.detachVideoEvents()\n this.video = null\n this.videoEventMiddleware = {}\n this.removeAllListeners()\n }\n\n /**\n *\n * @returns { Promise | null }\n */\n play () {\n const ret = this.video ? this.video.play() : null\n return ret\n }\n\n pause () {\n this.video && this.video.pause()\n }\n\n /**\n *\n * @param { string } type\n * @returns { boolean }\n */\n canPlayType (type) {\n return this.video ? this.video.canPlayType(type) : false\n }\n\n /**\n *\n * @param { any } [buffered]\n * @returns { Array }\n */\n getBufferedRange (buffered) {\n const range = [0, 0]\n if (!this.video) {\n return range\n }\n if (!buffered) {\n buffered = this.video.buffered\n }\n const currentTime = this.video.currentTime\n if (buffered) {\n for (let i = 0, len = buffered.length; i < len; i++) {\n range[0] = buffered.start(i)\n range[1] = buffered.end(i)\n if (range[0] <= currentTime && currentTime <= range[1]) {\n break\n }\n }\n }\n if (range[0] - currentTime <= 0 && currentTime - range[1] <= 0) {\n return range\n } else {\n return [0, 0]\n }\n }\n\n /**\n * @type { boolean }\n * @description 设置/返回 自动播放属性\n */\n set autoplay (isTrue) {\n this.video && (this.video.autoplay = isTrue)\n }\n\n get autoplay () {\n return this.video ? this.video.autoplay : false\n }\n\n /**\n * @type { TimeRanges | null }\n * @description 返回当前缓冲的TimeRange对象集合\n */\n get buffered () {\n return this.video ? this.video.buffered : null\n }\n\n /**\n * @type { Array<{start: number, end: number}> | null}\n * @description 返回当前自定义的缓存列表\n */\n get buffered2 () {\n return this.video ? Util.getBuffered2(this.video.buffered) : null\n }\n\n /**\n * @type { {start: number, end: number} }\n */\n get bufferedPoint () {\n const ret = {\n start: 0,\n end: 0\n }\n if (!this.video) {\n return ret\n }\n const _buffered = this.video.buffered\n if (!_buffered || _buffered.length === 0) {\n return ret\n }\n for (let i = 0; i < _buffered.length; i++) {\n if ((_buffered.start(i) <= this.currentTime || _buffered.start(i) < 0.1) && _buffered.end(i) >= this.currentTime) {\n return {\n start: _buffered.start(i),\n end: _buffered.end(i)\n }\n }\n }\n return ret\n }\n\n /**\n * @type { string}\n * @description 设置/返回是否跨域\n * */\n get crossOrigin () {\n return this.video ? this.video.crossOrigin : ''\n }\n\n set crossOrigin (isTrue) {\n this.video && (this.video.crossOrigin = isTrue)\n }\n\n /**\n * @type { string }\n * @description 设置/返回视频播放地址\n * */\n get currentSrc () {\n return this.video ? this.video.currentSrc : ''\n }\n\n set currentSrc (src) {\n this.video && (this.video.currentSrc = src)\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频当前播放时间\n * */\n get currentTime () {\n if (!this.video) {\n return 0\n }\n return this.video.currentTime !== undefined ? this.video.currentTime : this._currentTime\n }\n\n set currentTime (time) {\n this.video && (this.video.currentTime = time)\n }\n\n /**\n * @type { boolean }\n * 设置/返回视频默认静音\n * */\n get defaultMuted () {\n return this.video ? this.video.defaultMuted : false\n }\n\n set defaultMuted (isTrue) {\n this.video && (this.video.defaultMuted = isTrue)\n }\n\n /**\n * @type { number }\n * @description 返回视频时长,单位:s\n * */\n get duration () {\n return this._duration\n }\n\n /**\n * @type { boolean }\n * @description 回视频是否播放结束\n * */\n get ended () {\n return this.video ? this.video.ended : false\n }\n\n /**\n * @type { MediaError }\n * @description the player current error\n */\n get error () {\n return this.video.error\n }\n\n /**\n * @type { string }\n * @description return error description text\n */\n get errorNote () {\n const err = this.video.error\n if (!err) {\n return ''\n }\n const status = [\n 'MEDIA_ERR_ABORTED',\n 'MEDIA_ERR_NETWORK',\n 'MEDIA_ERR_DECODE',\n 'MEDIA_ERR_SRC_NOT_SUPPORTED'\n ]\n return status[this.video.error.code - 1]\n }\n\n /**\n * @type { boolean }\n * @description 否开启了循环播放\n */\n get loop () {\n return this.video ? this.video.loop : false\n }\n\n set loop (isTrue) {\n this.video && (this.video.loop = isTrue)\n }\n\n /**\n * @type { boolean }\n * @description 静音\n */\n get muted () {\n return this.video ? this.video.muted : false\n }\n\n set muted (isTrue) {\n if (!this.video || this.video.muted === isTrue) {\n return\n }\n this._lastMuted = this.video.muted\n this.video.muted = isTrue\n }\n\n /**\n * @type { number }\n * @description 返回视频的当前网络状态\n */\n get networkState () {\n return this.video.networkState\n }\n\n /**\n * @type { boolean }\n * @description 回当前视频是否是暂停状态\n */\n get paused () {\n return this.video ? this.video.paused : true\n }\n\n /**\n * @type { number }\n * @description 返回/设置倍速\n */\n get playbackRate () {\n return this.video ? this.video.playbackRate : 0\n }\n\n set playbackRate (rate) {\n if (!this.video || rate === Infinity) {\n return\n }\n this.video.playbackRate = rate\n }\n\n /**\n * @type { TimeRanges | null}\n */\n get played () {\n return this.video ? this.video.played : null\n }\n\n /**\n * @type { boolean }\n */\n get preload () {\n return this.video ? this.video.preload : false\n }\n\n set preload (isTrue) {\n this.video && (this.video.preload = isTrue)\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 | 4 }\n * @description 回视频的就绪状态\n */\n get readyState () {\n return this.video.readyState\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否可以seek\n */\n get seekable () {\n return this.video ? this.video.seekable : false\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否处于seeking状态下\n */\n get seeking () {\n return this.video ? this.video.seeking : false\n }\n\n /**\n * @type { any }\n * @description 设置/返回当前视频的地址\n */\n get src () {\n return this.video ? this.video.src : ''\n }\n\n set src (url) {\n if (!this.video) {\n return\n }\n this.emit(URL_CHANGE, url)\n this.emit(WAITING)\n // this.video.pause()\n this._currentTime = 0\n this._duration = 0\n // Some firefox versions firefox Cannot recognize currentSrc of type Blob\n if (/^blob/.test(this.video.currentSrc) || /^blob/.test(this.video.src)) { // has transmuxer core\n this.onWaiting()\n return\n }\n this._detachSourceEvents(this.video)\n if (Util.typeOf(url) === 'Array') {\n this._attachSourceEvents(this.video, url)\n } else {\n this.video.src = url\n }\n this.load()\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频的音量\n */\n get volume () {\n return this.video ? this.video.volume : 0\n }\n\n set volume (vol) {\n if (vol === Infinity || !this.video) {\n return\n }\n this.video.volume = vol\n }\n\n addInnerOP (event) {\n this._internalOp[event] = true\n }\n\n removeInnerOP (event) {\n delete this._internalOp[event]\n }\n /** ******************* 以下api只有申明作用,具体实现依赖EventEmitter ******************/\n\n /**\n *\n * @param { string } event\n * @param { any } [data]\n * @returns\n */\n emit (event, data, ...args) {\n super.emit(event, data, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (data?: any) => any } callback\n * @returns\n */\n on (event, callback, ...args) {\n super.on(event, callback, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (data?: any) => any } callback\n * @returns\n */\n once (event, callback, ...args) {\n super.once(event, callback, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (data?: any) => any } callback\n * @returns\n */\n off (event, callback, ...args) {\n super.off(event, callback, ...args)\n }\n\n offAll () {\n super.removeAllListeners()\n }\n}\n\nexport default VideoProxy\n","class INDEXDB {\n constructor (mydb = { name: 'xgplayer', version: 1, db: null, ojstore: { name: 'xg-m4a', keypath: 'vid' } }) {\n this.indexedDB = window.indexedDB || window.webkitindexedDB\n this.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange // 键范围\n this.myDB = mydb\n }\n\n openDB (callback) {\n // 建立或打开数据库,建立对象存储空间(ObjectStore)\n const self = this\n const version = this.myDB.version || 1\n const request = self.indexedDB.open(self.myDB.name, version)\n request.onerror = function (e) {\n // console.log('e.currentTarget.error.message')\n }\n request.onsuccess = e => {\n this.myDB.db = e.target.result\n // console.log('成功建立并打开数据库:' + this.myDB.name + ' version' + this.myDB.version)\n callback.call(self)\n }\n request.onupgradeneeded = e => {\n const db = e.target.result\n // eslint-disable-next-line no-unused-vars\n const transaction = e.target.transaction\n // eslint-disable-next-line no-unused-vars\n let store\n if (!db.objectStoreNames.contains(self.myDB.ojstore.name)) {\n // 没有该对象空间时创建该对象空间\n // eslint-disable-next-line no-unused-vars\n store = db.createObjectStore(self.myDB.ojstore.name, { keyPath: self.myDB.ojstore.keypath })\n // console.log('成功建立对象存储空间:' + this.myDB.ojstore.name)\n }\n }\n }\n\n deletedb () {\n // 删除数据库\n const self = this\n self.indexedDB.deleteDatabase(this.myDB.name)\n // console.log(this.myDB.name + '数据库已删除')\n }\n\n closeDB () {\n // 关闭数据库\n this.myDB.db.close()\n // console.log('数据库已关闭')\n }\n\n addData (storename, data) {\n // 添加数据,重复添加会报错\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.add(data[i])\n request.onerror = function () {\n // console.error('add添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('add添加数据已存入数据库')\n }\n }\n }\n\n putData (storename, data) {\n // 添加数据,重复添加会更新原有数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.put(data[i])\n request.onerror = function () {\n // console.error('put添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('put添加数据已存入数据库')\n }\n }\n }\n\n getDataByKey (storename, key, callback) {\n const self = this\n // 根据存储空间的键找到对应数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n const request = store.get(key)\n request.onerror = function () {\n // console.error('getDataByKey error')\n callback.call(self, null)\n }\n request.onsuccess = function (e) {\n const result = e.target.result\n // console.log('查找数据成功')\n callback.call(self, result)\n }\n }\n\n deleteData (storename, key) {\n // 删除某一条记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.delete(key)\n // console.log('已删除存储空间' + storename + '中' + key + '记录')\n }\n\n clearData (storename) {\n // 删除存储空间全部记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.clear()\n // console.log('已删除存储空间' + storename + '全部记录')\n }\n}\n\nexport default INDEXDB\n","export const FULLSCREEN_EVENTS = ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange']\n\nexport const GET_FULLSCREEN_API = ['requestFullscreen', 'webkitRequestFullscreen', 'mozRequestFullScreen', 'msRequestFullscreen']\n\nexport const EXIT_FULLSCREEN_API = ['exitFullscreen', 'webkitExitFullscreen', 'mozCancelFullScreen', 'msExitFullscreen']\n","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 __hooks[hookName] = null\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\n/**\n * hook decorator, add hooks props for for an instance\n * @param { any } instance\n * @param { Array } [hookNames]\n */\nfunction hooksDescriptor (instance, presetHooks = []) {\n instance.__hooks = {}\n presetHooks && presetHooks.map(item => {\n instance.__hooks[item] = null\n })\n Object.defineProperty(instance, 'hooks', {\n get: () => {\n return instance.__hooks && Object.keys(instance.__hooks).map(key => {\n if (instance.__hooks[key]) {\n return key\n }\n })\n }\n })\n}\n\nfunction delHooksDescriptor (instance) {\n instance.__hooks = null\n}\n\nfunction runHooks (obj, hookName, handler, ...args) {\n if (obj.__hooks && obj.__hooks[hookName]) {\n const ret = obj.__hooks[hookName].call(obj, obj, ...args)\n if (ret && ret.then) {\n ret.then((data) => {\n return data === false ? null : handler.call(obj, obj, ...args)\n }).catch(e => {\n console.warn(`[runHooks]${hookName} reject`, e.message)\n })\n } else if (ret !== false) {\n return handler.call(obj, obj, ...args)\n }\n } else {\n return handler.call(obj, obj, ...args)\n }\n}\n\nexport {\n hooksDescriptor as default,\n hook,\n useHooks,\n usePluginHooks,\n 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, delHooksDescriptor } from '../plugin/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 Object.defineProperty(Obj, key, map[key])\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 = {}\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 }\n\n /**\n * 更新语言\n * @param { string } lang\n */\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n }\n\n /**\n * @type { string }\n */\n get lang () {\n return this.player.lang\n }\n\n get i18n () {\n return this.player.i18n\n }\n\n get i18nKeys () {\n return this.player.i18nKeys\n }\n\n /**\n * @description当前支持的事件类型\n * @type { 'touch' | 'mouse' }\n */\n get domEventType () {\n let _e = Util.checkTouchSupport() ? 'touch' : 'mouse'\n if (this.playerConfig && (this.playerConfig.domEventType === 'touch' || this.playerConfig.domEventType === 'mouse')) {\n _e = this.playerConfig.domEventType\n }\n return _e\n }\n\n /**\n *\n * @param { string | Array } event\n * @param { Function } callback\n * @returns\n */\n on (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.on(event, callback)')\n return\n }\n if (typeof event === 'string') {\n this.__events[event] = callback\n this.player.on(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n this.__events[item] = callback\n this.player.on(item, callback)\n })\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } callback\n * @returns\n */\n once (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.once(event, callback)')\n return\n }\n this.player.once(event, callback)\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 Object.keys(this.__events).map(item => {\n this.__events[item] && this.off(item, this.__events[item])\n item && delete this.__events[item]\n })\n this.__events = {}\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 const nParams = {\n ...params,\n pluginName: this.pluginName\n }\n this.player.emitUserAction(event, action, nParams)\n }\n\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n useHooks (hookName, handler, ...args) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n * 注册子插件\n * @param { any } plugin\n * @param { any } [options]\n * @param { string } [name]\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name = '') {\n if (!this.player) {\n return\n }\n name && (options.pluginName = name)\n return this.player.registerPlugin({ plugin, options })\n }\n\n /**\n *\n * @param { string } name\n * @returns { any | null }\n */\n getPlugin (name) {\n return this.player ? this.player.getPlugin(name) : null\n }\n\n __destroy () {\n const player = this.player\n const pluginName = this.pluginName\n this.offAll()\n Util.clearAllTimers(this)\n if (Util.checkIsFunction(this.destroy)) {\n this.destroy()\n }\n\n ['player', 'playerConfig', 'pluginName', 'logger', '__args', '__hooks'].map(item => {\n this[item] = null\n })\n player.unRegisterPlugin(pluginName)\n delHooksDescriptor(this)\n }\n}\nexport {\n BasePlugin as default,\n Util,\n Sniffer,\n Errors,\n Events,\n XG_DEBUG\n}\n","var DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n","var closest = require('./closest');\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n","/**\n* an ui Plugin class\n*\n**/\nimport BasePlugin, { Util, XG_DEBUG } from './basePlugin'\nimport delegate from 'delegate'\n\nconst ROOT_TYPES = {\n CONTROLS: 'controls',\n ROOT: 'root'\n}\n\nconst POSITIONS = {\n ROOT: 'root',\n ROOT_LEFT: 'rootLeft',\n ROOT_RIGHT: 'rootRight',\n ROOT_TOP: 'rootTop',\n CONTROLS_LEFT: 'controlsLeft',\n CONTROLS_RIGTH: 'controlsRight',\n CONTROLS_RIGHT: 'controlsRight',\n CONTROLS_CENTER: 'controlsCenter',\n CONTROLS: 'controls'\n}\n\n/**\n * Check if the url is a link address\n * @param { string } str\n */\nfunction isUrl (str) {\n if (!str) {\n return false\n }\n return str.indexOf && /^(?:http|data:|\\/)/.test(str)\n}\n\nfunction mergeIconClass (icon, classname) {\n if (typeof icon === 'object' && icon.class && typeof icon.class === 'string') {\n return `${classname} ${icon.class}`\n }\n return classname\n}\n\nfunction mergeIconAttr (icon, attr) {\n if (typeof icon === 'object' && icon.attr && typeof icon.attr === 'object') {\n Object.keys(icon.attr).map(key => {\n attr[key] = icon.attr[key]\n })\n }\n return attr\n}\n\nfunction createIcon (icon, key, classname = '', attr = {}, pluginName = '') {\n let newIcon = null\n if (icon instanceof window.Element) {\n Util.addClass(icon, classname)\n Object.keys(attr).map(key => {\n icon.setAttribute(key, attr[key])\n })\n return icon\n }\n\n if (isUrl(icon) || isUrl(icon.url)) {\n attr.src = isUrl(icon) ? icon : (icon.url || '')\n newIcon = Util.createDom(icon.tag || 'img', '', attr, `xg-img ${classname}`)\n return newIcon\n }\n\n if (typeof icon === 'function') {\n try {\n newIcon = icon()\n if (newIcon instanceof window.Element) {\n Util.addClass(newIcon, classname)\n Object.keys(attr).map(key => {\n newIcon.setAttribute(key, attr[key])\n })\n return newIcon\n } else {\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is a function mast return an Element Object`)\n }\n return null\n } catch (e) {\n XG_DEBUG.logError(`Plugin named [${pluginName}]:createIcon`, e)\n return null\n }\n }\n\n if (typeof icon === 'string') {\n return Util.createDomFromHtml(icon, attr, classname)\n }\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is invalid`)\n return null\n}\n\nfunction registerIconsObj (iconsConfig, plugin) {\n const _icons = plugin.config.icons || plugin.playerConfig.icons\n Object.keys(iconsConfig).map(key => {\n const orgIcon = iconsConfig[key]\n let classname = orgIcon && orgIcon.class ? orgIcon.class : ''\n let attr = orgIcon && orgIcon.attr ? orgIcon.attr : {}\n let newIcon = null\n if (_icons && _icons[key]) {\n classname = mergeIconClass(_icons[key], classname)\n attr = mergeIconAttr(_icons[key], attr)\n newIcon = createIcon(_icons[key], key, classname, attr, plugin.pluginName)\n }\n if (!newIcon && orgIcon) {\n newIcon = createIcon((orgIcon.icon ? orgIcon.icon : orgIcon), attr, classname, {}, plugin.pluginName)\n }\n plugin.icons[key] = newIcon\n })\n}\n\nfunction registerTextObj (textConfig, plugin) {\n Object.keys(textConfig).map((key) => {\n Object.defineProperty(plugin.langText, key, {\n get: () => {\n const { lang, i18n } = plugin\n if (i18n[key]) {\n return i18n[key]\n } else {\n return textConfig[key] ? (textConfig[key][lang] || '') : ''\n }\n }\n })\n })\n}\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * root?: HTMLElement,\n * position?: string,\n * [propName: string]: any\n * }} IPluginOptions\n*/\nclass Plugin extends BasePlugin {\n /**\n * 插入dom结构\n * @param { String | HTMLElement } html html字符串或者dom\n * @param { HTMLElement } parent\n * @param { number } index\n * @returns { HTMLElement }\n */\n static insert (html, parent, index = 0) {\n const len = parent.children.length\n const insertIdx = Number(index)\n const isDomElement = html instanceof window.Node\n\n if (len) {\n let i = 0\n let coordinate = null\n let mode = ''\n for (;i < len; i++) {\n coordinate = parent.children[i]\n const curIdx = Number(coordinate.getAttribute('data-index'))\n if (curIdx >= insertIdx) {\n mode = 'beforebegin'\n break\n } else if (curIdx < insertIdx) {\n mode = 'afterend'\n }\n }\n\n if (isDomElement) {\n if (mode === 'afterend') {\n // as last element\n parent.appendChild(html)\n } else {\n parent.insertBefore(html, coordinate)\n }\n } else {\n coordinate.insertAdjacentHTML(mode, html)\n }\n return mode === 'afterend' ? parent.children[parent.children.length - 1] : parent.children[i]\n } else {\n isDomElement ? parent.appendChild(html) : parent.insertAdjacentHTML('beforeend', html)\n return parent.children[parent.children.length - 1]\n }\n }\n\n static get defaultConfig () {\n return {}\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { String } querySelector\n * @param { String | Array } eventType\n * @param { Function } callback\n * @param { boolean } [capture=false]\n * @returns\n */\n static delegate (root, querySelector, eventType, callback, capture = false) {\n const dels = []\n if (root instanceof window.Node && typeof callback === 'function') {\n if (Array.isArray(eventType)) {\n eventType.forEach((item) => {\n const ret = delegate(root, querySelector, item, callback, capture)\n ret.key = `${querySelector}_${item}`\n dels.push(ret)\n })\n } else {\n const ret = delegate(root, querySelector, eventType, callback, capture)\n ret.key = `${querySelector}_${eventType}`\n dels.push(ret)\n }\n }\n return dels\n }\n\n static get ROOT_TYPES () {\n return ROOT_TYPES\n }\n\n static get POSITIONS () {\n return POSITIONS\n }\n\n /**\n * @param { IPluginOptions } args\n */\n constructor (args = {}) {\n super(args)\n /**\n * @private\n */\n this.__delegates = []\n }\n\n /**\n * @private\n */\n __init (args) {\n super.__init(args)\n if (!args.root) {\n return\n }\n const _parent = args.root\n let _el = null\n /**\n * @readonly\n */\n this.icons = {}\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.root = null\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.parent = null\n\n const _orgicons = this.registerIcons() || {}\n registerIconsObj(_orgicons, this)\n /**\n * @readonly\n */\n this.langText = {}\n const defaultTexConfig = this.registerLanguageTexts() || {}\n registerTextObj(defaultTexConfig, this)\n let renderStr = ''\n try {\n renderStr = this.render()\n } catch (e) {\n XG_DEBUG.logError(`Plugin:${this.pluginName}:render`, e)\n throw (new Error(`Plugin:${this.pluginName}:render:${e.message}`))\n }\n if (renderStr) {\n _el = Plugin.insert(renderStr, _parent, args.index)\n _el.setAttribute('data-index', args.index)\n } else if (args.tag) {\n _el = Util.createDom(args.tag, '', args.attr, args.name)\n _el.setAttribute('data-index', args.index)\n _parent.appendChild(_el)\n } else {\n return\n }\n\n this.root = _el\n this.parent = _parent\n\n // Plugin.defineGetterOrSetter(this, {\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // root: {\n // get: () => {\n // return _el\n // },\n // configurable: true\n // },\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // parent: {\n // get: () => {\n // return _parent\n // },\n // configurable: true\n // }\n // })\n\n const attr = this.config.attr || {}\n const style = this.config.style || {}\n\n this.setAttr(attr)\n this.setStyle(style)\n if (this.config.index) {\n this.root.setAttribute('data-index', this.config.index)\n }\n this.__registerChildren()\n }\n\n /**\n * @private\n */\n __registerChildren () {\n if (!this.root) {\n return\n }\n /**\n * @private\n */\n this._children = []\n const children = this.children()\n if (children && typeof children === 'object') {\n if (Object.keys(children).length > 0) {\n Object.keys(children).map(item => {\n const name = item\n const _plugin = children[name]\n const options = {\n root: this.root\n }\n // eslint-disable-next-line no-unused-vars\n let config, Plugin\n if (typeof _plugin === 'function') {\n config = this.config[name] || {}\n Plugin = _plugin\n } else if (typeof _plugin === 'object' && typeof _plugin.plugin === 'function') {\n config = _plugin.options ? Util.deepCopy((this.config[name] || {}), _plugin.options) : (this.config[name] || {})\n Plugin = _plugin.plugin\n }\n options.config = config\n config.index !== undefined && (options.index = config.index)\n config.root && (options.root = config.root)\n this.registerPlugin(Plugin, options, name)\n })\n }\n }\n }\n\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n function checkChildren (node, callback) {\n for (let i = 0; i < node.children.length; i++) {\n if (node.children[i].children.length > 0) {\n checkChildren(node.children[i], callback)\n } else {\n callback(node.children[i])\n }\n }\n }\n const { root, i18n, langText } = this\n if (root) {\n checkChildren(root, (node) => {\n const langKey = node.getAttribute && node.getAttribute('lang-key')\n if (!langKey) {\n return\n }\n const langTextShow = i18n[langKey.toUpperCase()] || langText[langKey]\n if (langTextShow) {\n node.innerHTML = typeof langTextShow === 'function' ? langTextShow(lang) : langTextShow\n }\n })\n }\n }\n\n get lang () {\n return this.player.lang\n }\n\n changeLangTextKey (dom, key = '') {\n const i18n = this.i18n || {}\n const langText = this.langText\n dom.setAttribute && dom.setAttribute('lang-key', key)\n const text = i18n[key] || langText[key] || ''\n if (text) {\n dom.innerHTML = text\n }\n }\n\n plugins () {\n return this._children\n }\n\n children () {\n return {}\n }\n\n registerPlugin (plugin, options = {}, name = '') {\n options.root = options.root || this.root\n const _c = super.registerPlugin(plugin, options, name)\n this._children.push(_c)\n return _c\n }\n\n registerIcons () {\n return {}\n }\n\n registerLanguageTexts () {\n return {}\n }\n\n /**\n *\n * @param { string } qs\n * @returns { HTMLElement | null }\n */\n find (qs) {\n if (!this.root) {\n return\n }\n return this.root.querySelector(qs)\n }\n\n /**\n * 绑定事件\n * @param { string | Array } querySelector\n * @param { string | Function } eventType\n * @param { Function } [callback]\n */\n bind (querySelector, eventType, callback) {\n if (arguments.length < 3 && typeof eventType === 'function') {\n if (Array.isArray(querySelector)) {\n querySelector.forEach((item) => {\n this.bindEL(item, eventType)\n })\n } else {\n this.bindEL(querySelector, eventType)\n }\n } else {\n const ret = Plugin.delegate.call(this, this.root, querySelector, eventType, callback)\n this.__delegates = this.__delegates.concat(ret)\n }\n }\n\n /**\n * 绑定事件\n * @param { string | Array } querySelector\n * @param { string | Function } eventType\n */\n unbind (querySelector, eventType) {\n if (arguments.length < 3 && typeof eventType === 'function') {\n if (Array.isArray(querySelector)) {\n querySelector.forEach((item) => {\n this.unbindEL(item, eventType)\n })\n } else {\n this.unbindEL(querySelector, eventType)\n }\n } else {\n const key = `${querySelector}_${eventType}`\n for (let i = 0; i < this.__delegates.length; i++) {\n if (this.__delegates[i].key === key) {\n this.__delegates[i].destroy()\n this.__delegates.splice(i, 1)\n break\n }\n }\n }\n }\n\n /**\n * 给插件设置样式\n * @param { string | {[propName: string]: any} } name\n * @param { ? | any } value\n * @returns\n */\n setStyle (name, value) {\n if (!this.root) {\n return\n }\n if (Util.typeOf(name) === 'String') {\n return (this.root.style[name] = value)\n } else if (Util.typeOf(name) === 'Object') {\n Object.keys(name).map(key => {\n this.root.style[key] = name[key]\n })\n }\n }\n\n /**\n * 给插件根节点设置属性\n * @param { string | {[propName: string]: any} } name\n * @param { ? | any } value\n * @returns\n */\n setAttr (name, value) {\n if (!this.root) {\n return\n }\n if (Util.typeOf(name) === 'String') {\n return this.root.setAttribute(name, value)\n } else if (Util.typeOf(name) === 'Object') {\n Object.keys(name).map(key => {\n this.root.setAttribute(key, name[key])\n })\n }\n }\n\n /**\n *\n * @param { string } htmlStr\n * @param { Function } [callback]\n * @returns\n */\n setHtml (htmlStr, callback) {\n if (!this.root) {\n return\n }\n this.root.innerHTML = htmlStr\n if (typeof callback === 'function') {\n callback()\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } eventHandle\n * @param { boolean } [isBubble=false]\n * @returns\n */\n bindEL (event, eventHandle, isBubble = false) {\n if (!this.root) {\n return\n }\n if (`on${event}` in this.root && typeof eventHandle === 'function') {\n this.root.addEventListener(event, eventHandle, isBubble)\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } eventHandle\n * @param { boolean } [isBubble]\n * @returns\n */\n unbindEL (event, eventHandle, isBubble = false) {\n if (!this.root) {\n return\n }\n if (`on${event}` in this.root && typeof eventHandle === 'function') {\n this.root.removeEventListener(event, eventHandle, isBubble)\n }\n }\n\n /**\n *\n * @param { string } [value]\n * @returns\n */\n show (value) {\n if (!this.root) {\n return\n }\n this.root.style.display = value !== undefined ? value : 'block'\n const cs = window.getComputedStyle(this.root, null)\n const cssDisplayValue = cs.getPropertyValue('display')\n if (cssDisplayValue === 'none') {\n return (this.root.style.display = 'block')\n }\n }\n\n hide () {\n this.root && (this.root.style.display = 'none')\n }\n\n /**\n *\n * @param { string | HTMLElement } pdom\n * @param { HTMLElement} child\n * @returns { HTMLElement | null }\n */\n appendChild (pdom, child) {\n if (!this.root) {\n return null\n }\n if (arguments.length < 2 && arguments[0] instanceof window.Element) {\n return this.root.appendChild(arguments[0])\n }\n if (!child || !(child instanceof window.Element)) {\n return null\n }\n try {\n if (typeof pdom === 'string') {\n return this.find(pdom).appendChild(child)\n } else {\n return pdom.appendChild(child)\n }\n } catch (err) {\n XG_DEBUG.logError('Plugin:appendChild', err)\n return null\n }\n }\n\n /**\n *\n * @returns { string | HTMLElement }\n */\n render () {\n return ''\n }\n\n destroy () {}\n\n __destroy () {\n const { player } = this\n this.__delegates.map(item => {\n item.destroy()\n })\n this.__delegates = []\n // destroy the sub-plugin instance\n if (this._children instanceof Array) {\n this._children.map(item => {\n player.unRegisterPlugin(item.pluginName)\n })\n this._children = null\n }\n if (this.root) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.root.hasOwnProperty('remove')) {\n this.root.remove()\n } else if (this.root.parentNode) {\n this.root.parentNode.removeChild(this.root)\n }\n }\n\n super.__destroy()\n this.icons = {};\n ['root', 'parent'].map(item => {\n this[item] = null\n })\n }\n}\n\nexport {\n Plugin as default,\n ROOT_TYPES,\n POSITIONS\n}\n","class 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((entries) => {\n const t = new Date().getTime()\n if (t - this.timeStamp < 100) {\n return\n }\n this.timeStamp = t\n this.__trigger(entries)\n })\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 { __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 })\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 for (let i = 0; i < entries.length; i++) {\n const ret = this.__runHandler(entries[i].target)\n if (ret) {\n break\n }\n }\n }\n}\n\nlet resizeObserver = null\n\nfunction addObserver (target, handler) {\n if (!resizeObserver) {\n resizeObserver = new 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 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 if (!this.pluginGroup) {\n this.pluginGroup = {}\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 }\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 /**\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 let cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup || !this.pluginGroup[cgid]) {\n this.init(player)\n cgid = player._pluginInfoId\n }\n if (!this.pluginGroup[cgid]._plugins) {\n this.pluginGroup[cgid]._plugins = []\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const originalOptions = this.pluginGroup[cgid]._originalOptions\n options.player = this.pluginGroup[cgid]._player\n\n const pluginName = options.pluginName || plugin.pluginName\n if (!pluginName) {\n throw new Error('The property pluginName is necessary')\n }\n\n if (plugin.isSupported && !plugin.isSupported()) {\n console.warn(`not supported plugin [${pluginName}]`)\n return\n }\n\n if (!options.config) {\n options.config = {}\n }\n\n // get config items from player.config\n const keys = Object.keys(originalOptions)\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n const config = originalOptions[keys[i]]\n if (Util.typeOf(config) === 'Object') {\n options.config = Object.assign({}, options.config, originalOptions[keys[i]])\n } else if (Util.typeOf(config) === 'Boolean') {\n options.config.disable = !config\n }\n break\n }\n }\n\n // copy the default configuration items of the plugin\n if (plugin.defaultConfig) {\n Object.keys(plugin.defaultConfig).map(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 && this.pluginGroup[cgid] && this.pluginGroup[cgid]._plugins) {\n const _plugins = this.pluginGroup[cgid]._plugins\n delete _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 (!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 for (const item of Object.keys(plugins)) {\n if (plugins[item] && plugins[item].beforePlayerInit) {\n try {\n const ret = plugins[item].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 (!this.pluginGroup || !cgid) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n for (const item of Object.keys(plugins)) {\n if (plugins[item] && plugins[item].afterPlayerInit) {\n plugins[item].afterPlayerInit()\n }\n }\n },\n\n setLang (lang, player) {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup || !cgid) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).map(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 if (!cgid) {\n return\n }\n const pluginsMap = {}\n const plugins = this.pluginGroup[cgid]._plugins\n for (const item of Object.keys(plugins)) {\n pluginsMap[item] = {\n plugin: plugins[item].func,\n options: plugins[item]._args\n }\n this.unRegister(cgid, item)\n }\n for (const item of Object.keys(pluginsMap)) {\n this.register(cgid, item, pluginsMap[item].plugin, pluginsMap[item].options)\n }\n },\n\n onPluginsReady (player) {\n const cgid = player._pluginInfoId\n const plugins = this.pluginGroup[cgid]._plugins\n if (!cgid || !plugins) {\n return\n }\n Object.keys(plugins).map(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 || !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 break\n }\n }\n this.pluginGroup[playerId]._player.isUserActive = isActive\n return playerId\n },\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | null }\n */\n getCurrentUseActiveId () {\n if (!this.pluginGroup) {\n return\n }\n const keys = Object.keys(this.pluginGroup)\n for (let i = 0; i < keys.length; i++) {\n const c = this.pluginGroup[keys[i]]\n if (c && c._player && c._player.isUserActive) {\n return keys[i]\n }\n }\n return null\n },\n\n destroy (player) {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n return\n }\n unObserver(player.root)\n const plugins = this.pluginGroup[cgid]._plugins\n for (const item of Object.keys(plugins)) {\n this.unRegister(cgid, item)\n }\n\n const _isUseActive = player.isUseActive\n delete this.pluginGroup[cgid]\n delete player._pluginInfoId\n\n if (_isUseActive) {\n const keys = Object.keys(this.pluginGroup)\n if (keys.length > 0) {\n this.setCurrentUserActive(keys[keys.length - 1], true)\n }\n }\n }\n}\n\nexport default pluginsManager\n","export default {\n DEFAULT: 'xgplayer',\n DEFAULT_SKIN: 'xgplayer-skin-default',\n ENTER: 'xgplayer-is-enter',\n PAUSED: 'xgplayer-pause',\n PLAYING: 'xgplayer-playing',\n ENDED: 'xgplayer-ended',\n CANPLAY: 'xgplayer-canplay',\n LOADING: 'xgplayer-isloading',\n ERROR: 'xgplayer-is-error',\n REPLAY: 'xgplayer-replay',\n NO_START: 'xgplayer-nostart',\n ACTIVE: 'xgplayer-active',\n INACTIVE: 'xgplayer-inactive',\n FULLSCREEN: 'xgplayer-is-fullscreen',\n CSS_FULLSCREEN: 'xgplayer-is-cssfullscreen',\n ROTATE_FULLSCREEN: 'xgplayer-rotate-fullscreen',\n PARENT_ROTATE_FULLSCREEN: 'xgplayer-rotate-parent',\n PARENT_FULLSCREEN: 'xgplayer-fullscreen-parent',\n INNER_FULLSCREEN: 'xgplayer-fullscreen-inner',\n NO_CONTROLS: 'no-controls',\n FLEX_CONTROLS: 'flex-controls',\n CONTROLS_FOLLOW: 'controls-follow',\n CONTROLS_AUTOHIDE: 'controls-autohide',\n TOP_BAR_AUTOHIDE: 'top-bar-autohide',\n NOT_ALLOW_AUTOPLAY: 'not-allow-autoplay',\n SEEKING: 'seeking',\n PC: 'xgplayer-pc',\n MOBILE: 'xgplayer-mobile',\n MINI: 'xgplayer-mini' // mini screen play status\n}\n","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 player.config.i18n.push(...i18n)\n}\n","export const STATES = {\n ERROR: 0,\n INITIAL: 1,\n READY: 2,\n ATTACHING: 3,\n ATTACHED: 4,\n NOTALLOW: 5,\n RUNNING: 6,\n ENDED: 7,\n DESTROYED: 8\n}\n\nexport const STATE_ARRAY = [\n 'ERROR',\n 'INITIAL',\n 'READY',\n 'ATTACHING',\n 'ATTACHED',\n 'NOTALLOW',\n 'RUNNING',\n 'ENDED',\n 'DESTROYED'\n]\n","import Plugin, { Events, Util, POSITIONS, Sniffer, STATE_CLASS } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * disable?: boolean,\n * autoHide?: boolean,\n * mode?: \"flex\"|\"normal\"|\"bottom\",\n * initShow?: boolean,\n * [propName: string]: any\n * }} IControlsConfig\n */\n\nclass Controls extends Plugin {\n static get pluginName () {\n return 'controls'\n }\n\n /**\n * @type IControlsConfig\n */\n static get defaultConfig () {\n return {\n disable: false,\n autoHide: true, // Whether to hide automatically\n mode: '', // Display mode, flex/normal/bottom\n initShow: false // Display when player is initialized\n }\n }\n\n beforeCreate (args) {\n if (!args.config.mode && Sniffer.device === 'mobile') {\n args.config.mode = 'flex'\n }\n if (args.player.config.marginControls) {\n args.config.autoHide = false\n }\n }\n\n afterCreate () {\n const { disable, height, mode } = this.config\n if (disable) {\n return\n }\n\n mode === 'flex' && this.player.addClass(STATE_CLASS.FLEX_CONTROLS)\n const style = {\n height: `${height}px`\n }\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.left = this.find('xg-left-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.center = this.find('xg-center-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.right = this.find('xg-right-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.innerRoot = this.find('xg-inner-controls')\n\n // The progress bar is switched synchronously when switching to the small window state\n this.on(Events.MINI_STATE_CHANGE, (isMini) => {\n isMini ? Util.addClass(this.root, 'mini-controls') : Util.removeClass(this.root, 'mini-controls')\n })\n if (Sniffer.device !== 'mobile') {\n this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseleave', this.onMouseLeave)\n }\n }\n\n onMouseEnter = (e) => {\n const { player } = this\n if (player.userTimer) {\n Util.clearTimeout(player, player.userTimer)\n clearTimeout(player.userTimer)\n }\n }\n\n onMouseLeave = () => {\n const { player } = this\n player.focus()\n }\n\n focus () {\n this.player.focus({ autoHide: false })\n }\n\n focusAwhile () {\n this.player.focus({ autoHide: true })\n }\n\n blur () {\n this.player.blur({ ignorePaused: true })\n }\n\n recoverAutoHide () {\n // this.config.autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n this.config.autoHide && Util.addClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n pauseAutoHide () {\n // Util.removeClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n Util.removeClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n show () {\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n /**\n * @type {string}\n */\n get mode () {\n return this.config.mode\n }\n\n /**\n *\n * @param {} plugin\n * @param { {config?: {[propName: string]: any}, position?:string, root?: HTMLElement, pluginName?: string}} options\n * @param { string } name\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name) {\n if (!this.root) {\n return\n }\n const defaultConfig = plugin.defaultConfig || {}\n if (!options.root) {\n const position = options.position ? options.position : options.config && options.config.position ? options.config.position : defaultConfig.position\n switch (position) {\n case POSITIONS.CONTROLS_LEFT:\n options.root = this.left\n break\n case POSITIONS.CONTROLS_RIGHT:\n options.root = this.right\n break\n case POSITIONS.CONTROLS_CENTER:\n options.root = this.center\n break\n case POSITIONS.CONTROLS:\n options.root = this.root\n break\n default:\n options.root = this.left\n }\n return super.registerPlugin(plugin, options, name)\n }\n }\n\n destroy () {\n if (Sniffer.device !== 'mobile') {\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mouseleave', this.onMouseLeave)\n }\n }\n\n render () {\n const { mode, autoHide, initShow, disable } = this.config\n if (disable) {\n return\n }\n\n // autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n const className = Util.classNames(\n { 'xgplayer-controls': true },\n { 'flex-controls': mode === 'flex' },\n { 'bottom-controls': mode === 'bottom' },\n { [STATE_CLASS.CONTROLS_AUTOHIDE]: autoHide },\n { 'xgplayer-controls-initshow': initShow || !autoHide })\n return `\n \n \n \n \n \n \n \n `\n }\n}\n\nexport default Controls\n","import Util from '../utils/util'\nimport EN from './en'\n/**\n * @typedef { {\n * LANG: string,\n * TEXT: {\n * [propName: string]: string\n * }\n * } } IXGI18nText\n */\n\nconst XGI18nLang = {}\nconst XGI18nTextKeys = {}\nconst XGI18nLangKeys = []\nconst XGI18nLangPreExtends = {}\n\nfunction updateKeys () {\n Object.keys(XGI18nLang.en).map(key => {\n XGI18nTextKeys[key] = key // key.toLowerCase()\n })\n}\n\n/**\n * @param { Array } XGI18nTexts\n */\nfunction extend (XGI18nText) {\n let ext = []\n if (Util.typeOf(XGI18nText) !== 'Array') {\n ext = Object.keys(XGI18nText).map(lang => {\n const keyLang = lang === 'zh' ? 'zh-cn' : lang\n return {\n LANG: keyLang,\n TEXT: XGI18nText[lang]\n }\n })\n } else {\n ext = XGI18nText\n }\n ext.map(item => {\n if (!XGI18nLang[item.LANG]) {\n XGI18nLangPreExtends[item.LANG] = item.TEXT\n } else {\n Util.deepMerge(XGI18nLang[item.LANG] || {}, item.TEXT || {})\n }\n })\n updateKeys()\n}\n\n/**\n * @param { IXGI18nText } langData\n */\nfunction use (langData) {\n const lang = langData.LANG\n const texts = langData.TEXT || {}\n if (!XGI18nLang[lang]) {\n XGI18nLangKeys.push(lang)\n }\n if (XGI18nLang[lang]) {\n Util.deepMerge(texts, XGI18nLang[lang])\n } else {\n XGI18nLang[lang] = texts\n }\n if (XGI18nLangPreExtends[lang]) {\n extend([{ LANG: lang, TEXT: XGI18nLangPreExtends[lang] }])\n delete XGI18nLangPreExtends[lang]\n }\n if (lang === 'zh-cn') {\n XGI18nLang.zh = XGI18nLang['zh-cn']\n }\n updateKeys()\n}\n\nuse(EN)\n\nconst I18N = {\n get textKeys () {\n return XGI18nTextKeys\n },\n /**\n * @description List of languages currently supported\n * @type { Array }\n */\n get langKeys () {\n return XGI18nLangKeys\n },\n /**\n * @type {{\n * [propName: string]: {\n * [propName: string]: string\n * }\n * }}\n */\n get lang () {\n const ret = {}\n XGI18nLangKeys.map(key => {\n ret[key] = XGI18nLang[key]\n })\n ret.zh = XGI18nLang['zh-cn']\n return ret\n },\n /**\n * @type {(I18nText: IXGI18nText) => {}}\n */\n extend: extend,\n\n /**\n * @type {(lang: IXGI18nText) => {}}\n */\n use: use\n}\n\nexport default I18N\n","export default {\n LANG: 'en',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: 'video download error'\n },\n mse: {\n code: 2,\n msg: 'stream append error'\n },\n parse: {\n code: 3,\n msg: 'parsing error'\n },\n format: {\n code: 4,\n msg: 'wrong format'\n },\n decoder: {\n code: 5,\n msg: 'decoding error'\n },\n runtime: {\n code: 6,\n msg: 'grammatical errors'\n },\n timeout: {\n code: 7,\n msg: 'play timeout'\n },\n other: {\n code: 8,\n msg: 'other errors'\n }\n },\n HAVE_NOTHING: 'There is no information on whether audio/video is ready',\n HAVE_METADATA: 'Audio/video metadata is ready ',\n HAVE_CURRENT_DATA: 'Data about the current play location is available, but there is not enough data to play the next frame/millisecond',\n HAVE_FUTURE_DATA: 'Current and at least one frame of data is available',\n HAVE_ENOUGH_DATA: 'The available data is sufficient to start playing',\n NETWORK_EMPTY: 'Audio/video has not been initialized',\n NETWORK_IDLE: 'Audio/video is active and has been selected for resources, but no network is used',\n NETWORK_LOADING: 'The browser is downloading the data',\n NETWORK_NO_SOURCE: 'No audio/video source was found',\n MEDIA_ERR_ABORTED: 'The fetch process is aborted by the user',\n MEDIA_ERR_NETWORK: 'An error occurred while downloading',\n MEDIA_ERR_DECODE: 'An error occurred while decoding',\n MEDIA_ERR_SRC_NOT_SUPPORTED: 'Audio/video is not supported',\n REPLAY: 'Replay',\n ERROR: 'Network is offline',\n PLAY_TIPS: 'Play',\n PAUSE_TIPS: 'Pause',\n PLAYNEXT_TIPS: 'Play next',\n DOWNLOAD_TIPS: 'Download',\n ROTATE_TIPS: 'Rotate',\n RELOAD_TIPS: 'Reload',\n FULLSCREEN_TIPS: 'Fullscreen',\n EXITFULLSCREEN_TIPS: 'Exit fullscreen',\n CSSFULLSCREEN_TIPS: 'Cssfullscreen',\n EXITCSSFULLSCREEN_TIPS: 'Exit cssfullscreen',\n TEXTTRACK: 'Caption',\n PIP: 'PIP',\n SCREENSHOT: 'Screenshot',\n LIVE: 'LIVE',\n OFF: 'Off',\n OPEN: 'Open',\n MINI_DRAG: 'Click and hold to drag',\n MINISCREEN: 'Miniscreen',\n REFRESH_TIPS: 'Please Try',\n REFRESH: 'Refresh',\n FORWARD: 'forward',\n LIVE_TIP: 'Live'\n }\n}\n","import VideoProxy from './proxy'\nimport Util 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 } from './constant'\nimport Plugin 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, delHooksDescriptor, usePluginHooks, hook } from './plugin/hooksDescriptor'\nimport Controls from './plugins/controls/index'\nimport XG_DEBUG, { bindDebug } from './utils/debug'\nimport I18N from './lang/i18n'\nimport version from './version'\nimport { STATES, STATE_ARRAY } from './state'\n\n/**\n * @typedef { import ('./defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/* eslint-disable camelcase */\nconst PlAYER_HOOKS = ['play', 'pause', 'replay', 'retry']\nclass Player extends VideoProxy {\n /**\n * @type {number}\n * @description set debugger level\n * 1 - only print error logs\n * 2 - print warn logs and error logs\n * 3 - print all debug logs and error stack logs\n */\n static set debugger (value) {\n XG_DEBUG.config.debug = value\n }\n\n static get debugger () {\n return XG_DEBUG.config.debug\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | string | null }\n */\n static getCurrentUserActivePlayerId () {\n return pluginsManager.getCurrentUseActiveId()\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n */\n static setCurrentUserActive (playerId, isActive) {\n pluginsManager.setCurrentUserActive(playerId, isActive)\n }\n\n /**\n * @param { IPlayerOptions } options\n */\n constructor (options) {\n const config = Util.deepMerge(getDefaultConfig(), options)\n super(config)\n hooksDescriptor(this, PlAYER_HOOKS)\n\n /**\n * @type { IPlayerOptions }\n * @description 当前播放器的配置信息\n */\n this.config = config\n bindDebug(this)\n // resolve default preset\n const defaultPreset = this.constructor.defaultPreset\n if (this.config.presets.length) {\n const defaultIdx = this.config.presets.indexOf('default')\n if (defaultIdx >= 0 && defaultPreset) {\n this.config.presets[defaultIdx] = defaultPreset\n }\n } else if (defaultPreset) {\n this.config.presets.push(defaultPreset)\n }\n\n // timer and flags\n this.userTimer = null\n /**\n * @private\n */\n this.waitTimer = null\n\n /**\n * @private\n */\n this._state = STATES.INITIAL\n\n /**\n * @private\n */\n this._hasStart = false\n /**\n * Whether the player is in the seeking state\n * @type { boolean }\n * @readonly\n */\n this.isSeeking = false\n\n /**\n * @type { boolean }\n * @readonly\n */\n this.isCanplay = false\n /**\n * @private\n * @readonly\n */\n this._runPending = false\n /**\n * @type { number }\n */\n this.rotateDeg = 0\n /**\n * Whether the player is focus\n * @type { boolean }\n * @readonly\n */\n this.isActive = false\n\n /**\n * Whether player is currently in fullscreen\n * @type { boolean }\n * @readonly\n */\n this.fullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.cssfullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.isRotateFullscreen = false\n\n /**\n * fullscreenElement\n * @type { HTMLElement | null }\n * @readonly\n */\n this._fullscreenEl = null\n\n /**\n * cssfullscreen target Element\n * @type { HTMLElement | null }\n * @readonly\n */\n this._cssfullscreenEl = null\n\n /**\n * @type { IDefinition | null }\n * @readonly\n */\n this.curDefinition = null\n /**\n * @private\n * @type { string }\n */\n this._orgCss = ''\n /**\n * @readonly\n * @type { number }\n */\n this._fullScreenOffset = null\n /**\n * @private\n * @type { number }\n */\n this._videoHeight = 0\n /**\n * @private\n * @type { number }\n */\n this._videoWidth = 0\n\n /**\n * @private\n * @type { { t: number, acc:number, acc: number, loopAcc: number, [propName: string]: any;} }\n */\n this._accPlayed = {\n t: 0,\n acc: 0,\n loopAcc: 0\n }\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 控制栏和video不同布局的时候内部容器\n */\n this.innerContainer = null\n\n /**\n * @type { null | Object }\n * @readonly\n * @description 控制栏插件\n */\n this.controls = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n */\n this.topBar = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 当前播放器根节点\n */\n this.root = null\n\n // android 6以下不支持自动播放\n if (Sniffer.os.isAndroid && Sniffer.osVersion > 0 && Sniffer.osVersion < 6) {\n this.config.autoplay = false\n }\n\n /**\n * @readonly\n * @type {any}\n */\n this.database = new Database()\n\n /**\n * @readonly\n * @type { boolean }\n */\n this.isUserActive = false\n\n const rootInit = this._initDOM()\n if (!rootInit) {\n console.error(new Error(`can't find the dom which id is ${this.config.id} or this.config.el does not exist`))\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(e => e.definition && e.definition === definition.defaultDefinition)\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.definition\n }\n\n this._bindEvents()\n this._registerPresets()\n this._registerPlugins()\n pluginsManager.onPluginsReady(this)\n\n this.setState(STATES.READY)\n this.emit(Events.READY)\n this.onReady && this.onReady()\n\n if (this.config.videoInit || this.config.autoplay) {\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n this.start()\n }\n }\n }\n\n /**\n * init control domElement\n * @private\n */\n _initDOM () {\n this.root = this.config.id ? document.getElementById(this.config.id) : null\n if (!this.root) {\n const el = this.config.el\n if (el && el.nodeType === 1) {\n this.root = el\n } else {\n this.emit(Events.ERROR, new Errors('use', this.config.vid, {\n line: 32,\n handle: 'Constructor',\n msg: 'container id can\\'t be empty'\n }))\n console.error('this.confg.id or this.config.el can\\'t be empty')\n return false\n }\n }\n const ret = pluginsManager.checkPlayerRoot(this.root)\n if (ret) {\n XG_DEBUG.logWarn('The is an Player instance already exists in this.root, destroy it and reinitialize')\n ret.destroy()\n }\n this._initBaseDoms()\n\n // 允许自定义video对象的构造\n const XgVideoProxy = this.constructor.XgVideoProxy\n if (XgVideoProxy && this.videoConfig.mediaType === XgVideoProxy.mediaType) {\n const el = this.innerContainer || this.root\n this.detachVideoEvents(this.video)\n const _nVideo = new XgVideoProxy(el, this.config, this.videoConfig)\n this.attachVideoEvents(_nVideo)\n this.video = _nVideo\n }\n if (this.config.controls) {\n const controls = pluginsManager.register(this, Controls)\n this.controls = controls\n }\n const device = this.config.isMobileSimulateMode ? 'mobile' : Sniffer.device\n this.addClass(`${STATE_CLASS.DEFAULT} ${STATE_CLASS.INACTIVE} xgplayer-${device} ${this.config.controls ? '' : STATE_CLASS.NO_CONTROLS}`)\n if (this.config.autoplay) {\n this.addClass(STATE_CLASS.ENTER)\n } else {\n this.addClass(STATE_CLASS.NO_START)\n }\n if (this.config.fluid) {\n let { width, height } = this.config\n if (typeof width !== 'number' || typeof height !== 'number') {\n width = 600\n height = 337.5\n }\n const style = {\n width: '100%',\n height: '0',\n 'max-width': '100%',\n 'padding-top': `${height * 100 / width}%`\n // position: 'relative',\n // top: '0',\n // left: '0'\n }\n Object.keys(style).forEach(key => {\n this.root.style[key] = style[key]\n })\n } else {\n ['width', 'height'].forEach(key => {\n if (this.config[key]) {\n if (typeof this.config[key] !== 'number') {\n this.root.style[key] = this.config[key]\n } else {\n this.root.style[key] = `${this.config[key]}px`\n }\n }\n })\n }\n return true\n }\n\n /**\n * @private\n */\n _initBaseDoms () {\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.topBar = Util.createDom('xg-bar', '', { 'data-index': -1 }, 'xg-top-bar')\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.leftBar = Util.createDom('xg-bar', '', { 'data-index': -1 }, 'xg-left-bar')\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.rightBar = Util.createDom('xg-bar', '', { 'data-index': -1 }, 'xg-right-bar')\n if (this.config.marginControls) {\n this.innerContainer = Util.createDom('xg-video-container', '', { 'data-index': -1 }, 'xg-video-container')\n this.root.appendChild(this.innerContainer)\n }\n\n if (this.config.topBarAutoHide) {\n Util.addClass(this.topBar, STATE_CLASS.TOP_BAR_AUTOHIDE)\n }\n\n this.root.appendChild(this.topBar)\n this.root.appendChild(this.leftBar)\n this.root.appendChild(this.rightBar)\n }\n\n /**\n * @private\n */\n _bindEvents () {\n ['focus', 'blur'].forEach(item => {\n this.on(item, this['on' + item.charAt(0).toUpperCase() + item.slice(1)])\n })\n\n /**\n * @private\n */\n this.onFullscreenChange = (event, isFullScreen) => {\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 if (isFullScreen || (fullEl && (fullEl === this._fullscreenEl || fullEl.tagName === 'VIDEO'))) {\n Util.setTimeout(this, () => {\n this.resize()\n }, 100)\n !this.config.closeFocusVideoFocus && this.video.focus()\n this.fullscreen = true\n // this.addClass(STATE_CLASS.FULLSCREEN)\n this.changeFullStyle(this.root, fullEl, STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, true, this._fullScreenOffset)\n if (this.cssfullscreen) {\n this.exitCssFullscreen()\n }\n } else if (this.fullscreen) {\n Util.setTimeout(this, () => {\n this.resize()\n }, 100)\n const { _fullScreenOffset, config } = this\n if (config.needFullscreenScroll) {\n // 保证页面scroll的情况下退出全屏 页面回到原位置\n window.scrollTo(_fullScreenOffset.left, _fullScreenOffset.top)\n Util.setTimeout(this, () => {\n this.fullscreen = false\n this._fullScreenOffset = null\n }, 100)\n } else {\n // 保证页面scroll的情况下退出全屏 页面定位在播放器位置\n !this.config.closeFocusVideoFocus && this.video.focus()\n this.fullscreen = false\n this._fullScreenOffset = null\n }\n if (!this.cssfullscreen) {\n this.recoverFullStyle(this.root, this._fullscreenEl, STATE_CLASS.FULLSCREEN)\n } else {\n this.removeClass(STATE_CLASS.FULLSCREEN)\n }\n this._fullscreenEl = null\n // this.removeClass(STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n }\n }\n\n FULLSCREEN_EVENTS.forEach(item => {\n document && document.addEventListener(item, this.onFullscreenChange)\n })\n /**\n * @private\n */\n this.__webkitbeginfullscreen = (e) => {\n this._fullscreenEl = this.video\n this.onFullscreenChange(e, true)\n }\n /**\n * @private\n */\n this.__webkitendfullscreen = (e) => {\n this.onFullscreenChange(e, false)\n }\n if (Sniffer.os.isIos) {\n this.video.addEventListener('webkitbeginfullscreen', this.__webkitbeginfullscreen)\n this.video.addEventListener('webkitendfullscreen', this.__webkitendfullscreen)\n }\n\n this.once(Events.LOADED_DATA, this.resize)\n\n this.playFunc = () => {\n if (!this.config.closeFocusVideoFocus) {\n this.video.focus()\n }\n }\n this.once(Events.PLAY, this.playFunc)\n }\n\n /**\n * @private\n */\n _unbindEvents () {\n this.root.removeEventListener('mousemove', this.mousemoveFunc)\n FULLSCREEN_EVENTS.forEach(item => {\n document.removeEventListener(item, this.onFullscreenChange)\n })\n this.playFunc && this.off(Events.PLAY, this.playFunc)\n this.canPlayFunc && this.off(Events.CANPLAY, this.canPlayFunc)\n this.video.removeEventListener('webkitbeginfullscreen', this.__webkitbeginfullscreen)\n this.video.removeEventListener('webkitendfullscreen', this.__webkitendfullscreen)\n }\n\n /**\n *\n * @param { any } url\n * @returns\n */\n _startInit (url) {\n if (!this.video) {\n return\n }\n if (!url || url === '' || (Util.typeOf(url) === 'Array' && url.length === 0)) {\n url = ''\n this.emit(Events.URL_NULL)\n XG_DEBUG.logWarn('config.url is null, please get url and run player._startInit(url)')\n if (this.config.nullUrlStart) {\n return\n }\n }\n this.canPlayFunc = () => {\n if (!this.config) {\n return\n }\n const { autoplay, startTime, defaultPlaybackRate } = this.config\n\n XG_DEBUG.logInfo('player', 'canPlayFunc', startTime)\n if (startTime) {\n this.currentTime = startTime > this.duration ? this.duration : startTime\n this.config.startTime = 0 // 仅仅使用一次\n }\n\n // 确保能生效\n if (defaultPlaybackRate !== 1) {\n this.playbackRate = defaultPlaybackRate\n }\n\n autoplay && this.videoPlay()\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.removeClass(STATE_CLASS.ENTER)\n }\n this._detachSourceEvents(this.video)\n if (Util.typeOf(url) === 'Array') {\n this._attachSourceEvents(this.video, url)\n } else {\n this.video.src = url\n }\n\n if (Util.typeOf(this.config.volume) === 'Number') {\n this.volume = this.config.volume\n }\n\n this.loadeddataFunc && this.once(Events.LOADED_DATA, this.loadeddataFunc)\n const _root = this.innerContainer ? this.innerContainer : this.root\n if (this.video instanceof window.Element && !_root.contains(this.video)) {\n _root.insertBefore(this.video, _root.firstChild)\n }\n\n const { readyState } = this.video\n XG_DEBUG.logInfo('_startInit readyState', readyState)\n if (this.config.autoplay) {\n !(/^blob/.test(this.video.currentSrc) || /^blob/.test(this.video.src)) && this.load();\n // ios端无法自动播放的场景下,不调用play不会触发canplay loadeddata等事件\n (Sniffer.os.isIpad || Sniffer.os.isPhone) && this.videoPlay()\n }\n\n if (readyState >= 2) {\n this.canPlayFunc()\n } else {\n this.once(Events.CANPLAY, this.canPlayFunc)\n }\n\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n pluginsManager.afterInit(this)\n }\n this.hasStart = true\n this.setState(STATES.ATTACHED)\n Util.setTimeout(this, () => {\n this.emit(Events.COMPLETE)\n }, 0)\n }\n\n /**\n * 注册组件 组件列表config.plugins\n * @private\n */\n _registerPlugins () {\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 i18n.forEach(item => {\n I18N.use(item)\n })\n const ignoresStr = ignores.join('||').toLowerCase().split('||')\n plugins.forEach(plugin => {\n try {\n const pluginName = plugin.plugin ? plugin.plugin.pluginName : plugin.pluginName\n // 在ignores中的不做组装\n if (pluginName && ignoresStr.indexOf(pluginName.toLowerCase()) > -1) {\n return\n }\n if (plugin.lazy && plugin.loader) {\n const loadingPlugin = pluginsManager.lazyRegister(this, plugin)\n if (plugin.forceBeforeInit) {\n loadingPlugin.then(() => {\n this._loadingPlugins.splice(this._loadingPlugins.indexOf(loadingPlugin), 1)\n }).catch((e) => {\n XG_DEBUG.logError('_registerPlugins:loadingPlugin', e)\n this._loadingPlugins.splice(this._loadingPlugins.indexOf(loadingPlugin), 1)\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 *\n * @param { {plugin: function, options:object} | function } plugin\n * @param { {[propName: string]: any;} } [config]\n * @returns { any } plugin\n */\n registerPlugin (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 // 获取配置的position或者root\n const keys = Object.keys(this.config)\n for (let i = 0; i < keys.length; i++) {\n if (PLUFGIN.pluginName.toLowerCase() === keys[i].toLowerCase()) {\n const _pConfig = this.config[keys[i]]\n if (Util.typeOf(_pConfig) === 'Object') {\n _pConfig.root && (options.root = _pConfig.root)\n _pConfig.position && (options.position = _pConfig.position)\n }\n break\n }\n }\n\n const position = options.position ? options.position : (options.config && options.config.position) || (PLUFGIN.defaultConfig && PLUFGIN.defaultConfig.position)\n const { POSITIONS } = Plugin\n if (!options.root && typeof position === 'string' && position.indexOf('controls') > -1) {\n return this.controls && this.controls.registerPlugin(PLUFGIN, options, PLUFGIN.pluginName)\n }\n if (!options.root) {\n switch (position) {\n case POSITIONS.ROOT_RIGHT:\n options.root = this.rightBar\n break\n case POSITIONS.ROOT_LEFT:\n options.root = this.leftBar\n break\n case POSITIONS.ROOT_TOP:\n options.root = this.topBar\n break\n default:\n options.root = this.innerContainer || this.root\n break\n }\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 */\n unRegisterPlugin (plugin) {\n this.deregister(plugin)\n }\n\n /**\n * 当前播放器挂载的插件实例列表\n * @type { {[propName: string]: any | null } }\n */\n get plugins () {\n return pluginsManager.getPlugins(this)\n }\n\n /**\n * get a plugin instance\n * @param { string } pluginName\n * @return { null | any } plugin\n */\n getPlugin (pluginName) {\n const plugin = pluginsManager.findPlugin(this, pluginName)\n return plugin && plugin.pluginName ? plugin : null\n }\n\n /**\n *\n * @param { string } className\n */\n addClass (className) {\n if (!this.root) {\n return\n }\n if (!Util.hasClass(this.root, className)) {\n Util.addClass(this.root, className)\n }\n }\n\n /**\n *\n * @param { string } className\n * @returns\n */\n removeClass (className) {\n if (!this.root) {\n return\n }\n Util.removeClass(this.root, className)\n }\n\n /**\n *\n * @param { string } className\n * @returns { boolean } has\n */\n hasClass (className) {\n if (!this.root) {\n return\n }\n return Util.hasClass(this.root, className)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n setAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.setAttribute(key, value)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n removeAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.removeAttribute(key, value)\n }\n\n /**\n *\n * @param { any } url\n * @returns { Promise | void }\n * @description 启动播放器,start一般都是播放器内部隐式调用,主要功能是将video添加到DOM\n */\n start (url) {\n // 已经开始初始化播放了 则直接调用play\n if (this.hasStart || this.state >= STATES.ATTACHING) {\n return Promise.resolve()\n }\n this.hasStart = true\n this.setState(STATES.ATTACHING)\n\n return pluginsManager.beforeInit(this).then(() => {\n // this.config为空即已经销毁,不再执行后面的异步流程\n if (!this.config) {\n return\n }\n if (!url) {\n url = this.url || this.config.url\n }\n const ret = this._startInit(url)\n return ret\n }).catch((e) => {\n e.fileName = 'player'\n e.lineNumber = '236'\n XG_DEBUG.logError('start:beforeInit:', e)\n throw e\n })\n }\n\n /**\n * @param { string | object } url\n * @param { boolean } seamless\n * @returns { Promise | null } 执行结果\n */\n switchURL (url, seamless = false) {\n let _src = url\n if (Util.typeOf(url) === 'Object') {\n _src = url.url\n }\n const curTime = this.currentTime\n const isPaused = this.paused\n this.src = _src\n return new Promise((resolve) => {\n const _canplay = () => {\n this.currentTime = curTime\n if (isPaused) {\n this.once('canplay', () => {\n this.pause()\n })\n }\n resolve()\n }\n if (Sniffer.os.isAndroid) {\n this.once('timeupdate', () => {\n _canplay()\n })\n } else {\n this.once('canplay', () => {\n _canplay()\n })\n }\n this.play()\n })\n }\n\n load () {\n this.video && this.video.load()\n }\n\n videoPlay () {\n if (!this.hasStart && this.state < STATES.ATTACHED) {\n this.removeClass(STATE_CLASS.NO_START)\n this.addClass(STATE_CLASS.ENTER)\n const ret = this.start()\n ret && ret.then(resolve => {\n !this.config.autoplay && this.videoPlay()\n })\n return\n }\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n !this.isCanplay && this.addClass(STATE_CLASS.ENTER)\n }\n const playPromise = super.play()\n if (playPromise !== undefined && playPromise && playPromise.then) {\n playPromise.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 }).catch((e) => {\n XG_DEBUG.logWarn('>>>>playPromise.catch', e.name)\n if (this.video && this.video.error) {\n this.onError()\n // this.errorHandler('error')\n this.removeClass(STATE_CLASS.ENTER)\n this.setState(STATES.ERROR)\n return\n }\n // 避免AUTOPLAY_PREVENTED先于playing和play触发\n if (e.name === 'NotAllowedError') {\n /**\n * @private\n */\n this._errorTimer = Util.setTimeout(this, () => {\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 }, 0)\n }\n })\n } else {\n XG_DEBUG.logWarn('video.play not return promise')\n if (this.state < STATES.RUNNING) {\n this.setState(STATES.RUNNING)\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.addClass(STATE_CLASS.PLAYING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n }\n return playPromise\n }\n\n videoPause () {\n super.pause()\n }\n\n play () {\n this.removeClass(STATE_CLASS.PAUSED)\n runHooks(this, 'play', () => {\n this.videoPlay()\n })\n }\n\n pause () {\n runHooks(this, 'pause', () => {\n super.pause()\n })\n }\n\n /**\n *\n * @param { number } time\n * @param { 'play' | 'pause' | 'auto' } [status]\n * @returns\n */\n seek (time, status) {\n if (!this.video || isNaN(Number(time))) {\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 this.once(Events.CANPLAY, () => {\n this.removeClass(STATE_CLASS.ENTER)\n this.isSeeking = false\n switch (_status) {\n case 'play':\n this.play()\n break\n case 'pause':\n this.pause()\n break\n default:\n !this.paused && this.play()\n }\n })\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n this.addClass(STATE_CLASS.ENTER)\n this.currentTime = time\n _status === 'play' && this.play()\n } else {\n this.currentTime = time\n }\n }\n\n /**\n * @typedef { {\n * url: any,\n * definition: any,\n * [propName: string]: any\n * } } definition\n */\n /**\n * @description change the definition of the current playback\n * @param { definition } to\n * @param { definition } [from]\n */\n changeDefinition (to, from) {\n this.emit(Events.DEFINITION_CHANGE, { from, to })\n this.curDefinition = to.definition\n if (!this.hasStart) {\n this.config.url = to.url\n return\n }\n const ret = this.switchURL(to.url)\n if (ret && ret.then) {\n ret.then(() => {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n })\n } else {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n }\n }\n\n reload () {\n this.load()\n /**\n * @private\n */\n this.reloadFunc = function () {\n this.play()\n }\n this.once(Events.LOADED_DATA, this.reloadFunc)\n }\n\n resetState () {\n const { NOT_ALLOW_AUTOPLAY, PLAYING, NO_START, PAUSED, REPLAY, ENTER, ENDED, ERROR, LOADING } = STATE_CLASS\n const clsList = [NOT_ALLOW_AUTOPLAY, PLAYING, NO_START, PAUSED, REPLAY, ENTER, ENDED, ERROR, LOADING]\n this.hasStart = false\n this.videoPause()\n this._accPlayed.acc = 0\n this._accPlayed.t = 0\n this._accPlayed.loopAcc = 0\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n this.addClass(STATE_CLASS.ENTER)\n this.emit(Events.EMPTIED)\n }\n\n /**\n * @description destroy the player instance\n * @returns\n */\n destroy () {\n const { innerContainer, root, video } = this\n if (!root || !video) {\n return\n }\n this._hasStart = false\n this.updateAcc('destroy')\n this._unbindEvents()\n this._detachSourceEvents(this.video)\n Util.clearAllTimers(this)\n this.emit(Events.DESTROY)\n pluginsManager.destroy(this)\n delHooksDescriptor(this)\n super.destroy()\n // 退出全屏\n if (this.fullscreen && this._fullscreenEl === this.root) {\n this.exitFullscreen()\n }\n\n if (innerContainer) {\n const _c = innerContainer.children\n for (let i = 0; i < _c.length; i++) {\n innerContainer.removeChild(_c[i])\n }\n }\n !innerContainer && video instanceof window.Node && root.contains(video) && root.removeChild(video);\n ['topBar', 'leftBar', 'rightBar', 'innerContainer'].map(item => {\n this[item] && root.removeChild(this[item])\n this[item] = null\n })\n const cList = root.className.split(' ')\n if (cList.length > 0) {\n root.className = cList.filter(name => name.indexOf('xgplayer') < 0).join(' ')\n } else {\n root.className = ''\n }\n this.removeAttribute('data-xgfill');\n\n ['isSeeking', 'isCanplay', 'isActive', 'cssfullscreen', 'fullscreen'].forEach(key => {\n this[key] = false\n })\n }\n\n replay () {\n this.removeClass(STATE_CLASS.ENDED)\n this.currentTime = 0\n this.isSeeking = false\n runHooks(this, 'replay', () => {\n this.once(Events.CANPLAY, () => {\n const playPromise = this.videoPlay()\n if (playPromise && playPromise.catch) {\n playPromise.catch(err => {\n console.log(err)\n })\n }\n })\n this.play()\n this.emit(Events.REPLAY)\n this.onPlay()\n })\n }\n\n retry () {\n this.removeClass(STATE_CLASS.ERROR)\n this.addClass(STATE_CLASS.LOADING)\n runHooks(this, 'retry', () => {\n const cur = this.currentTime\n this.videoPause()\n this.src = this.config.url\n !this.config.isLive && (this.currentTime = cur)\n this.once(Events.CANPLAY, () => {\n this.videoPlay()\n })\n })\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n changeFullStyle (root, el, rootClass, pClassName) {\n if (!root) {\n return\n }\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (!this._orgCss) {\n this._orgCss = Util.filterStyleFromText(root)\n }\n Util.addClass(root, rootClass)\n if (el && el !== root && !this._orgPCss) {\n /**\n * @private\n */\n this._orgPCss = Util.filterStyleFromText(el)\n Util.addClass(el, pClassName)\n }\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 }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise }\n */\n getFullscreen (el = this.config.fullscreenTarget) {\n const { root, video } = this\n if (!el) {\n el = root\n }\n this._fullScreenOffset = {\n top: Util.scrollTop(),\n left: Util.scrollLeft()\n }\n\n this._fullscreenEl = el\n /**\n * @private\n */\n this._fullActionFrom = 'get'\n const fullEl = Util.getFullScreenEl()\n if (fullEl === this._fullscreenEl) {\n this.onFullscreenChange()\n return\n }\n try {\n for (let i = 0; i < GET_FULLSCREEN_API.length; i++) {\n const key = GET_FULLSCREEN_API[i]\n if (el[key]) {\n const ret = key === 'webkitRequestFullscreen' ? el.webkitRequestFullscreen(window.Element.ALLOW_KEYBOARD_INPUT) : el[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (video.fullscreenEnabled || video.webkitSupportsFullscreen) {\n video.webkitEnterFullscreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call getFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call getFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise }\n */\n exitFullscreen (el) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n }\n if (!this._fullscreenEl && !Util.getFullScreenEl()) {\n return\n }\n const { root, video } = this\n if (el) {\n el = root\n }\n this._fullActionFrom = 'exit'\n try {\n for (let i = 0; i < EXIT_FULLSCREEN_API.length; i++) {\n const key = EXIT_FULLSCREEN_API[i]\n if (document[key]) {\n const ret = document[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (video && video.webkitSupportsFullscreen) {\n video.webkitExitFullScreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call exitFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call exitFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n getCssFullscreen (el = this.config.fullscreenTarget) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n } else if (this.fullscreen) {\n this.exitFullscreen()\n }\n const _class = el ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}` : STATE_CLASS.CSS_FULLSCREEN\n this.changeFullStyle(this.root, el, _class)\n const { fullscreen = {} } = this.config\n let useCssFullscreen = fullscreen.useCssFullscreen === true || (typeof fullscreen.useCssFullscreen === 'function' && 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 ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}` : STATE_CLASS.CSS_FULLSCREEN\n if (!this.fullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n } else {\n const { fullscreen = {} } = this.config\n let useCssFullscreen = fullscreen.useCssFullscreen === true || (typeof fullscreen.useCssFullscreen === 'function' && fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n this.fullscreen = false\n this.emit(Events.FULLSCREEN_CHANGE, false)\n } else {\n this.removeClass(_class)\n }\n }\n this._cssfullscreenEl = null\n this.cssfullscreen = false\n this.emit(Events.CSS_FULLSCREEN_CHANGE, false)\n }\n\n /**\n * 进入旋转全屏\n * @param { HTMLElement } [el]\n */\n getRotateFullscreen (el) {\n if (this.cssfullscreen) {\n this.exitCssFullscreen(el)\n }\n const _class = el ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}` : STATE_CLASS.ROTATE_FULLSCREEN\n this._fullscreenEl = el || this.root\n this.changeFullStyle(this.root, el, _class, STATE_CLASS.PARENT_ROTATE_FULLSCREEN)\n this.isRotateFullscreen = true\n this.fullscreen = true\n this.setRotateDeg(90)\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n\n /**\n * 退出旋转全屏\n * @param { HTMLElement } [el]\n */\n exitRotateFullscreen (el) {\n const _class = this._fullscreenEl !== this.root ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}` : STATE_CLASS.ROTATE_FULLSCREEN\n this.recoverFullStyle(this.root, this._fullscreenEl, _class, STATE_CLASS.PARENT_ROTATE_FULLSCREEN)\n this.isRotateFullscreen = false\n this.fullscreen = false\n this.setRotateDeg(0)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n }\n\n setRotateDeg (deg) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.rotateDeg = 0\n } else {\n this.rotateDeg = deg\n }\n }\n\n /**\n * @description 播放器焦点状态,控制栏显示\n * @param { {\n * autoHide?: boolean, // 是否可以自动隐藏\n * delay?: number // 自动隐藏的延迟时间,ms, 不传默认使用3000ms\n * } } [data]\n */\n focus (data = { autoHide: !this.config.closePlayerBlur, delay: this.config.inactive }) {\n if (this.isActive) {\n this.onFocus(data)\n return\n }\n this.emit(Events.PLAYER_FOCUS, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @description 取消播放器当前焦点状态\n * @param { { ignorePaused?: boolean } } [data]\n */\n blur (data = { ignorePaused: false }) {\n if (!this.isActive) {\n this.onBlur(data)\n return\n }\n this.emit(Events.PLAYER_BLUR, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @protected\n * @param { { autoHide?: boolean, delay?: number} } [data]\n * @returns\n */\n onFocus ({ autoHide = !this.config.closePlayerBlur, delay = this.config.inactive } = {}) {\n this.isActive = true\n this.removeClass(STATE_CLASS.INACTIVE)\n if (this.userTimer) {\n Util.clearTimeout(this, this.userTimer)\n }\n if (!autoHide) {\n return\n }\n this.userTimer = Util.setTimeout(this, () => {\n this.blur()\n }, delay)\n }\n\n /**\n * @protected\n * @param {{ ignorePaused?: boolean }} [data]\n * @returns\n */\n onBlur ({ ignorePaused = false } = {}) {\n if (!this.isActive) {\n return\n }\n const { closePauseVideoFocus } = this.config\n this.isActive = false\n if (ignorePaused || closePauseVideoFocus || (!this.paused && !this.ended)) {\n this.addClass(STATE_CLASS.INACTIVE)\n }\n }\n\n onEmptied () {\n this.updateAcc('emptied')\n }\n\n /**\n * @protected\n */\n onCanplay () {\n this.state >= STATES.RUNNING && this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.LOADING)\n this.isCanplay = true\n this.waitTimer && Util.clearTimeout(this, this.waitTimer)\n }\n\n /**\n * @protected\n */\n onPlay () {\n if (this.state === STATES.ENDED || this.state === STATES.ERROR) {\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 }\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.updateAcc('error')\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.LOADING)\n this.addClass(STATE_CLASS.ERROR)\n }\n\n /**\n * @protected\n */\n onSeeking () {\n if (!this.isSeeking) {\n this.updateAcc('seeking')\n }\n this.isSeeking = true\n this.addClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onSeeked () {\n this.isSeeking = false\n // for ie,playing fired before waiting\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.removeClass(STATE_CLASS.LOADING)\n this.removeClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onWaiting () {\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.updateAcc('waiting')\n this.waitTimer = Util.setTimeout(this, () => {\n this.addClass(STATE_CLASS.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }, 200)\n }\n\n /**\n * @protected\n */\n onPlaying () {\n const { NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING } = STATE_CLASS\n const clsList = [NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING]\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n }\n\n /**\n * @protected\n */\n onTimeupdate () {\n !this._videoHeight && this.resize()\n if ((this.waitTimer || this.hasClass(STATE_CLASS.LOADING)) && this.video.readyState > 2) {\n this.removeClass(STATE_CLASS.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\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' && (this.config.volume = this.volume)\n }\n\n onRatechange () {\n this.config.defaultPlaybackRate = this.playbackRate\n }\n\n /**\n * 触发用户行为事件,第一个参数是Dom事件\n * @param { Event } event\n * @param { string } action\n * @param {[propName: string]: any; } [params]\n * @returns\n */\n emitUserAction (event, action, params) {\n if (!this.video || !action || !event) {\n return\n }\n const eventType = Util.typeOf(event) === 'String' ? event : (event.type || '')\n\n // if (action === 'switch_play_pause') {\n // Util.typeOf(params.paused) === 'Undefined' && (params.paused = this.paused)\n // params.isFirstStart = !this.playing\n // }\n\n if (params.props && Util.typeOf(params.props) !== 'Array') {\n params.props = [params.props]\n }\n this.emit(Events.USER_ACTION, {\n eventType,\n action,\n // pluginName: this.pluginName,\n currentTime: this.currentTime,\n duration: this.duration,\n ended: this.ended,\n event,\n ...params\n })\n }\n\n updateAcc (endType) {\n if (this._accPlayed.t) {\n const _at = new Date().getTime() - this._accPlayed.t\n this._accPlayed.acc += _at\n this._accPlayed.t = 0\n if (endType === 'ended' || this.ended) {\n this._accPlayed.loopAcc = this._accPlayed.acc\n }\n }\n }\n\n /**\n *\n * @param { number } time\n * @returns { boolean }\n */\n checkBuffer (time) {\n const buffered = this.video.buffered\n if (!buffered || buffered.length === 0 || !this.duration) {\n return true\n }\n const currentTime = time || this.video.currentTime || 0.2\n const len = buffered.length\n for (let i = 0; i < len; i++) {\n if (buffered.start(i) <= currentTime && buffered.end(i) > currentTime) {\n return true\n }\n }\n return false\n }\n\n /**\n * @description position video/audio according to height ratio and y coordinate\n * @param { { h: number, y?: number, x?:number, w?:number} } pos\n * @returns\n */\n position (pos = { h: 0, y: 0, x: 0, w: 0 }) {\n if (!this.video || !pos || !pos.h) {\n return\n }\n const rvH = 1 / pos.h\n let _transform = rvH !== 1 ? `scale(${rvH})` : ''\n let _tx = 0; let _ty = 0\n if (pos.y) {\n _ty = (100 - pos.h * 100) / 2 - pos.y * 100\n }\n if (pos.w && pos.x) {\n _tx = (100 - pos.w * 100) / 2 - pos.x * 100\n }\n _transform += ` translate(${_tx}%, ${_ty}%)`\n this.video.style.transform = _transform\n this.video.style.webkitTransform = _transform\n }\n\n /**\n * @description Update configuration parameters\n * @param { IPlayerOptions } config\n */\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).forEach(key => {\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 * @description play another video resource\n * @param { IPlayerOptions } config\n */\n playNext (config) {\n this.resetState()\n this.setConfig(config)\n this.play()\n this.emit(Events.PLAYNEXT, config)\n }\n\n resize () {\n if (!this.video) {\n return\n }\n const { videoWidth, videoHeight } = this.video\n const { fitVideoSize, videoFillMode } = this.config\n\n if (videoFillMode === 'fill' || videoFillMode === 'cover') {\n this.setAttribute('data-xgfill', videoFillMode)\n }\n\n if (!videoHeight || !videoWidth) {\n return\n }\n this._videoHeight = videoHeight\n this._videoWidth = videoWidth\n const containerSize = this.root.getBoundingClientRect()\n const controlsHeight = this.controls && this.innerContainer ? this.controls.root.getBoundingClientRect().height : 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 ((fitVideoSize === 'auto' && fit > videoFit) || fitVideoSize === 'fixWidth') {\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 ((fitVideoSize === 'auto' && fit < videoFit) || fitVideoSize === 'fixHeight') {\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 ((videoFillMode === 'fillHeight' && fit < videoFit) || (videoFillMode === 'fillWidth' && fit > videoFit)) {\n this.setAttribute('data-xgfill', 'cover')\n }\n const data = { videoScale: videoFit, vWidth: rWidth, vHeight: rHeight, cWidth: rWidth, cHeight: rHeight + controlsHeight }\n this.emit(Events.VIDEO_RESIZE, data)\n }\n\n /**\n *\n * @param { number } left\n * @param { number } top\n * @returns\n */\n updateObjectPosition (left = 0, top = 0) {\n if (this.video.updateObjectPosition) {\n this.video.updateObjectPosition(left, top)\n return\n }\n this.video.style.objectPosition = `${left * 100}% ${top * 100}%`\n }\n\n /**\n * @protected\n * @param { number } newState\n */\n setState (newState) {\n XG_DEBUG.logInfo('setState', `state from:${STATE_ARRAY[this.state]} to:${STATE_ARRAY[newState]}`)\n this._state = newState\n }\n\n /**\n * @type { number }\n */\n get state () {\n return this._state\n }\n\n /**\n * @type { boolean }\n */\n get isFullscreen () {\n return this.fullscreen\n }\n\n /**\n * @type { boolean }\n */\n get isCssfullScreen () {\n return this.cssfullscreen\n }\n\n /**\n * @type { boolean }\n * @description 是否开始播放\n */\n get hasStart () {\n return this._hasStart\n }\n\n set hasStart (bool) {\n if (typeof bool === 'boolean') {\n this._hasStart = bool\n if (bool === false) {\n this._state = 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 /**\n * @typedef { {\n * url: any,\n * definition: any,\n * text?: string,\n * text?: string | { [propName: string]: any },\n * iconText?: string | { [propName: string]: any }\n * } } IDefinition\n */\n\n /**\n * @type { Array }\n */\n set definitionList (list) {\n const { definition } = this.config\n definition.list = list\n this.emit('resourceReady', list)\n let curDef = null\n let targetDef = null\n list.forEach(item => {\n if (this.curDefinition === 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 ? this.changeDefinition(curDef) : (targetDef && this.changeDefinition(targetDef))\n }\n\n get definitionList () {\n return this.config.definition.list || []\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(`Sorry, set lang fail, because the language [${lang}] is not supported now, list of all supported languages is [${I18N.langKeys.join()}] `)\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 const { lang } = this.config\n return I18N.lang[lang] || I18N.lang.en\n }\n\n get i18nKeys () {\n return 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 ? this.plugins.poster.config.poster : this.config.poster\n }\n\n /**\n * @type { string }\n */\n get readyState () {\n const key = super.readyState\n return this.i18n[key] || key\n }\n\n get error () {\n const key = super.error\n return this.i18n[key] || key\n }\n\n get networkState () {\n const key = super.networkState\n return this.i18n[key] || key\n }\n\n /**\n * @type { boolean }\n */\n get fullscreenChanging () {\n return !(this._fullScreenOffset === null)\n }\n\n /**\n * 累计观看时长\n * @type number\n */\n get cumulateTime () {\n const { _accPlayed } = this\n this.updateAcc('get')\n return _accPlayed.acc\n }\n\n /**\n * @type { number }\n */\n get zoom () {\n return this.config.zoom\n }\n\n /**\n * @type { number }\n */\n set zoom (value) {\n this.config.zoom = value\n }\n\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns {boolean} isSuccess\n */\n useHooks (hookName, handler) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n usePluginHooks (pluginName, hookName, handler, ...args) {\n return usePluginHooks.call(this, ...arguments)\n }\n\n /**\n * 设置当前实例的用户激活态\n * @param {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 * @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","/**\n * @typedef { {\n * id?: string,\n * el?: HTMLElement,\n * url?: any,\n * domEventType?: 'default' | 'touch' | 'mouse',\n * nullUrlStart?: boolean,\n * width?: number | string,\n * height?: number | string,\n * fluid?: boolean,\n * fitVideoSize?: 'fixWidth'|'fixHeight'|'fixed',\n * videoFillMode?: 'auto'|'fillHeight'|'fillWidth'|'fill'|'cover',\n * volume?: number | { [propName: string]: any },\n * autoplay?: boolean,\n * autoplayMuted?: boolean,\n * loop?: boolean,\n * isLive?: boolean,\n * zoom?: number,\n * videoInit?: boolean,\n * poster?: string | { [propName: string]: any },\n * isMobileSimulateMode?: 'mobile' | 'pc',\n * defaultPlaybackRate?: number,\n * execBeforePluginsCall?: () => any,\n * allowSeekAfterEnded?: boolean,\n * enableContextmenu?: boolean,\n * closeVideoClick?: boolean,\n * closeVideoDblclick?: boolean,\n * closePlayerBlur?: boolean,\n * closeDelayBlur?: boolean,\n * leavePlayerTime?: number,\n * closePlayVideoFocus?: boolean,\n * closePauseVideoFocus?: boolean,\n * closeFocusVideoFocus?: boolean,\n * closeControlsBlur?: boolean,\n * topBarAutoHide?: boolean,\n * videoAttributes?: { [propName: string]: any },\n * startTime?: number,\n * seekedStatus?: 'play' | 'pause' | 'auto',\n * miniprogress?: boolean,\n * disableSwipeHandler?: () => any,\n * enableSwipeHandler?: () => any,\n * ignores?: Array<'cssfullscreen' | 'screenshot' | 'pip' | 'miniscreen' | 'keyboard' | 'download' | 'playbackrate' | 'time' | 'definition' | 'error' | 'fullscreen' | 'loading' | 'mobile' | 'pc' | 'play' | 'poster' | 'progress' | 'replay' | 'start' | 'volume' | string>,\n * inactive?: number,\n * lang?: string,\n * controls?: boolean | { [propName: string]: any },\n * marginControls?: boolean,\n * fullscreenTarget?: [HTMLElement], // 全屏作用的dom元素\n * screenShot?: boolean | { [propName: string]: any },\n * rotate?: boolean | { [propName: string]: any },\n * pip?: boolean | { [propName: string]: any },\n * download?: boolean | { [propName: string]: any },\n * mini?: boolean | { [propName: string]: any },\n * cssFullscreen?: boolean | { [propName: string]: any },\n * keyShortcut?: boolean,\n * presets?: any[],\n * plugins?: any[]\n * playbackRate?: number | Array | { [propName: string]: any },\n * definition?: { list: Array<{ url: any, definition: any, [propName: string]: any }> , defaultDefinition?: any, [propName: string]: any},\n * playsinline?: boolean,\n * customDuration?: number,\n * timeOffset?: number,\n * icons?: { [propName: string]: string | HTMLElement | () => HTMLElement | string },\n * i18n?: Array,\n * thumbnail?: {\n * urls: Array,\n * pic_num: number,\n * col: number,\n * row: number,\n * height?: number,\n * width?: number,\n * },\n * videoConfig?: { [propName: string]: any },\n * commonStyle?: {\n * progressColor?: string,\n * playedColor?: string,\n * cachedColor?: string,\n * sliderBtnStyle?: { [propName: string]: any },\n * volumeColor?: string\n * },\n * [propName: string]: any;\n * } } IPlayerOptions\n */\n\n/**\n *\n * @returns { IPlayerOptions }\n */\nexport default function getDefaultConfig () {\n return {\n id: '', // container DOM id\n el: null, // container domElement\n url: '', // the url need to play\n domEventType: 'default', // 事件类型,默认值default, touch | mouse\n nullUrlStart: false, // Whether to start broadcasting with empty url\n width: 600, // Width, unit px\n height: 337.5, // height, unit px\n fluid: false,\n fitVideoSize: 'fixed', // adaptation method of container width and height, fixWidth/fixHeight/fixed/auto\n videoFillMode: 'auto', // video screen fill mode, fillHeight/fillWidth/fill/auto/cover\n volume: 0.6, // default volume or config of plug-in volume\n autoplay: false,\n autoplayMuted: false, // whether to mute the start\n loop: false, // whether to loop\n isLive: false, // whether is live\n zoom: 1,\n videoInit: true, // whether to load the video/audio when initializing\n poster: '', // cover poster url or the configuration object for poster plugin\n isMobileSimulateMode: false, // simulation state, mobile/pc\n defaultPlaybackRate: 1, // default playback rate\n execBeforePluginsCall: null,\n allowSeekAfterEnded: true, // whether to allow seek after the playback ended\n enableContextmenu: false, // whether to allow the right-click function to be enabled\n closeVideoClick: false, // is to close the video’s click/touchend behavior to switch playback and pause\n closeVideoDblclick: false, // is to close the video`s double-click behavior to switch through full screen\n closePlayerBlur: false, // whether to close the behavior of calling player.blur() when the mouse moves out of the player area\n closeDelayBlur: false, // whether to close the automatic hide control bar behavior,only PC\n leavePlayerTime: 3000, // auto hide delay time when the mouse moves out of the player area\n closePlayVideoFocus: false, // whether to close the behavior of calling player.focus() in the play event callback\n closePauseVideoFocus: false, // whether to close the behavior of calling player.focus() in the pause event callback\n closeFocusVideoFocus: false, // whether to close the behavior of calling player.video.focus() when start play\n closeControlsBlur: false, // whether to close the behavior of calling player.focus() when the mouse moves out of the control bar area\n topBarAutoHide: true, // Whether to enable auto hide the top bar when player.blur()\n videoAttributes: {}, // video extended attributes\n startTime: 0, // auto play start time\n seekedStatus: 'play', // play state after seek ends play/pause/auto\n miniprogress: false, // whether to enable the mini progress bar\n disableSwipeHandler: () => {\n },\n enableSwipeHandler: () => {\n },\n ignores: [], // list of plug-in names to be disabled\n whitelist: [],\n inactive: 3000, // delay time for the control bar to disappear automatically\n lang: (document.documentElement.getAttribute('lang') || navigator.language || 'zh-cn').toLocaleLowerCase(),\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 controlsList: [],\n screenShot: false, // whether to enable the screenshot plug-in\n rotate: false, // whether to enable the rotate plug-in\n pip: false, // whether to enable the picture-in-picture plug-in\n download: false, // whether to enable the download plug-in\n mini: false, // whether to enable the mini-screen plug-in\n cssFullscreen: true, // whether to enable the web page full-screen plug-in\n keyShortcut: true, // whether to open the shortcut key\n presets: [],\n plugins: [],\n playbackRate: 1,\n definition: { list: [] },\n playsinline: true,\n customDuration: 0, // User-defined duration\n timeOffset: 0, // currentTime offset\n icons: {},\n i18n: [],\n thumbnail: null, // Preview image configuration\n 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","import BasePlugin, { Events, Util } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nfunction now () {\n return new Date().getTime()\n}\n\nexport default class Xglogger extends BasePlugin {\n static get pluginName () {\n return 'xgLogger'\n }\n\n static get defaultConfig () {\n return {}\n }\n\n afterCreate () {\n this._state = {\n autoplayStart: false,\n isFFLoading: false,\n isTimeUpdate: false\n }\n this._onReset()\n this._waitType = 'firstFrame'\n\n this.on(Events.LOAD_START, () => {\n const { autoplayStart } = this._state\n this._state.isTimeUpdate = false\n this._state.isFFLoading = true\n XG_DEBUG.logInfo('[xgLogger]Events.LOAD_START', autoplayStart)\n this.pt = now()\n this.vt = 0\n this.fvt = 0\n this.off(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.off(Events.TIME_UPDATE, this._onTimeupdate)\n this._onWaitingLoadStart()\n if (!autoplayStart) {\n this.once(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n } else {\n this.once(Events.TIME_UPDATE, this._onTimeupdate)\n }\n })\n\n this.on(Events.LOADED_DATA, () => {\n this.vt = now()\n this.fvt = this.vt - this.pt\n XG_DEBUG.logInfo('[xgLogger]Events.LOADED_DATA', this.fvt, this._state.isTimeUpdate)\n if (this._state.isTimeUpdate) {\n this._sendFirstFrame()\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 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.EMPTIED, () => {\n this.endState('emptied')\n this._onReset()\n })\n }\n\n _sendFirstFrame () {\n this.s = now()\n if (this.vt > 0 && this._state.isFFLoading) {\n XG_DEBUG.logInfo('[xgLogger]Events._sendFirstFrame', this.vt)\n this._state.isFFLoading = false\n this.emitLog('firstFrame', { fvt: this.fvt, costTime: this.fvt, vt: this.vt })\n }\n }\n\n _onTimeupdate = () => {\n XG_DEBUG.logInfo('[xgLogger]Events._onTimeupdate')\n this._state.isTimeUpdate = true\n this._sendFirstFrame()\n }\n\n _onAutoplayStart = () => {\n XG_DEBUG.logInfo('[xgLogger]Events._onAutoplayStart')\n this._state.autoplayStart = true\n this._sendFirstFrame()\n }\n\n _onReset = () => {\n this.vt = 0\n this.pt = 0\n this.fvt = 0\n this._isSeeking = false\n this.seekingStart = 0\n this.waitingStart = 0\n this._isWaiting = false\n this._waitTimer && Util.clearTimeout(this, this._waitTimer)\n this._waittTimer && Util.clearTimeout(this, this._waittTimer)\n this._waitTimer = null\n this._waittTimer = null\n this._waitType = 0 // 0 - 普通卡顿 1-起播卡顿 2-seek卡顿\n }\n\n _onSeeking = () => {\n if (this.seekingStart) {\n return\n }\n this.suspendWaitingStatus('seek')\n this.seekingStart = now()\n this.emitLog('seekStart', { start: now() })\n }\n\n _onSeeked = () => {\n this.suspendSeekingStatus('seeked')\n }\n\n _onWaitingLoadStart = () => {\n if (this._isWaiting || this.vt) {\n return\n }\n this._isWaiting = true\n this.waitingStart = now()\n this._waitType = 1\n this.emitLog('waitingStart', { start: this.waitingStart, type: 1, endType: 'loadstart' })\n }\n\n _onWaiting = () => {\n // 普通卡顿起播之前不产生\n if (this._isWaiting || !this.vt) {\n return\n }\n // 卡顿标记开始\n this._isWaiting = true\n this._waitTimer = Util.setTimeout(this, () => {\n if (this._isWaiting) {\n this.waitingStart = now()\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n if (!this.vt) {\n this._waitType = 1\n } else if (this.seekingStart) {\n this._waitType = 2\n } else {\n this._waitType = 0\n }\n this._startWaitTimeout()\n this.emitLog('waitingStart', { start: this.waitingStart, type: this._waitType, endType: this._waitType === 2 ? 'seek' : 'playing' })\n }\n }, 200)\n }\n\n _onError = () => {\n this.suspendSeekingStatus('error')\n this.suspendWaitingStatus('error')\n }\n\n _startWaitTimeout () {\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n }\n this._waittTimer = Util.setTimeout(this, () => {\n this.suspendWaitingStatus('timeout')\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }, 30000)\n }\n\n _onPlaying = () => {\n this._isWaiting && this.suspendWaitingStatus('playing')\n }\n\n endState (endType) {\n this.suspendWaitingStatus(endType)\n this.suspendSeekingStatus(endType)\n }\n\n suspendSeekingStatus (endType) {\n if (!this.seekingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.seekingStart\n this.seekingStart = 0\n this.emitLog('seekEnd', { end: _now, costTime: _cost, endType })\n }\n\n suspendWaitingStatus (endType) {\n if (this._waitTimer) {\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n }\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }\n this._isWaiting = false\n if (!this.waitingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.waitingStart\n this._isWaiting = false\n this.waitingStart = 0\n // switch (endType) {\n // case 'timeout':\n // break\n // case 'playing':\n // this._isWaiting = false\n // this.waitingStart = false\n // break\n // }\n this.emitLog('waitingEnd', { costTime: _cost, type: this._waitType, endType: this._waitType === 2 ? 'seek' : endType })\n }\n\n emitLog (eventType, data) {\n const { player } = this\n this.emit(Events.XGLOG, {\n t: now(),\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype,\n eventType,\n currentTime: this.player.currentTime,\n readyState: player.video.readyState,\n networkState: player.video.networkState,\n ...data\n })\n }\n}\n","import Plugin, { Events, Util } from '../../plugin'\nimport ReplaySvg from '../assets/replay.svg'\nimport './index.scss'\n\nclass Replay extends Plugin {\n static get pluginName () {\n return 'replay'\n }\n\n static get defaultConfig () {\n return {\n disable: false\n }\n }\n\n registerIcons () {\n return {\n replay: ReplaySvg\n }\n }\n\n afterCreate () {\n Plugin.insert(this.icons.replay, this.root, 0)\n this.__handleReplay = this.hook('replayClick', () => {\n this.player.replay()\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.bind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n // this.bind('svg', ['click', 'touchend'], this.__handleReplay)\n // this.bind('.xgplayer-replay-txt', ['click', 'touchend'], this.__handleReplay)\n\n this.on(Events.ENDED, () => {\n if (!this.playerConfig.loop) {\n Util.addClass(this.player.root, 'replay')\n }\n if (this.config.disable) {\n return\n }\n this.show()\n const path = this.root.querySelector('path')\n if (path) {\n const transform = window.getComputedStyle(path).getPropertyValue('transform')\n if (typeof transform === 'string' && transform.indexOf('none') > -1) {\n return null\n } else {\n path.setAttribute('transform', transform)\n }\n }\n })\n\n this.on(Events.PLAY, () => {\n this.hide()\n })\n }\n\n handleReplay (e) {\n e.preventDefault()\n e.stopPropagation()\n this.player.replay()\n Util.removeClass(this.player.root, 'replay')\n }\n\n show () {\n if (this.config.disable) {\n return\n }\n this.root.style.display = 'flex'\n }\n\n enable () {\n this.config.disable = false\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n this.unbind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n }\n\n render () {\n return `\n ${this.i18n.REPLAY}\n `\n }\n}\nexport default Replay\n","import Plugin, { Events, Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * isEndedShow?: boolean, // 是否在播放结束之后显示\n * hideCanplay?: boolean, // cnaplay 时间大于1的时候才隐藏\n * poster?: string // 封面图地址\n * }} IPosterConfig\n */\nclass Poster extends Plugin {\n static get pluginName () {\n return 'poster'\n }\n\n /**\n * @type IPosterConfig\n */\n static get defaultConfig () {\n return {\n isEndedShow: true, // 是否在播放结束之后显示\n hideCanplay: false, // cnaplay 时间大于1的时候才隐藏\n poster: '' // 封面图地址\n }\n }\n\n set isEndedShow (value) {\n this.config.isEndedShow = value\n }\n\n get isEndedShow () {\n return this.config.isEndedShow\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n show () {\n Util.removeClass(this.root, 'hide')\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.poster === 'string') {\n args.config.poster = args.player.config.poster\n }\n }\n\n afterCreate () {\n this.on(Events.ENDED, () => {\n if (this.isEndedShow) {\n Util.removeClass(this.root, 'hide')\n }\n })\n\n if (this.config.hideCanplay) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n this.on(Events.URL_CHANGE, () => {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'xg-showplay')\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n })\n } else {\n this.on(Events.PLAY, () => {\n Util.addClass(this.root, 'hide')\n })\n }\n }\n\n onTimeUpdate () {\n if (!this.player.currentTime) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n } else {\n Util.removeClass(this.root, 'xg-showplay')\n }\n }\n\n update (poster) {\n if (!poster) {\n return\n }\n this.config.poster = poster\n this.root.style.backgroundImage = `url(${poster})`\n }\n\n render () {\n const { poster, hideCanplay } = this.config\n const style = poster ? `background-image:url(${poster});` : ''\n return `\n `\n }\n}\n\nexport default Poster\n","import Plugin, { Util, Events, STATES } from '../../plugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * isShowPause?: boolean, // 暂停是否常驻\n * isShowEnd?: boolean, // 播放结束常驻\n * disableAnimate?: boolean, // 禁用点击动画\n * mode?: 'hide' | 'show' | 'auto' // 控制模式: hide 常驻: show 跟随:auto\n * [propName: string]: any\n * }} IStartConfig\n */\n\nconst AnimateMap = {}\nfunction addAnimate (key, seconds, callback = { start: null, end: null }) {\n if (AnimateMap[key]) {\n window.clearTimeout(AnimateMap[key].id)\n }\n AnimateMap[key] = {}\n callback.start && callback.start()\n AnimateMap[key].id = window.setTimeout(() => {\n callback.end && callback.end()\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n }, seconds)\n}\n\nfunction clearAnimation () {\n Object.keys(AnimateMap).map(key => {\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n })\n}\n\nclass Start extends Plugin {\n static get pluginName () {\n return 'start'\n }\n\n /**\n * @type IStartConfig\n */\n static get defaultConfig () {\n return {\n isShowPause: false, // 暂停是否常驻\n isShowEnd: false, // 播放结束常驻\n disableAnimate: false, // 禁用点击动画\n mode: 'hide' // 控制模式: hide 常驻: show 跟随:auto\n }\n }\n\n constructor (args) {\n super(args)\n this.autoPlayStart = false\n }\n\n afterCreate () {\n const { player, playerConfig } = this\n\n this.initIcons()\n this.once(Events.READY, () => {\n if (playerConfig) {\n if (playerConfig.lang && playerConfig.lang === 'en') {\n Util.addClass(player.root, 'lang-is-en')\n } else if (playerConfig.lang === 'jp') {\n Util.addClass(player.root, 'lang-is-jp')\n }\n }\n })\n\n this.on(Events.AUTOPLAY_STARTED, () => {\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 if (!playerConfig.autoplay) {\n this.show()\n }\n\n this.on(Events.AUTOPLAY_PREVENTED, () => {\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n })\n\n this.on(Events.PLAY, () => {\n this.onPlayPause('play')\n })\n\n this.on(Events.PAUSE, () => {\n this.onPlayPause('pause')\n })\n\n this.clickHandler = this.hook('startClick', this.switchPausePlay, {\n pre: (e) => {\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n const { paused } = this.player\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: paused, to: !paused })\n }\n })\n\n this.bind(['click', 'touchend'], this.clickHandler)\n }\n\n preventDefault (e) {\n\n }\n\n registerIcons () {\n return {\n startPlay: { icon: PlaySvg, class: 'xg-icon-play' },\n startPause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('xg-start-inner', icons.startPlay)\n this.appendChild('xg-start-inner', icons.startPause)\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n show () {\n Util.removeClass(this.root, 'hide')\n }\n\n focusHide () {\n Util.addClass(this.root, 'focus-hide')\n }\n\n recover () {\n Util.removeClass(this.root, 'focus-hide')\n }\n\n switchStatus (isAnimate) {\n if (isAnimate) {\n this.setAttr('data-state', !this.player.paused ? 'play' : 'pause')\n } else {\n this.setAttr('data-state', this.player.paused ? 'play' : 'pause')\n }\n }\n\n animate (endShow) {\n addAnimate('pauseplay', 400, {\n start: () => {\n Util.addClass(this.root, 'interact')\n this.show()\n this.switchStatus(true)\n },\n end: () => {\n Util.removeClass(this.root, 'interact')\n !endShow && this.hide()\n }\n })\n }\n\n switchPausePlay (e) {\n const { player } = this\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n if (player.state < STATES.READY) {\n return\n }\n const paused = this.player.paused\n if (!paused && player.state === STATES.RUNNING) {\n player.pause()\n } else {\n player.play()\n }\n }\n\n onPlayPause (status) {\n const { config, player } = this\n if (player.state < STATES.RUNNING || !this.autoPlayStart) {\n return\n }\n // 一直显示\n if (config.mode === 'show') {\n this.switchStatus()\n this.show()\n return\n }\n\n // 跟随播放器的focus状态显示和隐藏\n if (config.mode === 'auto') {\n this.switchStatus()\n return\n }\n // 暂停/播放结束状态强制显示\n if ((config.isShowPause && player.paused && !player.ended) || (config.isShowEnd && player.ended)) {\n this.switchStatus()\n this.show()\n return\n }\n\n if (config.disableAnimate) {\n this.switchStatus()\n this.hide()\n return\n }\n\n if (status === 'play') {\n this.autoPlayStart ? this.animate() : this.hide()\n } else {\n if (!this.autoPlayStart || player.ended) {\n return\n }\n this.animate()\n }\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.clickHandler)\n clearAnimation()\n }\n\n render () {\n const className = this.playerConfig.autoplay ? (this.config.mode === 'auto' ? 'auto-hide' : 'hide') : ''\n return `\n \n \n `\n }\n}\n\nexport default Start\n","import Plugin, { Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef { {\n * innerHtml?: string,\n * [propName: string]: any\n * } } IEnterConfig\n */\n\nclass Enter extends Plugin {\n static get pluginName () {\n return 'enter'\n }\n\n /**\n * @type IEnterConfig\n */\n static get defaultConfig () {\n return {\n innerHtml: '',\n logo: ''\n }\n }\n\n render () {\n const { innerHtml } = this.config\n const root = Util.createDom('xg-enter', '', {}, 'xgplayer-enter')\n\n if (innerHtml && innerHtml instanceof window.HTMLElement) {\n root.appendChild(innerHtml)\n } else if (innerHtml && typeof innerHtml === 'string') {\n root.innerHTML = innerHtml\n } else {\n let barStr = ''\n for (let i = 1; i <= 12; i++) {\n barStr += `
`\n }\n root.innerHTML = `
${barStr}
`\n }\n return root\n }\n}\n\nexport default Enter\n","import Plugin, { POSITIONS } from '../../plugin'\n\nclass MiniScreenIcon extends Plugin {\n static get pluginName () {\n return 'miniscreenIcon'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 10\n }\n }\n\n afterCreate () {\n this.getMini = this.getMini.bind(this)\n this.exitMini = this.exitMini.bind(this)\n this.bind('click', this.getMini)\n }\n\n getMini () {\n this.config.onClick && this.config.onClick()\n }\n\n exitMini () {\n this.config.onClick && this.config.onClick()\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.getMini)\n }\n\n render () {\n const langKey = 'MINISCREEN'\n return `\n \n
${this.i18n[langKey]}
\n
`\n }\n}\n\nexport default MiniScreenIcon\n","import EventEmitter from 'eventemitter3'\n\nfunction getStyleSize (value) {\n const num = parseFloat(value)\n // not a percent like '100%', and a number\n const isValid = value.indexOf('%') === -1 && !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] = !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 = isNaN(x) ? 0 : x\n this.position.y = isNaN(y) ? 0 : y\n\n this._addTransformPosition(style)\n }\n\n _addTransformPosition (style) {\n const transform = style.transform\n // bail out if value is 'none'\n if (transform.indexOf('matrix') !== 0) {\n return\n }\n // split matrix(1, 0, 0, 1, x, y)\n const matrixValues = transform.split(',')\n // translate X value is in 12th or 4th position\n const xIndex = transform.indexOf('matrix3d') === 0 ? 12 : 4\n const translateX = parseInt(matrixValues[xIndex], 10)\n // translate Y value is in 13th or 5th position\n const translateY = parseInt(matrixValues[xIndex + 1], 10)\n this.position.x += translateX\n this.position.y += translateY\n }\n\n _getPositionCoord (styleSide, measure) {\n if (styleSide.indexOf('%') !== -1) {\n // convert percent into pixel for Safari, #75\n const parentSize = getSize(this._root.parentNode)\n // prevent not-in-DOM element throwing bug, #131\n return !parentSize\n ? 0\n : (parseFloat(styleSide) / 100) * parentSize[measure]\n }\n return parseInt(styleSide, 10)\n }\n}\n","import Plugin, { Util, Events } from '../../plugin'\nimport PlayIcon from '../assets/play.svg'\nimport PauseIcon from '../assets/pause.svg'\nimport MiniScreenIcon from './miniScreenIcon'\nimport Draggabilly from '../../utils/draggabilly'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disable?: boolean,\n * width?: number,\n * height?: number,\n * left?: number, // 默认左下角\n * top?: number, // 默认左下角\n * isShowIcon?: boolean, // 是否显示icon\n * isScrollSwitch?: boolean, // 滚动自动切换自动切换\n * scrollTop?: number, // 触发滚动的高度\n * disableDrag?: boolean, // 禁用拖拽\n * [propName: string]: any\n * }} IMiniScreenConfig\n */\nclass MiniScreen extends Plugin {\n static get pluginName () {\n return 'miniscreen'\n }\n\n /**\n * @type IMiniScreenConfig\n */\n static get defaultConfig () {\n return {\n index: 10,\n disable: false,\n width: 320,\n height: 180,\n left: -1, // Default bottom left corner\n top: -1, // Default bottom left corner\n isShowIcon: false, // Whether to show icon\n isScrollSwitch: false,\n scrollTop: 0, // Height to trigger scroll\n disableDrag: false // Disable drag and drop\n }\n }\n\n constructor (args) {\n super(args)\n this.isMini = false\n this.isClose = false\n const { config } = this\n this.pos = {\n left: config.left < 0 ? window.innerWidth - config.width - 20 : config.left,\n top: config.top < 0 ? window.innerHeight - config.height - 20 : config.top,\n height: this.config.height,\n width: this.config.width,\n scrollY: window.scrollY || 0\n }\n this.lastStyle = null\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.mini === 'boolean') {\n args.config.isShowIcon = args.player.config.mini\n }\n }\n\n afterCreate () {\n this.initIcons()\n this.on(Events.PAUSE, () => {\n this.setAttr('data-state', 'pause')\n })\n this.on(Events.PLAY, () => {\n this.setAttr('data-state', 'play')\n })\n }\n\n onPluginsReady () {\n const { player, config } = this\n if (config.disable) {\n return\n }\n if (this.config.isShowIcon) {\n const options = {\n config: {\n onClick: () => {\n this.getMini()\n }\n }\n }\n player.controls.registerPlugin(MiniScreenIcon, options, MiniScreenIcon.pluginName)\n }\n const eventName = Util.checkTouchSupport() ? 'touchend' : 'click'\n this.bind('.mini-cancel-btn', eventName, this.onCancelClick)\n this.bind('.play-icon', eventName, this.onCenterClick)\n if (!this.config.disableDrag) {\n this._draggabilly = new Draggabilly(this.player.root, {\n handle: this.root\n })\n }\n if (this.config.isScrollSwitch) {\n window.addEventListener('scroll', this.onScroll)\n }\n }\n\n registerIcons () {\n return {\n play: { icon: PlayIcon, class: 'xg-icon-play' },\n pause: { icon: PauseIcon, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.play-icon', icons.play)\n this.appendChild('.play-icon', icons.pause)\n }\n\n onCancelClick = (e) => {\n // e.preventDefault()\n // e.stopPropagation()\n this.exitMini()\n this.isClose = true\n }\n\n onCenterClick = (e) => {\n const { player } = this\n player.paused ? player.play() : player.pause()\n }\n\n onScroll = (e) => {\n if ((!window.scrollY && window.scrollY !== 0) || Math.abs(window.scrollY - this.pos.scrollY) < 50) {\n return\n }\n let scrollHeight = parseInt(Util.getCss(this.player.root, 'height'))\n scrollHeight += this.config.scrollTop\n this.pos.scrollY = window.scrollY\n if (window.scrollY > scrollHeight + 5) {\n !this.isMini && !this.isClose && this.getMini()\n } else if (window.scrollY <= scrollHeight) {\n this.isMini && this.exitMini()\n this.isClose = false\n }\n }\n\n getMini () {\n if (this.isMini) {\n return\n }\n const { player, playerConfig } = this\n const target = this.config.target || this.player.root\n this.lastStyle = {}\n Util.addClass(player.root, 'xgplayer-mini');\n ['width', 'height', 'top', 'left'].map(key => {\n this.lastStyle[key] = target.style[key]\n target.style[key] = `${this.pos[key]}px`\n })\n if (playerConfig.fluid) {\n target.style['padding-top'] = ''\n }\n this.emit(Events.MINI_STATE_CHANGE, true)\n player.isMini = this.isMini = true\n }\n\n exitMini () {\n if (!this.isMini) {\n return false\n }\n const { player, playerConfig } = this\n const target = this.config.target || this.player.root\n Util.removeClass(player.root, 'xgplayer-mini')\n if (this.lastStyle) {\n Object.keys(this.lastStyle).map(key => {\n target.style[key] = this.lastStyle[key]\n })\n }\n this.lastStyle = null\n if (playerConfig.fluid) {\n player.root.style.width = '100%'\n player.root.style.height = '0'\n player.root.style['padding-top'] = `${playerConfig.height * 100 / playerConfig.width}%`\n }\n this.emit(Events.MINI_STATE_CHANGE, false)\n this.isMini = player.isMini = false\n }\n\n destroy () {\n window.removeEventListener('scroll', this.onScroll)\n const eventName = Util.checkTouchSupport() ? 'touchend' : 'click'\n this.unbind('.mini-cancel-btn', eventName, this.onCancelClick)\n this.unbind('.play-icon', eventName, this.onCenterClick)\n this._draggabilly && this._draggabilly.destroy()\n this._draggabilly = null\n this.exitMini()\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n \n \n
${this.i18n.MINI_DRAG}
\n
\n
\n \n \n \n
\n
\n
\n
`\n }\n}\n\nexport {\n MiniScreen as default,\n MiniScreenIcon\n}\n","import { BasePlugin, Sniffer } from '../../plugin'\nimport { runHooks } from '../../plugin/hooksDescriptor'\nimport './index.scss'\n\nconst MOUSE_EVENTS = {\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousemove: 'onMouseMove'\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nexport default class PCPlugin extends BasePlugin {\n static get pluginName () {\n return 'pc'\n }\n\n static get defaultConfig () {\n return {\n disableContextmenu: true\n }\n }\n\n afterCreate () {\n this._clickCount = 0\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { enableContextmenu, isMobileSimulateMode } = this.playerConfig\n if (isMobileSimulateMode || (Sniffer.device === 'mobile' && !Sniffer.os.isIpad)) {\n return\n }\n this.config.disableContextmenu = !enableContextmenu\n this.initEvents()\n }\n\n initEvents () {\n const { video, root } = this.player\n\n video.addEventListener('click', this.onVideoClick, false)\n video.addEventListener('dblclick', this.onVideoDblClick, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.addEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n this.config.disableContextmenu && video.addEventListener('contextmenu', this.onContextmenu, false)\n }\n\n switchPlayPause (e) {\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: player.paused, to: !player.paused })\n if (!player.ended) {\n player.paused ? player.play() : player.pause()\n } else {\n player.duration !== Infinity && player.duration > 0 && player.replay()\n }\n }\n\n onMouseMove = (e) => {\n const { player, playerConfig } = this\n if (!player.isActive) {\n player.focus({ autoHide: !playerConfig.closeDelayBlur })\n !playerConfig.closeFocusVideoFocus && player.video.focus()\n }\n }\n\n onMouseEnter = (e) => {\n const { playerConfig, player } = this\n player.focus({ autoHide: !playerConfig.closeDelayBlur })\n !playerConfig.closeFocusVideoFocus && player.video.focus()\n }\n\n onMouseLeave = (e) => {\n const { closePlayerBlur, leavePlayerTime } = this.playerConfig\n if (!closePlayerBlur) {\n if (leavePlayerTime) {\n this.player.focus({ autoHide: true, delay: leavePlayerTime })\n } else {\n this.player.blur()\n }\n }\n }\n\n onContextmenu (e) {\n e = e || window.event\n if (e.preventDefault) {\n e.preventDefault()\n }\n if (e.stopPropagation) {\n e.stopPropagation()\n } else {\n e.returnValue = false // 解决IE8右键弹出\n e.cancelBubble = true\n }\n }\n\n onVideoClick = (e) => {\n const { player, playerConfig } = this\n if (e.target && playerConfig.closeVideoClick) {\n return\n }\n if (e.target === player.video || e.target === player.innerContainer || e.target === player.video.__canvas) {\n e.preventDefault()\n if (!playerConfig.closeVideoStopPropagation) {\n e.stopPropagation()\n }\n this._clickCount++\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n this.clickTimer = setTimeout(() => {\n if (!this._clickCount) {\n return\n }\n this._clickCount--\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.switchPlayPause(data.e)\n }, { e, paused: player.paused })\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }, 300)\n }\n }\n\n onVideoDblClick = (e) => {\n const { player, playerConfig } = this\n if (!e.target || (e.target !== player.video && e.target !== player.video.__canvas) || playerConfig.closeVideoDblclick) {\n return\n }\n if (this._clickCount < 2) {\n this._clickCount = 0\n return\n }\n this._clickCount = 0\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n e.preventDefault()\n e.stopPropagation()\n 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 video.removeEventListener('dblclick', this.onVideoDblClick, false)\n video.removeEventListener('contextmenu', this.onContextmenu, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.removeEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n }\n}\n","\nconst EVENTS = {\n PRESS: 'press',\n PRESS_END: 'pressend',\n DOUBlE_CLICK: 'doubleclick',\n CLICK: 'click',\n TOUCH_MOVE: 'touchmove',\n TOUCH_START: 'touchstart',\n TOUCH_END: 'touchend'\n}\n\nconst TOUCHS = {\n start: 'touchstart',\n end: 'touchend',\n move: 'touchmove',\n cancel: 'touchcancel'\n}\n\nconst MOUSES = {\n start: 'mousedown',\n end: 'mouseup',\n move: 'mousemove',\n cancel: 'mouseleave'\n}\n\nfunction getTouch (touches) {\n if (touches && touches.length > 0) {\n return touches[touches.length - 1]\n } else {\n return null\n }\n}\n\nfunction preventToucheDefault (e) {\n const ua = navigator.userAgent;\n /(?:iPhone|iPad)/.test(ua) && e.cancelable && e.preventDefault()\n}\n\nfunction getDefaultConfig () {\n return {\n pressDelay: 600,\n dbClickDelay: 200,\n disablePress: false,\n disableDbClick: false,\n miniStep: 2,\n needPreventDefault: true\n }\n}\n\nclass Touche {\n constructor (dom, config = { eventType: 'touch' }) {\n this._pos = {\n moving: false,\n start: false,\n x: 0,\n y: 0\n }\n this.config = getDefaultConfig()\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n this.root = dom\n this.events = config.eventType === 'mouse' ? MOUSES : TOUCHS\n this.pressIntrvalId = null\n this.dbIntrvalId = null\n this.__handlers = {}\n this._initEvent()\n }\n\n _initEvent () {\n this.onTouchStart = this.onTouchStart.bind(this)\n this.onTouchMove = this.onTouchMove.bind(this)\n this.onTouchEnd = this.onTouchEnd.bind(this)\n this.onTouchCancel = this.onTouchCancel.bind(this)\n this.root.addEventListener(this.events.start, this.onTouchStart)\n }\n\n __setPress (e) {\n const { config } = this\n if (this.pressIntrvalId) {\n this.__clearPress()\n }\n this.pressIntrvalId = setTimeout(() => {\n this.trigger(EVENTS.PRESS, e)\n this._pos.press = true\n this.__clearPress()\n }, config.pressDelay)\n }\n\n __clearPress () {\n window.clearTimeout(this.pressIntrvalId)\n this.pressIntrvalId = null\n }\n\n __setDb (e) {\n const { config } = this\n if (this.dbIntrvalId) {\n this.__clearDb()\n this.trigger(EVENTS.DOUBlE_CLICK, e)\n return\n }\n this.dbIntrvalId = setTimeout(() => {\n this.__clearDb()\n if (!this._pos.start && !this._pos.press && !this._pos.moving) {\n this.trigger(EVENTS.CLICK, e)\n }\n }, config.dbClickDelay)\n }\n\n __clearDb () {\n clearTimeout(this.dbIntrvalId)\n this.dbIntrvalId = null\n }\n\n on (event, handler) {\n if (!this.__handlers[event]) {\n this.__handlers[event] = []\n }\n this.__handlers[event].push(handler)\n }\n\n off (event, handler) {\n if (!this.__handlers[event]) {\n return\n }\n const handlers = this.__handlers[event]\n let index = -1\n for (let i = 0; i < handlers.length; i++) {\n if (handlers[i] === handler) {\n index = i\n break\n }\n }\n if (index >= 0) {\n this.__handlers[event].splice(index, 1)\n }\n }\n\n trigger (event, e) {\n if (!this.__handlers[event]) {\n return\n }\n this.__handlers[event].map(handler => {\n try {\n handler(e)\n } catch (error) {\n console.error(`trigger>>:${event}`, error)\n }\n })\n }\n\n onTouchStart (e) {\n const { _pos, root, config } = this\n config.needPreventDefault && preventToucheDefault(e)\n const touch = getTouch(e.touches)\n _pos.x = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.y = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.start = true\n this.__setPress(e)\n root.addEventListener(this.events.end, this.onTouchEnd)\n root.addEventListener(this.events.cancel, this.onTouchCancel)\n root.addEventListener(this.events.move, this.onTouchMove)\n this.trigger(EVENTS.TOUCH_START, e)\n }\n\n onTouchCancel (e) {\n this.onTouchEnd(e)\n }\n\n onTouchEnd (e) {\n const { _pos, root, config } = this\n config.needPreventDefault && preventToucheDefault(e)\n this.__clearPress()\n root.removeEventListener(this.events.cancel, this.onTouchCancel)\n root.removeEventListener(this.events.end, this.onTouchEnd)\n root.removeEventListener(this.events.move, this.onTouchMove)\n e.moving = _pos.moving\n e.press = _pos.press\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n this.trigger(EVENTS.TOUCH_END, e)\n !_pos.press && !_pos.moving && this.__setDb(e)\n _pos.press = false\n _pos.start = false\n _pos.moving = false\n }\n\n onTouchMove (e) {\n const { _pos, config } = this\n const touch = getTouch(e.touches)\n const x = touch ? parseInt(touch.pageX, 10) : e.pageX\n const y = touch ? parseInt(touch.pageY, 10) : e.pageX\n const diffx = x - _pos.x\n const diffy = y - _pos.y\n if (Math.abs(diffy) < config.miniStep && Math.abs(diffx) < config.miniStep) {\n return\n }\n this.__clearPress()\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n _pos.press = false\n _pos.moving = true\n this.trigger(EVENTS.TOUCH_MOVE, e)\n }\n\n destroy () {\n const map = {\n touchend: 'onTouchEnd',\n touchmove: 'onTouchMove',\n touchstart: 'onTouchStart'\n }\n Object.keys(map).map(key => {\n this.root.removeEventListener('touchend', this[map[key]])\n })\n }\n}\n\nexport default Touche\n","import Plugin, { Events, Util, Sniffer, STATES } from '../../plugin'\nimport Touche from './touch'\nimport SeekTipIcon from '../assets/seekicon.svg'\n// import BackSvg from './back.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disableGesture?: boolean,\n * gestureX?: boolean,\n * gestureY?: boolean,\n * gradient?: 'normal' | 'none' | 'top' | 'bottom',\n * isTouchingSeek?: boolean,\n * miniMoveStep?: number,\n * miniYPer?: number,\n * scopeL?: number,\n * scopeR?: number,\n * pressRate?: number,\n * darkness?: boolean,\n * maxDarkness?: number,\n * disableActive?: boolean,\n * disableTimeProgress?: boolean,\n * hideControlsActive?: boolean,\n * hideControlsEnd?: boolean,\n * moveDuration?: number,\n * closedbClick?: boolean,\n * disablePress?: boolean,\n * disableSeekIcon?: boolean,\n * focusVideoClick?: boolean,\n * [propName: string]: any\n * }} IMobileConfig\n */\n\nconst ACTIONS = {\n AUTO: 'auto',\n SEEKING: 'seeking',\n PLAYBACK: 'playbackrate',\n LIGHT: ''\n}\n\nclass MobilePlugin extends Plugin {\n static get pluginName () {\n return 'mobile'\n }\n\n /**\n * @type IMobileConfig & { [propName: string]: any}\n */\n static get defaultConfig () {\n return {\n index: 0,\n disableGesture: false, // Whether to disable gestures\n gestureX: true, // Whether to enable horizontal gestures\n gestureY: true, // Whether to enable vertical gestures\n gradient: 'normal', // Gradient shadow, 'none'/'top'/'bottom'\n isTouchingSeek: false, // Whether to update currentTime at the same time as touchMove\n miniMoveStep: 5, // Minimum moving distance, used for move throttling\n miniYPer: 5, // Percentage of minimum displacement in y direction\n scopeL: 0.25, // Gesture range on the left\n scopeR: 0.25, // Gesture range on the right\n scopeM: 0.9, // Middle gesture range\n pressRate: 2, // playbackRate when long press\n darkness: true, // Whether to enable the dimming function on the right\n maxDarkness: 0.8, // Maximum darkness,maximum transparency of the mask\n disableActive: false, // Whether to disable the time prompt\n disableTimeProgress: false, // Whether to disable the time progress bar\n hideControlsActive: false, // Whether to hide the control bar when dragging by gesture\n hideControlsEnd: false, // Whether to hide the control bar when the gesture ended\n moveDuration: 60 * 6 * 1000, // The duration corresponding to the dragging width of the player\n closedbClick: false, // Whether to turn off the double tap gesture\n disablePress: true, // Whether to turn off the long press gesture\n disableSeekIcon: false, // Disable seek prompt\n focusVideoClick: false // Click on force toggle to pause/play\n }\n }\n\n constructor (options) {\n super(options)\n /**\n * @readonly\n */\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n time: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1\n }\n /**\n * @private\n */\n this.timer = null\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n /**\n * @private\n * @returns {[propName: string]: any}\n */\n registerIcons () {\n return {\n seekTipIcon: { icon: SeekTipIcon, class: 'xg-seek-pre' }\n }\n }\n\n afterCreate () {\n const { playerConfig, config, player } = this\n if (playerConfig.closeVideoDblclick === true) {\n config.closedbClick = true\n }\n this.resetPos()\n if (!Util.isUndefined(playerConfig.disableGesture)) {\n config.disableGesture = !!playerConfig.disableGesture\n }\n this.appendChild('.xg-seek-icon', this.icons.seekTipIcon)\n\n this.xgMask = Util.createDom('xg-mask', '', {}, 'xgmask')\n player.root.appendChild(this.xgMask)\n\n this.initCustomStyle()\n\n this.registerThumbnail()\n\n const eventType = this.domEventType\n this.touch = new Touche(this.root, { eventType, needPreventDefault: !this.config.disableGesture })\n\n this.root.addEventListener('contextmenu', e => {\n e.preventDefault()\n })\n\n player.root.addEventListener('touchmove', this.onRootTouchMove, true)\n player.root.addEventListener('touchend', this.onRootTouchEnd, true)\n\n this.on(Events.DURATION_CHANGE, () => {\n const { player, config } = this\n if (player.duration * 1000 < config.moveDuration) {\n config.moveDuration = player.duration * 1000\n }\n })\n\n this.on([Events.CANPLAY, Events.ENDED], () => {\n const { time, isStart } = this.pos\n if (!isStart && time > 0) {\n this.pos.time = 0\n }\n })\n\n const eventsMap = {\n touchstart: 'onTouchStart',\n touchmove: 'onTouchMove',\n touchend: 'onTouchEnd',\n press: 'onPress',\n pressend: 'onPressEnd',\n click: 'onClick',\n doubleclick: 'onDbClick'\n }\n\n Object.keys(eventsMap).map(key => {\n this.touch.on(key, (e) => {\n this[eventsMap[key]](e)\n })\n })\n\n if (!config.disableActive) {\n // Add progress bar drag event callback\n const progressPlugin = player.plugins.progress\n if (progressPlugin) {\n progressPlugin.addCallBack('dragmove', (data) => {\n this.activeSeekNote(data.currentTime, data.forward)\n })\n progressPlugin.addCallBack('dragend', () => {\n this.changeAction(ACTIONS.AUTO)\n })\n }\n }\n }\n\n registerThumbnail () {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail = thumbnail.createThumbnail(null, 'mobile-thumbnail')\n const timePreview = this.find('.time-preview')\n timePreview.insertBefore(this.thumbnail, timePreview.children[0])\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { playedColor, progressColor } = commonStyle\n if (playedColor) {\n this.find('.xg-curbar').style.backgroundColor = playedColor\n this.find('.xg-cur').style.color = playedColor\n }\n if (progressColor) {\n this.find('.xg-bar').style.backgroundColor = progressColor\n this.find('.time-preview').style.color = progressColor\n }\n this.config.disableTimeProgress && Util.addClass(this.find('.xg-timebar'), 'hide')\n }\n\n resetPos (time = 0) {\n if (this.pos) {\n this.pos.isStart = false\n this.pos.scope = -1;\n ['x', 'y', 'width', 'height', 'scopeL', 'scopeR', 'scopeM1', 'scopeM2'].map(item => {\n this.pos[item] = 0\n })\n } else {\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1,\n time: 0\n }\n }\n }\n\n changeAction (action) {\n const { player, root } = this\n root.setAttribute('data-xg-action', action)\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.recover()\n }\n\n getTouche (e) {\n const rotateDeg = this.player.rotateDeg\n const touche = e.touches && e.touches.length > 0 ? e.touches[e.touches.length - 1] : e\n // if (touches && touches.length > 0) {\n // const touche = touches[touches.length - 1]\n // if (rotateDeg === 0) {\n // return {\n // pageX: touche.pageX,\n // pageY: touche.pageY\n // }\n // } else {\n // return {\n // pageX: touche.pageY,\n // pageY: touche.pageX\n // }\n // }\n // } else {\n // }\n return rotateDeg === 0\n ? {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n : {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n }\n\n /**\n * 校验具体的操作范围\n * @param { number } x 方向位移\n * @param { number } y 方向位移\n * @param { number } diffx 方向位移差\n * @param { number } diffy 方向位移差\n * @param { any } pos 当前操作区域位置信息 包含{width, height}\n * @return { number } scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n */\n checkScope (x, y, diffx, diffy, pos) {\n const { width } = pos\n let scope = -1\n if (x < 0 || x > width) {\n return scope\n }\n const mold = diffy === 0 ? Math.abs(diffx) : Math.abs(diffx / diffy)\n if (Math.abs(diffx) > 0 && mold >= 1.73 && x > pos.scopeM1 && x < pos.scopeM2) {\n scope = 0\n } else if (Math.abs(diffx) === 0 || mold <= 0.57) {\n scope = x < pos.scopeL ? 1 : (x > pos.scopeR ? 2 : 3)\n }\n return scope\n }\n\n /**\n * 根据位移和操作类型进行对应处理\n * @param {number} diffx x方向位移差\n * @param {number} diffy y方向位移差\n * @param {number} scope scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} width 总体宽度\n * @param {number} height 总高度\n */\n executeMove (diffx, diffy, scope, width, height) {\n switch (scope) {\n case 0:\n this.updateTime(diffx / width * this.config.scopeM)\n break\n case 1:\n this.updateBrightness(diffy / height)\n break\n case 2:\n // ios系统不支持音量调节\n if (!Sniffer.os.isIos) {\n this.updateVolume(diffy / height)\n }\n break\n default:\n }\n }\n\n /**\n * 结束手势操作\n * @param {number} scope 当前手势类型 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} lastScope 上一次手势类型\n */\n endLastMove (lastScope) {\n const { pos, player, config } = this\n const time = (pos.time - this.timeOffset) / 1000\n switch (lastScope) {\n case 0:\n player.seek(Number(time).toFixed(1))\n config.hideControlsEnd ? player.blur() : player.focus()\n this.timer = setTimeout(() => {\n this.pos.time = 0\n }, 500)\n break\n case 1:\n case 2:\n default:\n }\n this.changeAction(ACTIONS.AUTO)\n }\n\n onTouchStart = (e) => {\n const { player, config, pos, playerConfig } = this\n const touche = this.getTouche(e)\n if (touche && !config.disableGesture && this.duration > 0 && !player.ended) {\n pos.isStart = true\n // e.cancelable && e.preventDefault()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n // pos.volume = player.volume * 100\n const rect = this.root.getBoundingClientRect()\n if (player.rotateDeg === 90) {\n pos.top = rect.left\n pos.left = rect.top\n pos.width = rect.height\n pos.height = rect.width\n } else {\n pos.top = rect.top\n pos.left = rect.left\n pos.width = rect.width\n pos.height = rect.height\n }\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n pos.x = player.rotateDeg === 90 ? _y : _x // parseInt(touche.pageX - pos.left, 10)\n pos.y = player.rotateDeg === 90 ? _x : _y // parseInt(touche.pageY - pos.top, 10)\n pos.scopeL = config.scopeL * pos.width\n pos.scopeR = (1 - config.scopeR) * pos.width\n pos.scopeM1 = pos.width * (1 - config.scopeM) / 2\n pos.scopeM2 = pos.width - pos.scopeM1\n }\n }\n\n onTouchMove = (e) => {\n const touche = this.getTouche(e)\n const { pos, config, player } = this\n if (!touche || config.disableGesture || !this.duration || !pos.isStart) {\n return\n }\n const { miniMoveStep, hideControlsActive } = config\n\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n const x = player.rotateDeg === 90 ? _y : _x\n const y = player.rotateDeg === 90 ? _x : _y\n\n if (Math.abs(x - pos.x) > miniMoveStep || Math.abs(y - pos.y) > miniMoveStep) {\n const diffx = x - pos.x\n const diffy = y - pos.y\n let scope = pos.scope\n if (scope === -1) {\n scope = this.checkScope(x, y, diffx, diffy, pos)\n // 手势为快进快退记录起始操作时间\n if (scope === 0) {\n !hideControlsActive ? player.focus({ autoHide: false }) : player.blur()\n !pos.time && (pos.time = parseInt(player.currentTime * 1000, 10) + this.timeOffset * 1000)\n }\n pos.scope = scope\n }\n if (scope === -1 || (scope > 0 && !config.gestureY) || (scope === 0 && !config.gestureX)) {\n return\n }\n e.cancelable && e.preventDefault()\n this.executeMove(diffx, diffy, scope, pos.width, pos.height)\n pos.x = x\n pos.y = y\n } else {\n // console.log('touche.pageX - pos.x', touche.pageX - pos.x)\n }\n }\n\n onTouchEnd = (e) => {\n const { player, pos, playerConfig } = this\n if (!pos.isStart) {\n return\n }\n if (pos.scope > -1) {\n e.cancelable && e.preventDefault()\n }\n this.endLastMove(pos.scope)\n setTimeout(() => {\n player.getPlugin('progress') && player.getPlugin('progress').resetSeekState()\n }, 10)\n pos.scope = -1\n this.resetPos()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n this.changeAction(ACTIONS.AUTO)\n }\n\n checkIsRootTarget (e) {\n const plugins = this.player.plugins || {}\n if (plugins.progress && plugins.progress.root.contains(e.target)) {\n return false\n }\n return (plugins.start && plugins.start.root.contains(e.target)) || (plugins.controls && plugins.controls.root.contains(e.target))\n }\n\n onRootTouchMove = (e) => {\n if (this.config.disableGesture || !this.config.gestureX) {\n return\n }\n if (this.checkIsRootTarget(e)) {\n e.stopPropagation()\n if (!this.pos.isStart) {\n this.onTouchStart(e)\n } else {\n this.onTouchMove(e)\n }\n }\n }\n\n onRootTouchEnd = (e) => {\n if (this.pos.isStart && this.checkIsRootTarget(e)) {\n e.stopPropagation()\n this.onTouchEnd(e)\n // const { controls } = this.player\n // controls && controls.recoverAutoHide()\n }\n }\n\n sendUseAction (event) {\n const { paused } = this.player\n this.emitUserAction(event, 'switch_play_pause', {\n prop: 'paused',\n from: paused,\n to: !paused\n })\n }\n\n onClick (e) {\n const { player, config, playerConfig } = this\n if (player.state < STATES.RUNNING) {\n if (!playerConfig.closeVideoClick) {\n this.sendUseAction(new Event('click'))\n player.play()\n }\n return\n }\n\n if (!config.closedbClick || playerConfig.closeVideoClick) {\n player.isActive ? player.blur() : player.focus()\n } else if (!playerConfig.closeVideoClick) {\n if (player.isActive || config.focusVideoClick) {\n this.emitUserAction('click', 'switch_play_pause')\n this.switchPlayPause()\n }\n player.focus()\n }\n }\n\n onDbClick (e) {\n const { config, player } = this\n if (!config.closedbClick && player.state >= STATES.RUNNING) {\n this.sendUseAction(new Event('dblclick'))\n this.switchPlayPause()\n }\n }\n\n onPress (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n pos.rate = this.player.playbackRate\n this.emitUserAction('press', 'change_rate', {\n prop: 'playbackRate',\n from: player.playbackRate,\n to: config.pressRate\n })\n player.playbackRate = config.pressRate\n this.changeAction(ACTIONS.PLAYBACK)\n }\n\n onPressEnd (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n this.emitUserAction('pressend', 'change_rate', { prop: 'playbackRate', from: player.playbackRate, to: pos.rate })\n player.playbackRate = pos.rate\n pos.rate = 1\n this.changeAction(ACTIONS.AUTO)\n }\n\n updateTime (percent) {\n const { player, config } = this\n const { duration } = this.player\n percent = Number(percent.toFixed(4))\n let time = parseInt(percent * config.moveDuration, 10) + this.timeOffset\n time += this.pos.time\n time = time < 0 ? 0 : (time > duration * 1000 ? duration * 1000 - 200 : time)\n player.getPlugin('time') && player.getPlugin('time').updateTime(time / 1000)\n player.getPlugin('progress') && player.getPlugin('progress').updatePercent(time / 1000 / this.duration, true)\n this.activeSeekNote(time / 1000, percent > 0)\n // 在滑动的同时实时seek\n if (config.isTouchingSeek) {\n // player.currentTime = time / 1000\n player.seek(Number((time - this.timeOffset) / 1000).toFixed(1))\n }\n this.pos.time = time\n }\n\n updateVolume (percent) {\n if (this.player.rotateDeg) {\n percent = -percent\n }\n const { player, pos } = this\n percent = parseInt(percent * 100, 10)\n pos.volume += percent\n if (Math.abs(pos.volume) < 10) {\n return\n }\n let volume = parseInt(player.volume * 10, 10) - parseInt(pos.volume / 10, 10)\n volume = volume > 10 ? 10 : (volume < 1 ? 0 : volume)\n player.volume = volume / 10\n pos.volume = 0\n }\n\n updateBrightness (percent) {\n if (this.player.rotateDeg) {\n percent = -percent\n }\n const { pos, config, xgMask } = this\n let light = pos.light + (0.8 * percent)\n light = light > config.maxDarkness ? config.maxDarkness : (light < 0 ? 0 : light)\n if (xgMask) {\n xgMask.style.backgroundColor = `rgba(0,0,0,${light})`\n }\n pos.light = light\n }\n\n activeSeekNote (time, isForward = true) {\n const { player, config } = this\n const isLive = !(this.duration !== Infinity && this.duration > 0)\n if (!time || typeof time !== 'number' || isLive || config.disableActive) {\n return\n }\n if (time < 0) {\n time = 0\n } else if (time > player.duration) {\n time = player.duration - 0.2\n }\n this.changeAction(ACTIONS.SEEKING)\n\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.focusHide()\n\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n this.find('.xg-cur').innerHTML = Util.format(time)\n this.find('.xg-curbar').style.width = `${time / this.duration * 100}%`\n if (isForward) {\n Util.removeClass(this.find('.xg-seek-show'), 'xg-back')\n } else {\n Util.addClass(this.find('.xg-seek-show'), 'xg-back')\n }\n this.updateThumbnails(time)\n // const {thumbnail} = player.plugins\n // this.thumbnailPlugin && thumbnail.update(time)\n }\n\n updateThumbnails (time) {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, 160, 90)\n // this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n switchPlayPause () {\n const { player } = this\n if (player.state < STATES.ATTACHED) {\n return false\n } else if (!player.ended) {\n if (player.paused) {\n player.play()\n } else {\n player.pause()\n }\n }\n }\n\n // 动态禁用手势\n disableGesture () {\n this.config.disableGesture = false\n }\n\n // 动态启用手势\n enableGesture () {\n this.config.disableGesture = true\n }\n\n destroy () {\n const { player } = this\n this.timer && clearTimeout(this.timer)\n this.thumbnail = null\n player.root.removeChild(this.xgMask)\n this.xgMask = null\n this.touch && this.touch.destroy()\n this.touch = null\n player.root.removeEventListener('touchmove', this.onRootTouchMove, true)\n player.root.removeEventListener('touchend', this.onRootTouchEnd, true)\n }\n\n render () {\n const className = this.config.gradient !== 'normal' ? `gradient ${this.config.gradient}` : 'gradient'\n return `\n \n
\n
\n
\n \n 00:00\n /\n 00:00\n
\n
\n
\n
\n
\n
\n ${this.config.pressRate}X${this.i18n.FORWARD}\n
\n
\n `\n }\n}\n\nexport default MobilePlugin\n","import { BasePlugin, Events } from '../../plugin'\n/**\n * @typedef {{\n * seekStep?: number,\n * checkVisible?: boolean,\n * disableBodyTrigger?: boolean,\n * keyCodeMap?: { [propName: string]: any },\n * disable: boolean,\n * isIgnoreUserActive: boolean,\n * [propName: string]: any\n * }} IKeyboardConfig\n */\n\nfunction preventDefault (e) {\n e.preventDefault()\n e.returnValue = false\n}\n\nfunction isDisableTag (el) {\n const tagName = el.tagName\n\n if (tagName === 'INPUT' || tagName === 'TEXTAREA' || el.isContentEditable) {\n return true\n }\n\n return false\n}\n\nclass Keyboard extends BasePlugin {\n static get pluginName () {\n return 'keyboard'\n }\n\n /**\n * @type IKeyboardConfig\n */\n static get defaultConfig () {\n return {\n seekStep: 10, // Left/right fast forward each operation time\n checkVisible: true, // Whether to check the visibility when the shortcut key takes effect\n disableBodyTrigger: false, // Whether to monitor the shortcut keys on the body\n disableRootTrigger: false, // 是否在player.root上做快捷键监听\n isGlobalTrigger: false, // Whether the shortcut key needs to be triggered globally\n keyCodeMap: {},\n disable: false,\n isIgnoreUserActive: false // 是否忽略用户激活状态\n }\n }\n\n mergekeyCodeMap () {\n const extendkeyCodeMap = this.config.keyCodeMap\n if (extendkeyCodeMap) {\n Object.keys(extendkeyCodeMap).map(key => {\n if (!this.keyCodeMap[key]) {\n this.keyCodeMap[key] = extendkeyCodeMap[key]\n } else {\n ['keyCode', 'action', 'disable', 'isBodyTarget'].map(key1 => {\n extendkeyCodeMap[key][key1] && (this.keyCodeMap[key][key1] = extendkeyCodeMap[key][key1])\n })\n }\n })\n }\n }\n\n afterCreate () {\n this.config.disable = !this.playerConfig.keyShortcut\n const seekStep = typeof this.config.seekStep === 'function' ? this.config.seekStep(this.player) : this.config.seekStep\n if (!(!seekStep || typeof seekStep !== 'number')) {\n this.seekStep = seekStep\n }\n this.keyCodeMap = {\n space: {\n keyCode: 32,\n action: 'playPause',\n disable: false,\n noBodyTarget: false\n },\n up: {\n keyCode: 38,\n action: 'upVolume',\n disable: false,\n noBodyTarget: true\n },\n down: {\n keyCode: 40,\n action: 'downVolume',\n disable: false,\n noBodyTarget: true\n },\n left: {\n keyCode: 37,\n action: 'seekBack',\n disable: false\n },\n right: {\n keyCode: 39,\n action: 'seek',\n disable: false\n },\n esc: {\n keyCode: 27,\n action: 'exitFullscreen',\n disable: false\n }\n }\n this.mergekeyCodeMap()\n this.player.root.addEventListener('keydown', this.onKeydown)\n document.addEventListener('keydown', this.onBodyKeyDown)\n }\n\n checkIsVisible () {\n if (!this.config.checkVisible) {\n return true\n }\n const rec = this.player.root.getBoundingClientRect()\n const { height, top, bottom } = rec\n const h = window.innerHeight\n if ((top < 0 && top < 0 - height * 0.9) || (bottom > 0 && bottom - h > height * 0.9)) {\n return false\n }\n return true\n }\n\n checkCode (code, isBodyTarget) {\n let flag = false\n Object.keys(this.keyCodeMap).map(key => {\n if (this.keyCodeMap[key] && code === this.keyCodeMap[key].keyCode && !this.keyCodeMap[key].disable) {\n flag = !isBodyTarget || (isBodyTarget && !this.keyCodeMap[key].noBodyTarget)\n }\n })\n return flag\n }\n\n downVolume (event) {\n const { player } = this\n const val = parseFloat((player.volume - 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val >= 0) {\n player.volume = val\n } else {\n player.volume = 0\n }\n }\n\n upVolume (event) {\n const { player } = this\n const val = parseFloat((player.volume + 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val <= 1) {\n player.volume = val\n } else {\n player.volume = 1\n }\n }\n\n seek (event) {\n const { currentTime, duration } = this.player\n let _time = currentTime\n if (currentTime + this.seekStep <= duration) {\n _time = currentTime + this.seekStep\n } else {\n _time = duration - 1\n }\n const props = {\n currentTime: {\n from: currentTime,\n to: _time\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _time\n }\n\n seekBack (event) {\n const { currentTime } = this.player\n let _time = 0\n if (currentTime - this.seekStep >= 0) {\n _time = currentTime - this.seekStep\n }\n const props = {\n currentTime: {\n from: currentTime,\n to: _time\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _time\n }\n\n playPause (event) {\n const { player } = this\n if (!player) {\n return\n }\n this.emitUserAction(event, 'switch_play_pause')\n if (player.paused) {\n // eslint-disable-next-line handle-callback-err\n player.play()\n } else {\n player.pause()\n }\n }\n\n exitFullscreen (event) {\n const { player } = this\n const { fullscreen, cssfullscreen } = player\n if (fullscreen) {\n this.emitUserAction('keyup', 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n player.exitFullscreen()\n }\n if (cssfullscreen) {\n this.emitUserAction('keyup', 'switch_css_fullscreen', {\n prop: 'cssfullscreen',\n from: cssfullscreen,\n to: !cssfullscreen\n })\n player.exitCssFullscreen()\n }\n }\n\n onBodyKeyDown = (event) => {\n const e = event || window.event\n if (!this.player || (!this.player.isUserActive && !this.config.isIgnoreUserActive)) {\n return\n }\n if (this.config.disable || this.config.disableBodyTrigger || !this.checkIsVisible() || e.metaKey || e.altKey || e.ctrlKey) {\n return\n }\n const keyCode = e.keyCode\n if ((e.target === document.body || (this.config.isGlobalTrigger && !isDisableTag(e.target))) && this.checkCode(keyCode, true)) {\n preventDefault(e)\n this.handleKeyCode(keyCode, event)\n return false\n }\n return false\n }\n\n onKeydown = (event) => {\n const e = event || window.event\n if (this.config.disable || this.config.disableRootTrigger || e.metaKey || e.altKey || e.ctrlKey) {\n return\n }\n if (!this.player.isUserActive && !this.config.isIgnoreUserActive) {\n return\n }\n if (!this.player.isUserActive && !this.config.isIgnoreUserActive) {\n return\n }\n if (e && (e.keyCode === 37 || this.checkCode(e.keyCode)) && (e.target === this.player.root || e.target === this.player.video || e.target === this.player.controls.el)) {\n preventDefault(e)\n } else {\n return true\n }\n this.handleKeyCode(e.keyCode, event)\n }\n\n handleKeyCode (curKeyCode, event) {\n Object.keys(this.keyCodeMap).map(key => {\n const { action, keyCode, disable } = this.keyCodeMap[key]\n if (keyCode === curKeyCode && !disable) {\n if (typeof action === 'function') {\n action(event, this.player)\n } else if (typeof action === 'string') {\n if (typeof this[action] === 'function') {\n this[action](event, this.player)\n }\n }\n this.emit(Events.SHORTCUT, {\n key: key,\n target: event.target,\n ...this.keyCodeMap[key]\n })\n }\n })\n }\n\n destroy () {\n this.player.root.removeEventListener('keydown', this.onKeydown)\n document.removeEventListener('keydown', this.onBodyKeyDown)\n }\n\n disable () {\n this.config.disable = true\n }\n\n enable () {\n this.config.disable = false\n }\n}\n\nexport default Keyboard\n","import Plugin, { POSITIONS } from '../../plugin/plugin'\nimport loadingIcon from '../assets/loading.svg'\nimport './index.scss'\n\nclass Loading extends Plugin {\n static get pluginName () {\n return 'loading'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT\n }\n }\n\n registerIcons () {\n return {\n loadingIcon: loadingIcon\n }\n }\n\n afterCreate () {\n this.appendChild('xg-loading-inner', this.icons.loadingIcon)\n }\n\n render () {\n return `\n \n \n `\n }\n}\n\nexport default Loading\n","import { Util } from '../../plugin'\n\nconst TPL = [\n { tag: 'xg-cache', className: 'xgplayer-progress-cache', styleKey: 'cachedColor' },\n { tag: 'xg-played', className: 'xgplayer-progress-played', styleKey: 'playedColor' }\n]\n\nexport default class InnerList {\n constructor (args) {\n this.fragments = args.fragments || []\n this.focusClass = 'inner-focus'\n this.style = args.style || {\n playedColor: '',\n cachedColor: '',\n progressColor: ''\n }\n this.duration = 0\n this.cachedIndex = 0\n this.playedIndex = 0\n }\n\n updateDuration (duration) {\n this.duration = parseInt(duration * 1000)\n let start = 0\n const { fragments } = this\n this.fragments = fragments.map(item => {\n item.start = start\n item.end = start + item.percent * this.duration\n item.duration = item.percent * this.duration\n start += item.percent * this.duration\n return item\n })\n }\n\n updateProgress (type = 'played', data = { newIndex: 0, curIndex: 0, millisecond: 0 }) {\n const { progressList, fragments } = this\n const { newIndex, curIndex, millisecond } = data\n if (newIndex !== curIndex) {\n progressList.map((item, index) => {\n if (index < newIndex) {\n item[type].style.width = '100%'\n } else if (index > newIndex) {\n item[type].style.width = 0\n }\n })\n }\n const curPFrag = fragments[newIndex]\n const per = millisecond === 0 ? 0 : (millisecond - curPFrag.start) / curPFrag.duration\n progressList[newIndex][type].style.width = per < 0 ? 0 : `${per * 100}%`\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!this.duration || parseInt(duration * 1000, 10) !== this.duration) {\n if (!duration && duration !== 0) {\n return\n }\n this.updateDuration(duration)\n }\n const { playedIndex, cachedIndex } = this\n if (Util.typeOf(data.played) !== 'Undefined') {\n const newPIndex = this.findIndex(data.played * 1000, playedIndex)\n this.updateProgress('played', {\n newIndex: newPIndex,\n curIndex: playedIndex,\n millisecond: parseInt(data.played * 1000, 10)\n })\n this.playedIndex = newPIndex\n }\n\n if (Util.typeOf(data.cached) !== 'Undefined') {\n const newCIndex = this.findIndex(data.cached * 1000, cachedIndex)\n this.updateProgress('cached', {\n newIndex: newCIndex,\n curIndex: cachedIndex,\n millisecond: parseInt(data.cached * 1000, 10)\n })\n this.cachedIndex = newCIndex\n }\n }\n\n findIndex (time, curIndex) {\n const { fragments } = this\n if (fragments.length === 1) {\n return 0\n }\n if (time > fragments[curIndex].start && time < fragments[curIndex].end) {\n return curIndex\n }\n this.fragments.map((item, index) => {\n if (time > item.start && time <= item.end) {\n curIndex = index\n }\n })\n return curIndex\n }\n\n findHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n if (Util.hasClass(children[i], this.focusClass)) {\n return {\n dom: children[i],\n pos: children[i].getBoundingClientRect()\n }\n }\n }\n }\n\n // 根据索引获取进度条片段\n findFragment (index) {\n const children = this.root.children\n if (index < 0 || index >= children.length) {\n return null\n }\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n\n unHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n Util.removeClass(children[i], this.focusClass)\n }\n }\n\n setHightLight (index) {\n const children = this.root.children\n if (index < children.length) {\n Util.addClass(children[index], this.focusClass)\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n }\n\n destroy () {\n this.progressList = null\n this.fragments = null\n this.root.innerHTML = ''\n }\n\n render () {\n const { progressColor } = this.style\n this.root = Util.createDom('xg-inners', '', {}, 'progress-list')\n if (this.fragments) {\n this.progressList = this.fragments.map((item) => {\n const inner = Util.createDom('xg-inner', '', {\n style: progressColor ? `background:${progressColor}; flex: ${item.percent}` : `flex: ${item.percent}`\n }, `${item.isFocus ? 'inner-focus' : ''} xgplayer-progress-inner`)\n\n this.root.appendChild(inner)\n\n TPL.map(item => {\n inner.appendChild(Util.createDom(item.tag, '', {\n style: item.styleKey ? `background: ${this.style[item.styleKey]}; width:0;` : 'width:0;'\n }, item.className))\n })\n\n return {\n cached: inner.children[0],\n played: inner.children[1]\n }\n })\n }\n return this.root\n }\n}\n","import Plugin, { Events, Util, POSITIONS, Sniffer, STATES } from '../../plugin'\nimport InnerList from './innerList'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?:string,\n * disable?: boolean,\n * isDragingSeek?: boolean, // 是否在拖拽的过程中更新currentTime\n * closeMoveSeek?: boolean, // 是否关闭滑块seek能力\n * isPauseMoving?: boolean, // 是否在move的时候暂停视频内容\n * isCloseClickSeek?: boolean, // 是否关闭点击进度条的时候seek\n * fragments?: Array<{percent: number}>,\n * miniMoveStep?: number,\n * miniStartStep?: number,\n * onMoveStart?: () => any, // 手势开始移动回调,\n * onMoveEnd?: () => any, // 手势移动结束回调\n * [propName: string]: any\n * }} IProgressConfig\n */\n/**\n * 进度条组件\n */\nclass Progress extends Plugin {\n static get pluginName () {\n return 'progress'\n }\n\n /**\n * @type IProgressConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_CENTER,\n index: 0,\n disable: false,\n isDragingSeek: true, // 是否在拖拽的过程中更新currentTime\n closeMoveSeek: false, // 是否关闭滑块seek能力\n isPauseMoving: false, // 是否在move的时候暂停视频内容\n isCloseClickSeek: false, // 是否关闭点击进度条的时候seek\n fragments: [{ percent: 1 }],\n miniMoveStep: 5,\n miniStartStep: 2,\n onMoveStart: () => {\n }, // 手势开始移动回调\n onMoveEnd: () => {} // 手势移动结束回调\n }\n }\n\n constructor (args) {\n super(args)\n /**\n * @readonly\n */\n this.useable = false\n /**\n * @readonly\n */\n this.isProgressMoving = false\n\n /**\n * @private\n */\n this.__dragCallBacks = []\n /**\n * @private\n */\n this._state = {\n now: -1,\n direc: 0,\n time: 0\n }\n\n this._disableBlur = false\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n changeState (useable = true) {\n this.useable = useable\n }\n\n /**\n * @description 创建内部进度条,并挂载到xg-outer上,\n * 并把一些对外API绑定在progress上供外部调用\n *\n */\n createInner () {\n this.innerList = new InnerList({\n fragments: this.config.fragments,\n style: this.playerConfig.commonStyle || {}\n })\n this.outer.insertBefore(this.innerList.render(), this.outer.children[0]);\n ['findHightLight', 'unHightLight', 'setHightLight', 'findFragment'].map(item => {\n this[item] = this.innerList[item].bind(this.innerList)\n })\n }\n\n afterCreate () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n this.pos = {\n x: 0, // 水平方向位移\n y: 0, // 垂直方向位移\n moving: false, // 是否正在移动\n isDown: false, // 是否mouseDown\n isEnter: false // 是否触发了mouseEnter\n }\n this.outer = this.find('xg-outer')\n this.createInner()\n if (Sniffer.device === 'mobile') {\n this.config.isDragingSeek = false\n this.isMobile = true\n }\n\n this.progressBtn = this.find('.xgplayer-progress-btn')\n\n this.on(Events.TIME_UPDATE, () => {\n this.onTimeupdate()\n })\n\n this.on(Events.SEEKED, () => {\n this.onTimeupdate()\n this.onCacheUpdate()\n })\n\n this.on(Events.PROGRESS, () => {\n this.onCacheUpdate()\n })\n\n this.on(Events.ENDED, () => {\n this.onCacheUpdate()\n this._state.now = 0\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n\n this.bindDomEvents()\n this.initCustomStyle()\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { sliderBtnStyle } = commonStyle\n const { progressBtn } = this\n if (sliderBtnStyle) {\n if (typeof sliderBtnStyle === 'string') {\n progressBtn.style.boxShadow = sliderBtnStyle\n } else if (typeof sliderBtnStyle === 'object') {\n Object.keys(sliderBtnStyle).map(key => {\n progressBtn.style[key] = sliderBtnStyle[key]\n })\n }\n }\n }\n\n /**\n * 触发某一类回调监听\n * @param { string } type 类型 drag/dragend\n * @param { any} data 具体数据\n */\n triggerCallbacks (type, data, event) {\n if (this.__dragCallBacks.length > 0) {\n this.__dragCallBacks.map(item => {\n if (item && item.handler && item.type === type) {\n try {\n item.handler(data, event)\n } catch (error) {\n console.error(`[XGPLAYER][triggerCallbacks] ${item} error`, error)\n }\n }\n })\n }\n }\n\n /**\n * 供外部插件添加回调\n * @param {string} type 类型 drag/dragend\n * @param {function} handle 回调函数句柄\n */\n addCallBack (type, handle) {\n if (handle && typeof handle === 'function') {\n this.__dragCallBacks.push({ type: type, handler: handle })\n }\n }\n\n /**\n * 供外部插件移除回调\n * @param {string} type 类型 drag/dragend\n * @param {Function} event 回调函数句柄\n */\n removeCallBack (type, event) {\n const { __dragCallBacks } = this\n let _index = -1\n __dragCallBacks.map((item, index) => {\n if (item && item.type === type && item.handler === event) {\n _index = index\n }\n })\n if (_index > -1) {\n __dragCallBacks.splice(_index, 1)\n }\n }\n\n bindDomEvents () {\n const { controls, config } = this.player\n this._mouseDownHandlerHook = this.hook('dragstart', this._mouseDownHandler)\n this._mouseUpHandlerHook = this.hook('dragend', this._mouseUpHandler)\n this._mouseMoveHandlerHook = this.hook('drag', this._mouseMoveHandler)\n if (this.domEventType === 'touch') {\n this.root.addEventListener('touchstart', this.onMouseDown)\n // this.bind('touchstart', this.onMouseDown)\n if (controls) {\n controls.root && controls.root.addEventListener('touchmove', Util.stopPropagation)\n controls.center && controls.center.addEventListener('touchend', Util.stopPropagation)\n }\n } else {\n this.bind('mousedown', this.onMouseDown)\n !config.isMobileSimulateMode && this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseover', this.onMouseOver)\n this.bind('mouseout', this.onMouseOut)\n }\n }\n\n focus () {\n // this.player.controls.pauseAutoHide()\n Util.addClass(this.root, 'active')\n }\n\n blur () {\n if (this._disableBlur) {\n return\n }\n this.player.controls.recoverAutoHide()\n Util.removeClass(this.root, 'active')\n }\n\n disableBlur () {\n this._disableBlur = true\n }\n\n enableBlur () {\n this._disableBlur = false\n }\n\n onMoveOnly = (e) => {\n const { pos, config, player } = this\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (pos.moving && Math.abs(pos.x - x) < config.miniMoveStep) {\n return\n }\n pos.moving = true\n pos.x = x\n const ret = this.computeTime(e)\n this.triggerCallbacks('dragmove', ret, e)\n }\n\n onBodyClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n\n _mouseDownHandler = (event, data) => {\n this._state.time = data.currentTime\n this.updateWidth(data.currentTime, data.percent, 0)\n }\n\n _mouseUpHandler = (e, data) => {\n const { pos } = this\n if (pos.moving) {\n this.updateWidth(data.currentTime, data.percent, 2)\n // this.triggerCallbacks('dragend', data, e)\n } else {\n // this.updateWidth(ret.currentTime, ret.percent, 2)\n // this.triggerCallbacks('click', data, e)\n }\n }\n\n _mouseMoveHandler = (e, data) => {\n const { _state, pos, config, player } = this\n if (_state.time < data.currentTime) {\n data.forward = true\n } else {\n data.forward = false\n }\n _state.time = data.currentTime\n if (pos.isDown && !pos.moving) {\n pos.moving = true\n config.isPauseMoving && player.pause()\n this.triggerCallbacks('dragstart', data, e)\n }\n this.updateWidth(data.currentTime, data.percent, 1)\n this.triggerCallbacks('dragmove', data, e)\n }\n\n onMouseDown = (e) => {\n const { player, pos, config, playerConfig } = this\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (player.isMini || config.closeMoveSeek || (!playerConfig.allowSeekAfterEnded && player.ended)) {\n return\n }\n e.stopPropagation()\n // e.preventDefault()\n this.focus()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n Util.checkIsFunction(config.onMoveStart) && config.onMoveStart()\n Util.event(e)\n pos.x = x\n pos.isDown = true\n pos.moving = false\n\n // 交互开始 禁止控制栏的自动隐藏功能\n player.focus({ autoHide: false })\n this.isProgressMoving = true\n Util.addClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e)\n this._mouseDownHandlerHook(e, ret)\n // this._state.time = ret.currentTime\n // this.updateWidth(ret.currentTime, ret.percent, 0)\n if (this.domEventType === 'touch') {\n this.root.addEventListener('touchmove', this.onMouseMove)\n this.root.addEventListener('touchend', this.onMouseUp)\n } else {\n this.unbind('mousemove', this.onMoveOnly)\n\n document.addEventListener('mousemove', this.onMouseMove, false)\n document.addEventListener('mouseup', this.onMouseUp, false)\n // 避免触发videoClick 暂停/播放切换\n player.root.addEventListener('click', this.onBodyClick, false)\n // this.bind('mouseup', this.onMouseUp, false)\n }\n return true\n }\n\n onMouseUp = (e) => {\n const { player, config, pos, playerConfig, _state } = this\n e.stopPropagation()\n e.preventDefault()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n Util.checkIsFunction(config.onMoveEnd) && config.onMoveEnd()\n Util.event(e)\n Util.removeClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e)\n // if (pos.moving) {\n // this.updateWidth(ret.currentTime, ret.percent, 2)\n // this.triggerCallbacks('dragend', ret)\n // } else {\n // // this.updateWidth(ret.currentTime, ret.percent, 2)\n // this.triggerCallbacks('click', ret)\n // }\n if (pos.moving) {\n this.triggerCallbacks('dragend', ret, e)\n } else {\n this.triggerCallbacks('click', ret, e)\n }\n this._mouseUpHandlerHook(e, ret)\n\n pos.moving = false\n pos.isDown = false\n pos.x = 0\n pos.y = 0\n _state.time = 0\n if (this.domEventType === 'touch') {\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n // 交互结束 恢复控制栏的隐藏流程\n this.blur()\n } else {\n document.removeEventListener('mousemove', this.onMouseMove, false)\n document.removeEventListener('mouseup', this.onMouseUp, false)\n player.root.removeEventListener('click', this.onBodyClick, false)\n if (!pos.isEnter) {\n this.onMouseLeave(e)\n } else {\n !playerConfig.isMobileSimulateMode && this.bind('mousemove', this.onMoveOnly)\n }\n }\n // 延迟复位,状态复位要在dom相关时间回调执行之后\n Util.setTimeout(this, () => {\n this.resetSeekState()\n }, 10)\n // 交互结束 恢复控制栏的隐藏流程\n player.focus()\n }\n\n onMouseMove = (e) => {\n const { pos, player, config } = this\n if (Util.checkTouchSupport()) {\n // e.stopPropagation()\n e.preventDefault()\n }\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const diff = Math.abs(pos.x - x)\n if ((pos.moving && diff < config.miniMoveStep) || (!pos.moving && diff < config.miniStartStep)) {\n return\n }\n pos.x = x\n const ret = this.computeTime(e)\n this._mouseMoveHandlerHook(e, ret)\n // if (_state.time < ret.currentTime) {\n // ret.forward = true\n // } else {\n // ret.forward = false\n // }\n // _state.time = ret.currentTime\n // if (pos.isDown && !pos.moving) {\n // pos.moving = true\n // config.isPauseMoving && player.pause()\n // this.triggerCallbacks('dragstart', ret)\n // }\n // this.updateWidth(ret.currentTime, ret.percent, 1)\n // this.triggerCallbacks('dragmove', ret)\n }\n\n onMouseOut = (e) => {\n this.triggerCallbacks('mouseout', null, e)\n }\n\n onMouseOver = (e) => {\n this.triggerCallbacks('mouseover', null, e)\n }\n\n onMouseEnter = (e) => {\n const { player, pos } = this\n this.triggerCallbacks('mouseenter', null, e)\n if (pos.isDown || pos.isEnter || player.isMini || (!player.config.allowSeekAfterEnded && player.ended)) {\n return\n }\n pos.isEnter = true\n this.bind('mousemove', this.onMoveOnly)\n this.bind('mouseleave', this.onMouseLeave)\n this.focus()\n }\n\n onMouseLeave = (e) => {\n this.triggerCallbacks('mouseleave', null, e)\n const { player, pos } = this\n pos.isEnter = false\n if (player.isMini) {\n return\n }\n this.unbind('mousemove', this.onMoveOnly)\n if (pos.isDown) {\n this.unbind('mouseleave', this.onMouseLeave)\n return\n }\n this.blur()\n }\n\n /**\n * @description 根据currenTime和占用百分比更新进度条\n * @param {Number} currentTime 需要更新到的时间\n * @param {Number} percent 更新时间占比\n * @param {Int} type 触发类型 0-down 1-move 2-up\n */\n updateWidth (currentTime, percent, type) {\n const { config, player } = this\n if (config.isCloseClickSeek && type === 0) {\n return\n }\n const realTime = currentTime > player.duration ? player.duration - 0.2 : Number(currentTime).toFixed(1)\n // currentTime = currentTime > player.duration ? player.duration - 0.2 : Number(currentTime).toFixed(1)\n this.updatePercent(percent)\n this.updateTime(currentTime)\n if (type === 1 && (!config.isDragingSeek || player.videoConfig.mediaType === 'audio')) {\n return\n }\n this._state.now = realTime\n this._state.direc = realTime > player.currentTime ? 0 : 1\n player.seek(realTime)\n }\n\n computeTime (e) {\n const { player } = this\n const { width, height, top, left } = this.root.getBoundingClientRect()\n const _ePos = Util.getEventPos(e, player.zoom)\n let rWidth, rLeft, clientX\n if (player.rotateDeg === 90) {\n rWidth = height\n rLeft = top\n clientX = _ePos.clientY\n } else {\n rWidth = width\n rLeft = left\n clientX = _ePos.clientX\n }\n let offset = clientX - rLeft\n offset = offset > rWidth ? rWidth : (offset < 0 ? 0 : offset)\n\n let percent = offset / rWidth\n percent = percent < 0 ? 0 : (percent > 1 ? 1 : percent)\n // 单位:秒,精确到毫秒\n const currentTime = parseInt(percent * this.duration * 1000, 10) / 1000\n return {\n percent,\n currentTime,\n offset,\n width: rWidth,\n left: rLeft,\n e\n }\n }\n\n /**\n * @description 更新时间插件,在拖拽状态下要接管时间插件的更新状态\n * 本位置会和time插件交互\n * @param {number} time 根据拖拽距离计算出的时间\n */\n updateTime (time) {\n const { player, duration } = this\n if (time > duration) {\n time = duration\n } else if (time < 0) {\n time = 0\n }\n const timeIcon = player.plugins.time\n if (timeIcon) {\n timeIcon.updateTime(time)\n }\n }\n\n /**\n * @description 复位正在拖拽状态 ,拖拽的时候要避免timeupdate更新\n */\n resetSeekState () {\n this.isProgressMoving = false\n const timeIcon = this.player.plugins.time\n timeIcon && timeIcon.resetActive()\n }\n\n /**\n * @description 拖拽过程中更新UI\n * @param {number} percent 小于0的小数\n *\n */\n updatePercent (percent, notSeek) {\n this.isProgressMoving = true\n if (this.config.disable) {\n return\n }\n percent = percent > 1 ? 1 : (percent < 0 ? 0 : percent)\n this.progressBtn.style.left = `${percent * 100}%`\n this.innerList.update({ played: percent * this.duration }, this.duration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: percent * this.duration }, this.duration)\n }\n\n /**\n * @description 播放进度更新\n */\n onTimeupdate () {\n const { player, _state, duration } = this\n if (player.isSeeking || this.isProgressMoving || player.state < STATES.RUNNING) {\n return\n }\n if (_state.now > -1) {\n const abs = parseInt(_state.now * 1000, 10) - parseInt(player.currentTime * 1000, 10)\n if ((_state.direc === 0 && abs > 300) || (_state.direc === 1 && abs > -300)) {\n _state.now = -1\n return\n } else {\n _state.now = -1\n }\n }\n const time = this.timeOffset + player.currentTime\n this.innerList.update({ played: time }, duration)\n this.progressBtn.style.left = `${time / duration * 100}%`\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: time }, duration)\n }\n\n /**\n * @description 缓存进度更新\n */\n onCacheUpdate () {\n const { player, duration } = this\n const point = player.bufferedPoint\n this.innerList.update({ cached: point.end }, duration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ cached: point.end }, duration)\n }\n\n onReset () {\n this.innerList.update({ played: 0, cached: 0 }, 0)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ cached: 0, played: 0 }, 0)\n }\n\n destroy () {\n const { player } = this\n const { controls } = player\n this.thumbnailPlugin = null\n this.innerList.destroy()\n this.innerList = null\n // if (this.isMobile) {\n const { domEventType } = this\n if (domEventType === 'touch') {\n this.root.removeEventListener('touchstart', this.onMouseDown)\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n if (controls) {\n controls.root && controls.root.removeEventListener('touchmove', Util.stopPropagation)\n controls.center && controls.center.removeEventListener('touchend', Util.stopPropagation)\n }\n } else {\n this.unbind('mousedown', this.onMouseDown)\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mousemove', this.onMoveOnly)\n this.unbind('mouseleave', this.onMouseLeave)\n document.removeEventListener('mousemove', this.onMouseMove, false)\n document.removeEventListener('mouseup', this.onMouseUp, false)\n player.root.removeEventListener('click', this.onBodyClick, false)\n }\n }\n\n render () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n const controlsMode = this.player.controls ? this.player.controls.config.mode : ''\n const className = controlsMode === 'bottom' ? 'xgplayer-progress-bottom' : ''\n return `\n \n \n \n \n \n `\n }\n}\n\nexport default Progress\n","import Plugin, { Events, POSITIONS } from '../../plugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\nclass Play extends Plugin {\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 const { player, config } = this\n if (config.disable) {\n return\n }\n this.initIcons()\n this.btnClick = this.btnClick.bind(this)\n this.bind(['touchend', 'click'], this.btnClick)\n\n this.on(Events.PAUSE, () => {\n this.animate(player.paused)\n })\n this.on(Events.PLAY, () => {\n this.animate(player.paused)\n })\n this.animate(true)\n }\n\n registerIcons () {\n return {\n play: { icon: PlaySvg, class: 'xg-icon-play' },\n pause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n btnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { prop: 'paused', from: player.paused, to: !player.paused })\n if (player.ended) {\n player.replay()\n } else if (player.paused) {\n player.play()\n this.animate(false)\n } else {\n player.pause()\n this.animate(true)\n }\n return false\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.play)\n this.appendChild('.xgplayer-icon', icons.pause)\n }\n\n animate (paused) {\n const { i18nKeys } = this\n if (paused) {\n this.setAttr('data-state', 'pause')\n this.changeLangTextKey(this.find('.xg-tips'), i18nKeys.PLAY_TIPS)\n } else {\n this.setAttr('data-state', 'play')\n this.changeLangTextKey(this.find('.xg-tips'), i18nKeys.PAUSE_TIPS)\n }\n }\n\n destroy () {\n this.unbind(['touchend', 'click'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n
\n
\n
${this.i18n.PLAY_TIPS}
\n
`\n }\n}\nexport default Play\n","import Plugin, { POSITIONS, Util } from '../../plugin'\nimport BackSVG from '../assets/back.svg'\n\nexport default class TopBackIcon extends Plugin {\n static get pluginName () {\n return 'topbackicon'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT_TOP,\n index: 0\n }\n }\n\n afterCreate () {\n this.initIcons()\n this.onClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n this.config.onClick(e)\n }\n\n this.bind(['click', 'touchend'], this.onClick)\n }\n\n registerIcons () {\n return {\n screenBack: { icon: BackSVG, class: 'xg-fullscreen-back' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild(this.root, icons.screenBack)\n }\n\n show () {\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n render () {\n return `\n `\n }\n}\n","import Plugin, { Events, POSITIONS, Sniffer, Util } from '../../plugin'\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 Plugin {\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 const { config, playerConfig } = this\n if (config.disable) {\n return\n }\n\n if (config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n const fullEl = Util.getFullScreenEl()\n\n if (playerConfig.fullscreenTarget === fullEl) {\n this.player.getFullscreen()\n }\n\n this.initIcons()\n\n this.handleFullscreen = this.hook('fullscreenChange', this.toggleFullScreen, {\n pre: (e) => {\n const { fullscreen } = this.player\n this.emitUserAction(e, 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n }\n })\n\n this.bind('.xgplayer-fullscreen', ['touchend', 'click'], this.handleFullscreen)\n\n this.on(Events.FULLSCREEN_CHANGE, (isFullScreen) => {\n this.changeLangTextKey(this.find('.xg-tips'), isFullScreen ? this.i18nKeys.EXITFULLSCREEN_TIPS : this.i18nKeys.FULLSCREEN_TIPS)\n this.animate(isFullScreen)\n })\n if (this.config.needBackIcon) {\n this.topBackIcon = this.player.registerPlugin({\n plugin: TopBackIcon,\n options: {\n config: {\n onClick: (e) => {\n this.handleFullscreen(e)\n }\n }\n }\n })\n }\n if (Sniffer.device === 'mobile') {\n window.addEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n /**\n * @private\n */\n _onOrientationChange = (e) => {\n if (this.player.fullscreen && this.config.rotateFullscreen) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.player.setRotateDeg(0)\n } else {\n this.player.setRotateDeg(90)\n }\n }\n }\n\n /**\n * @private\n */\n registerIcons () {\n return {\n fullscreen: { icon: FullScreenSvg, class: 'xg-get-fullscreen' },\n exitFullscreen: { icon: ExitFullScreenSvg, class: 'xg-exit-fullscreen' }\n }\n }\n\n destroy () {\n 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 let useCssFullscreen = config.useCssFullscreen === true || (typeof config.useCssFullscreen === 'function' && config.useCssFullscreen())\n if (useCssFullscreen) {\n if (player.fullscreen) {\n player.exitCssFullscreen()\n } else {\n player.getCssFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.rotateFullscreen) {\n if (player.fullscreen) {\n player.exitRotateFullscreen()\n } else {\n player.getRotateFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.switchCallback && typeof config.switchCallback === 'function') {\n config.switchCallback(player.fullscreen)\n } else {\n if (player.fullscreen) {\n player.exitFullscreen()\n } else {\n player.getFullscreen()\n }\n }\n }\n\n /**\n *\n * @param { boolean } isFullScreen\n */\n animate (isFullScreen) {\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n if (this.topBackIcon) {\n if (isFullScreen) {\n this.topBackIcon.show()\n this.hide()\n } else {\n this.topBackIcon.hide()\n this.show()\n }\n }\n }\n\n show () {\n super.show()\n }\n\n hide () {\n super.hide()\n }\n\n /**\n * @private\n * @returns\n */\n render () {\n if (this.config.disable) {\n return\n }\n const langKey = 'FULLSCREEN_TIPS'\n return `\n
\n
\n
${this.i18n[langKey]}
\n
`\n }\n}\n","import Plugin, { Util, Events, POSITIONS, STATES } from '../../plugin'\nimport './index.scss'\n\nclass Time extends Plugin {\n static get pluginName () {\n return 'time'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 2,\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.isActiving = false\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get currentTime () {\n return this.player.currentTime || 0\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n afterCreate () {\n const constrolsMode = this.player.controls.config.mode\n this.mode = constrolsMode === 'flex' ? 'flex' : 'normal'\n if (this.config.disable) {\n return\n }\n if (this.mode === 'flex') {\n this.createCenterTime()\n this.hide()\n }\n this.durationDom = this.find('.time-duration')\n this.timeDom = this.find('.time-current')\n this.on(Events.DURATION_CHANGE, () => {\n this.onTimeUpdate()\n })\n this.on(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n }\n\n show () {\n if (this.mode === 'flex') {\n return\n }\n super.show()\n }\n\n onTimeUpdate () {\n const { player, config } = this\n if (config.disable || this.isActiving || (player.state < STATES.RUNNING && player.state !== STATES.ATTACHED)) {\n return\n }\n const current = this.currentTime + this.timeOffset\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = Util.format(current)\n if (this.duration !== Infinity && this.duration > 0) {\n this.centerDurDom.innerHTML = Util.format(this.duration)\n }\n } else {\n this.timeDom.innerHTML = Util.format(current)\n if (this.duration !== Infinity && this.duration > 0) {\n this.durationDom.innerHTML = Util.format(this.duration)\n }\n }\n }\n\n onReset () {\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = Util.format(0)\n this.centerDurDom.innerHTML = Util.format(0)\n } else {\n this.timeDom.innerHTML = Util.format(0)\n this.durationDom.innerHTML = Util.format(0)\n }\n }\n\n createCenterTime () {\n const { player } = this\n if (!player.controls || !player.controls.center) {\n return\n }\n const center = player.controls.center\n this.centerCurDom = Util.createDom('xg-icon', '00:00', {}, 'xgplayer-time left')\n this.centerDurDom = Util.createDom('xg-icon', '00:00', {}, 'xgplayer-time right')\n center.children.length > 0 ? center.insertBefore(this.centerCurDom, center.children[0]) : center.appendChild(this.centerCurDom)\n center.appendChild(this.centerDurDom)\n }\n\n afterPlayerInit () {\n const { config } = this\n if (this.duration === Infinity || this.playerConfig.isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n }\n if (config.hide) {\n this.hide()\n return\n }\n this.show()\n }\n\n changeLiveState (isLive) {\n if (isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n Util.show(this.find('.time-separator'))\n Util.show(this.durationDom)\n Util.show(this.timeDom)\n }\n }\n\n updateTime (time) {\n this.isActiving = true\n if ((!time && time !== 0) || time > this.duration) {\n return\n }\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = Util.format(time)\n return\n }\n this.timeDom.innerHTML = Util.format(time)\n }\n\n resetActive () {\n const { player } = this\n const updateState = () => {\n this.isActiving = false\n }\n this.off(Events.SEEKED, updateState)\n if (player.isSeeking) {\n this.once(Events.SEEKED, updateState)\n } else {\n this.isActiving = false\n }\n }\n\n destroy () {\n const { center } = this.player.controls\n this.centerCurDom && center.removeChild(this.centerCurDom)\n this.centerCurDom = null\n this.centerDurDom && center.removeChild(this.centerDurDom)\n this.centerDurDom = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n 00:00\n /\n 00:00\n ${this.i18n.LIVE_TIP}\n `\n }\n}\nexport default Time\n","import Plugin, { Util, Events, Sniffer, POSITIONS } from '../../plugin'\nimport volumeLargeSvg from '../assets/volumeLarge.svg'\nimport volumeSmallSvg from '../assets/volumeSmall.svg'\nimport volumeMutedSvg from '../assets/volumeMuted.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string, // [可选]插件挂载的dom\n * index?: number // [可选]插件在播放器中挂载的位置\n * disable?: boolean, // [可选]是否禁用插件交互行为\n * showValueLabel?: boolean, // [可选]是否显示当前滑动的音量数值\n * default?: number // [可选]默认\n * [propName: string]: any\n * }} IVolumeConfig\n */\n\nclass Volume extends Plugin {\n static get pluginName () {\n return 'volume'\n }\n\n /**\n * @type IVolumeConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT, // [可选]插件挂载的dom\n index: 1, // [可选]插件在播放器中挂载的位置\n disable: false, // [可选]是否禁用插件交互行为\n showValueLabel: false, // [可选]是否显示当前滑动的音量数值\n default: 0.6, // [可选]默认音量\n miniVolume: 0.2 // 静音恢复的时候最小音量\n }\n }\n\n registerIcons () {\n return {\n volumeSmall: { icon: volumeSmallSvg, class: 'xg-volume-small' },\n volumeLarge: { icon: volumeLargeSvg, class: 'xg-volume' },\n volumeMuted: { icon: volumeMutedSvg, class: 'xg-volume-mute' }\n }\n }\n\n afterCreate () {\n this._timerId = null\n if (this.config.disable) {\n return\n }\n\n this.initIcons()\n\n const { commonStyle, volume } = this.playerConfig\n if (commonStyle.volumeColor) {\n this.find('.xgplayer-drag').style.backgroundColor = commonStyle.volumeColor\n }\n this.changeMutedHandler = this.hook('mutedChange', (e) => {\n this.changeMuted(e)\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n if (!(Sniffer.device === 'mobile') && !this.playerConfig.isMobileSimulateMode) {\n this.bind('mouseenter', this.onMouseenter)\n\n this.bind(['blur', 'mouseleave'], this.onMouseleave)\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 slider = this.find('.xgplayer-slider')\n const bar = this.find('.xgplayer-bar')\n slider.focus()\n Util.event(e)\n\n const barRect = bar.getBoundingClientRect()\n const pos = Util.getEventPos(e, player.zoom)\n const height = barRect.height - (pos.clientY - barRect.top)\n pos.h = height\n pos.barH = barRect.height\n this.pos = pos\n // 差值小于0,说明点击的不是音量滑块位置 不做响应\n if (height < -2) {\n return\n }\n this.updateVolumePos(height, e)\n document.addEventListener('mouseup', this.onBarMouseUp)\n this.isStart = true\n return false\n }\n\n onBarMouseMove = (e) => {\n if (!this.isStart) {\n return\n }\n const { pos, player } = this\n e.preventDefault()\n e.stopPropagation()\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n this.isMoving = true\n const w = pos.h - _ePos.clientY + pos.clientY\n if (w > pos.barH) {\n return\n }\n this.updateVolumePos(w, e)\n }\n\n onBarMouseUp = (e) => {\n Util.event(e)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n this.isStart = false\n this.isMoving = false\n }\n\n updateVolumePos (height, event) {\n const { player } = this\n const drag = this.find('.xgplayer-drag')\n const bar = this.find('.xgplayer-bar')\n if (!bar || !drag) {\n return\n }\n const now = parseInt(height / bar.getBoundingClientRect().height * 1000, 10)\n drag.style.height = `${height}px`\n const to = Math.max(Math.min(now / 1000, 1), 0)\n const props = {\n volume: {\n from: player.volume,\n to\n }\n }\n if (player.muted) {\n props.muted = {\n from: true,\n to: false\n }\n }\n this.emitUserAction(event, 'change_volume', { muted: player.muted, volume: player.volume, props })\n player.volume = Math.max(Math.min(now / 1000, 1), 0)\n player.muted && (player.muted = false)\n\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n\n /**\n * 修改音量数值标签\n *\n * @memberof Volume\n */\n updateVolumeValue () {\n const { volume, muted } = this.player\n const $labelValue = this.find('.xgplayer-value-label')\n const vol = Math.max(Math.min(volume, 1), 0)\n\n $labelValue.innerText = muted ? 0 : Math.ceil(vol * 100)\n }\n\n onMouseenter = (e) => {\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n Util.addClass(this.root, 'slide-show')\n }\n\n onMouseleave = (e) => {\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this._timerId = Util.setTimeout(this, () => {\n Util.removeClass(this.root, 'slide-show')\n this.isStart && this.onBarMouseUp(e)\n this._timerId = null\n }, 200)\n }\n\n changeMuted (e) {\n // e.preventDefault()\n e && e.stopPropagation()\n const { player } = this\n // 取消bar的状态\n this.isStart && this.onBarMouseUp(e)\n this.emitUserAction(e, 'change_muted', {\n muted: player.muted,\n volume: player.volume,\n props: {\n muted: {\n from: player.muted,\n to: !player.muted\n }\n }\n })\n if (player.volume > 0) {\n player.muted = !player.muted\n }\n if (player.volume < 0.01) {\n player.volume = this.config.miniVolume\n }\n }\n\n onVolumeChange = (e) => {\n if (!this.player) {\n return\n }\n const { muted, volume } = this.player\n if (!this.isMoving) {\n this.find('.xgplayer-drag').style.height = muted || volume === 0 ? '4px' : `${volume * 100}%`\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n this.animate(muted, volume)\n }\n\n animate (muted, volume) {\n if (muted || volume === 0) {\n this.setAttr('data-state', 'mute')\n } else if (volume < 0.5 && this.icons.volumeSmall) {\n this.setAttr('data-state', 'small')\n } else {\n this.setAttr('data-state', 'normal')\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.volumeSmall)\n this.appendChild('.xgplayer-icon', icons.volumeLarge)\n this.appendChild('.xgplayer-icon', icons.volumeMuted)\n }\n\n destroy () {\n this.unbind('mouseenter', this.onMouseenter)\n\n this.unbind(['blur', 'mouseleave'], this.onMouseleave)\n\n this.unbind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.unbind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.unbind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.changeMutedHandler)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const volume = this.config.default || this.player.volume\n const isShowVolumeValue = this.config.showValueLabel\n return `\n \n
\n
\n \n ${isShowVolumeValue ? `
${volume * 100}
` : ''}\n
\n \n
\n
\n
`\n }\n}\nexport default Volume\n","import Plugin, { POSITIONS, Util } from '../../plugin'\nimport { Events } from '../../plugin/basePlugin'\nimport RotateSvg from '../assets/rotate.svg'\nimport './index.scss'\n\nexport default class Rotate extends Plugin {\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 this.appendChild('.xgplayer-icon', this.icons.rotate)\n this.onBtnClick = this.onBtnClick.bind(this)\n this.bind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n // 全屏/css全屏/容器宽高发生变化 需要重新计算\n this.on(Events.VIDEO_RESIZE, () => {\n // console.log('Events.VIDEO_RESIZE')\n if (this.rotateDeg) {\n Util.setTimeout(this, () => {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }, 100)\n }\n })\n if (this.rotateDeg) {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }\n }\n\n destroy () {\n this.unbind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n }\n\n onBtnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'rotate')\n this.rotate(this.config.clockwise, this.config.innerRotate, 1)\n }\n\n updateRotateDeg (rotateDeg, innerRotate) {\n const player = this.player\n if (!rotateDeg) {\n rotateDeg = 0\n }\n const { root, innerContainer, video } = this.player\n const width = root.offsetWidth\n const height = innerContainer && innerRotate ? innerContainer.offsetHeight : root.offsetHeight\n let rWidth = '100%'\n let rHeight = '100%'\n let x = 0\n let y = 0\n if (rotateDeg === 0.75 || rotateDeg === 0.25) {\n rWidth = `${height}px`\n rHeight = `${width}px`\n x = -(height - width) / 2\n y = -(width - height) / 2\n }\n const _transform = `translate(${x}px,${y}px) rotate(${rotateDeg}turn)`\n const _styles = {\n transformOrigin: 'center center',\n transform: _transform,\n webKitTransform: _transform,\n height: rHeight,\n width: rWidth\n }\n\n const _target = innerRotate ? video : root\n const poster = innerRotate ? player.getPlugin('poster') : null\n Object.keys(_styles).map(key => {\n _target.style[key] = _styles[key]\n poster && poster.root && (poster.root.style[key] = _styles[key])\n })\n }\n\n rotate (clockwise = false, innerRotate = true, times = 1) {\n const player = this.player\n if (!this.rotateDeg) {\n this.rotateDeg = 0\n }\n const factor = clockwise ? 1 : -1\n\n this.rotateDeg = (this.rotateDeg + 1 + factor * 0.25 * times) % 1\n this.updateRotateDeg(this.rotateDeg, innerRotate)\n player.emit(Events.ROTATE, this.rotateDeg * 360)\n }\n\n registerIcons () {\n return {\n rotate: RotateSvg\n }\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n \n
\n
\n
\n ${this.i18n.ROTATE_TIPS}\n
\n
`\n }\n}\n","import Plugin, { Events, Util, POSITIONS } from '../../plugin'\nimport PipIcon from '../assets/pipIcon.svg'\nimport PipIconExit from '../assets/pipIconExit.svg'\nimport './index.scss'\n\n/**\n * @description picture-in-picture plugin\n * @doc https://www.w3.org/TR/picture-in-picture/\n * @doc https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n */\n\nconst PresentationMode = {\n PIP: 'picture-in-picture',\n INLINE: 'inline',\n FULLSCREEN: 'fullscreen'\n}\n\nclass PIP extends Plugin {\n static get pluginName () {\n return 'pip'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n showIcon: false\n }\n }\n\n static checkWebkitSetPresentationMode (video) {\n return typeof video.webkitSetPresentationMode === 'function'\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.pip === 'boolean') {\n args.config.showIcon = args.player.config.pip\n }\n }\n\n afterCreate () {\n // 非可用状态不做初始化\n if (!this.isPIPAvailable()) {\n return\n }\n this.pMode = PresentationMode.INLINE\n this.initPipEvents()\n // 确认开启按钮的情况下才初始化按钮\n if (this.config.showIcon) {\n this.initIcons()\n }\n // video初始化之后再做判断是否显示\n this.once(Events.COMPLETE, () => {\n if (this.config.showIcon) {\n Util.removeClass(this.find('.xgplayer-icon'), 'xg-icon-disable')\n this.bind('click', this.switchPIP)\n }\n })\n }\n\n registerIcons () {\n return {\n pipIcon: { icon: PipIcon, class: 'xg-get-pip' },\n pipIconExit: { icon: PipIconExit, class: 'xg-exit-pip' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.pipIcon)\n this.appendChild('.xgplayer-icon', icons.pipIconExit)\n }\n\n initPipEvents () {\n const { player } = this\n this.leavePIPCallback = () => {\n // 处理点击x关闭画中画的时候暂停问题\n const paused = player.paused\n Util.setTimeout(this, () => {\n // 使用videoPlay避免多次触发 playhooks\n !paused && player.videoPlay()\n }, 0)\n !paused && player.videoPlay()\n this.setAttr('data-state', 'normal')\n player.emit(Events.PIP_CHANGE, false)\n }\n\n this.enterPIPCallback = (e) => {\n player.emit(Events.PIP_CHANGE, true)\n this.pipWindow = e.pictureInPictureWindow\n this.setAttr('data-state', 'pip')\n }\n\n this.onWebkitpresentationmodechanged = (e) => {\n const mode = player.video.webkitPresentationMode\n // 如果在全屏下进入了该逻辑,调用退出全屏处理\n if (this.pMode === PresentationMode.FULLSCREEN && mode !== PresentationMode.FULLSCREEN) {\n player.onFullscreenChange(null, false)\n }\n this.pMode = mode\n if (mode === PresentationMode.PIP) {\n this.enterPIPCallback(e)\n } else if (mode === PresentationMode.INLINE) {\n this.leavePIPCallback(e)\n }\n }\n\n if (player.video) {\n player.video.addEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.video.addEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.video) && player.video.addEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n }\n }\n\n switchPIP = (e) => {\n if (!this.isPIPAvailable()) {\n return false\n }\n e.stopPropagation()\n if (this.isPip) {\n this.exitPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: true, to: false })\n this.setAttr('data-state', 'normal')\n } else if (this.player.video.readyState === 4) {\n this.requestPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: false, to: true })\n this.setAttr('data-state', 'pip')\n }\n }\n\n /*\n * 进入画中画\n */\n requestPIP () {\n const { player, playerConfig } = this\n if (!this.isPIPAvailable() || this.isPip) {\n return\n }\n try {\n const { poster } = playerConfig\n if (poster) {\n player.video.poster = Util.typeOf(poster) === 'String' ? poster : poster.poster\n }\n PIP.checkWebkitSetPresentationMode(player.video) ? player.video.webkitSetPresentationMode('picture-in-picture') : player.video.requestPictureInPicture()\n return true\n } catch (reason) {\n console.error('requestPiP', reason)\n return false\n }\n }\n\n /**\n * 退出画中画\n */\n exitPIP () {\n const { player } = this\n try {\n if (this.isPIPAvailable() && this.isPip) {\n PIP.checkWebkitSetPresentationMode(player.video) ? player.video.webkitSetPresentationMode('inline') : document.exitPictureInPicture()\n }\n return true\n } catch (reason) {\n console.error('exitPIP', reason)\n return false\n }\n }\n\n get isPip () {\n const { player } = this\n return (document.pictureInPictureElement && document.pictureInPictureElement === player.video) || player.video.webkitPresentationMode === PresentationMode.PIP\n }\n\n isPIPAvailable () {\n const { video } = this.player\n const _isEnabled = Util.typeOf(document.pictureInPictureEnabled) === 'Boolean' ? document.pictureInPictureEnabled : true\n return _isEnabled &&\n ((Util.typeOf(video.disablePictureInPicture) === 'Boolean' && !video.disablePictureInPicture) ||\n (video.webkitSupportsPresentationMode && Util.typeOf(video.webkitSetPresentationMode) === 'Function'))\n }\n\n destroy () {\n const { player } = this\n player.video.removeEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.video.removeEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.video) && player.video.removeEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n this.exitPIP()\n this.unbind('click', this.btnClick)\n }\n\n render () {\n if (!this.config.showIcon || !this.isPIPAvailable()) {\n return\n }\n return `\n
\n
\n
${this.i18n.PIP}
\n
`\n }\n}\nexport default PIP\n","/**\n * 下一个按钮组件\n */\nimport Plugin, { POSITIONS, Sniffer, Events } from '../../plugin'\nimport Next from '../assets/playNext.svg'\nimport './index.scss'\n\nexport default class PlayNextIcon extends Plugin {\n static get pluginName () {\n return 'playNext'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 1,\n url: null,\n urlList: []\n }\n }\n\n constructor (options) {\n super(options)\n this.idx = -1\n }\n\n afterCreate () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.playNext)\n this.initEvents()\n }\n\n registerIcons () {\n return {\n playNext: Next\n }\n }\n\n initEvents () {\n this.nextHandler = this.hook('nextClick', this.changeSrc)\n const event = Sniffer.device === 'mobile' ? 'touchend' : 'click'\n this.bind(event, this.playNext)\n this.show()\n }\n\n playNext = (e) => {\n const { player } = this\n e.preventDefault()\n e.stopPropagation()\n if (this.idx + 1 < this.config.urlList.length) {\n this.idx++\n this.nextHandler(this.config.urlList[this.idx], this.idx)\n player.emit(Events.PLAYNEXT, this.idx + 1)\n } else {\n this.nextHandler()\n player.emit(Events.PLAYNEXT)\n }\n }\n\n changeSrc (url) {\n const { player } = this\n if (!url) {\n return\n }\n player.pause()\n player.currentTime = 0\n if (player.switchURL) {\n player.switchURL(url)\n } else {\n player.src = url\n }\n player.config.url = url\n player.play()\n }\n\n destroy () {\n this.unbind(['touchend', 'click'], this.playNext)\n }\n\n render () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n return `\n \n
\n
\n
${this.i18n.PLAYNEXT_TIPS}
\n
\n `\n }\n}\n","//download.js v4.2, by dandavis; 2008-2016. [MIT] see http://danml.com/download.html for tests/usage\n// v1 landed a FF+Chrome compat way of downloading strings to local un-named files, upgraded to use a hidden frame and optional mime\n// v2 added named files via a[download], msSaveBlob, IE (10+) support, and window.URL support for larger+faster saves than dataURLs\n// v3 added dataURL and Blob Input, bind-toggle arity, and legacy dataURL fallback was improved with force-download mime and base64 support. 3.1 improved safari handling.\n// v4 adds AMD/UMD, commonJS, and plain browser support\n// v4.1 adds url download capability via solo URL argument (same domain/CORS only)\n// v4.2 adds semantic variable names, long (over 2MB) dataURL support, and hidden by default temp anchors\n// https://github.com/rndme/download\n\n(function (root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([], factory);\n\t} else if (typeof exports === 'object') {\n\t\t// Node. Does not work with strict CommonJS, but\n\t\t// only CommonJS-like environments that support module.exports,\n\t\t// like Node.\n\t\tmodule.exports = factory();\n\t} else {\n\t\t// Browser globals (root is window)\n\t\troot.download = factory();\n }\n}(this, function () {\n\n\treturn function download(data, strFileName, strMimeType) {\n\n\t\tvar self = window, // this script is only for browsers anyway...\n\t\t\tdefaultMime = \"application/octet-stream\", // this default mime also triggers iframe downloads\n\t\t\tmimeType = strMimeType || defaultMime,\n\t\t\tpayload = data,\n\t\t\turl = !strFileName && !strMimeType && payload,\n\t\t\tanchor = document.createElement(\"a\"),\n\t\t\ttoString = function(a){return String(a);},\n\t\t\tmyBlob = (self.Blob || self.MozBlob || self.WebKitBlob || toString),\n\t\t\tfileName = strFileName || \"download\",\n\t\t\tblob,\n\t\t\treader;\n\t\t\tmyBlob= myBlob.call ? myBlob.bind(self) : Blob ;\n\t \n\t\tif(String(this)===\"true\"){ //reverse arguments, allowing download.bind(true, \"text/xml\", \"export.xml\") to act as a callback\n\t\t\tpayload=[payload, mimeType];\n\t\t\tmimeType=payload[0];\n\t\t\tpayload=payload[1];\n\t\t}\n\n\n\t\tif(url && url.length< 2048){ // if no filename and no mime, assume a url was passed as the only argument\n\t\t\tfileName = url.split(\"/\").pop().split(\"?\")[0];\n\t\t\tanchor.href = url; // assign href prop to temp anchor\n\t\t \tif(anchor.href.indexOf(url) !== -1){ // if the browser determines that it's a potentially valid url path:\n \t\tvar ajax=new XMLHttpRequest();\n \t\tajax.open( \"GET\", url, true);\n \t\tajax.responseType = 'blob';\n \t\tajax.onload= function(e){ \n\t\t\t\t download(e.target.response, fileName, defaultMime);\n\t\t\t\t};\n \t\tsetTimeout(function(){ ajax.send();}, 0); // allows setting custom ajax headers using the return:\n\t\t\t return ajax;\n\t\t\t} // end if valid url?\n\t\t} // end if url?\n\n\n\t\t//go ahead and download dataURLs right away\n\t\tif(/^data:([\\w+-]+\\/[\\w+.-]+)?[,;]/.test(payload)){\n\t\t\n\t\t\tif(payload.length > (1024*1024*1.999) && myBlob !== toString ){\n\t\t\t\tpayload=dataUrlToBlob(payload);\n\t\t\t\tmimeType=payload.type || defaultMime;\n\t\t\t}else{\t\t\t\n\t\t\t\treturn navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs:\n\t\t\t\t\tnavigator.msSaveBlob(dataUrlToBlob(payload), fileName) :\n\t\t\t\t\tsaver(payload) ; // everyone else can save dataURLs un-processed\n\t\t\t}\n\t\t\t\n\t\t}else{//not data url, is it a string with special needs?\n\t\t\tif(/([\\x80-\\xff])/.test(payload)){\t\t\t \n\t\t\t\tvar i=0, tempUiArr= new Uint8Array(payload.length), mx=tempUiArr.length;\n\t\t\t\tfor(i;i {\n if (this.isLock) {\n return\n }\n this.emitUserAction(e, 'download')\n const url = this.getAbsoluteURL(this.player.src)\n downloadUtil(url)\n this.isLock = true\n this.timer = window.setTimeout(() => {\n this.isLock = false\n window.clearTimeout(this.timer)\n this.timer = null\n }, 300)\n }\n\n getAbsoluteURL (url) {\n // Check if absolute URL\n if (!url.match(/^https?:\\/\\//)) {\n const div = document.createElement('div')\n div.innerHTML = `x`\n url = div.firstChild.href\n }\n return url\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.download)\n window.clearTimeout(this.timer)\n this.timer = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n
\n
\n
${this.i18n.DOWNLOAD_TIPS}
\n
`\n }\n}\n","import Plugin, { POSITIONS, Events } from '../../plugin'\nimport './index.scss'\n\nexport default class ScreenShot extends Plugin {\n static get pluginName () {\n return 'screenShot'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 5,\n quality: 0.92,\n type: 'image/png',\n format: '.png',\n width: 600,\n height: 337,\n fitVideo: true,\n disable: false,\n name: 'screenshot'\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.screenShot === 'boolean') {\n args.config.disable = !args.player.config.screenShot\n }\n }\n\n afterCreate () {\n this.appendChild('.xgplayer-icon', this.icons.screenshotIcon)\n const { config } = this\n this.initSize = (data) => {\n if (config.fitVideo) {\n config.width = data.vWidth\n config.height = data.vHeight\n }\n }\n this.once(Events.VIDEO_RESIZE, this.initSize)\n }\n\n onPluginsReady () {\n this.show()\n this.onClickBtn = this.onClickBtn.bind(this)\n this.bind(['click', 'touchend'], this.onClickBtn)\n }\n\n saveScreenShot (data, filename) {\n const saveLink = document.createElement('a')\n saveLink.href = data\n saveLink.download = filename\n const event = document.createEvent('MouseEvents')\n event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)\n saveLink.dispatchEvent(event)\n }\n\n createCanvans (width, height) {\n const canvas = document.createElement('canvas')\n this.canvasCtx = canvas.getContext('2d')\n this.canvas = canvas\n canvas.width = width || this.config.width\n canvas.height = height || this.config.height\n }\n\n onClickBtn (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'shot')\n this.shot().then((data) => {\n this.emit(Events.SCREEN_SHOT, data)\n this.saveScreenShot(data, this.config.name + this.config.format)\n })\n }\n\n shot (width, height, option = { quality: 0.92, type: 'image/png' }) {\n const { config, player } = this\n const quality = option.quality || config.quality\n const type = option.type || config.type\n return new Promise((resolve, reject) => {\n if (!this.canvas) {\n this.createCanvans(width, height)\n } else {\n this.canvas.width = width || config.width\n this.canvas.height = height || config.height\n }\n this.canvasCtx.drawImage(player.video, 0, 0, width || config.width, height || config.height)\n let src = this.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 this.unbind(['click', 'touchend'], this.onClickBtn)\n this.off(Events.VIDEO_RESIZE, this.initSize)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const className = this.icons.screenshotIcon ? 'xgplayer-icon' : 'xgplayer-icon btn-text'\n const langKey = 'SCREENSHOT'\n return `\n \n
\n ${this.icons.screenshotIcon ? '' : `${this.i18n[langKey]}`} \n
\n
`\n }\n}\n","import Plugin, { Util, Sniffer } from '../../plugin'\n\nexport default class OptionList {\n constructor (args) {\n this.config = args.config\n this.parent = args.root\n this.root = Util.createDom('ul', '', {}, `xg-options-list ${this.config.className}`)\n args.root.appendChild(this.root)\n this.onItemClick = this.onItemClick.bind(this)\n this.renderItemList()\n const eventName = Sniffer.device === 'mobile' ? 'touchend' : 'click'\n this._delegates = Plugin.delegate.call(this, this.root, 'li', eventName, this.onItemClick)\n }\n\n renderItemList (data) {\n const { config, root } = this\n if (data) {\n config.data = data\n } else {\n data = config.data\n }\n\n if (config.style) {\n Object.keys(config.style).map(key => {\n root.style[key] = config[key]\n })\n }\n\n if (data.length > 0) {\n this.attrKeys = Object.keys(data[0])\n }\n\n this.root.innerHTML = ''\n\n data.map((item, index) => {\n const className = item.selected ? 'option-item selected' : 'option-item'\n item['data-index'] = index\n this.root.appendChild(Util.createDom('li', `${item.showText}`, item, className))\n })\n }\n\n onItemClick (e) {\n if (!e.delegateTarget) {\n e.delegateTarget = e.target\n }\n const target = e.delegateTarget\n if (target && Util.hasClass(target, 'selected')) {\n return false\n }\n const changeCallback = typeof this.config.onItemClick === 'function' ? this.config.onItemClick : null\n const curSelected = this.root.querySelector('.selected')\n Util.addClass(target, 'selected')\n curSelected && Util.removeClass(curSelected, 'selected')\n changeCallback(e, {\n from: curSelected ? this.getAttrObj(curSelected, this.attrKeys) : null,\n to: this.getAttrObj(target, this.attrKeys)\n })\n }\n\n getAttrObj (dom, keys) {\n if (!dom || !keys) {\n return {}\n }\n const obj = {}\n keys.map(key => {\n obj[key] = dom.getAttribute(key)\n })\n const index = dom.getAttribute('data-index')\n if (index) {\n obj.index = Number(index)\n }\n return obj\n }\n\n show () {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'active')\n }\n\n hide () {\n Util.removeClass(this.root, 'active')\n Util.addClass(this.root, 'hide')\n }\n\n destroy () {\n if (this._delegates) {\n this._delegates.map(item => {\n item.destroy && item.destroy()\n })\n this._delegates = null\n }\n this.root.innerHTML = null\n this.parent.removeChild(this.root)\n this.root = null\n }\n}\n","\nimport Plugin, { Events, Util, Sniffer, POSITIONS } from '../../plugin'\nimport OptionList from './optionList'\nimport './optionsIcon.scss'\n\n/**\n * @typedef {{\n * isShow?: boolean,\n * index?: number,\n * list?: Array,\n * listType?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IOptionsIconConfig\n */\n\nconst IS_MOBILE = Sniffer.device === 'mobile'\nexport default class OptionsIcon extends Plugin {\n static get pluginName () {\n return 'optionsIcon'\n }\n\n /**\n * @type { IOptionsIconConfig }\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 100,\n list: [],\n listType: 'middle', // 模式 rightSide-右侧边栏 middle-中间显示\n listStyle: {},\n hidePortrait: true,\n isShowIcon: false\n }\n }\n\n constructor (args) {\n super(args)\n this.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 if (IS_MOBILE && config.listType !== 'middle') {\n config.listType = 'rightSide'\n }\n\n config.hidePortrait && Util.addClass(this.root, 'portrait')\n\n this.once(Events.CANPLAY, () => {\n if (config.list && config.list.length > 0) {\n this.renderItemList(config.list)\n this.show()\n }\n })\n // 移动端控制栏和列表互斥\n IS_MOBILE && this.on(Events.PLAYER_FOCUS, () => {\n if (!this.isActive) {\n return\n }\n this.optionsList && this.optionsList.hide()\n this.isActive = false\n })\n this.activeEvent = IS_MOBILE ? 'touchend' : 'mouseenter'\n this.onEnter = this.onEnter.bind(this)\n this.onLeave = this.onLeave.bind(this)\n this.bind(this.activeEvent, this.onEnter)\n this.bind('mouseleave', this.onLeave)\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 if (typeof item[key] === 'object') {\n return item[key][lang] || item[key].zh\n } else {\n return item[key] || ''\n }\n }\n\n onEnter (e) {\n e.preventDefault()\n e.stopPropagation()\n this.onToggle(true)\n }\n\n onLeave (e) {\n e.preventDefault()\n e.stopPropagation()\n this.isActive && this.onToggle(false)\n }\n\n // 状态切换\n onToggle (isActive) {\n if (this.isActive === isActive) return\n const { controls } = this.player\n const { listType } = this.config\n if (isActive) {\n listType === 'rightSide' ? controls.blur() : controls.focus()\n this.optionsList && this.optionsList.show()\n } else {\n listType === 'rightSide' ? controls.focus() : controls.focusAwhile()\n this.optionsList && this.optionsList.hide()\n }\n this.isActive = isActive\n }\n\n // 列表点击回调\n onItemClick (e, data) {\n e.preventDefault()\n e.stopPropagation()\n const { listType, list } = this.config;\n (IS_MOBILE || listType === 'rightSide') && this.onToggle(false)\n this.curIndex = data.to.index\n this.curItem = list[this.curIndex]\n this.changeCurrentText()\n this.onToggle(false)\n }\n\n changeCurrentText () {\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n if (!curItem) return\n this.find('.icon-text').innerHTML = this.getTextByLang(curItem, 'iconText')\n }\n\n renderItemList (itemList, curIndex) {\n const { config, optionsList, player } = this\n if (typeof curIndex === 'number') {\n this.curIndex = curIndex\n this.curItem = config.list[curIndex]\n }\n\n if (optionsList) {\n optionsList.renderItemList(itemList)\n this.changeCurrentText()\n return\n }\n\n const options = {\n config: {\n data: itemList || [],\n className: config.listType === 'rightSide' ? 'right-side' : '',\n onItemClick: (e, data) => {\n this.onItemClick(e, data)\n }\n },\n root: config.listType === 'rightSide' ? player.root : this.root\n }\n\n if (this.config.isShowIcon) {\n this.optionsList = new OptionList(options)\n this.changeCurrentText()\n this.show()\n }\n }\n\n destroy () {\n this.unbind(this.activeEvent, this.onToggle)\n this.unbind('mouseleave', this.onToggle)\n if (this.optionsList) {\n this.optionsList.destroy()\n this.optionsList = null\n }\n }\n\n render () {\n if (!this.config.isShowIcon) {\n return\n }\n return `\n
\n \n
\n
`\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {{\n * text?: string,\n * definition?: any,\n * url: any,\n * text: string | {\n * [propName: string]: any\n * },\n * iconText: string | {\n * [propName: string]: any\n * }\n * }} IDefinition\n */\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array,\n * defaultDefinition?: any,\n * disable?: any,\n * hidePortrait?: boolean,\n * className?: string\n * }} IDefinitionConfig\n */\nexport default class DefinitionIcon extends OptionsIcon {\n static get pluginName () {\n return 'definition'\n }\n\n /**\n * @type IDefinitionConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n list: [],\n defaultDefinition: '',\n disable: false,\n hidePortrait: false, // Whether to hide in the vertical screen state of the mobile terminal\n className: 'xgplayer-definition',\n isShowIcon: true\n }\n }\n\n beforeCreate (args) {\n const { list } = args.config\n if (Array.isArray(list) && list.length > 0) {\n args.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n }\n }\n\n constructor (args) {\n super(args)\n // 记录切换的时候的播放器状态\n this.curTime = 0\n this.isPaused = true\n }\n\n afterCreate () {\n super.afterCreate()\n this.on('resourceReady', (list) => {\n this.changeDefinitionList(list)\n })\n\n this.on(Events.DEFINITION_CHANGE, (data) => {\n this.renderItemList(this.config.list, data.to)\n })\n if (this.player.definitionList.length < 2) {\n this.hide()\n }\n }\n\n initDefinition () {\n const { list, defaultDefinition } = this.config\n if (list.length > 0) {\n let to = null\n list.map(item => {\n if (item.definition === defaultDefinition) {\n to = item\n }\n })\n if (!to) {\n to = list[0]\n }\n this.changeDefinition(to)\n }\n }\n\n renderItemList (list = this.config.list || [], to) {\n const targetDef = to && to.definition ? to.definition : this.config.defaultDefinition\n if (to) {\n list.forEach((item) => {\n item.selected = false\n })\n }\n let curIndex = 0\n const items = list.map((item, index) => {\n const showItem = {\n url: item.url,\n definition: item.definition || '',\n showText: this.getTextByLang(item) || item.definition,\n selected: false\n }\n if (item.selected || (item.definition && item.definition === targetDef)) {\n showItem.selected = true\n curIndex = index\n }\n return showItem\n })\n super.renderItemList(items, curIndex)\n }\n\n // 对外暴露 切换清晰度\n changeDefinitionList (list) {\n if (!Array.isArray(list)) {\n return\n }\n this.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n this.renderItemList()\n this.config.list.length < 2 ? this.hide() : this.show()\n }\n\n changeDefinition (to, from) {\n this.player.changeDefinition(to, from)\n }\n\n onItemClick (e, data) {\n super.onItemClick(...arguments)\n // const { player } = this\n // const target = e.delegateTarget\n // const url = target.getAttribute('url')\n this.emitUserAction(e, 'change_definition', { from: data.from, to: data.to })\n // player.emit(Events.BEFORE_DEFINITION_CHANGE, url)\n this.player.changeDefinition(data.to, data.from)\n // player.emit(Events.DEFINITION_CHANGE, { from: data.from, to: data.to })\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array,\n * className?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IPlaybackRateConfig\n */\n\nexport default class PlaybackRate extends OptionsIcon {\n static get pluginName () {\n return 'playbackRate'\n }\n\n /**\n * @type IPlaybackRateConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 4,\n list: [2, 1.5, 1, 0.75, 0.5],\n className: 'xgplayer-playbackrate',\n isShowIcon: true,\n hidePortrait: false\n }\n }\n\n constructor (args) {\n super(args)\n this.curRate = 1\n }\n\n beforeCreate (args) {\n const { playbackRate } = args.player.config\n const list = !playbackRate ? [] : Array.isArray(playbackRate) ? playbackRate : args.config.list\n if (Array.isArray(list)) {\n args.config.list = list.map(item => {\n if (typeof item === 'number') {\n item = {\n rate: item,\n text: `${item}x`\n }\n } else if (!item.text && item.rate) {\n item.text = `${item.rate}x`\n }\n return item\n })\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.on(Events.RATE_CHANGE, () => {\n if (this.curValue === this.player.playbackRate) {\n return\n }\n this.renderItemList()\n })\n this.renderItemList()\n }\n\n show () {\n if (!this.config.list || this.config.list.length === 0) {\n return\n }\n super.show()\n }\n\n onItemClick (e, data) {\n super.onItemClick(...arguments)\n const target = e.delegateTarget\n const rate = Number(target.getAttribute('rate'))\n if (!rate || rate === this.curValue) {\n return false\n }\n const props = {\n playbackRate: {\n from: this.player.playbackRate,\n to: rate\n }\n }\n this.emitUserAction(e, 'change_rate', { props })\n this.curValue = rate\n this.player.playbackRate = rate\n }\n\n renderItemList () {\n const playbackRate = this.player.playbackRate || 1\n this.curValue = playbackRate\n let curIndex = 0\n const items = this.config.list.map((item, index) => {\n const itemInfo = {\n rate: item.rate\n }\n if (itemInfo.rate === playbackRate) {\n itemInfo.selected = true\n curIndex = index\n }\n itemInfo.showText = this.getTextByLang(item)\n return itemInfo\n })\n super.renderItemList(items, curIndex)\n }\n\n destroy () {\n super.destroy()\n }\n}\n","import Plugin, { Events, POSITIONS } from '../../plugin'\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 Plugin {\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 afterCreate () {\n if (this.config.disable) {\n return\n }\n\n if (this.config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n this.initIcons()\n this.on(Events.CSS_FULLSCREEN_CHANGE, (isCssfullScreen) => {\n this.animate(isCssfullScreen)\n })\n this.btnClick = this.btnClick.bind(this)\n this.handleCssFullscreen = this.hook('cssFullscreen_change', this.btnClick, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this.handleCssFullscreen)\n }\n\n initIcons () {\n const { icons } = this\n const contentIcon = this.find('.xgplayer-icon')\n contentIcon.appendChild(icons.cssFullscreen)\n contentIcon.appendChild(icons.exitCssFullscreen)\n }\n\n btnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n const { isCssfullScreen } = this.player\n this.emitUserAction(e, 'switch_cssfullscreen', { cssfullscreen: isCssfullScreen })\n if (!isCssfullScreen) {\n this.player.getCssFullscreen()\n } else {\n this.player.exitCssFullscreen()\n }\n }\n\n animate (isFullScreen) {\n if (!this.root) {\n return\n }\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n this.switchTips(isFullScreen)\n }\n\n switchTips (isFullScreen) {\n const { i18nKeys } = this\n this.changeLangTextKey(this.find('.xg-tips'), isFullScreen ? i18nKeys.EXITCSSFULLSCREEN_TIPS : i18nKeys.CSSFULLSCREEN_TIPS)\n }\n\n registerIcons () {\n return {\n cssFullscreen: { icon: CssFullSceenSvg, class: 'xg-get-cssfull' },\n exitCssFullscreen: { icon: ExitCssFullSceenSvg, class: 'xg-exit-cssfull' }\n }\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n
\n
\n
${this.i18n.CSSFULLSCREEN_TIPS}
\n
`\n }\n}\n","import Plugin, { Events, Util } from '../../plugin'\nimport './index.scss'\n\nexport default class ErrorPlugin extends Plugin {\n static get pluginName () {\n return 'error'\n }\n\n afterCreate () {\n this.clickHandler = this.hook('errorRetry', this.errorRetry, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.onError = this.hook('showError', this.handleError)\n\n this.bind('.xgplayer-error-refresh', 'click', this.clickHandler)\n this.on(Events.CANPLAY, () => {\n this.handleCanPlay()\n })\n\n this.on(Events.ERROR, (error) => {\n this.onError(error)\n })\n }\n\n errorRetry (e) {\n this.emitUserAction(e, 'error_retry', {})\n this.player.retry()\n }\n\n handleCanPlay () {\n Util.removeClass(this.player.root, 'xgplayer-is-error')\n }\n\n handleError (error = {}) {\n const { player } = this\n const type = error.errorType\n let errorNote = player.errorNote ? this.i18n[player.errorNote] : ''\n if (!errorNote) {\n switch (type) {\n case 'decoder':\n errorNote = this.i18n.MEDIA_ERR_DECODE\n break\n case 'network':\n errorNote = this.i18n.MEDIA_ERR_NETWORK\n break\n default:\n errorNote = this.i18n.MEDIA_ERR_SRC_NOT_SUPPORTED\n }\n }\n this.find('.xgplayer-error-text').innerHTML = errorNote\n this.find('.xgplayer-error-tips').innerHTML = `${this.i18n.REFRESH_TIPS}${this.i18n.REFRESH}`\n }\n\n destroy () {\n this.unbind('.xgplayer-error-refresh', 'click', this.clickHandler)\n }\n\n render () {\n return `\n
\n \n \n
\n
`\n }\n}\n","import Plugin, { STATE_CLASS, Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * 消息组件\n */\nclass Prompt extends Plugin {\n static get pluginName () {\n return 'prompt'\n }\n\n static get defaultConfig () {\n return {\n interval: 3000,\n style: {},\n mode: 'arrow',\n autoHide: true,\n detail: {\n text: '',\n highlight: ''\n },\n onClick: () => {\n }\n }\n }\n\n afterCreate () {\n this.intervalId = 0\n this.customConfig = null\n this.bind('.highlight', ['click', 'touchend'], (e) => {\n if (this.config.onClick || this.customOnClick) {\n e.preventDefault()\n e.stopPropagation()\n this.customOnClick ? this.customOnClick(e) : this.config.onClick(e)\n }\n })\n\n this.player.showPrompt = (...args) => {\n this.show(...args)\n }\n\n this.player.hidePrompt = () => {\n this.hide()\n }\n }\n\n setStyle (style) {\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n }\n\n show (detail, config = {}, onClick = () => {}) {\n if (!detail) {\n return\n }\n this.customOnClick = onClick\n const { interval } = this.config\n if (this.intervalId) {\n clearTimeout(this.intervalId)\n this.intervalId = null\n }\n Util.addClass(this.root, 'show')\n config.mode === 'arrow' && Util.addClass(this.root, 'arrow')\n if (typeof detail === 'string') {\n this.find('.xgplayer-prompt-detail').innerHTML = detail\n } else {\n this.find('.xgplayer-prompt-detail').innerHTML = `${detail.text || ''}` + `${detail.highlight ? `${detail.highlight}` : ''}`\n }\n\n config.style && this.setStyle(config.style)\n\n const autoHide = typeof config.autoHide === 'boolean' ? config.autoHide : this.config.autoHide\n if (autoHide) {\n const hideinterval = config.interval || interval\n this.intervalId = setTimeout(() => {\n this.hide()\n }, hideinterval)\n }\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n Util.removeClass(this.root, 'arrow')\n this.root.removeAttribute('style')\n this.customOnClick = null\n }\n\n render () {\n return `\n \n `\n }\n}\n\nexport default Prompt\n","import { Util, Events } from '../../plugin'\n\nconst ISPOT = {\n time: 0, // 进度条在此时间戳打点 单位为s\n text: '', // 打点处的自定义文案\n id: 1, // 标记唯一标识,用于删除的时候索引\n duration: 1, // 进度条标识点的时长 默认1s【可选】单位为s\n color: '#fff', // 进度条标识点的显示颜色【可选】\n style: {}, // 指定样式\n width: 6,\n height: 6\n}\n\nfunction mergeISPOT (iSpot) {\n Object.keys(ISPOT).map(key => {\n if (iSpot[key] === undefined) {\n iSpot[key] = ISPOT[key]\n }\n })\n}\n\nconst APIS = {\n initDots () {\n this._ispots.map(item => {\n this.createDot(item, false)\n })\n this._ispotsInit = true\n },\n /**\n * 创建一个故事点\n * @param { object } iSpot\n * @param { boolean } isNew\n */\n createDot (iSpot, isNew = true) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (isNew) {\n mergeISPOT(iSpot)\n this._ispots.push(iSpot)\n }\n if (!this._ispotsInit && isNew) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n let className = `xgspot_${iSpot.id} xgplayer-spot`\n ret.isMini && (className += ' mini')\n const dotDom = Util.createDom('xg-spot', iSpot.template || '', {\n 'data-text': iSpot.text,\n 'data-time': iSpot.time,\n 'data-id': iSpot.id\n }, className)\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n progress.outer && progress.outer.appendChild(dotDom)\n },\n\n /**\n * 根据id查找节点\n * @param {string} id\n */\n findDot (id) {\n if (!this.player.plugins.progress) {\n return\n }\n const ret = this._ispots.filter((cur, index) => {\n return cur.id === id\n })\n return ret.length > 0 ? ret[0] : null\n },\n\n /**\n * 更新故事点\n * @param {any} iSpot\n * @param {boolean} needShow\n */\n updateDot (iSpot, needShow = false) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const dot = this.findDot(iSpot.id)\n if (dot) {\n Object.keys(iSpot).map(key => {\n dot[key] = iSpot[key]\n })\n }\n if (!this._ispotsInit) {\n return\n }\n const dotDom = progress.find(`xg-spot[data-id=\"${iSpot.id}\"]`)\n if (!dotDom) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n dotDom.setAttribute('data-text', iSpot.text)\n dotDom.setAttribute('data-time', iSpot.time)\n if (ret.isMini) {\n Util.addClass(dotDom, 'mini')\n } else {\n Util.removeClass(dotDom, 'mini')\n }\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n if (needShow) {\n this.showDot(iSpot.id)\n }\n },\n\n /**\n * 删除某个故事点\n * @param {string | number } id\n */\n deleteDot (id) {\n const { _ispots } = this\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const del = []\n for (let i = 0; i < _ispots.length; i++) {\n if (_ispots[i].id === id) {\n del.push(i)\n }\n }\n const len = del.length\n for (let i = len - 1; i >= 0; i--) {\n _ispots.splice(del[i], 1)\n if (this._ispotsInit) {\n const dotDom = progress.find(`xg-spot[data-id=\"${id}\"]`)\n if (dotDom) {\n dotDom.parentElement.removeChild(dotDom)\n }\n }\n }\n },\n\n /**\n * 移除所有的故事点\n */\n deleteAllDots () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this._ispotsInit) {\n this._ispots = []\n return\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n for (let i = dotDoms.length - 1; i >= 0; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n this._ispots = []\n },\n /**\n * 批量全部更新当前故事点\n * @param {Array} iSpots\n */\n updateAllDots (iSpots = []) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this._ispotsInit) {\n this._ispots = iSpots\n return\n }\n this._ispots = []\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n const len = dotDoms.length\n if (len > iSpots.length) {\n for (let i = len - 1; i > iSpots.length - 1; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n }\n iSpots.map((ispot, index) => {\n if (index < len) {\n dotDoms[index].setAttribute('data-id', `${ispot.id}`)\n this._ispots.push(ispot)\n this.updateDot(ispot)\n } else {\n this.createDot(ispot)\n }\n })\n },\n\n getAllDotsDom () {\n const { progress } = this.player.plugins\n if (!progress) {\n return []\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n return dotDoms\n },\n\n getDotDom (id) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n return progress.find(`xg-spot[data-id=\"${id}\"]`)\n }\n}\n\nexport default function initDotsAPI (plugin) {\n const { config, player } = plugin\n Object.keys(APIS).map(item => {\n plugin[item] = APIS[item].bind(plugin)\n })\n const ispots = player.config.progressDot || config.ispots || []\n plugin._ispots = ispots.map(item => {\n mergeISPOT(item)\n return item\n })\n plugin._ispotsInit = false\n player.once(Events.DURATION_CHANGE, () => {\n plugin.initDots()\n })\n}\n","import Plugin, { Util, Sniffer } from '../../plugin'\nimport initDotsAPI from './dotsApi'\nimport './index.scss'\n\n/**\n * @typedef {{\n * miniWidth?: number, // 故事点显示最小宽度\n * ispots?: Array<{ //故事点列表\n * time?: number, // 进度条在此时间戳打点 单位为s\n * text?: string, // 打点处的自定义文案\n * id?: number | string, // 标记唯一标识,用于删除的时候索引\n * duration:? number, // 进度条标识点的时长 默认1s【可选】单位为s\n * color?: string, // 进度条标识点的显示颜色【可选】\n * style?: { [propName: string]: any }, // 指定样式\n * width?: number,\n * height?: number\n * }>,\n * defaultText?: '', // 故事点hover默认文案\n * isFocusDots?: true, //\n * isShowThumbnail?: true, // 是否显示预览图\n * isShowCoverPreview?: false, // 进度条拖动时是否显示播放区域预览图\n * mode?: 'short' | 'production', // short // production\n * [propName: string]: any\n * }} IProgressPreviewConfig\n */\n\nconst CALLBACK_MAP = {\n dragmove: 'onProgressMove',\n dragstart: 'onProgressDragStart',\n dragend: 'onProgressDragEnd',\n click: 'onProgressClick',\n mouseover: 'onProgressMouseOver'\n}\n\n/** */\nexport default class ProgressPreview extends Plugin {\n constructor (args) {\n super(args)\n this._ispots = []\n this.videoPreview = null\n this.videothumbnail = null\n this.thumbnail = null\n this._state = {\n now: 0,\n f: false\n }\n }\n\n static get pluginName () {\n return 'progresspreview'\n }\n\n /**\n * @type IProgressPreviewConfig\n */\n static get defaultConfig () {\n return {\n index: 1,\n miniWidth: 6, // 故事点显示最小宽度\n ispots: [], // 故事点列表\n defaultText: '', // 故事点hover默认文案\n isFocusDots: true, //\n isShowThumbnail: true, // 是否显示预览图\n isShowCoverPreview: false, // 进度条拖动时是否显示播放区域预览图\n mode: '' // short // production\n }\n }\n\n beforeCreate (args) {\n const progress = args.player.plugins.progress\n if (progress) {\n args.root = progress.root\n }\n }\n\n afterCreate () {\n this._curDot = null\n this.handlerSpotClick = this.hook('spotClick', (event, data) => {\n if (data.time) {\n this.player.seek(data.time)\n }\n })\n initDotsAPI(this)\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 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._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._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onDotMouseLeave = (e) => {\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 (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 this.updatePosition(data.offset, data.width, data.currentTime, data.e)\n }\n\n onProgressDragStart (data) {\n console.log('onProgressDragStart')\n this.isDrag = true\n this.videoPreview && Util.addClass(this.videoPreview, 'show')\n }\n\n onProgressDragEnd (data) {\n this.isDrag = false\n this.videoPreview && Util.removeClass(this.videoPreview, 'show')\n }\n\n onProgressClick (data, e) {\n if (Util.hasClass(e.target, 'xgplayer-spot')) {\n e.stopPropagation()\n e.preventDefault()\n const data = {};\n ['time', 'id', 'text'].map(key => {\n data[key] = e.target.getAttribute(`data-${key}`)\n })\n data.time && (data.time = Number(data.time))\n this.handlerSpotClick(e, data)\n }\n }\n\n updateLinePos (offset, cwidth) {\n const { root, previewLine, timePoint, player } = this\n const { mode } = player.controls\n const isflex = mode === 'flex'\n const lwidth = root.getBoundingClientRect().width\n const tWidth = timePoint.getBoundingClientRect().width\n let x = offset - lwidth / 2\n let _t, _tt\n if (x < 0 && !isflex) {\n x = 0\n _t = offset - lwidth / 2\n !this.thumbnail && (_tt = offset - lwidth / 2 - tWidth / 2)\n } else if (x > cwidth - lwidth && !isflex) {\n _t = x - (cwidth - lwidth)\n !this.thumbnail && (_tt = x - (cwidth - lwidth) - tWidth / 2)\n x = cwidth - lwidth\n } else {\n // _t = 0\n !this.thumbnail && (_tt = -tWidth / 2)\n }\n _t !== undefined ? (previewLine.style.transform = `translateX(${_t}px)`) : (previewLine.style.transform = '')\n _tt !== undefined ? (timePoint.style.transform = `translateX(${_tt}px)`) : (timePoint.style.transform = '')\n root.style.transform = `translateX(${x}px)`\n }\n\n updateTimeText (timeStr) {\n const { timeText, timePoint } = this\n timeText.textContent = timeStr\n !this.thumbnail && (timePoint.textContent = timeStr)\n }\n\n updatePosition (offset, cwidth, time, e) {\n const { root, config, _state } = this\n if (!root) {\n return\n }\n\n this.updateLinePos(offset, cwidth)\n // let now = offset / cwidth * player.duration\n // now = now < 0 ? 0 : (now > player.duration ? player.duration : now)\n _state.now = time\n const timeStr = Util.format(time)\n if (e && e.target && Util.hasClass(e.target, 'xgplayer-spot')) {\n this.showTips(e.target.getAttribute('data-text'), false, timeStr)\n this.focusDot(e.target)\n _state.f = true\n config.isFocusDots && _state.f && (_state.now = parseInt(e.target.getAttribute('data-time'), 10))\n } else if (config.defaultText) {\n _state.f = false\n this.showTips(config.defaultText, true, timeStr)\n } else {\n _state.f = false\n this.hideTips('')\n // this.blurDot()\n }\n this.updateTimeText(timeStr)\n this.updateThumbnails(_state.now)\n }\n\n updateThumbnails (time) {\n const { player, videoPreview } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, 160, 90)\n const rect = videoPreview && videoPreview.getBoundingClientRect()\n this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n changeThumbnail (thumbnailConfig = {}) {\n if (Sniffer.device === 'mobile') {\n return\n }\n const { player, config } = this\n const thumbnail = player.getPlugin('thumbnail')\n thumbnail.changeConfig(thumbnailConfig)\n\n if (!thumbnail || !thumbnail.usable || !config.isShowThumbnail) {\n Util.addClass(this.root, 'short-line no-thumbnail')\n const tRoot = this.find('.xg-spot-thumbnail')\n this.videoPreview && this.player.root.removeChild(this.videoPreview)\n this.thumbnail && tRoot.removeChild(this.thumbnail)\n this.videothumbnail = null\n this.thumbnail = null\n this._hasThumnail = false\n } else {\n Util.removeClass(this.root, 'short-line no-thumbnail')\n this._hasThumnail = true\n const tRoot = this.find('.xg-spot-thumbnail')\n this.videoPreview && this.player.root.removeChild(this.videoPreview)\n this.thumbnail && tRoot.removeChild(this.thumbnail)\n this.thumbnail = thumbnail.createThumbnail(tRoot, 'progress-thumbnail')\n if (config.isShowCoverPreview) {\n this.videoPreview = Util.createDom('xg-video-preview', '', {}, 'xgvideo-preview')\n player.root.appendChild(this.videoPreview)\n this.videothumbnail = thumbnail.createThumbnail(this.videoPreview, 'xgvideo-thumbnail')\n }\n }\n }\n\n registerThumbnail (thumbnailConfig = {}) {\n if (Sniffer.device === 'mobile') {\n return\n }\n const { player, config } = this\n const thumbnail = player.getPlugin('thumbnail')\n if (thumbnail) {\n Object.keys(thumbnailConfig).map(key => {\n thumbnail.config[key] = thumbnailConfig[key]\n })\n }\n if (!thumbnail || !thumbnail.usable || !config.isShowThumbnail) {\n Util.addClass(this.root, 'short-line no-thumbnail')\n return\n } else {\n Util.removeClass(this.root, 'short-line no-thumbnail')\n }\n this._hasThumnail = true\n const tRoot = this.find('.xg-spot-thumbnail')\n this.thumbnail = thumbnail.createThumbnail(tRoot, 'progress-thumbnail')\n if (config.isShowCoverPreview) {\n this.videoPreview = Util.createDom('xg-video-preview', '', {}, 'xgvideo-preview')\n player.root.appendChild(this.videoPreview)\n this.videothumbnail = thumbnail.createThumbnail(this.videoPreview, 'xgvideo-thumbnail')\n }\n }\n\n calcuPosition (time, duration) {\n const { progress } = this.player.plugins\n const { player } = this\n const totalWidth = progress.root.getBoundingClientRect().width\n const widthPerSeconds = player.duration / totalWidth * 6\n const ret = {}\n if (time + duration > player.duration) {\n duration = player.duration - time\n }\n ret.left = time / player.duration * 100\n ret.width = duration / player.duration\n ret.isMini = widthPerSeconds > duration\n return {\n left: time / player.duration * 100,\n width: duration / player.duration * 100,\n isMini: duration < widthPerSeconds\n }\n }\n\n showDot (id) {\n const dot = this.findDot(id)\n if (dot) {\n const rect = this.root.getBoundingClientRect()\n const { width } = rect\n const offset = dot.time / this.player.duration * width\n this.updatePosition(offset, width, dot.time)\n }\n }\n\n focusDot (target, id) {\n if (!target) {\n return\n }\n if (!id) {\n id = target.getAttribute('data-id')\n }\n Util.addClass(target, 'active')\n this._activeDotId = id\n }\n\n blurDot (target) {\n if (!target) {\n const id = this._activeDotId\n target = this.getDotDom(id)\n }\n if (!target) {\n return\n }\n Util.removeClass(target, 'active')\n this._activeDotId = null\n }\n\n showTips (text, isDefault, timeStr = '') {\n Util.addClass(this.root, 'no-timepoint')\n if (!text) {\n return\n }\n Util.addClass(this.find('.xg-spot-content'), 'show-text')\n if (isDefault && this.config.mode === 'production') {\n Util.addClass(this.root, 'product')\n this.tipText.textContent = text\n } else {\n Util.removeClass(this.root, 'product')\n this.tipText.textContent = this._hasThumnail ? text : `${timeStr} ${text}`\n }\n }\n\n hideTips () {\n Util.removeClass(this.root, 'no-timepoint')\n this.tipText.textContent = ''\n Util.removeClass(this.find('.xg-spot-content'), 'show-text')\n Util.removeClass(this.root, 'product')\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n show () {\n Util.removeClass(this.root, 'hide')\n }\n\n 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-content', 'mouseup', this.handlerPreviewClick)\n }\n\n render () {\n if (Sniffer.device === 'mobile' || this.playerConfig.isMobileSimulateMode) {\n return ''\n }\n\n return `
\n
\n
\n \n
\n
\n
\n
00:00
\n
\n
`\n }\n}\n","/* eslint-disable camelcase */\nimport BasePlugin, { Events, Util } from '../../plugin'\n/**\n * @typedef {{\n * isShow?: boolean,\n * urls?: Array, // 有多张大图就多个url\n * pic_num?: number, // 每张图含有几个雪碧图\n * col?: number, // 截图列数\n * row?: number, // 截图行数\n * height?: number, // 缩略图高度\n * width?: number, // 缩略图宽度\n * scale?: number, // 缩放\n * className?: string, // 额外添加在dom上的class\n * hidePortrait?: boolean, // 是否在竖屏的时候隐藏\n * [propName: string]: any\n * }} IThumbnailConfig\n */\nexport default class Thumbnail extends BasePlugin {\n static get pluginName () {\n return 'thumbnail'\n }\n\n /**\n * @type IThumbnailConfig\n */\n static get defaultConfig () {\n return {\n isShow: false,\n urls: [], // 有多张大图就多个url就好\n pic_num: 0, // 雪碧图总数\n col: 0, // 截图列数\n row: 0, // 截图行数\n width: 160, // 缩略图宽度\n height: 90, // 缩略图高度\n scale: 1, // 缩放\n className: '', // 额外添加在dom上的class\n hidePortrait: false // 是否在竖屏的时候隐藏\n }\n }\n\n constructor (args) {\n super(args)\n this.ratio = 1\n this.interval = -1 // 间隔,单位:秒\n this.preloadMark = {}\n }\n\n afterCreate () {\n if (this.usable) {\n this.initThumbnail()\n }\n\n this.on([Events.DURATION_CHANGE], () => {\n const { pic_num, interval } = this.config\n this.usable && (this.interval = interval > 0 ? interval : Math.round(this.player.duration * 1000 / pic_num) / 1000)\n })\n }\n\n get usable () {\n const { urls, pic_num } = this.config\n return urls && urls.length > 0 && pic_num > 0\n }\n\n initThumbnail () {\n const { width, height, pic_num, interval } = this.config\n this.ratio = width / height * 100\n // 单位:秒,精确到毫秒\n this.interval = interval > 0 ? interval : Math.round(this.player.duration * 1000 / pic_num) / 1000\n this.preload(0)\n // this.preIndex = new Array(urls.length)\n // this.interval = interval || Math.round(this.player.duration / pic_num)\n // this.ratio = width / height * 100\n // className && Util.addClass(this.root, className)\n // hidePortrait && Util.addClass(this.root, 'portrait')\n // width && (this.root.style.width = `${width}px`)\n // height && (this.root.style.height = `${height}px`)\n // this.root.style.backgroundSize = `${width * col}px auto`\n }\n\n getUrlByIndex (index) {\n return index >= 0 && index < this.config.urls.length ? this.config.urls[index] : ''\n }\n\n preload (index) {\n const { urls } = this.config\n const len = urls.length\n const arr = [index - 1, index, index + 1, index + 2]\n arr.map(item => {\n if (!this.preloadMark[item] && item >= 0 && item < len) {\n Util.preloadImg(urls[item])\n this.preloadMark[item] = true\n }\n })\n }\n\n getPosition (now, containerWidth = 0, containerHeight = 0) {\n const { pic_num, row, col, width, height } = this.config\n // this.interval = Math.round(this.player.duration * 1000 / pic_num) / 1000\n let index = Math.ceil(now / this.interval) // 当前时间对应的图像索引\n index = index > pic_num ? pic_num : index\n const urlIndex = index < row * col ? 0 : (Math.ceil(index / (row * col)) - 1)// 当前图像所在的url索引\n const indexInPage = index - urlIndex * (col * row) // 当前图像在当前url中的索引\n const rowIndex = indexInPage > 0 ? Math.ceil(indexInPage / col) - 1 : 0// 当前图像在当前url中的行索引\n const colIndex = indexInPage > 0 ? indexInPage - rowIndex * col - 1 : 0 // 当前图像在当前url中的列索引\n let swidth = 0 // containerWidth || width\n let sHeight = 0 // swidth * height / width\n\n // 根据入参的宽高适配样式\n if (containerWidth && containerHeight) {\n const per = containerWidth / containerHeight\n if (per < width / height) {\n swidth = containerWidth\n sHeight = swidth / (width / height)\n } else {\n sHeight = containerHeight\n swidth = sHeight * (width / height)\n }\n } else {\n swidth = containerWidth || width\n sHeight = swidth / (width / height)\n }\n const url = this.getUrlByIndex(urlIndex)\n return {\n urlIndex,\n rowIndex,\n colIndex,\n url,\n height: sHeight,\n width: swidth,\n style: {\n backgroundImage: `url(${url})`,\n backgroundSize: `${swidth * col}px auto`,\n backgroundPosition: `-${colIndex * swidth}px -${rowIndex * sHeight}px`,\n width: `${swidth}px`,\n height: `${sHeight}px`\n }\n }\n }\n\n update (dom, now, containerWidth = 0, containerHeight = 0, customStyle = {}) {\n const { pic_num, urls } = this.config\n if (pic_num < 1 || !urls || urls.length === 0) {\n return\n }\n const pos = this.getPosition(now, containerWidth, containerHeight)\n this.preload(pos.urlIndex)\n\n Object.keys(pos.style).map((key) => {\n dom.style[key] = pos.style[key]\n })\n Object.keys(customStyle).map(key => {\n dom.style[key] = customStyle[key]\n })\n }\n\n // 对外暴露 切换缩略图配置\n changeConfig (newConfig = {}) {\n Object.keys(newConfig).forEach(key => {\n typeof this.config[key] !== 'undefined' && (this.config[key] = newConfig[key])\n })\n\n if (this.usable) {\n this.initThumbnail()\n }\n }\n\n createThumbnail (root, className) {\n const dom = Util.createDom('xg-thumbnail', '', {}, `thumbnail ${className}`)\n root && root.appendChild(dom)\n return dom\n }\n}\n","import Plugin from '../../plugin'\nclass MiniProgress extends Plugin {\n static get pluginName () {\n return 'MiniProgress'\n }\n\n static get defaultConfig () {\n return {}\n }\n\n afterCreate () {\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!duration || !this.root) {\n return\n }\n if (data.cached) {\n this.find('xg-mini-progress-cache').style.width = `${data.cached / duration * 100}%`\n }\n if (data.played) {\n this.find('xg-mini-progress-played').style.width = `${data.played / duration * 100}%`\n }\n }\n\n render () {\n if (!this.playerConfig.progress || !this.playerConfig.miniprogress) {\n return\n }\n return `\n \n \n `\n }\n}\n\nexport default MiniProgress\n","import Plugin, { Events, Util, Sniffer } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nimport './index.scss'\n\nconst MODES = {\n REAL_TIME: 'realtime',\n FIRST_FRAME: 'firstframe',\n FRAME_RATE: 'framerate'\n}\n\nfunction nowTime () {\n try {\n return window.performance.now()\n } catch (e) {\n return new Date().getTime()\n }\n}\n/**\n * Check whether the current video object supports screenshots\n * @param { VideoElement } video\n * @returns\n */\nfunction checkVideoIsSupport (video) {\n if (Sniffer.browser === 'safari' && (/^blob/.test(video.currentSrc) || /^blob/.test(video.src))) {\n return false\n }\n\n return true\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 * [propName: string]: any\n * } } IDynamicBgConfig\n */\n\nlet isSupportCanvas = null\nclass DynamicBg extends Plugin {\n static get pluginName () {\n return 'dynamicBg'\n }\n\n /**\n * @type IDynamicBgConfig\n */\n static get defaultConfig () {\n return {\n isInnerRender: false,\n disable: true,\n /**\n * Rendering method\n * realtime - Realtime rendering\n * firstframe - Render only the first frame\n * framerate - Render by frame\n */\n mode: 'framerate',\n frameRate: 10, // Frame rate when mode=framerate\n filter: 'blur(50px)', // Filter settings\n addMask: true, // Whether need a mask\n maskBg: 'rgba(0,0,0,0.7)' // Mask background color\n }\n }\n\n /**\n * @type {boolean}\n * @description Does the current environment support Canvas\n */\n static get isSupport () {\n if (typeof isSupportCanvas === 'boolean') {\n return isSupportCanvas\n }\n isSupportCanvas = checkIsSupportCanvas()\n return isSupportCanvas\n }\n\n static supportCanvasFilter () {\n return !(Sniffer.browser === 'safari' || Sniffer.browser === 'firefox')\n }\n\n afterCreate () {\n if (this.playerConfig.dynamicBg === true) {\n this.config.disable = false\n }\n if (!DynamicBg.isSupport) {\n this.config.disable = true\n }\n const { disable, mode } = this.config\n if (disable) {\n return\n }\n /**\n * @private\n */\n this._pos = {\n width: 0,\n height: 0,\n rwidth: 0,\n rheight: 0,\n x: 0,\n y: 0\n }\n /**\n * @readonly\n */\n this.isStart = false\n /**\n * @readonly\n */\n this.videoPI = 0\n /**\n * @readonly\n */\n this.preTime = 0\n /**\n * @readonly\n */\n this.interval = parseInt(1000 / this.config.frameRate, 10)\n\n /**\n * @readonly\n */\n this.canvas = null\n /**\n * @readonly\n */\n this.canvasCtx = null\n\n this.once(Events.COMPLETE, () => {\n if (!this.player) {\n return\n }\n this.init()\n !this.player.paused && this.start()\n })\n\n this.once(Events.LOADED_DATA, this.onLoadedData)\n this.on(Events.URL_CHANGE, () => {\n this.once(Events.LOADED_DATA, this.onLoadedData)\n })\n if (mode !== MODES.FIRST_FRAME) {\n this.on(Events.PLAY, () => {\n this.start()\n })\n this.on(Events.PAUSE, () => {\n this.stop()\n })\n }\n\n // First frame rendering\n if (mode === MODES.FIRST_FRAME) {\n this.once(Events.TIME_UPDATE, () => {\n const { video } = this.player\n video && checkVideoIsSupport(video) && video.videoWidth && this.update(video, video.videoWidth, video.videoHeight)\n })\n }\n }\n\n onLoadedData = () => {\n if (!this.player) { return }\n const { video } = this.player\n this.videoPI = parseInt(video.videoWidth / video.videoHeight * 100, 10)\n }\n\n /**\n * @private\n */\n init () {\n const { player, config } = this\n this.canvasFilter = DynamicBg.supportCanvasFilter()\n try {\n // 保证节点插入到video之前\n const parent = !this.config.isInnerRender ? player.root : (player.innerContainer || player.root)\n parent.insertAdjacentHTML('afterbegin',\n `
\n
`)\n this.root = parent.children[0]\n this.canvas = this.find('canvas')\n // safari中canvas filter不生效\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 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 } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n start = () => {\n const { video } = this.player\n const _now = nowTime()\n if (!checkVideoIsSupport(video) || !this.canvasCtx) {\n return\n }\n this.stop()\n if (this.config.mode === MODES.REAL_TIME) {\n video && video.videoWidth && this.update(video, video.videoWidth, video.videoHeight)\n this.preTime = _now\n } else if (_now - this.preTime >= this.interval) {\n video && video.videoWidth && this.update(video, video.videoWidth, video.videoHeight)\n this.preTime = _now\n }\n // this.frameId = Util.requestAnimationFrame(this.start)\n this.frameId = window.setTimeout(() => {\n this.start()\n }, this.interval)\n }\n\n stop = () => {\n if (this.frameId) {\n // Util.cancelAnimationFrame(this.frameId)\n window.clearTimeout(this.frameId)\n this.frameId = null\n }\n }\n\n updateImg (url) {\n // TODO: 需要改造,使用domcss样式渲染,不再使用canvas渲染\n if (!url) {\n return\n }\n // Render using the image\n const { width, height } = this.canvas.getBoundingClientRect()\n let image = new window.Image()\n image.onload = () => {\n if (!this.canvas) {\n return\n }\n this.canvas.height = height\n this.canvas.width = width\n // this.update(image, image.width, image.height)\n image = null\n }\n image.src = url\n }\n\n update (video, videoWidth, videoHeight) {\n if (!this.canvas || !this.canvasCtx || !this.videoPI) {\n return\n }\n try {\n const { _pos, config } = this\n const { width, height } = this.canvas.getBoundingClientRect()\n this.videoPI = parseInt(videoWidth / videoHeight * 100, 10)\n if (width !== _pos.width || height !== _pos.height) {\n const pi = parseInt(width / height * 100, 10)\n _pos.width = this.canvas.width = width\n _pos.height = this.canvas.height = height\n let rheight = height\n let rwidth = width\n if (pi < this.videoPI) {\n rwidth = parseInt(height * this.videoPI / 100, 10)\n } else if (pi > this.videoPI) {\n rheight = parseInt(width * 100 / this.videoPI, 10)\n }\n if (pi < this.videoPI) {\n rwidth = parseInt(height * this.videoPI / 100, 10)\n } else if (pi > this.videoPI) {\n rheight = parseInt(width * 100 / this.videoPI, 10)\n }\n _pos.rwidth = rwidth * 1.2\n _pos.rheight = rheight * 1.2\n _pos.x = (width - _pos.rwidth) / 2\n _pos.y = (height - _pos.rheight) / 2\n }\n // console.log(`x:${_pos.x} y:${_pos.y} rwidth:${_pos.rwidth} rheight:${ _pos.rheight}`)\n this.canvasFilter && (this.canvasCtx.filter = config.filter)\n this.canvasCtx.drawImage(video, _pos.x, _pos.y, _pos.rwidth, _pos.rheight)\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n destroy () {\n this.stop()\n this.canvasCtx = null\n this.canvas = null\n }\n\n render () {\n return ''\n }\n}\n\nexport default DynamicBg\n","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 { 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 let blob = new Blob([JSON.stringify(stats)], { type: 'application/json' })\n let downloadUrl = window.URL.createObjectURL(blob)\n let link = document.createElement('a')\n link.style.display = 'none'\n link.href = downloadUrl\n console.log('linkhref', downloadUrl)\n link.download = 'player.txt'\n link.disabled = false\n link.click()\n }\n\n downloadStats () {\n this._downloadStats()\n }\n\n /***\n * @params type\n */\n info (data) {\n if (data.profile) {\n this._infoProfile(data)\n } else {\n this._info(data)\n }\n }\n\n _info (data) {\n const time = this._getTime()\n this._stats[INFO].push({\n ...time,\n payload: data\n })\n }\n\n _infoProfile (data) {\n if (data && data.startMs) {\n const endMs = Date.now()\n const dur = endMs - data.startMs\n const profile = {\n cat: 'function',\n dur: dur,\n name: data.name || data.msg,\n ph: 'X',\n pid: 0,\n tid: 0,\n ts: data.startMs,\n profile: true,\n ...data\n }\n this._info(profile)\n } else {\n console.warn('infoProfile need object data, include startMs')\n }\n }\n\n reset () {\n this._stats = {\n [INFO]: [],\n media: {}\n }\n }\n\n getStats () {\n const { player } = this\n const mediaElem = player.video\n const buffered = []\n for (let i = 0; i < mediaElem.buffered.length; i++) {\n buffered.push({\n start: mediaElem.buffered.start(i),\n end: mediaElem.buffered.end(i)\n })\n }\n const mediaInfo = {\n currentTime: mediaElem.currentTime,\n readyState: mediaElem.readyState,\n buffered,\n paused: mediaElem.paused,\n ended: mediaElem.ended\n }\n\n this._stats.media = mediaInfo\n return {\n raw: this._stats,\n timestat: this._getTimeStats(),\n profile: this._getProfile()\n }\n }\n\n _getTimeStats () {\n const allStat = this._stats[INFO]\n const msgs = allStat.map(stat => {\n const data = stat.payload.data\n let msg = ''\n try {\n if (data instanceof Error) {\n msg = data.msg\n } else if (data !== undefined) {\n msg = JSON.stringify(data)\n }\n } catch (error) {\n console.log('err', error)\n }\n\n return `[${stat.timeFormat}] : ${stat.payload.msg} ${msg} `\n })\n return msgs\n }\n\n _getProfile () {\n const profile = {\n traceEvents: []\n }\n const allStat = this._stats[INFO]\n allStat.forEach(stat => {\n if (stat.payload.profile) {\n profile.traceEvents.push(stat.payload)\n }\n })\n return profile\n }\n}\n","import 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","import sniffer from '../utils/sniffer'\n// import Danmu from '../plugins/danmu'\nimport Xglogger from '../plugins/logger'\nimport Replay from '../plugins/replay'\nimport Poster from '../plugins/poster'\nimport Start from '../plugins/start'\nimport Enter from '../plugins/enter'\nimport Miniscreen from '../plugins/miniScreen'\nimport PC from '../plugins/pc'\nimport Mobile from '../plugins/mobile'\nimport Keyboard from '../plugins/keyboard'\nimport Loading from '../plugins/loading'\nimport Progress from '../plugins/progress'\nimport PlayIcon from '../plugins/play'\nimport FullScreen from '../plugins/fullscreen'\nimport TimeIcon from '../plugins/time'\nimport Volume from '../plugins/volume'\nimport RotateIcon from '../plugins/rotate'\nimport PIPIcon from '../plugins/pip'\nimport PlayNextIcon from '../plugins/playNext'\nimport DownLoadIcon from '../plugins/download'\nimport ScreenShotIcon from '../plugins/screenShot'\nimport DefinitionIcon from '../plugins/definition'\nimport PlaybackRateIcon from '../plugins/playbackRate'\nimport CssFullScreen from '../plugins/cssFullScreen'\nimport Error from '../plugins/error'\nimport Prompt from '../plugins/prompt'\nimport ProgressPreview from '../plugins/progressPreview'\nimport Thumbnail from '../plugins/common/thumbnail'\nimport MiniProgress from '../plugins/progress/miniProgress'\nimport DynamicBg from '../plugins/dynamicBg'\nimport ZH from '../lang/zh-cn'\nimport Stats from '../plugins/stats'\n\nexport default class DefaultPreset {\n constructor (options, playerConfig) {\n const simulateMode = playerConfig && playerConfig.isMobileSimulateMode\n const { isLive } = playerConfig\n const vodPlugins = isLive ? [] : [Progress, MiniProgress, ProgressPreview, TimeIcon]\n\n const contolsIcons = [...vodPlugins, PlayIcon, FullScreen,\n RotateIcon, PlayNextIcon, DefinitionIcon, PlaybackRateIcon, DownLoadIcon, ScreenShotIcon, Volume, PIPIcon]\n\n const layers = [Replay, Poster, Start, Loading, Enter, Error, Prompt, Thumbnail, Miniscreen]\n\n this.plugins = [Stats, Xglogger, ...contolsIcons, ...layers]\n const mode = simulateMode ? 'mobile' : sniffer.device\n switch (mode) {\n case 'pc':\n this.plugins.push(...[Keyboard, PC, CssFullScreen])\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 = [ZH]\n }\n}\n"],"names":["has","Object","prototype","hasOwnProperty","prefix","Events2","fn","context","once","this","addListener","emitter","event","TypeError","listener","EE","evt","_events","push","_eventsCount","clearEvent","Events","EventEmitter2","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","EventEmitter","on","removeAllListeners","off","prefixed","module","exports","XG_DEBUG_OPEN","window","location","href","indexOf","STYLE","XGTAG","XG_DEBUG","config","debug","logInfo","message","optionalParams","console","log","logWarn","warn","logError","_fun","XgplayerTimeRange","constructor","bufferedList","start","index","end","util","createDom","el","tpl","attrs","cname","dom","document","createElement","className","innerHTML","keys","forEach","item","key","value","setAttribute","createDomFromHtml","html","classname","doc","children","addClass","err","hasClass","some","classList","e","orgClassName","getAttribute","match","RegExp","trim","split","add","removeClass","remove","reg","replace","toggleClass","classNames","typeOf","map","join","findDom","sel","querySelector","getElementById","getCss","currentStyle","defaultView","getComputedStyle","padStart","str","pad","charstr","String","maxlen","Math","ceil","chars","r","substring","format","time","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","getBgImage","url","backgroundImage","a","copyDom","nodeType","back","tagName","attributes","node","setInterval","eventName","intervalFunc","frequency","_interval","bind","clearInterval","setTimeout","fun","_timers","id","clearTimeout","splice","clearAllTimers","_timerIds","createImgBtn","imgUrl","width","height","btn","style","w","h","unit","every","parseFloat","backgroundSize","margin","Hex2RGBA","hex","alpha","rgb","test","sixHex","kw","parseInt","getFullScreenEl","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","checkIsFunction","checkIsObject","hide","display","show","isUndefined","val","setStyleFromCsstext","text","arr","filterStyleFromText","list","_cssText","cssText","styleArr","ret","remain","checkIsIn","getStyleFromCsstext","preloadImg","onload","onerror","img","Image","complete","stopPropagation","cancelable","preventDefault","scrollTop","pageYOffset","documentElement","body","scrollLeft","pageXOffset","checkTouchSupport","getBuffered2","vbuffered","maxHoleDuration","buffered","sort","b","diff","buffered2","buf2len","buf2end","getEventPos","zoom","x","y","requestAnimationFrame","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","getHostFromUrl","results","domain","cancelAnimationFrame","frameId","mozCancelAnimationFrame","cancelRequestAnimationFrame","VERSION_REG","H264_MIMETYPES","sniffer","device","os","isPc","browser","navigator","ua","userAgent","toLowerCase","ie","firefox","chrome","opera","safari","filter","isWindowsPhone","isSymbian","isAndroid","isFireFox","isTablet","isPhone","isIpad","isIos","osVersion","_match","exec","version","isWeixin","toLocaleLowerCase","isSupportMP4","supportResult","result","isSupport","mime","canPlayType","ERROR_TYPE_MAP","Errors","player","errorInfo","errorType","errorCode","errorMessage","originError","ext","mediaError","ERROR_TYPES","i18n","video","error","duration","currentTime","ended","currentSrc","readyState","networkState","playerVersion","code","stack","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","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","VIDEO_EVENTS","STATS_INFO","STATS_DOWNLOAD","STATS_RESET","emitVideoEvent","eventKey","errorHandler","getVideoEventHandler","eData","originalEvent","detail","timeStamp","paused","isInternalOp","_internalOp","type","muted","volume","host","Util","vtype","removeInnerOP","_currentTime","_duration","isMutedChange","_lastMuted","videoEventMiddleware","VideoProxy","options","super","_hasStart","videoConfig","assign","controls","autoplay","playsinline","x5VideoPlayerFullscreen","x5VideoOrientation","airplay","tabindex","mediaType","videoAttributes","playerType","x5VideoPlayerType","Sniffer","loop","defaultPlaybackRate","playbackRate","autoplayMuted","attachVideoEvents","setEventsMiddleware","middlewares","removeEventsMiddleware","_evHandlers","funName","charAt","toUpperCase","addEventListener","detachVideoEvents","removeEventListener","_attachSourceEvents","urls","removeAttribute","appendChild","_c","_videoSourceCount","_sourceError","_detachSourceEvents","removeChild","_e","destroy","pause","load","k","play","getBufferedRange","range","isTrue","bufferedPoint","_buffered","crossOrigin","defaultMuted","errorNote","rate","Infinity","played","preload","seekable","seeking","onWaiting","vol","addInnerOP","data","offAll","INDEXDB","mydb","db","ojstore","keypath","indexedDB","webkitindexedDB","IDBKeyRange","webkitIDBKeyRange","myDB","openDB","self","request","open","onsuccess","onupgradeneeded","transaction","objectStoreNames","contains","createObjectStore","keyPath","deletedb","deleteDatabase","closeDB","close","addData","storename","store","objectStore","putData","put","getDataByKey","get","deleteData","delete","clearData","clear","FULLSCREEN_EVENTS","GET_FULLSCREEN_API","EXIT_FULLSCREEN_API","handler","next","then","hookName","preset","pre","__hooks","pluginName","preRet","isContinue","callHandler","catch","useHooks","usePluginHooks","plugins","plugin","instance","presetHooks","defineProperty","delHooksDescriptor","showErrorMsg","BasePlugin","static","Obj","defaultConfig","beforeCreate","hooksDescriptor","__args","__events","playerConfig","__init","afterCreate","beforePlayerInit","onPluginsReady","afterPlayerInit","logger","updateLang","lang","i18nKeys","domEventType","isArray","res","emitUserAction","action","params","nParams","hook","registerPlugin","getPlugin","__destroy","unRegisterPlugin","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","icon","attr","newIcon","key2","tag","registerIconsObj","iconsConfig","_icons","icons","orgIcon","class","mergeIconClass","mergeIconAttr","createIcon","Plugin","parent","insertIdx","Number","isDomElement","coordinate","mode","curIdx","insertBefore","insertAdjacentHTML","root","eventType","capture","dels","delegate","__delegates","_parent","_el","registerIcons","langText","defaultTexConfig","registerLanguageTexts","textConfig","renderStr","render","Error","insert","setAttr","setStyle","__registerChildren","_children","_plugin","checkChildren","langKey","langTextShow","changeLangTextKey","find","qs","bindEL","unbind","unbindEL","setHtml","htmlStr","eventHandle","isBubble","getPropertyValue","pdom","child","ResizeObserver","__handlers","observer","entries","t","Date","getTime","__trigger","addObserver","observe","unObserver","unobserve","destroyObserver","disconnect","__runHandler","resizeObserver","pluginsManager","init","cgid","_pluginInfoId","pluginGroup","closeResizeObserver","resize","isUserActive","_player","_originalOptions","checkPlayerRoot","_keys","_p","lazyRegister","lazyPlugin","timeout","Promise","race","loader","__esModule","default","register","resolve","reject","_plugins","originalOptions","isSupported","disable","unRegister","_instance","func","deletePlugin","getPlugins","findPlugin","cName","beforeInit","retPromise","prevTask","_loadingPlugins","all","pluginsRet","afterInit","setLang","reRender","pluginsMap","_args","setCurrentUserActive","playerId","isActive","c","getCurrentUseActiveId","_isUseActive","isUseActive","STATE_CLASS","DEFAULT","DEFAULT_SKIN","ENTER","PAUSED","LOADING","NO_START","ACTIVE","INACTIVE","FULLSCREEN","CSS_FULLSCREEN","ROTATE_FULLSCREEN","PARENT_ROTATE_FULLSCREEN","PARENT_FULLSCREEN","INNER_FULLSCREEN","NO_CONTROLS","FLEX_CONTROLS","CONTROLS_FOLLOW","CONTROLS_AUTOHIDE","TOP_BAR_AUTOHIDE","NOT_ALLOW_AUTOPLAY","PC","MOBILE","MINI","usePreset","STATES","STATE_ARRAY","Controls","_defineProperty","userTimer","focus","autoHide","initShow","marginControls","left","center","right","innerRoot","isMini","onMouseEnter","onMouseLeave","focusAwhile","blur","ignorePaused","recoverAutoHide","pauseAutoHide","position","XGI18nLang","XGI18nTextKeys","XGI18nLangKeys","XGI18nLangPreExtends","updateKeys","en","extend","XGI18nText","LANG","TEXT","use","langData","texts","zh","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","textKeys","langKeys","PlAYER_HOOKS","Player","debugger","nullUrlStart","fluid","fitVideoSize","videoFillMode","isLive","videoInit","poster","isMobileSimulateMode","execBeforePluginsCall","allowSeekAfterEnded","enableContextmenu","closeVideoClick","closeVideoDblclick","closePlayerBlur","closeDelayBlur","leavePlayerTime","closePlayVideoFocus","closePauseVideoFocus","closeFocusVideoFocus","closeControlsBlur","topBarAutoHide","startTime","seekedStatus","miniprogress","disableSwipeHandler","enableSwipeHandler","ignores","whitelist","inactive","language","fullscreenTarget","controlsList","screenShot","rotate","pip","download","mini","cssFullscreen","keyShortcut","presets","definition","customDuration","timeOffset","thumbnail","commonStyle","progressColor","playedColor","cachedColor","sliderBtnStyle","volumeColor","defaultPreset","defaultIdx","waitTimer","_state","isSeeking","isCanplay","_runPending","rotateDeg","fullscreen","cssfullscreen","isRotateFullscreen","_fullscreenEl","_cssfullscreenEl","curDefinition","_orgCss","_fullScreenOffset","_videoHeight","_videoWidth","_accPlayed","acc","loopAcc","innerContainer","topBar","database","Database","_initDOM","defaultDefinitionObj","defaultDefinition","_bindEvents","_registerPresets","_registerPlugins","setState","onReady","hasStart","state","vid","line","handle","_initBaseDoms","XgVideoProxy","_nVideo","leftBar","rightBar","onFullscreenChange","isFullScreen","fullEl","_fullActionFrom","props","prop","from","to","changeFullStyle","exitCssFullscreen","needFullscreenScroll","scrollTo","top","recoverFullStyle","__webkitbeginfullscreen","__webkitendfullscreen","playFunc","_unbindEvents","mousemoveFunc","canPlayFunc","_startInit","videoPlay","loadeddataFunc","_root","firstChild","ignoresStr","lazy","loadingPlugin","forceBeforeInit","Preset","presetInst","PLUFGIN","_pConfig","deregister","fileName","lineNumber","switchURL","seamless","_src","curTime","isPaused","_canplay","playPromise","onError","_errorTimer","videoPause","runHooks","seek","status","isSeekedPlay","_status","changeDefinition","reload","reloadFunc","resetState","clsList","cls","updateAcc","exitFullscreen","cList","replay","onPlay","retry","cur","rootClass","pClassName","_orgPCss","getFullscreen","webkitRequestFullscreen","ALLOW_KEYBOARD_INPUT","fullscreenEnabled","webkitSupportsFullscreen","webkitEnterFullscreen","exitRotateFullscreen","webkitExitFullScreen","getCssFullscreen","_class","useCssFullscreen","getRotateFullscreen","setRotateDeg","deg","orientation","delay","onFocus","onBlur","onEmptied","onCanplay","onPause","onEnded","onSeeking","onSeeked","onPlaying","onTimeupdate","onVolumechange","onRatechange","endType","_at","checkBuffer","pos","rvH","_transform","_tx","_ty","transform","webkitTransform","setConfig","playNext","videoWidth","videoHeight","containerSize","getBoundingClientRect","controlsHeight","videoFit","fit","rWidth","rHeight","_style","paddingTop","videoScale","vWidth","vHeight","cWidth","cHeight","updateObjectPosition","objectPosition","newState","isFullscreen","isCssfullScreen","bool","isPlaying","definitionList","curDef","targetDef","__url","posterUrl","update","fullscreenChanging","cumulateTime","setUserActive","isMuted","descriptor","now","Xglogger","isTimeUpdate","_sendFirstFrame","autoplayStart","vt","pt","fvt","_isSeeking","seekingStart","waitingStart","_isWaiting","_waitTimer","_waittTimer","_waitType","suspendWaitingStatus","emitLog","suspendSeekingStatus","_startWaitTimeout","isFFLoading","_onReset","_onAutoplayStart","_onTimeupdate","_onWaitingLoadStart","_onSeeking","_onSeeked","endState","_onPlaying","_onWaiting","_onError","s","costTime","_now","_cost","Replay","ReplaySvg","__handleReplay","path","handleReplay","enable","Poster","isEndedShow","hideCanplay","onTimeUpdate","AnimateMap","Start","isShowPause","isShowEnd","disableAnimate","autoPlayStart","initIcons","onPlayPause","clickHandler","switchPausePlay","startPlay","PlaySvg","startPause","PauseSvg","focusHide","recover","switchStatus","isAnimate","animate","endShow","seconds","addAnimate","Enter","innerHtml","logo","HTMLElement","barStr","MiniScreenIcon","getMini","exitMini","onClick","getStyleSize","num","measurements","measurementsLength","getSize","elem","getStyle","size","innerWidth","innerHeight","outerWidth","outerHeight","getZeroSize","offsetWidth","offsetHeight","isBorderBox","boxSizing","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderWidth","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","getTouch$1","dentifier","identifier","EVENTS","POST_START_EVENTS","mousedown","touchstart","pointerdown","Draggabilly","isEnabled","isDragging","isDown","downPoint","dragPoint","startPos","_handlerDom","_bindStartEvent","_startKey","_unbindStartEvent","_bindPostStartEvents","_boundPointerEvents","_unbindPostStartEvents","onUp","onDocUp","positionDrag","webKitTransform","setLeftTop","onmousedown","dragStart","onmousemove","dragMove","onmouseup","dragEnd","ontouchstart","touchIdentifier","pointerId","ontouchmove","getTouch","ontouchend","ontouchcancel","dragCancel","pointer","_getPosition","maxY","maxX","dragRealStart","presetInfo","_dragPointerMove","moveVector","hasDragStarted","dragX","dragY","checkContain","abs","axis","drag","grid","_getPositionCoord","_addTransformPosition","matrixValues","xIndex","translateX","translateY","styleSide","measure","parentSize","MiniScreen","isShowIcon","isScrollSwitch","disableDrag","isClose","scrollY","scrollHeight","lastStyle","onCancelClick","onCenterClick","_draggabilly","onScroll","PlayIcon","PauseIcon","MOUSE_EVENTS","mouseenter","mouseleave","mousemove","HOOKS","PCPlugin","__canvas","closeVideoStopPropagation","_clickCount","clickTimer","switchPlayPause","disableContextmenu","initEvents","onVideoClick","onVideoDblClick","onContextmenu","returnValue","cancelBubble","TOUCHS","move","cancel","MOUSES","preventToucheDefault","Touche","_pos","moving","pressDelay","dbClickDelay","disablePress","disableDbClick","miniStep","needPreventDefault","pressIntrvalId","dbIntrvalId","_initEvent","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel","__setPress","__clearPress","trigger","press","__setDb","__clearDb","diffx","diffy","touchend","touchmove","ACTIONS","MobilePlugin","disableGesture","gestureX","gestureY","gradient","isTouchingSeek","miniMoveStep","miniYPer","scopeL","scopeR","scopeM","pressRate","darkness","maxDarkness","disableActive","disableTimeProgress","hideControlsActive","hideControlsEnd","moveDuration","closedbClick","disableSeekIcon","focusVideoClick","touche","getTouche","isStart","rect","_x","_y","scopeM1","scopeM2","scope","checkScope","executeMove","endLastMove","resetSeekState","resetPos","changeAction","checkIsRootTarget","light","timer","seekTipIcon","SeekTipIcon","xgMask","initCustomStyle","registerThumbnail","onRootTouchMove","onRootTouchEnd","eventsMap","pressend","click","doubleclick","progressPlugin","progress","addCallBack","activeSeekNote","forward","usable","createThumbnail","timePreview","backgroundColor","color","startPlugin","mold","updateTime","updateBrightness","updateVolume","lastScope","toFixed","sendUseAction","Event","onDbClick","onPress","onPressEnd","percent","updatePercent","isForward","updateThumbnails","enableGesture","Keyboard","isIgnoreUserActive","disableBodyTrigger","checkIsVisible","metaKey","altKey","ctrlKey","keyCode","isGlobalTrigger","isContentEditable","isDisableTag","checkCode","handleKeyCode","disableRootTrigger","seekStep","checkVisible","keyCodeMap","mergekeyCodeMap","extendkeyCodeMap","key1","space","noBodyTarget","up","down","esc","onKeydown","onBodyKeyDown","rec","bottom","isBodyTarget","flag","downVolume","upVolume","_time","seekBack","playPause","curKeyCode","Loading","loadingIcon","TPL","styleKey","InnerList","fragments","focusClass","cachedIndex","playedIndex","updateDuration","updateProgress","newIndex","curIndex","millisecond","progressList","curPFrag","per","cached","newPIndex","findIndex","newCIndex","findHightLight","findFragment","unHightLight","setHightLight","inner","isFocus","item2","Progress","isDragingSeek","closeMoveSeek","isPauseMoving","isCloseClickSeek","miniStartStep","onMoveStart","onMoveEnd","_ePos","computeTime","triggerCallbacks","updateWidth","isProgressMoving","progressBtn","_mouseDownHandlerHook","onMouseMove","onMouseUp","onMoveOnly","onBodyClick","_mouseUpHandlerHook","isEnter","_mouseMoveHandlerHook","useable","__dragCallBacks","direc","_disableBlur","changeState","createInner","innerList","outer","isMobile","onCacheUpdate","onReset","bindDomEvents","boxShadow","removeCallBack","_index","_mouseDownHandler","_mouseUpHandler","_mouseMoveHandler","onMouseDown","onMouseOver","onMouseOut","disableBlur","enableBlur","realTime","rLeft","offset","timeIcon","resetActive","notSeek","point","thumbnailPlugin","Play","btnClick","TopBackIcon","screenBack","BackSVG","Fullscreen","rotateFullscreen","switchCallback","needBackIcon","handleFullscreen","toggleFullScreen","topBackIcon","_onOrientationChange","FullScreenSvg","ExitFullScreenSvg","Time","isActiving","constrolsMode","createCenterTime","durationDom","timeDom","current","centerCurDom","centerDurDom","changeLiveState","updateState","Volume","slider","bar","barRect","barH","updateVolumePos","onBarMouseUp","isMoving","_timerId","showValueLabel","updateVolumeValue","miniVolume","volumeSmall","volumeSmallSvg","volumeLarge","volumeLargeSvg","volumeMuted","volumeMutedSvg","changeMutedHandler","changeMuted","onMouseenter","onMouseleave","onBarMousedown","onBarMouseMove","onVolumeChange","max","min","$labelValue","innerText","Rotate","innerRotate","clockwise","onBtnClick","updateRotateDeg","_styles","transformOrigin","times","factor","RotateSvg","PresentationMode","isPIPAvailable","isPip","exitPIP","requestPIP","showIcon","webkitSetPresentationMode","pMode","initPipEvents","switchPIP","pipIcon","PipIcon","pipIconExit","PipIconExit","leavePIPCallback","enterPIPCallback","pipWindow","pictureInPictureWindow","onWebkitpresentationmodechanged","webkitPresentationMode","checkWebkitSetPresentationMode","requestPictureInPicture","reason","exitPictureInPicture","pictureInPictureElement","pictureInPictureEnabled","disablePictureInPicture","webkitSupportsPresentationMode","PlayNextIcon","urlList","idx","nextHandler","Next","changeSrc","download2","strFileName","strMimeType","blob","reader","defaultMime","mimeType","payload","anchor","myBlob","Blob","MozBlob","WebKitBlob","pop","ajax","XMLHttpRequest","responseType","response","send","msSaveBlob","dataUrlToBlob","saver","tempUiArr","Uint8Array","mx","charCodeAt","strUrl","parts","binData","atob","decodeURIComponent","uiArr","winMode","URL","revokeObjectURL","confirm","f","createObjectURL","btoa","encodeURIComponent","FileReader","readAsDataURL","Download","isLock","getAbsoluteURL","downloadUtil","DownloadSvg","div","ScreenShot","quality","fitVideo","screenshotIcon","initSize","onClickBtn","saveScreenShot","filename","saveLink","createEvent","initMouseEvent","dispatchEvent","createCanvans","canvas","canvasCtx","getContext","shot","option","drawImage","toDataURL","OptionList","onItemClick","renderItemList","_delegates","attrKeys","selected","showText","changeCallback","curSelected","getAttrObj","IS_MOBILE","OptionsIcon","listType","listStyle","hidePortrait","curValue","optionsList","activeEvent","onEnter","onLeave","getTextByLang","onToggle","curItem","changeCurrentText","itemList","DefinitionIcon","changeDefinitionList","initDefinition","items","showItem","PlaybackRate","curRate","itemInfo","CssFullScreen","handleCssFullscreen","contentIcon","switchTips","CssFullSceenSvg","ExitCssFullSceenSvg","ErrorPlugin","errorRetry","handleError","handleCanPlay","Prompt","interval","highlight","intervalId","customConfig","customOnClick","showPrompt","hidePrompt","hideinterval","ISPOT","mergeISPOT","iSpot","APIS","initDots","_ispots","createDot","_ispotsInit","isNew","calcuPosition","dotDom","template","findDot","updateDot","needShow","dot","showDot","deleteDot","del","parentElement","deleteAllDots","dotDoms","getElementsByTagName","updateAllDots","iSpots","ispot","getAllDotsDom","getDotDom","CALLBACK_MAP","dragmove","dragstart","dragend","mouseover","ProgressPreview","_curDot","onDotMouseLeave","blurDot","focusDot","videoPreview","videothumbnail","miniWidth","ispots","defaultText","isFocusDots","isShowThumbnail","isShowCoverPreview","handlerSpotClick","progressDot","initDotsAPI","previewLine","timePoint","timeText","tipText","_hasThumnail","bindEvents","onMousemove","onMousedown","handlerPreviewClick","onProgressMove","updatePosition","onProgressDragStart","isDrag","onProgressDragEnd","onProgressClick","updateLinePos","cwidth","isflex","lwidth","tWidth","_t","_tt","updateTimeText","timeStr","textContent","showTips","hideTips","changeThumbnail","thumbnailConfig","changeConfig","tRoot","totalWidth","widthPerSeconds","_activeDotId","isDefault","Thumbnail","isShow","pic_num","col","row","scale","ratio","preloadMark","initThumbnail","getUrlByIndex","getPosition","containerWidth","containerHeight","urlIndex","indexInPage","rowIndex","colIndex","swidth","sHeight","backgroundPosition","customStyle","newConfig","MiniProgress","MODES","checkVideoIsSupport","isSupportCanvas","DynamicBg","videoPI","performance","nowTime","stop","preTime","isInnerRender","frameRate","addMask","maskBg","checkIsSupportCanvas","dynamicBg","rwidth","rheight","onLoadedData","canvasFilter","supportCanvasFilter","webkitFilter","mask","background","updateImg","image","pi","ZH","INFO","STATS_EVENTS","Stats","actionData","_getTime","_stats","reset","info","stats","getStats","JSON","stringify","downloadUrl","link","disabled","timestamp","timeFormat","toISOString","_recordUserActions","_recordInfo","_downloadStats","downloadStats","profile","_infoProfile","_info","startMs","endMs","cat","dur","ph","pid","tid","ts","media","mediaElem","mediaInfo","raw","timestat","_getTimeStats","_getProfile","msgs","stat","traceEvents","PresetPlayer","simulateMode","contolsIcons","TimeIcon","FullScreen","RotateIcon","PlaybackRateIcon","DownLoadIcon","ScreenShotIcon","PIPIcon","layers","Miniscreen","Mobile"],"mappings":"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"}