{"version":3,"file":"index.min.js","sources":["../../../node_modules/eventemitter3/index.js","../src/utils/debug.js","../src/utils/xgplayerTimeRange.js","../src/utils/util.js","../src/utils/sniffer.js","../src/version.js","../src/error.js","../src/events.js","../src/mediaProxy.js","../src/utils/database.js","../src/constant.js","../src/plugin/hooksDescriptor.js","../src/plugin/basePlugin.js","../../../node_modules/delegate/src/closest.js","../../../node_modules/delegate/src/delegate.js","../src/plugin/plugin.js","../src/plugin/resizeObserver.js","../src/plugin/pluginsManager.js","../src/stateClassMap.js","../src/defaultConfig.js","../src/plugin/preset.js","../src/state.js","../src/plugins/controls/index.js","../src/lang/i18n.js","../src/lang/en.js","../src/instManager.js","../src/player.js","../src/plugins/logger/index.js","../src/plugins/replay/index.js","../src/plugins/poster/index.js","../src/plugins/start/index.js","../src/plugins/enter/index.js","../src/plugins/common/iconTools.js","../src/plugins/miniScreen/miniScreenIcon.js","../src/utils/draggabilly.js","../src/plugins/miniScreen/index.js","../src/plugins/pc/index.js","../src/plugins/mobile/touch.js","../src/plugins/mobile/index.js","../src/plugins/keyboard/index.js","../src/plugins/loading/index.js","../src/plugins/progress/innerList.js","../src/plugins/progress/index.js","../src/plugins/common/iconPlugin.js","../src/plugins/play/index.js","../src/plugins/fullscreen/backicon.js","../src/plugins/fullscreen/index.js","../src/plugins/time/index.js","../src/plugins/time/timesegments.js","../src/plugins/volume/index.js","../src/plugins/rotate/index.js","../src/plugins/pip/index.js","../src/plugins/playNext/index.js","../../../node_modules/downloadjs/download.js","../src/plugins/download/index.js","../src/plugins/screenShot/index.js","../src/plugins/common/optionList.js","../src/plugins/common/optionsIcon.js","../src/plugins/definition/index.js","../src/plugins/playbackRate/index.js","../src/plugins/cssFullScreen/index.js","../src/plugins/error/index.js","../src/plugins/prompt/index.js","../src/plugins/progressPreview/dotsApi.js","../src/plugins/progressPreview/index.js","../src/plugins/common/thumbnail.js","../src/plugins/progress/miniProgress.js","../src/plugins/dynamicBg/index.js","../src/plugins/stats/index.js","../src/plugins/gapJump/index.js","../src/plugins/waitingTimeoutJump/index.js","../src/plugins/testspeed/index.js","../src/plugins/fpsDetect/index.js","../src/presets/default.js","../src/lang/zh-cn.js","../src/index.umd.js"],"sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","\nconst XG_DEBUG_OPEN = typeof (window) !== 'undefined' && window.location && window.location.href.indexOf('xgplayerdebugger=1') > -1\n\nconst STYLE = {\n info: 'color: #525252; background-color: #90ee90;',\n error: 'color: #525252; background-color: red;',\n warn: 'color: #525252; background-color: yellow; '\n}\n\nconst XGTAG = '%c[xgplayer]'\n\nconst XG_DEBUG = {\n config: {\n debug: XG_DEBUG_OPEN ? 3 : 0\n },\n\n logInfo: function (message, ...optionalParams) {\n this.config.debug >= 3 && console.log(XGTAG, STYLE.info, message, ...optionalParams)\n },\n\n logWarn: function (message, ...optionalParams) {\n this.config.debug >= 1 && console.warn(XGTAG, STYLE.warn, message, ...optionalParams)\n },\n\n logError: function (message, ...optionalParams) {\n if (this.config.debug < 1) {\n return\n }\n const _fun = this.config.debug >= 2 ? 'trace' : 'error'\n console[_fun](XGTAG, STYLE.error, message, ...optionalParams)\n }\n}\n\nfunction bindDebug (player) {\n player.logInfo = XG_DEBUG.logInfo.bind(player)\n player.logWarn = XG_DEBUG.logWarn.bind(player)\n player.logError = XG_DEBUG.logError.bind(player)\n}\n\nexport {\n XG_DEBUG as default,\n bindDebug\n}\n","export default class XgplayerTimeRange {\n constructor (bufferedList) {\n this.bufferedList = bufferedList\n }\n\n start (index) {\n return this.bufferedList[index].start\n }\n\n end (index) {\n return this.bufferedList[index].end\n }\n\n get length () {\n return this.bufferedList.length\n }\n}\n","import XG_DEBUG from './debug'\nimport XgplayerTimeRange from './xgplayerTimeRange'\nconst util = {}\n\n/**\n *\n * @param { string } el\n * @param { string } [tpl=]\n * @param { {[propName: string]: any }} [attrs={}]\n * @param { string } [cname='']\n * @returns { HTMLElement | null }\n */\nutil.createDom = function (el = 'div', tpl = '', attrs = {}, cname = '') {\n const dom = document.createElement(el)\n dom.className = cname\n dom.innerHTML = tpl\n Object.keys(attrs).forEach(item => {\n const key = item\n const value = attrs[item]\n if (el === 'video' || el === 'audio' || el === 'live-video') {\n if (value) {\n dom.setAttribute(key, value)\n }\n } else {\n dom.setAttribute(key, value)\n }\n })\n return dom\n}\n\n/**\n *\n * @param { string } html\n * @param { {[propName: string]: any} } [attrs={}]\n * @param { string } [classname=\"\"]\n * @returns { HTMLElement | null }\n */\nutil.createDomFromHtml = function (html, attrs = {}, classname = '') {\n try {\n let doc = document.createElement('div')\n doc.innerHTML = html\n let dom = doc.children\n doc = null\n if (dom.length > 0) {\n dom = dom[0]\n classname && util.addClass(dom, classname)\n if (attrs) {\n Object.keys(attrs).forEach(key => {\n dom.setAttribute(key, attrs[key])\n })\n }\n return dom\n }\n return null\n } catch (err) {\n XG_DEBUG.logError('util.createDomFromHtml', err)\n return null\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { boolean }\n */\nutil.hasClass = function (el, className) {\n if (!el || !className) {\n return false\n }\n try {\n return Array.prototype.some.call(el.classList, item => item === className)\n } catch (e) {\n const orgClassName = el.className && typeof el.className === 'object' ? el.getAttribute('class') : el.className\n return orgClassName && !!orgClassName.match(new RegExp('(\\\\s|^)' + className + '(\\\\s|$)'))\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.addClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.add(item)\n })\n } catch (e) {\n if (!util.hasClass(el, className)) {\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class') + ' ' + className)\n } else {\n el.className += ' ' + className\n }\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.removeClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.remove(item)\n })\n } catch (e) {\n if (util.hasClass(el, className)) {\n className.split(/\\s+/g).forEach(item => {\n const reg = new RegExp('(\\\\s|^)' + item + '(\\\\s|$)')\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class').replace(reg, ' '))\n } else {\n el.className = el.className.replace(reg, ' ')\n }\n })\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.toggleClass = function (el, className) {\n if (!el) {\n return\n }\n\n className.split(/\\s+/g).forEach(item => {\n if (util.hasClass(el, item)) {\n util.removeClass(el, item)\n } else {\n util.addClass(el, item)\n }\n })\n}\n\n/**\n *\n * @param { string | Object } args0\n * @param { string } [className]\n * @returns { string }\n */\nutil.classNames = function () {\n const classname = []\n for (let i = 0; i < arguments.length; i++) {\n if (util.typeOf(arguments[i]) === 'String') {\n // classname += `${arguments[i]}`\n classname.push(arguments[i])\n } else if (util.typeOf(arguments[i]) === 'Object') {\n Object.keys(arguments[i]).map(key => {\n if (arguments[i][key]) {\n // classname += key\n classname.push(key)\n }\n })\n }\n // if (i < arguments.length - 1) {\n // classname += ' '\n // }\n }\n return classname.join(' ')\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } sel\n * @returns { HTMLElement }\n */\nutil.findDom = function (el = document, sel) {\n let dom\n // fix querySelector IDs that start with a digit\n // https://stackoverflow.com/questions/37270787/uncaught-syntaxerror-failed-to-execute-queryselector-on-document\n try {\n dom = el.querySelector(sel)\n } catch (e) {\n XG_DEBUG.logError('util.findDom', e)\n if (sel.indexOf('#') === 0) {\n dom = el.getElementById(sel.slice(1))\n }\n }\n return dom\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } key\n * @returns { any }\n */\nutil.getCss = function (dom, key) {\n return dom.currentStyle ? dom.currentStyle[key] : document.defaultView.getComputedStyle(dom, false)[key]\n}\n\nutil.padStart = function (str, length, pad) {\n const charstr = String(pad)\n const len = length >> 0\n let maxlen = Math.ceil(len / charstr.length)\n const chars = []\n const r = String(str)\n while (maxlen--) {\n chars.push(charstr)\n }\n return chars.join('').substring(0, len - r.length) + r\n}\n\n/**\n *\n * @param { number } time\n * @returns { string }\n */\nutil.format = function (time) {\n if (window.isNaN(time)) {\n return ''\n }\n time = Math.round(time)\n const hour = util.padStart(Math.floor(time / 3600), 2, 0)\n const minute = util.padStart(Math.floor((time - hour * 3600) / 60), 2, 0)\n const second = util.padStart(Math.floor((time - hour * 3600 - minute * 60)), 2, 0)\n return (hour === '00' ? [minute, second] : [hour, minute, second]).join(':')\n}\n\n/**\n *\n * @param { Object } e\n * @returns { Object }\n */\nutil.event = function (e) {\n if (e.touches) {\n const touch = e.touches[0] || e.changedTouches[0]\n e.clientX = touch.clientX || 0\n e.clientY = touch.clientY || 0\n e.offsetX = touch.pageX - touch.target.offsetLeft\n e.offsetY = touch.pageY - touch.target.offsetTop\n }\n e._target = e.target || e.srcElement\n}\n\n/**\n *\n * @param { any } obj\n * @returns { string }\n */\nutil.typeOf = function (obj) {\n // eslint-disable-next-line no-lookahead-lookbehind-regexp/no-lookahead-lookbehind-regexp\n return Object.prototype.toString.call(obj).match(/([^\\s.*]+)(?=]$)/g)[0]\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepCopy = function (dst, src) {\n if (util.typeOf(src) === 'Object' && util.typeOf(dst) === 'Object') {\n Object.keys(src).forEach(key => {\n // eslint-disable-next-line no-undef\n if (util.typeOf(src[key]) === 'Object' && !(src[key] instanceof Node)) {\n if (dst[key] === undefined || dst[key] === undefined) {\n dst[key] = src[key]\n } else {\n util.deepCopy(dst[key], src[key])\n }\n } else if (util.typeOf(src[key]) === 'Array') {\n dst[key] = util.typeOf(dst[key]) === 'Array' ? dst[key].concat(src[key]) : src[key]\n } else {\n dst[key] = src[key]\n }\n })\n return dst\n }\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepMerge = function (dst, src) {\n Object.keys(src).map(key => {\n if (util.typeOf(src[key]) === 'Array' && util.typeOf(dst[key]) === 'Array') {\n if (util.typeOf(dst[key]) === 'Array') {\n dst[key].push(...src[key])\n }\n } else if (util.typeOf(dst[key]) === util.typeOf(src[key]) && dst[key] !== null && util.typeOf(dst[key]) === 'Object' && !(src[key] instanceof window.Node)) {\n util.deepMerge(dst[key], src[key])\n } else {\n src[key] !== null && (dst[key] = src[key])\n }\n })\n return dst\n}\n\nutil.getBgImage = function (el) {\n // fix: return current page url when url is none\n const url = (el.currentStyle || window.getComputedStyle(el, null)).backgroundImage\n if (!url || url === 'none') {\n return ''\n }\n const a = document.createElement('a')\n a.href = url.replace(/url\\(\"|\"\\)/g, '')\n return a.href\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { HTMLElement | null }\n */\nutil.copyDom = function (dom) {\n if (dom && dom.nodeType === 1) {\n const back = document.createElement(dom.tagName)\n Array.prototype.forEach.call(dom.attributes, (node) => {\n back.setAttribute(node.name, node.value)\n })\n if (dom.innerHTML) {\n back.innerHTML = dom.innerHTML\n }\n return back\n } else {\n return ''\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @param { function } intervalFunc\n * @param { number } frequency\n */\nutil.setInterval = function (context, eventName, intervalFunc, frequency) {\n if (!context._interval[eventName]) {\n context._interval[eventName] = window.setInterval(intervalFunc.bind(context), frequency)\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @returns { void }\n */\nutil.clearInterval = function (context, eventName) {\n clearInterval(context._interval[eventName])\n context._interval[eventName] = null\n}\n\n/**\n *\n * @param { any } context\n * @param { function } fun\n * @param { number } time\n * @returns { number }\n */\nutil.setTimeout = function (context, fun, time) {\n if (!context._timers) {\n context._timers = []\n }\n const id = setTimeout(() => {\n fun()\n util.clearTimeout(context, id)\n }, time)\n context._timers.push(id)\n return id\n}\n\n/**\n *\n * @param { any } context\n * @param { number } id\n */\nutil.clearTimeout = function (context, id) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n for (let i = 0; i < _timers.length; i++) {\n if (_timers[i] === id) {\n _timers.splice(i, 1)\n clearTimeout(id)\n break\n }\n }\n } else {\n clearTimeout(id)\n }\n}\n\n/**\n *\n * @param { any } context\n */\nutil.clearAllTimers = function (context) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n _timers.map(item => {\n clearTimeout(item)\n })\n context._timerIds = []\n }\n}\n\n/**\n *\n * @param { string } name\n * @param { string } imgUrl\n * @param { number } [width]\n * @param { number } [height]\n * @returns { HTMLElement }\n */\nutil.createImgBtn = function (name, imgUrl, width, height) {\n const btn = util.createDom(`xg-${name}`, '', {}, `xgplayer-${name}-img`)\n btn.style.backgroundImage = `url(\"${imgUrl}\")`\n if (width && height) {\n let w, h, unit\n ['px', 'rem', 'em', 'pt', 'dp', 'vw', 'vh', 'vm', '%'].every((item) => {\n if (width.indexOf(item) > -1 && height.indexOf(item) > -1) {\n w = parseFloat(width.slice(0, width.indexOf(item)).trim())\n h = parseFloat(height.slice(0, height.indexOf(item)).trim())\n unit = item\n return false\n } else {\n return true\n }\n })\n btn.style.width = `${w}${unit}`\n btn.style.height = `${h}${unit}`\n btn.style.backgroundSize = `${w}${unit} ${h}${unit}`\n if (name === 'start') {\n btn.style.margin = `-${h / 2}${unit} auto auto -${w / 2}${unit}`\n } else {\n btn.style.margin = 'auto 5px auto 5px'\n }\n }\n return btn\n}\n\n/**\n *\n * @param { string } hex\n * @param { string | number } alpha\n * @returns { string }\n */\nutil.Hex2RGBA = function (hex, alpha) {\n const rgb = [] // 定义rgb数组\n // eslint-disable-next-line no-useless-escape\n if (/^\\#[0-9A-F]{3}$/i.test(hex)) {\n let sixHex = '#'\n hex.replace(/[0-9A-F]/ig, function (kw) {\n sixHex += kw + kw\n })\n hex = sixHex\n }\n if (/^#[0-9A-F]{6}$/i.test(hex)) {\n hex.replace(/[0-9A-F]{2}/ig, function (kw) {\n rgb.push(parseInt(kw, 16))\n })\n return `rgba(${rgb.join(',')}, ${alpha})`\n } else {\n return 'rgba(255, 255, 255, 0.1)'\n }\n}\n\n/**\n *\n * @returns { HTMLElement | null }\n */\nutil.getFullScreenEl = function () {\n return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsFunction = function (fun) {\n return fun && typeof fun === 'function'\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsObject = function (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * @param { HTMLElement }\n */\nutil.hide = function (dom) {\n dom.style.display = 'none'\n}\n\n/**\n * @param { HTMLElement }\n * @param { block | flex | inline-block | inline-flex } [display]\n */\nutil.show = function (dom, display) {\n dom.style.display = display || 'block'\n}\n\n/**\n *\n * @param { any } val\n * @returns { boolean }\n */\nutil.isUndefined = function (val) {\n if (typeof val === 'undefined' || val === null) {\n return true\n }\n}\n\nutil.isNotNull = function (val) {\n return !(val === undefined || val === null)\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } [text]\n * @returns\n */\nutil.setStyleFromCsstext = function (dom, text) {\n // dom.setAttribute(style, text)\n if (!text) {\n return\n }\n if (util.typeOf(text) === 'String') {\n const styleArr = text.replace(/\\s+/g, '').split(';')\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n dom.style[arr[0]] = arr[1]\n }\n }\n })\n } else {\n Object.keys(text).map(key => {\n dom.style[key] = text[key]\n })\n }\n}\n\n/**\n *\n * @param { string } key\n * @param { Array} list\n * @returns { boolean }\n */\nfunction checkIsIn (key, list) {\n for (let i = 0, len = list.length; i < len; i++) {\n if (key.indexOf(list[i]) > -1) {\n return true\n }\n }\n return false\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { Array } [list] attribute names to filter\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.filterStyleFromText = function (dom, list = ['width', 'height', 'top', 'left', 'bottom', 'right', 'position', 'z-index', 'padding', 'margin', 'transform']) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n const remain = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n if (checkIsIn(arr[0], list)) {\n ret[arr[0]] = arr[1]\n // dom.style[arr[0]] = 'initial'\n } else {\n remain[arr[0]] = arr[1]\n }\n }\n }\n })\n dom.setAttribute('style', '')\n Object.keys(remain).map(key => {\n // netStyle += `${key}: ${remain[key]};`\n dom.style[key] = remain[key]\n })\n return ret\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.getStyleFromCsstext = function (dom) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n ret[arr[0]] = arr[1]\n }\n }\n })\n return ret\n}\n\nutil.preloadImg = (url, onload = () => {}, onerror = () => {}) => {\n if (!url) {\n return\n }\n let img = new window.Image()\n img.onload = (e) => {\n img = null\n onload && onload(e)\n }\n img.onerror = (e) => {\n img = null\n onerror && onerror(e)\n }\n img.src = url\n}\n\nutil.stopPropagation = (e) => {\n if (e) {\n e.stopPropagation()\n }\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 {Event} e\n * @param {number} zoom\n * @returns\n */\nutil.getEventPos = function (e, zoom = 1) {\n if (e.touches && e.touches.length > 0) {\n e = e.touches[0]\n }\n return {\n x: e.x / zoom,\n y: e.y / zoom,\n clientX: e.clientX / zoom,\n clientY: e.clientY / zoom,\n offsetX: e.offsetX / zoom,\n offsetY: e.offsetY / zoom,\n pageX: e.pageX / zoom,\n pageY: e.pageY / zoom\n }\n}\n\nutil.requestAnimationFrame = function (callback) {\n const _fun = window.requestAnimationFrame ||\n // Older versions Chrome/Webkit\n window.webkitRequestAnimationFrame ||\n\n // Firefox < 23\n window.mozRequestAnimationFrame ||\n\n // opera\n window.oRequestAnimationFrame ||\n\n // ie\n window.msRequestAnimationFrame\n if (_fun) {\n return _fun(callback)\n }\n}\n\nutil.getHostFromUrl = function (url) {\n if (util.typeOf(url) !== 'String') {\n return ''\n }\n const results = url.split('/') // 以“/”进行分割\n let domain = ''\n if (results.length > 3 && results[2]) {\n domain = results[2]\n }\n return domain\n}\n\nutil.cancelAnimationFrame = function (frameId) {\n const _fun = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.cancelRequestAnimationFrame\n _fun && _fun(frameId)\n}\n\n/**\n * @desc Check whether it is MediaSource start\n * @param { HTMLVideoElement | HTMLAudioElement | HTMLElement } video\n * @returns { boolean }\n */\nutil.isMSE = function (video) {\n if (video.media) {\n video = video.media\n }\n if (!video || !(video instanceof HTMLMediaElement)) {\n return false\n }\n return /^blob/.test(video.currentSrc) || /^blob/.test(video.src)\n}\n\nutil.isBlob = function (url) {\n return typeof url === 'string' && /^blob/.test(url)\n}\n\n/**\n * @param { number } did\n * @returns { string }\n */\nutil.generateSessionId = function (did = 0) {\n let d = new Date().getTime()\n try {\n did = parseInt(did)\n } catch (e) {\n did = 0\n }\n d += did\n if (window.performance && typeof window.performance.now === 'function') {\n d += parseInt(window.performance.now()) // use high-precision timer if available\n }\n const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (d + Math.random() * 16) % 16 | 0\n d = Math.floor(d / 16)\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16)\n })\n return uuid\n}\n\nutil.createEvent = function (eventName) {\n let event\n if (typeof window.Event === 'function') {\n event = new Event(eventName)\n } else {\n event = document.createEvent('Event')\n event.initEvent(eventName, true, true)\n }\n return event\n}\n\n/**\n * @description Adjust currentTime according to duration, when ended is true and currentTime is less than duration, or\n * currentTime is greater than duration, return duration\n * @param { number } time\n * @param { number } duration\n * @param { boolean } isEnded\n * @returns { number } Adjusted time\n */\nutil.adjustTimeByDuration = function (time, duration, isEnded) {\n if (!duration || !time) {\n return time\n }\n if (time > duration || (isEnded && time < duration)) {\n return duration\n }\n return time\n}\n\nutil.createPositionBar = function (className, root) {\n const dom = util.createDom(\n 'xg-bar',\n '',\n { 'data-index': -1 },\n className\n )\n root.appendChild(dom)\n return dom\n}\n\nutil.getTransformStyle = function (pos = { x: 0, y: 0, scale: 1, rotate: 0 }, transformValue = '') {\n const styles = {\n scale: `${pos.scale || 1}`,\n translate: `${pos.x || 0}%, ${pos.y || 0}%`,\n rotate: `${pos.rotate || 0}deg`\n }\n const stylesKeys = Object.keys(styles)\n\n // 只复写Transform中已知的函数,对于其他函数不修改。解决全屏或者rotate插件执行时,对于镜像插件的影响\n stylesKeys.forEach((key) => {\n const reg = new RegExp(`${key}\\\\([^\\\\(]+\\\\)`, 'g') // reg match: TransformFunc(values)\n const fn = `${key}(${styles[key]})`\n if (reg.test(transformValue)) {\n reg.lastIndex = -1\n transformValue = transformValue.replace(reg, fn)\n } else {\n transformValue += `${fn} `\n }\n })\n return transformValue\n}\n\n/**\n * @description 角度换算\n * @param {number} val\n * @returns {number}\n */\nutil.convertDeg = function (val) {\n if (Math.abs(val) <= 1) {\n return val * 360\n }\n return val % 360\n}\n\nutil.getIndexByTime = function (time, segments) {\n const _len = segments.length\n let _index = -1\n if (_len < 1) {\n return _index\n }\n if (time <= segments[0].end || _len < 2) {\n _index = 0\n } else if (time > segments[_len - 1].end) {\n _index = _len - 1\n } else {\n for (let i = 1; i < _len; i++) {\n if (time > segments[i - 1].end && time <= segments[i].end){\n _index = i\n break\n }\n }\n }\n return _index\n}\nutil.getOffsetCurrentTime = function (currentTime, segments, index = -1) {\n let _index = -1\n if (index >= 0 && index < segments.length) {\n _index = index\n } else {\n _index = util.getIndexByTime(currentTime, segments)\n }\n if (_index < 0) {\n return -1\n }\n const _len = segments.length\n const { start, end, cTime, offset } = segments[_index]\n if (currentTime < start) {\n return cTime\n } else if (currentTime >= start && currentTime <= end) {\n return currentTime - offset\n } else if (currentTime > end && _index >= _len - 1) {\n return end\n }\n return -1\n}\n\n/**\n *\n * @param {*} offsetTime\n * @param {*} segments\n * @returns\n */\nutil.getCurrentTimeByOffset = function (offsetTime, segments) {\n let _index = -1\n if (!segments || segments.length < 0) {\n return offsetTime\n }\n for (let i = 0; i < segments.length; i++) {\n if (offsetTime <= segments[i].duration) {\n _index = i\n break\n }\n }\n if (_index !== -1) {\n const { start } = segments[_index]\n if (_index - 1 < 0) {\n return start + offsetTime\n } else {\n return start + (offsetTime - segments[_index - 1].duration)\n }\n }\n return offsetTime\n}\n\nfunction isObject (value) {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\nfunction debounce (func, wait, options) {\n let lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime\n\n let lastInvokeTime = 0\n let leading = false\n let maxing = false\n let trailing = true\n\n // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.\n const useRAF = (!wait && wait !== 0 && typeof window.requestAnimationFrame === 'function')\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n wait = +wait || 0\n if (isObject(options)) {\n leading = !!options.leading\n maxing = 'maxWait' in options\n maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n\n function invokeFunc (time) {\n const args = lastArgs\n const thisArg = lastThis\n\n lastArgs = lastThis = undefined\n lastInvokeTime = time\n result = func.apply(thisArg, args)\n return result\n }\n\n function startTimer (pendingFunc, wait) {\n if (useRAF) {\n window.cancelAnimationFrame(timerId)\n return window.requestAnimationFrame(pendingFunc)\n }\n return setTimeout(pendingFunc, wait)\n }\n\n function cancelTimer (id) {\n if (useRAF) {\n return window.cancelAnimationFrame(id)\n }\n clearTimeout(id)\n }\n\n function leadingEdge (time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time\n // Start the timer for the trailing edge.\n timerId = startTimer(timerExpired, wait)\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result\n }\n\n function remainingWait (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n const timeWaiting = wait - timeSinceLastCall\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting\n }\n\n function shouldInvoke (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait))\n }\n\n function timerExpired () {\n const time = Date.now()\n if (shouldInvoke(time)) {\n return trailingEdge(time)\n }\n // Restart the timer.\n timerId = startTimer(timerExpired, remainingWait(time))\n }\n\n function trailingEdge (time) {\n timerId = undefined\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time)\n }\n lastArgs = lastThis = undefined\n return result\n }\n\n function cancel () {\n if (timerId !== undefined) {\n cancelTimer(timerId)\n }\n lastInvokeTime = 0\n lastArgs = lastCallTime = lastThis = timerId = undefined\n }\n\n function flush () {\n return timerId === undefined ? result : trailingEdge(Date.now())\n }\n\n function pending () {\n return timerId !== undefined\n }\n\n function debounced (...args) {\n const time = Date.now()\n const isInvoking = shouldInvoke(time)\n\n lastArgs = args\n lastThis = this\n lastCallTime = time\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime)\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = startTimer(timerExpired, wait)\n return invokeFunc(lastCallTime)\n }\n }\n if (timerId === undefined) {\n timerId = startTimer(timerExpired, wait)\n }\n return result\n }\n debounced.cancel = cancel\n debounced.flush = flush\n debounced.pending = pending\n return debounced\n}\n\nfunction throttle (func, wait, options) {\n let leading = true\n let trailing = true\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n return debounce(func, wait, {\n leading,\n trailing,\n maxWait: wait\n })\n}\n\n/**\n * @returns { string }\n */\nfunction getLang () {\n let lang = (document.documentElement.getAttribute('lang') || navigator.language || 'zh-cn').toLocaleLowerCase()\n if (lang === 'zh-cn') {\n lang = 'zh'\n }\n return lang\n}\n\nfunction checkIsCurrentVideo (element, playerId, key) {\n if (!element) {\n return\n }\n const pid = element.getAttribute(key)\n if (pid && pid === playerId && (element.tagName === 'VIDEO' || element.tagName === 'AUDIO')) {\n return true\n }\n return false\n}\n\nexport {\n util as default,\n checkIsCurrentVideo,\n debounce,\n throttle,\n getLang\n}\n","/**\n * @typedef {{\n * isSupport: boolean,\n * mime: string\n * }} ICheckResult\n */\n\n/**\n * @typedef {{\n * device: 'pc' | 'mobile',\n * browser: 'ie' | 'firefox' | 'chrome' | 'opera' | 'safari',\n * os: {\n * isTablet: boolean,\n * isPhone: boolean,\n * isIpad: boolean,\n * isIos: boolean,\n * isAndroid: boolean,\n * isPc: boolean,\n * isSymbian: boolean,\n * isWindowsPhone: boolean,\n * isFireFox: boolean\n * },\n * isWeixin: boolean,\n * isSupportMP4(): ICheckResult,\n * isHevcSupported(): boolean,\n * probeConfigSupported(info: MediaDecodingConfiguration): Promise\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 'mp4v.20.8, mp4a.40.2',\n 'mp4v.20.240, mp4a.40.2'\n]\n\n/**\n * @type ISniffer\n */\nconst sniffer = {\n get device () {\n const r = sniffer.os\n return r.isPc ? 'pc' : 'mobile'\n // return r.isPc ? 'pc' : r.isTablet ? 'tablet' : 'mobile'\n },\n get browser () {\n if (typeof navigator === 'undefined') {\n return ''\n }\n const ua = navigator.userAgent.toLowerCase()\n const reg = {\n ie: /rv:([\\d.]+)\\) like gecko/,\n firefox: /firefox\\/([\\d.]+)/,\n chrome: /chrome\\/([\\d.]+)/,\n opera: /opera.([\\d.]+)/,\n safari: /version\\/([\\d.]+).*safari/\n }\n return [].concat(Object.keys(reg).filter(key => reg[key].test(ua)))[0]\n },\n get os () {\n if (typeof navigator === 'undefined') {\n return {}\n }\n const ua = navigator.userAgent\n const isWindowsPhone = /(?:Windows Phone)/.test(ua)\n const isSymbian = /(?:SymbianOS)/.test(ua) || isWindowsPhone\n const isAndroid = /(?:Android)/.test(ua)\n const isFireFox = /(?:Firefox)/.test(ua)\n const isIpad = /(?:iPad|PlayBook)/.test(ua) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)\n const isTablet =\n isIpad ||\n (isAndroid && !/(?:Mobile)/.test(ua)) ||\n (isFireFox && /(?:Tablet)/.test(ua))\n const isPhone = /(?:iPhone)/.test(ua) && !isTablet\n const isPc = !isPhone && !isAndroid && !isSymbian && !isTablet\n return {\n isTablet,\n isPhone,\n isIpad,\n isIos: isPhone || isIpad,\n isAndroid,\n isPc,\n isSymbian,\n isWindowsPhone,\n isFireFox\n }\n },\n\n get osVersion () {\n if (typeof navigator === 'undefined') {\n return 0\n }\n const ua = navigator.userAgent\n let reg = ''\n // ios\n if (/(?:iPhone)|(?:iPad|PlayBook)/.test(ua)) {\n reg = VERSION_REG.ios\n // android\n } else {\n reg = VERSION_REG.android\n }\n const _match = reg ? reg.exec(ua) : []\n if (_match && _match.length >= 3) {\n const version = _match[2].split('.')\n return version.length > 0 ? parseInt(version[0]) : 0\n }\n return 0\n },\n\n get isWeixin () {\n if (typeof navigator === 'undefined') {\n return false\n }\n const reg = /(micromessenger)\\/([\\d.]+)/\n const match = reg.exec(navigator.userAgent.toLocaleLowerCase())\n if (match) {\n return true\n }\n return false\n },\n\n /**\n *\n * @returns {{\n * isSupport: boolean,\n * mime: string\n * }}\n */\n isSupportMP4 () {\n const result = {\n isSupport: false,\n mime: ''\n }\n if (typeof document === 'undefined') {\n return result\n }\n if (this.supportResult) {\n return this.supportResult\n }\n let a = document.createElement('video')\n if (typeof a.canPlayType === 'function') {\n H264_MIMETYPES.map((key) => {\n if (a.canPlayType(`video/mp4; codecs=\"${key}\"`) === 'probably') {\n result.isSupport = true\n result.mime += `||${key}`\n }\n })\n }\n this.supportResult = result\n a = null\n return result\n },\n\n /**\n * @description check is support MediaSource Extends\n * @param {string} [mime]\n * @returns { boolean }\n */\n isMSESupport (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n if (typeof MediaSource === 'undefined' || !MediaSource) return false\n try {\n return MediaSource.isTypeSupported(mime)\n } catch (error) {\n this._logger.error(mime, error)\n return false\n }\n },\n\n /**\n * Is HEVC Hardware decoding supported by current browser\n * @returns {boolean}\n */\n isHevcSupported () {\n if (typeof MediaSource === 'undefined' || !MediaSource.isTypeSupported) {\n return false\n }\n return (\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.1.6.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.2.4.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.3.E.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.4.10.L120.90\"')\n )\n },\n\n /**\n * @param { MediaDecodingConfiguration } info\n * @returns { Promise }\n */\n probeConfigSupported (info) {\n const defaults = {\n supported: false,\n smooth: false,\n powerEfficient: false\n }\n if (!info || typeof navigator === 'undefined') {\n return Promise.resolve(defaults)\n }\n if (\n navigator.mediaCapabilities &&\n navigator.mediaCapabilities.decodingInfo\n ) {\n return navigator.mediaCapabilities.decodingInfo(info)\n } else {\n const videoConfig = info.video || {}\n const audioConfig = info.audio || {}\n try {\n const videoSupported = MediaSource.isTypeSupported(\n videoConfig.contentType\n )\n const audioSupported = MediaSource.isTypeSupported(\n audioConfig.contentType\n )\n\n return Promise.resolve({\n supported: videoSupported && audioSupported,\n smooth: false,\n powerEfficient: false\n })\n } catch (e) {\n return Promise.resolve(defaults)\n }\n }\n }\n}\n\nexport default sniffer\n","/**\n * @type {string}\n * */\nexport default __VERSION__\n","// eslint-disable-next-line no-undef\nimport version from './version'\nimport Util from './utils/util'\n/**\n * @typedef { import ('./player').default } Player\n */\n\nconst ERROR_TYPE_MAP = {\n 1: 'media',\n 2: 'media',\n 3: 'media',\n 4: 'media',\n 5: 'media',\n 6: 'media'\n}\n\nconst ERROR_MAP = {\n 1: 5101,\n 2: 5102,\n 3: 5103,\n 4: 5104,\n 5: 5105,\n 6: 5106\n}\n\nconst ErrorTypes = {\n network: {\n code: 1\n },\n mse: {\n code: 2\n },\n parse: {\n code: 3\n },\n format: {\n code: 4\n },\n decoder: {\n code: 5\n },\n runtime: {\n code: 6\n },\n timeout: {\n code: 7\n },\n drm: {\n code: 8\n },\n ad: {\n code: 9\n },\n other: {\n code: 1000\n }\n}\n\n/**\n * @typedef { {\n * playerVersion: string,\n * currentTime: number,\n * duration: number,\n * ended: boolean,\n * readyState: number,\n * networkState: number,\n * src: any,\n * errorType: string,\n * errorCode: number,\n * message: string,\n * mediaError?: {\n * code: number,\n * message?: string\n * },\n * originError?: any,\n * url?: any,\n * host?: string,\n * [propName: string]: any\n * } } IError\n */\n\n/**\n * @type { IError }\n */\nclass Errors {\n /**\n *\n * @param { Player } player\n * @param { {\n * errorType: string,\n * errorCode: number,\n * errorMessage: string,\n * originError: any,\n * ext: { [propName: string]: any; }\n * } } errorInfo\n * @returns\n */\n constructor (player, errorInfo = { errorType: '', errorCode: 0, errorMessage: '', originError: '', ext: {}, mediaError: null }) {\n const ERROR_TYPES = player && player.i18n ? player.i18n.ERROR_TYPES : null\n if (player.media) {\n const mediaError = errorInfo.mediaError ? errorInfo.mediaError : (player.media.error || {})\n const { duration, currentTime, ended, src, currentSrc } = player\n const { readyState, networkState } = player.media\n let _errc = errorInfo.errorCode || mediaError.code\n if (ERROR_MAP[_errc]) {\n _errc = ERROR_MAP[_errc]\n }\n const r = {\n playerVersion: version,\n currentTime,\n duration,\n ended,\n readyState,\n networkState,\n src: src || currentSrc,\n errorType: errorInfo.errorType,\n errorCode: _errc,\n message: errorInfo.errorMessage || mediaError.message,\n mediaError,\n originError: errorInfo.originError ? errorInfo.originError.stack : '',\n host: Util.getHostFromUrl(src || currentSrc)\n }\n errorInfo.ext && Object.keys(errorInfo.ext).map(key => {\n r[key] = errorInfo.ext[key]\n })\n return r\n } else {\n if (arguments.length > 1) {\n const r = {\n playerVersion: version,\n domain: document.domain\n }\n const arr = ['errorType', 'currentTime', 'duration', 'networkState', 'readyState', 'src', 'currentSrc', 'ended', 'errd', 'errorCode', 'mediaError']\n for (let i = 0; i < arguments.length; i++) {\n r[arr[i]] = arguments[i]\n }\n r.ex = ERROR_TYPES ? (ERROR_TYPES[arguments[0]] || {}).msg : ''// 补充信息\n return r\n }\n }\n }\n}\n\nexport {\n Errors as default,\n ErrorTypes,\n ERROR_TYPE_MAP\n}\n","export const PLAY = 'play'\nexport const PLAYING = 'playing'\nexport const ENDED = 'ended'\nexport const PAUSE = 'pause'\nexport const ERROR = 'error'\nexport const SEEKING = 'seeking'\nexport const SEEKED = 'seeked'\nexport const TIME_UPDATE = 'timeupdate'\nexport const WAITING = 'waiting'\nexport const CANPLAY = 'canplay'\nexport const CANPLAY_THROUGH = 'canplaythrough'\nexport const DURATION_CHANGE = 'durationchange'\nexport const VOLUME_CHANGE = 'volumechange'\nexport const LOADED_DATA = 'loadeddata'\nexport const LOADED_METADATA = 'loadedmetadata'\nexport const RATE_CHANGE = 'ratechange'\nexport const PROGRESS = 'progress'\nexport const LOAD_START = 'loadstart'\nexport const EMPTIED = 'emptied'\nexport const STALLED = 'stalled'\nexport const SUSPEND = 'suspend'\nexport const ABORT = 'abort'\n\n// player events\nexport const BUFFER_CHANGE = 'bufferedChange'\nexport const PLAYER_FOCUS = 'focus'\nexport const PLAYER_BLUR = 'blur'\nexport const READY = 'ready'\nexport const URL_NULL = 'urlNull'\nexport const AUTOPLAY_STARTED = 'autoplay_started'\nexport const AUTOPLAY_PREVENTED = 'autoplay_was_prevented'\nexport const COMPLETE = 'complete'\nexport const REPLAY = 'replay'\nexport const DESTROY = 'destroy'\nexport const URL_CHANGE = 'urlchange'\nexport const DOWNLOAD_SPEED_CHANGE = 'download_speed_change'\nexport const LEAVE_PLAYER = 'leaveplayer'\nexport const ENTER_PLAYER = 'enterplayer'\nexport const LOADING = 'loading'\n\n// screen change evnets\nexport const FULLSCREEN_CHANGE = 'fullscreen_change'\nexport const CSS_FULLSCREEN_CHANGE = 'cssFullscreen_change'\nexport const MINI_STATE_CHANGE = 'mini_state_change'\n\nexport const DEFINITION_CHANGE = 'definition_change'\nexport const BEFORE_DEFINITION_CHANGE = 'before_definition_change'\nexport const AFTER_DEFINITION_CHANGE = 'after_definition_change'\n\n// transmuxer events\nexport const SEI_PARSED = 'SEI_PARSED'\n\nexport const RETRY = 'retry'\n\n// 容器宽高变化\nexport const VIDEO_RESIZE = 'video_resize'\n\n// picture-in-picture状态变化\nexport const PIP_CHANGE = 'pip_change'\n\n// rotate change\nexport const ROTATE = 'rotate'\n\n// screenShot\nexport const SCREEN_SHOT = 'screenShot'\n\n// play next\nexport const PLAYNEXT = 'playnext'\n\nexport const SHORTCUT = 'shortcut'\n\nexport const XGLOG = 'xglog'\n\nexport const USER_ACTION = 'user_action'\n\nexport const RESET = 'reset'\n\nexport const SOURCE_ERROR = 'source_error'\n\nexport const SOURCE_SUCCESS = 'source_success'\n\nexport const SWITCH_SUBTITLE = 'switch_subtitle'\n\nexport const VIDEO_EVENTS = [\n 'play',\n 'playing',\n 'ended',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'timeupdate',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'durationchange',\n 'volumechange',\n 'loadeddata',\n 'loadedmetadata',\n 'ratechange',\n 'progress',\n 'loadstart',\n 'emptied',\n 'stalled',\n 'suspend',\n 'abort',\n 'lowdecode'\n]\n\nexport const STATS_EVENTS = {\n STATS_INFO: 'stats_info',\n STATS_DOWNLOAD: 'stats_download',\n STATS_RESET: 'stats_reset'\n}\n\nexport const FPS_STUCK = 'fps_stuck'","import EventEmitter from 'eventemitter3'\nimport Util from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Errors, { ERROR_TYPE_MAP } from './error'\nimport { URL_CHANGE, WAITING, VIDEO_EVENTS, SOURCE_ERROR, SOURCE_SUCCESS } from './events'\n/**\n * @typedef { import ('eventemitter3') } EventEmitter\n */\n/**\n * @typedef { {\n * duration: number,\n * currentTime: number,\n * muted: boolean,\n * defaultMuted: boolean,\n * volume: number,\n * playbackRate: number,\n * defaultPlaybackRate: number,\n * autoplay: boolean,\n * readonly paused: boolean,\n * readonly ended: boolean,\n * readonly networkState: number,\n * readonly readyState: number,\n * readonly seeking: boolean,\n * src: any,\n * play: Function,\n * pause: Function,\n * } } IMediaProxy\n */\n\nfunction emitVideoEvent (eventKey, e) {\n if (!this || !this.emit) {\n return\n }\n if (eventKey === 'error') {\n this.errorHandler(eventKey, e.error)\n } else {\n this.emit(eventKey, e)\n }\n}\n\n// 获取包装EventsMiddleware后的VIDEO_EVENT\nfunction getVideoEventHandler (eventKey, player) {\n return (e, _err) => {\n const eData = {\n player,\n eventName: eventKey,\n originalEvent: e,\n detail: e.detail || {},\n timeStamp: e.timeStamp,\n currentTime: player.currentTime,\n duration: player.duration,\n paused: player.paused,\n ended: player.ended,\n isInternalOp: !!player._internalOp[e.type], // 是否是内部操作,不反应到UI上\n muted: player.muted,\n volume: player.volume,\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype\n }\n player.removeInnerOP(e.type)\n if (eventKey === 'timeupdate') {\n player._currentTime = player.media && player.media.currentTime\n }\n\n // 避免playbackRate和defaultPlaybackRate同时设置导致多次触发事件\n if (eventKey === 'ratechange') {\n const _rate = player.media ? player.media.playbackRate : 0\n if (_rate && player._rate === _rate) {\n return\n }\n player._rate = player.media && player.media.playbackRate\n }\n\n if (eventKey === 'durationchange') {\n player._duration = player.media.duration\n }\n\n if (eventKey === 'volumechange') {\n eData.isMutedChange = player._lastMuted !== player.muted\n player._lastMuted = player.muted\n }\n\n if (eventKey === 'error') {\n eData.error = _err || player.video.error\n }\n\n // 执行video相关事件中间件能力\n if (player.mediaEventMiddleware[eventKey]) {\n const callback = emitVideoEvent.bind(player, eventKey, eData)\n try {\n player.mediaEventMiddleware[eventKey].call(player, eData, callback)\n } catch (err) {\n emitVideoEvent.call(player, eventKey, eData)\n throw err\n }\n } else {\n emitVideoEvent.call(player, eventKey, eData)\n }\n }\n}\n\n/**\n * @extends { EventEmitter }\n */\nclass MediaProxy extends EventEmitter {\n constructor (options) {\n super(options)\n /**\n * @type { boolean }\n * @private\n */\n this._hasStart = false\n /**\n * @type { number }\n * @private\n */\n this._currentTime = 0\n /**\n * @type { number }\n * @private\n */\n this._duration = 0\n /**\n * @type {{[propName: string]: any}}\n * @private\n */\n this._internalOp = {}\n /**\n * @type { boolean }\n * @private\n */\n this._lastMuted = false\n\n /**\n * @type {string}\n * 当前播放类型\n */\n this.vtype = 'MP4'\n\n /**\n * @type {number}\n * @private\n */\n this._rate = -1\n /**\n * @description 初始化时添加在video上的属性集合\n * @type { {[propName: string]: any } }\n */\n this.mediaConfig = Object.assign({}, {\n controls: false,\n autoplay: options.autoplay,\n playsinline: options.playsinline,\n 'x5-playsinline': options.playsinline,\n 'webkit-playsinline': options.playsinline,\n 'x5-video-player-fullscreen': options['x5-video-player-fullscreen'] || options.x5VideoPlayerFullscreen,\n 'x5-video-orientation': options['x5-video-orientation'] || options.x5VideoOrientation,\n airplay: options.airplay,\n 'webkit-airplay': options.airplay,\n tabindex: options.tabindex | 0,\n mediaType: options.mediaType || 'video',\n 'data-index': -1\n }, options.videoConfig, options.videoAttributes)\n /**\n * @description Compatible with WeChat webview\n * \"x5-playsinline' and 'x5-video-player-type' only one needs to exist\n * @doc https://x5.tencent.com/docs/video.html\n */\n const playerType = options['x5-video-player-type'] || options.x5VideoPlayerType\n if (Sniffer.isWeixin && Sniffer.os.isAndroid && playerType) {\n this.mediaConfig['x5-video-player-type'] = playerType\n delete this.mediaConfig.playsinline\n delete this.mediaConfig['webkit-playsinline']\n delete this.mediaConfig['x5-playsinline']\n }\n\n if (options.loop) {\n this.mediaConfig.loop = 'loop'\n }\n\n // Warning:一些移动端浏览器需要设置DOM属性,否则会导致非静音切换频地址后开播失败\n if (options.autoplayMuted && !Object.prototype.hasOwnProperty.call(this.mediaConfig, 'muted')) {\n this.mediaConfig.muted = true\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n */\n this.media = Util.createDom(this.mediaConfig.mediaType, '', this.mediaConfig, '')\n\n if (options.defaultPlaybackRate) {\n this.media.defaultPlaybackRate = this.media.playbackRate = options.defaultPlaybackRate\n }\n\n if (Util.typeOf(options.volume) === 'Number') {\n this.volume = options.volume\n }\n\n if (options.autoplayMuted) {\n this.media.muted = true\n this._lastMuted = true\n }\n if (options.autoplay) {\n this.media.autoplay = true\n }\n\n /**\n * @private\n */\n this._interval = {}\n /**\n * @readonly\n */\n this.mediaEventMiddleware = {}\n this.attachVideoEvents()\n }\n\n /**\n * @description set middleware\n * @param { {[propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n setEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n this.mediaEventMiddleware[key] = middlewares[key]\n })\n }\n\n /**\n * @description remove middleware\n * @param { { [propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n removeEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n delete this.mediaEventMiddleware[key]\n })\n }\n\n /**\n * Add media eventListener to the video object\n * @param { any } [media]\n */\n attachVideoEvents (media = this.media) {\n if (!this._evHandlers) {\n /**\n * @private\n */\n this._evHandlers = VIDEO_EVENTS.map(eventKey => {\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.on(eventKey, this[funName])\n }\n\n return {\n [eventKey]: getVideoEventHandler(eventKey, this)\n }\n })\n }\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n media.addEventListener(eventKey, item[eventKey], false)\n })\n }\n\n /**\n * @description remove media eventListener from the video object\n * @param { any } [media]\n */\n detachVideoEvents (media = this.media) {\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n media.removeEventListener(eventKey, item[eventKey], false)\n })\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.off(eventKey, this[funName])\n }\n })\n\n this._evHandlers = null\n }\n\n /**\n * 针对source列表播放方式添加错误监听\n * @doc https://stackoverflow.com/questions/47557135/html5-detect-the-type-of-error-when-trying-to-load-a-video-using-a-source-elem\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n * @param { Array<{src: string, type: string }>} urls\n */\n _attachSourceEvents (video, urls) {\n video.removeAttribute('src')\n video.load()\n urls.forEach((item, index) => {\n this.media.appendChild(Util.createDom('source', '', {\n src: `${item.src}`,\n type: `${item.type || ''}`,\n 'data-index': index + 1\n }))\n })\n const _c = video.children\n if (!_c) {\n return\n }\n /**\n * @private\n */\n this._videoSourceCount = _c.length\n\n this._videoSourceIndex = _c.length\n\n this._vLoadeddata = (e) => {\n this.emit(SOURCE_SUCCESS, { src: e.target.currentSrc, host: Util.getHostFromUrl(e.target.currentSrc) })\n }\n\n /**\n * @private\n */\n let _eHandler = null\n\n for (let i = 0; i < this._evHandlers.length; i++) {\n if (Object.keys(this._evHandlers[i])[0] === 'error') {\n _eHandler = this._evHandlers[i]\n break\n }\n }\n // safari有些版本不是所有source都请求,导致单独使用_videoSourceIndex计算会报错\n !this._sourceError && (this._sourceError = (e) => {\n const _dIndex = parseInt(e.target.getAttribute('data-index'), 10)\n this._videoSourceIndex--\n if (this._videoSourceIndex === 0 || _dIndex >= this._videoSourceCount) {\n const _err = { code: 4, message: 'sources_load_error' }\n _eHandler ? _eHandler.error(e, _err) : this.errorHandler('error', _err)\n }\n const type = ERROR_TYPE_MAP[4]\n this.emit(SOURCE_ERROR, new Errors(this, {\n errorType: type,\n errorCode: 4,\n errorMessage: 'sources_load_error',\n mediaError: { code: 4, message: 'sources_load_error' },\n src: e.target.src\n }))\n })\n for (let i = 0; i < _c.length; i++) {\n _c[i].addEventListener('error', this._sourceError)\n }\n video.addEventListener('loadeddata', this._vLoadeddata)\n }\n\n /**\n * 移除source列表错误事件监听\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n */\n _detachSourceEvents (video) {\n const _c = video.children\n if (!_c || _c.length === 0 || !this._sourceError) {\n return\n }\n for (let i = 0; i < _c.length; i++) {\n _c[i].removeEventListener('error', this._sourceError)\n }\n while (_c.length > 0) {\n video.removeChild(_c[0])\n }\n this._vLoadeddata && video.removeEventListener('loadeddata', this._vLoadeddata)\n }\n\n /**\n * @description Media Error handler\n * @param { string } eventName\n */\n errorHandler (name, error = null) {\n if (this.media && (this.media.error || error)) {\n let _e = this.media.error || error\n const type = _e.code ? ERROR_TYPE_MAP[_e.code] : 'other'\n let message = _e.message\n if (!this.media.currentSrc) {\n message = 'empty_src'\n _e = {\n code: 6,\n message\n }\n }\n this.emit(name, new Errors(this, {\n errorType: type,\n errorCode: _e.code,\n errorMessage: _e.message || '',\n mediaError: _e\n }))\n }\n }\n\n destroy () {\n if (this.media) {\n if (this.media.pause) {\n this.media.pause()\n this.media.muted = true\n }\n this.media.removeAttribute('src') // empty source\n this.media.load()\n }\n this._currentTime = 0\n this._duration = 0\n this.mediaConfig = null\n for (const k in this._interval) {\n if (Object.prototype.hasOwnProperty.call(this._interval, k)) {\n clearInterval(this._interval[k])\n this._interval[k] = null\n }\n }\n this.detachVideoEvents()\n this.media = null\n this.mediaEventMiddleware = {}\n this.removeAllListeners()\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media\n */\n get video () {\n return this.media\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media= xx\n */\n set video (media) {\n this.media = media\n }\n\n /**\n *\n * @returns { Promise | null }\n */\n play () {\n const ret = this.media ? this.media.play() : null\n return ret\n }\n\n pause () {\n this.media && this.media.pause()\n }\n\n load () {\n this.media && this.media.load()\n }\n\n /**\n *\n * @param { string } type\n * @returns { boolean }\n */\n canPlayType (type) {\n return this.media ? this.media.canPlayType(type) : false\n }\n\n /**\n *\n * @param { any } [buffered]\n * @returns { Array }\n */\n getBufferedRange (buffered) {\n const range = [0, 0]\n if (!this.media) {\n return range\n }\n if (!buffered) {\n buffered = this.media.buffered\n }\n const currentTime = this.media.currentTime\n if (buffered) {\n for (let i = 0, len = buffered.length; i < len; i++) {\n range[0] = buffered.start(i)\n range[1] = buffered.end(i)\n if (range[0] <= currentTime && currentTime <= range[1]) {\n break\n }\n }\n }\n if (range[0] - currentTime <= 0 && currentTime - range[1] <= 0) {\n return range\n } else {\n return [0, 0]\n }\n }\n\n /**\n * @type { boolean }\n * @description 设置/返回 自动播放属性\n */\n set autoplay (isTrue) {\n this.media && (this.media.autoplay = isTrue)\n }\n\n get autoplay () {\n return this.media ? this.media.autoplay : false\n }\n\n /**\n * @type { TimeRanges | null }\n * @description 返回当前缓冲的TimeRange对象集合\n */\n get buffered () {\n return this.media ? this.media.buffered : null\n }\n\n /**\n * @type { Array<{start: number, end: number}> | null}\n * @description 返回当前自定义的缓存列表\n */\n get buffered2 () {\n return this.media && this.media.buffered ? Util.getBuffered2(this.media.buffered) : null\n }\n\n /**\n * @type { {start: number, end: number} }\n */\n get bufferedPoint () {\n const ret = {\n start: 0,\n end: 0\n }\n if (!this.media) {\n return ret\n }\n const _buffered = this.media.buffered\n if (!_buffered || _buffered.length === 0) {\n return ret\n }\n for (let i = 0; i < _buffered.length; i++) {\n if ((_buffered.start(i) <= this.currentTime || _buffered.start(i) < 0.1) && _buffered.end(i) >= this.currentTime) {\n return {\n start: _buffered.start(i),\n end: _buffered.end(i)\n }\n }\n }\n return ret\n }\n\n /**\n * @type { string}\n * @description 设置/返回是否跨域\n * */\n get crossOrigin () {\n return this.media ? this.media.crossOrigin : ''\n }\n\n set crossOrigin (isTrue) {\n this.media && (this.media.crossOrigin = isTrue)\n }\n\n /**\n * @type { string }\n * @description 设置/返回视频播放地址\n * */\n get currentSrc () {\n return this.media ? this.media.currentSrc : ''\n }\n\n set currentSrc (src) {\n this.media && (this.media.currentSrc = src)\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频当前播放时间\n * */\n get currentTime () {\n if (!this.media) {\n return 0\n }\n return this.media.currentTime !== undefined ? this.media.currentTime : this._currentTime\n }\n\n set currentTime (time) {\n this.media && (this.media.currentTime = time)\n }\n\n /**\n * @type { boolean }\n * 设置/返回视频默认静音\n * */\n get defaultMuted () {\n return this.media ? this.media.defaultMuted : false\n }\n\n set defaultMuted (isTrue) {\n this.media && (this.media.defaultMuted = isTrue)\n }\n\n /**\n * @type { number }\n * @description 返回视频时长,单位:s\n * */\n get duration () {\n return this._duration\n }\n\n /**\n * @type { boolean }\n * @description 回视频是否播放结束\n * */\n get ended () {\n return this.media ? this.media.ended : false\n }\n\n /**\n * @type { MediaError }\n * @description the player current error\n */\n get error () {\n return this.media.error\n }\n\n /**\n * @type { string }\n * @description return error description text\n */\n get errorNote () {\n const err = this.media.error\n if (!err) {\n return ''\n }\n const status = [\n 'MEDIA_ERR_ABORTED',\n 'MEDIA_ERR_NETWORK',\n 'MEDIA_ERR_DECODE',\n 'MEDIA_ERR_SRC_NOT_SUPPORTED'\n ]\n return status[this.media.error.code - 1]\n }\n\n /**\n * @type { boolean }\n * @description 否开启了循环播放\n */\n get loop () {\n return this.media ? this.media.loop : false\n }\n\n set loop (isTrue) {\n this.media && (this.media.loop = isTrue)\n }\n\n /**\n * @type { boolean }\n * @description 静音\n */\n get muted () {\n return this.media ? this.media.muted : false\n }\n\n set muted (isTrue) {\n if (!this.media || this.media.muted === isTrue) {\n return\n }\n this._lastMuted = this.media.muted\n this.media.muted = isTrue\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 }\n * @description 返回视频的当前网络状态\n */\n get networkState () {\n return this.media.networkState\n }\n\n /**\n * @type { boolean }\n * @description 回当前视频是否是暂停状态\n */\n get paused () {\n return this.media ? this.media.paused : true\n }\n\n /**\n * @type { number }\n * @description 返回/设置倍速\n */\n get playbackRate () {\n return this.media ? this.media.playbackRate : 0\n }\n\n set playbackRate (rate) {\n if (!this.media || rate === Infinity) {\n return\n }\n this.media.defaultPlaybackRate = rate\n this.media.playbackRate = rate\n }\n\n /**\n * @type { TimeRanges | null}\n */\n get played () {\n return this.media ? this.media.played : null\n }\n\n /**\n * @type { boolean }\n */\n get preload () {\n return this.media ? this.media.preload : false\n }\n\n set preload (isTrue) {\n this.media && (this.media.preload = isTrue)\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 | 4 }\n * @description 回视频的就绪状态\n */\n get readyState () {\n return this.media.readyState\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否可以seek\n */\n get seekable () {\n return this.media ? this.media.seekable : false\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否处于seeking状态下\n */\n get seeking () {\n return this.media ? this.media.seeking : false\n }\n\n /**\n * @type { any }\n * @description 设置/返回当前视频的地址\n */\n get src () {\n return this.media ? this.media.src : ''\n }\n\n set src (url) {\n if (!this.media) {\n return\n }\n this.emit(URL_CHANGE, url)\n this.emit(WAITING)\n // this.media.pause()\n this._currentTime = 0\n this._duration = 0\n // Some firefox versions firefox Cannot recognize currentSrc of type Blob\n if (Util.isMSE(this.media)) {\n this.onWaiting()\n return\n }\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array') {\n this._attachSourceEvents(this.media, url)\n } else if (url) {\n this.media.src = url\n } else {\n this.media.removeAttribute('src')\n }\n this.load()\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频的音量\n */\n get volume () {\n return this.media ? this.media.volume : 0\n }\n\n set volume (vol) {\n if (vol === Infinity || !this.media) {\n return\n }\n this.media.volume = vol\n }\n\n /**\n * @type { number }\n * @description 返回视频的纵横比\n */\n get aspectRatio () {\n return this.media ? this.media.videoWidth / this.media.videoHeight : 0\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 * @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 * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n on (event, callback, ...args) {\n super.on(event, callback, ...args)\n }\n\n /**\n * @param { string } event\n * @param { (...args: 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 { (...args: any[]) => any } callback\n * @returns\n */\n off (event, callback, ...args) {\n super.off(event, callback, ...args)\n }\n\n offAll () {\n super.removeAllListeners()\n }\n}\n\nexport default MediaProxy\n","class INDEXDB {\n constructor (mydb = { name: 'xgplayer', version: 1, db: null, ojstore: { name: 'xg-m4a', keypath: 'vid' } }) {\n this.indexedDB = window.indexedDB || window.webkitindexedDB\n this.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange // 键范围\n this.myDB = mydb\n }\n\n openDB (callback) {\n // 建立或打开数据库,建立对象存储空间(ObjectStore)\n const self = this\n const version = this.myDB.version || 1\n const request = self.indexedDB.open(self.myDB.name, version)\n request.onerror = function (e) {\n // console.log('e.currentTarget.error.message')\n }\n request.onsuccess = e => {\n this.myDB.db = e.target.result\n // console.log('成功建立并打开数据库:' + this.myDB.name + ' version' + this.myDB.version)\n callback.call(self)\n }\n request.onupgradeneeded = e => {\n const db = e.target.result\n // eslint-disable-next-line no-unused-vars\n const transaction = e.target.transaction\n // eslint-disable-next-line no-unused-vars\n let store\n if (!db.objectStoreNames.contains(self.myDB.ojstore.name)) {\n // 没有该对象空间时创建该对象空间\n // eslint-disable-next-line no-unused-vars\n store = db.createObjectStore(self.myDB.ojstore.name, { keyPath: self.myDB.ojstore.keypath })\n // console.log('成功建立对象存储空间:' + this.myDB.ojstore.name)\n }\n }\n }\n\n deletedb () {\n // 删除数据库\n const self = this\n self.indexedDB.deleteDatabase(this.myDB.name)\n // console.log(this.myDB.name + '数据库已删除')\n }\n\n closeDB () {\n // 关闭数据库\n this.myDB.db.close()\n // console.log('数据库已关闭')\n }\n\n addData (storename, data) {\n // 添加数据,重复添加会报错\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.add(data[i])\n request.onerror = function () {\n // console.error('add添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('add添加数据已存入数据库')\n }\n }\n }\n\n putData (storename, data) {\n // 添加数据,重复添加会更新原有数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.put(data[i])\n request.onerror = function () {\n // console.error('put添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('put添加数据已存入数据库')\n }\n }\n }\n\n getDataByKey (storename, key, callback) {\n const self = this\n // 根据存储空间的键找到对应数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n const request = store.get(key)\n request.onerror = function () {\n // console.error('getDataByKey error')\n callback.call(self, null)\n }\n request.onsuccess = function (e) {\n const result = e.target.result\n // console.log('查找数据成功')\n callback.call(self, result)\n }\n }\n\n deleteData (storename, key) {\n // 删除某一条记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.delete(key)\n // console.log('已删除存储空间' + storename + '中' + key + '记录')\n }\n\n clearData (storename) {\n // 删除存储空间全部记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.clear()\n // console.log('已删除存储空间' + storename + '全部记录')\n }\n}\n\nexport default INDEXDB\n","export const FULLSCREEN_EVENTS = ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange']\n\nexport const GET_FULLSCREEN_API = ['requestFullscreen', 'webkitRequestFullscreen', 'mozRequestFullScreen', 'msRequestFullscreen']\n\nexport const EXIT_FULLSCREEN_API = ['exitFullscreen', 'webkitExitFullscreen', 'mozCancelFullScreen', 'msExitFullscreen']\n\nexport const PLATER_ID = 'data-xgplayerid'","function callHandler (obj, handler, next, ...args) {\n const ret = handler.call(obj, ...args)\n if (!next || typeof next !== 'function') {\n return\n }\n if (ret && ret.then) {\n ret.then((...args) => {\n next.call(obj, ...args)\n })\n } else {\n next.call(obj, ...args)\n }\n}\n\n/**\n * 给某个处理函数添加hook能力\n * @param { string } hookName\n * @param { Function } handler\n * @param { { pre?: any, next?:any } } preset\n * {\n * pre: () => { // run beafore hook},\n * next: () => { // run after hook return}\n * }\n */\nfunction hook (hookName, handler, preset = { pre: null, next: null }) {\n if (!this.__hooks) {\n this.__hooks = {}\n }\n !this.__hooks[hookName] && (this.__hooks[hookName] = null)\n return function () {\n if (preset.pre) {\n try {\n preset.pre.call(this, ...arguments)\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}:pre error] >> ${e.message}`\n throw e\n }\n }\n if (this.__hooks && this.__hooks[hookName]) {\n try {\n const preRet = runHooks(this, hookName, handler)\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\nfunction findHookIndex (hookName, handler) {\n const { __hooks } = this\n if (!__hooks || !Array.isArray(__hooks[hookName])) {\n return -1\n }\n const hookHandlers = __hooks[hookName]\n for (let i = 0; i < hookHandlers.length; i++) {\n if (hookHandlers[i] === handler) {\n return i\n }\n }\n return -1\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 if (!Array.isArray(__hooks[hookName])) {\n __hooks[hookName] = []\n }\n\n if (findHookIndex.call(this, hookName, handler) === -1) {\n __hooks[hookName].push(handler)\n }\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\n if (Array.isArray(__hooks[hookName])) {\n const hooks = __hooks[hookName]\n const index = findHookIndex.call(this, hookName, handler)\n\n if (index !== -1) {\n hooks.splice(index, 1)\n }\n }\n delete __hooks[hookName]\n}\n\n/**\n * Add hooks to a plugin\n * @param { string } pluginName\n * @param {...any} args\n */\nfunction usePluginHooks (pluginName, ...args) {\n if (!this.plugins || !this.plugins[pluginName.toLowerCase()]) {\n return\n }\n const plugin = this.plugins[pluginName.toLowerCase()]\n return plugin.useHooks && plugin.useHooks(...args)\n}\n\nfunction removePluginHooks (pluginName, ...args) {\n if (!this.plugins || !this.plugins[pluginName.toLowerCase()]) {\n return\n }\n const plugin = this.plugins[pluginName.toLowerCase()]\n if (plugin) {\n return plugin.removeHooks && plugin.removeHooks(...args)\n }\n}\n\n/**\n * hook decorator, add hooks props for for an instance\n * @param { any } instance\n * @param { Array } [hookNames]\n */\nfunction hooksDescriptor (instance, presetHooks = []) {\n instance.__hooks = {}\n presetHooks && presetHooks.map(item => {\n instance.__hooks[item] = null\n })\n Object.defineProperty(instance, 'hooks', {\n get: () => {\n return instance.__hooks && Object.keys(instance.__hooks).map(key => {\n if (instance.__hooks[key]) {\n return key\n }\n })\n }\n })\n}\n\nfunction delHooksDescriptor (instance) {\n instance.__hooks = null\n}\n\nfunction runHooks (obj, hookName, handler, ...args) {\n if (obj.__hooks && Array.isArray(obj.__hooks[hookName])) {\n const hooks = obj.__hooks[hookName]\n let index = -1\n /**\n * @private\n */\n const runHooksRecursive = function (obj, hookName, handler, ...args) {\n index++\n // 递归终止条件\n if (hooks.length === 0 || index === hooks.length) {\n return handler.call(obj, obj, ...args)\n }\n // 递归调用\n const hook = hooks[index]\n const ret = hook.call(obj, obj, ...args)\n if (ret && ret.then) {\n return ret.then((data) => {\n return data === false ? null : runHooksRecursive(obj, hookName, handler, ...args)\n }).catch(e => {\n console.warn(`[runHooks]${hookName} reject`, e.message)\n })\n } else if (ret !== false) {\n return runHooksRecursive(obj, hookName, handler, ...args)\n }\n }\n\n return runHooksRecursive(obj, hookName, handler, ...args)\n } else {\n return handler.call(obj, obj, ...args)\n }\n}\n\nexport {\n hooksDescriptor as default,\n hook,\n useHooks,\n usePluginHooks,\n removePluginHooks,\n removeHooks,\n delHooksDescriptor,\n runHooks\n}\n","import Util from '../utils/util'\nimport Sniffer from '../utils/sniffer'\nimport Errors from '../error'\nimport * as Events from '../events'\nimport XG_DEBUG from '../utils/debug'\nimport hooksDescriptor, { hook, useHooks, removeHooks, delHooksDescriptor } from './hooksDescriptor'\n\nfunction showErrorMsg (pluginName, msg) {\n XG_DEBUG.logError(`[${pluginName}] event or callback cant be undefined or null when call ${msg}`)\n}\n\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef { import ('../defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * [propName: string]: any;\n * }} IBasePluginOptions\n */\nclass BasePlugin {\n static defineGetterOrSetter (Obj, map) {\n for (const key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key)) {\n Object.defineProperty(Obj, key, map[key])\n }\n }\n }\n static defineMethod (Obj, map) {\n for (const key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key) && typeof map[key] === 'function') {\n Object.defineProperty(Obj, key, {\n configurable: true,\n value: map[key]\n })\n }\n }\n }\n\n /**\n * @type { { [propName: string]: any } }\n */\n static get defaultConfig () {\n return {}\n }\n\n /**\n * @type { string }\n */\n static get pluginName () {\n return 'pluginName'\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n constructor (args) {\n if (Util.checkIsFunction(this.beforeCreate)) {\n this.beforeCreate(args)\n }\n hooksDescriptor(this)\n /**\n * @private\n */\n this.__args = args\n /**\n * @private\n */\n this.__events = {} // 对player的事件监听缓存\n this.__onceEvents = {}\n this.config = args.config || {}\n /**\n * @readonly\n * @type { Player }\n */\n this.player = null\n /**\n * @readonly\n * @type { IPlayerOptions }\n */\n this.playerConfig = {}\n /**\n * @readonly\n * @type {string}\n */\n this.pluginName = ''\n this.__init(args)\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n beforeCreate (args) {}\n afterCreate () {}\n beforePlayerInit () {}\n onPluginsReady () {}\n afterPlayerInit () {}\n destroy () {}\n\n /**\n * @protected\n * @param { any } args\n */\n __init (args) {\n this.player = args.player\n this.playerConfig = args.player && args.player.config\n this.pluginName = args.pluginName ? args.pluginName.toLowerCase() : this.constructor.pluginName.toLowerCase()\n this.logger = args.player && args.player.logger\n // BasePlugin.defineGetterOrSetter(this, {\n // player: {\n // get: () => {\n // return args.player\n // },\n // configurable: true\n // },\n // playerConfig: {\n // get: () => {\n // return args.player && args.player.config\n // },\n // configurable: true\n // },\n\n // pluginName: {\n // get: () => {\n // if (args.pluginName) {\n // return args.pluginName.toLowerCase()\n // } else {\n // return this.constructor.pluginName.toLowerCase()\n // }\n // },\n // configurable: true\n // },\n // logger: {\n // get: () => {\n // return args.player.logger\n // },\n // configurable: true\n // }\n // })\n }\n\n /**\n * 更新语言\n * @param { string } lang\n */\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n }\n\n /**\n * @type { string }\n */\n get lang () {\n return this.player.lang\n }\n\n get i18n () {\n return this.player.i18n\n }\n\n get i18nKeys () {\n return this.player.i18nKeys\n }\n\n /**\n * @description当前支持的事件类型\n * @type { 'touch' | 'mouse' }\n */\n get domEventType () {\n let _e = Util.checkTouchSupport() ? 'touch' : 'mouse'\n if (this.playerConfig && (this.playerConfig.domEventType === 'touch' || this.playerConfig.domEventType === 'mouse')) {\n _e = this.playerConfig.domEventType\n }\n return _e\n }\n\n /**\n *\n * @param { string | Array } event\n * @param { Function } callback\n * @returns\n */\n on (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.on(event, callback)')\n return\n }\n if (typeof event === 'string') {\n this.__events[event] = callback\n this.player.on(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n this.__events[item] = callback\n this.player.on(item, callback)\n })\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } callback\n * @returns\n */\n once (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.once(event, callback)')\n return\n }\n if (typeof event === 'string') {\n this.__onceEvents[event] = callback\n this.player.once(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n this.__onceEvents[item] = callback\n this.player.once(event, callback)\n })\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } callback\n * @returns\n */\n off (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.off(event, callback)')\n return\n }\n if (typeof event === 'string') {\n delete this.__events[event]\n this.player.off(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n delete this.__events[event]\n this.player.off(item, callback)\n })\n }\n }\n\n offAll () {\n ['__events', '__onceEvents'].forEach(key => {\n Object.keys(this[key]).forEach(item => {\n this[key][item] && this.off(item, this[key][item])\n item && delete this[key][item]\n })\n })\n this.__events = {}\n this.__onceEvents = {}\n }\n\n /**\n *\n * @param { string } event\n * @param {...any} res\n * @returns\n */\n emit (event, ...res) {\n if (!this.player) {\n return\n }\n this.player.emit(event, ...res)\n }\n\n emitUserAction (event, action, params = {}) {\n if (!this.player) {\n return\n }\n const nParams = {\n ...params,\n pluginName: this.pluginName\n }\n this.player.emitUserAction(event, action, nParams)\n }\n\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n useHooks (hookName, handler, ...args) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n removeHooks (hookName, handler, ...args) {\n return removeHooks.call(this, ...arguments)\n }\n\n /**\n * 注册子插件\n * @param { any } plugin\n * @param { any } [options]\n * @param { string } [name]\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name = '') {\n if (!this.player) {\n return\n }\n name && (options.pluginName = name)\n return this.player.registerPlugin({ plugin, options })\n }\n\n /**\n *\n * @param { string } name\n * @returns { any | null }\n */\n getPlugin (name) {\n return this.player ? this.player.getPlugin(name) : null\n }\n\n __destroy () {\n const player = this.player\n const pluginName = this.pluginName\n this.offAll()\n Util.clearAllTimers(this)\n if (Util.checkIsFunction(this.destroy)) {\n this.destroy()\n }\n\n ['player', 'playerConfig', 'pluginName', 'logger', '__args', '__hooks'].map(item => {\n this[item] = null\n })\n player.unRegisterPlugin(pluginName)\n delHooksDescriptor(this)\n }\n}\nexport {\n BasePlugin as default,\n Util,\n Sniffer,\n Errors,\n Events,\n XG_DEBUG\n}\n","var DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n","var closest = require('./closest');\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n","/**\n* an ui Plugin class\n*\n**/\nimport BasePlugin, { Util, XG_DEBUG } from './basePlugin'\nimport delegate from 'delegate'\n\nconst ROOT_TYPES = {\n CONTROLS: 'controls',\n ROOT: 'root'\n}\n\nconst POSITIONS = {\n ROOT: 'root',\n ROOT_LEFT: 'rootLeft',\n ROOT_RIGHT: 'rootRight',\n ROOT_TOP: 'rootTop',\n CONTROLS_LEFT: 'controlsLeft',\n CONTROLS_RIGTH: 'controlsRight',\n CONTROLS_RIGHT: 'controlsRight',\n CONTROLS_CENTER: 'controlsCenter',\n CONTROLS: 'controls'\n}\n\nconst PLUGIN_STATE_CLASS = {\n ICON_DISABLE: 'xg-icon-disable',\n ICON_HIDE: 'xg-icon-hide'\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 * @protected\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 /**\n *\n */\n disable () {\n this.config.disable = true\n Util.addClass(this.find('.xgplayer-icon'), PLUGIN_STATE_CLASS.ICON_DISABLE)\n }\n\n enable () {\n this.config.disable = false\n Util.removeClass(this.find('.xgplayer-icon'), PLUGIN_STATE_CLASS.ICON_DISABLE)\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 | Array | 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 | Array | 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 PLUGIN_STATE_CLASS\n}\n","import { throttle } from '../utils/util'\nimport { PLATER_ID } from '../constant'\n/**\n * 添加\n */\nclass ResizeObserver {\n constructor () {\n this.__handlers = []\n this.timeStamp = 0\n this.observer = null\n if (!window.ResizeObserver) {\n return\n }\n try {\n this.observer = new window.ResizeObserver(throttle(this.__trigger, 100, { trailing: true }))\n this.timeStamp = new Date().getTime()\n } catch (e) {\n console.error(e)\n }\n }\n\n addObserver (target, handler) {\n if (!this.observer) {\n return\n }\n this.observer.observe(target)\n const _pid = target.getAttribute(PLATER_ID)\n const { __handlers } = this\n let index = -1\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n index = i\n }\n }\n if (index > -1) {\n this.__handlers[index].handler = handler\n } else {\n this.__handlers.push({\n target,\n handler: handler,\n playerId: _pid\n })\n }\n }\n\n unObserver (target) {\n let i = -1\n this.__handlers.map((item, index) => {\n if (target === item.target) {\n i = index\n }\n })\n try {\n this.observer?.unobserve(target)\n } catch (e) {}\n i > -1 && this.__handlers.splice(i, 1)\n }\n\n destroyObserver () {\n this.observer?.disconnect()\n this.observer = null\n this.__handlers = null\n }\n\n __runHandler (target) {\n const { __handlers } = this\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n try {\n __handlers[i].handler(target)\n } catch (error) {\n console.error(error)\n }\n return true\n }\n }\n return false\n }\n\n __trigger = (entries) => {\n const t = new Date().getTime()\n this.timeStamp = t\n for (let i = 0; i < entries.length; i++) {\n this.__runHandler(entries[i].target)\n }\n }\n}\n\n/**\n * @type {ResizeObserver | null}\n */\nlet resizeObserver = null\n\nfunction addObserver (target, handler) {\n if (!resizeObserver) {\n resizeObserver = new ResizeObserver()\n // window.___resizeObserver = resizeObserver\n }\n resizeObserver.addObserver(target, handler)\n return resizeObserver\n}\n\nfunction unObserver (target, handler) {\n resizeObserver?.unObserver(target, handler)\n}\n\nfunction destroyObserver (target, handler) {\n resizeObserver?.destroyObserver(target, handler)\n}\n\nexport {\n addObserver,\n unObserver,\n destroyObserver\n}\n","import { addObserver, unObserver } from './resizeObserver'\nimport Util from '../utils/util'\n\n/**\n* a plugins manager to register and search\n**/\n\nconst pluginsManager = {\n pluginGroup: {},\n init (player) {\n // mark every player instance by _pluginInfoId\n let cgid = player._pluginInfoId\n if (!cgid) {\n cgid = new Date().getTime()\n player._pluginInfoId = cgid\n }\n\n !player.config.closeResizeObserver && addObserver(player.root, () => {\n player.resize()\n })\n\n this.pluginGroup[cgid] = {\n _originalOptions: player.config || {},\n _plugins: {}\n }\n },\n\n formatPluginInfo (plugin, config) {\n let PLUFGIN = null\n let options = null\n if (plugin.plugin && typeof plugin.plugin === 'function') {\n PLUFGIN = plugin.plugin\n options = plugin.options\n } else {\n PLUFGIN = plugin\n options = {}\n }\n if (config) {\n options.config = config || {}\n }\n\n return {\n PLUFGIN,\n options\n }\n },\n\n /**\n * check the plugin if exits in plugins\n * @param {string} pluginName\n * @param { Array } plugins\n * @returns boolean\n */\n checkPluginIfExits (pluginName, plugins) {\n for (let i = 0; i < plugins.length; i++) {\n if (pluginName.toLowerCase() === plugins[i].pluginName.toLowerCase()) {\n return true\n }\n }\n return false\n },\n\n /**\n * get plugin Config from playerConfig\n * @param { string } pluginName\n * @param { {[propName: string]: any;} } playerConfig\n * @return { {[propName: string]: any;} } pluginConfig\n */\n getRootByConfig (pluginName, playerConfig) {\n const keys = Object.keys(playerConfig)\n let _pConfig = null\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n _pConfig = playerConfig[keys[i]]\n break\n }\n }\n\n if (Util.typeOf(_pConfig) === 'Object') {\n return {\n root: _pConfig.root,\n position: _pConfig.position\n }\n }\n return {}\n },\n\n /**\n * register a lazy plugin\n * @param { any } player instance\n * @param { any } lazyPlugin config\n *\n */\n lazyRegister (player, lazyPlugin) {\n const timeout = lazyPlugin.timeout || 1500\n return Promise.race([\n lazyPlugin.loader().then((plugin) => {\n let result\n if (plugin && plugin.__esModule) {\n result = plugin.default\n } else {\n result = plugin\n }\n this.register(player, result, plugin.options)\n }),\n new Promise((resolve, reject) => {\n setTimeout(() => {\n reject(new Error('timeout'))\n }, timeout)\n })\n ])\n },\n /**\n * register a Plugin\n * @param { any } player the plugins register\n * @param { any } plugin the plugin contructor\n * @param { any } options the plugin configuration\n * @return { any } Plugin the plugin instance\n **/\n register (player, plugin, options = {}) {\n if (!player || !plugin || typeof plugin !== 'function' || plugin.prototype === undefined) {\n return\n }\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n if (!this.pluginGroup[cgid]._plugins) {\n this.pluginGroup[cgid]._plugins = {}\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const originalOptions = this.pluginGroup[cgid]._originalOptions\n options.player = player\n\n const pluginName = options.pluginName || plugin.pluginName\n if (!pluginName) {\n throw new Error('The property pluginName is necessary')\n }\n\n if (plugin.isSupported && !plugin.isSupported(player.config.mediaType, player.config.codecType)) {\n console.warn(`not supported plugin [${pluginName}]`)\n return\n }\n\n if (!options.config) {\n options.config = {}\n }\n\n // get config items from player.config\n const keys = Object.keys(originalOptions)\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n const config = originalOptions[keys[i]]\n if (Util.typeOf(config) === 'Object') {\n options.config = Object.assign({}, options.config, originalOptions[keys[i]])\n } else if (Util.typeOf(config) === 'Boolean') {\n options.config.disable = !config\n }\n break\n }\n }\n\n // copy the default configuration items of the plugin\n if (plugin.defaultConfig) {\n Object.keys(plugin.defaultConfig).forEach(key => {\n if (typeof options.config[key] === 'undefined') {\n options.config[key] = plugin.defaultConfig[key]\n }\n })\n }\n\n // get the parent dom which added the plugin will be mounted\n if (!options.root) {\n options.root = player.root\n } else if (typeof options.root === 'string') {\n options.root = player[options.root]\n }\n\n options.index = options.config.index || 0\n try {\n // if there is already a plugin instance with the same pluginName, destroy it\n if (plugins[pluginName.toLowerCase()]) {\n this.unRegister(cgid, pluginName.toLowerCase())\n console.warn(`the is one plugin with same pluginName [${pluginName}] exist, destroy the old instance`)\n }\n // eslint-disable-next-line new-cap\n const _instance = new plugin(options)\n plugins[pluginName.toLowerCase()] = _instance\n plugins[pluginName.toLowerCase()].func = plugin\n if (_instance && typeof _instance.afterCreate === 'function') {\n _instance.afterCreate()\n }\n return _instance\n } catch (err) {\n console.error(err)\n throw (err)\n }\n },\n\n /**\n * Unregister a plugin from player instance\n * @param { string } cgid\n * @param { string } name\n */\n unRegister (cgid, name) {\n if (cgid._pluginInfoId) {\n cgid = cgid._pluginInfoId\n }\n name = name.toLowerCase()\n try {\n const plugin = this.pluginGroup[cgid]._plugins[name]\n if (plugin) {\n plugin.pluginName && plugin.__destroy()\n delete this.pluginGroup[cgid]._plugins[name]\n }\n } catch (e) {\n console.error(`[unRegister:${name}] cgid:[${cgid}] error`, e)\n }\n },\n\n /**\n * remove a plugin instance from the player plugin list\n * @param { any } player\n * @param { string } name\n */\n deletePlugin (player, name) {\n const cgid = player._pluginInfoId\n if (cgid && this.pluginGroup[cgid] && this.pluginGroup[cgid]._plugins) {\n delete this.pluginGroup[cgid]._plugins[name]\n }\n },\n\n /**\n * get all plugin instance of player\n * @param { any } player\n */\n getPlugins (player) {\n const cgid = player._pluginInfoId\n return cgid && this.pluginGroup[cgid] ? this.pluginGroup[cgid]._plugins : {}\n },\n\n findPlugin (player, name) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return null\n }\n const cName = name.toLowerCase()\n return this.pluginGroup[cgid]._plugins[cName]\n },\n\n beforeInit (player) {\n function retPromise (fun) {\n if (!fun || !fun.then) {\n return new Promise((resolve) => {\n resolve()\n })\n } else {\n return fun\n }\n }\n return new Promise((resolve) => {\n if (!this.pluginGroup) {\n return\n }\n\n let prevTask\n if (player._loadingPlugins && player._loadingPlugins.length) {\n prevTask = Promise.all(player._loadingPlugins)\n } else {\n prevTask = Promise.resolve()\n }\n\n return prevTask.then(() => {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n resolve()\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const pluginsRet = []\n Object.keys(plugins).forEach(pName => {\n if (plugins[pName] && plugins[pName].beforePlayerInit) {\n try {\n const ret = plugins[pName].beforePlayerInit()\n pluginsRet.push(retPromise(ret))\n } catch (e) {\n pluginsRet.push(retPromise(null))\n throw e\n }\n }\n })\n\n Promise.all([...pluginsRet]).then(() => {\n resolve()\n }).catch((e) => {\n console.error(e)\n resolve()\n })\n })\n })\n },\n\n afterInit (player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(pName => {\n if (plugins[pName] && plugins[pName].afterPlayerInit) {\n plugins[pName].afterPlayerInit()\n }\n })\n },\n\n setLang (lang, player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(item => {\n if (plugins[item].updateLang) {\n plugins[item].updateLang(lang)\n } else {\n // 兼容旧版本通过set lang更新语言的问题\n try {\n plugins[item].lang = lang\n } catch (error) {\n console.warn(`${item} setLang`)\n }\n }\n })\n },\n\n reRender (player) {\n const cgid = player._pluginInfoId\n\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const _pList = []\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(pName => {\n if (pName !== 'controls' && plugins[pName]) {\n _pList.push({\n plugin: plugins[pName].func,\n options: plugins[pName].__args\n })\n this.unRegister(cgid, pName)\n }\n })\n _pList.forEach(item => {\n this.register(player, item.plugin, item.options)\n })\n },\n\n onPluginsReady (player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins || {}\n Object.keys(plugins).forEach(key => {\n if (plugins[key].onPluginsReady && typeof plugins[key].onPluginsReady === 'function') {\n plugins[key].onPluginsReady()\n }\n })\n },\n\n 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 delete this.pluginGroup[cgid]\n delete player._pluginInfoId\n }\n}\n\nexport default pluginsManager\n","export default {\n DEFAULT: 'xgplayer',\n DEFAULT_SKIN: 'xgplayer-skin-default',\n ENTER: 'xgplayer-is-enter',\n PAUSED: 'xgplayer-pause',\n PLAYING: 'xgplayer-playing',\n ENDED: 'xgplayer-ended',\n CANPLAY: 'xgplayer-canplay',\n LOADING: 'xgplayer-isloading',\n ERROR: 'xgplayer-is-error',\n REPLAY: 'xgplayer-replay',\n NO_START: 'xgplayer-nostart',\n ACTIVE: 'xgplayer-active',\n INACTIVE: 'xgplayer-inactive',\n FULLSCREEN: 'xgplayer-is-fullscreen',\n CSS_FULLSCREEN: 'xgplayer-is-cssfullscreen',\n ROTATE_FULLSCREEN: 'xgplayer-rotate-fullscreen',\n PARENT_ROTATE_FULLSCREEN: 'xgplayer-rotate-parent',\n PARENT_FULLSCREEN: 'xgplayer-fullscreen-parent',\n INNER_FULLSCREEN: 'xgplayer-fullscreen-inner',\n NO_CONTROLS: 'no-controls',\n FLEX_CONTROLS: 'flex-controls',\n CONTROLS_FOLLOW: 'controls-follow',\n CONTROLS_AUTOHIDE: 'controls-autohide',\n TOP_BAR_AUTOHIDE: 'top-bar-autohide',\n NOT_ALLOW_AUTOPLAY: 'not-allow-autoplay',\n SEEKING: 'seeking',\n PC: 'xgplayer-pc',\n MOBILE: 'xgplayer-mobile',\n MINI: 'xgplayer-mini' // mini screen play status\n}\n","import { getLang } from './utils/util'\n\n/**\n * @typedef { string | MediaStream | Array<{src: string, type?:string, [propName: string]: any}> } IUrl\n */\n\n/**\n * @typedef {{\n * url: IUrl,\n * definition: any,\n * bitrate?: number,\n * bandwidth?: number,\n * text?: string | { [propName: string]: any },\n * iconText?: string | { [propName: string]: any },\n * [propName: string]: any\n * }} IDefinition\n */\n\n/**\n * @typedef { {\n * id?: string,\n * el?: HTMLElement,\n * url?: IUrl,\n * domEventType?: 'default' | 'touch' | 'mouse',\n * nullUrlStart?: boolean,\n * width?: number | string,\n * height?: number | string,\n * fluid?: boolean,\n * fitVideoSize?: 'fixWidth'|'fixHeight'|'fixed',\n * videoFillMode?: 'auto'|'fillHeight'|'fillWidth'|'fill'|'cover'|'contain',\n * volume?: number | { [propName: string]: any },\n * autoplay?: boolean,\n * autoplayMuted?: boolean,\n * loop?: boolean,\n * isLive?: boolean,\n * zoom?: number,\n * videoInit?: boolean,\n * poster?: string | { [propName: string]: any },\n * isMobileSimulateMode?: 'mobile' | 'pc',\n * defaultPlaybackRate?: number,\n * execBeforePluginsCall?: () => any,\n * allowSeekAfterEnded?: boolean,\n * enableContextmenu?: boolean,\n * closeVideoClick?: boolean,\n * closeVideoDblclick?: boolean,\n * closePlayerBlur?: boolean,\n * closeDelayBlur?: boolean,\n * leavePlayerTime?: number,\n * closePlayVideoFocus?: boolean,\n * closePauseVideoFocus?: boolean,\n * closeFocusVideoFocus?: boolean,\n * closeControlsBlur?: boolean,\n * topBarAutoHide?: boolean,\n * videoAttributes?: { [propName: string]: any },\n * startTime?: number,\n * seekedStatus?: 'play' | 'pause' | 'auto',\n * miniprogress?: boolean,\n * disableSwipeHandler?: () => any,\n * enableSwipeHandler?: () => any,\n * preProcessUrl?: (url: IUrl, ext?: { [propName: string]: any }) => { url: IUrl, [propName: string]: any },\n * ignores?: Array<'cssfullscreen' | 'screenshot' | 'pip' | 'miniscreen' | 'keyboard' | 'download' | 'playbackrate' | 'time' | 'definition' | 'error' | 'fullscreen' | 'loading' | 'mobile' | 'pc' | 'play' | 'poster' | 'progress' | 'replay' | 'start' | 'volume' | string>,\n * inactive?: number,\n * lang?: string,\n * controls?: boolean | { [propName: string]: any },\n * marginControls?: boolean,\n * fullscreenTarget?: HTMLElement, // 全屏作用的dom元素\n * screenShot?: boolean | { [propName: string]: any },\n * rotate?: boolean | { [propName: string]: any },\n * pip?: boolean | { [propName: string]: any },\n * download?: boolean | { [propName: string]: any },\n * mini?: boolean | { [propName: string]: any },\n * cssFullscreen?: boolean | { [propName: string]: any },\n * keyShortcut?: boolean,\n * presets?: any[],\n * plugins?: any[]\n * playbackRate?: boolean | Array | { [propName: string]: any },\n * definition?: { list: Array , defaultDefinition?: IDefinition['definition'], [propName: string]: any},\n * playsinline?: boolean,\n * customDuration?: number,\n * timeOffset?: number,\n * icons?: { [propName: string]: string | HTMLElement | () => HTMLElement | string },\n * i18n?: Array,\n * tabindex?: number,\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 * isHideTips?: boolean,\n * minWaitDelay?: number,\n * commonStyle?: {\n * progressColor?: string,\n * playedColor?: string,\n * cachedColor?: string,\n * sliderBtnStyle?: { [propName: string]: any },\n * volumeColor?: string\n * },\n * [propName: string]: any;\n * } } IPlayerOptions\n */\n\n/**\n * @returns { IPlayerOptions }\n */\nexport default function getDefaultConfig () {\n return {\n id: '', // container DOM id\n el: null, // container domElement\n url: '', // the url need to play\n domEventType: 'default', // 事件类型,默认值default, touch | mouse\n nullUrlStart: false, // Whether to start broadcasting with empty url\n width: 600, // Width, unit px\n height: 337.5, // height, unit px\n fluid: false,\n fitVideoSize: 'fixed', // adaptation method of container width and height, fixWidth/fixHeight/fixed/auto\n videoFillMode: 'auto', // video screen fill mode, fillHeight/fillWidth/fill/auto/cover\n volume: 0.6, // default volume or config of plug-in volume\n autoplay: false,\n autoplayMuted: false, // whether to mute the start\n loop: false, // whether to loop\n isLive: false, // whether is live\n zoom: 1,\n videoInit: true, // whether to load the video/audio when initializing\n poster: '', // cover poster url or the configuration object for poster plugin\n isMobileSimulateMode: false, // simulation state, mobile/pc\n defaultPlaybackRate: 1, // default playback rate\n execBeforePluginsCall: null,\n allowSeekAfterEnded: true, // whether to allow seek after the playback ended\n enableContextmenu: true, // whether to allow the right-click function to be enabled\n closeVideoClick: false, // is to close the video’s click/touchend behavior to switch playback and pause\n closeVideoDblclick: false, // is to close the video`s double-click behavior to switch through full screen\n closePlayerBlur: false, // whether to close the behavior of calling player.blur() when the mouse moves out of the player area\n closeDelayBlur: false, // whether to close the automatic hide control bar behavior,only PC\n leavePlayerTime: 3000, // auto hide delay time when the mouse moves out of the player area\n closePlayVideoFocus: false, // whether to close the behavior of calling player.focus() in the play event callback\n closePauseVideoFocus: false, // whether to close the behavior of calling player.focus() in the pause event callback\n closeFocusVideoFocus: true, // whether to close the behavior of calling player.media.focus() when start play\n closeControlsBlur: true, // whether to close the behavior of calling player.focus() when the mouse moves out of the control bar area\n topBarAutoHide: true, // Whether to enable auto hide the top bar when player.blur()\n videoAttributes: {}, // video extended attributes\n startTime: 0, // auto play start time\n seekedStatus: 'play', // play state after seek ends play/pause/auto\n miniprogress: false, // whether to enable the mini progress bar\n disableSwipeHandler: () => {\n },\n enableSwipeHandler: () => {\n },\n preProcessUrl: null, // url preprocessing callback\n ignores: [], // list of plug-in names to be disabled\n whitelist: [],\n inactive: 3000, // delay time for the control bar to disappear automatically\n lang: getLang(),\n controls: true,\n marginControls: false, // Whether the control bar is located at the bottom of the video and does not overlap with the video\n fullscreenTarget: null,\n screenShot: false, // whether to enable the screenshot plug-in\n rotate: false, // whether to enable the rotate plug-in\n pip: false, // whether to enable the picture-in-picture plug-in\n download: false, // whether to enable the download plug-in\n mini: false, // whether to enable the mini-screen plug-in\n cssFullscreen: true, // whether to enable the web page full-screen plug-in\n keyShortcut: true, // whether to open the shortcut key\n presets: [],\n plugins: [],\n playbackRate: 1,\n definition: { list: [] },\n playsinline: true,\n customDuration: 0, // User-defined duration\n timeOffset: 0, // currentTime offset\n icons: {},\n i18n: [],\n tabindex: 0, // The order of mediaElement focus\n thumbnail: null, // Preview image configuration\n videoConfig: {}, // video attribute configuration\n isHideTips: false, // if hide the icon tips\n minWaitDelay: 200, // The min threshold of waiting delay time\n commonStyle: { // General style configuration\n progressColor: '', // Background color of progress bar\n playedColor: '', // The background color of played part in the progress bar\n cachedColor: '', // The background color of cached part in the progress bar\n sliderBtnStyle: {}, // progress bar slider style\n volumeColor: ''\n }\n }\n}\n","export const usePreset = (player, Preset) => {\n let presetInst\n if (Preset.preset && Preset.options) {\n // eslint-disable-next-line new-cap\n presetInst = new (Preset.preset)(Preset.options, player.config)\n } else {\n presetInst = new Preset({}, player.config)\n }\n const { plugins = [], ignores = [], icons = {}, i18n = [] } = presetInst\n if (!player.config.plugins) {\n player.config.plugins = []\n }\n\n if (!player.config.ignores) {\n player.config.ignores = []\n }\n\n player.config.plugins.push(...plugins)\n player.config.ignores.push(...ignores)\n Object.keys(icons).map(key => {\n if (!player.config.icons[key]) {\n player.config.icons[key] = icons[key]\n }\n })\n const _ci18n = player.config.i18n || []\n i18n.push(..._ci18n)\n player.config.i18n = i18n\n}\n","export const STATES = {\n INITIAL: 1,\n READY: 2,\n ATTACHING: 3,\n ATTACHED: 4,\n NOTALLOW: 5,\n RUNNING: 6,\n ENDED: 7,\n DESTROYED: 8\n}\n\nexport const STATE_ARRAY = [\n 'ERROR',\n 'INITIAL',\n 'READY',\n 'ATTACHING',\n 'ATTACHED',\n 'NOTALLOW',\n 'RUNNING',\n 'ENDED',\n 'DESTROYED'\n]\n","import Plugin, { Events, Util, POSITIONS, Sniffer, STATE_CLASS } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * disable?: boolean,\n * autoHide?: boolean,\n * mode?: \"flex\"|\"normal\"|\"bottom\",\n * initShow?: boolean,\n * [propName: string]: any\n * }} IControlsConfig\n */\n\nclass Controls extends Plugin {\n static get pluginName () {\n return 'controls'\n }\n\n /**\n * @type IControlsConfig\n */\n static get defaultConfig () {\n return {\n disable: false,\n autoHide: true, // Whether to hide automatically\n mode: '', // Display mode, flex/normal/bottom\n initShow: false // Display when player is initialized\n }\n }\n\n beforeCreate (args) {\n if (!args.config.mode && Sniffer.device === 'mobile') {\n args.config.mode = 'flex'\n }\n if (args.player.config.marginControls) {\n args.config.autoHide = false\n }\n }\n\n afterCreate () {\n const { disable, height, mode } = this.config\n if (disable) {\n return\n }\n\n mode === 'flex' && this.player.addClass(STATE_CLASS.FLEX_CONTROLS)\n const style = {\n height: `${height}px`\n }\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.left = this.find('xg-left-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.center = this.find('xg-center-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.right = this.find('xg-right-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.innerRoot = this.find('xg-inner-controls')\n\n // The progress bar is switched synchronously when switching to the small window state\n this.on(Events.MINI_STATE_CHANGE, (isMini) => {\n isMini ? Util.addClass(this.root, 'mini-controls') : Util.removeClass(this.root, 'mini-controls')\n })\n\n const { isMobileSimulateMode } = this.playerConfig\n if (Sniffer.device !== 'mobile' && isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseleave', this.onMouseLeave)\n }\n }\n\n onMouseEnter = (e) => {\n const { player, playerConfig } = this\n playerConfig.closeControlsBlur && player.focus({ autoHide: false })\n }\n\n onMouseLeave = (e) => {\n const { player } = this\n player.focus()\n }\n\n focus () {\n this.player.focus({ autoHide: false })\n }\n\n focusAwhile () {\n this.player.focus({ autoHide: true })\n }\n\n blur () {\n this.player.blur({ ignorePaused: true })\n }\n\n recoverAutoHide () {\n // this.config.autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n this.config.autoHide && Util.addClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n pauseAutoHide () {\n // Util.removeClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n Util.removeClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n this.root.style.display = ''\n this.player.focus()\n }\n\n hide () {\n this.root.style.display = 'none'\n }\n\n /**\n * @type {string}\n */\n get mode () {\n return this.config.mode\n }\n\n /**\n *\n * @param {} plugin\n * @param { {config?: {[propName: string]: any}, position?:string, root?: HTMLElement, pluginName?: string}} options\n * @param { string } name\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name) {\n if (!this.root) {\n return\n }\n const defaultConfig = plugin.defaultConfig || {}\n if (!options.root) {\n const position = options.position ? options.position : options.config && options.config.position ? options.config.position : defaultConfig.position\n switch (position) {\n case POSITIONS.CONTROLS_LEFT:\n options.root = this.left\n break\n case POSITIONS.CONTROLS_RIGHT:\n options.root = this.right\n break\n case POSITIONS.CONTROLS_CENTER:\n options.root = this.center\n break\n case POSITIONS.CONTROLS:\n options.root = this.root\n break\n default:\n options.root = this.left\n }\n return super.registerPlugin(plugin, options, name)\n }\n }\n\n destroy () {\n if (Sniffer.device !== 'mobile') {\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mouseleave', this.onMouseLeave)\n }\n }\n\n render () {\n const { mode, autoHide, initShow, disable } = this.config\n if (disable) {\n return\n }\n\n // autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n const className = Util.classNames(\n { 'xgplayer-controls': true },\n { 'flex-controls': mode === 'flex' },\n { 'bottom-controls': mode === 'bottom' },\n { [STATE_CLASS.CONTROLS_AUTOHIDE]: autoHide },\n { 'xgplayer-controls-initshow': initShow || !autoHide })\n return `\n \n \n \n \n \n \n \n `\n }\n}\n\nexport default Controls\n","import Util from '../utils/util'\nimport EN from './en'\n/**\n * @typedef { {\n * LANG: string,\n * TEXT: {\n * [propName: string]: any\n * }\n * } } IXGI18nText\n */\n\n/**\n * @typedef { {\n * lang: { [propName: string]: IXGI18nText },\n * langKeys: Array, // list of all currently supported languages\n * textKeys: { [propName: string]: string } // list of all currently supported texts\n * } } IXGI18n\n */\n\nconst XGI18nLang = {\n lang: {},\n langKeys: [],\n textKeys: []\n}\n\nfunction deepMerge (dst, src) {\n Object.keys(src).forEach(key => {\n const _s = Util.typeOf(src[key])\n const _t = Util.typeOf(dst[key])\n if (_s === 'Array') {\n if (_t !== 'Array') {\n dst[key] = []\n }\n dst[key].push(...src[key])\n } else if (_s === 'Object') {\n if (_t !== 'Object') {\n dst[key] = {}\n }\n deepMerge(dst[key], src[key])\n } else {\n dst[key] = src[key]\n }\n })\n return dst\n}\n\nfunction updateKeys () {\n Object.keys(XGI18nLang.lang.en).map(key => {\n XGI18nLang.textKeys[key] = key // key.toLowerCase()\n })\n}\n\n/**\n * @param { Array } i18nTextList\n * @param { IXGI18n } [i18nLangs]\n */\nfunction extend (i18nTextList, i18nLangs) {\n let ext = []\n if (!i18nLangs) {\n i18nLangs = XGI18nLang\n }\n if (!i18nLangs.lang) {\n return\n }\n if (Util.typeOf(i18nTextList) !== 'Array') {\n ext = Object.keys(i18nTextList).map(lang => {\n const keyLang = lang === 'zh' ? 'zh-cn' : lang\n return {\n LANG: keyLang,\n TEXT: i18nTextList[lang]\n }\n })\n } else {\n ext = i18nTextList\n }\n const { lang } = i18nLangs\n ext.map(item => {\n if (item.LANG === 'zh') {\n item.LANG = 'zh-cn'\n }\n if (!lang[item.LANG]) {\n use(item, i18nLangs)\n } else {\n deepMerge(lang[item.LANG] || {}, item.TEXT || {})\n }\n })\n updateKeys()\n}\n\n/**\n * @param { IXGI18nText } langData\n * @param { IXGI18n } [i18nLangs]\n */\nfunction use (langData, i18nLangs) {\n let _clang = langData.LANG\n if (!i18nLangs) {\n i18nLangs = XGI18nLang\n }\n if (!i18nLangs.lang) {\n return\n }\n const texts = langData.TEXT || {}\n if (_clang === 'zh') {\n _clang = 'zh-cn'\n }\n if (!i18nLangs.lang[_clang]) {\n i18nLangs.langKeys.push(_clang)\n i18nLangs.lang[_clang] = texts\n } else {\n deepMerge(i18nLangs.lang[_clang], texts)\n }\n updateKeys()\n}\n\n/**\n *\n * @returns { IXGI18n }\n */\nfunction init (id) {\n const ret = {\n lang: {},\n langKeys: [],\n textKeys: {},\n pId: id\n }\n deepMerge(ret.lang, XGI18nLang.lang)\n ret.langKeys.push(...XGI18nLang.langKeys)\n deepMerge(ret.textKeys, XGI18nLang.textKeys)\n return ret\n}\n\nuse(EN)\n\nconst I18N = {\n get textKeys () {\n return XGI18nLang.textKeys\n },\n /**\n * @description List of languages currently supported\n * @type { Array }\n */\n get langKeys () {\n return XGI18nLang.langKeys\n },\n /**\n * @type {{\n * [propName: string]: {\n * [propName: string]: string\n * }\n * }}\n */\n get lang () {\n const ret = {}\n XGI18nLang.langKeys.map(key => {\n ret[key] = XGI18nLang.lang[key]\n })\n if (XGI18nLang.lang['zh-cn']) {\n ret.zh = XGI18nLang.lang['zh-cn'] || {}\n }\n return ret\n },\n\n /**\n * @desc Extend existing languages text\n * @type {(I18nText: IXGI18nText) => {}}\n */\n extend: extend,\n\n /**\n * Add new language text\n * @type {(lang: IXGI18nText) => {}}\n */\n use: use,\n\n /**\n * Initialize a language text\n * @return { IXGI18n }\n */\n init: init\n}\n\nexport default I18N\n","export default {\n LANG: 'en',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: 'video download error'\n },\n mse: {\n code: 2,\n msg: 'stream append error'\n },\n parse: {\n code: 3,\n msg: 'parsing error'\n },\n format: {\n code: 4,\n msg: 'wrong format'\n },\n decoder: {\n code: 5,\n msg: 'decoding error'\n },\n runtime: {\n code: 6,\n msg: 'grammatical errors'\n },\n timeout: {\n code: 7,\n msg: 'play timeout'\n },\n other: {\n code: 8,\n msg: 'other errors'\n }\n },\n HAVE_NOTHING: 'There is no information on whether audio/video is ready',\n HAVE_METADATA: 'Audio/video metadata is ready ',\n HAVE_CURRENT_DATA: 'Data about the current play location is available, but there is not enough data to play the next frame/millisecond',\n HAVE_FUTURE_DATA: 'Current and at least one frame of data is available',\n HAVE_ENOUGH_DATA: 'The available data is sufficient to start playing',\n NETWORK_EMPTY: 'Audio/video has not been initialized',\n NETWORK_IDLE: 'Audio/video is active and has been selected for resources, but no network is used',\n NETWORK_LOADING: 'The browser is downloading the data',\n NETWORK_NO_SOURCE: 'No audio/video source was found',\n MEDIA_ERR_ABORTED: 'The fetch process is aborted by the user',\n MEDIA_ERR_NETWORK: 'An error occurred while downloading',\n MEDIA_ERR_DECODE: 'An error occurred while decoding',\n MEDIA_ERR_SRC_NOT_SUPPORTED: 'Audio/video is not supported',\n REPLAY: 'Replay',\n ERROR: 'Network is offline',\n PLAY_TIPS: 'Play',\n PAUSE_TIPS: 'Pause',\n PLAYNEXT_TIPS: 'Play next',\n DOWNLOAD_TIPS: 'Download',\n ROTATE_TIPS: 'Rotate',\n RELOAD_TIPS: 'Reload',\n FULLSCREEN_TIPS: 'Fullscreen',\n EXITFULLSCREEN_TIPS: 'Exit fullscreen',\n CSSFULLSCREEN_TIPS: 'Cssfullscreen',\n EXITCSSFULLSCREEN_TIPS: 'Exit cssfullscreen',\n TEXTTRACK: 'Caption',\n PIP: 'PIP',\n SCREENSHOT: 'Screenshot',\n LIVE: 'LIVE',\n OFF: 'Off',\n OPEN: 'Open',\n MINI_DRAG: 'Click and hold to drag',\n MINISCREEN: 'Miniscreen',\n REFRESH_TIPS: 'Please Try',\n REFRESH: 'Refresh',\n FORWARD: 'forward',\n LIVE_TIP: 'Live'\n }\n}\n","import { EventEmitter } from 'eventemitter3'\n\n/**\n * @typedef { (Player) => ?boolean } IterateFunction\n */\n/**\n * @typedef { import('./player').default } Player\n */\n\n/**\n * global player instance memory\n * @type {{\n * [key:string]:\n * }}\n */\nconst store = {}\n\nlet instance = null\n/**\n * Design as a class so that can be inherited to enhance functionality\n */\nexport class InstManager extends EventEmitter {\n static getInstance () {\n instance ||= new InstManager()\n return instance\n }\n\n add (player) {\n if (!player) {\n return\n }\n store[player.playerId] = player\n\n // By default, the first one is active\n if (Object.keys(store).length === 1) {\n this.setActive(player.playerId, true)\n }\n }\n\n remove (player) {\n if (!player) {\n return\n }\n const isUserActive = player.isUserActive\n\n delete store[player.playerId]\n\n if (isUserActive) {\n // 暂时注释,有需求再打开\n // const keys = Object.keys(this.store)\n // if (keys.length > 0) {\n // this.setActive(keys[keys.length - 1], true)\n // }\n }\n }\n\n /**\n * @private\n * @param {IterateFunction} fn\n * @param {?boolean} endEarly\n */\n _iterate (fn, endEarly = false) {\n for (const key in store) {\n if (Object.prototype.hasOwnProperty.call(store, key)) {\n const player = store[key]\n\n if (endEarly) {\n if (fn(player)) {\n break\n }\n } else {\n fn(player)\n }\n }\n }\n }\n\n /**\n * @param {IterateFunction} fn\n */\n forEach (fn) {\n this._iterate(fn)\n }\n\n /**\n * Iterates over items of store, returning the first one\n * @param {IterateFunction} fn\n * @returns {Player}\n */\n find (fn) {\n let result = null\n\n this._iterate((player) => {\n const flag = fn(player)\n if (flag) {\n result = player\n }\n return flag\n }, true)\n\n return result\n }\n\n /**\n * @param {IterateFunction} fn\n * @returns {Player[]}\n */\n findAll (fn) {\n const results = []\n\n this._iterate((player) => {\n if (fn(player)) {\n results.push(player)\n }\n })\n\n return results\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n * @returns { number | null }\n */\n setActive (playerId, isActive = true) {\n if (!store[playerId]) {\n return\n }\n if (isActive) {\n this.forEach(inst => {\n if (playerId === inst.playerId) {\n inst.isUserActive = true\n inst.isInstNext = false\n } else {\n inst.isUserActive = false\n }\n })\n } else {\n store[playerId].isUserActive = isActive\n }\n return playerId\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | null }\n */\n getActiveId () {\n const keys = Object.keys(store)\n for (let i = 0; i < keys.length; i++) {\n const c = store[keys[i]]\n if (c && c.isUserActive) {\n return keys[i]\n }\n }\n return null\n }\n\n /**\n * 标记下一个实例\n * @param { number | string } playerId\n * @param { boolean } isNext\n * @returns { number | null }\n */\n setNext (playerId, isNext = true) {\n if (!store[playerId]) {\n return\n }\n if (isNext) {\n this.forEach(inst => {\n if (playerId === inst.playerId) {\n inst.isUserActive = false\n inst.isInstNext = true\n } else {\n inst.isInstNext = false\n }\n })\n } else {\n store[playerId].isInstNext = isNext\n }\n\n return playerId\n }\n}\n\n/**\n* Check whether there is a player instance in the current dom\n* @param {Element} root\n*/\nexport function checkPlayerRoot (root) {\n const keys = Object.keys(store)\n for (let i = 0; i < keys.length; i++) {\n const p = store[keys[i]]\n if (p.root === root) {\n return p\n }\n }\n return null\n}\n","import MediaProxy from './mediaProxy'\nimport Util, { checkIsCurrentVideo } from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Database from './utils/database'\nimport Errors from './error'\nimport * as Events from './events'\nimport { FULLSCREEN_EVENTS, GET_FULLSCREEN_API, EXIT_FULLSCREEN_API, PLATER_ID } from './constant'\nimport Plugin, { POSITIONS } from './plugin/plugin'\nimport BasePlugin from './plugin/basePlugin'\nimport pluginsManager from './plugin/pluginsManager'\nimport STATE_CLASS from './stateClassMap'\nimport getDefaultConfig from './defaultConfig'\nimport { usePreset } from './plugin/preset'\nimport hooksDescriptor, { runHooks, useHooks, removeHooks, delHooksDescriptor, usePluginHooks, removePluginHooks, hook } from './plugin/hooksDescriptor'\nimport 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'\nimport { InstManager, checkPlayerRoot } from './instManager'\n\n/**\n * @typedef { import ('./defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef { import ('./defaultConfig').IDefinition } IDefinition\n * @typedef { import ('./defaultConfig').IUrl } IUrl\n */\n\n/**\n * @typedef {boolean | {\n * seamless?: boolean,\n * currentTime?: number,\n * bitrate?: number\n * }} SwitchUrlOptions\n */\n\n/* eslint-disable camelcase */\nconst PlAYER_HOOKS = ['play', 'pause', 'replay', 'retry']\nlet REAL_TIME_SPEED = 0 // 实时下载速率, kb/s\nlet AVG_SPEED = 0 // 平均下载速率, kb/s\n/** @type { InstManager } */\nlet instManager = null\n\nclass Player extends MediaProxy {\n /**\n * @type {number}\n * @description set debugger level\n * 1 - only print error logs\n * 2 - print warn logs and error logs\n * 3 - print all debug logs and error stack logs\n */\n static set debugger (value) {\n XG_DEBUG.config.debug = value\n }\n\n static get debugger () {\n return XG_DEBUG.config.debug\n }\n\n /**\n * @param {import('./instManager').InstManager} value\n */\n static set instManager (value) {\n instManager = value\n }\n\n /**\n * @param {import('./instManager').InstManager} value\n */\n static get instManager () {\n return instManager\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | string | null }\n * @deprecated 该方法转移到 InstManager 上去使用: player.instManager.getActiveId()\n */\n static getCurrentUserActivePlayerId () {\n return instManager?.getActiveId()\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n * @deprecated 该方法转移到 InstManager 上去使用: player.instManager.setActive()\n */\n static setCurrentUserActive (playerId, isActive) {\n instManager?.setActive(playerId, isActive)\n }\n\n /**\n * @param { IPlayerOptions } options\n */\n constructor (options) {\n const config = Util.deepMerge(getDefaultConfig(), options)\n super(config)\n hooksDescriptor(this, PlAYER_HOOKS)\n\n /**\n * @type { IPlayerOptions }\n * @description 当前播放器的配置信息\n */\n this.config = config\n\n /**\n * @type { string }\n * @private\n */\n this._pluginInfoId = Util.generateSessionId()\n\n bindDebug(this)\n // resolve default preset\n const defaultPreset = this.constructor.defaultPreset\n if (this.config.presets.length) {\n const defaultIdx = this.config.presets.indexOf('default')\n if (defaultIdx >= 0 && defaultPreset) {\n this.config.presets[defaultIdx] = defaultPreset\n }\n } else if (defaultPreset) {\n this.config.presets.push(defaultPreset)\n }\n\n // timer and flags\n this.userTimer = null\n /**\n * @private\n */\n this.waitTimer = null\n\n /**\n * @public\n * @description This switch provides the playback plugin with the ability\n * to handle media source by itself.\n */\n this.handleSource = true\n\n /**\n * @private\n */\n this._state = STATES.INITIAL\n\n /**\n * @public\n * @readonly\n * @type { boolean }\n */\n this.isAd = false\n\n /**\n * @public\n * @readonly\n * @type { boolean }\n */\n this.isError = false\n\n /**\n * @private\n */\n this._hasStart = false\n /**\n * Whether the player is in the seeking state\n * @type { boolean }\n * @readonly\n */\n this.isSeeking = false\n\n /**\n * @type { boolean }\n * @readonly\n */\n this.isCanplay = false\n /**\n * @private\n * @readonly\n */\n this._useAutoplay = false\n /**\n * @description 记录起播需要seek的时间点\n * @type { number }\n * @private\n * @readonly\n */\n this.__startTime = -1\n /**\n * @type { number }\n */\n this.rotateDeg = 0\n /**\n * Whether the player is focus\n * @type { boolean }\n * @readonly\n */\n this.isActive = false\n\n /**\n * Whether player is currently in fullscreen\n * @type { boolean }\n * @readonly\n */\n this.fullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.cssfullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.isRotateFullscreen = false\n\n /**\n * fullscreenElement\n * @type { HTMLElement | null }\n * @readonly\n */\n this._fullscreenEl = null\n\n this.timeSegments = []\n\n /**\n * cssfullscreen target Element\n * @type { HTMLElement | null }\n * @readonly\n */\n this._cssfullscreenEl = null\n\n /**\n * @type { ?IDefinition }\n * @public\n */\n this.curDefinition = null\n /**\n * @private\n * @type { string }\n */\n this._orgCss = ''\n /**\n * @readonly\n * @type { number }\n */\n this._fullScreenOffset = null\n /**\n * @private\n * @type { number }\n */\n this._videoHeight = 0\n /**\n * @private\n * @type { number }\n */\n this._videoWidth = 0\n\n this.videoPos = {\n pi: 1, // 宽高比\n scale: 0,\n rotate: -1,\n x: 0,\n y: 0,\n h: -1, // 高度占比\n w: -1, // 宽度占比\n vy: 0, // 画面在y方向的偏移\n vx: 0 // 画面在x方向的偏移\n }\n\n this.sizeInfo = {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n\n /**\n * @private\n * @type { { t: number, acc:number, acc: number, loopAcc: number, [propName: string]: any;} }\n */\n this._accPlayed = {\n t: 0,\n acc: 0,\n loopAcc: 0\n }\n\n /**\n * @description 播放器时长、播放时间偏移信息\n */\n this._offsetInfo = {\n currentTime: -1,\n duration: 0\n }\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 控制栏和video不同布局的时候内部容器\n */\n this.innerContainer = null\n\n /**\n * @type { ?Controls }\n * @readonly\n * @description 控制栏插件\n */\n this.controls = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n */\n this.topBar = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 当前播放器根节点\n */\n this.root = null\n\n this.__i18n = I18N.init(this._pluginInfoId)\n\n // android 6以下不支持自动播放\n if (\n Sniffer.os.isAndroid &&\n Sniffer.osVersion > 0 &&\n Sniffer.osVersion < 6\n ) {\n this.config.autoplay = false\n }\n\n /**\n * @readonly\n * @type {any}\n */\n this.database = new Database()\n\n /**\n * @readonly\n * @type { boolean }\n */\n this.isUserActive = false\n\n /**\n * @private\n * @description seek之后canplay回调函数定义\n * @type { Function | null }\n */\n this._onceSeekCanplay = null\n\n /**\n * @description 记录seek之前是否处于暂停状态\n * @type { number }\n * @private\n */\n this._isPauseBeforeSeek = 0\n\n /**\n * @description 内部状态记录\n * @type { {\n * isActiveLocked: boolean;\n * } }\n * @readonly\n */\n this.innerStates = {\n // 当前的active是否是锁定状态\n isActiveLocked: false\n }\n\n /**\n * @type {InstManager}\n */\n this.instManager = instManager\n const rootInit = this._initDOM()\n if (!rootInit) {\n console.error(\n new Error(\n `can't find the dom which id is ${this.config.id} or this.config.el does not exist`\n )\n )\n return\n }\n\n // url为空的情况下 根据definition或playnext.urlList设置播放地址\n // 若未配置definition.defaultDefinition,默认将配置为definition.list[0].definition\n const { definition = {}, url } = this.config\n\n if (!url && definition.list && definition.list.length > 0) {\n let defaultDefinitionObj = definition.list.find(\n (e) => e.definition && e.definition === definition.defaultDefinition\n )\n if (!defaultDefinitionObj) {\n definition.defaultDefinition = definition.list[0].definition\n defaultDefinitionObj = definition.list[0]\n }\n this.config.url = defaultDefinitionObj.url\n this.curDefinition = defaultDefinitionObj\n }\n\n this._bindEvents()\n this._registerPresets()\n this._registerPlugins()\n pluginsManager.onPluginsReady(this)\n\n // url为空的情况下 根据definition设置播放地址\n this.getInitDefinition()\n\n this.setState(STATES.READY)\n Util.setTimeout(this, () => {\n this.emit(Events.READY)\n }, 0)\n this.onReady && this.onReady()\n\n if (this.config.videoInit || this.config.autoplay) {\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n this.start()\n }\n }\n }\n\n /**\n * init control domElement\n * @private\n */\n _initDOM () {\n this.root = this.config.id ? document.getElementById(this.config.id) : null\n if (!this.root) {\n const el = this.config.el\n if (el && el.nodeType === 1) {\n this.root = el\n } else {\n this.emit(\n Events.ERROR,\n new Errors('use', this.config.vid, {\n line: 32,\n handle: 'Constructor',\n msg: 'container id can\\'t be empty'\n })\n )\n console.error('this.confg.id or this.config.el can\\'t be empty')\n return false\n }\n }\n const ret = checkPlayerRoot(this.root)\n if (ret) {\n XG_DEBUG.logWarn(\n 'The is an Player instance already exists in this.root, destroy it and reinitialize'\n )\n ret.destroy()\n }\n this.root.setAttribute(PLATER_ID, this.playerId)\n instManager?.add(this)\n pluginsManager.init(this)\n this._initBaseDoms()\n\n // 允许自定义video对象的构造\n const XgVideoProxy = this.constructor.XgVideoProxy\n if (XgVideoProxy && this.mediaConfig.mediaType === XgVideoProxy.mediaType) {\n const el = this.innerContainer || this.root\n this.detachVideoEvents(this.media)\n const _nVideo = new XgVideoProxy(el, this.config, this.mediaConfig)\n this.attachVideoEvents(_nVideo)\n this.media = _nVideo\n }\n this.media.setAttribute(PLATER_ID, this.playerId)\n if (this.config.controls) {\n const _root = this.config.controls.root || null\n const controls = pluginsManager.register(this, Controls, { root: _root })\n this.controls = controls\n }\n const device =\n this.config.isMobileSimulateMode === 'mobile' ? 'mobile' : Sniffer.device\n this.addClass(\n `${STATE_CLASS.DEFAULT} ${STATE_CLASS.INACTIVE} xgplayer-${device} ${\n this.config.controls ? '' : STATE_CLASS.NO_CONTROLS\n }`\n )\n if (this.config.autoplay) {\n this.addClass(STATE_CLASS.ENTER)\n } else {\n this.addClass(STATE_CLASS.NO_START)\n }\n if (this.config.fluid) {\n let { width, height } = this.config\n if (typeof width !== 'number' || typeof height !== 'number') {\n width = 600\n height = 337.5\n }\n const style = {\n width: '100%',\n height: '0',\n 'max-width': '100%',\n 'padding-top': `${(height * 100) / width}%`\n // position: 'relative',\n // top: '0',\n // left: '0'\n }\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\n } else {\n ['width', 'height'].forEach((key) => {\n if (this.config[key]) {\n if (typeof this.config[key] !== 'number') {\n this.root.style[key] = this.config[key]\n } else {\n this.root.style[key] = `${this.config[key]}px`\n }\n }\n })\n }\n const { width, height, left, top } = this.root.getBoundingClientRect()\n this.sizeInfo.width = width\n this.sizeInfo.height = height\n this.sizeInfo.left = left\n this.sizeInfo.top = top\n return true\n }\n\n /**\n * @private\n */\n _initBaseDoms () {\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.topBar = null\n /**\n * @readonly\n * @type { HTMLElement |null }\n */\n this.leftBar = null\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.rightBar = null\n\n if (this.config.marginControls) {\n this.innerContainer = Util.createDom(\n 'xg-video-container',\n '',\n { 'data-index': -1 },\n 'xg-video-container'\n )\n this.root.appendChild(this.innerContainer)\n }\n }\n\n /**\n * @private\n */\n _bindEvents () {\n ['focus', 'blur'].forEach((item) => {\n this.on(item, this['on' + item.charAt(0).toUpperCase() + item.slice(1)])\n })\n\n FULLSCREEN_EVENTS.forEach((item) => {\n document && document.addEventListener(item, this.onFullscreenChange)\n })\n\n if (Sniffer.os.isIos) {\n this.media.addEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.addEventListener( 'webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n this.once(Events.LOADED_DATA, this.resize)\n\n this.playFunc = () => {\n if (!this.config.closeFocusVideoFocus) {\n this.media.focus()\n }\n }\n this.once(Events.PLAY, this.playFunc)\n }\n\n /**\n * @private\n */\n _unbindEvents () {\n this.root.removeEventListener('mousemove', this.mousemoveFunc)\n FULLSCREEN_EVENTS.forEach((item) => {\n document.removeEventListener(item, this.onFullscreenChange)\n })\n this.playFunc && this.off(Events.PLAY, this.playFunc)\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.media.removeEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.removeEventListener('webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n _clearUserTimer () {\n if (!this.userTimer) {\n return\n }\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n\n /**\n *\n * @param { any } [url]\n * @returns\n */\n _startInit (url) {\n if (!this.media) {\n return\n }\n if (\n !url ||\n url === '' ||\n (Util.typeOf(url) === 'Array' && url.length === 0)\n ) {\n url = ''\n this.emit(Events.URL_NULL)\n XG_DEBUG.logWarn(\n 'config.url is null, please get url and run player._startInit(url)'\n )\n if (this.config.nullUrlStart) {\n return\n }\n }\n\n if (this.handleSource) {\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array' && url.length > 0) {\n this._attachSourceEvents(this.media, url)\n } else if (!this.media.src || this.media.src !== url) {\n this.media.src = url\n } else if (!url) {\n this.media.removeAttribute('src')\n }\n }\n\n if (Util.typeOf(this.config.volume) === 'Number') {\n this.volume = this.config.volume\n }\n\n const _root = this.innerContainer ? this.innerContainer : this.root\n if (this.media instanceof window.Element && !_root.contains(this.media)) {\n _root.insertBefore(this.media, _root.firstChild)\n }\n\n const { readyState } = this.media\n XG_DEBUG.logInfo('_startInit readyState', readyState)\n if (this.config.autoplay) {\n !Util.isMSE(this.media) && this.load();\n // ios端无法自动播放的场景下,不调用play不会触发canplay loadeddata等事件\n (Sniffer.os.isIpad || Sniffer.os.isPhone) && this.mediaPlay()\n }\n\n const { startTime } = this.config\n this.__startTime = startTime > 0 ? startTime : -1\n this.config.startTime = 0\n if (readyState >= 2 && this.duration > 0) {\n this.canPlayFunc()\n } else {\n this.on(Events.CANPLAY, this.canPlayFunc)\n }\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n pluginsManager.afterInit(this)\n }\n this.hasStart = true\n this.setState(STATES.ATTACHED)\n Util.setTimeout(this, () => {\n this.emit(Events.COMPLETE)\n }, 0)\n }\n\n /**\n * @description 注册组件 组件列表config.plugins\n * @param { {boolean} } [isInit] 是否是首次初始化\n * @private\n */\n _registerPlugins (isInit = true) {\n /**\n * @private\n */\n this._loadingPlugins = []\n const ignores = this.config.ignores || []\n const plugins = this.config.plugins || []\n const i18n = this.config.i18n || []\n isInit && I18N.extend(i18n, this.__i18n)\n const ignoresStr = ignores.join('||').toLowerCase().split('||')\n const cuPlugins = this.plugins\n plugins.forEach((plugin) => {\n try {\n const pluginName = plugin.plugin\n ? plugin.plugin.pluginName\n : plugin.pluginName\n // 在ignores中的不做组装\n if (pluginName && ignoresStr.indexOf(pluginName.toLowerCase()) > -1) {\n return null\n }\n\n if (!isInit && cuPlugins[pluginName.toLowerCase()]) {\n return\n }\n\n if (plugin.lazy && plugin.loader) {\n const loadingPlugin = pluginsManager.lazyRegister(this, plugin)\n if (plugin.forceBeforeInit) {\n loadingPlugin\n .then(() => {\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n .catch((e) => {\n XG_DEBUG.logError('_registerPlugins:loadingPlugin', e)\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n this._loadingPlugins.push(loadingPlugin)\n }\n\n return\n }\n return this.registerPlugin(plugin)\n } catch (err) {\n XG_DEBUG.logError('_registerPlugins:', err)\n // return\n }\n })\n }\n\n /**\n * @private\n */\n _registerPresets () {\n this.config.presets.forEach((preset) => {\n usePreset(this, preset)\n })\n }\n\n /**\n * @private\n * @param { string } position ]\n */\n _getRootByPosition (position) {\n let _root = null\n switch (position) {\n case POSITIONS.ROOT_RIGHT:\n if (!this.rightBar) {\n this.rightBar = Util.createPositionBar('xg-right-bar', this.root)\n }\n _root = this.rightBar\n break\n case POSITIONS.ROOT_LEFT:\n if (!this.leftBar) {\n this.leftBar = Util.createPositionBar('xg-left-bar', this.root)\n }\n _root = this.leftBar\n break\n case POSITIONS.ROOT_TOP:\n if (!this.topBar) {\n this.topBar = Util.createPositionBar('xg-top-bar', this.root)\n if (this.config.topBarAutoHide) {\n Util.addClass(this.topBar, STATE_CLASS.TOP_BAR_AUTOHIDE)\n }\n }\n _root = this.topBar\n break\n default:\n _root = this.innerContainer || this.root\n break\n }\n return _root\n }\n\n /**\n *\n * @param { {plugin: function, options:object} | function } plugin\n * @param { {[propName: string]: any;} } [config]\n * @returns { any } plugin\n */\n registerPlugin (plugin, config) {\n const _retPlugin = pluginsManager.formatPluginInfo(plugin, config)\n const { PLUFGIN, options } = _retPlugin\n\n // 如果当前配置plugins中不存在该组件, 则将其push\n const { plugins } = this.config\n const exits = pluginsManager.checkPluginIfExits(PLUFGIN.pluginName, plugins)\n !exits && plugins.push(PLUFGIN)\n\n // 获取配置的position或者root\n const _pConfig = pluginsManager.getRootByConfig(PLUFGIN.pluginName, this.config)\n _pConfig.root && (options.root = _pConfig.root)\n _pConfig.position && (options.position = _pConfig.position)\n\n const position = options.position\n ? options.position\n : (options.config && options.config.position) ||\n (PLUFGIN.defaultConfig && PLUFGIN.defaultConfig.position)\n if (\n !options.root &&\n typeof position === 'string' &&\n position.indexOf('controls') > -1\n ) {\n return this.controls?.registerPlugin(PLUFGIN, options, PLUFGIN.pluginName)\n }\n if (!options.root) {\n options.root = this._getRootByPosition(position)\n }\n return pluginsManager.register(this, PLUFGIN, options)\n }\n\n /**\n *\n * @param { any } plugin\n */\n deregister (plugin) {\n if (typeof plugin === 'string') {\n pluginsManager.unRegister(this, plugin)\n } else if (plugin instanceof BasePlugin) {\n pluginsManager.unRegister(this, plugin.pluginName)\n }\n }\n\n /**\n *\n * @param { any } plugin\n * @param { boolean } removedFromConfig\n */\n unRegisterPlugin (plugin, removedFromConfig = false) {\n this.deregister(plugin)\n if (removedFromConfig) {\n this.removePluginFromConfig(plugin)\n }\n }\n\n removePluginFromConfig (plugin) {\n let pluginName\n if (typeof plugin === 'string') {\n pluginName = plugin\n } else if (plugin instanceof BasePlugin) {\n pluginName = plugin.pluginName\n }\n if (!pluginName) {\n return\n }\n for (let i = this.config.plugins.length - 1; i > -1; i--) {\n const plugin = this.config.plugins[i]\n if (plugin.pluginName.toLowerCase() === pluginName.toLowerCase()) {\n this.config.plugins.splice(i, 1)\n break\n }\n }\n }\n\n /**\n * 当前播放器挂载的插件实例列表\n * @type { {[propName: string]: any | null } }\n */\n get plugins () {\n return pluginsManager.getPlugins(this)\n }\n\n /**\n * get a plugin instance\n * @param { string } pluginName\n * @return { null | any } plugin\n */\n getPlugin (pluginName) {\n const plugin = pluginsManager.findPlugin(this, pluginName)\n return plugin && plugin.pluginName ? plugin : null\n }\n\n /**\n *\n * @param { string } className\n */\n addClass (className) {\n if (!this.root) {\n return\n }\n if (!Util.hasClass(this.root, className)) {\n Util.addClass(this.root, className)\n }\n }\n\n /**\n *\n * @param { string } className\n * @returns\n */\n removeClass (className) {\n if (!this.root) {\n return\n }\n Util.removeClass(this.root, className)\n }\n\n /**\n *\n * @param { string } className\n * @returns { boolean } has\n */\n hasClass (className) {\n if (!this.root) {\n return\n }\n return Util.hasClass(this.root, className)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n setAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.setAttribute(key, value)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n removeAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.removeAttribute(key, value)\n }\n\n /**\n *\n * @param { any } [url]\n * @returns { Promise | void }\n * @description 启动播放器,start一般都是播放器内部隐式调用,主要功能是将video添加到DOM\n */\n start (url) {\n // 已经开始初始化播放了 则直接调用play\n if (this.state > STATES.ATTACHING) {\n return\n }\n if (!url && !this.config.url) {\n this.getInitDefinition()\n }\n this.hasStart = true\n this.setState(STATES.ATTACHING)\n\n this._registerPlugins(false)\n return pluginsManager\n .beforeInit(this)\n .then(() => {\n // this.config为空即已经销毁,不再执行后面的异步流程\n if (!this.config) {\n return\n }\n if (!url) {\n url = this.url || this.config.url\n }\n const _furl = this._preProcessUrl(url)\n const ret = this._startInit(_furl.url)\n return ret\n })\n .catch((e) => {\n e.fileName = 'player'\n e.lineNumber = '236'\n XG_DEBUG.logError('start:beforeInit:', e)\n throw e\n })\n }\n\n /**\n * @param { string | object } url\n * @param { SwitchUrlOptions } [options]\n * @returns { Promise | null } 执行结果\n */\n switchURL (url, options) {\n let _src = url\n if (Util.typeOf(url) === 'Object') {\n _src = url.url\n }\n _src = this._preProcessUrl(_src).url\n const curTime = this.currentTime\n this.__startTime = curTime\n const isPaused = this.paused && !this.isError\n this.src = _src\n return new Promise((resolve, reject) => {\n const _error = (e) => {\n this.off('timeupdate', _canplay)\n this.off('canplay', _canplay)\n reject(e)\n }\n const _canplay = () => {\n this._seekToStartTime()\n if (isPaused) {\n this.pause()\n }\n this.off('error', _error)\n resolve(true)\n }\n this.once('error', _error)\n if (!_src){\n this.errorHandler('error', {code: 6, message: 'empty_src'})\n return\n }\n if (Sniffer.os.isAndroid) {\n this.once('timeupdate', _canplay)\n } else {\n this.once('canplay', _canplay)\n }\n this.play()\n })\n }\n\n /**\n * @description call play without play hook\n * @deprecated this api renamed to mediaPlay, you can call it as player.mediaPlay()\n */\n videoPlay () {\n this.mediaPlay()\n }\n\n /**\n * @description call play without play hook\n */\n mediaPlay () {\n if (!this.hasStart && this.state < STATES.ATTACHED) {\n this.removeClass(STATE_CLASS.NO_START)\n this.addClass(STATE_CLASS.ENTER)\n this.start()\n this._useAutoplay = true\n return\n }\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n !this.isCanplay && this.addClass(STATE_CLASS.ENTER)\n }\n const playPromise = super.play()\n if (playPromise !== undefined && playPromise && playPromise.then) {\n playPromise\n .then(() => {\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.addClass(STATE_CLASS.PLAYING)\n if (this.state < STATES.RUNNING) {\n XG_DEBUG.logInfo('>>>>playPromise.then')\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n })\n .catch((e) => {\n XG_DEBUG.logWarn('>>>>playPromise.catch', e.name)\n if (this.media && this.media.error) {\n this.onError()\n // this.errorHandler('error')\n this.removeClass(STATE_CLASS.ENTER)\n // this.setState(STATES.ERROR)\n return\n }\n // 避免AUTOPLAY_PREVENTED先于playing和play触发\n if (e.name === 'NotAllowedError') {\n /**\n * @private\n */\n this._errorTimer = Util.setTimeout(\n this,\n () => {\n this._errorTimer = null\n this.emit(Events.AUTOPLAY_PREVENTED)\n this.addClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.ENTER)\n this.pause()\n this.setState(STATES.NOTALLOW)\n },\n 0\n )\n }\n })\n } else {\n XG_DEBUG.logWarn('video.play not return promise')\n if (this.state < STATES.RUNNING) {\n this.setState(STATES.RUNNING)\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.addClass(STATE_CLASS.PLAYING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n }\n return playPromise\n }\n\n /**\n * @description call play without pause hook\n */\n mediaPause () {\n super.pause()\n }\n\n /**\n * @description call play without pause hook\n * @deprecated this api renamed to mediaPause, you can call it as player.mediaPause()\n */\n videoPause () {\n super.pause()\n }\n\n play () {\n this.removeClass(STATE_CLASS.PAUSED)\n return runHooks(this, 'play', () => {\n return this.mediaPlay()\n })\n }\n\n pause () {\n runHooks(this, 'pause', () => {\n super.pause()\n })\n }\n\n /**\n *\n * @param { number } time\n * @param { 'play' | 'pause' | 'auto' } [status]\n * @returns\n */\n seek (time, status) {\n if (!this.media || Number.isNaN(Number(time)) || !this.hasStart) {\n return\n }\n const { isSeekedPlay, seekedStatus } = this.config\n const _status = status || (isSeekedPlay ? 'play' : seekedStatus)\n time = time < 0 ? 0 : time > this.duration ? parseInt(this.duration, 10) : time\n\n !this._isPauseBeforeSeek && (this._isPauseBeforeSeek = this.paused ? 2 : 1)\n\n this._onceSeekCanplay && this.off(Events.SEEKED, this._onceSeekCanplay)\n\n this._onceSeekCanplay = () => {\n // const { seekedStatus } = this.config\n this.removeClass(STATE_CLASS.ENTER)\n this.isSeeking = false\n switch (_status) {\n case 'play':\n this.play()\n break\n case 'pause':\n this.pause()\n break\n default:\n this._isPauseBeforeSeek > 1 || this.paused ? this.pause() : this.play()\n }\n this._isPauseBeforeSeek = 0\n this._onceSeekCanplay = null\n }\n\n this.once(Events.SEEKED, this._onceSeekCanplay)\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n this.currentTime = time\n // 未起播状态不论希望保持什么状态,都要触发一次play, 避免ios下起播异常问题\n this.play()\n } else {\n this.currentTime = time\n }\n }\n\n getInitDefinition () {\n // url为空的情况下 根据definition设置播放地址\n const { definition, url } = this.config\n if (\n !url &&\n definition &&\n definition.list &&\n definition.list.length > 0 &&\n definition.defaultDefinition\n ) {\n definition.list.map((item) => {\n if (item.definition === definition.defaultDefinition) {\n this.config.url = item.url\n this.curDefinition = item\n }\n })\n }\n }\n\n /**\n * @typedef { import('./defaultConfig').IDefinition } definition\n */\n /**\n * @description change the definition of the current playback\n * @param { definition } to\n * @param { definition } [from]\n */\n changeDefinition (to, from) {\n const { definition } = this.config\n\n if (Array.isArray(definition?.list)) {\n definition.list.forEach((item) => {\n if (to?.definition === item.definition) {\n this.curDefinition = item\n }\n })\n }\n\n if (to?.bitrate && typeof to.bitrate !== 'number') {\n to.bitrate = parseInt(to.bitrate, 10) || 0\n }\n\n this.emit(Events.DEFINITION_CHANGE, { from, to })\n if (!this.hasStart) {\n this.config.url = to.url\n return\n }\n const ret = this.switchURL(to.url, {\n seamless: definition.seamless !== false\n && typeof MediaSource !== 'undefined'\n && typeof MediaSource.isTypeSupported === 'function',\n ...to\n })\n if (ret && ret.then) {\n ret.then(() => {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n })\n } else {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n }\n }\n\n reload () {\n this.load()\n /**\n * @private\n */\n this.reloadFunc = function () {\n this.play()\n }\n this.once(Events.LOADED_DATA, this.reloadFunc)\n }\n\n resetState () {\n const {\n NOT_ALLOW_AUTOPLAY,\n PLAYING,\n NO_START,\n PAUSED,\n REPLAY,\n ENTER,\n ENDED,\n ERROR,\n LOADING\n } = STATE_CLASS\n const clsList = [\n NOT_ALLOW_AUTOPLAY,\n PLAYING,\n NO_START,\n PAUSED,\n REPLAY,\n ENTER,\n ENDED,\n ERROR,\n LOADING\n ]\n this.hasStart = false\n this.isError = false\n this._useAutoplay = false\n this.mediaPause()\n this._accPlayed.acc = 0\n this._accPlayed.t = 0\n this._accPlayed.loopAcc = 0\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n this.addClass(STATE_CLASS.NO_START)\n this.emit(Events.RESET)\n }\n\n /**\n * 重置播放实例\n * @param { Array } unregisterPlugins 重置的时候需要卸载重新初始化的插件列表\n * @param { boolean } [isResetConfig] 是否需要重置配置列表\n * @returns\n */\n reset (unregisterPlugins = [], isResetConfig) {\n this.resetState()\n const { plugins } = this\n\n if (!plugins) {\n return\n }\n\n unregisterPlugins.map((pn) => {\n this.deregister(pn)\n })\n\n if (isResetConfig) {\n const de = getDefaultConfig()\n Object.keys(this.config).keys((k) => {\n if (\n this.config[k] !== 'undefined' &&\n (k === 'plugins' || k === 'presets' || k === 'el' || k === 'id')\n ) {\n this.config[k] = de[k]\n }\n })\n }\n }\n\n /**\n * @description destroy the player instance\n * @returns\n */\n destroy () {\n const { innerContainer, root, media } = this\n if (!root || !media) {\n return\n }\n this.hasStart = false\n this._useAutoplay = false\n root.removeAttribute(PLATER_ID)\n this.updateAcc('destroy')\n this._unbindEvents()\n this._detachSourceEvents(this.media)\n Util.clearAllTimers(this)\n this.emit(Events.DESTROY)\n instManager?.remove(this)\n pluginsManager.destroy(this)\n delHooksDescriptor(this)\n super.destroy()\n // 退出全屏\n if (this.fullscreen && this._fullscreenEl === this.root) {\n this.exitFullscreen()\n }\n\n if (innerContainer) {\n const _c = innerContainer.children\n for (let i = 0; i < _c.length; i++) {\n innerContainer.removeChild(_c[i])\n }\n }\n !innerContainer &&\n media instanceof window.Node &&\n root.contains(media) &&\n root.removeChild(media);\n ['topBar', 'leftBar', 'rightBar', 'innerContainer'].map((item) => {\n this[item] && root.removeChild(this[item])\n this[item] = null\n })\n const cList = root.className.split(' ')\n if (cList.length > 0) {\n root.className = cList\n .filter((name) => name.indexOf('xgplayer') < 0)\n .join(' ')\n } else {\n root.className = ''\n }\n this.removeAttribute('data-xgfill');\n\n [\n 'isSeeking',\n 'isCanplay',\n 'isActive',\n 'cssfullscreen',\n 'fullscreen'\n ].forEach((key) => {\n this[key] = false\n })\n }\n\n replay () {\n this.removeClass(STATE_CLASS.ENDED)\n this.currentTime = 0\n this.isSeeking = false\n runHooks(this, 'replay', () => {\n this.once(Events.SEEKED, () => {\n const playPromise = this.mediaPlay()\n if (playPromise && playPromise.catch) {\n playPromise.catch(err => {\n console.log(err)\n })\n }\n })\n this.emit(Events.REPLAY)\n this.onPlay()\n })\n }\n\n retry () {\n this.removeClass(STATE_CLASS.ERROR)\n this.addClass(STATE_CLASS.LOADING)\n runHooks(this, 'retry', () => {\n const cur = this.currentTime\n const { url } = this.config\n const _srcRet = !Util.isMSE(this.media) ? this._preProcessUrl(url) : { url }\n this.src = _srcRet.url\n !this.config.isLive && (this.currentTime = cur)\n this.once(Events.CANPLAY, () => {\n this.mediaPlay()\n })\n })\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n changeFullStyle (root, el, rootClass, pClassName) {\n if (!root) {\n return\n }\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (!this._orgCss) {\n this._orgCss = Util.filterStyleFromText(root)\n }\n Util.addClass(root, rootClass)\n if (el && el !== root && !this._orgPCss) {\n /**\n * @private\n */\n this._orgPCss = Util.filterStyleFromText(el)\n Util.addClass(el, pClassName)\n el.setAttribute(PLATER_ID, this.playerId)\n }\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n recoverFullStyle (root, el, rootClass, pClassName) {\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (this._orgCss) {\n Util.setStyleFromCsstext(root, this._orgCss)\n this._orgCss = ''\n }\n Util.removeClass(root, rootClass)\n if (el && el !== root && this._orgPCss) {\n Util.setStyleFromCsstext(el, this._orgPCss)\n this._orgPCss = ''\n Util.removeClass(el, pClassName)\n el.removeAttribute(PLATER_ID)\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise }\n */\n getFullscreen (el = this.config.fullscreenTarget) {\n const { root, media } = this\n if (el === 'video' || el === 'media') {\n el = this[el]\n }\n if (!el) {\n el = root\n }\n this._fullScreenOffset = {\n top: Util.scrollTop(),\n left: Util.scrollLeft()\n }\n\n this._fullscreenEl = el\n /**\n * @private\n */\n this._fullActionFrom = 'get'\n const fullEl = Util.getFullScreenEl()\n if (fullEl === this._fullscreenEl) {\n this.onFullscreenChange()\n return Promise.resolve()\n }\n try {\n for (let i = 0; i < GET_FULLSCREEN_API.length; i++) {\n const key = GET_FULLSCREEN_API[i]\n if (el[key]) {\n const ret =\n key === 'webkitRequestFullscreen'\n ? el.webkitRequestFullscreen(window.Element.ALLOW_KEYBOARD_INPUT)\n : el[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (media.fullscreenEnabled || media.webkitSupportsFullscreen) {\n media.webkitEnterFullscreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call getFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call getFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise }\n */\n exitFullscreen (el) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n }\n if (!this._fullscreenEl && !Util.getFullScreenEl()) {\n return\n }\n const { root, media } = this\n if (!el) {\n el = root\n }\n this._fullActionFrom = 'exit'\n try {\n for (let i = 0; i < EXIT_FULLSCREEN_API.length; i++) {\n const key = EXIT_FULLSCREEN_API[i]\n if (document[key]) {\n const ret = document[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (media && media.webkitSupportsFullscreen) {\n media.webkitExitFullScreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call exitFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call exitFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n getCssFullscreen (el = this.config.fullscreenTarget) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n } else if (this.fullscreen) {\n this.exitFullscreen()\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n this.changeFullStyle(this.root, el, _class)\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.fullscreen = true\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n this._cssfullscreenEl = el\n this.cssfullscreen = true\n this.emit(Events.CSS_FULLSCREEN_CHANGE, true)\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n exitCssFullscreen () {\n const _class = this._cssfullscreenEl\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n if (!this.fullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n } else {\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n this.fullscreen = false\n this.emit(Events.FULLSCREEN_CHANGE, false)\n } else {\n this.removeClass(_class)\n }\n }\n this._cssfullscreenEl = null\n this.cssfullscreen = false\n this.emit(Events.CSS_FULLSCREEN_CHANGE, false)\n }\n\n /**\n * 进入旋转全屏\n * @param { HTMLElement } [el]\n */\n getRotateFullscreen (el = this.config.fullscreenTarget) {\n if (this.cssfullscreen) {\n this.exitCssFullscreen(el)\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this._fullscreenEl = el || this.root\n this.changeFullStyle(\n this.root,\n el,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = true\n this.fullscreen = true\n this.setRotateDeg(90)\n this._rootStyle = this.root.getAttribute('style')\n this.root.style.width = `${window.innerHeight}px`\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n\n /**\n * 退出旋转全屏\n * @param { HTMLElement } [el]\n */\n exitRotateFullscreen (el) {\n const _class =\n this._fullscreenEl !== this.root\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this.recoverFullStyle(\n this.root,\n this._fullscreenEl,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = false\n this.fullscreen = false\n this.setRotateDeg(0)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n if (this._rootStyle) {\n this.root.style.style = this._rootStyle\n this._rootStyle = false\n }\n }\n\n setRotateDeg (deg) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.rotateDeg = 0\n } else {\n this.rotateDeg = deg\n }\n }\n\n /**\n * @description 播放器焦点状态,控制栏显示\n * @param { {\n * autoHide?: boolean, // 是否可以自动隐藏\n * delay?: number // 自动隐藏的延迟时间, ms, 不传默认使用3000ms\n * isLock?: boolean // 是否锁定, 锁定之后自动呼出和blur调用都不生效, 默认值false\n * } } [data]\n */\n focus (\n data = {\n autoHide: !this.config.closeDelayBlur,\n delay: this.config.inactive\n }\n ) {\n if (this.isActive) {\n this.onFocus(data)\n return\n }\n this.emit(Events.PLAYER_FOCUS, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @description 取消播放器当前焦点状态\n * @param { { ignorePaused?: boolean } } [data]\n */\n blur (data = { ignorePaused: false }) {\n if (!this.isActive) {\n this.onBlur(data)\n return\n }\n this._clearUserTimer()\n this.emit(Events.PLAYER_BLUR, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @protected\n * @param { { autoHide?: boolean, delay?: number, isLock?: boolean } } [data]\n * @returns\n */\n onFocus (data = { autoHide: true, delay: 3000 }) {\n const { innerStates } = this\n this.isActive = true\n this.removeClass(STATE_CLASS.INACTIVE)\n this._clearUserTimer()\n if (data.isLock !== undefined) {\n innerStates.isActiveLocked = data.isLock\n }\n if (data.autoHide === false || data.isLock === true || innerStates.isActiveLocked) {\n this._clearUserTimer()\n return\n }\n const time = data && data.delay ? data.delay : this.config.inactive\n this.userTimer = Util.setTimeout(this, () => {\n this.userTimer = null\n this.blur()\n }, time)\n }\n\n /**\n * @protected\n * @param {{ ignorePaused?: boolean }} [data]\n * @returns\n */\n onBlur ({ ignorePaused = false } = {}) {\n if (this.innerStates.isActiveLocked) {\n return\n }\n const { closePauseVideoFocus } = this.config\n this.isActive = false\n if (ignorePaused || closePauseVideoFocus || (!this.paused && !this.ended)) {\n this.addClass(STATE_CLASS.INACTIVE)\n }\n }\n\n canPlayFunc = () => {\n if (!this.config) {\n return\n }\n const { autoplay, defaultPlaybackRate } = this.config\n\n XG_DEBUG.logInfo('player', 'canPlayFunc, startTime', this.__startTime)\n this._seekToStartTime()\n\n // 解决浏览器安装了一些倍速扩展插件的情况下,倍速设置失效问题\n this.playbackRate = defaultPlaybackRate;\n\n (autoplay || this._useAutoplay) && this.mediaPlay()\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.removeClass(STATE_CLASS.ENTER)\n }\n\n /**\n *\n */\n onFullscreenChange = (event, isFullScreen) => {\n const delayResize = () => {\n Util.setTimeout(this, () => {\n this.resize()\n }, 100)\n }\n const fullEl = Util.getFullScreenEl()\n if (this._fullActionFrom) {\n this._fullActionFrom = ''\n } else {\n // 快捷键触发\n this.emit(Events.USER_ACTION, {\n eventType: 'system',\n action: 'switch_fullscreen',\n pluginName: 'player',\n currentTime: this.currentTime,\n duration: this.duration,\n props: [{\n prop: 'fullscreen',\n from: true,\n to: false\n }]\n })\n }\n const isVideo = checkIsCurrentVideo(fullEl, this.playerId, PLATER_ID)\n if (isFullScreen || (fullEl && (fullEl === this._fullscreenEl || isVideo))) {\n delayResize()\n !this.config.closeFocusVideoFocus && this.media.focus()\n this.fullscreen = true\n // this.addClass(STATE_CLASS.FULLSCREEN)\n this.changeFullStyle(this.root, fullEl, STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, true, this._fullScreenOffset)\n if (this.cssfullscreen) {\n this.exitCssFullscreen()\n }\n } else if (this.fullscreen) {\n delayResize()\n const { _fullScreenOffset, config } = this\n if (config.needFullscreenScroll) {\n // 保证页面scroll的情况下退出全屏 页面回到原位置\n window.scrollTo(_fullScreenOffset.left, _fullScreenOffset.top)\n Util.setTimeout( this, () => {\n this.fullscreen = false\n this._fullScreenOffset = null\n }, 100)\n } else {\n // 保证页面scroll的情况下退出全屏 页面定位在播放器位置\n !this.config.closeFocusVideoFocus && this.media.focus()\n this.fullscreen = false\n this._fullScreenOffset = null\n }\n if (!this.cssfullscreen) {\n let el = this._fullscreenEl\n if (!el && (this.root.contains(event.target) || event.target === this.root)) {\n el = event.target\n }\n this.recoverFullStyle( this.root, el, STATE_CLASS.FULLSCREEN)\n } else {\n this.removeClass(STATE_CLASS.FULLSCREEN)\n }\n this._fullscreenEl = null\n // this.removeClass(STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n }\n }\n\n _onWebkitbeginfullscreen = (e) => {\n this._fullscreenEl = this.media\n this.onFullscreenChange(e, true)\n }\n\n _onWebkitendfullscreen = (e) => {\n this.onFullscreenChange(e, false)\n }\n\n onEmptied () {\n this.updateAcc('emptied')\n }\n\n /**\n * @protected\n */\n onCanplay () {\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.ERROR)\n this.removeClass(STATE_CLASS.LOADING)\n this.isCanplay = true\n this.waitTimer && Util.clearTimeout(this, this.waitTimer)\n }\n\n onLoadeddata () {\n this.isError = false\n this.isSeeking = false\n if (this.__startTime > 0) {\n if (this.duration > 0) {\n this._seekToStartTime()\n } else {\n // 在安卓原生video播放hls时,loadeddata触发时durationchange事件虽然已经触发过了但duration仍然为0,\n // 需要在下一次durationchange触发时再重新设置起播时间\n this.once(Events.DURATION_CHANGE, () => {\n this._seekToStartTime()\n })\n }\n }\n }\n\n onLoadstart () {\n this.removeClass(STATE_CLASS.ERROR)\n this.isCanplay = false\n }\n\n /**\n * @protected\n */\n onPlay () {\n if (this.state === STATES.ENDED) {\n this.setState(STATES.RUNNING)\n }\n this.removeClass(STATE_CLASS.PAUSED)\n this.ended && this.removeClass(STATE_CLASS.ENDED)\n !this.config.closePlayVideoFocus && this.focus()\n }\n\n /**\n * @protected\n */\n onPause () {\n this.addClass(STATE_CLASS.PAUSED)\n this.updateAcc('pause')\n if (!this.config.closePauseVideoFocus) {\n this._clearUserTimer()\n this.focus()\n }\n }\n\n /**\n * @protected\n */\n onEnded () {\n this.updateAcc('ended')\n this.addClass(STATE_CLASS.ENDED)\n this.setState(STATES.ENDED)\n // this.removeClass(STATE_CLASS.PLAYING)\n }\n\n /**\n * @protected\n */\n onError () {\n // this.setState(STATES.ERROR)\n this.isError = true\n this.updateAcc('error')\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.LOADING)\n this.addClass(STATE_CLASS.ERROR)\n }\n\n /**\n * @protected\n */\n onSeeking () {\n if (!this.isSeeking) {\n this.updateAcc('seeking')\n }\n this.isSeeking = true\n this.addClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onSeeked () {\n this.isSeeking = false\n // for ie,playing fired before waiting\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.removeClass(STATE_CLASS.LOADING)\n this.removeClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onWaiting () {\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.updateAcc('waiting')\n this.waitTimer = Util.setTimeout(this, () => {\n this.addClass(STATE_CLASS.LOADING)\n this.emit(Events.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }, this.config.minWaitDelay)\n }\n\n /**\n * @protected\n */\n onPlaying () {\n this.isError = false\n const { NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING } = STATE_CLASS\n const clsList = [NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING]\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n /**\n * @protected\n */\n onTimeupdate () {\n !this._videoHeight && this.media.videoHeight && this.resize()\n if ((this.waitTimer || this.hasClass(STATE_CLASS.LOADING)) &&\n this.media.readyState > 2\n ) {\n this.removeClass(STATE_CLASS.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }\n\n // 兼容safari在调整为静音之后未调用play自动起播问题\n if (!this.paused && this.state === STATES.NOTALLOW && this.duration) {\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n\n if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n onVolumechange () {\n Util.typeOf(this.config.volume) === 'Number' &&\n (this.config.volume = this.volume)\n }\n\n onRatechange () {\n this.config.defaultPlaybackRate = this.playbackRate\n }\n\n /**\n * 触发用户行为事件,第一个参数是Dom事件\n * @param { Event } event\n * @param { string } action\n * @param {[propName: string]: any; } [params]\n * @returns\n */\n emitUserAction (event, action, params) {\n if (!this.media || !action || !event) {\n return\n }\n const eventType =\n Util.typeOf(event) === 'String' ? event : event.type || ''\n\n // if (action === 'switch_play_pause') {\n // Util.typeOf(params.paused) === 'Undefined' && (params.paused = this.paused)\n // params.isFirstStart = !this.playing\n // }\n\n if (params.props && Util.typeOf(params.props) !== 'Array') {\n params.props = [params.props]\n }\n this.emit(Events.USER_ACTION, {\n eventType,\n action,\n // pluginName: this.pluginName,\n currentTime: this.currentTime,\n duration: this.duration,\n ended: this.ended,\n event,\n ...params\n })\n }\n\n updateAcc (endType) {\n if (this._accPlayed.t) {\n const _at = new Date().getTime() - this._accPlayed.t\n this._accPlayed.acc += _at\n this._accPlayed.t = 0\n if (endType === 'ended' || this.ended) {\n this._accPlayed.loopAcc = this._accPlayed.acc\n }\n }\n }\n\n /**\n * 目标时间点是否在buffer内\n * @param { number } time 时间点\n * @param options 判断阈值配置,可选的\n * @param options.startDiff 判断起始阈值,即该时间下距离buffer开始点超过阈值时才算作在buffer内,默认为0\n * @param options.endDiff 判断结束阈值,即该时间下距离buffer结束点超过阈值时才算作在buffer内,默认为0\n * @returns { boolean }\n */\n checkBuffer (\n time,\n options = {\n startDiff: 0,\n endDiff: 0\n }) {\n const { startDiff = 0, endDiff = 0 } = options || {}\n const buffered = this.media.buffered\n if (!buffered || buffered.length === 0 || !this.duration) {\n return true\n }\n const currentTime = time || this.media.currentTime || 0.2\n const len = buffered.length\n for (let i = 0; i < len; i++) {\n if (buffered.start(i) + startDiff <= currentTime && buffered.end(i) - endDiff > currentTime) {\n return true\n }\n }\n return false\n }\n\n resizePosition () {\n const { vy, vx, h, w } = this.videoPos\n let rotate = this.videoPos.rotate\n if (rotate < 0 && h < 0 && w < 0) {\n return\n }\n let _pi = this.videoPos._pi\n if (!_pi && this.media.videoHeight) {\n _pi = this.media.videoWidth / this.media.videoHeight * 100\n }\n if (!_pi) {\n return\n }\n this.videoPos.pi = _pi\n rotate = rotate < 0 ? 0 : rotate\n const _pos = {\n rotate\n }\n let offsetY = 0\n let offsetX = 0\n let scale = 1\n const _t = Math.abs(rotate / 90)\n const { root, innerContainer } = this\n const width = root.offsetWidth\n const height = innerContainer ? innerContainer.offsetHeight : root.offsetHeight\n let rHeight = height\n let rWidth = width\n if (_t % 2 === 0) {\n scale = h > 0 ? 100 / h : (w > 0 ? 100 / w : 1)\n _pos.scale = scale\n offsetY = vy > 0 ? (100 - h) / 2 - vy : 0\n _pos.y = _t === 2 ? 0 - offsetY : offsetY\n offsetX = vx > 0 ? (100 - w) / 2 - vx : 0\n _pos.x = _t === 2 ? 0 - offsetX : offsetX\n this.media.style.width = `${rWidth}px`\n this.media.style.height = `${rHeight}px`\n } else if (_t % 2 === 1) {\n rWidth = height\n rHeight = width\n const offset = height - width\n offsetX = -offset / 2 / rWidth * 100\n _pos.x = _t === 3 ? offsetX + vy / 2 : offsetX - vy / 2\n offsetY = offset / 2 / rHeight * 100\n _pos.y = _t === 3 ? offsetY + vx / 2 : offsetY - vx / 2\n _pos.scale = scale\n this.media.style.width = `${rWidth}px`\n this.media.style.height = `${rHeight}px`\n }\n const formStyle = Util.getTransformStyle(_pos, this.media.style.transform || this.media.style.webkitTransform)\n this.media.style.transform = formStyle\n this.media.style.webkitTransform = formStyle\n }\n\n /**\n * @description position video/audio according to height ratio and y coordinate\n * @param { { h: number, y?: number, x?:number, w?:number} } pos\n * @returns\n */\n position (pos = { h: 0, y: 0, x: 0, w: 0 }) {\n if (!this.media || !pos || !pos.h) {\n return\n }\n const { videoPos } = this\n videoPos.h = pos.h * 100 || 0\n videoPos.w = pos.w * 100 || 0\n videoPos.vx = pos.x * 100 || 0\n videoPos.vy = pos.y * 100 || 0\n this.resizePosition()\n }\n\n /**\n * @description Update configuration parameters\n * @param { IPlayerOptions } config\n */\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map((key) => {\n if (key !== 'plugins') {\n this.config[key] = config[key]\n const plugin = this.plugins[key.toLowerCase()]\n if (plugin && Util.typeOf(plugin.setConfig) === 'Function') {\n plugin.setConfig(config[key])\n }\n }\n })\n }\n\n /**\n * @description play another video resource\n * @param { IPlayerOptions } config\n */\n playNext (config) {\n this.resetState()\n this.setConfig(config)\n this._currentTime = 0\n this._duration = 0\n runHooks(this, 'playnext', () => {\n this.start()\n this.emit(Events.PLAYNEXT, config)\n })\n }\n\n resize () {\n if (!this.media) {\n return\n }\n const containerSize = this.root.getBoundingClientRect()\n this.sizeInfo.width = containerSize.width\n this.sizeInfo.height = containerSize.height\n this.sizeInfo.left = containerSize.left\n this.sizeInfo.top = containerSize.top\n const { videoWidth, videoHeight } = this.media\n const { fitVideoSize, videoFillMode } = this.config\n\n if (videoFillMode === 'fill' || videoFillMode === 'cover' || videoFillMode === 'contain') {\n this.setAttribute('data-xgfill', videoFillMode)\n }\n\n if (!videoHeight || !videoWidth) {\n return\n }\n this._videoHeight = videoHeight\n this._videoWidth = videoWidth\n const controlsHeight =\n this.controls && this.innerContainer\n ? this.controls.root.getBoundingClientRect().height\n : 0\n const width = containerSize.width\n const height = containerSize.height - controlsHeight\n const videoFit = parseInt((videoWidth / videoHeight) * 1000, 10)\n const fit = parseInt((width / height) * 1000, 10)\n let rWidth = width\n let rHeight = height\n const _style = {}\n if (\n (fitVideoSize === 'auto' && fit > videoFit) ||\n fitVideoSize === 'fixWidth'\n ) {\n rHeight = (width / videoFit) * 1000\n if (this.config.fluid) {\n _style.paddingTop = `${(rHeight * 100) / rWidth}%`\n } else {\n _style.height = `${rHeight + controlsHeight}px`\n }\n } else if (\n (fitVideoSize === 'auto' && fit < videoFit) ||\n fitVideoSize === 'fixHeight'\n ) {\n rWidth = (videoFit * height) / 1000\n _style.width = `${rWidth}px`\n }\n // 全屏不做行间css设置\n if (!this.fullscreen && !this.cssfullscreen) {\n Object.keys(_style).forEach((key) => {\n this.root.style[key] = _style[key]\n })\n }\n // video填充模式\n if (\n (videoFillMode === 'fillHeight' && fit < videoFit) ||\n (videoFillMode === 'fillWidth' && fit > videoFit)\n ) {\n this.setAttribute('data-xgfill', 'cover')\n }\n const data = {\n videoScale: videoFit,\n vWidth: rWidth,\n vHeight: rHeight,\n cWidth: rWidth,\n cHeight: rHeight + controlsHeight\n }\n this.resizePosition()\n this.emit(Events.VIDEO_RESIZE, data)\n }\n\n /**\n *\n * @param { number } left\n * @param { number } top\n * @returns\n */\n updateObjectPosition (left = 0, top = 0) {\n if (this.media.updateObjectPosition) {\n this.media.updateObjectPosition(left, top)\n return\n }\n this.media.style.objectPosition = `${left * 100}% ${top * 100}%`\n }\n\n /**\n * @protected\n * @param { number } newState\n */\n setState (newState) {\n XG_DEBUG.logInfo(\n 'setState',\n `state from:${STATE_ARRAY[this.state]} to:${STATE_ARRAY[newState]}`\n )\n this._state = newState\n }\n\n /**\n * @description url preprocessing\n * @param { IUrl } url\n * @param { {[propName: string]: any} } [ext]\n * @returns { url: IUrl, [propName: string]: any }\n */\n _preProcessUrl (url, ext) {\n const { preProcessUrl, preProcessUrlOptions } = this.config\n const processUrlOptions = Object.assign({}, preProcessUrlOptions, ext)\n return !Util.isBlob(url) && typeof preProcessUrl === 'function' ? preProcessUrl(url, processUrlOptions) : { url }\n }\n\n\n /**\n * @description 跳转至配置的起播时间点\n */\n _seekToStartTime () {\n if (this.__startTime > 0 && this.duration > 0) {\n this.currentTime = this.__startTime > this.duration ? this.duration : this.__startTime\n this.__startTime = -1\n }\n }\n\n /**\n * @type { number }\n */\n get state () {\n return this._state\n }\n\n /**\n * @type { boolean }\n */\n get isFullscreen () {\n return this.fullscreen\n }\n\n /**\n * @type { boolean }\n */\n get isCssfullScreen () {\n return this.cssfullscreen\n }\n\n /**\n * @type { boolean }\n * @description 是否开始播放\n */\n get hasStart () {\n return this._hasStart\n }\n\n set hasStart (bool) {\n if (typeof bool === 'boolean') {\n this._hasStart = bool\n if (bool === false) {\n this.setState(STATES.READY)\n }\n this.emit('hasstart')\n }\n }\n\n /**\n * @type { boolean }\n * @description 是否已经进入起播状态\n */\n get isPlaying () {\n return this._state === STATES.RUNNING || this._state === STATES.ENDED\n }\n\n set isPlaying (value) {\n if (value) {\n this.setState(STATES.RUNNING)\n } else {\n this._state >= STATES.RUNNING && (this.setState(STATES.ATTACHED))\n }\n }\n\n /**\n * @type { Array. }\n */\n set definitionList (list) {\n const { definition } = this.config\n let curDef = null\n let targetDef = null\n\n definition.list = list\n this.emit('resourceReady', list)\n\n list.forEach((item) => {\n if (this.curDefinition?.definition === item.definition) {\n curDef = item\n }\n if (definition.defaultDefinition === item.definition) {\n targetDef = item\n }\n })\n if (!targetDef && list.length > 0) {\n targetDef = list[0]\n }\n curDef\n ? this.changeDefinition(curDef)\n : targetDef && this.changeDefinition(targetDef)\n }\n\n get definitionList () {\n if (!this.config || !this.config.definition) {\n return []\n }\n return this.config.definition.list || []\n }\n\n /**\n * @description VideoFrames infos\n * @type { {\n * total: number,\n * dropped: number,\n * corrupted: number,\n * droppedRate: number,\n * droppedDuration: number\n * } }\n */\n get videoFrameInfo () {\n const ret = {\n total: 0,\n dropped: 0,\n corrupted: 0,\n droppedRate: 0,\n droppedDuration: 0\n }\n if (!this.media || !this.media.getVideoPlaybackQuality) {\n return ret\n }\n const _quality = this.media.getVideoPlaybackQuality()\n ret.dropped = _quality.droppedVideoFrames || 0\n ret.total = _quality.totalVideoFrames || 0\n ret.corrupted = _quality.corruptedVideoFrames || 0\n if (ret.total > 0) {\n ret.droppedRate = (ret.dropped / ret.total) * 100\n ret.droppedDuration = parseInt(\n (this.cumulateTime / ret.total) * ret.dropped,\n 0\n )\n }\n return ret\n }\n\n /**\n * @type { string }\n */\n set lang (lang) {\n const result = I18N.langKeys.filter((key) => key === lang)\n if (result.length === 0 && lang !== 'zh') {\n console.error(\n `Sorry, set lang fail, because the language [${lang}] is not supported now, list of all supported languages is [${I18N.langKeys.join()}] `\n )\n return\n }\n this.config.lang = lang\n pluginsManager.setLang(lang, this)\n }\n\n get lang () {\n return this.config.lang\n }\n\n get i18n () {\n let _l = this.config.lang\n if (_l === 'zh') {\n _l = 'zh-cn'\n }\n return this.__i18n.lang[_l] || this.__i18n.lang.en\n }\n\n get i18nKeys () {\n return this.__i18n.textKeys || {}\n }\n\n /**\n * @type { string }\n */\n get version () {\n return version\n }\n\n /**\n * @type { number | string }\n */\n get playerId () {\n return this._pluginInfoId\n }\n\n /**\n * @type { any }\n */\n set url (url) {\n /**\n * @private\n */\n this.__url = url\n }\n\n get url () {\n return this.__url || this.config.url\n }\n\n /**\n * @type { string }\n */\n set poster (posterUrl) {\n this.plugins.poster && this.plugins.poster.update(posterUrl)\n }\n\n get poster () {\n return this.plugins.poster\n ? this.plugins.poster.config.poster\n : this.config.poster\n }\n\n get readyState () {\n return super.readyState\n }\n\n get error () {\n const key = super.error\n return this.i18n[key] || key\n }\n\n get networkState () {\n return super.networkState\n }\n\n /**\n * @type { boolean }\n */\n get fullscreenChanging () {\n return !(this._fullScreenOffset === null)\n }\n\n /**\n * 累计观看时长\n * @type { number }\n */\n get cumulateTime () {\n const { acc, t } = this._accPlayed\n return t ? new Date().getTime() - t + acc : acc\n }\n\n /**\n * @type { number }\n */\n get zoom () {\n return this.config.zoom\n }\n\n /**\n * @type { number }\n */\n set zoom (value) {\n this.config.zoom = value\n }\n\n /**\n * @type {number}\n * @description Media element rotation angle, Only multiples of 90 degrees are supported\n */\n set videoRotateDeg (val) {\n val = Util.convertDeg(val)\n if (val % 90 !== 0 || val === this.videoPos.rotate) {\n return\n }\n this.videoPos.rotate = val\n this.resizePosition()\n }\n\n get videoRotateDeg () {\n return this.videoPos.rotate\n }\n\n /**\n * @description 均衡下载速度,单位kb/s, 根据10条最新下载速度计算出来的加权值,如果没有测速能力则默认是0\n * @type { number }\n */\n set avgSpeed (val) {\n AVG_SPEED = val\n }\n\n get avgSpeed () {\n return AVG_SPEED\n }\n\n /**\n * @type { number }\n * 最新一次下载速度,单位kb/s, 如果没有测速能力则默认是0\n */\n set realTimeSpeed (val) {\n REAL_TIME_SPEED = val\n }\n\n get realTimeSpeed () {\n return REAL_TIME_SPEED\n }\n\n get offsetCurrentTime () {\n return this._offsetInfo.currentTime || 0\n }\n\n set offsetCurrentTime (val) {\n this._offsetInfo.currentTime = val\n }\n\n get offsetDuration () {\n return this._offsetInfo.duration || 0\n }\n\n set offsetDuration (val) {\n this._offsetInfo.duration = val || 0\n }\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns {boolean} isSuccess\n */\n useHooks (hookName, handler) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise } handler\n * @returns\n */\n removeHooks (hookName, handler) {\n return removeHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n usePluginHooks (pluginName, hookName, handler, ...args) {\n return usePluginHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n removePluginHooks (pluginName, hookName, handler, ...args) {\n return removePluginHooks.call(this, ...arguments)\n }\n\n /**\n * 设置当前实例的用户激活态\n * @param { boolean } isActive\n * @param { boolean } [isMuted]\n */\n setUserActive (isActive, isMuted) {\n if (typeof isMuted === 'boolean' && isMuted !== this.muted) {\n this.addInnerOP('volumechange')\n if (Util.typeOf(isMuted) === Boolean) {\n /**\n * @type {boolean}\n */\n this.muted = isMuted\n }\n }\n instManager?.setActive(this.playerId, isActive)\n }\n\n /**\n * 当前浏览器是否支持hevc编码\n * @returns {boolean}\n */\n static isHevcSupported () {\n return Sniffer.isHevcSupported()\n }\n\n /**\n * 检测编码参数是否被当前浏览器支持\n * @doc https://developer.mozilla.org/en-US/docs/Web/API/MediaCapabilities/decodingInfo\n * @param {MediaDecodingConfiguration} info\n * @returns {MediaCapabilitiesDecodingInfo}\n */\n static probeConfigSupported (info) {\n return Sniffer.probeConfigSupported(info)\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static install (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n if (!Player.plugins[name]) {\n Player.plugins[name] = descriptor\n }\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static use (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n Player.plugins[name] = descriptor\n }\n\n static defaultPreset = null;\n\n /**\n * @description 自定义media构造函数\n */\n static XgVideoProxy = null;\n}\n\n// use the default instance manager.\nPlayer.instManager = InstManager.getInstance()\n\nexport {\n Player as default,\n Plugin,\n BasePlugin,\n Events,\n Errors,\n Sniffer,\n Util,\n STATE_CLASS,\n I18N\n}\n","import BasePlugin, { Events, Util } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nfunction now () {\n return new Date().getTime()\n}\n\nconst LOG_TYPES = {\n LOAD_START: 'loadstart',\n LOADED_DATA: 'loadeddata',\n FIRST_FRAME: 'firstFrame',\n WAIT_START: 'waitingStart',\n WAIT_END: 'waitingEnd',\n SEEK_START: 'seekStart',\n SEEK_END: 'seekEnd'\n}\nclass XGLogger extends BasePlugin {\n static get pluginName () {\n return 'xgLogger'\n }\n\n static get defaultConfig () {\n return {\n waitTimeout: 10000\n }\n }\n\n afterCreate () {\n this._onReset()\n this._waitType = 'firstFrame'\n\n this._initOnceEvents()\n\n this.newPointTime = now()\n // 初始化到首帧耗时 new -> loadeddata\n this.loadedCostTime = 0\n // 初始化到开始请求耗时 new -> loadstart\n this.startCostTime = 0\n\n this.on(Events.LOAD_START, () => {\n const { _state } = this\n const { autoplayStart, isFFSend } = _state\n this.startCostTime = now() - this.newPointTime\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOAD_START`, `autoplayStart:${autoplayStart} isFFSend:${isFFSend} startCostTime:${this.startCostTime} newPointTime${this.newPointTime}`)\n if (isFFSend) {\n return\n }\n !_state.isLs && this.emitLog(LOG_TYPES.LOAD_START, {})\n _state.isLs = true\n _state.isTimeUpdate = false\n _state.isFFLoading = true\n this.pt = now()\n this.vt = 0\n this.fvt = 0 // 首帧耗时 loadstart -> loadeddata\n this._initOnceEvents()\n this._onWaitingLoadStart()\n })\n\n this.on(Events.LOADED_DATA, () => {\n this.vt = now()\n this.fvt = this.vt - this.pt\n this.loadedCostTime = this.vt - this.newPointTime\n const { isTimeUpdate, isFFSend, autoplayStart } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOADED_DATA`, `fvt:${this.fvt} isTimeUpdate:${this._state.isTimeUpdate} loadedCostTime:${this.loadedCostTime}`)\n if (isTimeUpdate || autoplayStart) {\n this._sendFF('loadedData')\n }\n if (!isFFSend) {\n this.emitLog(LOG_TYPES.LOADED_DATA, {})\n }\n this.suspendWaitingStatus('loadeddata')\n })\n\n this.on(Events.SEEKING, this._onSeeking)\n this.on(Events.SEEKED, this._onSeeked)\n\n this.on(Events.DESTROY, () => {\n this.endState('destroy')\n })\n\n this.on(Events.URL_CHANGE, () => {\n this.endState('urlChange')\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} URL_CHANGE`)\n this._state.isFFSend && this._onReset()\n })\n\n this.on([Events.PLAYING, Events.CANPLAY], this._onPlaying)\n\n this.on(Events.WAITING, this._onWaiting)\n this.on(Events.ERROR, this._onError)\n this.on(Events.RESET, () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} RESET`)\n this.endState('reset')\n this._initOnceEvents()\n this._onReset()\n })\n }\n\n _initOnceEvents () {\n this.off(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.off(Events.TIME_UPDATE, this._onTimeupdate)\n this.once(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.once(Events.TIME_UPDATE, this._onTimeupdate)\n }\n\n _sendFF (endType) {\n this.s = now()\n const { isFFLoading, isFFSend } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _sendFF`, `${endType} fvt:${this.fvt} isFFLoading:${isFFLoading} !isFFSend:${!isFFSend}`)\n if (this.vt > 0 && isFFLoading && !isFFSend) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} emitLog_firstFrame`, endType)\n this._state.isFFLoading = false\n this._state.isFFSend = true\n this.emitLog(LOG_TYPES.FIRST_FRAME, { fvt: this.fvt, costTime: this.fvt, vt: this.vt, startCostTime: this.startCostTime, loadedCostTime: this.loadedCostTime })\n }\n }\n\n _onTimeupdate = () => {\n this._state.isTimeUpdate = true\n if (this._state.autoplayStart) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onTimeupdate`)\n this._sendFF('onTimeupdate')\n }\n }\n\n _onAutoplayStart = () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onAutoplayStart`)\n this._state.autoplayStart = true\n this.vt && this._sendFF('onAutoplayStart')\n }\n\n _onReset = () => {\n this._state = {\n autoplayStart: false, // 是否已经自动起播\n isFFLoading: false, // LOAD_START是否已经触发\n isTimeUpdate: false, // 第一次timeupdate是否已经触发\n isFFSend: false, // 首帧事件是否已经触发\n isLs: false // loadstart是否已经发送\n }\n this.vt = 0\n this.pt = 0\n this.fvt = 0\n this.newPointTime = now()\n this.loadedCostTime = 0\n this.startCostTime = 0\n this._isSeeking = false\n this.seekingStart = 0\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this._isWaiting = false\n this._waitTimer && Util.clearTimeout(this, this._waitTimer)\n this._waittTimer && Util.clearTimeout(this, this._waittTimer)\n this._waitTimer = null\n this._waittTimer = null\n this._waitType = 0 // 0 - 普通卡顿 1-起播卡顿 2-seek卡顿\n }\n\n _onSeeking = () => {\n if (this.seekingStart) {\n return\n }\n this.suspendWaitingStatus('seek')\n this.seekingStart = now()\n this.emitLog(LOG_TYPES.SEEK_START, { start: now() })\n }\n\n _onSeeked = () => {\n this.suspendSeekingStatus('seeked')\n }\n\n _onWaitingLoadStart = () => {\n if (this._isWaiting || this.vt) {\n return\n }\n this._isWaiting = true\n this.waitingStart = now()\n this.fixedWaitingStart = now()\n this._waitType = 1\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, start: this.waitingStart, type: 1, endType: 'loadstart' })\n }\n\n _onWaiting = () => {\n // 普通卡顿起播之前不产生\n if (this._isWaiting || !this.vt) {\n return\n }\n // 卡顿标记开始\n this._isWaiting = true\n if (!this.vt) {\n this._waitType = 1\n } else if (this.seekingStart) {\n this._waitType = 2\n } else {\n this._waitType = 0\n }\n // 原始卡顿耗时起始时间\n this.fixedWaitingStart = now()\n this._waitTimer = Util.setTimeout(this, () => {\n if (this._isWaiting) {\n this.waitingStart = now()\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n this._startWaitTimeout()\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, start: this.waitingStart, type: this._waitType, endType: this._waitType === 2 ? 'seek' : 'playing' })\n }\n }, 200)\n }\n\n _onError = () => {\n this.suspendSeekingStatus('error')\n this.suspendWaitingStatus('error')\n }\n\n _startWaitTimeout () {\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n }\n this._waittTimer = Util.setTimeout(this, () => {\n this.suspendWaitingStatus('timeout')\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }, this.config.waitTimeout)\n }\n\n _onPlaying = () => {\n this._isWaiting && this.suspendWaitingStatus('playing')\n }\n\n endState (endType) {\n this.suspendWaitingStatus(endType)\n this.suspendSeekingStatus(endType)\n }\n\n suspendSeekingStatus (endType) {\n if (!this.seekingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.seekingStart\n this.seekingStart = 0\n this.emitLog(LOG_TYPES.SEEK_END, { end: _now, costTime: _cost, endType })\n }\n\n suspendWaitingStatus (endType) {\n if (this._waitTimer) {\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n }\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }\n this._isWaiting = false\n if (!this.waitingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.waitingStart\n const _fixedCost = _now - this.fixedWaitingStart\n const { waitTimeout } = this.config\n this._isWaiting = false\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this.emitLog(LOG_TYPES.WAIT_END, {\n fixedCostTime: _fixedCost > waitTimeout ? waitTimeout : _fixedCost,\n costTime: _cost > waitTimeout ? waitTimeout : _cost,\n type: endType === 'loadeddata' ? 1 : this._waitType,\n endType: this._waitType === 2 ? 'seek' : endType\n })\n }\n\n emitLog (eventType, data) {\n const { player } = this\n this.emit(Events.XGLOG, {\n t: now(),\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype,\n eventType,\n currentTime: this.player.currentTime,\n readyState: player.video.readyState,\n networkState: player.video.networkState,\n ...data\n })\n }\n}\nexport {\n LOG_TYPES,\n XGLogger as default\n}\n","import Plugin, { Events, Util } from '../../plugin'\nimport ReplaySvg from '../assets/replay.svg'\nimport './index.scss'\n\nclass Replay extends Plugin {\n static get pluginName () {\n return 'replay'\n }\n\n static get defaultConfig () {\n return {\n disable: false\n }\n }\n\n registerIcons () {\n return {\n replay: ReplaySvg\n }\n }\n\n afterCreate () {\n Plugin.insert(this.icons.replay, this.root, 0)\n this.__handleReplay = this.hook('replayClick', () => {\n this.player.replay()\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.bind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n // this.bind('svg', ['click', 'touchend'], this.__handleReplay)\n // this.bind('.xgplayer-replay-txt', ['click', 'touchend'], this.__handleReplay)\n\n this.on(Events.ENDED, () => {\n if (!this.playerConfig.loop) {\n Util.addClass(this.player.root, 'replay')\n }\n if (this.config.disable) {\n return\n }\n this.show()\n const path = this.root.querySelector('path')\n if (path) {\n const transform = window.getComputedStyle(path).getPropertyValue('transform')\n if (typeof transform === 'string' && transform.indexOf('none') > -1) {\n return null\n } else {\n path.setAttribute('transform', transform)\n }\n }\n })\n\n this.on(Events.PLAY, () => {\n this.hide()\n })\n }\n\n handleReplay (e) {\n e.preventDefault()\n e.stopPropagation()\n this.player.replay()\n Util.removeClass(this.player.root, 'replay')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\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, // 设置为true时,播放后才隐藏,在视频地址更新后会重新显示poster。默认为false,即在play事件触发后隐藏poster\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, // 设置为true时,播放后才隐藏,在视频地址更新后会重新显示poster。默认为false,即在play事件触发后隐藏poster\n notHidden: false, // 是否一直显示\n poster: '', // 封面图地址\n fillMode: 'fixWidth' // 封面图填充方式,fixWidth / fixHeight / cover / contain\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 /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\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 setConfig (config) {\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n })\n const { poster } = this.config\n this.update(poster)\n }\n\n onTimeUpdate () {\n if (!this.player.currentTime) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n } else {\n Util.removeClass(this.root, 'xg-showplay')\n }\n }\n\n update (poster) {\n if (!poster) {\n return\n }\n this.config.poster = poster\n this.root.style.backgroundImage = `url(${poster})`\n }\n\n getBgSize (mode) {\n let _bg = ''\n switch (mode) {\n case 'cover':\n _bg = 'cover'\n break\n case 'contain':\n _bg = 'contain'\n break\n case 'fixHeight':\n _bg = 'auto 100%'\n break\n default:\n _bg = ''\n }\n return _bg ? `background-size: ${_bg};` : ''\n }\n\n render () {\n const { poster, hideCanplay, fillMode, notHidden } = this.config\n const _bg = this.getBgSize(fillMode)\n const style = poster ? `background-image:url(${poster});${_bg}` : _bg\n const className = notHidden ? 'xg-not-hidden' : (hideCanplay ? 'xg-showplay' : '')\n return `\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 return AnimateMap[key].id\n}\n\nfunction clearAnimation (id) {\n if (id) {\n window.clearTimeout(id)\n return\n }\n Object.keys(AnimateMap).map(key => {\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n })\n}\n\n\nclass Start extends Plugin {\n static get pluginName () {\n return 'start'\n }\n\n /**\n * @type IStartConfig\n */\n static get defaultConfig () {\n return {\n isShowPause: false, // 暂停是否常驻\n isShowEnd: false, // 播放结束常驻\n disableAnimate: false, // 禁用点击动画\n mode: 'hide' // 控制模式: hide 常驻: show 跟随:auto\n }\n }\n\n constructor (args) {\n super(args)\n this.autoPlayStart = false\n }\n\n afterCreate () {\n const { playerConfig } = this\n\n this.initIcons()\n this.listenEvents()\n this.bindClickEvents()\n\n if (!playerConfig.autoplay) {\n this.show()\n }\n }\n\n /**\n * @public\n * This method can be overridden.\n */\n listenEvents () {\n const { player, playerConfig } = this\n\n this.once(Events.READY, () => {\n if (playerConfig) {\n if (playerConfig.lang && playerConfig.lang === 'en') {\n Util.addClass(player.root, 'lang-is-en')\n } else if (playerConfig.lang === 'jp') {\n Util.addClass(player.root, 'lang-is-jp')\n }\n }\n })\n\n this.on(Events.AUTOPLAY_STARTED, this.onAutoplayStart)\n\n 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.toggleTo('play')\n })\n\n this.on(Events.PAUSE, () => {\n this.toggleTo('pause')\n })\n\n this.on(Events.RESET, () => {\n this.onPlayerReset()\n })\n }\n\n /**\n * @public\n */\n bindClickEvents () {\n this.clickHandler = this.hook('startClick', this.switchPausePlay, {\n pre: (e) => {\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n const { paused } = this.player\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: paused, to: !paused })\n }\n })\n\n this.bind(['click', 'touchend'], this.clickHandler)\n }\n\n onPlayerReset = () => {\n this.autoPlayStart = false\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n }\n\n onAutoplayStart = () => {\n if (this.autoPlayStart) {\n return\n }\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n Util.addClass(this.root, className)\n this.autoPlayStart = true\n this.toggleTo('play')\n }\n\n registerIcons () {\n return {\n startPlay: { icon: PlaySvg, class: 'xg-icon-play' },\n startPause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('xg-start-inner', icons.startPlay)\n this.appendChild('xg-start-inner', icons.startPause)\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n Util.removeClass(this.root, 'hide')\n }\n\n focusHide () {\n Util.addClass(this.root, 'focus-hide')\n }\n\n recover () {\n Util.removeClass(this.root, 'focus-hide')\n }\n\n switchStatus (isAnimate) {\n if (isAnimate) {\n this.setAttr('data-state', !this.player.paused ? 'play' : 'pause')\n } else {\n this.setAttr('data-state', this.player.paused ? 'play' : 'pause')\n }\n }\n\n animate (endShow) {\n this._animateId = addAnimate('pauseplay', 400, {\n start: () => {\n Util.addClass(this.root, 'interact')\n this.show()\n this.switchStatus(true)\n },\n end: () => {\n Util.removeClass(this.root, 'interact')\n !endShow && this.hide()\n this._animateId = null\n }\n })\n }\n\n endAnimate () {\n Util.removeClass(this.root, 'interact')\n clearAnimation(this._animateId)\n this._animateId = null\n }\n\n /**\n * @public\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 /**\n * @deprecated\n */\n onPlayPause (status) {\n this.toggleTo(status)\n }\n\n /**\n * @param {'play'|'pause'} status\n */\n toggleTo (status) {\n const { config, player } = this\n if (!player || player.state < STATES.RUNNING || !this.autoPlayStart) {\n return\n }\n // 一直显示\n if (config.mode === 'show') {\n this.switchStatus()\n this.show()\n return\n }\n\n // 跟随播放器的focus状态显示和隐藏\n if (config.mode === 'auto') {\n this.switchStatus()\n return\n }\n // 暂停/播放结束状态强制显示\n if ((config.isShowPause && player.paused && !player.ended) || (config.isShowEnd && player.ended)) {\n this.switchStatus()\n this.show()\n this.endAnimate()\n return\n }\n\n if (config.disableAnimate) {\n this.switchStatus()\n this.hide()\n return\n }\n\n if (status === 'play') {\n this.autoPlayStart ? this.animate() : this.hide()\n } else {\n if (!this.autoPlayStart || player.ended) {\n return\n }\n this.animate()\n }\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.clickHandler)\n clearAnimation(this._animateId)\n }\n\n render () {\n const className = this.playerConfig.autoplay ? (this.config.mode === 'auto' ? 'auto-hide' : 'hide') : ''\n return `\n \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","export function xgIconTips (plugin, textKey, isShow) {\n try {\n return `
\n ${plugin.i18n[textKey]}\n
`\n } catch (e) {\n return '
'\n }\n}","import Plugin, { POSITIONS } from '../../plugin'\n\nclass MiniScreenIcon extends Plugin {\n static get pluginName () {\n return 'miniscreenIcon'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 10\n }\n }\n\n afterCreate () {\n this.getMini = this.getMini.bind(this)\n this.exitMini = this.exitMini.bind(this)\n this.bind('click', this.getMini)\n }\n\n getMini () {\n this.config.onClick && this.config.onClick()\n }\n\n exitMini () {\n this.config.onClick && this.config.onClick()\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.getMini)\n }\n\n render () {\n const langKey = 'MINISCREEN'\n return `\n \n
${this.i18n[langKey]}
\n
`\n }\n}\n\nexport default MiniScreenIcon\n","import EventEmitter from 'eventemitter3'\n\nfunction getStyleSize (value) {\n const num = parseFloat(value)\n // not a percent like '100%', and a number\n const isValid = value.indexOf('%') === -1 && !Number.isNaN(num)\n return isValid && num\n}\n\nconst measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n]\n\nconst measurementsLength = measurements.length\n\nfunction getZeroSize () {\n const size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n }\n for (let i = 0; i < measurementsLength; i++) {\n const measurement = measurements[i]\n size[measurement] = 0\n }\n return size\n}\n\nfunction getStyle (elem) {\n const style = window.getComputedStyle(elem)\n // if ( !style ) {\n // logError( 'Style returned ' + style +\n // '. Are you running this code in a hidden iframe on Firefox? ' +\n // 'See http://bit.ly/getsizebug1' );\n // }\n return style\n}\n\nfunction getSize (elem) {\n // use querySeletor if elem is string\n if (typeof elem === 'string') {\n elem = document.querySelector(elem)\n }\n\n // do not proceed on non-objects\n if (!elem || typeof elem !== 'object' || !elem.nodeType) {\n return\n }\n\n const style = getStyle(elem)\n\n // if hidden, everything is 0\n if (style.display === 'none') {\n return getZeroSize()\n }\n\n const size = {}\n size.width = elem.offsetWidth\n size.height = elem.offsetHeight\n\n const isBorderBox = size.isBorderBox = style.boxSizing === 'border-box'\n\n // get all measurements\n for (let i = 0; i < measurementsLength; i++) {\n const measurement = measurements[i]\n const value = style[measurement]\n const num = parseFloat(value)\n // any 'auto', 'medium' value will be 0\n size[measurement] = !Number.isNaN(num) ? num : 0\n }\n\n const paddingWidth = size.paddingLeft + size.paddingRight\n const paddingHeight = size.paddingTop + size.paddingBottom\n const marginWidth = size.marginLeft + size.marginRight\n const marginHeight = size.marginTop + size.marginBottom\n const borderWidth = size.borderLeftWidth + size.borderRightWidth\n const borderHeight = size.borderTopWidth + size.borderBottomWidth\n\n const isBorderBoxSizeOuter = isBorderBox// isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n const styleWidth = getStyleSize(style.width)\n if (styleWidth !== false) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n (isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth)\n }\n\n const styleHeight = getStyleSize(style.height)\n if (styleHeight !== false) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n (isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight)\n }\n\n size.innerWidth = size.width - (paddingWidth + borderWidth)\n size.innerHeight = size.height - (paddingHeight + borderHeight)\n\n size.outerWidth = size.width + marginWidth\n size.outerHeight = size.height + marginHeight\n\n return size\n}\n\nfunction getTouch (touches, dentifier) {\n for (let i = 0; i < touches.length; i++) {\n const touch = touches[i]\n if (touch.identifier === dentifier) {\n return touch\n }\n }\n}\n\nconst EVENTS = {\n START: 'dragStart',\n MOVE: 'dragMove',\n ENDED: 'dragEnded'\n}\n\nconst POST_START_EVENTS = {\n mousedown: ['mousemove', 'mouseup'],\n touchstart: ['touchmove', 'touchend', 'touchcancel'],\n pointerdown: ['pointermove', 'pointerup', 'pointercancel']\n}\n\nexport default class Draggabilly extends EventEmitter {\n constructor (root, options = {}) {\n super()\n this.isEnabled = true\n this.isDragging = false\n this.isDown = false\n this.position = {}\n this.downPoint = {}\n this.dragPoint = { x: 0, y: 0 }\n this.startPos = { x: 0, y: 0 }\n // eslint-disable-next-line no-undef\n this._root = root instanceof Element ? root : document.querySelector(root)\n // eslint-disable-next-line no-undef\n this._handlerDom = options.handle instanceof Element ? options.handle : document.querySelector(options.handle)\n if (!this._root || !this._handlerDom) {\n return\n }\n // ['onDown', 'onUp', 'onMove', 'onCancel', 'onDocUp'].map(key => {\n // this[key] = this[key].bind(this)\n // })\n\n // if ('ontouchstart' in window) {\n // this._handlerKeys = TOUCH_HANDLERS\n // this._startKey = 'touchstart'\n // this._endKey = 'touchend'\n // } else {\n // this._handlerKeys = HANDLERS\n // this._startKey = 'mousedown'\n // this._endKey = 'mouseup'\n // }\n // this._handlerDom.addEventListener(this._startKey, this.onDown)\n this._bindStartEvent()\n }\n\n _bindStartEvent () {\n if ('ontouchstart' in window) {\n this._startKey = 'touchstart'\n } else {\n this._startKey = 'mousedown'\n }\n this[`on${this._startKey}`] = this[`on${this._startKey}`].bind(this)\n this._handlerDom.addEventListener(this._startKey, this[`on${this._startKey}`])\n POST_START_EVENTS[this._startKey].map(key => {\n this[`on${key}`] = this[`on${key}`].bind(this)\n })\n }\n\n _unbindStartEvent () {\n this._handlerDom.removeEventListener(this._startKey, this[`on${this._startKey}`])\n }\n\n _bindPostStartEvents (event) {\n if (!event) {\n return\n }\n const events = POST_START_EVENTS[this._startKey]\n // bind events to node\n events.map(eventName => {\n window.addEventListener(eventName, this[`on${eventName}`])\n })\n // save these arguments\n this._boundPointerEvents = events\n }\n\n _unbindPostStartEvents () {\n if (!this._boundPointerEvents) {\n return\n }\n this._boundPointerEvents.map(eventName => {\n // console.log('eventName', eventName, this[`on${eventName}`])\n window.removeEventListener(eventName, this[`on${eventName}`])\n })\n\n delete this._boundPointerEvents\n }\n\n enable () {\n this.isEnabled = true\n }\n\n disable () {\n this.isEnabled = false\n if (this.isDragging) {\n this.onUp()\n }\n }\n\n onDocUp (e) {\n this.onUp()\n }\n\n animate () {\n // only render and animate if dragging\n if (!this.isDragging) {\n return\n }\n\n this.positionDrag()\n\n window.requestAnimationFrame(() => {\n this.animate()\n })\n }\n\n positionDrag () {\n // this._root.style.transform = 'translate3d( ' + this.dragPoint.x +\n // 'px, ' + this.dragPoint.y + 'px, 0)';\n const transform = `translate3d(${this.dragPoint.x}px, ${this.dragPoint.y}px, 0)`\n this._root.style.transform = transform\n this._root.style.webKitTransform = transform\n }\n\n setLeftTop () {\n this._root.style.left = this.position.x + 'px'\n this._root.style.top = this.position.y + 'px'\n }\n\n onmousedown (e) {\n this.dragStart(e, e)\n }\n\n onmousemove (e) {\n this.dragMove(e, e)\n }\n\n onmouseup (e) {\n this.dragEnd(e, e)\n }\n\n ontouchstart (e) {\n const touch = e.changedTouches[0]\n this.dragStart(e, touch)\n this.touchIdentifier = touch.pointerId !== undefined\n ? touch.pointerId\n : touch.identifier\n e.preventDefault()\n }\n\n ontouchmove (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragMove(e, touch)\n }\n }\n\n ontouchend (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragEnd(e, touch)\n }\n e.preventDefault()\n }\n\n ontouchcancel (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragCancel(e, touch)\n }\n }\n\n dragStart (e, pointer) {\n if (!this._root || this.isDown || !this.isEnabled) {\n return\n }\n this.downPoint = pointer\n this.dragPoint.x = 0\n this.dragPoint.y = 0\n\n this._getPosition()\n\n const size = getSize(this._root)\n\n this.startPos.x = this.position.x\n this.startPos.y = this.position.y\n this.startPos.maxY = window.innerHeight - size.height\n this.startPos.maxX = window.innerWidth - size.width\n this.setLeftTop()\n\n this.isDown = true\n this._bindPostStartEvents(e)\n }\n\n dragRealStart (e, pointer) {\n this.isDragging = true\n this.animate()\n this.emit(EVENTS.START, this.startPos)\n }\n\n dragEnd (e, pointer) {\n if (!this._root) {\n return\n }\n this._unbindPostStartEvents()\n if (this.isDragging) {\n this._root.style.transform = ''\n this.setLeftTop()\n this.emit(EVENTS.ENDED)\n }\n this.presetInfo()\n }\n\n _dragPointerMove (e, pointer) {\n const moveVector = {\n x: pointer.pageX - this.downPoint.pageX,\n y: pointer.pageY - this.downPoint.pageY\n }\n // 检测是否有移动\n if (!this.isDragging && this.hasDragStarted(moveVector)) {\n this.dragRealStart(e, pointer)\n }\n return moveVector\n }\n\n dragMove (e, pointer) {\n e = e || window.event\n if (!this.isDown) {\n return\n }\n const { x, y } = this.startPos\n const moveVector = this._dragPointerMove(e, pointer)\n let dragX = moveVector.x\n let dragY = moveVector.y\n dragX = this.checkContain('x', dragX, x)\n dragY = this.checkContain('y', dragY, y)\n this.position.x = x + dragX\n this.position.y = y + dragY\n this.dragPoint.x = dragX\n this.dragPoint.y = dragY\n this.emit(EVENTS.MOVE, this.position)\n }\n\n dragCancel (e, pointer) {\n this.dragEnd(e, pointer)\n }\n\n presetInfo () {\n this.isDragging = false\n this.startPos = {\n x: 0,\n y: 0\n }\n this.dragPoint = {\n x: 0,\n y: 0\n }\n this.isDown = false\n }\n\n destroy () {\n this._unbindStartEvent()\n this._unbindPostStartEvents()\n if (this.isDragging) {\n this.dragEnd()\n }\n this.removeAllListeners()\n this._handlerDom = null\n }\n\n hasDragStarted (moveVector) {\n return Math.abs(moveVector.x) > 3 || Math.abs(moveVector.y) > 3\n }\n\n checkContain (axis, drag, grid) {\n if (drag + grid < 0) {\n return 0 - grid\n }\n\n if (axis === 'x' && drag + grid > this.startPos.maxX) {\n return this.startPos.maxX - grid\n }\n if (axis === 'y' && drag + grid > this.startPos.maxY) {\n return this.startPos.maxY - grid\n }\n return drag\n }\n\n _getPosition () {\n const style = window.getComputedStyle(this._root)\n const x = this._getPositionCoord(style.left, 'width')\n const y = this._getPositionCoord(style.top, 'height')\n // clean up 'auto' or other non-integer values\n this.position.x = Number.isNaN(x) ? 0 : x\n this.position.y = Number.isNaN(y) ? 0 : y\n\n this._addTransformPosition(style)\n }\n\n _addTransformPosition (style) {\n const transform = style.transform\n // bail out if value is 'none'\n if (transform.indexOf('matrix') !== 0) {\n return\n }\n // split matrix(1, 0, 0, 1, x, y)\n const matrixValues = transform.split(',')\n // translate X value is in 12th or 4th position\n const xIndex = transform.indexOf('matrix3d') === 0 ? 12 : 4\n const translateX = parseInt(matrixValues[xIndex], 10)\n // translate Y value is in 13th or 5th position\n const translateY = parseInt(matrixValues[xIndex + 1], 10)\n this.position.x += translateX\n this.position.y += translateY\n }\n\n _getPositionCoord (styleSide, measure) {\n if (styleSide.indexOf('%') !== -1) {\n // convert percent into pixel for Safari, #75\n const parentSize = getSize(this._root.parentNode)\n // prevent not-in-DOM element throwing bug, #131\n return !parentSize\n ? 0\n : (parseFloat(styleSide) / 100) * parentSize[measure]\n }\n return parseInt(styleSide, 10)\n }\n}\n","import Plugin, { Util, Events } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport PlayIcon from '../assets/play.svg'\nimport PauseIcon from '../assets/pause.svg'\nimport MiniScreenIcon from './miniScreenIcon'\nimport Draggabilly from '../../utils/draggabilly'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disable?: boolean,\n * width?: number,\n * height?: number,\n * left?: number, // 默认左下角\n * top?: number, // 默认左下角\n * isShowIcon?: boolean, // 是否显示icon\n * isScrollSwitch?: boolean, // 滚动自动切换自动切换\n * scrollTop?: number, // 触发滚动的高度\n * disableDrag?: boolean, // 禁用拖拽\n * [propName: string]: any\n * }} IMiniScreenConfig\n */\nclass MiniScreen extends Plugin {\n static get pluginName () {\n return 'miniscreen'\n }\n\n /**\n * @type IMiniScreenConfig\n */\n static get defaultConfig () {\n return {\n index: 10,\n disable: false,\n width: 320,\n height: 180,\n left: -1, // Default bottom left corner\n top: -1, // Default bottom left corner\n isShowIcon: false, // Whether to show icon\n isScrollSwitch: false,\n scrollTop: 0, // Height to trigger scroll\n disableDrag: false // Disable drag and drop\n }\n }\n\n constructor (args) {\n super(args)\n this.isMini = false\n this.isClose = false\n const { config } = this\n this.pos = {\n left: config.left < 0 ? window.innerWidth - config.width - 20 : config.left,\n top: config.top < 0 ? window.innerHeight - config.height - 20 : config.top,\n height: this.config.height,\n width: this.config.width,\n scrollY: window.scrollY || 0\n }\n this.lastStyle = null\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.mini === 'boolean') {\n args.config.isShowIcon = args.player.config.mini\n }\n }\n\n afterCreate () {\n this.initIcons()\n this.on(Events.PAUSE, () => {\n this.setAttr('data-state', 'pause')\n })\n this.on(Events.PLAY, () => {\n this.setAttr('data-state', 'play')\n })\n }\n\n onPluginsReady () {\n const { player, config } = this\n if (config.disable) {\n return\n }\n if (this.config.isShowIcon) {\n const options = {\n config: {\n onClick: () => {\n this.getMini()\n }\n }\n }\n player.controls.registerPlugin(MiniScreenIcon, options, MiniScreenIcon.pluginName)\n }\n const eventName = Util.checkTouchSupport() ? 'touchend' : 'click'\n this.bind('.mini-cancel-btn', eventName, this.onCancelClick)\n this.bind('.play-icon', eventName, this.onCenterClick)\n if (!this.config.disableDrag) {\n this._draggabilly = new Draggabilly(this.player.root, {\n handle: this.root\n })\n }\n if (this.config.isScrollSwitch) {\n window.addEventListener('scroll', this.onScroll)\n }\n }\n\n registerIcons () {\n return {\n play: { icon: PlayIcon, class: 'xg-icon-play' },\n pause: { icon: PauseIcon, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.play-icon', icons.play)\n this.appendChild('.play-icon', icons.pause)\n }\n\n onCancelClick = (e) => {\n // e.preventDefault()\n // e.stopPropagation()\n this.exitMini()\n this.isClose = true\n }\n\n onCenterClick = (e) => {\n const { player } = this\n player.paused ? player.play() : player.pause()\n }\n\n onScroll = (e) => {\n if ((!window.scrollY && window.scrollY !== 0) || Math.abs(window.scrollY - this.pos.scrollY) < 50) {\n return\n }\n let scrollHeight = parseInt(Util.getCss(this.player.root, 'height'))\n scrollHeight += this.config.scrollTop\n this.pos.scrollY = window.scrollY\n if (window.scrollY > scrollHeight + 5) {\n !this.isMini && !this.isClose && this.getMini()\n } else if (window.scrollY <= scrollHeight) {\n this.isMini && this.exitMini()\n this.isClose = false\n }\n }\n\n getMini () {\n if (this.isMini) {\n return\n }\n const { player, playerConfig } = this\n const target = this.config.target || this.player.root\n this.lastStyle = {}\n Util.addClass(player.root, 'xgplayer-mini');\n ['width', 'height', 'top', 'left'].map(key => {\n this.lastStyle[key] = target.style[key]\n target.style[key] = `${this.pos[key]}px`\n })\n if (playerConfig.fluid) {\n target.style['padding-top'] = ''\n }\n this.emit(Events.MINI_STATE_CHANGE, true)\n player.isMini = this.isMini = true\n }\n\n exitMini () {\n if (!this.isMini) {\n return false\n }\n const { player, playerConfig } = this\n const target = this.config.target || this.player.root\n Util.removeClass(player.root, 'xgplayer-mini')\n if (this.lastStyle) {\n Object.keys(this.lastStyle).map(key => {\n target.style[key] = this.lastStyle[key]\n })\n }\n this.lastStyle = null\n if (playerConfig.fluid) {\n player.root.style.width = '100%'\n player.root.style.height = '0'\n player.root.style['padding-top'] = `${playerConfig.height * 100 / playerConfig.width}%`\n }\n this.emit(Events.MINI_STATE_CHANGE, false)\n this.isMini = player.isMini = false\n }\n\n destroy () {\n window.removeEventListener('scroll', this.onScroll)\n const eventName = Util.checkTouchSupport() ? 'touchend' : 'click'\n this.unbind('.mini-cancel-btn', eventName, this.onCancelClick)\n this.unbind('.play-icon', eventName, this.onCenterClick)\n this._draggabilly && this._draggabilly.destroy()\n this._draggabilly = null\n this.exitMini()\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n \n \n ${xgIconTips(this, 'MINI_DRAG', this.playerConfig.isHideTips)}\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 { LEAVE_PLAYER, ENTER_PLAYER } from '../../events'\nimport './index.scss'\n\nconst MOUSE_EVENTS = {\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousemove: 'onMouseMove'\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nexport default class PCPlugin extends BasePlugin {\n static get pluginName () {\n return 'pc'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n afterCreate () {\n this._clickCount = 0\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { isMobileSimulateMode } = this.playerConfig\n if (isMobileSimulateMode === 'mobile' || (Sniffer.device === 'mobile' && !Sniffer.os.isIpad)) {\n return\n }\n this.initEvents()\n }\n\n initEvents () {\n const { media, root } = this.player\n const { enableContextmenu } = this.playerConfig\n\n root && root.addEventListener('click', this.onVideoClick, false)\n root && root.addEventListener('dblclick', this.onVideoDblClick, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.addEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n !enableContextmenu && media && media.addEventListener('contextmenu', this.onContextmenu, false)\n }\n\n switchPlayPause (e) {\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: player.paused, to: !player.paused })\n if (!player.ended) {\n player.paused ? player.play() : player.pause()\n } else {\n player.duration !== Infinity && player.duration > 0 && player.replay()\n }\n }\n\n onMouseMove = (e) => {\n const { player, playerConfig } = this\n if (!player.isActive) {\n player.focus({ autoHide: !playerConfig.closeDelayBlur })\n !playerConfig.closeFocusVideoFocus && player.media.focus()\n }\n }\n\n onMouseEnter = (e) => {\n const { playerConfig, player } = this\n !playerConfig.closeFocusVideoFocus && player.media.focus()\n if (playerConfig.closeDelayBlur) {\n player.focus({ autoHide: false })\n } else {\n player.focus()\n }\n this.emit(ENTER_PLAYER)\n }\n\n onMouseLeave = (e) => {\n const { closePlayerBlur, leavePlayerTime, closeDelayBlur } = this.playerConfig\n if (!closePlayerBlur && !closeDelayBlur) {\n if (leavePlayerTime) {\n this.player.focus({ autoHide: true, delay: leavePlayerTime })\n } else {\n this.player.blur({ignorePaused: true})\n }\n }\n this.emit(LEAVE_PLAYER)\n }\n\n onContextmenu (e) {\n e = e || window.event\n if (e.preventDefault) {\n e.preventDefault()\n }\n if (e.stopPropagation) {\n e.stopPropagation()\n } else {\n e.returnValue = false // 解决IE8右键弹出\n e.cancelBubble = true\n }\n }\n\n onVideoClick = (e) => {\n const { player, playerConfig } = this\n if (e.target && playerConfig.closeVideoClick) {\n return\n }\n if (e.target === player.root || e.target === player.media || e.target === player.innerContainer || e.target === player.media.__canvas) {\n e.preventDefault()\n if (!playerConfig.closeVideoStopPropagation) {\n e.stopPropagation()\n }\n this._clickCount++\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n this.clickTimer = setTimeout(() => {\n if (!this._clickCount) {\n return\n }\n this._clickCount--\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.switchPlayPause(data.e)\n }, { e, paused: player.paused })\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }, 300)\n }\n }\n\n onVideoDblClick = (e) => {\n const { player, playerConfig } = this\n if (playerConfig.closeVideoDblclick || !e.target || (e.target !== player.media && e.target !== player.media.__canvas)) {\n return\n }\n if (!playerConfig.closeVideoClick && this._clickCount < 2) {\n this._clickCount = 0\n return\n }\n this._clickCount = 0\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n e.preventDefault()\n e.stopPropagation()\n\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.emitUserAction(data.e, 'switch_fullscreen', { props: 'fullscreen', from: player.fullscreen, to: !player.fullscreen })\n player.fullscreen ? player.exitFullscreen() : player.getFullscreen()\n }, { e, fullscreen: player.fullscreen })\n }\n\n destroy () {\n const { video, root } = this.player\n this.clickTimer && clearTimeout(this.clickTimer)\n root.removeEventListener('click', this.onVideoClick, false)\n root.removeEventListener('dblclick', this.onVideoDblClick, false)\n video.removeEventListener('contextmenu', this.onContextmenu, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.removeEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n }\n}\n","\nconst EVENTS = {\n PRESS: 'press',\n PRESS_END: 'pressend',\n DOUBlE_CLICK: 'doubleclick',\n CLICK: 'click',\n TOUCH_MOVE: 'touchmove',\n TOUCH_START: 'touchstart',\n TOUCH_END: 'touchend'\n}\n\nconst TOUCHS = {\n start: 'touchstart',\n end: 'touchend',\n move: 'touchmove',\n cancel: 'touchcancel'\n}\n\nconst MOUSES = {\n start: 'mousedown',\n end: 'mouseup',\n move: 'mousemove',\n cancel: 'mouseleave'\n}\n\nfunction getTouch (touches) {\n if (touches && touches.length > 0) {\n return touches[touches.length - 1]\n } else {\n return null\n }\n}\n\nfunction getDefaultConfig () {\n return {\n pressDelay: 600,\n dbClickDelay: 200,\n disablePress: false,\n disableDbClick: false,\n miniStep: 2,\n needPreventDefault: true\n }\n}\n\nclass Touche {\n constructor (dom, config = { eventType: 'touch' }) {\n this._pos = {\n moving: false,\n start: false,\n x: 0,\n y: 0\n }\n this.config = getDefaultConfig()\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n this.root = dom\n this.events = config.eventType === 'mouse' ? MOUSES : TOUCHS\n /**\n * @type { null | number}\n */\n this.pressIntrvalId = null\n /**\n * @type { null | number}\n */\n this.dbIntrvalId = null\n this.__handlers = {}\n this._initEvent()\n }\n\n _initEvent () {\n this.root.addEventListener(this.events.start, this.onTouchStart)\n }\n\n __setPress (e) {\n const { config } = this\n if (this.pressIntrvalId) {\n this.__clearPress()\n }\n this.pressIntrvalId = setTimeout(() => {\n this.trigger(EVENTS.PRESS, e)\n this._pos.press = true\n this.__clearPress()\n }, config.pressDelay)\n }\n\n __clearPress () {\n window.clearTimeout(this.pressIntrvalId)\n this.pressIntrvalId = null\n }\n\n __setDb (e) {\n const { config } = this\n if (this.dbIntrvalId) {\n this.__clearDb()\n this.trigger(EVENTS.DOUBlE_CLICK, e)\n return\n }\n this.dbIntrvalId = setTimeout(() => {\n this.__clearDb()\n if (!this._pos.start && !this._pos.press && !this._pos.moving) {\n this.trigger(EVENTS.CLICK, e)\n }\n }, config.dbClickDelay)\n }\n\n __clearDb () {\n clearTimeout(this.dbIntrvalId)\n this.dbIntrvalId = null\n }\n\n on (event, handler) {\n if (!this.__handlers[event]) {\n this.__handlers[event] = []\n }\n this.__handlers[event].push(handler)\n }\n\n off (event, handler) {\n if (!this.__handlers[event]) {\n return\n }\n const handlers = this.__handlers[event]\n let index = -1\n for (let i = 0; i < handlers.length; i++) {\n if (handlers[i] === handler) {\n index = i\n break\n }\n }\n if (index >= 0) {\n this.__handlers[event].splice(index, 1)\n }\n }\n\n trigger (event, e) {\n if (!this.__handlers[event]) {\n return\n }\n this.__handlers[event].map(handler => {\n try {\n handler(e)\n } catch (error) {\n console.error(`trigger>>:${event}`, error)\n }\n })\n }\n\n onTouchStart = (e) => {\n const { _pos, root } = this\n // config.needPreventDefault && preventToucheDefault(e)\n const touch = getTouch(e.touches)\n _pos.x = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.y = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.start = true\n this.__setPress(e)\n root.addEventListener(this.events.end, this.onTouchEnd)\n root.addEventListener(this.events.cancel, this.onTouchCancel)\n root.addEventListener(this.events.move, this.onTouchMove)\n this.trigger(EVENTS.TOUCH_START, e)\n }\n\n onTouchCancel = (e) => {\n this.onTouchEnd(e)\n }\n\n onTouchEnd = (e) => {\n const { _pos, root } = this\n this.__clearPress()\n root.removeEventListener(this.events.cancel, this.onTouchCancel)\n root.removeEventListener(this.events.end, this.onTouchEnd)\n root.removeEventListener(this.events.move, this.onTouchMove)\n e.moving = _pos.moving\n e.press = _pos.press\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n this.trigger(EVENTS.TOUCH_END, e)\n !_pos.press && !_pos.moving && this.__setDb(e)\n _pos.press = false\n _pos.start = false\n _pos.moving = false\n }\n\n onTouchMove = (e) => {\n const { _pos, config } = this\n const touch = getTouch(e.touches)\n const x = touch ? parseInt(touch.pageX, 10) : e.pageX\n const y = touch ? parseInt(touch.pageY, 10) : e.pageX\n const diffx = x - _pos.x\n const diffy = y - _pos.y\n if (Math.abs(diffy) < config.miniStep && Math.abs(diffx) < config.miniStep) {\n return\n }\n this.__clearPress()\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n _pos.press = false\n _pos.moving = true\n this.trigger(EVENTS.TOUCH_MOVE, e)\n }\n\n destroy () {\n const map = {\n touchend: 'onTouchEnd',\n touchmove: 'onTouchMove',\n touchstart: 'onTouchStart'\n }\n Object.keys(map).forEach(key => {\n this.root.removeEventListener(key, this[map[key]])\n })\n }\n}\n\nexport default Touche\n\n","import Plugin, { Events, Util, Sniffer, STATES } from '../../plugin'\nimport Touche from './touch'\nimport SeekTipIcon from '../assets/seekicon.svg'\nimport { runHooks } from '../../plugin/hooksDescriptor'\n// import BackSvg from './back.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disableGesture?: boolean,\n * gestureX?: boolean,\n * gestureY?: boolean,\n * gradient?: 'normal' | 'none' | 'top' | 'bottom',\n * isTouchingSeek?: boolean,\n * miniMoveStep?: number,\n * miniYPer?: number,\n * scopeL?: number,\n * scopeR?: number,\n * pressRate?: number,\n * darkness?: boolean,\n * maxDarkness?: number,\n * disableActive?: boolean,\n * disableTimeProgress?: boolean,\n * hideControlsActive?: boolean,\n * hideControlsEnd?: boolean,\n * moveDuration?: number,\n * closedbClick?: boolean,\n * disablePress?: boolean,\n * disableSeekIcon?: boolean,\n * focusVideoClick?: boolean,\n * [propName: string]: any\n * }} IMobileConfig\n */\n\nconst ACTIONS = {\n AUTO: 'auto',\n SEEKING: 'seeking',\n PLAYBACK: 'playbackrate',\n LIGHT: ''\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nclass MobilePlugin extends Plugin {\n static get pluginName () {\n return 'mobile'\n }\n\n /**\n * @type IMobileConfig & { [propName: string]: any}\n */\n static get defaultConfig () {\n return {\n index: 0,\n disableGesture: false, // Whether to disable gestures\n gestureX: true, // Whether to enable horizontal gestures\n gestureY: true, // Whether to enable vertical gestures\n gradient: 'normal', // Gradient shadow, 'none'/'top'/'bottom'\n isTouchingSeek: false, // Whether to update currentTime at the same time as touchMove\n miniMoveStep: 5, // Minimum moving distance, used for move throttling\n miniYPer: 5, // Percentage of minimum displacement in y direction\n scopeL: 0.25, // Gesture range on the left\n scopeR: 0.25, // Gesture range on the right\n scopeM: 0.9, // Middle gesture range\n pressRate: 2, // playbackRate when long press\n darkness: true, // Whether to enable the dimming function on the left\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 registerIcons () {\n return {\n seekTipIcon: { icon: SeekTipIcon, class: 'xg-seek-pre' }\n }\n }\n\n afterCreate () {\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { playerConfig, config, player } = this\n if (playerConfig.closeVideoDblclick === true) {\n config.closedbClick = true\n }\n this.resetPos()\n if (!Util.isUndefined(playerConfig.disableGesture)) {\n config.disableGesture = !!playerConfig.disableGesture\n }\n this.appendChild('.xg-seek-icon', this.icons.seekTipIcon)\n\n this.xgMask = Util.createDom('xg-mask', '', {}, 'xgmask')\n player.root.appendChild(this.xgMask)\n\n this.initCustomStyle()\n\n this.registerThumbnail()\n\n const eventType = this.domEventType === 'mouse' ? 'mouse' : 'touch'\n this.touch = new Touche(this.root, { eventType, needPreventDefault: !this.config.disableGesture })\n\n this.root.addEventListener('contextmenu', e => {\n e.preventDefault()\n })\n\n /**\n * 对根节点做touchmove和touchend绑定,解决控制栏手势无作用的问题\n */\n player.root.addEventListener('touchmove', this.onRootTouchMove, true)\n player.root.addEventListener('touchend', this.onRootTouchEnd, true)\n player.root.addEventListener('touchcancel', this.onRootTouchEnd, true)\n const { controls } = this.player\n if (controls && controls.center) {\n controls.center.addEventListener('touchmove', this.onRootTouchMove, true)\n controls.center.addEventListener('touchend', this.onRootTouchEnd, true)\n controls.center.addEventListener('touchcancel', this.onRootTouchEnd, true)\n }\n this.on(Events.DURATION_CHANGE, () => {\n const { player, config } = this\n if (player.duration > 0 && 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 ['dragend', 'click'].forEach(key => {\n progressPlugin.addCallBack(key, () => {\n this.changeAction(ACTIONS.AUTO)\n })\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, timePreviewStyle, curTimeColor, durationColor } = commonStyle\n if (playedColor) {\n this.find('.xg-curbar').style.backgroundColor = playedColor\n }\n if (progressColor) {\n this.find('.xg-bar').style.backgroundColor = progressColor\n }\n if (timePreviewStyle) {\n const previewDom = this.find('.time-preview')\n Object.keys(timePreviewStyle).forEach(key => {\n previewDom.style[key] = timePreviewStyle[key]\n })\n }\n const curColor = curTimeColor || playedColor\n const durColor = durationColor\n curColor && (this.find('.xg-cur').style.color = curColor)\n durColor && (this.find('.xg-dur').style.color = durColor)\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\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 this.timer && clearTimeout(this.timer)\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 setTimeout(() => {\n player.getPlugin('progress') && player.getPlugin('progress').resetSeekState()\n }, 10)\n if (!pos.isStart) {\n return\n }\n if (pos.scope > -1) {\n e.cancelable && e.preventDefault()\n }\n\n const { disableGesture, gestureX } = this.config\n if (!disableGesture && gestureX) {\n this.endLastMove(pos.scope)\n } else {\n pos.time = 0\n }\n pos.scope = -1\n this.resetPos()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n this.changeAction(ACTIONS.AUTO)\n }\n\n checkIsRootTarget (e) {\n const plugins = this.player.plugins || {}\n if (plugins.progress && plugins.progress.root.contains(e.target)) {\n return false\n }\n return (plugins.start && plugins.start.root.contains(e.target)) || (plugins.controls && plugins.controls.root.contains(e.target))\n }\n\n onRootTouchMove = (e) => {\n if (this.config.disableGesture || !this.config.gestureX) {\n return\n }\n if (this.checkIsRootTarget(e)) {\n e.stopPropagation()\n if (!this.pos.isStart) {\n this.onTouchStart(e)\n } else {\n this.onTouchMove(e)\n }\n }\n }\n\n onRootTouchEnd = (e) => {\n if (this.pos.scope > -1) {\n this.onTouchEnd(e)\n // const { controls } = this.player\n // controls && controls.recoverAutoHide()\n }\n }\n\n sendUseAction (event) {\n const { paused } = this.player\n this.emitUserAction(event, 'switch_play_pause', {\n prop: 'paused',\n from: paused,\n to: !paused\n })\n }\n\n clickHandler (e) {\n const { player, config, playerConfig } = this\n if (player.state < STATES.RUNNING) {\n if (!playerConfig.closeVideoClick) {\n this.sendUseAction(Util.createEvent('click'))\n player.play()\n }\n return\n }\n\n if (!config.closedbClick || playerConfig.closeVideoClick) {\n player.isActive ? player.blur() : player.focus()\n } else if (!playerConfig.closeVideoClick) {\n if (player.isActive || config.focusVideoClick) {\n this.sendUseAction(Util.createEvent('click'))\n this.switchPlayPause()\n }\n player.focus()\n }\n }\n\n dbClickHandler (e) {\n const { config, player } = this\n if (!config.closedbClick && player.state >= STATES.RUNNING) {\n this.sendUseAction(Util.createEvent('dblclick'))\n this.switchPlayPause()\n }\n }\n\n onClick (e) {\n const { player } = this\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.clickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onDbClick (e) {\n const { player } = this\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.dbClickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onPress (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n pos.rate = this.player.playbackRate\n this.emitUserAction('press', 'change_rate', {\n prop: 'playbackRate',\n from: player.playbackRate,\n to: config.pressRate\n })\n player.playbackRate = config.pressRate\n this.changeAction(ACTIONS.PLAYBACK)\n }\n\n onPressEnd (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n this.emitUserAction('pressend', 'change_rate', { prop: 'playbackRate', from: player.playbackRate, to: pos.rate })\n player.playbackRate = pos.rate\n pos.rate = 1\n this.changeAction(ACTIONS.AUTO)\n }\n\n updateTime (percent) {\n const { player, config } = this\n const { duration } = this.player\n percent = Number(percent.toFixed(4))\n let time = parseInt(percent * config.moveDuration, 10) + this.timeOffset\n time += this.pos.time\n time = time < 0 ? 0 : (time > duration * 1000 ? duration * 1000 - 200 : time)\n player.getPlugin('time') && player.getPlugin('time').updateTime(time / 1000)\n player.getPlugin('progress') && player.getPlugin('progress').updatePercent(time / 1000 / this.duration, true)\n this.activeSeekNote(time / 1000, percent > 0)\n // 在滑动的同时实时seek\n if (config.isTouchingSeek) {\n // player.currentTime = time / 1000\n player.seek(Number((time - this.timeOffset) / 1000).toFixed(1))\n }\n this.pos.time = time\n }\n\n updateVolume (percent) {\n if (this.player.rotateDeg) {\n percent = -percent\n }\n const { player, pos } = this\n percent = parseInt(percent * 100, 10)\n pos.volume += percent\n if (Math.abs(pos.volume) < 10) {\n return\n }\n let volume = parseInt(player.volume * 10, 10) - parseInt(pos.volume / 10, 10)\n volume = volume > 10 ? 10 : (volume < 1 ? 0 : volume)\n player.volume = volume / 10\n pos.volume = 0\n }\n\n updateBrightness (percent) {\n const { pos, config, xgMask } = this\n if (!config.darkness) {\n return\n }\n if (this.player.rotateDeg) {\n percent = -percent\n }\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 = true\n }\n\n // 动态启用手势\n enableGesture () {\n this.config.disableGesture = false\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 player.root.removeEventListener('touchcancel', this.onRootTouchEnd, true)\n const { controls } = this.player\n if (controls && controls.center) {\n controls.center.removeEventListener('touchmove', this.onRootTouchMove, true)\n controls.center.removeEventListener('touchend', this.onRootTouchEnd, true)\n controls.center.removeEventListener('touchcancel', this.onRootTouchEnd, true)\n }\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, Util } from '../../plugin'\n\n/**\n * @typedef {{\n * seekStep?: number,\n * checkVisible?: boolean,\n * disableBodyTrigger?: boolean,\n * keyCodeMap?: { [propName: string]: any },\n * disable: boolean,\n * playbackRate: number,\n * isIgnoreUserActive: boolean,\n * [propName: string]: any\n * }} IKeyboardConfig\n */\n\nfunction preventDefault (e) {\n e.preventDefault()\n e.returnValue = false\n}\n\nfunction isDisableTag (el) {\n const tagName = el.tagName\n\n if (tagName === 'INPUT' || tagName === 'TEXTAREA' || el.isContentEditable) {\n return true\n }\n\n return false\n}\n\nclass Keyboard extends BasePlugin {\n static get pluginName () {\n return 'keyboard'\n }\n\n /**\n * @type IKeyboardConfig\n */\n static get defaultConfig () {\n return {\n seekStep: 10, // Left/right fast forward each operation time\n checkVisible: false, // Whether to check the visibility when the shortcut key takes effect\n disableBodyTrigger: false, // Whether to monitor the shortcut keys on the body\n disableRootTrigger: false, // 是否在player.root上做快捷键监听\n isGlobalTrigger: true, // Whether the shortcut key needs to be triggered globally\n keyCodeMap: {},\n disable: false,\n playbackRate: 2, // 长按倍速限制\n isIgnoreUserActive: true // 是否忽略用户激活状态\n }\n }\n\n mergekeyCodeMap () {\n const extendkeyCodeMap = this.config.keyCodeMap\n if (extendkeyCodeMap) {\n Object.keys(extendkeyCodeMap).map(key => {\n if (!this.keyCodeMap[key]) {\n this.keyCodeMap[key] = extendkeyCodeMap[key]\n } else {\n ['keyCode', 'action', 'disable', 'pressAction', 'disablePress', 'isBodyTarget'].map(key1 => {\n extendkeyCodeMap[key][key1] && (this.keyCodeMap[key][key1] = extendkeyCodeMap[key][key1])\n })\n }\n })\n }\n }\n\n afterCreate () {\n this.config.disable = !this.playerConfig.keyShortcut\n const seekStep = typeof this.config.seekStep === 'function' ? this.config.seekStep(this.player) : this.config.seekStep\n if (!(!seekStep || typeof seekStep !== 'number')) {\n this.seekStep = seekStep\n }\n this.keyCodeMap = {\n space: {\n keyCode: 32,\n action: 'playPause',\n disable: false,\n disablePress: false,\n noBodyTarget: false\n },\n up: {\n keyCode: 38,\n action: 'upVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n down: {\n keyCode: 40,\n action: 'downVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n left: {\n keyCode: 37,\n action: 'seekBack',\n disablePress: false,\n disable: false\n },\n right: {\n keyCode: 39,\n action: 'seek',\n pressAction: 'changePlaybackRate',\n disablePress: false,\n disable: false\n },\n esc: {\n keyCode: 27,\n action: 'exitFullscreen',\n disablePress: true,\n disable: false\n }\n }\n this.mergekeyCodeMap()\n this._keyState = {\n isKeyDown: false,\n isBodyKeyDown: false,\n isPress: false,\n tt: 0,\n playbackRate: 0\n }\n this.player.root.addEventListener('keydown', this.onKeydown)\n document.addEventListener('keydown', this.onBodyKeyDown)\n }\n\n setConfig (newConfig) {\n Object.keys(newConfig).forEach(key => {\n this.config[key] = newConfig[key]\n })\n }\n\n checkIsVisible () {\n if (!this.config.checkVisible) {\n return true\n }\n const rec = this.player.root.getBoundingClientRect()\n const { height, top, bottom } = rec\n const h = window.innerHeight\n if ((top < 0 && top < 0 - height * 0.9) || (bottom > 0 && bottom - h > height * 0.9)) {\n return false\n }\n return true\n }\n\n checkCode (code, isBodyTarget) {\n let flag = false\n Object.keys(this.keyCodeMap).map(key => {\n if (this.keyCodeMap[key] && code === this.keyCodeMap[key].keyCode && !this.keyCodeMap[key].disable) {\n flag = !isBodyTarget || (isBodyTarget && !this.keyCodeMap[key].noBodyTarget)\n }\n })\n return flag\n }\n\n downVolume (event) {\n const { player } = this\n if (player.volume <= 0) {\n return\n }\n const val = parseFloat((player.volume - 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val >= 0) {\n player.volume = val\n } else {\n player.volume = 0\n }\n }\n\n upVolume (event) {\n const { player } = this\n if (player.volume >= 1) {\n return\n }\n const val = parseFloat((player.volume + 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val <= 1) {\n player.volume = val\n } else {\n player.volume = 1\n }\n }\n\n seek (event) {\n const { currentTime, offsetCurrentTime, duration, offsetDuration, timeSegments } = this.player\n let _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n const _duration = offsetDuration || duration\n const _step = event.repeat && this.seekStep >= 4 ? parseInt(this.seekStep / 2, 10) : this.seekStep\n if (_time + _step <= _duration) {\n _time = _time + _step\n } else {\n _time = _duration\n }\n const _seekTime = Util.getCurrentTimeByOffset(_time, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n seekBack (event) {\n const { currentTime, offsetCurrentTime, timeSegments } = this.player\n const _step = event.repeat ? parseInt(this.seekStep / 2, 10) : this.seekStep\n const _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n let _seekTime = _time - _step\n if (_seekTime < 0) {\n _seekTime = 0\n }\n _seekTime = Util.getCurrentTimeByOffset(_seekTime, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n changePlaybackRate (event) {\n const { _keyState, config, player } = this\n if (_keyState.playbackRate === 0) {\n _keyState.playbackRate = player.playbackRate\n player.playbackRate = config.playbackRate\n }\n }\n\n playPause (event) {\n const { player } = this\n if (!player) {\n return\n }\n this.emitUserAction(event, 'switch_play_pause')\n if (player.paused) {\n // eslint-disable-next-line handle-callback-err\n player.play()\n } else {\n player.pause()\n }\n }\n\n exitFullscreen (event) {\n const { player } = this\n const { fullscreen, cssfullscreen } = player\n if (fullscreen) {\n this.emitUserAction('keyup', 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n player.exitFullscreen()\n }\n if (cssfullscreen) {\n this.emitUserAction('keyup', 'switch_css_fullscreen', {\n prop: 'cssfullscreen',\n from: cssfullscreen,\n to: !cssfullscreen\n })\n player.exitCssFullscreen()\n }\n }\n\n onBodyKeyDown = (event) => {\n if (!this.player) {\n return\n }\n const e = event || window.event\n const keyCode = e.keyCode\n const { _keyState, player } = this\n const { disable, disableBodyTrigger, isIgnoreUserActive } = this.config\n // 以下条件不响应\n if (disable || disableBodyTrigger || !(player.isUserActive || isIgnoreUserActive) || isDisableTag(e.target) || !this.checkIsVisible() || e.metaKey || e.altKey || e.ctrlKey) {\n _keyState.isBodyKeyDown = false\n return\n }\n // 首次进入进行是否生效校验\n if (!event.repeat && !_keyState.isKeyDown) {\n if ((e.target === document.body || (this.config.isGlobalTrigger && !isDisableTag(e.target))) && this.checkCode(keyCode, true)) {\n _keyState.isBodyKeyDown = true\n }\n document.addEventListener('keyup', this.onBodyKeyUp)\n }\n _keyState.isBodyKeyDown && this.handleKeyDown(e)\n }\n\n onBodyKeyUp = (event) => {\n if (!this.player) {\n return\n }\n document.removeEventListener('keyup', this.onBodyKeyUp)\n this.handleKeyUp(event)\n }\n\n onKeydown = (event) => {\n if (!this.player) {\n return\n }\n const e = event || window.event\n const { _keyState } = this\n // 首次按下检查是否满足触发他条件\n if (!e.repeat) {\n if (this.config.disable || this.config.disableRootTrigger || e.metaKey || e.altKey || e.ctrlKey) {\n return\n }\n if (e && (e.keyCode === 37 || this.checkCode(e.keyCode)) && (e.target === this.player.root || e.target === this.player.video || e.target === this.player.controls.el)) {\n _keyState.isKeyDown = true\n }\n this.player.root.addEventListener('keyup', this.onKeyup)\n }\n // 长按不满足触发条件直接返回\n if (!_keyState.isKeyDown) {\n return\n }\n this.handleKeyDown(e)\n }\n\n onKeyup = (event) => {\n if (!this.player) {\n return\n }\n this.player.root.removeEventListener('keyup', this.onKeyup)\n this.handleKeyUp(event)\n }\n\n handleKeyDown (e) {\n const { _keyState } = this\n if (e.repeat) {\n _keyState.isPress = true\n const _t = Date.now()\n if (_t - _keyState.tt < 200) {\n return\n }\n _keyState.tt = _t\n }\n this.handleKeyCode(e.keyCode, e, _keyState.isPress)\n }\n\n handleKeyUp (e) {\n const { _keyState } = this\n if (_keyState.playbackRate > 0) {\n this.player.playbackRate = _keyState.playbackRate\n _keyState.playbackRate = 0\n }\n _keyState.isKeyDown = false\n _keyState.isPress = false\n _keyState.tt = 0\n }\n\n handleKeyCode (curKeyCode, event, isPress) {\n const arr = Object.keys(this.keyCodeMap)\n for (let i = 0; i < arr.length; i++) {\n const { action, keyCode, disable, pressAction, disablePress } = this.keyCodeMap[arr[i]]\n if (keyCode === curKeyCode) {\n if (!disable && !(isPress && disablePress)) {\n const _action = !isPress ? action : (pressAction || action)\n if (typeof _action === 'function') {\n action(event, this.player, isPress)\n } else if (typeof _action === 'string') {\n if (typeof this[_action] === 'function') {\n this[_action](event, this.player, isPress)\n }\n }\n this.emit(Events.SHORTCUT, {\n key: arr[i],\n target: event.target,\n isPress: isPress,\n ...this.keyCodeMap[arr[i]]\n })\n }\n preventDefault(event)\n event.stopPropagation()\n break\n }\n }\n }\n\n destroy () {\n this.player.root.removeEventListener('keydown', this.onKeydown)\n document.removeEventListener('keydown', this.onBodyKeyDown)\n this.player.root.removeEventListener('keyup', this.onKeyup)\n document.removeEventListener('keyup', this.onBodyKeyUp)\n }\n\n disable () {\n this.config.disable = true\n }\n\n enable () {\n this.config.disable = false\n }\n}\n\nexport default Keyboard\n","import Plugin, { POSITIONS } from '../../plugin/plugin'\nimport loadingIcon from '../assets/loading.svg'\nimport './index.scss'\n\nclass Loading extends Plugin {\n static get pluginName () {\n return 'loading'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT\n }\n }\n\n registerIcons () {\n return {\n loadingIcon: loadingIcon\n }\n }\n\n afterCreate () {\n this.appendChild('xg-loading-inner', this.icons.loadingIcon)\n }\n\n render () {\n return `\n \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 if (this.fragments.length === 0) {\n this.fragments.push({ percent: 1 })\n }\n this._callBack = args.actionCallback\n this.fragConfig = {\n fragFocusClass: args.fragFocusClass || 'inner-focus-point', // 'inner-focus',\n fragAutoFocus: !!args.fragAutoFocus,\n fragClass: args.fragClass || ''\n }\n this.style = args.style || {\n playedColor: '',\n cachedColor: '',\n progressColor: ''\n }\n this.duration = 0\n this.cachedIndex = 0\n this.playedIndex = 0\n this.focusIndex = -1\n }\n\n updateDuration (duration) {\n this.duration = duration\n let start = 0\n const { fragments } = this\n this.fragments = fragments.map(item => {\n item.start = parseInt(start, 10)\n item.end = parseInt(start + item.percent * this.duration, 10)\n item.duration = parseInt(item.percent * this.duration, 10)\n start += item.percent * this.duration\n return item\n })\n }\n\n updateProgress (type = 'played', data = { newIndex: 0, curIndex: 0, millisecond: 0 }) {\n const { progressList, fragments } = this\n if (progressList.length < 1) {\n return\n }\n const { newIndex, curIndex, millisecond } = data\n if (newIndex !== curIndex) {\n progressList.map((item, index) => {\n if (index < newIndex) {\n item[type].style.width = '100%'\n } else if (index > newIndex) {\n item[type].style.width = 0\n }\n })\n }\n const curPFrag = fragments[newIndex]\n const per = millisecond === 0 ? 0 : (millisecond - curPFrag.start) / curPFrag.duration\n progressList[newIndex][type].style.width = per < 0 ? 0 : `${per * 100}%`\n }\n\n updateFocus (data) {\n if (!this.fragConfig.fragAutoFocus || this.fragments.length < 2) {\n return\n }\n if (!data) {\n // 取消焦点\n if (this.focusIndex > -1) {\n this.unHightLight(this.focusIndex)\n const _data = {\n index: -1,\n preIndex: this.focusIndex,\n fragment: null\n }\n this._callBack && this._callBack(_data)\n this.focusIndex = -1\n }\n return\n }\n const newPIndex = this.findIndex(data.currentTime * 1000, this.focusIndex)\n if (newPIndex >= 0 && newPIndex !== this.focusIndex) {\n this.focusIndex > -1 && this.unHightLight(this.focusIndex)\n this.setHightLight(newPIndex)\n const _data = {\n index: newPIndex,\n preIndex: this.focusIndex,\n fragment: this.fragments[this.focusIndex]\n }\n this.focusIndex = newPIndex\n this._callBack && this._callBack(_data)\n }\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!this.duration || parseInt(duration * 1000, 10) !== this.duration) {\n if (!duration && duration !== 0) {\n return\n }\n this.updateDuration(parseInt(duration * 1000, 10))\n }\n const { playedIndex, cachedIndex } = this\n if (Util.typeOf(data.played) !== 'Undefined') {\n const newPIndex = this.findIndex(data.played * 1000, playedIndex)\n if (newPIndex < 0) {\n return\n }\n this.updateProgress('played', {\n newIndex: newPIndex,\n curIndex: playedIndex,\n millisecond: parseInt(data.played * 1000, 10)\n })\n this.playedIndex = newPIndex\n }\n\n if (Util.typeOf(data.cached) !== 'Undefined') {\n const newCIndex = this.findIndex(data.cached * 1000, cachedIndex)\n if (newCIndex < 0) {\n return\n }\n this.updateProgress('cached', {\n newIndex: newCIndex,\n curIndex: cachedIndex,\n millisecond: parseInt(data.cached * 1000, 10)\n })\n this.cachedIndex = newCIndex\n }\n }\n\n findIndex (time, curIndex) {\n const { fragments } = this\n if (!fragments || fragments.length === 0) {\n return -1\n }\n if (fragments.length === 1) {\n return 0\n }\n if (curIndex > -1 && curIndex < fragments.length && time > fragments[curIndex].start && time < fragments[curIndex].end) {\n return curIndex\n }\n if (time > fragments[fragments.length - 1].start) {\n return fragments.length - 1\n }\n\n for (let i = 0; i < fragments.length; i++) {\n if (time > fragments[i].start && time <= fragments[i].end) {\n curIndex = i\n break\n }\n }\n return curIndex\n }\n\n findHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n if (Util.hasClass(children[i], this.fragConfig.fragFocusClass)) {\n return {\n dom: children[i],\n pos: children[i].getBoundingClientRect()\n }\n }\n }\n }\n\n // 根据索引获取进度条片段\n findFragment (index) {\n const children = this.root.children\n if (index < 0 || index >= children.length) {\n return null\n }\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n\n unHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n Util.removeClass(children[i], this.fragConfig.fragFocusClass)\n }\n }\n\n setHightLight (index) {\n const children = this.root.children\n if (index < children.length) {\n Util.addClass(children[index], this.fragConfig.fragFocusClass)\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n }\n\n destroy () {\n this.progressList = null\n this.fragments = null\n this.root.innerHTML = ''\n }\n\n /**\n * 重置当前\n * @param {*} newOptions\n */\n reset (newOptions) {\n // 更新fragConfig\n Object.keys(this.fragConfig).forEach(key => {\n if (newOptions[key] !== undefined) {\n this.fragConfig[key] = newOptions[key]\n }\n })\n if (newOptions.fragments) {\n this.fragments = newOptions.fragments.length === 0 ? [{ percent: 1 }] : newOptions.fragments\n this.updateDuration(this.duration)\n this.playedIndex = 0\n this.cachedIndex = 0\n // 移除分段信息\n if (this.root) {\n const _c = this.root.children\n while (_c.length > 0) {\n this.root.removeChild(_c[0])\n }\n }\n // 重新渲染\n this.render()\n }\n }\n\n render () {\n const { progressColor } = this.style\n if (!this.root) {\n this.root = Util.createDom('xg-inners', '', {}, 'progress-list')\n }\n if (this.fragments) {\n const { fragClass, fragFocusClass } = this.fragConfig\n this.progressList = this.fragments.map((item) => {\n const inner = Util.createDom('xg-inner', '', {\n style: progressColor ? `background:${progressColor}; flex: ${item.percent}` : `flex: ${item.percent}`\n }, `${item.isFocus ? fragFocusClass : ''} xgplayer-progress-inner ${fragClass}`)\n\n this.root.appendChild(inner)\n\n TPL.forEach(item => {\n inner.appendChild(Util.createDom(item.tag, '', {\n style: item.styleKey ? `background: ${this.style[item.styleKey]}; width:0;` : 'width:0;'\n }, item.className))\n })\n\n return {\n cached: inner.children[0],\n played: inner.children[1]\n }\n })\n }\n return this.root\n }\n}\n","import Plugin, { Events, Util, POSITIONS, Sniffer } from '../../plugin'\nimport InnerList from './innerList'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?:string,\n * disable?: boolean,\n * isDraggingSeek?: boolean, // 是否在拖拽的过程中更新currentTime\n * closeMoveSeek?: boolean, // 是否关闭滑块seek能力\n * isPauseMoving?: boolean, // 是否在move的时候暂停视频内容\n * isCloseClickSeek?: boolean, // 是否关闭点击进度条的时候seek\n * fragments?: Array<{percent: number}>,\n * fragFocusClass?: string, // 进度条分段高亮类名\n * fragAutoFocus?: boolean, // 是否hover的时候自动高亮\n * miniMoveStep?: number,\n * miniStartStep?: number,\n * onMoveStart?: () => any, // 手势开始移动回调,\n * onMoveEnd?: () => any, // 手势移动结束回调\n * endedDiff?: number,\n * [propName: string]: any\n * }} IProgressConfig\n */\n/**\n * 进度条组件\n */\n\n// 分段获取焦点显示的时候的两种class类型\nconst FRAGMENT_FOCUS_CLASS = {\n POINT: 'inner-focus-point',\n HIGHLIGHT: 'inner-focus-highlight'\n}\nclass Progress extends Plugin {\n static get pluginName () {\n return 'progress'\n }\n\n /**\n * @type IProgressConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_CENTER,\n index: 0,\n disable: false,\n isDraggingSeek: true, // 是否在拖拽的过程中更新currentTime\n closeMoveSeek: false, // 是否关闭滑块seek能力\n isPauseMoving: false, // 是否在move的时候暂停视频内容\n isCloseClickSeek: false, // 是否关闭点击进度条的时候seek\n fragments: [{ percent: 1 }],\n fragFocusClass: FRAGMENT_FOCUS_CLASS.POINT,\n fragClass: '', // 内置进度条类名\n fragAutoFocus: false, // 是否hover的时候自动高亮\n miniMoveStep: 5,\n miniStartStep: 2,\n onMoveStart: () => {\n }, // 手势开始移动回调\n onMoveEnd: () => {}, // 手势移动结束回调\n endedDiff: 0.2\n }\n }\n\n static get FRAGMENT_FOCUS_CLASS () {\n return FRAGMENT_FOCUS_CLASS\n }\n\n constructor (args) {\n super(args)\n /**\n * @readonly\n */\n this.useable = false\n /**\n * @readonly\n */\n this.isProgressMoving = false\n\n /**\n * @private\n */\n this.__dragCallBacks = []\n /**\n * @private\n */\n this._state = {\n now: -1,\n direc: 0,\n time: 0,\n prePlayTime: -1\n }\n\n this._disableBlur = false\n\n // 兼容旧版本\n if (typeof this.config.isDragingSeek === 'boolean') {\n console.warn('[XGPLAYER] \\'isDragingSeek\\' is deprecated, please use \\'isDraggingSeek\\' instead')\n this.config.isDraggingSeek = this.config.isDragingSeek\n }\n }\n\n get offsetDuration () {\n return this.playerConfig.customDuration || this.player.offsetDuration || this.player.duration\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : (currentTime + this.timeOffset)\n }\n\n changeState (useable = true) {\n this.useable = useable\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n this.root && (this.root.style.display = 'flex')\n }\n /**\n * @description 创建内部进度条,并挂载到xg-outer上,\n * 并把一些对外API绑定在progress上供外部调用\n *\n */\n _initInner (fragments = [], config = {}) {\n if (!fragments || fragments.length === 0) {\n fragments = [{ percent: 1 }]\n }\n const _c = {\n fragments,\n ...config,\n actionCallback: (data) => {\n this.emitUserAction('fragment_focus', 'fragment_focus', data)\n }\n }\n if (!this.innerList) {\n this.innerList = new InnerList(_c)\n this.outer.insertBefore(this.innerList.render(), this.outer.children[0]);\n ['findHightLight', 'unHightLight', 'setHightLight', 'findFragment'].map(item => {\n this[item] = this.innerList[item].bind(this.innerList)\n })\n } else {\n this.innerList.reset(_c)\n }\n }\n\n _updateInnerFocus (data) {\n this.innerList && this.innerList.updateFocus(data)\n }\n\n afterCreate () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n this.pos = {\n x: 0, // 水平方向位移\n y: 0, // 垂直方向位移\n moving: false, // 是否正在移动\n isDown: false, // 是否mouseDown\n isEnter: false, // 是否触发了mouseEnter\n isLocked: false // 是否刚刚锁定回过进度条\n }\n this.outer = this.find('xg-outer')\n const { fragFocusClass, fragAutoFocus, fragClass } = this.config\n this._initInner(this.config.fragments, { fragFocusClass, fragAutoFocus, fragClass, style: this.playerConfig.commonStyle || {} })\n if (Sniffer.device === 'mobile') {\n this.config.isDraggingSeek = false\n this.isMobile = true\n }\n\n this.progressBtn = this.find('.xgplayer-progress-btn')\n\n this.listenEvents()\n this.bindDomEvents()\n this.initCustomStyle()\n }\n\n /**\n * This method can be overridden.\n * Eg. xgplayer-ads/ui/adProgress.js\n */\n listenEvents () {\n this.on(Events.DURATION_CHANGE, () => {\n this.onMouseLeave()\n })\n\n this.on(Events.TIME_UPDATE, () => {\n this.onTimeupdate()\n })\n\n this.on(Events.SEEKED, () => {\n this.onTimeupdate()\n this.onCacheUpdate()\n })\n\n this.on(Events.PROGRESS, () => {\n this.onCacheUpdate()\n })\n\n this.on(Events.ENDED, () => {\n this.onCacheUpdate(true)\n this.onTimeupdate(true)\n this._state.now = 0\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n\n this.on(Events.VIDEO_RESIZE, () => {\n this.onVideoResize()\n })\n }\n\n /**\n * @description 配置更新响应,插件内置调用api, 播放器整体配置更新的时候调用\n * @param {IProgressConfig} config\n */\n setConfig (config) {\n let frags = null\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n if (key === 'fragments') {\n frags = config[key]\n }\n })\n if (frags) {\n this._initInner(frags, config)\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { sliderBtnStyle } = commonStyle\n const { progressBtn } = this\n if (sliderBtnStyle) {\n if (typeof sliderBtnStyle === 'string') {\n progressBtn.style.boxShadow = sliderBtnStyle\n } else if (typeof sliderBtnStyle === 'object') {\n Object.keys(sliderBtnStyle).map(key => {\n progressBtn.style[key] = sliderBtnStyle[key]\n })\n }\n }\n }\n\n /**\n * 触发某一类回调监听\n * @param { string } type 类型 drag/dragend\n * @param { any} data 具体数据\n */\n triggerCallbacks (type, data, event) {\n if (this.__dragCallBacks.length > 0) {\n this.__dragCallBacks.map(item => {\n if (item && item.handler && item.type === type) {\n try {\n item.handler(data, event)\n } catch (error) {\n console.error(`[XGPLAYER][triggerCallbacks] ${item} error`, error)\n }\n }\n })\n }\n }\n\n /**\n * 供外部插件添加回调\n * @param {string} type 类型 drag/dragend\n * @param {function} handle 回调函数句柄\n */\n addCallBack (type, handle) {\n if (handle && typeof handle === 'function') {\n this.__dragCallBacks.push({ type: type, handler: handle })\n }\n }\n\n /**\n * 供外部插件移除回调\n * @param {string} type 类型 drag/dragend\n * @param {Function} event 回调函数句柄\n */\n removeCallBack (type, event) {\n const { __dragCallBacks } = this\n let _index = -1\n __dragCallBacks.map((item, index) => {\n if (item && item.type === type && item.handler === event) {\n _index = index\n }\n })\n if (_index > -1) {\n __dragCallBacks.splice(_index, 1)\n }\n }\n\n /**\n * @description 解除进度条的所动状态\n * @returns\n */\n unlock () {\n const { player, pos } = this\n pos.isEnter = false\n pos.isLocked = false\n if (player.isMini) {\n return\n }\n this.unbind('mousemove', this.onMoveOnly)\n if (pos.isDown) {\n this.unbind('mouseleave', this.onMouseLeave)\n return\n }\n this.blur()\n }\n\n bindDomEvents () {\n const { config } = this.player\n this._mouseDownHandlerHook = this.hook('dragstart', this._mouseDownHandler)\n this._mouseUpHandlerHook = this.hook('dragend', this._mouseUpHandler)\n this._mouseMoveHandlerHook = this.hook('drag', this._mouseMoveHandler)\n\n if (this.domEventType === 'touch' || this.domEventType === 'compatible') {\n this.root.addEventListener('touchstart', this.onMouseDown)\n }\n\n if (this.domEventType === 'mouse' || this.domEventType === 'compatible') {\n this.bind('mousedown', this.onMouseDown)\n config.isMobileSimulateMode !== 'mobile' && this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseover', this.onMouseOver)\n this.bind('mouseout', this.onMouseOut)\n // 避免触发videoClick 暂停/播放切换\n this.player.root.addEventListener('click', this.onBodyClick, true)\n }\n }\n\n focus () {\n this.player.controls.pauseAutoHide()\n Util.addClass(this.root, 'active')\n }\n\n blur () {\n if (this._disableBlur) {\n return\n }\n this.player.controls.recoverAutoHide()\n Util.removeClass(this.root, 'active')\n }\n\n disableBlur () {\n this._disableBlur = true\n }\n\n enableBlur () {\n this._disableBlur = false\n }\n\n onMoveOnly = (e, data) => {\n const { pos, config, player } = this\n let ret = data\n if (e) {\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (pos.moving && Math.abs(pos.x - x) < config.miniMoveStep) {\n return\n }\n pos.moving = true\n pos.x = x\n ret = this.computeTime(e, x)\n }\n this.triggerCallbacks('dragmove', ret, e)\n this._updateInnerFocus(ret)\n }\n\n /**\n * 避免mouseup的时候触发父辈节点的click事件,和单击视频区域切换暂停/播放互斥\n * @param {*} e\n * @returns\n */\n onBodyClick = (e) => {\n if (!this.pos.isLocked) {\n return\n }\n this.pos.isLocked = false\n e.preventDefault()\n e.stopPropagation()\n }\n\n _mouseDownHandler = (event, data) => {\n this._state.time = data.currentTime\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 0)\n this._updateInnerFocus(data)\n }\n\n _mouseUpHandler = (e, data) => {\n const { pos } = this\n pos.moving && this.updateWidth(data.currentTime, data.seekTime, data.percent, 2)\n }\n\n _mouseMoveHandler = (e, data) => {\n const { _state, pos, config, player } = this\n if (_state.time < data.currentTime) {\n data.forward = true\n } else {\n data.forward = false\n }\n _state.time = data.currentTime\n if (pos.isDown && !pos.moving) {\n pos.moving = true\n config.isPauseMoving && player.pause()\n this.triggerCallbacks('dragstart', data, e)\n this.emitUserAction('drag', 'dragstart', data)\n }\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 1)\n this.triggerCallbacks('dragmove', data, e)\n this._updateInnerFocus(data)\n }\n\n onMouseDown = (e) => {\n const { _state, player, pos, config, playerConfig } = this\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (player.isMini || config.closeMoveSeek || (!playerConfig.allowSeekAfterEnded && player.ended)) {\n return\n }\n\n if (!player.duration && !player.isPlaying) {\n player.play()\n return\n }\n e.stopPropagation()\n // e.preventDefault()\n this.focus()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n Util.checkIsFunction(config.onMoveStart) && config.onMoveStart()\n Util.event(e)\n pos.x = x\n pos.isDown = true\n pos.moving = false\n _state.prePlayTime = player.currentTime\n\n // 交互开始 禁止控制栏的自动隐藏功能\n player.focus({ autoHide: false })\n this.isProgressMoving = true\n Util.addClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseDownHandlerHook(e, ret)\n\n const eventType = e.type\n if (eventType === 'touchstart') {\n this.root.addEventListener('touchmove', this.onMouseMove)\n this.root.addEventListener('touchend', this.onMouseUp)\n this.root.addEventListener('touchcancel', this.onMouseUp)\n } else {\n this.unbind('mousemove', this.onMoveOnly)\n\n document.addEventListener('mousemove', this.onMouseMove, false)\n document.addEventListener('mouseup', this.onMouseUp, false)\n // this.bind('mouseup', this.onMouseUp, false)\n }\n return true\n }\n\n onMouseUp = (e) => {\n const { player, config, pos, playerConfig, _state } = this\n e.stopPropagation()\n e.preventDefault()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n Util.checkIsFunction(config.onMoveEnd) && config.onMoveEnd()\n Util.event(e)\n Util.removeClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, pos.x)\n ret.prePlayTime = _state.prePlayTime\n if (pos.moving) {\n this.triggerCallbacks('dragend', ret, e)\n this.emitUserAction('drag', 'dragend', ret)\n } else {\n this.triggerCallbacks('click', ret, e)\n this.emitUserAction('click', 'click', ret)\n }\n this._mouseUpHandlerHook(e, ret)\n\n pos.moving = false\n pos.isDown = false\n pos.x = 0\n pos.y = 0\n pos.isLocked = true\n _state.prePlayTime = 0\n _state.time = 0\n const eventType = e.type\n if (eventType === 'touchend' || eventType === 'touchcancel') {\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n this.root.removeEventListener('touchcancel', this.onMouseUp)\n // 交互结束 恢复控制栏的隐藏流程\n this.blur()\n } else {\n document.removeEventListener('mousemove', this.onMouseMove, false)\n document.removeEventListener('mouseup', this.onMouseUp, false)\n if (!pos.isEnter) {\n this.onMouseLeave(e)\n } else {\n playerConfig.isMobileSimulateMode !== 'mobile' && this.bind('mousemove', this.onMoveOnly)\n }\n }\n // 延迟复位,状态复位要在dom相关时间回调执行之后\n Util.setTimeout(this, () => {\n this.resetSeekState()\n }, 1)\n // 交互结束 恢复控制栏的隐藏流程\n player.focus()\n }\n\n onMouseMove = (e) => {\n const { _state, pos, player, config } = this\n if (Util.checkTouchSupport()) {\n // e.stopPropagation()\n e.preventDefault()\n }\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const diff = Math.abs(pos.x - x)\n if ((pos.moving && diff < config.miniMoveStep) || (!pos.moving && diff < config.miniStartStep)) {\n return\n }\n pos.x = x\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseMoveHandlerHook(e, ret)\n }\n\n onMouseOut = (e) => {\n this.triggerCallbacks('mouseout', null, e)\n }\n\n onMouseOver = (e) => {\n this.triggerCallbacks('mouseover', null, e)\n }\n\n onMouseEnter = (e) => {\n const { player, pos } = this\n if (pos.isDown || pos.isEnter || player.isMini || (!player.config.allowSeekAfterEnded && player.ended)) {\n return\n }\n pos.isEnter = true\n this.bind('mousemove', this.onMoveOnly)\n this.bind('mouseleave', this.onMouseLeave)\n // 计算预览位置\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const ret = this.computeTime(e, x)\n this.triggerCallbacks('mouseenter', ret, e)\n this.focus()\n }\n\n onMouseLeave = (e) => {\n this.triggerCallbacks('mouseleave', null, e)\n this.unlock()\n this._updateInnerFocus(null)\n }\n\n onVideoResize = () => {\n const { x, isDown, isEnter } = this.pos\n if (isEnter && !isDown) {\n const ret = this.computeTime(null, x)\n this.onMoveOnly(null, ret)\n }\n }\n\n /**\n * @description 根据currenTime和占用百分比更新进度条\n * @param {number} currentTime 需要更新到的时间\n * @param {number} seekTime 实际seek的时间\n * @param {number} percent 更新时间占比\n * @param {number} type 触发类型 0-down 1-move 2-up\n */\n updateWidth (currentTime, seekTime, percent, type) {\n const { config, player } = this\n if (config.isCloseClickSeek && type === 0) {\n return\n }\n\n const realTime = seekTime = seekTime >= player.duration ? player.duration - config.endedDiff : Number(seekTime).toFixed(1)\n\n this.updatePercent(percent)\n this.updateTime(currentTime)\n if (type === 1 && (!config.isDraggingSeek || player.config.mediaType === 'audio')) {\n return\n }\n this._state.now = realTime\n this._state.direc = realTime > player.currentTime ? 0 : 1\n player.seek(realTime)\n }\n\n computeTime (e, x) {\n const { player } = this\n const { width, height, top, left } = this.root.getBoundingClientRect()\n let rWidth, rLeft\n const clientX = x\n if (player.rotateDeg === 90) {\n rWidth = height\n rLeft = top\n } else {\n rWidth = width\n rLeft = left\n }\n let offset = clientX - rLeft\n offset = offset > rWidth ? rWidth : (offset < 0 ? 0 : offset)\n let percent = offset / rWidth\n percent = percent < 0 ? 0 : (percent > 1 ? 1 : percent)\n const currentTime = parseInt(percent * this.offsetDuration * 1000, 10) / 1000\n const seekTime = Util.getCurrentTimeByOffset(currentTime, player.timeSegments)\n return {\n percent,\n currentTime,\n seekTime,\n offset,\n width: rWidth,\n left: rLeft,\n e\n }\n }\n\n /**\n * @description 更新时间插件,在拖拽状态下要接管时间插件的更新状态\n * 本位置会和time插件交互\n * @param {number} time 根据拖拽距离计算出的时间\n */\n updateTime (time) {\n const { player, duration } = this\n if (time > duration) {\n time = duration\n } else if (time < 0) {\n time = 0\n }\n const timeIcon = player.plugins.time\n if (timeIcon) {\n timeIcon.updateTime(time)\n }\n }\n\n /**\n * @description 复位正在拖拽状态 ,拖拽的时候要避免timeupdate更新\n */\n resetSeekState () {\n this.isProgressMoving = false\n const timeIcon = this.player.plugins.time\n timeIcon && timeIcon.resetActive()\n }\n\n /**\n * @description 拖拽过程中更新UI\n * @param {number} percent 小于0的小数\n *\n */\n updatePercent (percent, notSeek) {\n this.isProgressMoving = true\n if (this.config.disable) {\n return\n }\n percent = percent > 1 ? 1 : (percent < 0 ? 0 : percent)\n this.progressBtn.style.left = `${percent * 100}%`\n this.innerList.update({ played: percent * this.offsetDuration }, this.offsetDuration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: percent * this.offsetDuration }, this.offsetDuration)\n }\n\n /**\n * @description 播放进度更新\n * @param { boolean } isEnded 是否是播放结束的时候调用\n * @returns\n */\n onTimeupdate (isEnded) {\n const { player, _state, offsetDuration } = this\n if ((player.isSeeking && player.media.seeking) || this.isProgressMoving || !player.hasStart) {\n return\n }\n if (_state.now > -1) {\n const abs = parseInt(_state.now * 1000, 10) - parseInt(player.currentTime * 1000, 10)\n if ((_state.direc === 0 && abs > 300) || (_state.direc === 1 && abs > -300)) {\n _state.now = -1\n return\n } else {\n _state.now = -1\n }\n }\n let time = this.currentTime // this.timeOffset + player.currentTime\n time = Util.adjustTimeByDuration(time, offsetDuration, isEnded)\n this.innerList.update({ played: time }, offsetDuration)\n this.progressBtn.style.left = `${time / offsetDuration * 100}%`\n }\n\n /**\n * @description 缓存进度更新\n * @param { boolean } isEnded 是否是结束时触发\n * @returns\n */\n onCacheUpdate (isEnded) {\n const { player, duration } = this\n if (!player) {\n return\n }\n // 兼容设置了customDuration, 实际时长和要显示的时不一致问题\n let _end = player.bufferedPoint.end\n _end = Util.adjustTimeByDuration(_end, duration, isEnded)\n this.innerList.update({ cached: _end }, duration)\n }\n\n onReset () {\n this.innerList.update({ played: 0, cached: 0 }, 0)\n this.progressBtn.style.left = '0%'\n }\n\n destroy () {\n const { player } = this\n this.thumbnailPlugin = null\n this.innerList.destroy()\n this.innerList = null\n const { domEventType } = this\n if (domEventType === 'touch' || domEventType === 'compatible') {\n this.root.removeEventListener('touchstart', this.onMouseDown)\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n this.root.removeEventListener('touchcancel', this.onMouseUp)\n }\n if (domEventType === 'mouse' || domEventType === 'compatible') {\n this.unbind('mousedown', this.onMouseDown)\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mousemove', this.onMoveOnly)\n this.unbind('mouseleave', this.onMouseLeave)\n document.removeEventListener('mousemove', this.onMouseMove, false)\n document.removeEventListener('mouseup', this.onMouseUp, false)\n player.root.removeEventListener('click', this.onBodyClick, true)\n }\n }\n\n render () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n const controlsMode = this.player.controls ? this.player.controls.config.mode : ''\n const className = controlsMode === 'bottom' ? 'xgplayer-progress-bottom' : ''\n return `\n \n \n \n \n \n `\n }\n}\n\nexport default Progress\n","import Plugin from '../../plugin'\n\nexport default class Icon extends Plugin {\n afterCreate () {\n this.bind('mouseenter', this._onMouseenter)\n this.bind('mouseleave', this._onMouseLeave)\n if (this.config.disable) {\n this.disable()\n }\n }\n\n _onMouseenter = (e) => {\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n _onMouseLeave = (e) => {\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n destroy () {\n this.unbind('mouseenter', this._onMouseenter)\n this.unbind('mouseleave', this._onMouseLeave)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\nclass Play extends IconPlugin {\n static get pluginName () {\n return 'play'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 0,\n disable: false\n }\n }\n\n afterCreate () {\n super.afterCreate()\n const { config } = this\n if (config.disable) {\n return\n }\n this.initIcons()\n this.bind(['touchend', 'click'], this.btnClick)\n\n this.listenEvents()\n this.animate(true)\n }\n\n listenEvents () {\n const { player } = this\n this.on([Events.PLAY, Events.PAUSE, Events.ERROR, Events.EMPTIED], () => {\n this.animate(player.paused)\n })\n }\n\n registerIcons () {\n return {\n play: { icon: PlaySvg, class: 'xg-icon-play' },\n pause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n btnClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { prop: 'paused', from: player.paused, to: !player.paused })\n if (player.ended) {\n player.replay()\n } else if (player.paused) {\n player.play()\n this.animate(false)\n } else {\n player.pause()\n this.animate(true)\n }\n return false\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.play)\n this.appendChild('.xgplayer-icon', icons.pause)\n }\n\n animate (paused) {\n if (!this.player) {return}\n const { i18nKeys } = this\n const tipDom = this.find('.xg-tips')\n if (paused) {\n this.setAttr('data-state', 'pause')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PLAY_TIPS)\n } else {\n this.setAttr('data-state', 'play')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PAUSE_TIPS)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['touchend', 'click'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n
\n
\n ${xgIconTips(this, 'PLAY_TIPS', this.playerConfig.isHideTips)}\n
`\n }\n}\nexport default Play\n","import Plugin, { POSITIONS, Util } from '../../plugin'\nimport BackSVG from '../assets/back.svg'\n\nexport default class TopBackIcon extends Plugin {\n static get pluginName () {\n return 'topbackicon'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT_TOP,\n index: 0\n }\n }\n\n afterCreate () {\n this.initIcons()\n this.onClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n this.config.onClick(e)\n }\n\n this.bind(['click', 'touchend'], this.onClick)\n }\n\n registerIcons () {\n return {\n screenBack: { icon: BackSVG, class: 'xg-fullscreen-back' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild(this.root, icons.screenBack)\n }\n\n show () {\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n render () {\n return `\n `\n }\n}\n","import { Events, POSITIONS, Sniffer, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport TopBackIcon from './backicon'\nimport FullScreenSvg from '../assets/requestFull.svg'\nimport ExitFullScreenSvg from '../assets/exitFull.svg'\nimport './index.scss'\n\n/**\n * @typedef { {\n * position?: string,\n * index?: number,\n * useCssFullscreen?: boolean,\n * rotateFullscreen?: boolean,\n * useScreenOrientation?: boolean,\n * lockOrientationType?: OrientationType,\n * switchCallback?: () => any,\n * target?: null | HTMLElement,\n * disable?: boolean,\n * needBackIcon?: boolean,\n * [propName: string]: any\n * } } IFullscreenConfig\n */\nexport default class Fullscreen extends IconPlugin {\n static get pluginName () {\n return 'fullscreen'\n }\n\n /**\n * @type IFullscreenConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 0,\n useCssFullscreen: false, // Whether to use the page full screen\n rotateFullscreen: false, // Whether to enable rotating full screen\n useScreenOrientation: false, // Whether to use ScreenOrientation lock after requestFullScreen if ScreenOrientation available\n lockOrientationType: 'landscape', // Whether to lock screen if video width is greater than height\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 afterCreate () {\n super.afterCreate()\n const { config, playerConfig } = this\n if (config.disable) {\n return\n }\n\n if (config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n const fullEl = Util.getFullScreenEl()\n\n if (playerConfig.fullscreenTarget === fullEl) {\n this.player.getFullscreen().catch(e=>{})\n }\n\n this.initIcons()\n\n this.handleFullscreen = this.hook('fullscreenChange', this.toggleFullScreen, {\n pre: (e) => {\n const { fullscreen } = this.player\n this.emitUserAction(e, 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n }\n })\n\n this.bind('.xgplayer-fullscreen', ['touchend', 'click'], this.handleFullscreen)\n\n this.on(Events.FULLSCREEN_CHANGE, (isFullScreen) => {\n const tipsDom = this.find('.xg-tips')\n tipsDom && this.changeLangTextKey(tipsDom, isFullScreen ? this.i18nKeys.EXITFULLSCREEN_TIPS : this.i18nKeys.FULLSCREEN_TIPS)\n this.animate(isFullScreen)\n })\n if (this.config.needBackIcon) {\n this.topBackIcon = this.player.registerPlugin({\n plugin: TopBackIcon,\n options: {\n config: {\n onClick: (e) => {\n this.handleFullscreen(e)\n }\n }\n }\n })\n }\n if (Sniffer.device === 'mobile') {\n window.addEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n /**\n * @private\n */\n _onOrientationChange = (e) => {\n if (this.player.fullscreen && this.config.rotateFullscreen) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.player.setRotateDeg(0)\n } else {\n this.player.setRotateDeg(90)\n }\n }\n }\n\n registerIcons () {\n return {\n fullscreen: { icon: FullScreenSvg, class: 'xg-get-fullscreen' },\n exitFullscreen: { icon: ExitFullScreenSvg, class: 'xg-exit-fullscreen' }\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.handleFullscreen)\n if (Sniffer.device === 'mobile') {\n window.removeEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.fullscreen)\n this.appendChild('.xgplayer-icon', icons.exitFullscreen)\n }\n\n /**\n * 切换全屏\n * @param { Event } [e]\n */\n toggleFullScreen (e) {\n if (e) {\n e.preventDefault()\n e.stopPropagation()\n }\n const { player, config } = this\n const useCssFullscreen = config.useCssFullscreen === true || (typeof config.useCssFullscreen === 'function' && config.useCssFullscreen())\n if (useCssFullscreen) {\n if (player.fullscreen) {\n player.exitCssFullscreen()\n } else {\n player.getCssFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.rotateFullscreen) {\n if (player.fullscreen) {\n player.exitRotateFullscreen()\n } else {\n player.getRotateFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.switchCallback && typeof config.switchCallback === 'function') {\n config.switchCallback(player.fullscreen)\n } else {\n if (player.fullscreen) {\n player.exitFullscreen()\n\n if (config.useScreenOrientation) {\n this.unlockScreen()\n }\n } else {\n player.getFullscreen().catch(e => {})\n\n if (config.useScreenOrientation && player.aspectRatio > 1) {\n this.lockScreen(config.lockOrientationType)\n }\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 /**\n * @returns\n */\n render () {\n if (this.config.disable) {\n return\n }\n const langKey = 'FULLSCREEN_TIPS'\n return `\n
\n
\n ${xgIconTips(this, langKey, this.playerConfig.isHideTips)}\n
`\n }\n\n /**\n * 锁定屏幕方向,只有部分移动端浏览器支持\n * 兼容性参考:https://caniuse.com/mdn-api_screenorientation_lock\n * @param {OrientationType} orientation\n */\n lockScreen (orientation) {\n try {\n screen.orientation.lock(orientation).catch(e => {})\n } catch (e) {\n }\n }\n\n /**\n * 解锁屏幕方向锁定,只有部分移动端浏览器支持\n */\n unlockScreen () {\n try {\n screen.orientation.unlock().catch(e => {})\n } catch (e) {\n }\n }\n}\n","import Plugin, { Util, Events, POSITIONS } from '../../plugin'\nimport './index.scss'\n\nclass Time extends Plugin {\n static get pluginName () {\n return 'time'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 2,\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.isActiving = false\n }\n\n get duration () {\n const { offsetDuration, duration } = this.player\n return this.playerConfig.customDuration || offsetDuration || duration\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : currentTime\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n afterCreate () {\n const constrolsMode = this.player.controls.config.mode\n this.mode = constrolsMode === 'flex' ? 'flex' : 'normal'\n if (this.config.disable) {\n return\n }\n if (this.mode === 'flex') {\n this.createCenterTime()\n this.root.style.display = 'none'\n }\n this.durationDom = this.find('.time-duration')\n this.timeDom = this.find('.time-current')\n\n this.listenEvents()\n }\n\n /**\n * This method can be overridden.\n * Eg. xgplayer-ads/ui/adTime.js\n */\n listenEvents () {\n this.on([Events.DURATION_CHANGE, Events.SEEKED, Events.TIME_UPDATE], (e) => {\n if (e.eventName === 'durationchange') {\n this.isActiving = false\n }\n this.onTimeUpdate()\n })\n\n this.on(Events.ENDED, () => {\n // 因为customDuration存在,最终播放currentTime可能和显示的duration不统一,所以在ended的时候修正\n this.onTimeUpdate(true)\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'block')\n this.centerDurDom && (this.centerDurDom.style.display = 'block')\n return\n }\n this.root.style.display = 'block'\n }\n\n hide () {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'none')\n this.centerDurDom && (this.centerDurDom.style.display = 'none')\n return\n }\n this.root.style.display = 'none'\n }\n\n onTimeUpdate (isEnded) {\n const { player, config, duration } = this\n if (config.disable || this.isActiving || !player.hasStart) {\n return\n }\n let current = this.currentTime + this.timeOffset\n current = Util.adjustTimeByDuration(current, duration, isEnded)\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.centerDurDom.innerHTML = Util.format(duration)\n }\n } else {\n this.timeDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.durationDom.innerHTML = Util.format(duration)\n }\n }\n }\n\n onReset () {\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(0))\n this.centerDurDom.innerHTML = Util.format(0)\n } else {\n this.timeDom.innerHTML = this.minWidthTime(Util.format(0))\n this.durationDom.innerHTML = Util.format(0)\n }\n }\n\n createCenterTime () {\n const { player } = this\n if (!player.controls || !player.controls.center) {\n return\n }\n const center = player.controls.center\n this.centerCurDom = Util.createDom(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-left'\n )\n this.centerDurDom = Util.createDom(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-right'\n )\n center.children.length > 0\n ? center.insertBefore(this.centerCurDom, center.children[0])\n : center.appendChild(this.centerCurDom)\n center.appendChild(this.centerDurDom)\n }\n\n afterPlayerInit () {\n const { config } = this\n if (this.duration === Infinity || this.playerConfig.isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n }\n if (config.hide) {\n this.hide()\n return\n }\n this.show()\n }\n\n changeLiveState (isLive) {\n if (isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n Util.show(this.find('.time-separator'))\n Util.show(this.durationDom)\n Util.show(this.timeDom)\n }\n }\n\n updateTime (time) {\n this.isActiving = true\n if ((!time && time !== 0) || time > this.duration) {\n return\n }\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(time))\n return\n }\n this.timeDom.innerHTML = this.minWidthTime(Util.format(time))\n }\n\n minWidthTime (timeStr) {\n return timeStr\n .split(':')\n .map(value => `${value}`)\n .join(':')\n }\n\n resetActive () {\n const { player } = this\n const updateState = () => {\n this.isActiving = false\n }\n this.off(Events.SEEKED, updateState)\n if (player.isSeeking && player.media.seeking) {\n this.once(Events.SEEKED, updateState)\n } else {\n this.isActiving = false\n }\n }\n\n destroy () {\n const { center } = this.player.controls\n this.centerCurDom && center.removeChild(this.centerCurDom)\n this.centerCurDom = null\n this.centerDurDom && center.removeChild(this.centerDurDom)\n this.centerDurDom = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n 00:00\n /\n 00:00\n ${this.i18n.LIVE_TIP}\n `\n }\n}\nexport default Time\n","import { BasePlugin, Events, Util } from '../../plugin'\n/**\n * 进行事件分段控制\n */\nexport default class TimeSegmentsControls extends BasePlugin {\n static get pluginName () {\n return 'TimeSegmentsControls'\n }\n\n static get defaultConfig () {\n return {\n disable: true,\n segments: []\n }\n }\n\n afterCreate () {\n this.curIndex = -1\n this.curPos = null\n this.lastCurrentTime = 0\n\n this.updateSegments()\n\n this.on(Events.DURATION_CHANGE, this._onDurationChange)\n this.on(Events.LOADED_DATA, this._onLoadedData)\n\n this.on(Events.TIME_UPDATE, this._onTimeupdate)\n\n this.on(Events.SEEKING, this._onSeeking)\n\n this.on(Events.PLAY, this._onPlay)\n }\n\n setConfig (newConfig) {\n if (!newConfig) {\n return\n }\n const keys = Object.keys(newConfig)\n if (keys.length < 1) {\n return\n }\n keys.forEach(key => {\n this.config[key] = newConfig[key]\n })\n this.updateSegments()\n }\n\n updateSegments () {\n const { disable, segments } = this.config\n const { player } = this\n if (disable || !segments || segments.length === 0) {\n player.timeSegments = []\n player.offsetDuration = 0\n player.offsetCurrentTime = -1\n } else {\n const _segs = this.formatTimeSegments(segments, player.duration)\n player.timeSegments = _segs\n player.offsetDuration = _segs.length > 0 ? _segs[_segs.length - 1].duration : 0\n }\n }\n\n formatTimeSegments (timeSegments, duration) {\n const ret = []\n if (!timeSegments) {\n return []\n }\n // console.log('>>>formatTimeSegments', duration)\n timeSegments.sort((a,b) =>{ return a.start - b.start })\n timeSegments.forEach((item, index) => {\n const _item = {}\n _item.start = item.start < 0 ? 0 : item.start\n _item.end = duration > 0 && item.end > duration ? duration : item.end\n if (duration > 0 && _item.start > duration) {\n return\n }\n ret.push(_item)\n const _segDuration = _item.end - _item.start\n if (index === 0) {\n _item.offset = item.start // 偏移量\n _item.cTime = 0\n _item.segDuration = _segDuration\n _item.duration = _segDuration\n } else {\n const last = ret[index - 1]\n _item.offset = last.offset + (_item.start - last.end)\n _item.cTime = last.duration + last.cTime\n _item.segDuration = _segDuration\n _item.duration = last.duration + _segDuration\n }\n })\n return ret\n }\n\n _onDurationChange = () => {\n this.updateSegments()\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const index = Util.getIndexByTime(currentTime,timeSegments)\n const time = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n this.player.offsetCurrentTime = time\n this.changeIndex(index, timeSegments)\n }\n\n _onLoadedData = () => {\n const { timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const time = Util.getOffsetCurrentTime(0, timeSegments)\n this.player.offsetCurrentTime = time\n this.changeIndex(0, timeSegments)\n if (this.curPos.start > 0){\n this.player.currentTime = this.curPos.start\n }\n }\n\n _onTimeupdate = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const _len = timeSegments.length\n this.lastCurrentTime = currentTime\n const index = Util.getIndexByTime(currentTime, timeSegments)\n if (index !== this.curIndex) {\n this.changeIndex(index, timeSegments)\n }\n const curTime = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n\n this.player.offsetCurrentTime = curTime\n\n // 根据分段信息进行放时间点跳转\n if (!this.curPos) {\n return\n }\n const { start, end } = this.curPos\n if (currentTime < start) {\n this.player.currentTime = start\n } else if (currentTime > end && index >= _len - 1) {\n this.player.pause()\n }\n }\n\n _onSeeking = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n if (currentTime < timeSegments[0].start) {\n this.player.currentTime = timeSegments[0].start\n } else if (currentTime > timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[timeSegments.length - 1].end\n } else {\n const _index = Util.getIndexByTime(currentTime, timeSegments)\n if (_index >= 0) {\n const _seekTime = this.getSeekTime(currentTime, this.lastCurrentTime, _index, timeSegments)\n if (_seekTime >= 0 ) {\n this.player.currentTime = _seekTime\n }\n }\n }\n }\n\n _onPlay = () => {\n const { currentTime, timeSegments } = this.player\n if (this._checkIfEnabled(timeSegments) && currentTime >= timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[0].start\n }\n }\n\n getSeekTime (currentTime, lastCurrentTime, index, timeSegments) {\n let _time = -1\n const { start, end } = timeSegments[index]\n if (currentTime >= start && currentTime <= end) {\n // console.log('>>>>_onSeeking noSeek', currentTime, lastCurrentTime, start, end, _time)\n return _time\n }\n const diff = currentTime - lastCurrentTime\n if (diff < 0) {\n if (currentTime < start) {\n const diff2 = lastCurrentTime > start ? lastCurrentTime - start : 0\n _time = index - 1 >= 0 ? timeSegments[index - 1].end + diff + diff2 : 0\n // console.log('>>>>_onSeeking seek3', currentTime, lastCurrentTime, diff, start, end, _time)\n return _time\n }\n }\n return -1\n }\n\n _checkIfEnabled (segments) {\n return !(!segments || segments.length < 1)\n }\n\n changeIndex (index, timeSegments) {\n this.curIndex = index\n if (index >= 0 && timeSegments.length > 0) {\n this.curPos = timeSegments[index]\n } else {\n this.curPos = null\n }\n }\n}","import Plugin, { Util, Events, Sniffer, POSITIONS } from '../../plugin'\nimport volumeLargeSvg from '../assets/volumeLarge.svg'\nimport volumeSmallSvg from '../assets/volumeSmall.svg'\nimport volumeMutedSvg from '../assets/volumeMuted.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string, // [可选]插件挂载的dom\n * index?: number // [可选]插件在播放器中挂载的位置\n * disable?: boolean, // [可选]是否禁用插件交互行为\n * showValueLabel?: boolean, // [可选]是否显示当前滑动的音量数值\n * default?: number // [可选]默认\n * [propName: string]: any\n * }} IVolumeConfig\n */\n\nclass Volume extends Plugin {\n static get pluginName () {\n return 'volume'\n }\n\n /**\n * @type IVolumeConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT, // [可选]插件挂载的dom\n index: 1, // [可选]插件在播放器中挂载的位置\n disable: false, // [可选]是否禁用插件交互行为\n showValueLabel: false, // [可选]是否显示当前滑动的音量数值\n default: 0.6, // [可选]默认音量\n miniVolume: 0.2 // 静音恢复的时候最小音量\n }\n }\n\n registerIcons () {\n return {\n volumeSmall: { icon: volumeSmallSvg, class: 'xg-volume-small' },\n volumeLarge: { icon: volumeLargeSvg, class: 'xg-volume' },\n volumeMuted: { icon: volumeMutedSvg, class: 'xg-volume-mute' }\n }\n }\n\n afterCreate () {\n this._timerId = null\n this._d = {\n isStart: false,\n isMoving: false,\n isActive: false\n }\n if (this.config.disable) {\n return\n }\n\n this.initIcons()\n\n const { commonStyle, volume } = this.playerConfig\n if (commonStyle.volumeColor) {\n this.find('.xgplayer-drag').style.backgroundColor = commonStyle.volumeColor\n }\n this.changeMutedHandler = this.hook('mutedChange', (e) => {\n this.changeMuted(e)\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this._onMouseenterHandler = this.hook('mouseenter', this.onMouseenter)\n this._onMouseleaveHandler = this.hook('mouseleave', this.onMouseleave)\n\n if (!(Sniffer.device === 'mobile') && this.playerConfig.isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this._onMouseenterHandler)\n\n this.bind(['blur', 'mouseleave'], this._onMouseleaveHandler)\n\n this.bind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.bind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.bind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n }\n\n this.bind('.xgplayer-icon', ['touchend', 'click'], this.changeMutedHandler)\n\n this.on(Events.VOLUME_CHANGE, this.onVolumeChange)\n this.once(Events.LOADED_DATA, this.onVolumeChange)\n\n if (Util.typeOf(volume) !== 'Number') {\n this.player.volume = this.config.default\n }\n\n this.onVolumeChange()\n }\n\n onBarMousedown = (e) => {\n const { player } = this\n const bar = this.find('.xgplayer-bar')\n Util.event(e)\n\n const barRect = bar.getBoundingClientRect()\n const pos = Util.getEventPos(e, player.zoom)\n const height = barRect.height - (pos.clientY - barRect.top)\n pos.h = height\n pos.barH = barRect.height\n this.pos = pos\n // 差值小于0,说明点击的不是音量滑块位置 不做响应\n if (height < -2) {\n return\n }\n this.updateVolumePos(height, e)\n document.addEventListener('mouseup', this.onBarMouseUp)\n this._d.isStart = true\n return false\n }\n\n onBarMouseMove = (e) => {\n const { _d } = this\n if (!_d.isStart) {\n return\n }\n const { pos, player } = this\n e.preventDefault()\n e.stopPropagation()\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n _d.isMoving = true\n const w = pos.h - _ePos.clientY + pos.clientY\n if (w > pos.barH) {\n return\n }\n this.updateVolumePos(w, e)\n }\n\n onBarMouseUp = (e) => {\n Util.event(e)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n const { _d } = this\n _d.isStart = false\n _d.isMoving = false\n }\n\n updateVolumePos (height, event) {\n const { player } = this\n const drag = this.find('.xgplayer-drag')\n const bar = this.find('.xgplayer-bar')\n if (!bar || !drag) {\n return\n }\n const now = parseInt(height / bar.getBoundingClientRect().height * 1000, 10)\n drag.style.height = `${height}px`\n const to = Math.max(Math.min(now / 1000, 1), 0)\n const props = {\n volume: {\n from: player.volume,\n to\n }\n }\n if (player.muted) {\n props.muted = {\n from: true,\n to: false\n }\n }\n this.emitUserAction(event, 'change_volume', { muted: player.muted, volume: player.volume, props })\n player.volume = Math.max(Math.min(now / 1000, 1), 0)\n player.muted && (player.muted = false)\n\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n\n /**\n * 修改音量数值标签\n *\n * @memberof Volume\n */\n updateVolumeValue () {\n const { volume, muted } = this.player\n const $labelValue = this.find('.xgplayer-value-label')\n const vol = Math.max(Math.min(volume, 1), 0)\n\n // Math.ceil有精度问题,比如Math.ceil(0.55 * 100) == 56,因此这里使用Math.round\n // 0.58 * 100 === 57.99999999999999\n // 0.55 * 100 === 55.00000000000001\n $labelValue.innerText = muted ? 0 : Math.round(vol * 100)\n }\n\n /**\n * @desc 聚焦\n */\n focus () {\n const { player } = this\n player.focus({ autoHide: false })\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n Util.addClass(this.root, 'slide-show')\n }\n\n /**\n * 失去焦点\n * @param { number } delay 延迟隐藏时长,ms\n * @param { boolean } isForce 是否立即隐藏控制栏\n * @param { Event} [e] 事件\n * @returns\n */\n unFocus (delay = 100, isForce = true, e) {\n const { _d, player } = this\n if (_d.isActive) {\n return\n }\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this._timerId = Util.setTimeout(this, () => {\n if (!_d.isActive) {\n isForce ? player.blur() : player.focus()\n Util.removeClass(this.root, 'slide-show')\n _d.isStart && this.onBarMouseUp(e)\n }\n this._timerId = null\n }, delay)\n }\n\n onMouseenter = (e) => {\n this._d.isActive = true\n this.focus()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n onMouseleave = (e) => {\n this._d.isActive = false\n this.unFocus(100, false, e)\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n changeMuted (e) {\n // e.preventDefault()\n e && e.stopPropagation()\n const { player, _d } = this\n // 取消bar的状态\n _d.isStart && this.onBarMouseUp(e)\n this.emitUserAction(e, 'change_muted', {\n muted: player.muted,\n volume: player.volume,\n props: {\n muted: {\n from: player.muted,\n to: !player.muted\n }\n }\n })\n if (player.volume > 0) {\n player.muted = !player.muted\n }\n if (player.volume < 0.01) {\n player.volume = this.config.miniVolume\n }\n }\n\n onVolumeChange = (e) => {\n if (!this.player) {\n return\n }\n const { muted, volume } = this.player\n if (!this._d.isMoving) {\n this.find('.xgplayer-drag').style.height = muted || volume === 0 ? '4px' : `${volume * 100}%`\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n this.animate(muted, volume)\n }\n\n animate (muted, volume) {\n if (muted || volume === 0) {\n this.setAttr('data-state', 'mute')\n } else if (volume < 0.5 && this.icons.volumeSmall) {\n this.setAttr('data-state', 'small')\n } else {\n this.setAttr('data-state', 'normal')\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.volumeSmall)\n this.appendChild('.xgplayer-icon', icons.volumeLarge)\n this.appendChild('.xgplayer-icon', icons.volumeMuted)\n }\n\n destroy () {\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this.unbind('mouseenter', this.onMouseenter)\n\n this.unbind(['blur', 'mouseleave'], this.onMouseleave)\n\n this.unbind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.unbind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.unbind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.changeMutedHandler)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const volume = this.config.default || this.player.volume\n const isShowVolumeValue = this.config.showValueLabel\n return `\n \n
\n
\n \n ${isShowVolumeValue ? `
${volume * 100}
` : ''}\n
\n \n
\n
\n
`\n }\n}\nexport default Volume\n","import { POSITIONS, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport { Events } from '../../plugin/basePlugin'\nimport RotateSvg from '../assets/rotate.svg'\nimport './index.scss'\n\nexport default class Rotate extends IconPlugin {\n static get pluginName () {\n return 'rotate'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n innerRotate: true, // true为只有画面旋转,false为整个播放器旋转\n clockwise: false,\n rotateDeg: 0, // 初始旋转角度\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.rotateDeg = this.config.rotateDeg || 0\n }\n\n afterCreate () {\n if (this.config.disable) {\n return\n }\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.rotate)\n this.onBtnClick = this.onBtnClick.bind(this)\n this.bind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n // 全屏/css全屏/容器宽高发生变化 需要重新计算\n this.on(Events.VIDEO_RESIZE, () => {\n if (this.rotateDeg && this.config.innerRotate) {\n Util.setTimeout(this, () => {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }, 100)\n }\n })\n\n const root = this.player.root\n this.rootWidth = root.style.width || root.offsetWidth || root.clientWidth\n this.rootHeight = root.style.height || root.offsetHeight || root.clientHeight\n\n if (this.rotateDeg) {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n }\n\n onBtnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'rotate')\n this.rotate(this.config.clockwise, this.config.innerRotate, 1)\n }\n\n updateRotateDeg (rotateDeg, innerRotate) {\n if (!rotateDeg) {\n rotateDeg = 0\n }\n if (innerRotate) {\n this.player.videoRotateDeg = rotateDeg\n return\n }\n const { player, rootWidth, rootHeight } = this\n const { root, innerContainer } = player\n const video = player.media\n const width = root.offsetWidth\n const height = innerContainer && innerRotate ? innerContainer.offsetHeight : root.offsetHeight\n let rWidth = rootWidth\n let rHeight = rootHeight\n let x = 0\n let y = 0\n if (rotateDeg === 0.75 || rotateDeg === 0.25) {\n rWidth = `${height}px`\n rHeight = `${width}px`\n x = -(height - width) / 2\n y = -(width - height) / 2\n }\n const _transform = `translate(${x}px,${y}px) rotate(${rotateDeg}turn)`\n const _styles = {\n transformOrigin: 'center center',\n transform: _transform,\n webKitTransform: _transform,\n height: rHeight,\n width: rWidth\n }\n\n const _target = innerRotate ? video : root\n const poster = innerRotate ? player.getPlugin('poster') : null\n Object.keys(_styles).map(key => {\n _target.style[key] = _styles[key]\n poster && poster.root && (poster.root.style[key] = _styles[key])\n })\n }\n\n rotate (clockwise = false, innerRotate = true, times = 1) {\n const player = this.player\n if (!this.rotateDeg) {\n this.rotateDeg = 0\n }\n const factor = clockwise ? 1 : -1\n\n this.rotateDeg = (this.rotateDeg + 1 + factor * 0.25 * times) % 1\n this.updateRotateDeg(this.rotateDeg, innerRotate)\n player.emit(Events.ROTATE, this.rotateDeg * 360)\n }\n\n registerIcons () {\n return {\n rotate: RotateSvg\n }\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n \n
\n
\n ${xgIconTips(this, 'ROTATE_TIPS', this.playerConfig.isHideTips)}\n
`\n }\n}\n","/* global documentPictureInPicture */\nimport { Events, Util, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport PipIcon from '../assets/pipIcon.svg'\nimport PipIconExit from '../assets/pipIconExit.svg'\nimport './index.scss'\n\n/**\n * @description picture-in-picture plugin\n * @doc https://www.w3.org/TR/picture-in-picture/\n * @doc https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n * @doc https://wicg.github.io/document-picture-in-picture/\n */\n\nconst PresentationMode = {\n PIP: 'picture-in-picture',\n INLINE: 'inline',\n FULLSCREEN: 'fullscreen'\n}\n\nclass PIP extends IconPlugin {\n static get pluginName () {\n return 'pip'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n showIcon: false,\n preferDocument: false,\n width: undefined,\n height: undefined,\n docPiPNode: undefined,\n docPiPStyle: undefined\n }\n }\n\n static checkWebkitSetPresentationMode (video) {\n return typeof video.webkitSetPresentationMode === 'function'\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.pip === 'boolean') {\n args.config.showIcon = args.player.config.pip\n }\n }\n\n afterCreate () {\n // 非可用状态不做初始化\n if (!this.isPIPAvailable()) {\n return\n }\n super.afterCreate()\n this.pMode = PresentationMode.INLINE\n this.initPipEvents()\n // 确认开启按钮的情况下才初始化按钮\n if (this.config.showIcon) {\n this.initIcons()\n }\n // video初始化之后再做判断是否显示\n this.once(Events.COMPLETE, () => {\n if (this.config.showIcon) {\n Util.removeClass(this.find('.xgplayer-icon'), 'xg-icon-disable')\n this.bind('click', this.switchPIP)\n }\n })\n }\n\n registerIcons () {\n return {\n pipIcon: { icon: PipIcon, class: 'xg-get-pip' },\n pipIconExit: { icon: PipIconExit, class: 'xg-exit-pip' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.pipIcon)\n this.appendChild('.xgplayer-icon', icons.pipIconExit)\n }\n\n initPipEvents () {\n const { player } = this\n this.leavePIPCallback = () => {\n // 处理点击x关闭画中画的时候暂停问题\n const paused = player.paused\n Util.setTimeout(this, () => {\n // 使用mediaPlay避免多次触发 playhooks\n !paused && player.mediaPlay()\n }, 0)\n !paused && player.mediaPlay()\n this.setAttr('data-state', 'normal')\n this.pipWindow = null\n player.emit(Events.PIP_CHANGE, false)\n }\n\n this.enterPIPCallback = (e) => {\n player.emit(Events.PIP_CHANGE, true)\n if (e?.pictureInPictureWindow) {\n this.pipWindow = e.pictureInPictureWindow\n }\n this.setAttr('data-state', 'pip')\n }\n\n this.onWebkitpresentationmodechanged = (e) => {\n const mode = player.media.webkitPresentationMode\n // 如果在全屏下进入了该逻辑,调用退出全屏处理\n if (this.pMode === PresentationMode.FULLSCREEN && mode !== PresentationMode.FULLSCREEN) {\n player.onFullscreenChange(null, false)\n }\n this.pMode = mode\n if (mode === PresentationMode.PIP) {\n this.enterPIPCallback(e)\n } else if (mode === PresentationMode.INLINE) {\n this.leavePIPCallback(e)\n }\n }\n\n if (player.media) {\n player.media.addEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.addEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.addEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n }\n }\n\n switchPIP = (e) => {\n if (!this.isPIPAvailable()) {\n return false\n }\n e.stopPropagation && e.stopPropagation()\n if (this.isPip) {\n this.exitPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: true, to: false })\n this.setAttr('data-state', 'normal')\n } else if (this.player.media.readyState === 4) {\n this.requestPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: false, to: true })\n this.setAttr('data-state', 'pip')\n }\n }\n\n copyStyleIntoPiPWindow (pipWin) {\n const textContent = [...document.styleSheets]\n .map((style) => {\n try {\n return [...style.cssRules].map((rule) => rule.cssText).join('')\n } catch (e) {\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.type = style.type\n link.media = style.media\n link.href = style.href\n pipWin.document.head.appendChild(link)\n }\n return ''\n })\n .filter(Boolean)\n .join('\\n')\n const style = document.createElement('style')\n\n style.textContent = textContent\n pipWin.document.head.appendChild(style)\n }\n\n /*\n * 进入画中画\n */\n requestPIP () {\n const { player, playerConfig, config } = this\n if (!this.isPIPAvailable() || this.isPip) {\n return\n }\n try {\n const { poster } = playerConfig\n if (poster) {\n player.media.poster = Util.typeOf(poster) === 'String' ? poster : poster.poster\n }\n\n if (config.preferDocument && this.isDocPIPAvailable()) {\n const pipOptions = {}\n\n if (config.width && config.height) {\n pipOptions.width = config.width\n pipOptions.height = config.height\n } else {\n const playerRect = player.root.getBoundingClientRect()\n pipOptions.width = playerRect.width\n pipOptions.height = playerRect.height\n }\n\n documentPictureInPicture.requestWindow(pipOptions).then((pipWin) => {\n const { docPiPNode, docPiPStyle } = config\n\n this.enterPIPCallback()\n\n // record original position\n const pipRoot = docPiPNode || player.root\n const parentNode = pipRoot.parentElement\n const previousSibling = pipRoot.previousSibling\n const nextSibling = pipRoot.nextSibling\n\n this.copyStyleIntoPiPWindow(pipWin)\n\n // Make sure player fits in the Picture-in-Picture window.\n const styles = document.createElement('style')\n styles.append('body{padding:0; margin:0;}')\n if (docPiPStyle) {\n let cssContent = ''\n if (typeof docPiPStyle === 'string') {\n cssContent = docPiPStyle\n } else if (typeof docPiPStyle === 'function') {\n cssContent = docPiPStyle.call(config)\n }\n if (cssContent) {\n styles.append(cssContent)\n }\n } else if (pipRoot === player.root) {\n styles.append(`\n .xgplayer{width: 100%!important; height: 100%!important;}\n `)\n }\n pipWin.document.head.append(styles)\n\n // Add player to the PiP window.\n pipWin.document.body.append(pipRoot)\n\n // Listen for the PiP closing event to put the video back.\n pipWin.addEventListener('pagehide', (event) => {\n // Restore nodes to their original location\n if (parentNode) {\n if (nextSibling) {\n parentNode.insertBefore(pipRoot, nextSibling)\n } else if (previousSibling) {\n parentNode.insertBefore(pipRoot, previousSibling.nextSibling)\n } else {\n parentNode.appendChild(pipRoot)\n }\n } else {\n // console.log('无法找到原始父节点')\n }\n\n this.leavePIPCallback()\n }, { once: true })\n })\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('picture-in-picture')\n } else {\n player.media.requestPictureInPicture()\n }\n\n\n return true\n } catch (reason) {\n console.error('requestPiP', reason)\n return false\n }\n }\n\n /**\n * 退出画中画\n */\n exitPIP () {\n const { player } = this\n try {\n if (this.isPIPAvailable() && this.isPip) {\n if (this.isDocPIPAvailable() && documentPictureInPicture?.window) {\n documentPictureInPicture.window.close()\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('inline')\n } else {\n document.exitPictureInPicture()\n }\n }\n return true\n } catch (reason) {\n console.error('exitPIP', reason)\n return false\n }\n }\n\n /**\n * 处于画中画状态\n */\n get isPip () {\n const { player } = this\n return (\n !!(this.isDocPIPAvailable() && documentPictureInPicture?.window) ||\n (document.pictureInPictureElement &&\n document.pictureInPictureElement === player.media) ||\n player.media.webkitPresentationMode === PresentationMode.PIP\n )\n }\n\n isPIPAvailable () {\n const video = this.player.media\n const _isEnabled = Util.typeOf(document.pictureInPictureEnabled) === 'Boolean' ? document.pictureInPictureEnabled : false\n return _isEnabled &&\n ((Util.typeOf(video.disablePictureInPicture) === 'Boolean' && !video.disablePictureInPicture) ||\n (video.webkitSupportsPresentationMode && Util.typeOf(video.webkitSetPresentationMode) === 'Function')) ||\n this.isDocPIPAvailable()\n }\n\n isDocPIPAvailable () {\n return 'documentPictureInPicture' in window && /^(https|file)/.test(location.protocol)\n }\n\n destroy () {\n super.destroy()\n const { player } = this\n player.media.removeEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.removeEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.removeEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n this.exitPIP()\n this.unbind('click', this.btnClick)\n }\n\n render () {\n if (!this.config.showIcon || !this.isPIPAvailable()) {\n return\n }\n return `\n
\n
\n ${xgIconTips(this, 'PIP', this.playerConfig.isHideTips)}\n
`\n }\n}\nexport default PIP\n","/**\n * 下一个按钮组件\n */\nimport Plugin, { POSITIONS, Sniffer, Events } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport Next from '../assets/playNext.svg'\nimport './index.scss'\n\nexport default class PlayNextIcon extends Plugin {\n static get pluginName () {\n return 'playNext'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 1,\n url: null,\n urlList: []\n }\n }\n\n constructor (options) {\n super(options)\n this.idx = -1\n }\n\n afterCreate () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.playNext)\n this.initEvents()\n }\n\n registerIcons () {\n return {\n playNext: Next\n }\n }\n\n initEvents () {\n this.nextHandler = this.hook('nextClick', this.changeSrc)\n const event = Sniffer.device === 'mobile' ? 'touchend' : 'click'\n this.bind(event, this.playNext)\n this.show()\n }\n\n playNext = (e) => {\n const { player } = this\n e.preventDefault()\n e.stopPropagation()\n if (this.idx + 1 < this.config.urlList.length) {\n this.idx++\n this.nextHandler(this.config.urlList[this.idx], this.idx)\n player.emit(Events.PLAYNEXT, this.idx + 1)\n } else {\n this.nextHandler()\n player.emit(Events.PLAYNEXT)\n }\n }\n\n changeSrc (url) {\n const { player } = this\n if (!url) {\n return\n }\n player.pause()\n player.currentTime = 0\n if (player.switchURL) {\n player.switchURL(url)\n } else {\n player.src = url\n }\n player.config.url = url\n player.play()\n }\n\n destroy () {\n this.unbind(['touchend', 'click'], this.playNext)\n }\n\n render () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n return `\n \n
\n
\n ${xgIconTips(this, 'PLAYNEXT_TIPS', this.playerConfig.isHideTips)}\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 e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this._handler)\n }\n\n registerIcons () {\n return {\n download: DownloadSvg\n }\n }\n download = (e) => {\n if (this.isLock) {\n return\n }\n this.emitUserAction(e, 'download')\n const { url } = this.playerConfig\n let dUrl = ''\n if (Util.typeOf(url) === 'String') {\n dUrl = url\n } else if (Util.typeOf(url) === 'Array' && url.length > 0) {\n dUrl = url[0].src\n }\n const newUrl = this.getAbsoluteURL(dUrl)\n downloadUtil(newUrl)\n this.isLock = true\n this.timer = window.setTimeout(() => {\n this.isLock = false\n window.clearTimeout(this.timer)\n this.timer = null\n }, 300)\n }\n\n getAbsoluteURL (url) {\n // Check if absolute URL\n if (!url.match(/^https?:\\/\\//)) {\n const div = document.createElement('div')\n div.innerHTML = `x`\n url = div.firstChild.href\n }\n return url\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.download)\n window.clearTimeout(this.timer)\n this.timer = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n
\n
\n ${xgIconTips(this, 'DOWNLOAD_TIPS', this.playerConfig.isHideTips)}\n
`\n }\n}\n","import { POSITIONS, Events } from '../../plugin'\nimport IconPlugin from '../common/iconPlugin'\nimport './index.scss'\n\nexport default class ScreenShot extends IconPlugin {\n static get pluginName () {\n return 'screenShot'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 5,\n quality: 0.92,\n type: 'image/png',\n format: '.png',\n width: 600,\n height: 337,\n saveImg: true,\n fitVideo: true,\n disable: false,\n name: 'screenshot'\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.screenShot === 'boolean') {\n args.config.disable = !args.player.config.screenShot\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.screenshotIcon)\n const { config } = this\n this.initSize = (data) => {\n if (config.fitVideo) {\n config.width = data.vWidth\n config.height = data.vHeight\n }\n }\n this.once(Events.VIDEO_RESIZE, this.initSize)\n }\n\n onPluginsReady () {\n this.show()\n this.onClickBtn = this.onClickBtn.bind(this)\n this.bind(['click', 'touchend'], this.onClickBtn)\n }\n\n saveScreenShot (data, filename) {\n const saveLink = document.createElement('a')\n saveLink.href = data\n saveLink.download = filename\n\n let event\n try {\n if (typeof MouseEvent !== 'undefined') {\n event = new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window\n })\n } else {\n event = document.createEvent('MouseEvents')\n event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)\n }\n } catch (e) {\n console.error('MouseEvent unsupported', e)\n }\n\n if (event) {\n saveLink.dispatchEvent(event)\n }\n }\n\n createCanvas (width, height) {\n const canvas = document.createElement('canvas')\n const canvasCtx = canvas.getContext('2d')\n\n this.canvasCtx = canvasCtx\n this.canvas = canvas\n\n canvas.width = width || this.config.width\n canvas.height = height || this.config.height\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingQuality\n canvasCtx.imageSmoothingEnabled = true\n if (canvasCtx.imageSmoothingEnabled) {\n canvasCtx.imageSmoothingQuality = 'high'\n }\n }\n\n onClickBtn (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'shot')\n const { config } = this\n this.shot(config.width, config.height).then((data) => {\n this.emit(Events.SCREEN_SHOT, data)\n if (config.saveImg) {\n this.saveScreenShot(data, config.name + config.format)\n }\n })\n }\n\n shot (width, height, option = { quality: 0.92, type: 'image/png' }) {\n const { config, player } = this\n const quality = option.quality || config.quality\n const type = option.type || config.type\n return new Promise((resolve, reject) => {\n let canvas = null\n let canvasCtx\n\n if (player.media.canvas) {\n canvas = player.media.canvas\n } else {\n if (!this.canvas) {\n this.createCanvas(width, height)\n } else {\n this.canvas.width = width || config.width\n this.canvas.height = height || config.height\n }\n canvas = this.canvas\n canvasCtx = this.canvasCtx\n\n const mediaRatio = player.media.videoWidth / player.media.videoHeight\n const canvasRatio = canvas.width / canvas.height\n const sx = 0, sy = 0, sw = player.media.videoWidth, sh = player.media.videoHeight\n let dx, dy, dw, dh\n\n if (mediaRatio > canvasRatio) {\n dw = canvas.width\n dh = canvas.width / mediaRatio\n dx = 0\n dy = Math.round((canvas.height - dh) / 2)\n } else if (mediaRatio === canvasRatio) {\n dw = canvas.width\n dh = canvas.height\n dx = 0\n dy = 0\n } else if (mediaRatio < canvasRatio) {\n dw = canvas.height * mediaRatio\n dh = canvas.height\n dx = Math.round((canvas.width - dw) / 2)\n dy = 0\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage\n canvasCtx.drawImage(player.media, sx, sy, sw, sh, dx, dy, dw, dh)\n }\n let src = canvas.toDataURL(type, quality).replace(type, 'image/octet-stream')\n src = src.replace(/^data:image\\/[^;]+/, 'data:application/octet-stream')\n resolve(src)\n })\n }\n\n registerIcons () {\n return {\n screenshotIcon: null\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.onClickBtn)\n this.off(Events.VIDEO_RESIZE, this.initSize)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const className = this.icons.screenshotIcon ? 'xgplayer-icon' : 'xgplayer-icon btn-text'\n const langKey = 'SCREENSHOT'\n return `\n \n
\n ${this.icons.screenshotIcon ? '' : `${this.i18n[langKey]}`}\n
\n
`\n }\n}\n","import Plugin, { Util } from '../../plugin'\n\nexport default class OptionList {\n constructor (args) {\n this.config = args.config\n this.parent = args.root\n this.root = Util.createDom('ul', '', {}, `xg-options-list xg-list-slide-scroll ${this.config.className}`)\n args.root.appendChild(this.root)\n const { maxHeight } = this.config\n if (maxHeight) {\n this.setStyle({ maxHeight })\n }\n this.onItemClick = this.onItemClick.bind(this)\n this.renderItemList()\n const eventName = this.config.domEventType === 'touch' ? '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\n show () {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'active')\n }\n\n hide () {\n Util.removeClass(this.root, 'active')\n Util.addClass(this.root, 'hide')\n }\n\n setStyle (style) {\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\n }\n\n destroy () {\n if (this._delegates) {\n this._delegates.map(item => {\n item.destroy && item.destroy()\n })\n this._delegates = null\n }\n this.root.innerHTML = null\n this.parent.removeChild(this.root)\n this.root = null\n }\n}\n","\nimport Plugin, { Events, Util, Sniffer, POSITIONS } from '../../plugin'\nimport OptionList from './optionList'\n// import './optionsIcon.scss'\n\nconst LIST_TYPES = {\n SIDE: 'side',\n MIDDLE: 'middle',\n DEFAULT: 'default'\n}\n\nconst TOGGLE_MODES = {\n CLICK: 'click',\n HOVER: 'hover'\n}\n\nfunction getListClassName (listType, position) {\n if (listType === LIST_TYPES.SIDE) {\n return position === POSITIONS.CONTROLS_LEFT ? 'xg-side-list xg-left-side' : 'xg-side-list xg-right-side'\n } else {\n return ''\n }\n}\n\n/**\n * @typedef {{\n * isShow?: boolean,\n * index?: number,\n * list?: Array,\n * listType?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IOptionsIconConfig\n */\n\nlet IS_MOBILE = Sniffer.device === 'mobile'\n\nexport default class OptionsIcon extends Plugin {\n static get pluginName () {\n return 'optionsIcon'\n }\n\n /**\n * @type { IOptionsIconConfig }\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 100,\n list: [],\n listType: 'default', // 模式 side-右侧边栏 middle-中间显示\n listStyle: {},\n hidePortrait: true,\n isShowIcon: false,\n isItemClickHide: true, // 列表点击之后是否隐藏列表\n toggleMode: TOGGLE_MODES.HOVER, // 激活状态切换模式\n heightLimit: true\n }\n }\n\n constructor (args) {\n super(args)\n this.isIcons = false\n this.isActive = false\n this.curValue = null // 当前值\n this.curIndex = 0\n }\n\n updateLang (value) {\n this.renderItemList(this.config.list, this.curIndex)\n }\n\n afterCreate () {\n const { config } = this\n this.initIcons()\n IS_MOBILE = IS_MOBILE || this.domEventType === 'touch'\n if (IS_MOBILE && Sniffer.device === 'mobile' && config.listType === LIST_TYPES.DEFAULT) {\n config.listType = LIST_TYPES.SIDE\n }\n\n config.hidePortrait && Util.addClass(this.root, 'portrait')\n\n this.on([Events.VIDEO_RESIZE, Events.FULLSCREEN_CHANGE], () => {\n this._resizeList()\n })\n\n this.once(Events.CANPLAY, () => {\n if (config.list && config.list.length > 0) {\n this.renderItemList(config.list)\n this.show()\n }\n })\n // 移动端控制栏和列表互斥\n IS_MOBILE && this.on(Events.PLAYER_FOCUS, () => {\n if (!this.isActive) {\n return\n }\n this.optionsList && this.optionsList.hide()\n this.isActive = false\n })\n\n if (IS_MOBILE) {\n config.toggleMode = TOGGLE_MODES.CLICK\n this.activeEvent = 'touchend'\n } else {\n this.activeEvent = config.toggleMode === TOGGLE_MODES.CLICK ? 'click' : 'mouseenter'\n }\n\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.bind(this.activeEvent, this.switchActiveState)\n } else {\n this.bind(this.activeEvent, this.onEnter)\n this.bind('mouseleave', this.onLeave)\n }\n this.isIcons && this.bind('click', this.onIconClick)\n }\n\n initIcons () {\n const { icons } = this\n const _c = Object.keys(icons)\n let _isIcons = false\n if (_c.length > 0) {\n _c.forEach(key => {\n this.appendChild('.xgplayer-icon', icons[key])\n !_isIcons && (_isIcons = icons[key])\n })\n this.isIcons = _isIcons\n }\n if (_isIcons) {\n return\n }\n this.appendChild('.xgplayer-icon', Util.createDom('span', '', {}, 'icon-text'))\n Util.addClass(this.find('.xgplayer-icon'), 'btn-text')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length < 2) {\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n getTextByLang (item, key, lang) {\n if (item === undefined) {\n return ''\n }\n const { list } = this.config\n !lang && (lang = this.player.lang)\n key = (!key || Util.isUndefined(item[key])) ? 'text' : key\n typeof item === 'number' && (item = list[item])\n try {\n if (typeof item[key] === 'object') {\n return item[key][lang] || item[key].en\n } else {\n return item[key]\n }\n } catch (err) {\n console.warn(err)\n return ''\n }\n }\n\n onEnter = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n this.switchActiveState(e)\n }\n\n switchActiveState = (e) => {\n e.stopPropagation()\n const { toggleMode } = this.config\n if (toggleMode === TOGGLE_MODES.CLICK) {\n this.toggle(!this.isActive)\n } else {\n this.toggle(true)\n }\n }\n\n onLeave = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n if (this.config.listType !== LIST_TYPES.SIDE) {\n this.isActive && this.toggle(false)\n }\n }\n\n onListEnter = (e) => {\n // console.log('onListEnter')\n this.enterType = 2\n }\n\n onListLeave = (e) => {\n // console.log('onListLeave', e.target)\n this.enterType = 0\n this.isActive && this.toggle(false)\n }\n\n // 状态切换\n toggle (isActive) {\n if (isActive === this.isActive || this.config.disable) return\n const { controls } = this.player\n const { listType } = this.config\n if (isActive) {\n listType === LIST_TYPES.SIDE ? controls.blur() : controls.focus()\n this.optionsList && this.optionsList.show()\n } else {\n listType === LIST_TYPES.SIDE ? controls.focus() : controls.focusAwhile()\n this.optionsList && this.optionsList.hide()\n }\n this.isActive = isActive\n }\n\n // 列表点击回调\n onItemClick (e, data) {\n e.stopPropagation()\n const { listType, list } = this.config\n this.curIndex = data.to.index\n this.curItem = list[this.curIndex]\n this.changeCurrentText()\n const { isItemClickHide } = this.config;\n (isItemClickHide || IS_MOBILE || listType === LIST_TYPES.SIDE) && this.toggle(false)\n }\n\n onIconClick (e) {\n //\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n if (!curItem) return\n this.find('.icon-text').innerHTML = this.getTextByLang(curItem, 'iconText')\n }\n\n renderItemList (itemList, curIndex) {\n const { config, optionsList, player } = this\n if (typeof curIndex === 'number') {\n this.curIndex = curIndex\n this.curItem = config.list[curIndex]\n }\n\n if (optionsList) {\n optionsList.renderItemList(itemList)\n this.changeCurrentText()\n return\n }\n\n const options = {\n config: {\n data: itemList || [],\n className: getListClassName(config.listType, config.position), // config.listType === LIST_TYPES.SIDE ? 'xg-right-side' : '',\n onItemClick: (e, data) => {\n this.onItemClick(e, data)\n },\n domEventType: IS_MOBILE ? 'touch' : 'mouse'\n },\n root: config.listType === LIST_TYPES.SIDE ? (player.innerContainer || player.root) : this.root\n }\n\n if (this.config.isShowIcon) {\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n if (_maxH && config.heightLimit) {\n options.config.maxHeight = `${_maxH}px`\n }\n this.optionsList = new OptionList(options)\n this.changeCurrentText()\n this.show()\n }\n this._resizeList()\n }\n\n _resizeList () {\n if (!this.config.heightLimit) {\n return\n }\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = this.config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n this.optionsList && this.optionsList.setStyle({ maxHeight: `${_maxH}px` })\n }\n\n destroy () {\n const { config } = this\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.unbind(this.activeEvent, this.switchActiveState)\n } else {\n this.unbind(this.activeEvent, this.onEnter)\n this.unbind('mouseleave', this.onLeave)\n }\n this.isIcons && this.unbind('click', this.onIconClick)\n if (this.optionsList) {\n this.optionsList.destroy()\n this.optionsList = null\n }\n }\n\n render () {\n if (!this.config.isShowIcon) {\n return\n }\n return `\n
\n
\n
`\n }\n}\n","import { Events, POSITIONS, Util } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {import('../../defaultConfig').IDefinition} IDefinition\n */\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array,\n * defaultDefinition?: any,\n * disable?: any,\n * hidePortrait?: boolean,\n * className?: string\n * }} IDefinitionConfig\n */\nexport default class DefinitionIcon extends OptionsIcon {\n static get pluginName () {\n return 'definition'\n }\n\n /**\n * @type IDefinitionConfig\n */\n static get defaultConfig () {\n return {\n ...OptionsIcon.defaultConfig,\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n list: [],\n defaultDefinition: '',\n disable: false,\n hidePortrait: false, // Whether to hide in the vertical screen state of the mobile terminal\n className: 'xgplayer-definition',\n isShowIcon: true\n }\n }\n\n beforeCreate (args) {\n const { list } = args.config\n if (Array.isArray(list) && list.length > 0) {\n args.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n }\n }\n\n constructor (args) {\n super(args)\n // 记录切换的时候的播放器状态\n this.curTime = 0\n this.isPaused = true\n }\n\n afterCreate () {\n super.afterCreate()\n this.on('resourceReady', (list) => {\n this.changeDefinitionList(list)\n })\n\n this.on(Events.DEFINITION_CHANGE, (data) => {\n this.renderItemList(this.config.list, data.to)\n })\n if (this.player.definitionList.length < 2) {\n this.hide()\n }\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length < 2){\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n initDefinition () {\n const { list, defaultDefinition } = this.config\n if (list.length > 0) {\n let to = null\n list.map(item => {\n if (item.definition === defaultDefinition) {\n to = item\n }\n })\n if (!to) {\n to = list[0]\n }\n this.changeDefinition(to)\n }\n }\n\n renderItemList (list = this.config.list || [], to) {\n const targetDef = to && to.definition ? to.definition : this.config.defaultDefinition\n if (to) {\n list.forEach((item) => {\n item.selected = false\n })\n }\n let curIndex = 0\n const items = list.map((item, index) => {\n const showItem = {\n ...item,\n showText: this.getTextByLang(item) || item.definition,\n selected: false\n }\n\n if (item.selected || (item.definition\n // eslint-disable-next-line eqeqeq\n && item.definition == targetDef)\n ) {\n showItem.selected = true\n curIndex = index\n }\n return showItem\n })\n super.renderItemList(items, curIndex)\n }\n\n // 对外暴露 切换清晰度\n changeDefinitionList (list) {\n if (!Array.isArray(list)) {\n return\n }\n this.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n this.renderItemList()\n this.config.list.length < 2 ? this.hide() : this.show()\n }\n\n changeDefinition (to, from) {\n this.player.changeDefinition(to, from)\n }\n\n onItemClick (e, data) {\n const { definitionList } = this.player\n super.onItemClick(...arguments)\n this.emitUserAction(e, 'change_definition', { from: data.from, to: data.to })\n for (let i = 0; i < definitionList.length; i++) {\n if (data.to && definitionList[i].definition === data.to.definition) {\n data.to.url = definitionList[i].url\n }\n\n if (data.from && (definitionList[i].definition === data.from.definition)) {\n data.from.url = definitionList[i].url\n }\n }\n this.player.changeDefinition(data.to, data.from)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array,\n * className?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IPlaybackRateConfig\n */\n\nexport default class PlaybackRate extends OptionsIcon {\n static get pluginName () {\n return 'playbackRate'\n }\n\n /**\n * @type IPlaybackRateConfig\n */\n static get defaultConfig () {\n return {\n ...OptionsIcon.defaultConfig,\n position: POSITIONS.CONTROLS_RIGHT,\n index: 4,\n list: [2, 1.5, 1, 0.75, 0.5],\n className: 'xgplayer-playbackrate',\n isShowIcon: true,\n hidePortrait: false\n }\n }\n\n constructor (args) {\n super(args)\n this.curRate = 1\n }\n\n beforeCreate (args) {\n const { playbackRate } = args.player.config\n const list = !playbackRate ? [] : Array.isArray(playbackRate) ? playbackRate : args.config.list\n if (Array.isArray(list)) {\n args.config.list = list.map(item => {\n if (typeof item === 'number') {\n item = {\n rate: item,\n text: `${item}x`\n }\n } else if (!item.text && item.rate) {\n item.text = `${item.rate}x`\n }\n return item\n })\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.on(Events.RATE_CHANGE, () => {\n if (this.curValue === this.player.playbackRate) {\n return\n }\n this.renderItemList()\n })\n this.renderItemList()\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\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(e, _data)\n const target = e.delegateTarget\n const rate = Number(target.getAttribute('rate'))\n if (!rate || rate === this.curValue) {\n return false\n }\n const props = {\n playbackRate: {\n from: this.player.playbackRate,\n to: rate\n }\n }\n this.emitUserAction(e, 'change_rate', { props })\n this.curValue = rate\n this.player.playbackRate = rate\n }\n\n renderItemList () {\n const playbackRate = this.player.playbackRate || 1\n this.curValue = playbackRate\n let curIndex = -1\n const items = this.config.list.map((item, index) => {\n const itemInfo = {\n rate: item.rate\n }\n if (itemInfo.rate === playbackRate) {\n itemInfo.selected = true\n curIndex = index\n }\n itemInfo.showText = this.getTextByLang(item)\n return itemInfo\n })\n super.renderItemList(items, curIndex)\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n let _text = ''\n // 在列表中没有匹配的选项的时候,默认展示`${playbackRate}x'\n if (!curItem || this.curIndex < 0) {\n _text = `${this.player.playbackRate}x`\n } else {\n _text = this.getTextByLang(curItem, 'iconText')\n }\n this.find('.icon-text').innerHTML = _text\n }\n\n destroy () {\n super.destroy()\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport CssFullSceenSvg from '../assets/requestCssFull.svg'\nimport ExitCssFullSceenSvg from '../assets/exitCssFull.svg'\nimport './index.scss'\n\n/**\n * @typedef { {\n * position: string,\n * index: number,\n * disable: boolean,\n * target: null | HTMLElement,\n * [propName: string]: any\n * } } ICssConfig\n */\n\nexport default class CssFullScreen extends IconPlugin {\n static get pluginName () {\n return 'cssFullscreen'\n }\n\n /**\n * @type ICssConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 1,\n disable: false,\n target: null\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.cssFullscreen === 'boolean') {\n args.config.disable = !args.player.config.cssFullscreen\n }\n }\n\n afterCreate () {\n super.afterCreate()\n if (this.config.disable) {\n return\n }\n\n if (this.config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n this.initIcons()\n this.on(Events.CSS_FULLSCREEN_CHANGE, (isCssfullScreen) => {\n this.animate(isCssfullScreen)\n })\n this.btnClick = this.btnClick.bind(this)\n this.handleCssFullscreen = this.hook('cssFullscreen_change', this.btnClick, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this.handleCssFullscreen)\n }\n\n initIcons () {\n const { icons } = this\n const contentIcon = this.find('.xgplayer-icon')\n contentIcon.appendChild(icons.cssFullscreen)\n contentIcon.appendChild(icons.exitCssFullscreen)\n }\n\n btnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n const { isCssfullScreen } = this.player\n this.emitUserAction(e, 'switch_cssfullscreen', { cssfullscreen: isCssfullScreen })\n if (!isCssfullScreen) {\n this.player.getCssFullscreen()\n } else {\n this.player.exitCssFullscreen()\n }\n }\n\n animate (isFullScreen) {\n if (!this.root) {\n return\n }\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n this.switchTips(isFullScreen)\n }\n\n switchTips (isFullScreen) {\n const { i18nKeys } = this\n const tipDom = this.find('.xg-tips')\n tipDom && this.changeLangTextKey(tipDom, isFullScreen ? i18nKeys.EXITCSSFULLSCREEN_TIPS : i18nKeys.CSSFULLSCREEN_TIPS)\n }\n\n registerIcons () {\n return {\n cssFullscreen: { icon: CssFullSceenSvg, class: 'xg-get-cssfull' },\n exitCssFullscreen: { icon: ExitCssFullSceenSvg, class: 'xg-exit-cssfull' }\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n
\n
\n ${xgIconTips(this, 'CSSFULLSCREEN_TIPS', this.playerConfig.isHideTips)}\n
`\n }\n}\n","import Plugin, { Events } from '../../plugin'\nimport './index.scss'\n\nexport default class ErrorPlugin extends Plugin {\n static get pluginName () {\n return 'error'\n }\n\n afterCreate () {\n this.clickHandler = this.hook('errorRetry', this.errorRetry, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.onError = this.hook('showError', this.handleError)\n\n this.bind('.xgplayer-error-refresh', 'click', this.clickHandler)\n\n this.on(Events.ERROR, (error) => {\n this.onError(error)\n })\n }\n\n errorRetry (e) {\n this.emitUserAction(e, 'error_retry', {})\n this.player.retry()\n }\n\n handleError (error = {}) {\n const { player } = this\n const type = error.errorType\n let errorNote = player.errorNote ? this.i18n[player.errorNote] : ''\n if (!errorNote) {\n switch (type) {\n case 'decoder':\n errorNote = this.i18n.MEDIA_ERR_DECODE\n break\n case 'network':\n errorNote = this.i18n.MEDIA_ERR_NETWORK\n break\n default:\n errorNote = this.i18n.MEDIA_ERR_SRC_NOT_SUPPORTED\n }\n }\n this.find('.xgplayer-error-text').innerHTML = errorNote\n this.find('.xgplayer-error-tips').innerHTML = `${this.i18n.REFRESH_TIPS}${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 /**\n * @type {number}\n */\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.showPrompt(...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 showPrompt (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 _updateDotDom (iSpot, dotDom) {\n if (!dotDom) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n dotDom.setAttribute('data-text', iSpot.text)\n dotDom.setAttribute('data-time', iSpot.time)\n if (ret.isMini) {\n Util.addClass(dotDom, 'mini')\n } else {\n Util.removeClass(dotDom, 'mini')\n }\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n },\n initDots () {\n this._ispots.map(item => {\n this.createDot(item, false)\n })\n this.ispotsInit = true\n },\n\n /**\n * 创建一个故事点\n * @param { object } iSpot\n * @param { boolean } isNew\n */\n createDot (iSpot, isNew = true) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (isNew) {\n mergeISPOT(iSpot)\n this._ispots.push(iSpot)\n }\n if (!this.ispotsInit && isNew) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n let className = `xgspot_${iSpot.id} xgplayer-spot`\n ret.isMini && (className += ' mini')\n const _t = iSpot.template ? `
${iSpot.template}
` : ''\n const dotDom = Util.createDom('xg-spot', _t, {\n 'data-text': iSpot.text,\n 'data-time': iSpot.time,\n 'data-id': iSpot.id\n }, className)\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n progress.outer && progress.outer.appendChild(dotDom)\n this.positionDot(dotDom, iSpot.id)\n },\n\n /**\n * 根据id查找节点\n * @param {string} id\n */\n findDot (id) {\n if (!this.player.plugins.progress) {\n return\n }\n const ret = this._ispots.filter((cur, index) => {\n return cur.id === id\n })\n return ret.length > 0 ? ret[0] : null\n },\n\n /**\n * 更新故事点\n * @param {any} iSpot\n * @param {boolean} needShow\n */\n updateDot (iSpot, needShow = false) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const dot = this.findDot(iSpot.id)\n if (dot) {\n Object.keys(iSpot).map(key => {\n dot[key] = iSpot[key]\n })\n }\n if (!this.ispotsInit) {\n return\n }\n const dotDom = progress.find(`xg-spot[data-id=\"${iSpot.id}\"]`)\n if (!dotDom) {\n return\n }\n this._updateDotDom(iSpot, dotDom)\n if (needShow) {\n this.showDot(iSpot.id)\n }\n },\n\n /**\n * 删除某个故事点\n * @param {string | number } id\n */\n deleteDot (id) {\n const { _ispots } = this\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const del = []\n for (let i = 0; i < _ispots.length; i++) {\n if (_ispots[i].id === id) {\n del.push(i)\n }\n }\n const len = del.length\n for (let i = len - 1; i >= 0; i--) {\n _ispots.splice(del[i], 1)\n if (this.ispotsInit) {\n const dotDom = progress.find(`xg-spot[data-id=\"${id}\"]`)\n if (dotDom) {\n dotDom.parentElement.removeChild(dotDom)\n }\n }\n }\n },\n\n /**\n * 移除所有的故事点\n */\n deleteAllDots () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this.ispotsInit) {\n this._ispots = []\n return\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n for (let i = dotDoms.length - 1; i >= 0; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n this._ispots = []\n },\n /**\n * 批量全部更新当前故事点\n * @param {Array} iSpots\n */\n updateAllDots (iSpots = []) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this.ispotsInit) {\n this._ispots = iSpots\n return\n }\n this._ispots = []\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n const len = dotDoms.length\n if (len > iSpots.length) {\n for (let i = len - 1; i > iSpots.length - 1; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n }\n iSpots.forEach((ispot, index) => {\n if (index < len) {\n dotDoms[index].setAttribute('data-id', `${ispot.id}`)\n this._ispots.push(ispot)\n this.updateDot(ispot)\n } else {\n this.createDot(ispot)\n }\n })\n },\n\n positionDots () {\n const { _ispots, playerSize } = this\n const { sizeInfo } = this.player\n const { progress } = this.player.plugins\n if (!progress || sizeInfo.width === playerSize.width) {\n return\n }\n playerSize.width = sizeInfo.width\n playerSize.left = sizeInfo.left\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n dotDom && this.positionDot(dotDom, item.id)\n })\n },\n\n positionDot (dotDom, id) {\n const _pop = Util.findDom(dotDom, '.xgplayer-spot-pop')\n if (!_pop) {\n return\n }\n const pRect = this.playerSize\n\n const rect1 = dotDom.getBoundingClientRect()\n const rect = _pop.getBoundingClientRect()\n const _left = rect1.left - pRect.left\n const _diff = pRect.width - _left - rect1.width / 2\n if (_left < rect.width / 2 || pRect.width < rect.width) {\n const t = rect.width / 2 - _left\n _pop.style.left = `${t}px`\n } else if (_diff < rect.width / 2) {\n const t = _diff - rect.width / 2 + rect1.width / 2\n _pop.style.left = `${t}px`\n } else {\n _pop.style.left = '50%'\n }\n },\n\n updateDuration () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const { _ispots } = this\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n this._updateDotDom(item, dotDom)\n })\n },\n\n getAllDotsDom () {\n const { progress } = this.player.plugins\n if (!progress) {\n return []\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n return dotDoms\n },\n\n getDotDom (id) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n return progress.find(`xg-spot[data-id=\"${id}\"]`)\n }\n}\n\nexport default function initDotsAPI (plugin) {\n const { config, player } = plugin\n Object.keys(APIS).map(item => {\n plugin[item] = APIS[item].bind(plugin)\n })\n const ispots = player.config.progressDot || config.ispots || []\n plugin._ispots = ispots.map(item => {\n mergeISPOT(item)\n return item\n })\n plugin.ispotsInit = false\n plugin.playerSize = {\n left: player.sizeInfo.left,\n width: player.sizeInfo.width\n }\n plugin.on(Events.DURATION_CHANGE, () => {\n if (!plugin.ispotsInit) {\n plugin.initDots()\n } else {\n // 更新节点\n plugin.updateDuration()\n }\n })\n plugin.on(Events.VIDEO_RESIZE, () => {\n plugin.positionDots()\n })\n}\n","import Plugin, { Util, Sniffer, Events } from '../../plugin'\nimport initDotsAPI from './dotsApi'\nimport './index.scss'\n/**\n * @typedef {{\n * miniWidth?: number, // 故事点显示最小宽度\n * ispots?: Array<{ //故事点列表\n * time?: number, // 进度条在此时间戳打点 单位为s\n * text?: string, // 打点处的自定义文案\n * id?: number | string, // 标记唯一标识,用于删除的时候索引\n * duration:? number, // 进度条标识点的时长 默认1s【可选】单位为s\n * color?: string, // 进度条标识点的显示颜色【可选】\n * style?: { [propName: string]: any }, // 指定样式\n * width?: number,\n * height?: number\n * }>,\n * defaultText?: '', // 故事点hover默认文案\n * isFocusDots?: true, //\n * isShowThumbnail?: true, // 是否显示预览图\n * isShowCoverPreview?: false, // 进度条拖动时是否显示播放区域预览图\n * mode?: 'short' | 'production', // short // production\n * [propName: string]: any\n * }} IProgressPreviewConfig\n */\n\nconst CALLBACK_MAP = {\n dragmove: 'onProgressMove',\n dragstart: 'onProgressDragStart',\n dragend: 'onProgressDragEnd',\n click: 'onProgressClick',\n mouseover: 'onProgressMouseOver',\n mouseenter: 'onProgressMouseOver'\n}\n\n/** */\nexport default class ProgressPreview extends Plugin {\n constructor (args) {\n super(args)\n this._ispots = []\n this.videoPreview = null\n this.videothumbnail = null\n this.thumbnail = null\n this.timeStr = ''\n this._state = {\n now: 0,\n f: false\n }\n }\n\n static get pluginName () {\n return 'progresspreview'\n }\n\n /**\n * @type IProgressPreviewConfig\n */\n static get defaultConfig () {\n return {\n index: 1,\n miniWidth: 6, // 故事点显示最小宽度\n ispots: [], // 故事点列表\n defaultText: '', // 故事点hover默认文案\n isFocusDots: true, //\n isHideThumbnailHover: true, // 是否在hover在预览图的时候隐藏\n isShowThumbnail: true, // 是否显示预览图\n isShowCoverPreview: false, // 进度条拖动时是否显示播放区域预览图\n mode: '', // short // production\n disable: false,\n width: 160, // 显示宽度\n height: 90 // 显示高度\n }\n }\n\n beforeCreate (args) {\n const progress = args.player.plugins.progress\n if (progress) {\n args.root = progress.root\n }\n }\n\n afterCreate () {\n this._curDot = null\n this.handlerSpotClick = this.hook('spotClick', (_event, data) => {\n if (data.seekTime) {\n this.player.seek(data.seekTime)\n }\n })\n this.transformTimeHook = this.hook('transformTime', (time) => {\n this.setTimeContent(Util.format(time))\n })\n initDotsAPI(this)\n\n this.on(Events.DURATION_CHANGE, () => {\n this.show()\n })\n if (this.config.disable) {\n this.disable()\n }\n // 用于进度条预览的扩展\n this.extTextRoot = this.find('.xg-spot-ext-text')\n }\n\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n }\n\n onPluginsReady () {\n const { player } = this\n if (!player.plugins.progress) {\n return\n }\n this.previewLine = this.find('.xg-spot-line')\n this.timePoint = this.find('.xgplayer-progress-point')\n this.timeText = this.find('.xg-spot-time')\n this.tipText = this.find('.spot-inner-text')\n\n this._hasThumnail = false\n\n this.registerThumbnail()\n\n this.bindEvents()\n }\n\n bindEvents () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n Object.keys(CALLBACK_MAP).map(key => {\n this[CALLBACK_MAP[key]] = this[CALLBACK_MAP[key]].bind(this)\n progress.addCallBack(key, this[CALLBACK_MAP[key]])\n })\n\n if (Sniffer.device === 'mobile') return\n\n this.bind('.xg-spot-info', 'mousemove', this.onMousemove)\n\n this.bind('.xg-spot-info', 'mousedown', this.onMousedown)\n\n this.bind('.xg-spot-info', 'mouseup', this.onMouseup)\n\n const fun = this.hook('previewClick', (...args) => {\n // console.log('args', args)\n })\n\n this.handlerPreviewClick = (e) => {\n e.stopPropagation()\n fun(parseInt(this._state.now * 1000, 10) / 1000, e)\n }\n\n this.bind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n onMousemove = (e) => {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xg-spot-content') && this.config.isHideThumbnailHover) {\n this.player.plugins.progress.onMouseLeave(e)\n return\n }\n if (this._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onMousedown = (e) => {\n if (this.config.disable) {\n return\n }\n if (this._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onMouseup = (e) => {\n if (!this.isDrag) {\n return\n }\n const { progress } = this.player.plugins\n if (progress && progress.pos) {\n progress.onMouseUp(e)\n !progress.pos.isEnter && progress.onMouseLeave(e)\n }\n }\n\n onDotMouseLeave = (e) => {\n if (this.config.disable) {\n return\n }\n this._curDot.removeEventListener('mouseleave', this.onDotMouseLeave)\n this.blurDot(e.target)\n this._curDot = null\n const { progress } = this.player.plugins\n progress && progress.enableBlur()\n this.show()\n }\n\n onProgressMouseOver = (data, e) => {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xgplayer-spot') && !this._curDot) {\n this._curDot = e.target\n this.focusDot(e.target)\n if (this._curDot.children.length > 0) {\n this.hide()\n }\n const { progress } = this.player.plugins\n progress && progress.disableBlur()\n this._curDot.addEventListener('mouseleave', this.onDotMouseLeave)\n }\n }\n\n onProgressMove (data, e) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.updatePosition(data.offset, data.width, data.currentTime, data.e)\n }\n\n onProgressDragStart (data) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.isDrag = true\n this.videoPreview && Util.addClass(this.videoPreview, 'show')\n }\n\n onProgressDragEnd (data) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.isDrag = false\n this.videoPreview && Util.removeClass(this.videoPreview, 'show')\n }\n\n onProgressClick (data, e) {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xgplayer-spot')) {\n e.stopPropagation()\n e.preventDefault();\n ['time', 'id', 'text'].map(key => {\n data[key] = e.target.getAttribute(`data-${key}`)\n })\n data.time && (data.time = Number(data.time))\n this.handlerSpotClick(e, data)\n }\n }\n\n updateLinePos (offset, cwidth) {\n const { root, previewLine, player, config } = this\n const { mode } = player.controls\n const isflex = mode === 'flex'\n let lwidth = root.getBoundingClientRect().width\n // 如果当前预览图宽度获取不到,无法计算位移,不做渲染\n if (!lwidth && this._hasThumnail) {\n return\n }\n lwidth = this._hasThumnail && lwidth < config.width ? config.width : lwidth\n let x = offset - lwidth / 2\n let _t\n if (x < 0 && !isflex) {\n x = 0\n _t = offset - lwidth / 2\n } else if (x > cwidth - lwidth && !isflex) {\n _t = x - (cwidth - lwidth)\n x = cwidth - lwidth\n } else {\n _t = 0\n }\n _t !== undefined && (previewLine.style.transform = `translateX(${_t.toFixed(2)}px)`)\n root.style.transform = `translateX(${x.toFixed(2)}px) translateZ(0)`\n }\n\n updateTimeText (timeStr) {\n const { timeText, timePoint } = this\n timeText.innerHTML = timeStr\n !this.thumbnail && (timePoint.innerHTML = timeStr)\n }\n\n updatePosition (offset, cwidth, time, e) {\n const { root, config, _state } = this\n if (!root) {\n return\n }\n\n // let now = offset / cwidth * player.duration\n // now = now < 0 ? 0 : (now > player.duration ? player.duration : now)\n _state.now = time\n this.transformTimeHook(time)\n const timeStr = this.timeStr\n if (e && e.target && Util.hasClass(e.target, 'xgplayer-spot')) {\n this.showTips(e.target.getAttribute('data-text'), false, timeStr)\n this.focusDot(e.target)\n _state.f = true\n config.isFocusDots && _state.f && (_state.now = parseInt(e.target.getAttribute('data-time'), 10))\n } else if (config.defaultText) {\n _state.f = false\n this.showTips(config.defaultText, true, timeStr)\n } else {\n _state.f = false\n this.hideTips('')\n // this.blurDot()\n }\n this.updateTimeText(timeStr)\n this.updateThumbnails(_state.now)\n this.updateLinePos(offset, cwidth)\n }\n\n /**\n * @description 设置自定义时间显示字符串\n * @param {string} str\n */\n setTimeContent (str) {\n this.timeStr = str\n }\n\n updateThumbnails (time) {\n const { player, videoPreview, config } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, config.width, config.height)\n const rect = videoPreview && videoPreview.getBoundingClientRect()\n this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n registerThumbnail (thumbnailConfig = {}) {\n if (Sniffer.device === 'mobile') {\n return\n }\n const { player, config } = this\n const thumbnail = player.getPlugin('thumbnail')\n if (thumbnail) {\n thumbnail.setConfig(thumbnailConfig)\n }\n if (!thumbnail || !thumbnail.usable || !config.isShowThumbnail) {\n Util.addClass(this.root, 'short-line no-thumbnail')\n return\n } else {\n Util.removeClass(this.root, 'short-line no-thumbnail')\n }\n if (config.mode === 'short') {\n Util.addClass(this.root, 'short-line')\n }\n this._hasThumnail = true\n const tRoot = this.find('.xg-spot-thumbnail')\n this.thumbnail = thumbnail.createThumbnail(tRoot, 'progress-thumbnail')\n if (config.isShowCoverPreview) {\n this.videoPreview = Util.createDom('xg-video-preview', '', {}, 'xgvideo-preview')\n player.root.appendChild(this.videoPreview)\n this.videothumbnail = thumbnail.createThumbnail(this.videoPreview, 'xgvideo-thumbnail')\n }\n this.updateThumbnails(0)\n }\n\n calcuPosition (time, duration) {\n const { progress } = this.player.plugins\n const { player } = this\n const totalWidth = progress.root.getBoundingClientRect().width\n const widthPerSeconds = player.duration / totalWidth * 6\n const ret = {}\n if (time + duration > player.duration) {\n duration = player.duration - time\n }\n ret.left = time / player.duration * 100\n ret.width = duration / player.duration\n ret.isMini = widthPerSeconds > duration\n return {\n left: time / player.duration * 100,\n width: duration / player.duration * 100,\n isMini: duration < widthPerSeconds\n }\n }\n\n showDot (id) {\n const dot = this.findDot(id)\n if (dot) {\n const rect = this.root.getBoundingClientRect()\n const { width } = rect\n const offset = dot.time / this.player.duration * width\n this.updatePosition(offset, width, dot.time)\n }\n }\n\n focusDot (target, id) {\n if (!target) {\n return\n }\n if (!id) {\n id = target.getAttribute('data-id')\n }\n Util.addClass(target, 'active')\n this._activeDotId = id\n }\n\n blurDot (target) {\n if (!target) {\n const id = this._activeDotId\n target = this.getDotDom(id)\n }\n if (!target) {\n return\n }\n Util.removeClass(target, 'active')\n this._activeDotId = null\n }\n\n showTips (text, isDefault, timeStr = '') {\n Util.addClass(this.root, 'no-timepoint')\n if (!text) {\n return\n }\n Util.addClass(this.find('.xg-spot-content'), 'show-text')\n if (isDefault && this.config.mode === 'production') {\n Util.addClass(this.root, 'product')\n this.tipText.textContent = text\n } else {\n Util.removeClass(this.root, 'product')\n this.tipText.textContent = this._hasThumnail ? text : `${timeStr} ${text}`\n }\n }\n\n hideTips () {\n Util.removeClass(this.root, 'no-timepoint')\n this.tipText.textContent = ''\n Util.removeClass(this.find('.xg-spot-content'), 'show-text')\n Util.removeClass(this.root, 'product')\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n Util.removeClass(this.root, 'hide')\n }\n\n enable () {\n const { config, playerConfig } = this\n this.config.disable = false\n this.show()\n if (!this.thumbnail && config.isShowThumbnail) {\n this.registerThumbnail(playerConfig.thumbnail || {})\n }\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n const { progress } = this.player.plugins\n progress && Object.keys(CALLBACK_MAP).map(key => {\n progress.removeCallBack(key, this[CALLBACK_MAP[key]])\n })\n this.videothumbnail = null\n this.thumbnail = null\n this.videoPreview && this.player.root.removeChild(this.videoPreview)\n this.unbind('.xg-spot-info', 'mousemove', this.onMousemove)\n this.unbind('.xg-spot-info', 'mousedown', this.onMousedown)\n this.unbind('.xg-spot-info', 'mouseup', this.onMouseup)\n this.unbind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n render () {\n if (Sniffer.device === 'mobile' || this.playerConfig.isMobileSimulateMode === 'mobile') {\n return ''\n }\n\n return `
\n
\n
\n \n
\n
\n
\n
00:00
\n
\n
\n
`\n }\n}\n","/* eslint-disable camelcase */\nimport BasePlugin, { Util, Events } 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 height: 90, // 缩略图高度\n width: 160, // 缩略图宽度\n scale: 1, // 缩放\n className: '', // 额外添加在dom上的class\n hidePortrait: false // 是否在竖屏的时候隐藏\n }\n }\n\n constructor (args) {\n super(args)\n this.ratio = 1\n this.interval = null\n this._preloadMark = {}\n }\n\n afterCreate () {\n if (this.usable) {\n this.initThumbnail()\n }\n this.on([Events.DURATION_CHANGE], () => {\n const { pic_num, interval } = this.config\n this.usable && (this.interval = interval > 0 ? interval : Math.round(this.player.duration * 1000 / pic_num) / 1000)\n })\n }\n\n setConfig (config) {\n if (!config) {\n return\n }\n const keys = Object.keys(config)\n if (keys.length < 1) {\n return\n }\n keys.forEach(key => {\n this.config[key] = config[key]\n })\n this.usable && this.initThumbnail()\n }\n\n get usable () {\n const { urls, pic_num } = this.config\n return urls && urls.length > 0 && pic_num > 0\n }\n\n initThumbnail () {\n const { width, height, pic_num, interval } = this.config\n this.ratio = width / height * 100\n this.interval = interval || Math.round(this.player.duration / pic_num)\n this._preloadMark = {}\n // this.preload(0)\n // this.preIndex = new Array(urls.length)\n // this.interval = interval || Math.round(this.player.duration / pic_num)\n // this.ratio = width / height * 100\n // className && Util.addClass(this.root, className)\n // hidePortrait && Util.addClass(this.root, 'portrait')\n // width && (this.root.style.width = `${width}px`)\n // height && (this.root.style.height = `${height}px`)\n // this.root.style.backgroundSize = `${width * col}px auto`\n }\n\n getUrlByIndex (index) {\n return index >= 0 && index < this.config.urls.length ? this.config.urls[index] : ''\n }\n\n preload (index) {\n if (this._preloadMark[index]) {\n return\n }\n const { urls } = this.config\n const len = urls.length\n const arr = []\n index > 0 && arr.push(index - 1)\n arr.push(index)\n index > 0 && index < len - 1 && arr.push(index + 1)\n arr.map(item => {\n if (!this._preloadMark[item] && item >= 0 && item < len) {\n this._preloadMark[item] = 1\n Util.preloadImg(urls[item], () => {\n this._preloadMark[item] = 2\n })\n }\n })\n }\n\n getPosition (now, containerWidth = 0, containerHeight = 0) {\n const { pic_num, row, col, width, height } = this.config\n this.interval = Math.round(this.player.duration / pic_num)\n let index = Math.ceil(now / this.interval) // 当前时间对应的图像索引\n index = index > pic_num ? pic_num : index\n const urlIndex = index < row * col ? 0 : (Math.ceil(index / (row * col)) - 1)// 当前图像所在的url索引\n const indexInPage = index - urlIndex * (col * row) // 当前图像在当前url中的索引\n const rowIndex = indexInPage > 0 ? Math.ceil(indexInPage / col) - 1 : 0// 当前图像在当前url中的行索引\n const colIndex = indexInPage > 0 ? indexInPage - rowIndex * col - 1 : 0 // 当前图像在当前url中的列索引\n let swidth = 0 // containerWidth || width\n let sHeight = 0 // swidth * height / width\n\n // 根据入参的宽高适配样式\n if (containerWidth && containerHeight) {\n const per = containerWidth / containerHeight\n if (per < width / height) {\n sHeight = containerHeight\n swidth = sHeight * (width / height)\n // swidth = containerWidth\n // sHeight = swidth / (width / height)\n } else {\n swidth = containerWidth\n sHeight = swidth / (width / height)\n }\n } else if (!containerHeight) {\n swidth = containerWidth || width\n sHeight = swidth / (width / height)\n } else if (!containerWidth) {\n sHeight = containerHeight || height\n swidth = sHeight * (width / height)\n }\n const url = this.getUrlByIndex(urlIndex)\n return {\n urlIndex,\n rowIndex,\n colIndex,\n url,\n height: sHeight,\n width: swidth,\n style: {\n backgroundImage: `url(${url})`,\n backgroundSize: `${swidth * col}px auto`,\n backgroundPosition: `-${colIndex * swidth}px -${rowIndex * sHeight}px`,\n width: `${swidth}px`,\n height: `${sHeight}px`\n }\n }\n }\n\n update (dom, now, containerWidth = 0, containerHeight = 0, customStyle = '') {\n const { pic_num, urls } = this.config\n if (pic_num <= 0 || !urls || urls.length === 0) {\n return\n }\n const pos = this.getPosition(now, containerWidth, containerHeight)\n this.preload(pos.urlIndex)\n\n Object.keys(pos.style).map((key) => {\n dom.style[key] = pos.style[key]\n })\n Object.keys(customStyle).map(key => {\n dom.style[key] = customStyle[key]\n })\n }\n\n // 对外暴露 切换缩略图配置\n changeConfig (newConfig = {}) {\n this.setConfig(newConfig)\n }\n\n createThumbnail (root, className) {\n const dom = Util.createDom('xg-thumbnail', '', {}, `thumbnail ${className}`)\n root && root.appendChild(dom)\n return dom\n }\n}\n","import Plugin, { Events, Util } from '../../plugin'\n\nfunction getBgColor (color) {\n return color ? `background:${color};` : ''\n}\n\nclass MiniProgress extends Plugin {\n static get pluginName () {\n return 'MiniProgress'\n }\n\n static get defaultConfig () {\n return {\n mode: 'auto',\n height: 2\n }\n }\n\n get offsetDuration () {\n return this.playerConfig.customDuration || this.player.offsetDuration || this.player.duration\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : currentTime\n }\n\n afterCreate () {\n if (!this.root) {\n return\n }\n this.on(Events.TIME_UPDATE, this.onTimeupdate)\n this.on(Events.EMPTIED, () => {\n this.reset()\n })\n }\n\n onTimeupdate = () => {\n const { ended } = this.player\n const { offsetDuration } = this\n let time = this.currentTime\n time = Util.adjustTimeByDuration(time, offsetDuration, ended)\n this.update({ played: time }, offsetDuration)\n }\n\n reset () {\n this.update({ played: 0, cached: 0 }, 0)\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 const { commonStyle, miniprogress } = this.playerConfig\n if (!miniprogress) {\n return\n }\n const { mode, height } = this.config\n const _style = {\n cached: getBgColor(commonStyle.cachedColor),\n played: getBgColor(commonStyle.playedColor),\n progress: getBgColor(commonStyle.progressColor),\n height: height > 0 && height !== 2 ? `height: ${height}px;` : ''\n }\n const stateClass = mode === 'show' ? 'xg-mini-progress-show' : ''\n return `\n \n \n `\n }\n}\n\nexport default MiniProgress\n","import Plugin, { Events, Util, Sniffer } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nimport './index.scss'\n\nconst MODES = {\n REAL_TIME: 'realtime',\n FIRST_FRAME: 'firstframe',\n FRAME_RATE: 'framerate',\n POSTER: 'poster'\n}\n\nfunction nowTime () {\n try {\n return parseInt(window.performance.now(), 10)\n } catch (e) {\n return new Date().getTime()\n }\n}\n\n/**\n * Check whether the current environment supports canvas\n * @returns { boolean }\n */\nfunction checkIsSupportCanvas () {\n try {\n const ctx = document.createElement('canvas').getContext\n if (ctx) {\n return true\n }\n return false\n } catch (e) {\n return false\n }\n}\n\n/**\n * @typedef { {\n * disable?: boolean,\n * mode?: \"realtime\" | \"firstframe\" | \"framerate\",\n * frameRate?: number\n * filter?: string,\n * addMask?: boolean,\n * maskBg?: string,\n * multiple? : number,\n * [propName: string]: any\n * } } IDynamicBgConfig\n */\n\nlet isSupportCanvas = null\nclass DynamicBg extends Plugin {\n static get pluginName () {\n return 'dynamicBg'\n }\n\n /**\n * @type IDynamicBgConfig\n */\n static get defaultConfig () {\n return {\n isInnerRender: false,\n disable: true,\n index: -1,\n /**\n * Rendering method\n * realtime - Realtime rendering\n * firstframe - Render only the first frame\n * framerate - Render by frame\n * poster - Render by poster only\n */\n mode: 'framerate',\n frameRate: 10, // Frame rate when mode=framerate\n filter: 'blur(50px)', // Filter settings\n startFrameCount: 2, // 起始连续渲染次数\n startInterval: 0, // 初始渲染间隔\n addMask: true, // Whether need a mask\n multiple: 1.2, // 画面放大倍数\n maskBg: 'rgba(0,0,0,0.7)' // Mask background color\n }\n }\n\n /**\n * @type {boolean}\n * @description Does the current environment support Canvas\n */\n static get isSupport () {\n if (typeof isSupportCanvas === 'boolean') {\n return isSupportCanvas\n }\n isSupportCanvas = checkIsSupportCanvas()\n return isSupportCanvas\n }\n\n static supportCanvasFilter () {\n return !(Sniffer.browser === 'safari' || Sniffer.browser === 'firefox')\n }\n\n afterCreate () {\n if (this.playerConfig.dynamicBg === true) {\n this.config.disable = false\n }\n if (!DynamicBg.isSupport) {\n this.config.disable = true\n }\n const { disable, mode, frameRate } = this.config\n if (disable) {\n return\n }\n /**\n * @private\n */\n this._pos = {\n width: 0,\n height: 0,\n rwidth: 0,\n rheight: 0,\n x: 0,\n y: 0,\n pi: 0\n }\n /**\n * @readonly\n */\n this.isStart = false\n\n this._isLoaded = false\n /**\n * @readonly\n */\n this.videoPI = 0\n /**\n * @readonly\n */\n this.preTime = 0\n /**\n * @readonly\n */\n this.interval = parseInt(1000 / frameRate, 10)\n\n /**\n * @readonly\n */\n this.canvas = null\n /**\n * @readonly\n */\n this.canvasCtx = null\n\n this._frameCount = 0\n\n this._loopType = this.config.mode !== MODES.REAL_TIME && this.interval >= 1000 ? 'timer' : 'animation'\n\n this.once(Events.COMPLETE, () => {\n if (!this.player) {\n return\n }\n this.init()\n this.renderByPoster()\n if (!this.player.paused) {\n this.start()\n }\n })\n\n if (mode === MODES.POSTER) {\n return\n }\n\n if (mode !== MODES.FIRST_FRAME) {\n this.on(Events.EMPTIED, () => {\n this.stop()\n })\n this.on(Events.PLAY, () => {\n const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\n })\n this.on(Events.PAUSE, () => {\n this.stop()\n })\n }\n\n this.on(Events.LOADED_DATA, this.onLoadedData)\n this.on(Events.LOAD_START, () => {\n this._isLoaded = false\n this.stop()\n })\n document.addEventListener('visibilitychange', this.onVisibilitychange)\n }\n\n setConfig (config) {\n Object.keys(config).forEach(key => {\n if (key === 'root' && config[key] !== this.config[key]) {\n this.reRender(config[key])\n } else if (key === 'frameRate') {\n this.interval = parseInt(1000 / config[key], 10)\n } else if (key === 'disable' && config[key]) {\n this.stop()\n }\n this.config[key] = config[key]\n })\n }\n\n onLoadedData = (e) => {\n if (!this.player) { return }\n this._frameCount = this.config.startFrameCount\n this.stop()\n this.renderOnTimeupdate(e)\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n this.on(Events.TIME_UPDATE, this.renderOnTimeupdate)\n }\n\n onVisibilitychange = (e) => {\n if (document.visibilityState === 'visible') {\n this._checkIfCanStart() && this.start()\n } else if (document.visibilityState === 'hidden') {\n this.stop()\n }\n }\n\n /**\n * @private\n * 初始化 canvas对象并使用海报图先渲染首帧w11\n */\n init (_root) {\n const { player, config } = this\n this.canvasFilter = DynamicBg.supportCanvasFilter()\n try {\n // 保证节点插入到video之前\n let parent = _root || config.root\n if (!parent) {\n parent = !config.isInnerRender ? player.root : (player.innerContainer || player.root)\n }\n parent.insertAdjacentHTML('afterbegin',\n `
\n
`)\n this.root = parent.children[0]\n this.canvas = this.find('canvas')\n // safari中canvas filter不生效, 使用css滤镜\n if (!this.canvasFilter) {\n this.canvas.style.filter = config.filter\n this.canvas.style.webkitFilter = config.filter\n }\n this.mask = this.find('xgmask')\n\n config.addMask && (this.mask.style.background = config.maskBg)\n this.canvasCtx = this.canvas.getContext('2d')\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n reRender (root) {\n const { disable } = this.config\n if (!disable && !this.root) {\n return\n }\n this.stop()\n const _p = this.root ? this.root.parentElement : null\n if (_p !== root) {\n _p.removeChild(this.root)\n }\n if (!root) {\n this.root = null\n return\n }\n this.init(root)\n this.renderOnce()\n const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\n }\n\n /**\n * Check whether the current video object supports screenshots\n * @param { Object } video\n * @returns { DomElement | null }\n */\n checkVideoIsSupport (video) {\n if (!video) {\n return null\n }\n const _tVideo = video && video instanceof window.HTMLVideoElement ? video : (video.canvas ? video.canvas : (video.flyVideo ? video.flyVideo : null))\n if (_tVideo && !(Sniffer.browser === 'safari' && Util.isMSE(_tVideo))) {\n return _tVideo\n }\n\n const _tagName = _tVideo ? _tVideo.tagName.toLowerCase() : ''\n if (_tagName === 'canvas' || _tagName === 'img') {\n return _tVideo\n }\n\n return null\n }\n\n renderByPoster () {\n const { poster } = this.playerConfig\n if (poster) {\n const url = Util.typeOf(poster) === 'String' ? poster : (Util.typeOf(poster.poster) === 'String' ? poster.poster : null)\n this.updateImg(url)\n }\n }\n\n renderOnTimeupdate = (e) => {\n if (this._frameCount > 0) {\n this.renderOnce()\n this._frameCount--\n } else {\n this._isLoaded = true\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n const { startInterval } = this.config\n !this.player.paused && this._checkIfCanStart() && this.start(0, startInterval)\n }\n }\n\n _checkIfCanStart () {\n const { mode } = this.config\n return this._isLoaded && !this.player.paused && mode !== MODES.FIRST_FRAME && mode !== MODES.POSTER\n }\n\n /**\n * just render once\n * @returns\n */\n renderOnce () {\n const video = this.player.video\n if (!video.videoWidth || !video.videoHeight) {\n return\n }\n this.videoPI = parseInt(video.videoWidth / video.videoHeight * 100, 10)\n const _sVideo = this.checkVideoIsSupport(video)\n // console.log('>>>renderOnce, update', _sVideo, this.videoPI)\n _sVideo && this.update(_sVideo, this.videoPI)\n }\n\n start = (time, interval) => {\n const video = this.player.video\n const _now = nowTime()\n const _sVideo = this.checkVideoIsSupport(video)\n if (!_sVideo || !this.canvasCtx) {\n return\n }\n\n if (!interval) {\n interval = this.interval\n }\n this.stop()\n if (video.videoWidth && video.videoHeight) {\n this.videoPI = video.videoHeight > 0 ? parseInt(video.videoWidth / video.videoHeight * 100, 10) : 0\n if (this.config.mode === MODES.REAL_TIME) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n } else if (_now - this.preTime >= interval) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n }\n }\n this.frameId = this._loopType === 'timer' ? Util.setTimeout(this, this.start, interval) : Util.requestAnimationFrame(this.start)\n }\n\n stop = () => {\n if (this.frameId) {\n this._loopType === 'timer' ? Util.clearTimeout(this, this.frameId) : Util.cancelAnimationFrame(this.frameId)\n // window.clearTimeout(this.frameId)\n this.frameId = null\n }\n }\n\n updateImg (url) {\n // TODO: 需要改造,使用domcss样式渲染,不再使用canvas渲染\n if (!url) {\n return\n }\n // Render using the image\n const { width, height } = this.canvas.getBoundingClientRect()\n let image = new window.Image()\n image.onload = () => {\n if (!this.canvas || this.frameId || this.isStart) {\n return\n }\n this.canvas.height = height\n this.canvas.width = width\n const pi = parseInt(width / height * 100, 10)\n // console.log('>>>updateImg update', image, pi)\n this.update(image, pi)\n image = null\n }\n image.src = url\n }\n\n update (video, sourcePI) {\n if (!this.canvas || !this.canvasCtx || !sourcePI) {\n return\n }\n try {\n const { _pos, config } = this\n const { width, height } = this.canvas.getBoundingClientRect()\n if (width !== _pos.width || height !== _pos.height || _pos.pi !== sourcePI) {\n const pi = parseInt(width / height * 100, 10)\n _pos.pi = sourcePI\n _pos.width !== width && (_pos.width = this.canvas.width = width)\n _pos.height !== height && (_pos.height = this.canvas.height = height)\n let rheight = height\n let rwidth = width\n if (pi < sourcePI) {\n rwidth = parseInt(height * sourcePI / 100, 10)\n } else if (pi > sourcePI) {\n rheight = parseInt(width * 100 / sourcePI, 10)\n }\n _pos.rwidth = rwidth * config.multiple\n _pos.rheight = rheight * config.multiple\n _pos.x = (width - _pos.rwidth) / 2\n _pos.y = (height - _pos.rheight) / 2\n }\n // console.log(`x:${_pos.x} y:${_pos.y} rwidth:${_pos.rwidth} rheight:${_pos.rheight}`)\n this.canvasFilter && (this.canvasCtx.filter = config.filter)\n this.canvasCtx.drawImage(video, _pos.x, _pos.y, _pos.rwidth, _pos.rheight)\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n destroy () {\n this.stop()\n document.removeEventListener('visibilitychange', this.onVisibilitychange)\n this.canvasCtx = null\n this.canvas = null\n }\n\n render () {\n return ''\n }\n}\n\nexport default DynamicBg\n","import { BasePlugin, Events } from '../../plugin'\nconst INFO = 'info'\n\nconst { STATS_EVENTS } = Events\nexport default class Stats extends BasePlugin {\n static get pluginName () {\n return 'stats'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n _recordUserActions = (actionData) => {\n const time = this._getTime()\n const payload = Object.assign({}, actionData, { msg: actionData.msg || actionData.action })\n this._stats[INFO].push({\n type: 'userAction',\n ...time,\n payload\n })\n }\n\n _getTime () {\n return {\n timestamp: Date.now(),\n timeFormat: new Date().toISOString()\n }\n }\n\n afterCreate () {\n this.reset()\n this.on(Events.USER_ACTION, this._recordUserActions)\n this.on(STATS_EVENTS.STATS_INFO, this._recordInfo)\n this.on(STATS_EVENTS.STATS_DOWNLOAD, this._downloadStats)\n this.on(STATS_EVENTS.STATS_RESET, this._onReset)\n }\n\n destroy () {\n this.offAll()\n }\n\n _onReset = () => {\n this.reset()\n }\n\n _recordInfo = (data) => {\n this.info(data)\n }\n\n _downloadStats = () => {\n const stats = this.getStats()\n const blob = new Blob([JSON.stringify(stats)], { type: 'application/json' })\n const downloadUrl = window.URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.style.display = 'none'\n link.href = downloadUrl\n link.download = 'player.txt'\n link.disabled = false\n link.click()\n }\n\n downloadStats () {\n this._downloadStats()\n }\n\n /**\n * @params type\n */\n info (data) {\n if (data.profile) {\n this._infoProfile(data)\n } else {\n this._info(data)\n }\n }\n\n _info (data) {\n const time = this._getTime()\n this._stats[INFO].push({\n ...time,\n payload: data\n })\n }\n\n _infoProfile (data) {\n if (data && data.startMs) {\n const endMs = Date.now()\n const dur = endMs - data.startMs\n const profile = {\n cat: 'function',\n dur: dur,\n name: data.name || data.msg,\n ph: 'X',\n pid: 0,\n tid: 0,\n ts: data.startMs,\n profile: true,\n ...data\n }\n this._info(profile)\n } else {\n console.warn('infoProfile need object data, include startMs')\n }\n }\n\n reset () {\n this._stats = {\n [INFO]: [],\n media: {}\n }\n }\n\n getStats () {\n const { player } = this\n const mediaElem = player.media\n const buffered = []\n for (let i = 0; i < mediaElem.buffered.length; i++) {\n buffered.push({\n start: mediaElem.buffered.start(i),\n end: mediaElem.buffered.end(i)\n })\n }\n const mediaInfo = {\n currentTime: mediaElem.currentTime,\n readyState: mediaElem.readyState,\n buffered,\n paused: mediaElem.paused,\n ended: mediaElem.ended\n }\n\n this._stats.media = mediaInfo\n return {\n raw: this._stats,\n timestat: this._getTimeStats(),\n profile: this._getProfile()\n }\n }\n\n _getTimeStats () {\n const allStat = this._stats[INFO]\n const msgs = allStat.map(stat => {\n const data = stat.payload.data\n let msg = ''\n try {\n if (data instanceof Error) {\n msg = data.msg\n } else if (data !== undefined) {\n msg = JSON.stringify(data)\n }\n } catch (error) {\n console.log('err', error)\n }\n\n return `[${stat.timeFormat}] : ${stat.payload.msg} ${msg} `\n })\n return msgs\n }\n\n _getProfile () {\n const profile = {\n traceEvents: []\n }\n const allStat = this._stats[INFO]\n allStat.forEach(stat => {\n if (stat.payload.profile) {\n profile.traceEvents.push(stat.payload)\n }\n })\n return profile\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class GapJump extends BasePlugin {\n static get pluginName () {\n return 'gapJump'\n }\n\n static get defaultConfig () {\n return {\n useGapJump: false,\n smallGapLimit: 0.5,\n gapDetectionThreshold: 0.3\n }\n }\n\n afterCreate () {\n const { useGapJump } = this.config\n if (useGapJump === false) {\n return\n }\n this.hasPlayed = false\n this.seekingEventReceived = false\n this.isSafari = /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform)\n this.on(Events.WAITING, this.onGapJump)\n\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n\n this.on(Events.SEEKING, () => {\n this.seekingEventReceived = true\n })\n }\n\n onGapJump = () => {\n const { player, config } = this\n if (player.media.readyState === HTMLMediaElement.HAVE_NOTHING) {\n return\n }\n if (player.media.seeking) {\n if (!this.seekingEventReceived) { return }\n } else {\n this.seekingEventReceived = false\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n\n const buffered = player.media.buffered\n const smallGapLimit = config.smallGapLimit || 0.5\n const gapDetectionThreshold = config.gapDetectionThreshold || 0.3\n const currentTime = player.media.currentTime\n const idx = this._getIndex(buffered, currentTime, gapDetectionThreshold)\n if (idx === null || idx === 0) {\n return\n }\n console.log('GapJump bufferRange ', buffered.start(idx), buffered.end(idx))\n const jumpTo = buffered.start(idx) + 0.1\n const seekEnd = player.media.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n const jumpSize = jumpTo - currentTime\n const isGapSmall = jumpSize <= smallGapLimit\n if (jumpSize < GapJump.BROWSER_GAP_TOLERANCE) {\n return\n }\n\n if (isGapSmall) {\n if (config.useGapJump !== false) {\n player.media.currentTime = this.isSafari ? jumpTo + 0.1 : jumpTo\n }\n this.player && this.player.emit('detectGap')\n console.log('gapJump gapIndex', idx, ' isGapSamll:', isGapSmall, ' currentTime:', player.media.currentTime, ' jumpSize:', (currentTime - player.media.currentTime))\n // 目前转码视频首个分片cts存在,在Safari下为0.08,先忽略\n if (jumpTo !== 0.08) {\n player && player.emit('log', {\n type: 'oneevent', // 事件类型\n end_type: 'gap',\n vid: player.config.vid,\n ext: {\n video_postion: Math.floor(jumpTo * 1000) // ms\n }\n })\n }\n }\n }\n\n _getIndex (buffered, time, threshold) {\n if (!buffered || !buffered.length) {\n return null\n }\n if (buffered.length === 1 && buffered.end(0) - buffered.start(0) < 1e-6) {\n return null\n }\n const bufferedInfo = this._getBuffered(buffered)\n let idx = null\n for (let i = 0; i < bufferedInfo.length; i++) {\n const item = bufferedInfo[i]\n if (item.start > time && (i === 0 || bufferedInfo[i - 1].end - time <= threshold)) {\n idx = i\n break\n }\n }\n return idx\n }\n\n _getBuffered (b) {\n if (!b) {\n return []\n }\n const ret = []\n for (let i = 0; i < b.length; i++) {\n ret.push({\n start: b.start(i),\n end: b.end(i)\n })\n }\n return ret\n }\n}\nGapJump.BROWSER_GAP_TOLERANCE = 0.001\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class WaitingTimeoutJump extends BasePlugin {\n static get pluginName () {\n return 'waitingTimeoutJump'\n }\n\n static get defaultConfig () {\n return {\n useWaitingTimeoutJump: false,\n waitingTime: 15, // wait超过此时间没恢复,则向前跳jumpSize,单位s\n jumpSize: 2, // 单位s,\n jumpCntMax: 4 // 一次播放最大向前跳几次\n }\n }\n\n afterCreate () {\n const { useWaitingTimeoutJump, jumpSize } = this.config\n if (useWaitingTimeoutJump === false) {\n return\n }\n this.hasPlayed = false\n this.jumpCnt = 0\n /**\n * @type {null | number}\n */\n this.timer = null\n this.jumpSize = jumpSize\n this.on(Events.WAITING, this.onWaiting)\n this.on([Events.PLAYING, Events.CANPLAY], () => {\n clearTimeout(this.timer)\n this.timer = null\n this.jumpSize = this.config.jumpSize\n })\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n }\n\n onWaiting = () => {\n const { config } = this\n if (this.jumpCnt > config.jumpCntMax || this.timer || config.useWaitingTimeoutJump === false) {\n return\n }\n this.timer = setTimeout(this.onJump, config.waitingTime * 1000)\n }\n\n onJump = () => {\n const { player, config } = this\n clearTimeout(this.timer)\n this.timer = null\n if (this.jumpCnt > config.jumpCntMax || config.useWaitingTimeoutJump === false) {\n return\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n this.jumpSize = config.jumpSize * (this.jumpCnt + 1)\n if (this.jumpCnt === config.jumpSize && this.jumpSize < 6) {\n this.jumpSize = 6\n }\n const jumpTo = player.currentTime + this.jumpSize\n const seekEnd = player.media.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n this.jumpCnt++\n player.currentTime = jumpTo\n }\n}\n","import BasePlugin, { Events, Util } from '../../plugin'\nconst DEFAULT_SPEED_TYPE = 'cdn'\nconst SPEED_TYPE = ['cdn'] // 默认的速度的种类,可以通过addSpeedTypeList再继续增加\nexport default class TestSpeed extends BasePlugin {\n static get pluginName () {\n return 'testspeed'\n }\n\n static get defaultConfig () {\n return {\n openSpeed: false, // 测速开关,默认关\n testCnt: 3, // 一次播放的测速次数,默认1次\n loadSize: 200 * 1024, // 一次播放的测速请求的数据量大小,单位字节,默认200k\n testTimeStep: 3000, // 每次测速的时间间隔,第一次在开播后的testTimeStep 秒,默认是3s\n url: '', // 每次测速的url,一般传播放的备用地址测速\n saveSpeedMax: 5, // 保留最近多少次测速记录,最后的速度求这个记录列表平均值,默认5条\n addSpeedTypeList:[] // 需要增加的speed的类型\n }\n }\n\n getSpeed = (type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return 0\n if (this.speedListCache[type].length <= 0) return 0\n let total = 0\n this.speedListCache[type].map(item => {\n total += item\n })\n return Math.floor(total / this.speedListCache[type].length)\n }\n\n afterCreate () {\n const { openSpeed, addSpeedTypeList } = this.config\n if (addSpeedTypeList?.length > 0) {\n SPEED_TYPE.push(...addSpeedTypeList)\n }\n this.initSpeedList()\n this.on('real_time_speed', this._onRealSpeedChange)\n /**\n * @type {null || number }\n */\n this.timer = null\n this.cnt = 0\n this.xhr = null\n if (!openSpeed) {\n return\n }\n this.on([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n }\n startTimer = () => {\n if (Util.isMSE(this.player.video)) {\n return\n }\n this.initSpeedList()\n this.cnt = 0\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n\n initSpeedList = () => {\n this.speedListCache = {}\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache[type] = []\n })\n }\n\n _onRealSpeedChange = (data) => {\n data.speed && this.appendList(data.speed, data.type || DEFAULT_SPEED_TYPE)\n }\n\n testSpeed = () => {\n clearTimeout(this.timer)\n this.timer = null\n if (!this.player || !this.config.openSpeed) return\n const { url, loadSize, testCnt, testTimeStep } = this.config\n const testSpeedUrl = url + (url.indexOf('?') < 0 ? '?testst=' : '&testst=') + Date.now()\n if (this.cnt >= testCnt) {\n return\n }\n this.cnt++\n try {\n const start = new Date().getTime()\n let end = null\n const xhr = new XMLHttpRequest()\n this.xhr = xhr\n xhr.open('GET', testSpeedUrl)\n const headers = {}\n const random = Math.floor(Math.random() * 10)\n headers.Range = 'bytes=' + random + '-' + (loadSize + random)\n if (headers) {\n Object.keys(headers).forEach(k => {\n xhr.setRequestHeader(k, headers[k])\n })\n }\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4) {\n this.xhr = null\n end = new Date().getTime()\n const size = xhr.getResponseHeader('Content-Length') / 1024 * 8\n const speed = Math.round(size * 1000 / (end - start))\n this.appendList(speed)\n this.timer = setTimeout(this.testSpeed, testTimeStep)\n }\n }\n xhr.send()\n } catch (e) {\n console.error(e)\n }\n }\n\n appendList = (speed, type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return\n const { saveSpeedMax } = this.config\n if (this.speedListCache[type].length >= saveSpeedMax) {\n this.speedListCache[type].shift()\n }\n this.speedListCache[type].push(speed)\n const { player } = this\n if (player) {\n type === DEFAULT_SPEED_TYPE ? (player.realTimeSpeed = speed) : (player[this.getSpeedName('realTime', type)] = speed)\n }\n this.updateSpeed(type)\n }\n\n getSpeedName (namePrefix, type){\n return namePrefix + 'Speed' + type.toUpperCase()\n }\n\n updateSpeed = (type = DEFAULT_SPEED_TYPE) => {\n const speed = this.getSpeed(type)\n const { player } = this\n if (player) {\n if (type === DEFAULT_SPEED_TYPE) {\n if ((!player.avgSpeed || speed !== player.avgSpeed)) {\n player.avgSpeed = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n } else {\n const speedName = this.getSpeedName('avg', type)\n if (!player[speedName] || speed !== player[speedName]) {\n player[speedName] = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n }\n }\n }\n\n set openSpeed (value) {\n this.config.openSpeed = value\n if (!value && this.timer) {\n clearTimeout(this.timer)\n this.timer = null\n return\n }\n if (this.config.openSpeed) {\n if (this.timer) return\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n }\n\n get openSpeed () {\n return this.config.openSpeed\n }\n\n destroy () {\n this.off('real_time_speed', this._onRealSpeedChange)\n this.off([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache && this.speedListCache[type] && (this.speedListCache[type] = [])\n })\n this.speedListCache && (this.speedListCache = {})\n clearTimeout(this.timer)\n this.timer = null\n if (this.xhr && this.xhr.readyState !== 4) {\n this.xhr.cancel && this.xhr.cancel()\n this.xhr = null\n }\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\n/**\n * @typedef { {\n * tick?: number,\n * stuckCount?: number,\n * disable?: boolean,\n * reportFrame?: number\n * } } IFullscreenConfig\n */\nexport default class FpsDetect extends BasePlugin {\n static get pluginName () {\n return 'FpsDetect'\n }\n\n static get defaultConfig () {\n return {\n disabled: false,\n tick: 1000, // tick时间,默认1000 ms\n stuckCount: 3, // 卡住次数\n reportFrame: 0 // 每次解码帧率小于多少时统计\n }\n }\n\n afterCreate () {\n const { player, config } = this\n const media = player.media || player.video\n this.timer = null\n this._lastDecodedFrames = 0\n this._currentStuckCount = 0\n this._lastCheckPoint = null\n this._payload = []\n if (config.disabled) return\n const getVideoPlaybackQuality = media.getVideoPlaybackQuality\n if (!getVideoPlaybackQuality) return\n this.on(Events.PLAY, () => {\n this._startTick()\n })\n\n this.on(Events.PAUSE, () => {\n this._stopTick()\n })\n\n this.on(Events.ENDED, () => {\n this._stopTick()\n })\n\n this.on(Events.EMPTIED, () => {\n this._stopTick()\n })\n }\n\n _startTick () {\n this._stopTick()\n this._timer = setTimeout(() => {\n this._checkDecodeFPS()\n this._startTick()\n }, this.config.tick)\n }\n\n _stopTick () {\n clearTimeout(this._timer)\n this._timer = null\n }\n\n _checkBuffer (curTime, buffered) {\n let enoughBuffer = false\n const buffers = []\n for (let i = 0; i < buffered.length; i++) {\n const start = buffered.start(i)\n const end = buffered.end(i)\n buffers.push({ start, end })\n if (start <= curTime && curTime <= end - 1) {\n enoughBuffer = true\n break\n }\n }\n return {\n enoughBuffer,\n buffers\n }\n }\n\n _checkStuck (curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval) {\n const media = this.player.media || this.player.video\n const hidden = document.hidden\n const { paused, readyState, currentTime, buffered } = media\n\n if (hidden || paused || readyState < 4) {\n return\n }\n const { enoughBuffer, buffers } = this._checkBuffer(currentTime, buffered)\n if (!enoughBuffer) {\n return\n }\n\n if (curDecodedFrames <= this.config.reportFrame) {\n this._currentStuckCount++\n this._payload.push({ currentTime, buffers, curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval })\n\n if (this._currentStuckCount >= this.config.stuckCount) {\n this.emit(Events.FPS_STUCK, this._payload)\n this._reset()\n }\n } else {\n this._reset()\n }\n }\n\n _reset () {\n this._payload = []\n this._currentStuckCount = 0\n }\n\n _checkDecodeFPS () {\n const media = this.player.media || this.player.video\n if (!media) {\n return\n }\n const { totalVideoFrames, droppedVideoFrames } = media.getVideoPlaybackQuality()\n\n const currTime = performance.now()\n if (totalVideoFrames) {\n if (this._lastCheckPoint) {\n const curDecoded = totalVideoFrames - this._lastDecodedFrames\n const checkInterval = currTime - this._lastCheckPoint\n this._checkStuck(curDecoded, totalVideoFrames, droppedVideoFrames, checkInterval)\n }\n }\n this._lastDecodedFrames = totalVideoFrames\n this._lastCheckPoint = currTime\n }\n\n destroy () {\n this._stopTick()\n }\n}\n","import sniffer from '../utils/sniffer'\n// import Danmu from '../plugins/danmu'\nimport Xglogger from '../plugins/logger'\nimport Replay from '../plugins/replay'\nimport Poster from '../plugins/poster'\nimport Start from '../plugins/start'\nimport Enter from '../plugins/enter'\nimport Miniscreen from '../plugins/miniScreen'\nimport PC from '../plugins/pc'\nimport Mobile from '../plugins/mobile'\nimport Keyboard from '../plugins/keyboard'\nimport Loading from '../plugins/loading'\nimport Progress from '../plugins/progress'\nimport PlayIcon from '../plugins/play'\nimport FullScreen from '../plugins/fullscreen'\nimport TimeIcon from '../plugins/time'\nimport TimeSegments from '../plugins/time/timesegments'\nimport Volume from '../plugins/volume'\nimport RotateIcon from '../plugins/rotate'\nimport PIPIcon from '../plugins/pip'\nimport PlayNextIcon from '../plugins/playNext'\nimport DownLoadIcon from '../plugins/download'\nimport ScreenShotIcon from '../plugins/screenShot'\nimport DefinitionIcon from '../plugins/definition'\nimport PlaybackRateIcon from '../plugins/playbackRate'\nimport CssFullScreen from '../plugins/cssFullScreen'\nimport Error from '../plugins/error'\nimport Prompt from '../plugins/prompt'\nimport ProgressPreview from '../plugins/progressPreview'\nimport Thumbnail from '../plugins/common/thumbnail'\nimport MiniProgress from '../plugins/progress/miniProgress'\nimport DynamicBg from '../plugins/dynamicBg'\nimport ZH from '../lang/zh-cn'\nimport Stats from '../plugins/stats'\nimport GapJump from '../plugins/gapJump'\nimport WaitingTimeoutJump from '../plugins/waitingTimeoutJump'\nimport TestSpeed from '../plugins/testspeed'\nimport I18N from '../lang/i18n'\nimport FpsDetect from '../plugins/fpsDetect'\n// import Heatmap from '../plugins/heatmap'\n\nI18N.use(ZH)\n\nexport default class DefaultPreset {\n constructor (options, playerConfig) {\n const simulateMode = playerConfig && playerConfig.isMobileSimulateMode === 'mobile'\n const { isLive } = playerConfig\n const vodPlugins = isLive ? [] : [TimeSegments, Progress, MiniProgress, ProgressPreview, TimeIcon]\n\n const contolsIcons = [...vodPlugins, PlayIcon, FullScreen,\n RotateIcon, PlayNextIcon, DefinitionIcon, PlaybackRateIcon, DownLoadIcon, ScreenShotIcon, Volume, PIPIcon]\n\n const layers = [Replay, Poster, Start, Loading, Enter, Error, Prompt, Thumbnail, Miniscreen]\n\n this.plugins = [Stats, Xglogger, ...contolsIcons, ...layers, GapJump, WaitingTimeoutJump]\n const mode = simulateMode ? 'mobile' : sniffer.device\n switch (mode) {\n case 'pc':\n this.plugins.push(...[Keyboard, PC, CssFullScreen, TestSpeed, FpsDetect])\n break\n case 'mobile':\n this.plugins.push(...[Mobile])\n break\n default:\n this.plugins.push(...[Keyboard, PC, CssFullScreen])\n }\n if (sniffer.os.isIpad || mode === 'pc') {\n this.plugins.push(DynamicBg)\n }\n if (sniffer.os.isIpad) {\n this.plugins.push(PC)\n }\n this.ignores = []\n this.i18n = []\n }\n}\n","export default {\n LANG: 'zh-cn',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: '视频下载错误'\n },\n mse: {\n code: 2,\n msg: '流追加错误'\n },\n parse: {\n code: 3,\n msg: '解析错误'\n },\n format: {\n code: 4,\n msg: '格式错误'\n },\n decoder: {\n code: 5,\n msg: '解码错误'\n },\n runtime: {\n code: 6,\n msg: '语法错误'\n },\n timeout: {\n code: 7,\n msg: '播放超时'\n },\n other: {\n code: 8,\n msg: '其他错误'\n }\n },\n HAVE_NOTHING: '没有关于音频/视频是否就绪的信息',\n HAVE_METADATA: '音频/视频的元数据已就绪',\n HAVE_CURRENT_DATA: '关于当前播放位置的数据是可用的,但没有足够的数据来播放下一帧/毫秒',\n HAVE_FUTURE_DATA: '当前及至少下一帧的数据是可用的',\n HAVE_ENOUGH_DATA: '可用数据足以开始播放',\n NETWORK_EMPTY: '音频/视频尚未初始化',\n NETWORK_IDLE: '音频/视频是活动的且已选取资源,但并未使用网络',\n NETWORK_LOADING: '浏览器正在下载数据',\n NETWORK_NO_SOURCE: '未找到音频/视频来源',\n MEDIA_ERR_ABORTED: '取回过程被用户中止',\n MEDIA_ERR_NETWORK: '网络错误',\n MEDIA_ERR_DECODE: '解码错误',\n MEDIA_ERR_SRC_NOT_SUPPORTED: '不支持的音频/视频格式',\n REPLAY: '重播',\n ERROR: '网络连接似乎出现了问题',\n PLAY_TIPS: '播放',\n PAUSE_TIPS: '暂停',\n PLAYNEXT_TIPS: '下一集',\n DOWNLOAD_TIPS: '下载',\n ROTATE_TIPS: '旋转',\n RELOAD_TIPS: '重新载入',\n FULLSCREEN_TIPS: '进入全屏',\n EXITFULLSCREEN_TIPS: '退出全屏',\n CSSFULLSCREEN_TIPS: '进入样式全屏',\n EXITCSSFULLSCREEN_TIPS: '退出样式全屏',\n TEXTTRACK: '字幕',\n PIP: '画中画',\n SCREENSHOT: '截图',\n LIVE: '正在直播',\n OFF: '关闭',\n OPEN: '开启',\n MINI_DRAG: '点击按住可拖动视频',\n MINISCREEN: '小屏幕',\n REFRESH_TIPS: '请试试',\n REFRESH: '刷新',\n FORWARD: '快进中',\n LIVE_TIP: '直播'\n }\n}\n","import Player from './player'\nimport Plugin from './plugin/plugin'\nimport BasePlugin from './plugin/basePlugin'\nimport * as Events from './events'\nimport STATE_CLASS from './stateClassMap'\nimport I18N from './lang/i18n'\nimport Errors from './error'\nimport Sniffer from './utils/sniffer'\nimport Util from './utils/util'\nimport { InstManager } from './instManager'\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 static InstManager = InstManager\n}\n\nexport default PresetPlayer\n"],"names":["has","Object","prototype","hasOwnProperty","prefix","Events","EE","fn","context","once","this","addListener","emitter","event","TypeError","listener","evt","_events","push","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","names","events","name","call","slice","getOwnPropertySymbols","concat","listeners","handlers","i","l","length","ee","Array","listenerCount","emit","a1","a2","a3","a4","a5","args","len","arguments","removeListener","undefined","apply","j","on","removeAllListeners","off","prefixed","module","exports","XG_DEBUG_OPEN","window","location","href","indexOf","STYLE","info","error","warn","XGTAG","XG_DEBUG","config","debug","logInfo","message","_console","_len","optionalParams","_key","console","log","logWarn","_console2","_len2","_key2","logError","_console3","_fun","_len3","_key3","XgplayerTimeRange","bufferedList","_classCallCheck","_createClass","key","value","index","start","end","get","util","checkIsIn","list","isObject","type","_typeof","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","useRAF","requestAnimationFrame","invokeFunc","time","thisArg","startTimer","pendingFunc","cancelAnimationFrame","setTimeout","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","Date","now","trailingEdge","timeSinceLastInvoke","timeWaiting","Math","min","remainingWait","debounced","isInvoking","max","cancel","id","clearTimeout","cancelTimer","flush","pending","createDom","el","tpl","attrs","cname","dom","document","createElement","className","innerHTML","keys","forEach","item","setAttribute","createDomFromHtml","html","classname","doc","children","addClass","err","hasClass","some","classList","e","orgClassName","getAttribute","match","RegExp","replace","split","add","removeClass","remove","reg","toggleClass","classNames","_arguments","_loop","typeOf","map","join","findDom","sel","querySelector","getElementById","getCss","currentStyle","defaultView","getComputedStyle","padStart","str","pad","charstr","String","maxlen","ceil","chars","r","substring","format","isNaN","round","hour","floor","minute","second","touches","touch","changedTouches","clientX","clientY","offsetX","pageX","target","offsetLeft","offsetY","pageY","offsetTop","_target","srcElement","obj","toString","deepCopy","dst","src","Node","deepMerge","_dst$key","_toConsumableArray","getBgImage","url","backgroundImage","a","copyDom","nodeType","back","tagName","attributes","node","setInterval","eventName","intervalFunc","frequency","_interval","bind","clearInterval","fun","_timers","splice","clearAllTimers","_timerIds","createImgBtn","imgUrl","width","height","w","h","unit","btn","style","every","parseFloat","trim","backgroundSize","margin","Hex2RGBA","hex","alpha","rgb","test","sixHex","kw","parseInt","getFullScreenEl","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","checkIsFunction","checkIsObject","hide","display","show","isUndefined","val","isNotNull","setStyleFromCsstext","text","arr","filterStyleFromText","_cssText","cssText","styleArr","ret","remain","getStyleFromCsstext","preloadImg","onload","onerror","img","Image","stopPropagation","scrollTop","pageYOffset","documentElement","body","scrollLeft","pageXOffset","checkTouchSupport","getBuffered2","vbuffered","maxHoleDuration","buffered","sort","b","diff","buffered2","buf2len","buf2end","getEventPos","zoom","x","y","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","getHostFromUrl","results","domain","frameId","mozCancelAnimationFrame","cancelRequestAnimationFrame","isMSE","video","media","HTMLMediaElement","currentSrc","isBlob","generateSessionId","did","d","getTime","performance","uuid","c","random","createEvent","Event","initEvent","adjustTimeByDuration","duration","isEnded","createPositionBar","root","appendChild","getTransformStyle","pos","scale","rotate","transformValue","styles","translate","stylesKeys","lastIndex","convertDeg","abs","getIndexByTime","segments","_index","getOffsetCurrentTime","currentTime","_segments$_index","cTime","offset","getCurrentTimeByOffset","offsetTime","VERSION_REG","H264_MIMETYPES","sniffer","device","os","isPc","browser","navigator","ua","userAgent","toLowerCase","ie","firefox","chrome","opera","safari","filter","isWindowsPhone","isSymbian","isAndroid","isFireFox","isIpad","platform","maxTouchPoints","isTablet","isPhone","isIos","osVersion","_match","exec","version","isWeixin","toLocaleLowerCase","isSupportMP4","isSupport","mime","supportResult","canPlayType","isMSESupport","MediaSource","isTypeSupported","_logger","isHevcSupported","probeConfigSupported","defaults","supported","smooth","powerEfficient","Promise","resolve","mediaCapabilities","decodingInfo","videoConfig","audioConfig","audio","videoSupported","contentType","audioSupported","ERROR_TYPE_MAP","ERROR_MAP","Errors","player","errorInfo","errorType","errorCode","errorMessage","originError","ext","mediaError","ERROR_TYPES","i18n","ended","_player$media","readyState","networkState","_errc","code","playerVersion","stack","host","Util","ex","msg","PLAY","PLAYING","ENDED","PAUSE","ERROR","SEEKING","SEEKED","TIME_UPDATE","WAITING","CANPLAY","DURATION_CHANGE","VOLUME_CHANGE","LOADED_DATA","RATE_CHANGE","PROGRESS","LOAD_START","EMPTIED","PLAYER_FOCUS","PLAYER_BLUR","READY","URL_NULL","AUTOPLAY_STARTED","AUTOPLAY_PREVENTED","COMPLETE","REPLAY","DESTROY","URL_CHANGE","DOWNLOAD_SPEED_CHANGE","LEAVE_PLAYER","ENTER_PLAYER","LOADING","FULLSCREEN_CHANGE","CSS_FULLSCREEN_CHANGE","MINI_STATE_CHANGE","DEFINITION_CHANGE","AFTER_DEFINITION_CHANGE","VIDEO_RESIZE","PIP_CHANGE","ROTATE","SCREEN_SHOT","PLAYNEXT","SHORTCUT","XGLOG","USER_ACTION","RESET","SOURCE_ERROR","SOURCE_SUCCESS","VIDEO_EVENTS","STATS_EVENTS","STATS_INFO","STATS_DOWNLOAD","STATS_RESET","FPS_STUCK","emitVideoEvent","eventKey","errorHandler","getVideoEventHandler","_err","eData","originalEvent","detail","timeStamp","paused","isInternalOp","_internalOp","muted","volume","vtype","removeInnerOP","_currentTime","_rate","playbackRate","_duration","isMutedChange","_lastMuted","mediaEventMiddleware","MediaProxy","_EventEmitter","_inherits","_super","_createSuper","_this","_hasStart","mediaConfig","assign","controls","autoplay","playsinline","x5VideoPlayerFullscreen","x5VideoOrientation","airplay","tabindex","mediaType","videoAttributes","playerType","x5VideoPlayerType","Sniffer","loop","autoplayMuted","defaultPlaybackRate","attachVideoEvents","middlewares","_this2","_this3","_this4","_evHandlers","funName","charAt","toUpperCase","_defineProperty","addEventListener","_this5","removeEventListener","urls","_this6","removeAttribute","load","_c","_videoSourceCount","_videoSourceIndex","_vLoadeddata","_eHandler","_sourceError","_dIndex","removeChild","_e","k","pause","detachVideoEvents","set","play","range","isTrue","_buffered","crossOrigin","defaultMuted","rate","Infinity","played","preload","seekable","seeking","onWaiting","_detachSourceEvents","_attachSourceEvents","vol","videoWidth","videoHeight","data","_get2","_get","_getPrototypeOf","_get3","_get4","_get5","_len4","_key4","INDEXDB","mydb","db","ojstore","keypath","indexedDB","webkitindexedDB","IDBKeyRange","webkitIDBKeyRange","myDB","self","request","open","onsuccess","onupgradeneeded","transaction","objectStoreNames","contains","createObjectStore","keyPath","deleteDatabase","close","storename","store","objectStore","put","delete","clear","FULLSCREEN_EVENTS","GET_FULLSCREEN_API","EXIT_FULLSCREEN_API","PLATER_ID","callHandler","handler","next","then","hook","hookName","preset","pre","__hooks","_preset$pre","pluginName","preRet","runHooks","isContinue","catch","findHookIndex","isArray","hookHandlers","useHooks","removeHooks","hooks","usePluginHooks","plugins","plugin","removePluginHooks","hooksDescriptor","instance","presetHooks","defineProperty","delHooksDescriptor","_len5","_key5","runHooksRecursive","_len6","_key6","showErrorMsg","BasePlugin","beforeCreate","__args","__events","__onceEvents","playerConfig","__init","constructor","logger","lang","i18nKeys","domEventType","_this$player","res","action","params","nParams","_objectSpread","emitUserAction","registerPlugin","getPlugin","offAll","destroy","unRegisterPlugin","Obj","configurable","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","PLUGIN_STATE_CLASS","isUrl","createIcon","icon","attr","newIcon","tag","registerIconsObj","iconsConfig","_icons","icons","orgIcon","class","mergeIconClass","mergeIconAttr","Plugin","_BasePlugin","__delegates","_parent","_el","parent","registerIcons","langText","textConfig","defaultTexConfig","registerLanguageTexts","renderStr","render","Error","insert","setAttr","setStyle","__registerChildren","_children","_plugin","checkChildren","langKey","langTextShow","disable","find","qs","eventType","bindEL","delegate","unbindEL","htmlStr","eventHandle","isBubble","getPropertyValue","pdom","child","_this7","insertIdx","Number","isDomElement","coordinate","mode","curIdx","insertBefore","insertAdjacentHTML","capture","dels","ResizeObserver","entries","t","__runHandler","__handlers","observer","throttle","__trigger","observe","_pid","playerId","_this$observer","unobserve","_this$observer2","disconnect","resizeObserver","pluginsManager","pluginGroup","init","cgid","_pluginInfoId","closeResizeObserver","resize","addObserver","_originalOptions","_plugins","formatPluginInfo","PLUFGIN","checkPluginIfExits","getRootByConfig","_pConfig","position","lazyRegister","lazyPlugin","timeout","race","loader","__esModule","default","register","reject","originalOptions","isSupported","codecType","defaultConfig","unRegister","_instance","afterCreate","__destroy","deletePlugin","getPlugins","findPlugin","cName","beforeInit","retPromise","prevTask","_loadingPlugins","all","pluginsRet","pName","beforePlayerInit","afterInit","afterPlayerInit","setLang","updateLang","reRender","_pList","onPluginsReady","unObserver","_resizeObserver","_i","_Object$keys","STATE_CLASS","DEFAULT","DEFAULT_SKIN","ENTER","PAUSED","NO_START","ACTIVE","INACTIVE","FULLSCREEN","CSS_FULLSCREEN","ROTATE_FULLSCREEN","PARENT_ROTATE_FULLSCREEN","PARENT_FULLSCREEN","INNER_FULLSCREEN","NO_CONTROLS","FLEX_CONTROLS","CONTROLS_FOLLOW","CONTROLS_AUTOHIDE","TOP_BAR_AUTOHIDE","NOT_ALLOW_AUTOPLAY","PC","MOBILE","MINI","getDefaultConfig","nullUrlStart","fluid","fitVideoSize","videoFillMode","isLive","videoInit","poster","isMobileSimulateMode","execBeforePluginsCall","allowSeekAfterEnded","enableContextmenu","closeVideoClick","closeVideoDblclick","closePlayerBlur","closeDelayBlur","leavePlayerTime","closePlayVideoFocus","closePauseVideoFocus","closeFocusVideoFocus","closeControlsBlur","topBarAutoHide","startTime","seekedStatus","miniprogress","disableSwipeHandler","enableSwipeHandler","preProcessUrl","ignores","whitelist","inactive","language","marginControls","fullscreenTarget","screenShot","pip","download","mini","cssFullscreen","keyShortcut","presets","definition","customDuration","timeOffset","thumbnail","isHideTips","minWaitDelay","commonStyle","progressColor","playedColor","cachedColor","sliderBtnStyle","volumeColor","STATES","STATE_ARRAY","Controls","_Plugin","_assertThisInitialized","_assertThisInitialize","focus","autoHide","_this$config","left","center","right","innerRoot","isMini","onMouseEnter","onMouseLeave","blur","ignorePaused","unbind","_this$config2","initShow","XGI18nLang","langKeys","textKeys","_s","_t","updateKeys","en","use","langData","i18nLangs","_clang","LANG","texts","TEXT","network","mse","parse","decoder","runtime","other","HAVE_NOTHING","HAVE_METADATA","HAVE_CURRENT_DATA","HAVE_FUTURE_DATA","HAVE_ENOUGH_DATA","NETWORK_EMPTY","NETWORK_IDLE","NETWORK_LOADING","NETWORK_NO_SOURCE","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","PLAY_TIPS","PAUSE_TIPS","PLAYNEXT_TIPS","DOWNLOAD_TIPS","ROTATE_TIPS","RELOAD_TIPS","FULLSCREEN_TIPS","EXITFULLSCREEN_TIPS","CSSFULLSCREEN_TIPS","EXITCSSFULLSCREEN_TIPS","TEXTTRACK","PIP","SCREENSHOT","LIVE","OFF","OPEN","MINI_DRAG","MINISCREEN","REFRESH_TIPS","REFRESH","FORWARD","LIVE_TIP","I18N","zh","extend","i18nTextList","_i18nLangs","_ret$langKeys","pId","InstManager","setActive","isUserActive","endEarly","_iterate","flag","isActive","inst","isInstNext","isNext","PlAYER_HOOKS","REAL_TIME_SPEED","AVG_SPEED","instManager","Player","_MediaProxy","__startTime","_seekToStartTime","_useAutoplay","mediaPlay","canPlayFunc","isFullScreen","delayResize","fullEl","_fullActionFrom","props","prop","from","to","isVideo","checkIsCurrentVideo","pid","_fullscreenEl","fullscreen","changeFullStyle","_fullScreenOffset","cssfullscreen","exitCssFullscreen","needFullscreenScroll","scrollTo","top","recoverFullStyle","onFullscreenChange","defaultPreset","defaultIdx","userTimer","waitTimer","handleSource","_state","isAd","isError","isSeeking","isCanplay","rotateDeg","isRotateFullscreen","timeSegments","_cssfullscreenEl","curDefinition","_orgCss","_videoHeight","_videoWidth","videoPos","pi","vy","vx","sizeInfo","_accPlayed","acc","loopAcc","_offsetInfo","innerContainer","topBar","__i18n","database","Database","_onceSeekCanplay","_isPauseBeforeSeek","innerStates","isActiveLocked","_initDOM","_possibleConstructorReturn","_this$config2$definit","defaultDefinitionObj","defaultDefinition","_bindEvents","_registerPresets","_registerPlugins","getInitDefinition","setState","onReady","hasStart","state","_instManager","vid","line","handle","p","checkPlayerRoot","_initBaseDoms","XgVideoProxy","_nVideo","_root","_this$config3","_width","_height","_this$root$getBoundin","getBoundingClientRect","leftBar","rightBar","_onWebkitbeginfullscreen","_onWebkitendfullscreen","playFunc","mousemoveFunc","firstChild","isInit","ignoresStr","cuPlugins","lazy","loadingPlugin","forceBeforeInit","Preset","_player$config$plugin","_player$config$ignore","_presetInst","_presetInst$plugins","_presetInst$ignores","_presetInst$icons","_presetInst$i18n","_ci18n","usePreset","_retPlugin","_this$controls","_getRootByPosition","removedFromConfig","deregister","removePluginFromConfig","_this8","_furl","_preProcessUrl","_startInit","fileName","lineNumber","_this9","_src","curTime","isPaused","_error","_canplay","_this10","playPromise","onError","_errorTimer","_this11","_this12","status","_this13","_this$config4","isSeekedPlay","_status","_this14","_this$config5","_this15","bitrate","switchURL","seamless","reloadFunc","_this16","clsList","mediaPause","cls","_this17","unregisterPlugins","isResetConfig","resetState","pn","de","_instManager2","_this18","updateAcc","_unbindEvents","exitFullscreen","cList","_this19","onPlay","_this20","cur","_srcRet","rootClass","pClassName","_orgPCss","webkitRequestFullscreen","ALLOW_KEYBOARD_INPUT","fullscreenEnabled","webkitSupportsFullscreen","webkitEnterFullscreen","exitRotateFullscreen","webkitExitFullScreen","_class","_this$config$fullscre","useCssFullscreen","_this$config$fullscre2","setRotateDeg","_rootStyle","innerHeight","deg","orientation","delay","onFocus","_clearUserTimer","onBlur","_this21","isLock","_ref","_ref$ignorePaused","_this22","_this23","_this24","endType","_at","startDiff","endDiff","_ref2","_ref2$startDiff","_ref2$endDiff","_this$videoPos","_pi","_pos","offsetWidth","offsetHeight","rHeight","rWidth","formStyle","transform","webkitTransform","resizePosition","_this25","setConfig","_this26","_this27","containerSize","_this$media","_this$config6","controlsHeight","videoFit","fit","_style","paddingTop","videoScale","vWidth","vHeight","cWidth","cHeight","updateObjectPosition","objectPosition","newState","_this$config7","preProcessUrlOptions","processUrlOptions","bool","_this28","curDef","targetDef","_this28$curDefinition","changeDefinition","total","dropped","corrupted","droppedRate","droppedDuration","getVideoPlaybackQuality","_quality","droppedVideoFrames","totalVideoFrames","corruptedVideoFrames","cumulateTime","_l","__url","posterUrl","update","_this$_accPlayed","isMuted","_instManager3","addInnerOP","Boolean","_instManager4","getActiveId","_instManager5","descriptor","getInstance","LOG_TYPES","XGLogger","isTimeUpdate","autoplayStart","_sendFF","vt","isFFLoading","isFFSend","isLs","pt","fvt","newPointTime","loadedCostTime","startCostTime","_isSeeking","seekingStart","waitingStart","fixedWaitingStart","_isWaiting","_waitTimer","_waittTimer","_waitType","suspendWaitingStatus","emitLog","suspendSeekingStatus","fixedStart","_startWaitTimeout","_onReset","_initOnceEvents","_onWaitingLoadStart","_this2$_state","_onSeeking","_onSeeked","endState","_onPlaying","_onWaiting","_onError","_onAutoplayStart","_onTimeupdate","s","_this$_state","costTime","waitTimeout","_now","_cost","_fixedCost","fixedCostTime","Replay","replay","ReplaySvg","__handleReplay","preventDefault","path","Poster","isEndedShow","hideCanplay","onTimeUpdate","_bg","fillMode","notHidden","getBgSize","AnimateMap","clearAnimation","Start","autoPlayStart","toggleTo","initIcons","listenEvents","bindClickEvents","onAutoplayStart","onPlayerReset","clickHandler","switchPausePlay","cancelable","startPlay","PlaySvg","startPause","PauseSvg","isAnimate","endShow","_animateId","addAnimate","seconds","switchStatus","isShowPause","isShowEnd","endAnimate","disableAnimate","animate","Enter","innerHtml","HTMLElement","barStr","logo","xgIconTips","textKey","isShow","MiniScreenIcon","getMini","exitMini","onClick","getStyleSize","num","measurements","measurementsLength","getSize","elem","getStyle","size","innerWidth","outerWidth","outerHeight","getZeroSize","isBorderBox","boxSizing","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderWidth","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","getTouch","dentifier","identifier","EVENTS","POST_START_EVENTS","mousedown","touchstart","pointerdown","Draggabilly","isEnabled","isDragging","isDown","downPoint","dragPoint","startPos","_handlerDom","_bindStartEvent","_startKey","_boundPointerEvents","onUp","positionDrag","webKitTransform","dragStart","dragMove","dragEnd","touchIdentifier","pointerId","dragCancel","pointer","_getPosition","maxY","maxX","setLeftTop","_bindPostStartEvents","_unbindPostStartEvents","presetInfo","moveVector","hasDragStarted","dragRealStart","_this$startPos","_dragPointerMove","dragX","dragY","checkContain","_unbindStartEvent","axis","drag","grid","_getPositionCoord","_addTransformPosition","matrixValues","xIndex","translateX","translateY","styleSide","measure","parentSize","MiniScreen","isClose","scrollY","scrollHeight","lastStyle","isShowIcon","onCancelClick","onCenterClick","disableDrag","_draggabilly","isScrollSwitch","onScroll","PlayIcon","PauseIcon","MOUSE_EVENTS","mouseenter","mouseleave","mousemove","HOOKS","PCPlugin","_assertThisInitialize2","_this$playerConfig","_assertThisInitialize3","__canvas","closeVideoStopPropagation","_clickCount","clickTimer","switchPlayPause","_assertThisInitialize4","getFullscreen","initEvents","onVideoClick","onVideoDblClick","onContextmenu","returnValue","cancelBubble","_this$player2","TOUCHS","move","MOUSES","Touche","__setPress","onTouchEnd","onTouchCancel","onTouchMove","trigger","__clearPress","moving","press","__setDb","diffx","diffy","miniStep","pressDelay","dbClickDelay","disablePress","disableDbClick","needPreventDefault","pressIntrvalId","dbIntrvalId","_initEvent","onTouchStart","__clearDb","touchend","touchmove","ACTIONS","MobilePlugin","touche","getTouche","disableGesture","isStart","timer","rect","_x","_y","scopeL","scopeR","scopeM1","scopeM","scopeM2","miniMoveStep","hideControlsActive","scope","checkScope","gestureY","gestureX","executeMove","resetSeekState","endLastMove","resetPos","changeAction","checkIsRootTarget","light","seekTipIcon","SeekTipIcon","closedbClick","xgMask","initCustomStyle","registerThumbnail","onRootTouchMove","onRootTouchEnd","moveDuration","_this2$pos","eventsMap","pressend","click","doubleclick","disableActive","progressPlugin","progress","addCallBack","activeSeekNote","forward","usable","createThumbnail","timePreview","timePreviewStyle","curTimeColor","durationColor","backgroundColor","previewDom","curColor","durColor","color","disableTimeProgress","startPlugin","recover","mold","updateTime","updateBrightness","updateVolume","lastScope","seek","toFixed","hideControlsEnd","sendUseAction","focusVideoClick","dbClickHandler","pressRate","percent","updatePercent","isTouchingSeek","darkness","maxDarkness","isForward","focusHide","updateThumbnails","gradient","disableSeekIcon","miniYPer","isDisableTag","isContentEditable","Keyboard","keyCode","_keyState","disableBodyTrigger","isIgnoreUserActive","checkIsVisible","metaKey","altKey","ctrlKey","isBodyKeyDown","repeat","isKeyDown","isGlobalTrigger","checkCode","onBodyKeyUp","handleKeyDown","handleKeyUp","disableRootTrigger","onKeyup","extendkeyCodeMap","keyCodeMap","key1","seekStep","space","noBodyTarget","up","down","pressAction","esc","mergekeyCodeMap","isPress","tt","onKeydown","onBodyKeyDown","newConfig","checkVisible","rec","bottom","isBodyTarget","offsetCurrentTime","offsetDuration","_time","_step","_seekTime","handleKeyCode","curKeyCode","_this$keyCodeMap$arr$","_action","Loading","loadingIcon","TPL","styleKey","InnerList","fragments","_callBack","actionCallback","fragConfig","fragFocusClass","fragAutoFocus","fragClass","cachedIndex","playedIndex","focusIndex","newIndex","curIndex","millisecond","progressList","curPFrag","per","newPIndex","findIndex","unHightLight","setHightLight","_data","preIndex","fragment","cached","updateDuration","updateProgress","newCIndex","newOptions","_this$fragConfig","inner","isFocus","FRAGMENT_FOCUS_CLASS","POINT","HIGHLIGHT","Progress","_ePos","computeTime","triggerCallbacks","_updateInnerFocus","isLocked","updateWidth","seekTime","isPauseMoving","closeMoveSeek","isPlaying","onMoveStart","prePlayTime","isProgressMoving","progressBtn","_mouseDownHandlerHook","onMouseMove","onMouseUp","onMoveOnly","_assertThisInitialize5","onMoveEnd","_mouseUpHandlerHook","isEnter","_assertThisInitialize6","miniStartStep","_mouseMoveHandlerHook","_assertThisInitialize7","unlock","_this$pos","useable","__dragCallBacks","direc","_disableBlur","isDragingSeek","isDraggingSeek","innerList","reset","outer","updateFocus","_initInner","isMobile","bindDomEvents","onTimeupdate","onCacheUpdate","onReset","onVideoResize","frags","boxShadow","_mouseDownHandler","_mouseUpHandler","_mouseMoveHandler","onMouseDown","onMouseOver","onMouseOut","onBodyClick","pauseAutoHide","recoverAutoHide","isCloseClickSeek","realTime","endedDiff","rLeft","timeIcon","resetActive","notSeek","_end","bufferedPoint","thumbnailPlugin","controlsMode","Icon","_onMouseenter","_onMouseLeave","Play","_IconPlugin","btnClick","tipDom","changeLangTextKey","IconPlugin","TopBackIcon","screenBack","BackSVG","Fullscreen","rotateFullscreen","handleFullscreen","toggleFullScreen","tipsDom","needBackIcon","topBackIcon","_onOrientationChange","FullScreenSvg","ExitFullScreenSvg","getCssFullscreen","getRotateFullscreen","switchCallback","useScreenOrientation","unlockScreen","aspectRatio","lockScreen","lockOrientationType","screen","lock","Time","isActiving","constrolsMode","createCenterTime","durationDom","timeDom","centerCurDom","centerDurDom","current","minWidthTime","timeStr","updateState","TimeSegmentsControls","updateSegments","_checkIfEnabled","changeIndex","curPos","lastCurrentTime","_this$curPos","_this$player3","getSeekTime","_this$player4","_onDurationChange","_onLoadedData","_onPlay","_segs","formatTimeSegments","_item","_segDuration","segDuration","last","_timeSegments$index","diff2","Volume","bar","barRect","barH","updateVolumePos","onBarMouseUp","_d","isMoving","unFocus","showValueLabel","updateVolumeValue","volumeSmall","volumeSmallSvg","volumeLarge","volumeLargeSvg","volumeMuted","volumeMutedSvg","_timerId","changeMutedHandler","changeMuted","_onMouseenterHandler","onMouseenter","_onMouseleaveHandler","onMouseleave","onBarMousedown","onBarMouseMove","onVolumeChange","$labelValue","innerText","isForce","miniVolume","isShowVolumeValue","Rotate","onBtnClick","innerRotate","updateRotateDeg","rootWidth","clientWidth","rootHeight","clientHeight","clockwise","videoRotateDeg","_transform","_styles","transformOrigin","times","factor","RotateSvg","PresentationMode","isPIPAvailable","isPip","exitPIP","requestPIP","showIcon","pMode","initPipEvents","switchPIP","pipIcon","PipIcon","pipIconExit","PipIconExit","leavePIPCallback","pipWindow","enterPIPCallback","pictureInPictureWindow","onWebkitpresentationmodechanged","webkitPresentationMode","checkWebkitSetPresentationMode","pipWin","textContent","styleSheets","cssRules","rule","link","rel","head","preferDocument","isDocPIPAvailable","pipOptions","playerRect","documentPictureInPicture","requestWindow","docPiPNode","docPiPStyle","pipRoot","parentElement","previousSibling","nextSibling","copyStyleIntoPiPWindow","append","cssContent","webkitSetPresentationMode","requestPictureInPicture","reason","_documentPictureInPic","exitPictureInPicture","_documentPictureInPic2","pictureInPictureElement","pictureInPictureEnabled","disablePictureInPicture","webkitSupportsPresentationMode","protocol","PlayNextIcon","idx","urlList","nextHandler","playNext","Next","changeSrc","strFileName","strMimeType","blob","reader","defaultMime","mimeType","payload","anchor","myBlob","Blob","MozBlob","WebKitBlob","pop","ajax","XMLHttpRequest","responseType","response","send","msSaveBlob","dataUrlToBlob","saver","tempUiArr","Uint8Array","mx","charCodeAt","strUrl","parts","binData","atob","decodeURIComponent","uiArr","winMode","URL","revokeObjectURL","confirm","f","createObjectURL","btoa","encodeURIComponent","FileReader","readAsDataURL","Download","dUrl","newUrl","getAbsoluteURL","downloadUtil","_handler","DownloadSvg","div","ScreenShot","screenshotIcon","initSize","fitVideo","onClickBtn","filename","saveLink","MouseEvent","bubbles","view","initMouseEvent","dispatchEvent","canvas","canvasCtx","getContext","imageSmoothingEnabled","imageSmoothingQuality","shot","saveImg","saveScreenShot","option","quality","createCanvas","dx","dy","dw","dh","mediaRatio","canvasRatio","sw","sh","drawImage","toDataURL","OptionList","maxHeight","onItemClick","renderItemList","_delegates","attrKeys","selected","showText","changeCallback","curSelected","getAttrObj","LIST_TYPES","TOGGLE_MODES","IS_MOBILE","OptionsIcon","switchActiveState","toggleMode","toggle","listType","enterType","isIcons","curValue","hidePortrait","_resizeList","optionsList","activeEvent","onEnter","onLeave","onIconClick","_isIcons","focusAwhile","curItem","changeCurrentText","isItemClickHide","getTextByLang","itemList","_maxH","heightLimit","listStyle","DefinitionIcon","_OptionsIcon","changeDefinitionList","definitionList","items","showItem","PlaybackRate","curRate","itemInfo","_text","CssFullScreen","isCssfullScreen","handleCssFullscreen","contentIcon","switchTips","CssFullSceenSvg","ExitCssFullSceenSvg","ErrorPlugin","errorRetry","handleError","retry","errorNote","Prompt","intervalId","customConfig","customOnClick","showPrompt","hidePrompt","interval","highlight","hideinterval","ISPOT","mergeISPOT","iSpot","APIS","_updateDotDom","dotDom","calcuPosition","initDots","_ispots","createDot","ispotsInit","isNew","template","positionDot","findDot","updateDot","needShow","dot","showDot","deleteDot","del","deleteAllDots","dotDoms","getElementsByTagName","updateAllDots","iSpots","ispot","positionDots","playerSize","_pop","pRect","rect1","_left","_diff","getAllDotsDom","getDotDom","CALLBACK_MAP","dragmove","dragstart","dragend","mouseover","ProgressPreview","isHideThumbnailHover","isDrag","_curDot","onDotMouseLeave","blurDot","enableBlur","focusDot","disableBlur","videoPreview","videothumbnail","handlerSpotClick","_event","transformTimeHook","setTimeContent","ispots","progressDot","initDotsAPI","extTextRoot","previewLine","timePoint","timeText","tipText","_hasThumnail","bindEvents","onMousemove","onMousedown","onMouseup","handlerPreviewClick","updatePosition","cwidth","isflex","lwidth","showTips","isFocusDots","defaultText","hideTips","updateTimeText","updateLinePos","thumbnailConfig","isShowThumbnail","tRoot","isShowCoverPreview","totalWidth","widthPerSeconds","_activeDotId","isDefault","removeCallBack","miniWidth","Thumbnail","ratio","_preloadMark","initThumbnail","_this2$config","pic_num","containerWidth","containerHeight","row","col","urlIndex","indexInPage","rowIndex","colIndex","swidth","sHeight","getUrlByIndex","backgroundPosition","customStyle","getPosition","getBgColor","MiniProgress","MODES","nowTime","isSupportCanvas","DynamicBg","_frameCount","startFrameCount","stop","renderOnTimeupdate","visibilityState","_checkIfCanStart","renderOnce","_isLoaded","startInterval","_sVideo","checkVideoIsSupport","videoPI","preTime","_loopType","dynamicBg","frameRate","rwidth","rheight","renderByPoster","onLoadedData","onVisibilitychange","canvasFilter","supportCanvasFilter","isInnerRender","webkitFilter","mask","addMask","background","maskBg","_p","_tVideo","HTMLVideoElement","flyVideo","_tagName","updateImg","_this$canvas$getBound","image","sourcePI","_this$canvas$getBound2","multiple","checkIsSupportCanvas","INFO","Stats","actionData","_getTime","_stats","stats","getStats","JSON","stringify","downloadUrl","disabled","timestamp","timeFormat","toISOString","_recordUserActions","_recordInfo","_downloadStats","profile","_infoProfile","_info","startMs","endMs","cat","dur","ph","tid","ts","_this$_stats","mediaElem","mediaInfo","raw","timestat","_getTimeStats","_getProfile","msgs","stat","traceEvents","GapJump","seekingEventReceived","hasPlayed","smallGapLimit","gapDetectionThreshold","_getIndex","jumpTo","jumpSize","isGapSmall","BROWSER_GAP_TOLERANCE","useGapJump","isSafari","end_type","video_postion","onGapJump","threshold","bufferedInfo","_getBuffered","WaitingTimeoutJump","jumpCnt","jumpCntMax","useWaitingTimeoutJump","onJump","waitingTime","DEFAULT_SPEED_TYPE","SPEED_TYPE","TestSpeed","speedListCache","initSpeedList","cnt","testSpeed","testTimeStep","speed","appendList","openSpeed","loadSize","testCnt","testSpeedUrl","xhr","headers","Range","setRequestHeader","onreadystatechange","getResponseHeader","saveSpeedMax","shift","realTimeSpeed","getSpeedName","updateSpeed","getSpeed","avgSpeed","speedName","addSpeedTypeList","_onRealSpeedChange","namePrefix","FpsDetect","_lastDecodedFrames","_currentStuckCount","_lastCheckPoint","_payload","_startTick","_stopTick","_timer","_checkDecodeFPS","tick","enoughBuffer","buffers","curDecodedFrames","checkInterval","hidden","_this$_checkBuffer","_checkBuffer","reportFrame","stuckCount","_reset","_media$getVideoPlayba","currTime","curDecoded","_checkStuck","DefaultPreset","_this$plugins","_this$plugins2","_this$plugins3","simulateMode","contolsIcons","TimeSegments","TimeIcon","FullScreen","RotateIcon","PlaybackRateIcon","DownLoadIcon","ScreenShotIcon","PIPIcon","layers","Miniscreen","Xglogger","Mobile","PresetPlayer","_Player"],"mappings":"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"}