xgplayer 2.32.3 → 2.32.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/browser/controls/airplay.js +1 -1
  2. package/browser/controls/cssFullscreen.js +1 -1
  3. package/browser/controls/danmu.js +1 -3
  4. package/browser/controls/definition.js +1 -1
  5. package/browser/controls/download.js +1 -1
  6. package/browser/controls/enter.js +1 -1
  7. package/browser/controls/error.js +1 -1
  8. package/browser/controls/errorRetry.js +1 -1
  9. package/browser/controls/flex.js +1 -1
  10. package/browser/controls/fullscreen.js +1 -1
  11. package/browser/controls/loading.js +1 -1
  12. package/browser/controls/memoryPlay.js +1 -1
  13. package/browser/controls/miniplayer.js +7 -9
  14. package/browser/controls/mobile.js +1 -1
  15. package/browser/controls/nativeTextTrack.js +1 -1
  16. package/browser/controls/pip.js +1 -1
  17. package/browser/controls/play.js +1 -1
  18. package/browser/controls/playNext.js +1 -1
  19. package/browser/controls/playbackRate.js +1 -1
  20. package/browser/controls/poster.js +1 -1
  21. package/browser/controls/progress.js +1 -1
  22. package/browser/controls/reload.js +1 -1
  23. package/browser/controls/replay.js +1 -1
  24. package/browser/controls/rotate.js +1 -1
  25. package/browser/controls/screenShot.js +1 -1
  26. package/browser/controls/start.js +1 -1
  27. package/browser/controls/textTrack.js +1 -1
  28. package/browser/controls/time.js +1 -1
  29. package/browser/controls/volume.js +1 -1
  30. package/browser/core_player.js +1 -1
  31. package/browser/core_player.js.map +1 -1
  32. package/browser/index.js +7 -11
  33. package/browser/index.js.map +1 -1
  34. package/browser/simple_player.js +1 -1
  35. package/browser/simple_player.js.map +1 -1
  36. package/dist/controls/airplay.js +1 -1
  37. package/dist/controls/cssFullscreen.js +1 -1
  38. package/dist/controls/danmu.js +1 -3
  39. package/dist/controls/definition.js +1 -1
  40. package/dist/controls/download.js +1 -1
  41. package/dist/controls/enter.js +1 -1
  42. package/dist/controls/error.js +1 -1
  43. package/dist/controls/errorRetry.js +1 -1
  44. package/dist/controls/flex.js +1 -1
  45. package/dist/controls/fullscreen.js +1 -1
  46. package/dist/controls/loading.js +1 -1
  47. package/dist/controls/memoryPlay.js +1 -1
  48. package/dist/controls/miniplayer.js +7 -9
  49. package/dist/controls/mobile.js +1 -1
  50. package/dist/controls/nativeTextTrack.js +1 -1
  51. package/dist/controls/pip.js +1 -1
  52. package/dist/controls/play.js +1 -1
  53. package/dist/controls/playNext.js +1 -1
  54. package/dist/controls/playbackRate.js +1 -1
  55. package/dist/controls/poster.js +1 -1
  56. package/dist/controls/progress.js +1 -1
  57. package/dist/controls/reload.js +1 -1
  58. package/dist/controls/replay.js +1 -1
  59. package/dist/controls/rotate.js +1 -1
  60. package/dist/controls/screenShot.js +1 -1
  61. package/dist/controls/start.js +1 -1
  62. package/dist/controls/textTrack.js +1 -1
  63. package/dist/controls/time.js +1 -1
  64. package/dist/controls/volume.js +1 -1
  65. package/dist/core_player.js +2905 -2970
  66. package/dist/core_player.js.map +1 -1
  67. package/dist/index.js +6162 -5851
  68. package/dist/index.js.map +1 -1
  69. package/dist/simple_player.js +190 -164
  70. package/dist/simple_player.js.map +1 -1
  71. package/es/controls/airplay.js +1 -1
  72. package/es/controls/cssFullscreen.js +1 -1
  73. package/es/controls/danmu.js +1 -3
  74. package/es/controls/definition.js +1 -1
  75. package/es/controls/download.js +1 -1
  76. package/es/controls/enter.js +1 -1
  77. package/es/controls/error.js +1 -1
  78. package/es/controls/errorRetry.js +1 -1
  79. package/es/controls/flex.js +1 -1
  80. package/es/controls/fullscreen.js +1 -1
  81. package/es/controls/i18n.js +1 -1
  82. package/es/controls/keyboard.js +1 -1
  83. package/es/controls/loading.js +1 -1
  84. package/es/controls/localPreview.js +1 -1
  85. package/es/controls/memoryPlay.js +1 -1
  86. package/es/controls/miniplayer.js +7 -9
  87. package/es/controls/mobile.js +1 -1
  88. package/es/controls/nativeTextTrack.js +1 -1
  89. package/es/controls/pc.js +1 -1
  90. package/es/controls/pip.js +1 -1
  91. package/es/controls/play.js +1 -1
  92. package/es/controls/playNext.js +1 -1
  93. package/es/controls/playbackRate.js +1 -1
  94. package/es/controls/poster.js +1 -1
  95. package/es/controls/progress.js +1 -1
  96. package/es/controls/reload.js +1 -1
  97. package/es/controls/replay.js +1 -1
  98. package/es/controls/rotate.js +1 -1
  99. package/es/controls/screenShot.js +1 -1
  100. package/es/controls/start.js +1 -1
  101. package/es/controls/textTrack.js +1 -1
  102. package/es/controls/time.js +1 -1
  103. package/es/controls/volume.js +1 -1
  104. package/es/core_player.js +1 -1
  105. package/es/core_player.js.map +1 -1
  106. package/es/index.js +7 -11
  107. package/es/index.js.map +1 -1
  108. package/es/simple_player.js +1 -1
  109. package/es/simple_player.js.map +1 -1
  110. package/package.json +2 -1
  111. package/dist/index.min.css +0 -1
  112. package/dist/index.min.js +0 -2
  113. package/dist/index.min.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.min.js","sources":["../../../node_modules/eventemitter3/index.js","../src/utils/debug.js","../src/utils/xgplayerTimeRange.js","../src/utils/util.js","../src/utils/sniffer.js","../src/version.js","../src/error.js","../src/events.js","../src/mediaProxy.js","../src/utils/database.js","../src/constant.js","../src/plugin/hooksDescriptor.js","../src/plugin/basePlugin.js","../../../node_modules/delegate/src/closest.js","../../../node_modules/delegate/src/delegate.js","../src/plugin/plugin.js","../src/plugin/resizeObserver.js","../src/plugin/pluginsManager.js","../src/stateClassMap.js","../src/defaultConfig.js","../src/plugin/preset.js","../src/state.js","../src/plugins/controls/index.js","../src/lang/i18n.js","../src/lang/en.js","../src/player.js","../src/plugins/logger/index.js","../src/plugins/replay/index.js","../src/plugins/poster/index.js","../src/plugins/start/index.js","../src/plugins/enter/index.js","../src/plugins/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/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 { string } [attrs={}]\n * @param { string } [classname=\"\"]\n * @returns { HTMLElement | null }\n */\nutil.createDomFromHtml = function (html, attrs = {}, classname = '') {\n try {\n let doc = document.createElement('div')\n doc.innerHTML = html\n let dom = doc.children\n doc = null\n if (dom.length > 0) {\n dom = dom[0]\n classname && util.addClass(dom, classname)\n if (attrs) {\n Object.keys(attrs).forEach(key => {\n dom.setAttribute(key, attrs[key])\n })\n }\n return dom\n }\n return null\n } catch (err) {\n XG_DEBUG.logError('util.createDomFromHtml', err)\n return null\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { boolean }\n */\nutil.hasClass = function (el, className) {\n if (!el || !className) {\n return false\n }\n try {\n return Array.prototype.some.call(el.classList, item => item === className)\n } catch (e) {\n const orgClassName = el.className && typeof el.className === 'object' ? el.getAttribute('class') : el.className\n return orgClassName && !!orgClassName.match(new RegExp('(\\\\s|^)' + className + '(\\\\s|$)'))\n }\n // if (el.classList) {\n // return Array.prototype.some.call(el.classList, item => item === className)\n // } else {\n // const orgClassName = el.className && typeof el.className === 'object' ? el.getAttribute('class') : el.className\n // return orgClassName && !!orgClassName.match(new RegExp('(\\\\s|^)' + className + '(\\\\s|$)'))\n // }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.addClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.add(item)\n })\n } catch (e) {\n if (!util.hasClass(el, className)) {\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class') + ' ' + className)\n } else {\n el.className += ' ' + className\n }\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.removeClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.remove(item)\n })\n } catch (e) {\n if (util.hasClass(el, className)) {\n className.split(/\\s+/g).forEach(item => {\n const reg = new RegExp('(\\\\s|^)' + item + '(\\\\s|$)')\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class').replace(reg, ' '))\n } else {\n el.className = el.className.replace(reg, ' ')\n }\n })\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.toggleClass = function (el, className) {\n if (!el) {\n return\n }\n\n className.split(/\\s+/g).forEach(item => {\n if (util.hasClass(el, item)) {\n util.removeClass(el, item)\n } else {\n util.addClass(el, item)\n }\n })\n}\n\n/**\n *\n * @param { string | Object } args0\n * @param { string } [className]\n * @returns { string }\n */\nutil.classNames = function () {\n const classname = []\n for (let i = 0; i < arguments.length; i++) {\n if (util.typeOf(arguments[i]) === 'String') {\n // classname += `${arguments[i]}`\n classname.push(arguments[i])\n } else if (util.typeOf(arguments[i]) === 'Object') {\n Object.keys(arguments[i]).map(key => {\n if (arguments[i][key]) {\n // classname += key\n classname.push(key)\n }\n })\n }\n // if (i < arguments.length - 1) {\n // classname += ' '\n // }\n }\n return classname.join(' ')\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } sel\n * @returns { HTMLElement }\n */\nutil.findDom = function (el = document, sel) {\n let dom\n // fix querySelector IDs that start with a digit\n // https://stackoverflow.com/questions/37270787/uncaught-syntaxerror-failed-to-execute-queryselector-on-document\n try {\n dom = el.querySelector(sel)\n } catch (e) {\n XG_DEBUG.logError('util.findDom', e)\n if (sel.indexOf('#') === 0) {\n dom = el.getElementById(sel.slice(1))\n }\n }\n return dom\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } key\n * @returns { any }\n */\nutil.getCss = function (dom, key) {\n return dom.currentStyle ? dom.currentStyle[key] : document.defaultView.getComputedStyle(dom, false)[key]\n}\n\nutil.padStart = function (str, length, pad) {\n const charstr = String(pad)\n const len = length >> 0\n let maxlen = Math.ceil(len / charstr.length)\n const chars = []\n const r = String(str)\n while (maxlen--) {\n chars.push(charstr)\n }\n return chars.join('').substring(0, len - r.length) + r\n}\n\n/**\n *\n * @param { number } time\n * @returns { string }\n */\nutil.format = function (time) {\n if (window.isNaN(time)) {\n return ''\n }\n time = Math.round(time)\n const hour = util.padStart(Math.floor(time / 3600), 2, 0)\n const minute = util.padStart(Math.floor((time - hour * 3600) / 60), 2, 0)\n const second = util.padStart(Math.floor((time - hour * 3600 - minute * 60)), 2, 0)\n return (hour === '00' ? [minute, second] : [hour, minute, second]).join(':')\n}\n\n/**\n *\n * @param { Object } e\n * @returns { Object }\n */\nutil.event = function (e) {\n if (e.touches) {\n const touch = e.touches[0] || e.changedTouches[0]\n e.clientX = touch.clientX || 0\n e.clientY = touch.clientY || 0\n e.offsetX = touch.pageX - touch.target.offsetLeft\n e.offsetY = touch.pageY - touch.target.offsetTop\n }\n e._target = e.target || e.srcElement\n}\n\n/**\n *\n * @param { any } obj\n * @returns { string }\n */\nutil.typeOf = function (obj) {\n // eslint-disable-next-line no-lookahead-lookbehind-regexp/no-lookahead-lookbehind-regexp\n return Object.prototype.toString.call(obj).match(/([^\\s.*]+)(?=]$)/g)[0]\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepCopy = function (dst, src) {\n if (util.typeOf(src) === 'Object' && util.typeOf(dst) === 'Object') {\n Object.keys(src).forEach(key => {\n // eslint-disable-next-line no-undef\n if (util.typeOf(src[key]) === 'Object' && !(src[key] instanceof Node)) {\n if (dst[key] === undefined || dst[key] === undefined) {\n dst[key] = src[key]\n } else {\n util.deepCopy(dst[key], src[key])\n }\n } else if (util.typeOf(src[key]) === 'Array') {\n dst[key] = util.typeOf(dst[key]) === 'Array' ? dst[key].concat(src[key]) : src[key]\n } else {\n dst[key] = src[key]\n }\n })\n return dst\n }\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepMerge = function (dst, src) {\n Object.keys(src).map(key => {\n if (util.typeOf(src[key]) === 'Array' && util.typeOf(dst[key]) === 'Array') {\n if (util.typeOf(dst[key]) === 'Array') {\n dst[key].push(...src[key])\n }\n } else if (util.typeOf(dst[key]) === util.typeOf(src[key]) && dst[key] !== null && util.typeOf(dst[key]) === 'Object' && !(src[key] instanceof window.Node)) {\n util.deepMerge(dst[key], src[key])\n } else {\n src[key] !== null && (dst[key] = src[key])\n }\n })\n return dst\n}\n\nutil.getBgImage = function (el) {\n // fix: return current page url when url is none\n const url = (el.currentStyle || window.getComputedStyle(el, null)).backgroundImage\n if (!url || url === 'none') {\n return ''\n }\n const a = document.createElement('a')\n a.href = url.replace(/url\\(\"|\"\\)/g, '')\n return a.href\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { HTMLElement | null }\n */\nutil.copyDom = function (dom) {\n if (dom && dom.nodeType === 1) {\n const back = document.createElement(dom.tagName)\n Array.prototype.forEach.call(dom.attributes, (node) => {\n back.setAttribute(node.name, node.value)\n })\n if (dom.innerHTML) {\n back.innerHTML = dom.innerHTML\n }\n return back\n } else {\n return ''\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @param { function } intervalFunc\n * @param { number } frequency\n */\nutil.setInterval = function (context, eventName, intervalFunc, frequency) {\n if (!context._interval[eventName]) {\n context._interval[eventName] = window.setInterval(intervalFunc.bind(context), frequency)\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @returns { void }\n */\nutil.clearInterval = function (context, eventName) {\n clearInterval(context._interval[eventName])\n context._interval[eventName] = null\n}\n\n/**\n *\n * @param { any } context\n * @param { function } fun\n * @param { number } time\n * @returns { number }\n */\nutil.setTimeout = function (context, fun, time) {\n if (!context._timers) {\n context._timers = []\n }\n const id = setTimeout(() => {\n fun()\n util.clearTimeout(context, id)\n }, time)\n context._timers.push(id)\n return id\n}\n\n/**\n *\n * @param { any } context\n * @param { number } id\n */\nutil.clearTimeout = function (context, id) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n for (let i = 0; i < _timers.length; i++) {\n if (_timers[i] === id) {\n _timers.splice(i, 1)\n clearTimeout(id)\n break\n }\n }\n } else {\n clearTimeout(id)\n }\n}\n\n/**\n *\n * @param { any } context\n */\nutil.clearAllTimers = function (context) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n _timers.map(item => {\n clearTimeout(item)\n })\n context._timerIds = []\n }\n}\n\n/**\n *\n * @param { string } name\n * @param { string } imgUrl\n * @param { number } [width]\n * @param { number } [height]\n * @returns { HTMLElement }\n */\nutil.createImgBtn = function (name, imgUrl, width, height) {\n const btn = util.createDom(`xg-${name}`, '', {}, `xgplayer-${name}-img`)\n btn.style.backgroundImage = `url(\"${imgUrl}\")`\n if (width && height) {\n let w, h, unit\n ['px', 'rem', 'em', 'pt', 'dp', 'vw', 'vh', 'vm', '%'].every((item) => {\n if (width.indexOf(item) > -1 && height.indexOf(item) > -1) {\n w = parseFloat(width.slice(0, width.indexOf(item)).trim())\n h = parseFloat(height.slice(0, height.indexOf(item)).trim())\n unit = item\n return false\n } else {\n return true\n }\n })\n btn.style.width = `${w}${unit}`\n btn.style.height = `${h}${unit}`\n btn.style.backgroundSize = `${w}${unit} ${h}${unit}`\n if (name === 'start') {\n btn.style.margin = `-${h / 2}${unit} auto auto -${w / 2}${unit}`\n } else {\n btn.style.margin = 'auto 5px auto 5px'\n }\n }\n return btn\n}\n\n/**\n *\n * @param { string } hex\n * @param { string | number } alpha\n * @returns { string }\n */\nutil.Hex2RGBA = function (hex, alpha) {\n const rgb = [] // 定义rgb数组\n // eslint-disable-next-line no-useless-escape\n if (/^\\#[0-9A-F]{3}$/i.test(hex)) {\n let sixHex = '#'\n hex.replace(/[0-9A-F]/ig, function (kw) {\n sixHex += kw + kw\n })\n hex = sixHex\n }\n if (/^#[0-9A-F]{6}$/i.test(hex)) {\n hex.replace(/[0-9A-F]{2}/ig, function (kw) {\n rgb.push(parseInt(kw, 16))\n })\n return `rgba(${rgb.join(',')}, ${alpha})`\n } else {\n return 'rgba(255, 255, 255, 0.1)'\n }\n}\n\n/**\n *\n * @returns { HTMLElement | null }\n */\nutil.getFullScreenEl = function () {\n return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsFunction = function (fun) {\n return fun && typeof fun === 'function'\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsObject = function (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * @param { HTMLElement }\n */\nutil.hide = function (dom) {\n dom.style.display = 'none'\n}\n\n/**\n * @param { HTMLElement }\n * @param { block | flex | inline-block | inline-flex } [display]\n */\nutil.show = function (dom, display) {\n dom.style.display = display || 'block'\n}\n\n/**\n *\n * @param { any } val\n * @returns { boolean }\n */\nutil.isUndefined = function (val) {\n if (typeof val === 'undefined' || val === null) {\n return true\n }\n}\n\nutil.isNotNull = function (val) {\n return !(val === undefined || val === null)\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } [text]\n * @returns\n */\nutil.setStyleFromCsstext = function (dom, text) {\n // dom.setAttribute(style, text)\n if (!text) {\n return\n }\n if (util.typeOf(text) === 'String') {\n const styleArr = text.replace(/\\s+/g, '').split(';')\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n dom.style[arr[0]] = arr[1]\n }\n }\n })\n } else {\n Object.keys(text).map(key => {\n dom.style[key] = text[key]\n })\n }\n}\n\n/**\n *\n * @param { string } key\n * @param { Array<any>} list\n * @returns { boolean }\n */\nfunction checkIsIn (key, list) {\n for (let i = 0, len = list.length; i < len; i++) {\n if (key.indexOf(list[i]) > -1) {\n return true\n }\n }\n return false\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { Array<string> } [list] attribute names to filter\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.filterStyleFromText = function (dom, list = ['width', 'height', 'top', 'left', 'bottom', 'right', 'position', 'z-index', 'padding', 'margin', 'transform']) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n const remain = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n if (checkIsIn(arr[0], list)) {\n ret[arr[0]] = arr[1]\n // dom.style[arr[0]] = 'initial'\n } else {\n remain[arr[0]] = arr[1]\n }\n }\n }\n })\n dom.setAttribute('style', '')\n Object.keys(remain).map(key => {\n // netStyle += `${key}: ${remain[key]};`\n dom.style[key] = remain[key]\n })\n return ret\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.getStyleFromCsstext = function (dom) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n ret[arr[0]] = arr[1]\n }\n }\n })\n return ret\n}\n\nutil.preloadImg = (url, onload = () => {}, onerror = () => {}) => {\n if (!url) {\n return\n }\n let img = new window.Image()\n img.onload = (e) => {\n img = null\n onload && onload(e)\n }\n img.onerror = (e) => {\n img = null\n onerror && onerror(e)\n }\n img.src = url\n}\n\nutil.stopPropagation = (e) => {\n if (e) {\n e.stopPropagation()\n e.cancelable && e.preventDefault()\n }\n}\n\nutil.scrollTop = function () {\n return window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0\n}\n\nutil.scrollLeft = function () {\n return window.pageXOffset ||\n document.documentElement.scrollLeft ||\n document.body.scrollLeft ||\n 0\n}\n\nutil.checkTouchSupport = function () {\n return 'ontouchstart' in window\n}\n\nutil.getBuffered2 = (vbuffered, maxHoleDuration = 0.5) => { // ref: hls.js\n const buffered = []\n for (let i = 0; i < vbuffered.length; i++) {\n buffered.push({ start: vbuffered.start(i) < 0.5 ? 0 : vbuffered.start(i), end: vbuffered.end(i) })\n }\n buffered.sort(function (a, b) {\n const diff = a.start - b.start\n if (diff) {\n return diff\n } else {\n return b.end - a.end\n }\n })\n let buffered2 = []\n if (maxHoleDuration) {\n for (let i = 0; i < buffered.length; i++) {\n const buf2len = buffered2.length\n if (buf2len) {\n const buf2end = buffered2[buf2len - 1].end\n if ((buffered[i].start - buf2end) < maxHoleDuration) {\n if (buffered[i].end > buf2end) {\n buffered2[buf2len - 1].end = buffered[i].end\n }\n } else {\n buffered2.push(buffered[i])\n }\n } else {\n buffered2.push(buffered[i])\n }\n }\n } else {\n buffered2 = buffered\n }\n return new XgplayerTimeRange(buffered2)\n}\n\n/**\n * @description css中有zoom的时候,位移会等比缩放,但是元素的宽高不会等比缩放,所以通过该api做统一\n * https://bugs.chromium.org/p/chromium/issues/detail?id=429140#c8\n * @param {Events} e\n * @param {number} zoom\n * @returns\n */\nutil.getEventPos = function (e, zoom = 1) {\n if (e.touches && e.touches.length > 0) {\n e = e.touches[0]\n }\n return {\n x: e.x / zoom,\n y: e.y / zoom,\n clientX: e.clientX / zoom,\n clientY: e.clientY / zoom,\n offsetX: e.offsetX / zoom,\n offsetY: e.offsetY / zoom,\n pageX: e.pageX / zoom,\n pageY: e.pageY / zoom\n }\n}\n\nutil.requestAnimationFrame = function (callback) {\n const _fun = window.requestAnimationFrame ||\n // Older versions Chrome/Webkit\n window.webkitRequestAnimationFrame ||\n\n // Firefox < 23\n window.mozRequestAnimationFrame ||\n\n // opera\n window.oRequestAnimationFrame ||\n\n // ie\n window.msRequestAnimationFrame\n if (_fun) {\n return _fun(callback)\n }\n}\n\nutil.getHostFromUrl = function (url) {\n if (util.typeOf(url) !== 'String') {\n return ''\n }\n const results = url.split('/') // 以“/”进行分割\n let domain = ''\n if (results.length > 3 && results[2]) {\n domain = results[2]\n }\n return domain\n}\n\nutil.cancelAnimationFrame = function (frameId) {\n const _fun = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.cancelRequestAnimationFrame\n _fun && _fun(frameId)\n}\n\n/**\n * @desc Check whether it is MediaSource start\n * @param { HTMLVideoElement | HTMLAudioElement | HTMLElement } video\n * @returns { Boolean }\n */\nutil.isMSE = function (video) {\n if (!video || !(video instanceof HTMLMediaElement)) {\n return false\n }\n return /^blob/.test(video.currentSrc) || /^blob/.test(video.src)\n}\n\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\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\nfunction isObject (value) {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\nfunction debounce (func, wait, options) {\n let lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime\n\n let lastInvokeTime = 0\n let leading = false\n let maxing = false\n let trailing = true\n\n // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.\n const useRAF = (!wait && wait !== 0 && typeof window.requestAnimationFrame === 'function')\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n wait = +wait || 0\n if (isObject(options)) {\n leading = !!options.leading\n maxing = 'maxWait' in options\n maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n\n function invokeFunc (time) {\n const args = lastArgs\n const thisArg = lastThis\n\n lastArgs = lastThis = undefined\n lastInvokeTime = time\n result = func.apply(thisArg, args)\n return result\n }\n\n function startTimer (pendingFunc, wait) {\n if (useRAF) {\n window.cancelAnimationFrame(timerId)\n return window.requestAnimationFrame(pendingFunc)\n }\n return setTimeout(pendingFunc, wait)\n }\n\n function cancelTimer (id) {\n if (useRAF) {\n return window.cancelAnimationFrame(id)\n }\n clearTimeout(id)\n }\n\n function leadingEdge (time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time\n // Start the timer for the trailing edge.\n timerId = startTimer(timerExpired, wait)\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result\n }\n\n function remainingWait (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n const timeWaiting = wait - timeSinceLastCall\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting\n }\n\n function shouldInvoke (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait))\n }\n\n function timerExpired () {\n const time = Date.now()\n if (shouldInvoke(time)) {\n return trailingEdge(time)\n }\n // Restart the timer.\n timerId = startTimer(timerExpired, remainingWait(time))\n }\n\n function trailingEdge (time) {\n timerId = undefined\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time)\n }\n lastArgs = lastThis = undefined\n return result\n }\n\n function cancel () {\n if (timerId !== undefined) {\n cancelTimer(timerId)\n }\n lastInvokeTime = 0\n lastArgs = lastCallTime = lastThis = timerId = undefined\n }\n\n function flush () {\n return timerId === undefined ? result : trailingEdge(Date.now())\n }\n\n function pending () {\n return timerId !== undefined\n }\n\n function debounced (...args) {\n const time = Date.now()\n const isInvoking = shouldInvoke(time)\n\n lastArgs = args\n lastThis = this\n lastCallTime = time\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime)\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = startTimer(timerExpired, wait)\n return invokeFunc(lastCallTime)\n }\n }\n if (timerId === undefined) {\n timerId = startTimer(timerExpired, wait)\n }\n return result\n }\n debounced.cancel = cancel\n debounced.flush = flush\n debounced.pending = pending\n return debounced\n}\n\nfunction throttle (func, wait, options) {\n let leading = true\n let trailing = true\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n return debounce(func, wait, {\n leading,\n trailing,\n maxWait: wait\n })\n}\n\n/**\n * @returns { string }\n */\nfunction getLang () {\n let lang = (document.documentElement.getAttribute('lang') || navigator.language || 'zh-cn').toLocaleLowerCase()\n if (lang === 'zh-cn') {\n lang = 'zh'\n }\n return lang\n}\n\nfunction checkIsCurrentVideo (element, playerId, key) {\n if (!element) {\n return\n }\n const pid = element.getAttribute(key)\n if (pid && pid === playerId && (element.tagName === 'VIDEO' || element.tagName === 'AUDIO')) {\n return true\n }\n return false\n}\n\nexport {\n util as default,\n checkIsCurrentVideo,\n debounce,\n throttle,\n getLang\n}\n","/**\n * @typedef {{\n * isSupport: boolean,\n * mime: string\n * }} ICheckResult\n */\n\n/**\n * @typedef {{\n * device: 'pc' | 'mobile',\n * browser: 'ie' | 'firefox' | 'chrome' | 'opera' | 'safari',\n * os: {\n * isTablet: boolean,\n * isPhone: boolean,\n * isIpad: boolean,\n * isIos: boolean,\n * isAndroid: boolean,\n * isPc: boolean,\n * isSymbian: boolean,\n * isWindowsPhone: boolean,\n * isFireFox: boolean\n * },\n * isWeixin: boolean,\n * isSupportMP4(): ICheckResult,\n * isHevcSupported(): boolean\n * probeConfigSupported(info: MediaDecodingConfiguration): Promise<MediaCapabilitiesDecodingInfo>\n * }} ISniffer\n */\n\nconst VERSION_REG = {\n android: /(Android)\\s([\\d.]+)/,\n ios: /(Version)\\/([\\d.]+)/\n}\n\nconst H264_MIMETYPES = [\n 'avc1.42E01E, mp4a.40.2',\n 'avc1.58A01E, mp4a.40.2',\n 'avc1.4D401E, mp4a.40.2',\n 'avc1.64001E, mp4a.40.2',\n 'avc1.42E01E',\n 'mp4v.20.8',\n 'avc1.42E01E, mp4a.40.2',\n 'avc1.58A01E, mp4a.40.2',\n 'avc1.4D401E, mp4a.40.2',\n 'avc1.64001E, mp4a.40.2',\n 'mp4v.20.8, mp4a.40.2',\n 'mp4v.20.240, mp4a.40.2'\n]\n\n/**\n * @type ISniffer\n */\nconst sniffer = {\n get device () {\n const r = sniffer.os\n return r.isPc ? 'pc' : 'mobile'\n // return r.isPc ? 'pc' : r.isTablet ? 'tablet' : 'mobile'\n },\n get browser () {\n if (typeof navigator === 'undefined') {\n return ''\n }\n const ua = navigator.userAgent.toLowerCase()\n const reg = {\n ie: /rv:([\\d.]+)\\) like gecko/,\n firefox: /firefox\\/([\\d.]+)/,\n chrome: /chrome\\/([\\d.]+)/,\n opera: /opera.([\\d.]+)/,\n safari: /version\\/([\\d.]+).*safari/\n }\n return [].concat(Object.keys(reg).filter(key => reg[key].test(ua)))[0]\n },\n get os () {\n if (typeof navigator === 'undefined') {\n return {}\n }\n const ua = navigator.userAgent\n const isWindowsPhone = /(?:Windows Phone)/.test(ua)\n const isSymbian = /(?:SymbianOS)/.test(ua) || isWindowsPhone\n const isAndroid = /(?:Android)/.test(ua)\n const isFireFox = /(?:Firefox)/.test(ua)\n const isTablet =\n /(?:iPad|PlayBook)/.test(ua) ||\n (isAndroid && !/(?:Mobile)/.test(ua)) ||\n (isFireFox && /(?:Tablet)/.test(ua))\n const isPhone = /(?:iPhone)/.test(ua) && !isTablet\n const isPc = !isPhone && !isAndroid && !isSymbian && !isTablet\n const isIpad = /(?:iPad|PlayBook)/.test(ua)\n return {\n isTablet,\n isPhone,\n isIpad,\n isIos: isPhone || isIpad,\n isAndroid,\n isPc,\n isSymbian,\n isWindowsPhone,\n isFireFox\n }\n },\n\n get osVersion () {\n if (typeof navigator === 'undefined') {\n return 0\n }\n const ua = navigator.userAgent\n let reg = ''\n // ios\n if (/(?:iPhone)|(?:iPad|PlayBook)/.test(ua)) {\n reg = VERSION_REG.ios\n // android\n } else {\n reg = VERSION_REG.android\n }\n const _match = reg ? reg.exec(ua) : []\n if (_match && _match.length >= 3) {\n const version = _match[2].split('.')\n return version.length > 0 ? parseInt(version[0]) : 0\n }\n return 0\n },\n\n get isWeixin () {\n if (typeof navigator === 'undefined') {\n return false\n }\n const reg = /(micromessenger)\\/([\\d.]+)/\n const match = reg.exec(navigator.userAgent.toLocaleLowerCase())\n if (match) {\n return true\n }\n return false\n },\n\n /**\n *\n * @returns {{\n * isSupport: boolean,\n * mime: string\n * }}\n */\n isSupportMP4 () {\n const result = {\n isSupport: false,\n mime: ''\n }\n if (typeof document === 'undefined') {\n return result\n }\n if (this.supportResult) {\n return this.supportResult\n }\n let a = document.createElement('video')\n if (typeof a.canPlayType === 'function') {\n H264_MIMETYPES.map((key) => {\n if (a.canPlayType(`video/mp4; codecs=\"${key}\"`) === 'probably') {\n result.isSupport = true\n result.mime += `||${key}`\n }\n })\n }\n this.supportResult = result\n a = null\n return result\n },\n\n /**\n * Is HEVC Hardware decoding supported by current browser\n * @returns {boolean}\n */\n isHevcSupported () {\n if (typeof MediaSource === 'undefined' || !MediaSource.isTypeSupported) {\n return false\n }\n return (\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.1.6.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.2.4.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.3.E.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.4.10.L120.90\"')\n )\n },\n\n /**\n * @param { MediaDecodingConfiguration } info\n * @returns { Promise<MediaCapabilitiesDecodingInfo> }\n */\n probeConfigSupported (info) {\n const defaults = {\n supported: false,\n smooth: false,\n powerEfficient: false\n }\n if (!info || typeof navigator === 'undefined') {\n return Promise.resolve(defaults)\n }\n if (\n navigator.mediaCapabilities &&\n navigator.mediaCapabilities.decodingInfo\n ) {\n return navigator.mediaCapabilities.decodingInfo(info)\n } else {\n const videoConfig = info.video || {}\n const audioConfig = info.audio || {}\n try {\n const videoSupported = MediaSource.isTypeSupported(\n videoConfig.contentType\n )\n const audioSupported = MediaSource.isTypeSupported(\n audioConfig.contentType\n )\n\n return Promise.resolve({\n supported: videoSupported && audioSupported,\n smooth: false,\n powerEfficient: false\n })\n } catch (e) {\n return Promise.resolve(defaults)\n }\n }\n }\n}\n\nexport default sniffer\n","/**\n * @type {string}\n * */\nexport default __VERSION__\n","// eslint-disable-next-line no-undef\nimport version from './version'\nimport Util from './utils/util'\n/**\n * @typedef { import ('./player').default } Player\n */\n\nconst ERROR_TYPE_MAP = {\n 1: 'media',\n 2: 'media',\n 3: 'media',\n 4: 'media',\n 5: 'media',\n 6: 'media'\n}\n\nconst ERROR_MAP = {\n 1: 5101,\n 2: 5102,\n 3: 5103,\n 4: 5104,\n 5: 5105,\n 6: 5106\n}\n\nconst ErrorTypes = {\n network: {\n code: 1\n },\n mse: {\n code: 2\n },\n parse: {\n code: 3\n },\n format: {\n code: 4\n },\n decoder: {\n code: 5\n },\n runtime: {\n code: 6\n },\n timeout: {\n code: 7\n },\n other: {\n code: 8\n }\n}\n\n/**\n * @typedef { {\n * playerVersion: string,\n * currentTime: number,\n * duration: number,\n * ended: boolean,\n * readyState: number,\n * networkState: number,\n * src: any,\n * errorType: string,\n * errorCode: number,\n * message: string,\n * mediaError?: {\n * code: number,\n * message?: string\n * },\n * originError?: any,\n * url?: any,\n * host?: string,\n * [propName: string]: any\n * } } IError\n */\n\n/**\n * @type { IError }\n */\nclass Errors {\n /**\n *\n * @param { Player } player\n * @param { {\n * errorType: string,\n * errorCode: number,\n * errorMessage: string,\n * originError: any,\n * ext: { [propName: string]: any; }\n * } } errorInfo\n * @returns\n */\n constructor (player, errorInfo = { errorType: '', errorCode: 0, errorMessage: '', originError: '', ext: {}, mediaError: null }) {\n const ERROR_TYPES = player && player.i18n ? player.i18n.ERROR_TYPES : null\n if (player.media) {\n const mediaError = errorInfo.mediaError ? errorInfo.mediaError : (player.media.error || {})\n const { duration, currentTime, ended, src, currentSrc } = player\n const { readyState, networkState } = player.media\n let _errc = errorInfo.errorCode || mediaError.code\n if (ERROR_MAP[_errc]) {\n _errc = ERROR_MAP[_errc]\n }\n const r = {\n playerVersion: version,\n currentTime,\n duration,\n ended,\n readyState,\n networkState,\n src: src || currentSrc,\n errorType: errorInfo.errorType,\n errorCode: _errc,\n message: errorInfo.errorMessage || mediaError.message,\n mediaError,\n originError: errorInfo.originError ? errorInfo.originError.stack : '',\n host: Util.getHostFromUrl(src || currentSrc)\n }\n errorInfo.ext && Object.keys(errorInfo.ext).map(key => {\n r[key] = errorInfo.ext[key]\n })\n return r\n } else {\n if (arguments.length > 1) {\n const r = {\n playerVersion: version,\n domain: document.domain\n }\n const arr = ['errorType', 'currentTime', 'duration', 'networkState', 'readyState', 'src', 'currentSrc', 'ended', 'errd', 'errorCode', 'mediaError']\n for (let i = 0; i < arguments.length; i++) {\n r[arr[i]] = arguments[i]\n }\n r.ex = ERROR_TYPES ? (ERROR_TYPES[arguments[0]] || {}).msg : ''// 补充信息\n return r\n }\n }\n }\n}\n\nexport {\n Errors as default,\n ErrorTypes,\n ERROR_TYPE_MAP\n}\n","export const PLAY = 'play'\nexport const PLAYING = 'playing'\nexport const ENDED = 'ended'\nexport const PAUSE = 'pause'\nexport const ERROR = 'error'\nexport const SEEKING = 'seeking'\nexport const SEEKED = 'seeked'\nexport const TIME_UPDATE = 'timeupdate'\nexport const WAITING = 'waiting'\nexport const CANPLAY = 'canplay'\nexport const CANPLAY_THROUGH = 'canplaythrough'\nexport const DURATION_CHANGE = 'durationchange'\nexport const VOLUME_CHANGE = 'volumechange'\nexport const LOADED_DATA = 'loadeddata'\nexport const RATE_CHANGE = 'ratechange'\nexport const PROGRESS = 'progress'\nexport const LOAD_START = 'loadstart'\nexport const EMPTIED = 'emptied'\nexport const STALLED = 'stalled'\nexport const SUSPEND = 'suspend'\nexport const ABORT = 'abort'\n\n// player events\nexport const BUFFER_CHANGE = 'bufferedChange'\nexport const PLAYER_FOCUS = 'focus'\nexport const PLAYER_BLUR = 'blur'\nexport const READY = 'ready'\nexport const URL_NULL = 'urlNull'\nexport const AUTOPLAY_STARTED = 'autoplay_started'\nexport const AUTOPLAY_PREVENTED = 'autoplay_was_prevented'\nexport const COMPLETE = 'complete'\nexport const REPLAY = 'replay'\nexport const DESTROY = 'destroy'\nexport const URL_CHANGE = 'urlchange'\nexport const DOWNLOAD_SPEED_CHANGE = 'download_speed_change'\n\n// screen change evnets\nexport const FULLSCREEN_CHANGE = 'fullscreen_change'\nexport const CSS_FULLSCREEN_CHANGE = 'cssFullscreen_change'\nexport const MINI_STATE_CHANGE = 'mini_state_change'\n\nexport const DEFINITION_CHANGE = 'definition_change'\nexport const BEFORE_DEFINITION_CHANGE = 'before_definition_change'\nexport const AFTER_DEFINITION_CHANGE = 'after_definition_change'\n\n// transmuxer events\nexport const SEI_PARSED = 'SEI_PARSED'\n\nexport const RETRY = 'retry'\n\n// 容器宽高变化\nexport const VIDEO_RESIZE = 'video_resize'\n\n// picture-in-picture状态变化\nexport const PIP_CHANGE = 'pip_change'\n\n// rotate change\nexport const ROTATE = 'rotate'\n\n// screenShot\nexport const SCREEN_SHOT = 'screenShot'\n\n// play next\nexport const PLAYNEXT = 'playnext'\n\nexport const SHORTCUT = 'shortcut'\n\nexport const XGLOG = 'xglog'\n\nexport const USER_ACTION = 'user_action'\n\nexport const RESET = 'reset'\n\nexport const 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 '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 } from './events'\n/**\n * @typedef { import ('eventemitter3') } EventEmitter\n */\n/**\n * @typedef { {\n * duration: number,\n * currentTime: number,\n * muted: boolean,\n * defaultMuted: boolean,\n * volume: number,\n * playbackRate: number,\n * defaultPlaybackRate: number,\n * autoplay: boolean,\n * readonly paused: boolean,\n * readonly ended: boolean,\n * readonly networkState: number,\n * readonly readyState: number,\n * readonly seeking: boolean,\n * src: any,\n * play: Function,\n * pause: Function,\n * } } IMediaProxy\n */\n\nfunction emitVideoEvent (eventKey, e) {\n if (!this || !this.emit) {\n return\n }\n if (eventKey === 'error') {\n this.errorHandler(eventKey, e.error)\n } else {\n this.emit(eventKey, e)\n }\n}\n\n// 获取包装EventsMiddleware后的VIDEO_EVENT\nfunction getVideoEventHandler (eventKey, player) {\n return (e, _err) => {\n const eData = {\n player,\n eventName: eventKey,\n originalEvent: e,\n detail: e.detail || {},\n timeStamp: e.timeStamp,\n currentTime: player.currentTime,\n duration: player.duration,\n paused: player.paused,\n ended: player.ended,\n isInternalOp: !!player._internalOp[e.type], // 是否是内部操作,不反应到UI上\n muted: player.muted,\n volume: player.volume,\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype\n }\n player.removeInnerOP(e.type)\n if (eventKey === 'timeupdate') {\n player._currentTime = player.media && player.media.currentTime\n }\n\n // 避免playbackRate和defaultPlaybackRate同时设置导致多次触发事件\n if (eventKey === 'ratechange') {\n const _rate = player.media ? player.media.playbackRate : 0\n if (_rate && player._rate === _rate) {\n return\n }\n player._rate = player.media && player.media.playbackRate\n }\n\n if (eventKey === 'durationchange') {\n player._duration = player.media.duration\n }\n\n if (eventKey === 'volumechange') {\n eData.isMutedChange = player._lastMuted !== player.muted\n player._lastMuted = player.muted\n }\n\n if (eventKey === 'error') {\n eData.error = _err || player.video.error\n }\n\n // 执行video相关事件中间件能力\n if (player.mediaEventMiddleware[eventKey]) {\n const callback = emitVideoEvent.bind(player, eventKey, eData)\n try {\n player.mediaEventMiddleware[eventKey].call(player, eData, callback)\n } catch (err) {\n emitVideoEvent.call(player, eventKey, eData)\n throw err\n }\n } else {\n emitVideoEvent.call(player, eventKey, eData)\n }\n }\n}\n\n/**\n * @extends { EventEmitter }\n */\nclass MediaProxy extends EventEmitter {\n constructor (options) {\n super(options)\n /**\n * @private\n */\n this._hasStart = false\n /**\n * @private\n */\n this._currentTime = 0\n /**\n * @private\n */\n this._duration = 0\n /**\n * @private\n */\n this._internalOp = {}\n /**\n * @private\n */\n this._lastMuted = false\n\n /**\n * @type {string}\n * 当前播放类型\n */\n this.vtype = 'MP4'\n\n /**\n * @type {number}\n * @private\n */\n this._rate = -1\n /**\n * @description 初始化时添加在video上的属性集合\n * @type { {[propName: string]: any } }\n */\n this.mediaConfig = Object.assign({}, {\n controls: false,\n autoplay: options.autoplay,\n playsinline: options.playsinline,\n 'x5-playsinline': options.playsinline,\n 'webkit-playsinline': options.playsinline,\n 'x5-video-player-fullscreen': options['x5-video-player-fullscreen'] || options.x5VideoPlayerFullscreen,\n 'x5-video-orientation': options['x5-video-orientation'] || options.x5VideoOrientation,\n airplay: options.airplay,\n 'webkit-airplay': options.airplay,\n tabindex: options.tabindex | 0,\n mediaType: options.mediaType || 'video'\n }, 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 /**\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 => {\n this.media.appendChild(Util.createDom('source', '', {\n src: `${item.src}`,\n type: `${item.type || ''}`\n }))\n })\n const _c = video.children\n if (!_c) {\n return\n }\n /**\n * @private\n */\n this._videoSourceCount = _c.length\n /**\n * @private\n */\n let _eHandler = null\n\n for (let i = 0; i < this._evHandlers.length; i++) {\n if (Object.keys(this._evHandlers[i])[0] === 'error') {\n _eHandler = this._evHandlers[i]\n break\n }\n }\n !this._sourceError && (this._sourceError = (e) => {\n this._videoSourceCount--\n if (this._videoSourceCount === 0) {\n const _err = { code: 4, message: 'sources load error' }\n _eHandler ? _eHandler.error(e, _err) : this.errorHandler('error', _err)\n }\n })\n for (let i = 0; i < _c.length; i++) {\n _c[i].addEventListener('error', this._sourceError)\n }\n }\n\n /**\n * 移除source列表错误事件监听\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n */\n _detachSourceEvents (video) {\n const _c = video.children\n if (!_c || _c.length === 0 || !this._sourceError) {\n return\n }\n for (let i = 0; i < _c.length; i++) {\n _c[i].removeEventListener('error', this._sourceError)\n }\n while (_c.length > 0) {\n video.removeChild(_c[0])\n }\n }\n\n /**\n * @description Media Error handler\n * @param { string } eventName\n */\n errorHandler (name, error = null) {\n if (this.media && (this.media.error || error)) {\n let _e = this.media.error || error\n const type = _e.code ? ERROR_TYPE_MAP[_e.code] : 'other'\n let message = _e.message\n if (!this.media.currentSrc) {\n message = 'empty_src'\n _e = {\n code: 6,\n message\n }\n }\n this.emit(name, new Errors(this, {\n errorType: type,\n errorCode: _e.code,\n errorMessage: _e.message || '',\n mediaError: _e\n }))\n }\n }\n\n destroy () {\n if (this.media) {\n if (this.media.pause) {\n this.media.pause()\n this.media.muted = true\n }\n this.media.removeAttribute('src') // empty source\n this.media.load()\n }\n this._currentTime = 0\n this._duration = 0\n this.mediaConfig = null\n for (const k in this._interval) {\n if (Object.prototype.hasOwnProperty.call(this._interval, k)) {\n clearInterval(this._interval[k])\n this._interval[k] = null\n }\n }\n this.detachVideoEvents()\n this.media = null\n this.mediaEventMiddleware = {}\n this.removeAllListeners()\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media\n */\n get video () {\n return this.media\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media= xx\n */\n set video (media) {\n this.media = media\n }\n\n /**\n *\n * @returns { Promise<void> | null }\n */\n play () {\n const ret = this.media ? this.media.play() : null\n return ret\n }\n\n pause () {\n this.media && this.media.pause()\n }\n\n load () {\n this.media && this.media.load()\n }\n\n /**\n *\n * @param { string } type\n * @returns { boolean }\n */\n canPlayType (type) {\n return this.media ? this.media.canPlayType(type) : false\n }\n\n /**\n *\n * @param { any } [buffered]\n * @returns { Array<number> }\n */\n getBufferedRange (buffered) {\n const range = [0, 0]\n if (!this.media) {\n return range\n }\n if (!buffered) {\n buffered = this.media.buffered\n }\n const currentTime = this.media.currentTime\n if (buffered) {\n for (let i = 0, len = buffered.length; i < len; i++) {\n range[0] = buffered.start(i)\n range[1] = buffered.end(i)\n if (range[0] <= currentTime && currentTime <= range[1]) {\n break\n }\n }\n }\n if (range[0] - currentTime <= 0 && currentTime - range[1] <= 0) {\n return range\n } else {\n return [0, 0]\n }\n }\n\n /**\n * @type { boolean }\n * @description 设置/返回 自动播放属性\n */\n set autoplay (isTrue) {\n this.media && (this.media.autoplay = isTrue)\n }\n\n get autoplay () {\n return this.media ? this.media.autoplay : false\n }\n\n /**\n * @type { TimeRanges | null }\n * @description 返回当前缓冲的TimeRange对象集合\n */\n get buffered () {\n return this.media ? this.media.buffered : null\n }\n\n /**\n * @type { Array<{start: number, end: number}> | null}\n * @description 返回当前自定义的缓存列表\n */\n get buffered2 () {\n return this.media && this.media.buffered ? Util.getBuffered2(this.media.buffered) : null\n }\n\n /**\n * @type { {start: number, end: number} }\n */\n get bufferedPoint () {\n const ret = {\n start: 0,\n end: 0\n }\n if (!this.media) {\n return ret\n }\n const _buffered = this.media.buffered\n if (!_buffered || _buffered.length === 0) {\n return ret\n }\n for (let i = 0; i < _buffered.length; i++) {\n if ((_buffered.start(i) <= this.currentTime || _buffered.start(i) < 0.1) && _buffered.end(i) >= this.currentTime) {\n return {\n start: _buffered.start(i),\n end: _buffered.end(i)\n }\n }\n }\n return ret\n }\n\n /**\n * @type { string}\n * @description 设置/返回是否跨域\n * */\n get crossOrigin () {\n return this.media ? this.media.crossOrigin : ''\n }\n\n set crossOrigin (isTrue) {\n this.media && (this.media.crossOrigin = isTrue)\n }\n\n /**\n * @type { string }\n * @description 设置/返回视频播放地址\n * */\n get currentSrc () {\n return this.media ? this.media.currentSrc : ''\n }\n\n set currentSrc (src) {\n this.media && (this.media.currentSrc = src)\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频当前播放时间\n * */\n get currentTime () {\n if (!this.media) {\n return 0\n }\n return this.media.currentTime !== undefined ? this.media.currentTime : this._currentTime\n }\n\n set currentTime (time) {\n this.media && (this.media.currentTime = time)\n }\n\n /**\n * @type { boolean }\n * 设置/返回视频默认静音\n * */\n get defaultMuted () {\n return this.media ? this.media.defaultMuted : false\n }\n\n set defaultMuted (isTrue) {\n this.media && (this.media.defaultMuted = isTrue)\n }\n\n /**\n * @type { number }\n * @description 返回视频时长,单位:s\n * */\n get duration () {\n return this._duration\n }\n\n /**\n * @type { boolean }\n * @description 回视频是否播放结束\n * */\n get ended () {\n return this.media ? this.media.ended : false\n }\n\n /**\n * @type { MediaError }\n * @description the player current error\n */\n get error () {\n return this.media.error\n }\n\n /**\n * @type { string }\n * @description return error description text\n */\n get errorNote () {\n const err = this.media.error\n if (!err) {\n return ''\n }\n const status = [\n 'MEDIA_ERR_ABORTED',\n 'MEDIA_ERR_NETWORK',\n 'MEDIA_ERR_DECODE',\n 'MEDIA_ERR_SRC_NOT_SUPPORTED'\n ]\n return status[this.media.error.code - 1]\n }\n\n /**\n * @type { boolean }\n * @description 否开启了循环播放\n */\n get loop () {\n return this.media ? this.media.loop : false\n }\n\n set loop (isTrue) {\n this.media && (this.media.loop = isTrue)\n }\n\n /**\n * @type { boolean }\n * @description 静音\n */\n get muted () {\n return this.media ? this.media.muted : false\n }\n\n set muted (isTrue) {\n if (!this.media || this.media.muted === isTrue) {\n return\n }\n this._lastMuted = this.media.muted\n this.media.muted = isTrue\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 }\n * @description 返回视频的当前网络状态\n */\n get networkState () {\n return this.media.networkState\n }\n\n /**\n * @type { boolean }\n * @description 回当前视频是否是暂停状态\n */\n get paused () {\n return this.media ? this.media.paused : true\n }\n\n /**\n * @type { number }\n * @description 返回/设置倍速\n */\n get playbackRate () {\n return this.media ? this.media.playbackRate : 0\n }\n\n set playbackRate (rate) {\n if (!this.media || rate === Infinity) {\n return\n }\n this.media.defaultPlaybackRate = rate\n this.media.playbackRate = rate\n }\n\n /**\n * @type { TimeRanges | null}\n */\n get played () {\n return this.media ? this.media.played : null\n }\n\n /**\n * @type { boolean }\n */\n get preload () {\n return this.media ? this.media.preload : false\n }\n\n set preload (isTrue) {\n this.media && (this.media.preload = isTrue)\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 | 4 }\n * @description 回视频的就绪状态\n */\n get readyState () {\n return this.media.readyState\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否可以seek\n */\n get seekable () {\n return this.media ? this.media.seekable : false\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否处于seeking状态下\n */\n get seeking () {\n return this.media ? this.media.seeking : false\n }\n\n /**\n * @type { any }\n * @description 设置/返回当前视频的地址\n */\n get src () {\n return this.media ? this.media.src : ''\n }\n\n set src (url) {\n if (!this.media) {\n return\n }\n this.emit(URL_CHANGE, url)\n this.emit(WAITING)\n // this.media.pause()\n this._currentTime = 0\n this._duration = 0\n // Some firefox versions firefox Cannot recognize currentSrc of type Blob\n if (/^blob/.test(this.media.currentSrc) || /^blob/.test(this.media.src)) { // has transmuxer core\n this.onWaiting()\n return\n }\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array') {\n this._attachSourceEvents(this.media, url)\n } else if (url) {\n this.media.src = url\n } else {\n this.media.removeAttribute('src')\n }\n this.load()\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频的音量\n */\n get volume () {\n return this.media ? this.media.volume : 0\n }\n\n set volume (vol) {\n if (vol === Infinity || !this.media) {\n return\n }\n this.media.volume = vol\n }\n\n addInnerOP (event) {\n this._internalOp[event] = true\n }\n\n removeInnerOP (event) {\n delete this._internalOp[event]\n }\n /** ******************* 以下api只有申明作用,具体实现依赖EventEmitter ******************/\n\n /**\n *\n * @param { string } event\n * @param { any } [data]\n * @returns\n */\n emit (event, data, ...args) {\n super.emit(event, data, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (data?: any) => any } callback\n * @returns\n */\n on (event, callback, ...args) {\n super.on(event, callback, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (data?: any) => any } callback\n * @returns\n */\n once (event, callback, ...args) {\n super.once(event, callback, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (data?: any) => any } callback\n * @returns\n */\n off (event, callback, ...args) {\n super.off(event, callback, ...args)\n }\n\n offAll () {\n super.removeAllListeners()\n }\n}\n\nexport default MediaProxy\n","class INDEXDB {\n constructor (mydb = { name: 'xgplayer', version: 1, db: null, ojstore: { name: 'xg-m4a', keypath: 'vid' } }) {\n this.indexedDB = window.indexedDB || window.webkitindexedDB\n this.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange // 键范围\n this.myDB = mydb\n }\n\n openDB (callback) {\n // 建立或打开数据库,建立对象存储空间(ObjectStore)\n const self = this\n const version = this.myDB.version || 1\n const request = self.indexedDB.open(self.myDB.name, version)\n request.onerror = function (e) {\n // console.log('e.currentTarget.error.message')\n }\n request.onsuccess = e => {\n this.myDB.db = e.target.result\n // console.log('成功建立并打开数据库:' + this.myDB.name + ' version' + this.myDB.version)\n callback.call(self)\n }\n request.onupgradeneeded = e => {\n const db = e.target.result\n // eslint-disable-next-line no-unused-vars\n const transaction = e.target.transaction\n // eslint-disable-next-line no-unused-vars\n let store\n if (!db.objectStoreNames.contains(self.myDB.ojstore.name)) {\n // 没有该对象空间时创建该对象空间\n // eslint-disable-next-line no-unused-vars\n store = db.createObjectStore(self.myDB.ojstore.name, { keyPath: self.myDB.ojstore.keypath })\n // console.log('成功建立对象存储空间:' + this.myDB.ojstore.name)\n }\n }\n }\n\n deletedb () {\n // 删除数据库\n const self = this\n self.indexedDB.deleteDatabase(this.myDB.name)\n // console.log(this.myDB.name + '数据库已删除')\n }\n\n closeDB () {\n // 关闭数据库\n this.myDB.db.close()\n // console.log('数据库已关闭')\n }\n\n addData (storename, data) {\n // 添加数据,重复添加会报错\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.add(data[i])\n request.onerror = function () {\n // console.error('add添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('add添加数据已存入数据库')\n }\n }\n }\n\n putData (storename, data) {\n // 添加数据,重复添加会更新原有数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.put(data[i])\n request.onerror = function () {\n // console.error('put添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('put添加数据已存入数据库')\n }\n }\n }\n\n getDataByKey (storename, key, callback) {\n const self = this\n // 根据存储空间的键找到对应数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n const request = store.get(key)\n request.onerror = function () {\n // console.error('getDataByKey error')\n callback.call(self, null)\n }\n request.onsuccess = function (e) {\n const result = e.target.result\n // console.log('查找数据成功')\n callback.call(self, result)\n }\n }\n\n deleteData (storename, key) {\n // 删除某一条记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.delete(key)\n // console.log('已删除存储空间' + storename + '中' + key + '记录')\n }\n\n clearData (storename) {\n // 删除存储空间全部记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.clear()\n // console.log('已删除存储空间' + storename + '全部记录')\n }\n}\n\nexport default INDEXDB\n","export const FULLSCREEN_EVENTS = ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange']\n\nexport const GET_FULLSCREEN_API = ['requestFullscreen', 'webkitRequestFullscreen', 'mozRequestFullScreen', 'msRequestFullscreen']\n\nexport const EXIT_FULLSCREEN_API = ['exitFullscreen', 'webkitExitFullscreen', 'mozCancelFullScreen', 'msExitFullscreen']\n\nexport const PLATER_ID = 'data-xgplayerid'","function callHandler (obj, handler, next, ...args) {\n const ret = handler.call(obj, ...args)\n if (!next || typeof next !== 'function') {\n return\n }\n if (ret && ret.then) {\n ret.then((...args) => {\n next.call(obj, ...args)\n })\n } else {\n next.call(obj, ...args)\n }\n}\n\n/**\n * 给某个处理函数添加hook能力\n * @param { string } hookName\n * @param { Function } handler\n * @param { { pre?: any, next?:any } } preset\n * {\n * pre: () => { // run beafore hook},\n * next: () => { // run after hook return}\n * }\n */\nfunction hook (hookName, handler, preset = { pre: null, next: null }) {\n if (!this.__hooks) {\n this.__hooks = {}\n }\n !this.__hooks[hookName] && (this.__hooks[hookName] = null)\n return function () {\n if (preset.pre) {\n try {\n preset.pre.call(this, ...arguments)\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}:pre error] >> ${e.message}`\n throw e\n }\n }\n if (this.__hooks && this.__hooks[hookName]) {\n try {\n const preRet = this.__hooks[hookName].call(this, this, ...arguments)\n if (preRet) {\n if (preRet.then) {\n preRet.then((isContinue) => {\n if (isContinue !== false) {\n callHandler(this, handler, preset.next, ...arguments)\n // handler.call(this, ...arguments)\n }\n }).catch(e => {\n throw e\n })\n } else {\n callHandler(this, handler, preset.next, ...arguments)\n // handler.call(this, ...arguments)\n }\n } else if (preRet === undefined) {\n callHandler(this, handler, preset.next, ...arguments)\n }\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}] >> ${e.message}`\n throw e\n }\n } else {\n callHandler(this, handler, preset.next, ...arguments)\n }\n }.bind(this)\n}\n\n/**\n * add hooks\n * @param { string } hookName\n * @param { Function } handler\n */\nfunction useHooks (hookName, handler) {\n const { __hooks } = this\n if (!__hooks) {\n return\n }\n // eslint-disable-next-line no-prototype-builtins\n if (!__hooks.hasOwnProperty(hookName)) {\n console.warn(`has no supported hook which name [${hookName}]`)\n return false\n }\n __hooks && (__hooks[hookName] = handler)\n return true\n}\n\n/**\n * remove hook\n * @param { string } hookName\n * @param { (plugin: any, ..args) => {} } handler\n * @returns void\n */\nfunction removeHooks (hookName, handler) {\n const { __hooks } = this\n if (!__hooks) {\n return\n }\n delete __hooks[hookName]\n}\n\n/**\n * Add hooks to a plugin\n * @param { string } pluginName\n * @param {...any} args\n */\nfunction usePluginHooks (pluginName, ...args) {\n if (!this.plugins || !this.plugins[pluginName.toLowerCase()]) {\n return\n }\n const plugin = this.plugins[pluginName.toLowerCase()]\n return plugin.useHooks && plugin.useHooks(...args)\n}\n\nfunction removePluginHooks (pluginName, ...args) {\n if (!this.plugins || !this.plugins[pluginName.toLowerCase()]) {\n return\n }\n const plugin = this.plugins[pluginName.toLowerCase()]\n if (plugin) {\n return plugin.removeHooks && plugin.removeHooks(...args)\n }\n}\n\n/**\n * hook decorator, add hooks props for for an instance\n * @param { any } instance\n * @param { Array<string> } [hookNames]\n */\nfunction hooksDescriptor (instance, presetHooks = []) {\n instance.__hooks = {}\n presetHooks && presetHooks.map(item => {\n instance.__hooks[item] = null\n })\n Object.defineProperty(instance, 'hooks', {\n get: () => {\n return instance.__hooks && Object.keys(instance.__hooks).map(key => {\n if (instance.__hooks[key]) {\n return key\n }\n })\n }\n })\n}\n\nfunction delHooksDescriptor (instance) {\n instance.__hooks = null\n}\n\nfunction runHooks (obj, hookName, handler, ...args) {\n if (obj.__hooks && obj.__hooks[hookName]) {\n const ret = obj.__hooks[hookName].call(obj, obj, ...args)\n if (ret && ret.then) {\n ret.then((data) => {\n return data === false ? null : handler.call(obj, obj, ...args)\n }).catch(e => {\n console.warn(`[runHooks]${hookName} reject`, e.message)\n })\n } else if (ret !== false) {\n return handler.call(obj, obj, ...args)\n }\n } else {\n return handler.call(obj, obj, ...args)\n }\n}\n\nexport {\n hooksDescriptor as default,\n hook,\n useHooks,\n usePluginHooks,\n removePluginHooks,\n removeHooks,\n delHooksDescriptor,\n runHooks\n}\n","import Util from '../utils/util'\nimport Sniffer from '../utils/sniffer'\nimport Errors from '../error'\nimport * as Events from '../events'\nimport XG_DEBUG from '../utils/debug'\nimport hooksDescriptor, { hook, useHooks, removeHooks, delHooksDescriptor } from './hooksDescriptor'\n\nfunction showErrorMsg (pluginName, msg) {\n XG_DEBUG.logError(`[${pluginName}] event or callback cant be undefined or null when call ${msg}`)\n}\n\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef { import ('../defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * [propName: string]: any;\n * }} IBasePluginOptions\n */\nclass BasePlugin {\n static defineGetterOrSetter (Obj, map) {\n for (const key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key)) {\n Object.defineProperty(Obj, key, map[key])\n }\n }\n }\n\n /**\n * @type { { [propName: string]: any } }\n */\n static get defaultConfig () {\n return {}\n }\n\n /**\n * @type { string }\n */\n static get pluginName () {\n return 'pluginName'\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n constructor (args) {\n if (Util.checkIsFunction(this.beforeCreate)) {\n this.beforeCreate(args)\n }\n hooksDescriptor(this)\n /**\n * @private\n */\n this.__args = args\n /**\n * @private\n */\n this.__events = {} // 对player的事件监听缓存\n this.__onceEvents = {}\n this.config = args.config || {}\n /**\n * @readonly\n * @type { Player }\n */\n this.player = null\n /**\n * @readonly\n * @type { IPlayerOptions }\n */\n this.playerConfig = {}\n /**\n * @readonly\n * @type {string}\n */\n this.pluginName = ''\n this.__init(args)\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n beforeCreate (args) {}\n afterCreate () {}\n beforePlayerInit () {}\n onPluginsReady () {}\n afterPlayerInit () {}\n destroy () {}\n\n /**\n * @private\n * @param { any } args\n */\n __init (args) {\n this.player = args.player\n this.playerConfig = args.player && args.player.config\n this.pluginName = args.pluginName ? args.pluginName.toLowerCase() : this.constructor.pluginName.toLowerCase()\n this.logger = args.player && args.player.logger\n // BasePlugin.defineGetterOrSetter(this, {\n // player: {\n // get: () => {\n // return args.player\n // },\n // configurable: true\n // },\n // playerConfig: {\n // get: () => {\n // return args.player && args.player.config\n // },\n // configurable: true\n // },\n\n // pluginName: {\n // get: () => {\n // if (args.pluginName) {\n // return args.pluginName.toLowerCase()\n // } else {\n // return this.constructor.pluginName.toLowerCase()\n // }\n // },\n // configurable: true\n // },\n // logger: {\n // get: () => {\n // return args.player.logger\n // },\n // configurable: true\n // }\n // })\n }\n\n /**\n * 更新语言\n * @param { string } lang\n */\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n }\n\n /**\n * @type { string }\n */\n get lang () {\n return this.player.lang\n }\n\n get i18n () {\n return this.player.i18n\n }\n\n get i18nKeys () {\n return this.player.i18nKeys\n }\n\n /**\n * @description当前支持的事件类型\n * @type { 'touch' | 'mouse' }\n */\n get domEventType () {\n let _e = Util.checkTouchSupport() ? 'touch' : 'mouse'\n if (this.playerConfig && (this.playerConfig.domEventType === 'touch' || this.playerConfig.domEventType === 'mouse')) {\n _e = this.playerConfig.domEventType\n }\n return _e\n }\n\n /**\n *\n * @param { string | Array<string> } event\n * @param { Function } callback\n * @returns\n */\n on (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.on(event, callback)')\n return\n }\n if (typeof event === 'string') {\n this.__events[event] = callback\n this.player.on(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n this.__events[item] = callback\n this.player.on(item, callback)\n })\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } callback\n * @returns\n */\n once (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.once(event, callback)')\n return\n }\n if (typeof event === 'string') {\n this.__onceEvents[event] = callback\n this.player.once(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n this.__onceEvents[item] = callback\n this.player.once(event, callback)\n })\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } callback\n * @returns\n */\n off (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.off(event, callback)')\n return\n }\n if (typeof event === 'string') {\n delete this.__events[event]\n this.player.off(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n delete this.__events[event]\n this.player.off(item, callback)\n })\n }\n }\n\n offAll () {\n ['__events', '__onceEvents'].forEach(key => {\n Object.keys(this[key]).forEach(item => {\n this[key][item] && this.off(item, this[key][item])\n item && delete this[key][item]\n })\n })\n this.__events = {}\n this.__onceEvents = {}\n }\n\n /**\n *\n * @param { string } event\n * @param {...any} res\n * @returns\n */\n emit (event, ...res) {\n if (!this.player) {\n return\n }\n this.player.emit(event, ...res)\n }\n\n emitUserAction (event, action, params = {}) {\n if (!this.player) {\n return\n }\n const nParams = {\n ...params,\n pluginName: this.pluginName\n }\n this.player.emitUserAction(event, action, nParams)\n }\n\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n useHooks (hookName, handler, ...args) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n removeHooks (hookName, handler, ...args) {\n return removeHooks.call(this, ...arguments)\n }\n\n /**\n * 注册子插件\n * @param { any } plugin\n * @param { any } [options]\n * @param { string } [name]\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name = '') {\n if (!this.player) {\n return\n }\n name && (options.pluginName = name)\n return this.player.registerPlugin({ plugin, options })\n }\n\n /**\n *\n * @param { string } name\n * @returns { any | null }\n */\n getPlugin (name) {\n return this.player ? this.player.getPlugin(name) : null\n }\n\n __destroy () {\n const player = this.player\n const pluginName = this.pluginName\n this.offAll()\n Util.clearAllTimers(this)\n if (Util.checkIsFunction(this.destroy)) {\n this.destroy()\n }\n\n ['player', 'playerConfig', 'pluginName', 'logger', '__args', '__hooks'].map(item => {\n this[item] = null\n })\n player.unRegisterPlugin(pluginName)\n delHooksDescriptor(this)\n }\n}\nexport {\n BasePlugin as default,\n Util,\n Sniffer,\n Errors,\n Events,\n XG_DEBUG\n}\n","var DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n","var closest = require('./closest');\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n","/**\n* an ui Plugin class\n*\n**/\nimport BasePlugin, { Util, XG_DEBUG } from './basePlugin'\nimport delegate from 'delegate'\n\nconst ROOT_TYPES = {\n CONTROLS: 'controls',\n ROOT: 'root'\n}\n\nconst POSITIONS = {\n ROOT: 'root',\n ROOT_LEFT: 'rootLeft',\n ROOT_RIGHT: 'rootRight',\n ROOT_TOP: 'rootTop',\n CONTROLS_LEFT: 'controlsLeft',\n CONTROLS_RIGTH: 'controlsRight',\n CONTROLS_RIGHT: 'controlsRight',\n CONTROLS_CENTER: 'controlsCenter',\n CONTROLS: 'controls'\n}\n\n/**\n * Check if the url is a link address\n * @param { string } str\n */\nfunction isUrl (str) {\n if (!str) {\n return false\n }\n return str.indexOf && /^(?:http|data:|\\/)/.test(str)\n}\n\nfunction mergeIconClass (icon, classname) {\n if (typeof icon === 'object' && icon.class && typeof icon.class === 'string') {\n return `${classname} ${icon.class}`\n }\n return classname\n}\n\nfunction mergeIconAttr (icon, attr) {\n if (typeof icon === 'object' && icon.attr && typeof icon.attr === 'object') {\n Object.keys(icon.attr).map(key => {\n attr[key] = icon.attr[key]\n })\n }\n return attr\n}\n\nfunction createIcon (icon, key, classname = '', attr = {}, pluginName = '') {\n let newIcon = null\n if (icon instanceof window.Element) {\n Util.addClass(icon, classname)\n Object.keys(attr).map(key => {\n icon.setAttribute(key, attr[key])\n })\n return icon\n }\n\n if (isUrl(icon) || isUrl(icon.url)) {\n attr.src = isUrl(icon) ? icon : (icon.url || '')\n newIcon = Util.createDom(icon.tag || 'img', '', attr, `xg-img ${classname}`)\n return newIcon\n }\n\n if (typeof icon === 'function') {\n try {\n newIcon = icon()\n if (newIcon instanceof window.Element) {\n Util.addClass(newIcon, classname)\n Object.keys(attr).map(key => {\n newIcon.setAttribute(key, attr[key])\n })\n return newIcon\n } else {\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is a function mast return an Element Object`)\n }\n return null\n } catch (e) {\n XG_DEBUG.logError(`Plugin named [${pluginName}]:createIcon`, e)\n return null\n }\n }\n\n if (typeof icon === 'string') {\n return Util.createDomFromHtml(icon, attr, classname)\n }\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is invalid`)\n return null\n}\n\nfunction registerIconsObj (iconsConfig, plugin) {\n const _icons = plugin.config.icons || plugin.playerConfig.icons\n Object.keys(iconsConfig).map(key => {\n const orgIcon = iconsConfig[key]\n let classname = orgIcon && orgIcon.class ? orgIcon.class : ''\n let attr = orgIcon && orgIcon.attr ? orgIcon.attr : {}\n let newIcon = null\n if (_icons && _icons[key]) {\n classname = mergeIconClass(_icons[key], classname)\n attr = mergeIconAttr(_icons[key], attr)\n newIcon = createIcon(_icons[key], key, classname, attr, plugin.pluginName)\n }\n if (!newIcon && orgIcon) {\n newIcon = createIcon((orgIcon.icon ? orgIcon.icon : orgIcon), attr, classname, {}, plugin.pluginName)\n }\n plugin.icons[key] = newIcon\n })\n}\n\nfunction registerTextObj (textConfig, plugin) {\n Object.keys(textConfig).map((key) => {\n Object.defineProperty(plugin.langText, key, {\n get: () => {\n const { lang, i18n } = plugin\n if (i18n[key]) {\n return i18n[key]\n } else {\n return textConfig[key] ? (textConfig[key][lang] || '') : ''\n }\n }\n })\n })\n}\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * root?: HTMLElement,\n * position?: string,\n * [propName: string]: any\n * }} IPluginOptions\n*/\nclass Plugin extends BasePlugin {\n /**\n * 插入dom结构\n * @param { String | HTMLElement } html html字符串或者dom\n * @param { HTMLElement } parent\n * @param { number } index\n * @returns { HTMLElement }\n */\n static insert (html, parent, index = 0) {\n const len = parent.children.length\n const insertIdx = Number(index)\n const isDomElement = html instanceof window.Node\n\n if (len) {\n let i = 0\n let coordinate = null\n let mode = ''\n for (;i < len; i++) {\n coordinate = parent.children[i]\n const curIdx = Number(coordinate.getAttribute('data-index'))\n if (curIdx >= insertIdx) {\n mode = 'beforebegin'\n break\n } else if (curIdx < insertIdx) {\n mode = 'afterend'\n }\n }\n\n if (isDomElement) {\n if (mode === 'afterend') {\n // as last element\n parent.appendChild(html)\n } else {\n parent.insertBefore(html, coordinate)\n }\n } else {\n coordinate.insertAdjacentHTML(mode, html)\n }\n return mode === 'afterend' ? parent.children[parent.children.length - 1] : parent.children[i]\n } else {\n isDomElement ? parent.appendChild(html) : parent.insertAdjacentHTML('beforeend', html)\n return parent.children[parent.children.length - 1]\n }\n }\n\n static get defaultConfig () {\n return {}\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { String } querySelector\n * @param { String | Array<String> } eventType\n * @param { Function } callback\n * @param { boolean } [capture=false]\n * @returns\n */\n static delegate (root, querySelector, eventType, callback, capture = false) {\n const dels = []\n if (root instanceof window.Node && typeof callback === 'function') {\n if (Array.isArray(eventType)) {\n eventType.forEach((item) => {\n const ret = delegate(root, querySelector, item, callback, capture)\n ret.key = `${querySelector}_${item}`\n dels.push(ret)\n })\n } else {\n const ret = delegate(root, querySelector, eventType, callback, capture)\n ret.key = `${querySelector}_${eventType}`\n dels.push(ret)\n }\n }\n return dels\n }\n\n static get ROOT_TYPES () {\n return ROOT_TYPES\n }\n\n static get POSITIONS () {\n return POSITIONS\n }\n\n /**\n * @param { IPluginOptions } args\n */\n constructor (args = {}) {\n super(args)\n /**\n * @private\n */\n this.__delegates = []\n }\n\n /**\n * @private\n */\n __init (args) {\n super.__init(args)\n if (!args.root) {\n return\n }\n const _parent = args.root\n let _el = null\n /**\n * @readonly\n */\n this.icons = {}\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.root = null\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.parent = null\n\n const _orgicons = this.registerIcons() || {}\n registerIconsObj(_orgicons, this)\n /**\n * @readonly\n */\n this.langText = {}\n const defaultTexConfig = this.registerLanguageTexts() || {}\n registerTextObj(defaultTexConfig, this)\n let renderStr = ''\n try {\n renderStr = this.render()\n } catch (e) {\n XG_DEBUG.logError(`Plugin:${this.pluginName}:render`, e)\n throw (new Error(`Plugin:${this.pluginName}:render:${e.message}`))\n }\n if (renderStr) {\n _el = Plugin.insert(renderStr, _parent, args.index)\n _el.setAttribute('data-index', args.index)\n } else if (args.tag) {\n _el = Util.createDom(args.tag, '', args.attr, args.name)\n _el.setAttribute('data-index', args.index)\n _parent.appendChild(_el)\n } else {\n return\n }\n\n this.root = _el\n this.parent = _parent\n\n // Plugin.defineGetterOrSetter(this, {\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // root: {\n // get: () => {\n // return _el\n // },\n // configurable: true\n // },\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // parent: {\n // get: () => {\n // return _parent\n // },\n // configurable: true\n // }\n // })\n\n const attr = this.config.attr || {}\n const style = this.config.style || {}\n\n this.setAttr(attr)\n this.setStyle(style)\n if (this.config.index) {\n this.root.setAttribute('data-index', this.config.index)\n }\n this.__registerChildren()\n }\n\n /**\n * @private\n */\n __registerChildren () {\n if (!this.root) {\n return\n }\n /**\n * @private\n */\n this._children = []\n const children = this.children()\n if (children && typeof children === 'object') {\n if (Object.keys(children).length > 0) {\n Object.keys(children).map(item => {\n const name = item\n const _plugin = children[name]\n const options = {\n root: this.root\n }\n // eslint-disable-next-line no-unused-vars\n let config, Plugin\n if (typeof _plugin === 'function') {\n config = this.config[name] || {}\n Plugin = _plugin\n } else if (typeof _plugin === 'object' && typeof _plugin.plugin === 'function') {\n config = _plugin.options ? Util.deepCopy((this.config[name] || {}), _plugin.options) : (this.config[name] || {})\n Plugin = _plugin.plugin\n }\n options.config = config\n config.index !== undefined && (options.index = config.index)\n config.root && (options.root = config.root)\n this.registerPlugin(Plugin, options, name)\n })\n }\n }\n }\n\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n function checkChildren (node, callback) {\n for (let i = 0; i < node.children.length; i++) {\n if (node.children[i].children.length > 0) {\n checkChildren(node.children[i], callback)\n } else {\n callback(node.children[i])\n }\n }\n }\n const { root, i18n, langText } = this\n if (root) {\n checkChildren(root, (node) => {\n const langKey = node.getAttribute && node.getAttribute('lang-key')\n if (!langKey) {\n return\n }\n const langTextShow = i18n[langKey.toUpperCase()] || langText[langKey]\n if (langTextShow) {\n node.innerHTML = typeof langTextShow === 'function' ? langTextShow(lang) : langTextShow\n }\n })\n }\n }\n\n get lang () {\n return this.player.lang\n }\n\n changeLangTextKey (dom, key = '') {\n const i18n = this.i18n || {}\n const langText = this.langText\n dom.setAttribute && dom.setAttribute('lang-key', key)\n const text = i18n[key] || langText[key] || ''\n if (text) {\n dom.innerHTML = text\n }\n }\n\n plugins () {\n return this._children\n }\n\n children () {\n return {}\n }\n\n registerPlugin (plugin, options = {}, name = '') {\n options.root = options.root || this.root\n const _c = super.registerPlugin(plugin, options, name)\n this._children.push(_c)\n return _c\n }\n\n registerIcons () {\n return {}\n }\n\n registerLanguageTexts () {\n return {}\n }\n\n /**\n *\n * @param { string } qs\n * @returns { HTMLElement | null }\n */\n find (qs) {\n if (!this.root) {\n return\n }\n return this.root.querySelector(qs)\n }\n\n /**\n * 绑定事件\n * @param { string | Array<string> } querySelector\n * @param { string | Array<string> | Function } eventType\n * @param { Function } [callback]\n */\n bind (querySelector, eventType, callback) {\n if (arguments.length < 3 && typeof eventType === 'function') {\n if (Array.isArray(querySelector)) {\n querySelector.forEach((item) => {\n this.bindEL(item, eventType)\n })\n } else {\n this.bindEL(querySelector, eventType)\n }\n } else {\n const ret = Plugin.delegate.call(this, this.root, querySelector, eventType, callback)\n this.__delegates = this.__delegates.concat(ret)\n }\n }\n\n /**\n * 绑定事件\n * @param { string | Array<string> } querySelector\n * @param { string | Array<string> | Function } eventType\n */\n unbind (querySelector, eventType) {\n if (arguments.length < 3 && typeof eventType === 'function') {\n if (Array.isArray(querySelector)) {\n querySelector.forEach((item) => {\n this.unbindEL(item, eventType)\n })\n } else {\n this.unbindEL(querySelector, eventType)\n }\n } else {\n const key = `${querySelector}_${eventType}`\n for (let i = 0; i < this.__delegates.length; i++) {\n if (this.__delegates[i].key === key) {\n this.__delegates[i].destroy()\n this.__delegates.splice(i, 1)\n break\n }\n }\n }\n }\n\n /**\n * 给插件设置样式\n * @param { string | {[propName: string]: any} } name\n * @param { ? | any } value\n * @returns\n */\n setStyle (name, value) {\n if (!this.root) {\n return\n }\n if (Util.typeOf(name) === 'String') {\n return (this.root.style[name] = value)\n } else if (Util.typeOf(name) === 'Object') {\n Object.keys(name).map(key => {\n this.root.style[key] = name[key]\n })\n }\n }\n\n /**\n * 给插件根节点设置属性\n * @param { string | {[propName: string]: any} } name\n * @param { ? | any } value\n * @returns\n */\n setAttr (name, value) {\n if (!this.root) {\n return\n }\n if (Util.typeOf(name) === 'String') {\n return this.root.setAttribute(name, value)\n } else if (Util.typeOf(name) === 'Object') {\n Object.keys(name).map(key => {\n this.root.setAttribute(key, name[key])\n })\n }\n }\n\n /**\n *\n * @param { string } htmlStr\n * @param { Function } [callback]\n * @returns\n */\n setHtml (htmlStr, callback) {\n if (!this.root) {\n return\n }\n this.root.innerHTML = htmlStr\n if (typeof callback === 'function') {\n callback()\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } eventHandle\n * @param { boolean } [isBubble=false]\n * @returns\n */\n bindEL (event, eventHandle, isBubble = false) {\n if (!this.root) {\n return\n }\n if (`on${event}` in this.root && typeof eventHandle === 'function') {\n this.root.addEventListener(event, eventHandle, isBubble)\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } eventHandle\n * @param { boolean } [isBubble]\n * @returns\n */\n unbindEL (event, eventHandle, isBubble = false) {\n if (!this.root) {\n return\n }\n if (`on${event}` in this.root && typeof eventHandle === 'function') {\n this.root.removeEventListener(event, eventHandle, isBubble)\n }\n }\n\n /**\n *\n * @param { string } [value]\n * @returns\n */\n show (value) {\n if (!this.root) {\n return\n }\n this.root.style.display = value !== undefined ? value : 'block'\n const cs = window.getComputedStyle(this.root, null)\n const cssDisplayValue = cs.getPropertyValue('display')\n if (cssDisplayValue === 'none') {\n return (this.root.style.display = 'block')\n }\n }\n\n hide () {\n this.root && (this.root.style.display = 'none')\n }\n\n /**\n *\n * @param { string | HTMLElement } pdom\n * @param { HTMLElement} child\n * @returns { HTMLElement | null }\n */\n appendChild (pdom, child) {\n if (!this.root) {\n return null\n }\n if (arguments.length < 2 && arguments[0] instanceof window.Element) {\n return this.root.appendChild(arguments[0])\n }\n if (!child || !(child instanceof window.Element)) {\n return null\n }\n try {\n if (typeof pdom === 'string') {\n return this.find(pdom).appendChild(child)\n } else {\n return pdom.appendChild(child)\n }\n } catch (err) {\n XG_DEBUG.logError('Plugin:appendChild', err)\n return null\n }\n }\n\n /**\n *\n * @returns { string | HTMLElement }\n */\n render () {\n return ''\n }\n\n destroy () {}\n\n __destroy () {\n const { player } = this\n this.__delegates.map(item => {\n item.destroy()\n })\n this.__delegates = []\n // destroy the sub-plugin instance\n if (this._children instanceof Array) {\n this._children.map(item => {\n player.unRegisterPlugin(item.pluginName)\n })\n this._children = null\n }\n if (this.root) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.root.hasOwnProperty('remove')) {\n this.root.remove()\n } else if (this.root.parentNode) {\n this.root.parentNode.removeChild(this.root)\n }\n }\n\n super.__destroy()\n this.icons = {};\n ['root', 'parent'].map(item => {\n this[item] = null\n })\n }\n}\n\nexport {\n Plugin as default,\n ROOT_TYPES,\n POSITIONS\n}\n","import { throttle } from '../utils/util'\nimport { PLATER_ID } from '../constant'\n/**\n * 添加\n */\nclass ResizeObserver {\n constructor () {\n this.__handlers = []\n this.timeStamp = 0\n this.observer = null\n if (!window.ResizeObserver) {\n return\n }\n try {\n this.observer = new window.ResizeObserver(throttle(this.__trigger, 100, { trailing: true }))\n this.timeStamp = new Date().getTime()\n } catch (e) {\n console.error(e)\n }\n }\n\n addObserver (target, handler) {\n if (!this.observer) {\n return\n }\n this.observer && this.observer.observe(target)\n const _pid = target.getAttribute(PLATER_ID)\n const { __handlers } = this\n let index = -1\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n index = i\n }\n }\n if (index > -1) {\n this.__handlers[index].handler = handler\n } else {\n this.__handlers.push({\n target,\n handler: handler,\n playerId: _pid\n })\n }\n }\n\n unObserver (target) {\n let i = -1\n this.__handlers.map((item, index) => {\n if (target === item.target) {\n i = index\n }\n })\n try {\n this.observer && this.observer.unobserve(target)\n } catch (e) {}\n this.observer && this.observer.unobserve(target)\n i > -1 && this.__handlers.splice(i, 1)\n }\n\n destroyObserver () {\n this.observer && this.observer.disconnect()\n this.observer = null\n this.__handlers = null\n }\n\n __runHandler (target) {\n const { __handlers } = this\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n try {\n __handlers[i].handler(target)\n } catch (error) {\n console.error(error)\n }\n return true\n }\n }\n return false\n }\n\n __trigger = (entries) => {\n const t = new Date().getTime()\n this.timeStamp = t\n for (let i = 0; i < entries.length; i++) {\n this.__runHandler(entries[i].target)\n }\n }\n}\n\nlet resizeObserver = null\n\nfunction addObserver (target, handler) {\n if (!resizeObserver) {\n resizeObserver = new ResizeObserver()\n // window.___resizeObserver = resizeObserver\n }\n resizeObserver.addObserver(target, handler)\n return resizeObserver\n}\n\nfunction unObserver (target, handler) {\n resizeObserver.unObserver(target, handler)\n}\n\nfunction destroyObserver (target, handler) {\n resizeObserver.destroyObserver(target, handler)\n}\n\nexport {\n addObserver,\n unObserver,\n destroyObserver\n}\n","import { addObserver, unObserver } from './resizeObserver'\nimport Util from '../utils/util'\n\n/**\n* a plugins manager to register and search\n**/\n\nconst pluginsManager = {\n pluginGroup: {},\n init (player) {\n // mark every player instance by _pluginInfoId\n let cgid = player._pluginInfoId\n if (!cgid) {\n cgid = new Date().getTime()\n player._pluginInfoId = cgid\n }\n\n !player.config.closeResizeObserver && addObserver(player.root, () => {\n player.resize()\n })\n\n // 默认第一个是激活状态\n if (Object.keys(this.pluginGroup).length === 0) {\n player.isUserActive = true\n }\n\n this.pluginGroup[cgid] = {\n _player: player,\n _originalOptions: player.config || {},\n _plugins: {}\n }\n },\n\n /**\n * Check whether there is a player instance in the current dom\n * @param {Element} root\n */\n checkPlayerRoot (root) {\n if (this.pluginGroup) {\n const _keys = Object.keys(this.pluginGroup)\n for (let i = 0; i < _keys.length; i++) {\n const _p = this.pluginGroup[_keys[i]]._player\n if (_p.root === root) {\n return _p\n }\n }\n return null\n }\n return null\n },\n\n formatPluginInfo (plugin, config) {\n let PLUFGIN = null\n let options = null\n if (plugin.plugin && typeof plugin.plugin === 'function') {\n PLUFGIN = plugin.plugin\n options = plugin.options\n } else {\n PLUFGIN = plugin\n options = {}\n }\n if (config) {\n options.config = config || {}\n }\n\n return {\n PLUFGIN,\n options\n }\n },\n\n /**\n * check the plugin if exits in plugins\n * @param {string} pluginName\n * @param { Array <any> } plugins\n * @returns boolean\n */\n checkPluginIfExits (pluginName, plugins) {\n for (let i = 0; i < plugins.length; i++) {\n if (pluginName.toLowerCase() === plugins[i].pluginName.toLowerCase()) {\n return true\n }\n }\n return false\n },\n\n /**\n * get plugin Config from playerConfig\n * @param { string } pluginName\n * @param { {[propName: string]: any;} } playerConfig\n * @return { {[propName: string]: any;} } pluginConfig\n */\n getRootByConfig (pluginName, playerConfig) {\n const keys = Object.keys(playerConfig)\n let _pConfig = null\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n _pConfig = playerConfig[keys[i]]\n break\n }\n }\n\n if (Util.typeOf(_pConfig) === 'Object') {\n return {\n root: _pConfig.root,\n position: _pConfig.position\n }\n }\n return {}\n },\n\n /**\n * register a lazy plugin\n * @param { any } player instance\n * @param { any } lazyPlugin config\n *\n */\n lazyRegister (player, lazyPlugin) {\n const timeout = lazyPlugin.timeout || 1500\n return Promise.race([\n lazyPlugin.loader().then((plugin) => {\n let result\n if (plugin && plugin.__esModule) {\n result = plugin.default\n } else {\n result = plugin\n }\n this.register(player, result, plugin.options)\n }),\n new Promise((resolve, reject) => {\n setTimeout(() => {\n reject(new Error('timeout'))\n }, timeout)\n })\n ])\n },\n /**\n * register a Plugin\n * @param { any } player the plugins register\n * @param { any } plugin the plugin contructor\n * @param { any } options the plugin configuration\n * @return { any } Plugin the plugin instance\n **/\n register (player, plugin, options = {}) {\n if (!player || !plugin || typeof plugin !== 'function' || plugin.prototype === undefined) {\n return\n }\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n if (!this.pluginGroup[cgid]._plugins) {\n this.pluginGroup[cgid]._plugins = {}\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const originalOptions = this.pluginGroup[cgid]._originalOptions\n options.player = this.pluginGroup[cgid]._player\n\n const pluginName = options.pluginName || plugin.pluginName\n if (!pluginName) {\n throw new Error('The property pluginName is necessary')\n }\n\n if (plugin.isSupported && !plugin.isSupported(player.config.mediaType, player.config.codecType)) {\n console.warn(`not supported plugin [${pluginName}]`)\n return\n }\n\n if (!options.config) {\n options.config = {}\n }\n\n // get config items from player.config\n const keys = Object.keys(originalOptions)\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n const config = originalOptions[keys[i]]\n if (Util.typeOf(config) === 'Object') {\n options.config = Object.assign({}, options.config, originalOptions[keys[i]])\n } else if (Util.typeOf(config) === 'Boolean') {\n options.config.disable = !config\n }\n break\n }\n }\n\n // copy the default configuration items of the plugin\n if (plugin.defaultConfig) {\n Object.keys(plugin.defaultConfig).forEach(key => {\n if (typeof options.config[key] === 'undefined') {\n options.config[key] = plugin.defaultConfig[key]\n }\n })\n }\n\n // get the parent dom which added the plugin will be mounted\n if (!options.root) {\n options.root = player.root\n } else if (typeof options.root === 'string') {\n options.root = player[options.root]\n }\n\n options.index = options.config.index || 0\n try {\n // if there is already a plugin instance with the same pluginName, destroy it\n if (plugins[pluginName.toLowerCase()]) {\n this.unRegister(cgid, pluginName.toLowerCase())\n console.warn(`the is one plugin with same pluginName [${pluginName}] exist, destroy the old instance`)\n }\n // eslint-disable-next-line new-cap\n const _instance = new plugin(options)\n plugins[pluginName.toLowerCase()] = _instance\n plugins[pluginName.toLowerCase()].func = plugin\n if (_instance && typeof _instance.afterCreate === 'function') {\n _instance.afterCreate()\n }\n return _instance\n } catch (err) {\n console.error(err)\n throw (err)\n }\n },\n\n /**\n * Unregister a plugin from player instance\n * @param { string } cgid\n * @param { string } name\n */\n unRegister (cgid, name) {\n if (cgid._pluginInfoId) {\n cgid = cgid._pluginInfoId\n }\n name = name.toLowerCase()\n try {\n const plugin = this.pluginGroup[cgid]._plugins[name]\n if (plugin) {\n plugin.pluginName && plugin.__destroy()\n delete this.pluginGroup[cgid]._plugins[name]\n }\n } catch (e) {\n console.error(`[unRegister:${name}] cgid:[${cgid}] error`, e)\n }\n },\n\n /**\n * remove a plugin instance from the player plugin list\n * @param { any } player\n * @param { string } name\n */\n deletePlugin (player, name) {\n const cgid = player._pluginInfoId\n if (cgid && this.pluginGroup[cgid] && this.pluginGroup[cgid]._plugins) {\n delete this.pluginGroup[cgid]._plugins[name]\n }\n },\n\n /**\n * get all plugin instance of player\n * @param { any } player\n */\n getPlugins (player) {\n const cgid = player._pluginInfoId\n return cgid && this.pluginGroup[cgid] ? this.pluginGroup[cgid]._plugins : {}\n },\n\n findPlugin (player, name) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return null\n }\n const cName = name.toLowerCase()\n return this.pluginGroup[cgid]._plugins[cName]\n },\n\n beforeInit (player) {\n function retPromise (fun) {\n if (!fun || !fun.then) {\n return new Promise((resolve) => {\n resolve()\n })\n } else {\n return fun\n }\n }\n return new Promise((resolve) => {\n if (!this.pluginGroup) {\n return\n }\n\n let prevTask\n if (player._loadingPlugins && player._loadingPlugins.length) {\n prevTask = Promise.all(player._loadingPlugins)\n } else {\n prevTask = Promise.resolve()\n }\n\n return prevTask.then(() => {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n resolve()\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const pluginsRet = []\n Object.keys(plugins).forEach(pName => {\n if (plugins[pName] && plugins[pName].beforePlayerInit) {\n try {\n const ret = plugins[pName].beforePlayerInit()\n pluginsRet.push(retPromise(ret))\n } catch (e) {\n pluginsRet.push(retPromise(null))\n throw e\n }\n }\n })\n\n Promise.all([...pluginsRet]).then(() => {\n resolve()\n }).catch((e) => {\n console.error(e)\n resolve()\n })\n })\n })\n },\n\n afterInit (player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(pName => {\n if (plugins[pName] && plugins[pName].afterPlayerInit) {\n plugins[pName].afterPlayerInit()\n }\n })\n },\n\n setLang (lang, player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(item => {\n if (plugins[item].updateLang) {\n plugins[item].updateLang(lang)\n } else {\n // 兼容旧版本通过set lang更新语言的问题\n try {\n plugins[item].lang = lang\n } catch (error) {\n console.warn(`${item} setLang`)\n }\n }\n })\n },\n\n reRender (player) {\n const cgid = player._pluginInfoId\n\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const _pList = []\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(pName => {\n if (pName !== 'controls' && plugins[pName]) {\n _pList.push({\n plugin: plugins[pName].func,\n options: plugins[pName].__args\n })\n this.unRegister(cgid, pName)\n }\n })\n _pList.forEach(item => {\n this.register(player, item.plugin, item.options)\n })\n },\n\n onPluginsReady (player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins || {}\n Object.keys(plugins).forEach(key => {\n if (plugins[key].onPluginsReady && typeof plugins[key].onPluginsReady === 'function') {\n plugins[key].onPluginsReady()\n }\n })\n },\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n * @returns { number | null }\n */\n setCurrentUserActive (playerId, isActive) {\n if (!this.pluginGroup[playerId]) {\n return\n }\n if (!isActive) {\n this.pluginGroup[playerId]._player.isUserActive = isActive\n return playerId\n }\n const keys = Object.keys(this.pluginGroup)\n for (let i = 0; i < keys.length; i++) {\n const c = this.pluginGroup[keys[i]]\n if (c && c._player) {\n this.pluginGroup[keys[i]]._player.isUserActive = false\n }\n }\n this.pluginGroup[playerId]._player.isUserActive = isActive\n return playerId\n },\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | null }\n */\n getCurrentUseActiveId () {\n if (!this.pluginGroup) {\n return\n }\n const keys = Object.keys(this.pluginGroup)\n for (let i = 0; i < keys.length; i++) {\n const c = this.pluginGroup[keys[i]]\n if (c && c._player && c._player.isUserActive) {\n return keys[i]\n }\n }\n return null\n },\n\n destroy (player) {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n return\n }\n unObserver(player.root)\n const plugins = this.pluginGroup[cgid]._plugins\n for (const item of Object.keys(plugins)) {\n this.unRegister(cgid, item)\n }\n\n const _isUseActive = player.isUseActive\n delete this.pluginGroup[cgid]\n delete player._pluginInfoId\n\n if (_isUseActive) {\n const keys = Object.keys(this.pluginGroup)\n if (keys.length > 0) {\n this.setCurrentUserActive(keys[keys.length - 1], true)\n }\n }\n }\n}\n\nexport default pluginsManager\n","export default {\n DEFAULT: 'xgplayer',\n DEFAULT_SKIN: 'xgplayer-skin-default',\n ENTER: 'xgplayer-is-enter',\n PAUSED: 'xgplayer-pause',\n PLAYING: 'xgplayer-playing',\n ENDED: 'xgplayer-ended',\n CANPLAY: 'xgplayer-canplay',\n LOADING: 'xgplayer-isloading',\n ERROR: 'xgplayer-is-error',\n REPLAY: 'xgplayer-replay',\n NO_START: 'xgplayer-nostart',\n ACTIVE: 'xgplayer-active',\n INACTIVE: 'xgplayer-inactive',\n FULLSCREEN: 'xgplayer-is-fullscreen',\n CSS_FULLSCREEN: 'xgplayer-is-cssfullscreen',\n ROTATE_FULLSCREEN: 'xgplayer-rotate-fullscreen',\n PARENT_ROTATE_FULLSCREEN: 'xgplayer-rotate-parent',\n PARENT_FULLSCREEN: 'xgplayer-fullscreen-parent',\n INNER_FULLSCREEN: 'xgplayer-fullscreen-inner',\n NO_CONTROLS: 'no-controls',\n FLEX_CONTROLS: 'flex-controls',\n CONTROLS_FOLLOW: 'controls-follow',\n CONTROLS_AUTOHIDE: 'controls-autohide',\n TOP_BAR_AUTOHIDE: 'top-bar-autohide',\n NOT_ALLOW_AUTOPLAY: 'not-allow-autoplay',\n SEEKING: 'seeking',\n PC: 'xgplayer-pc',\n MOBILE: 'xgplayer-mobile',\n MINI: 'xgplayer-mini' // mini screen play status\n}\n","import { getLang } from './utils/util'\n\n/**\n * @typedef {{\n * url: any,\n * definition: any,\n * bitrate?: number,\n * 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?: any,\n * domEventType?: 'default' | 'touch' | 'mouse',\n * nullUrlStart?: boolean,\n * width?: number | string,\n * height?: number | string,\n * fluid?: boolean,\n * fitVideoSize?: 'fixWidth'|'fixHeight'|'fixed',\n * videoFillMode?: 'auto'|'fillHeight'|'fillWidth'|'fill'|'cover',\n * volume?: number | { [propName: string]: any },\n * autoplay?: boolean,\n * autoplayMuted?: boolean,\n * loop?: boolean,\n * isLive?: boolean,\n * zoom?: number,\n * videoInit?: boolean,\n * poster?: string | { [propName: string]: any },\n * isMobileSimulateMode?: 'mobile' | 'pc',\n * defaultPlaybackRate?: number,\n * execBeforePluginsCall?: () => any,\n * allowSeekAfterEnded?: boolean,\n * enableContextmenu?: boolean,\n * closeVideoClick?: boolean,\n * closeVideoDblclick?: boolean,\n * closePlayerBlur?: boolean,\n * closeDelayBlur?: boolean,\n * leavePlayerTime?: number,\n * closePlayVideoFocus?: boolean,\n * closePauseVideoFocus?: boolean,\n * closeFocusVideoFocus?: boolean,\n * closeControlsBlur?: boolean,\n * topBarAutoHide?: boolean,\n * videoAttributes?: { [propName: string]: any },\n * startTime?: number,\n * seekedStatus?: 'play' | 'pause' | 'auto',\n * miniprogress?: boolean,\n * disableSwipeHandler?: () => any,\n * enableSwipeHandler?: () => any,\n * ignores?: Array<'cssfullscreen' | 'screenshot' | 'pip' | 'miniscreen' | 'keyboard' | 'download' | 'playbackrate' | 'time' | 'definition' | 'error' | 'fullscreen' | 'loading' | 'mobile' | 'pc' | 'play' | 'poster' | 'progress' | 'replay' | 'start' | 'volume' | string>,\n * inactive?: number,\n * lang?: string,\n * controls?: boolean | { [propName: string]: any },\n * marginControls?: boolean,\n * fullscreenTarget?: HTMLElement, // 全屏作用的dom元素\n * screenShot?: boolean | { [propName: string]: any },\n * rotate?: boolean | { [propName: string]: any },\n * pip?: boolean | { [propName: string]: any },\n * download?: boolean | { [propName: string]: any },\n * mini?: boolean | { [propName: string]: any },\n * cssFullscreen?: boolean | { [propName: string]: any },\n * keyShortcut?: boolean,\n * presets?: any[],\n * plugins?: any[]\n * playbackRate?: number | Array<number> | { [propName: string]: any },\n * definition?: { list: Array<IDefinition> , defaultDefinition?: IDefinition['definition'], [propName: string]: any},\n * playsinline?: boolean,\n * customDuration?: number,\n * timeOffset?: number,\n * icons?: { [propName: string]: string | HTMLElement | () => HTMLElement | string },\n * i18n?: Array<any>,\n * tabindex?: number,\n * thumbnail?: {\n * urls: Array<string>,\n * pic_num: number,\n * col: number,\n * row: number,\n * height?: number,\n * width?: number,\n * },\n * videoConfig?: { [propName: string]: any },\n * isHideTips?: boolean,\n * 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 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 commonStyle: { // General style configuration\n progressColor: '', // Background color of progress bar\n playedColor: '', // The background color of played part in the progress bar\n cachedColor: '', // The background color of cached part in the progress bar\n sliderBtnStyle: {}, // progress bar slider style\n volumeColor: ''\n }\n }\n}\n","export const usePreset = (player, Preset) => {\n let presetInst\n if (Preset.preset && Preset.options) {\n // eslint-disable-next-line new-cap\n presetInst = new (Preset.preset)(Preset.options, player.config)\n } else {\n presetInst = new Preset({}, player.config)\n }\n const { plugins = [], ignores = [], icons = {}, i18n = [] } = presetInst\n if (!player.config.plugins) {\n player.config.plugins = []\n }\n\n if (!player.config.ignores) {\n player.config.ignores = []\n }\n\n player.config.plugins.push(...plugins)\n player.config.ignores.push(...ignores)\n Object.keys(icons).map(key => {\n if (!player.config.icons[key]) {\n player.config.icons[key] = icons[key]\n }\n })\n const _ci18n = player.config.i18n || []\n i18n.push(..._ci18n)\n player.config.i18n = i18n\n}\n","export const STATES = {\n INITIAL: 1,\n READY: 2,\n ATTACHING: 3,\n ATTACHED: 4,\n NOTALLOW: 5,\n RUNNING: 6,\n ENDED: 7,\n DESTROYED: 8\n}\n\nexport const STATE_ARRAY = [\n 'ERROR',\n 'INITIAL',\n 'READY',\n 'ATTACHING',\n 'ATTACHED',\n 'NOTALLOW',\n 'RUNNING',\n 'ENDED',\n 'DESTROYED'\n]\n","import Plugin, { Events, Util, POSITIONS, Sniffer, STATE_CLASS } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * disable?: boolean,\n * autoHide?: boolean,\n * mode?: \"flex\"|\"normal\"|\"bottom\",\n * initShow?: boolean,\n * [propName: string]: any\n * }} IControlsConfig\n */\n\nclass Controls extends Plugin {\n static get pluginName () {\n return 'controls'\n }\n\n /**\n * @type IControlsConfig\n */\n static get defaultConfig () {\n return {\n disable: false,\n autoHide: true, // Whether to hide automatically\n mode: '', // Display mode, flex/normal/bottom\n initShow: false // Display when player is initialized\n }\n }\n\n beforeCreate (args) {\n if (!args.config.mode && Sniffer.device === 'mobile') {\n args.config.mode = 'flex'\n }\n if (args.player.config.marginControls) {\n args.config.autoHide = false\n }\n }\n\n afterCreate () {\n const { disable, height, mode } = this.config\n if (disable) {\n return\n }\n\n mode === 'flex' && this.player.addClass(STATE_CLASS.FLEX_CONTROLS)\n const style = {\n height: `${height}px`\n }\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.left = this.find('xg-left-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.center = this.find('xg-center-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.right = this.find('xg-right-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.innerRoot = this.find('xg-inner-controls')\n\n // The progress bar is switched synchronously when switching to the small window state\n this.on(Events.MINI_STATE_CHANGE, (isMini) => {\n isMini ? Util.addClass(this.root, 'mini-controls') : Util.removeClass(this.root, 'mini-controls')\n })\n\n const { isMobileSimulateMode } = this.playerConfig\n if (Sniffer.device !== 'mobile' && isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseleave', this.onMouseLeave)\n }\n }\n\n onMouseEnter = (e) => {\n const { player, playerConfig } = this\n playerConfig.closeControlsBlur && player.focus({ autoHide: false })\n }\n\n onMouseLeave = () => {\n const { player } = this\n player.focus()\n }\n\n focus () {\n this.player.focus({ autoHide: false })\n }\n\n focusAwhile () {\n this.player.focus({ autoHide: true })\n }\n\n blur () {\n this.player.blur({ ignorePaused: true })\n }\n\n recoverAutoHide () {\n // this.config.autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n this.config.autoHide && Util.addClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n pauseAutoHide () {\n // Util.removeClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n Util.removeClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n show () {\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n /**\n * @type {string}\n */\n get mode () {\n return this.config.mode\n }\n\n /**\n *\n * @param {} plugin\n * @param { {config?: {[propName: string]: any}, position?:string, root?: HTMLElement, pluginName?: string}} options\n * @param { string } name\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name) {\n if (!this.root) {\n return\n }\n const defaultConfig = plugin.defaultConfig || {}\n if (!options.root) {\n const position = options.position ? options.position : options.config && options.config.position ? options.config.position : defaultConfig.position\n switch (position) {\n case POSITIONS.CONTROLS_LEFT:\n options.root = this.left\n break\n case POSITIONS.CONTROLS_RIGHT:\n options.root = this.right\n break\n case POSITIONS.CONTROLS_CENTER:\n options.root = this.center\n break\n case POSITIONS.CONTROLS:\n options.root = this.root\n break\n default:\n options.root = this.left\n }\n return super.registerPlugin(plugin, options, name)\n }\n }\n\n destroy () {\n if (Sniffer.device !== 'mobile') {\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mouseleave', this.onMouseLeave)\n }\n }\n\n render () {\n const { mode, autoHide, initShow, disable } = this.config\n if (disable) {\n return\n }\n\n // autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n const className = Util.classNames(\n { 'xgplayer-controls': true },\n { 'flex-controls': mode === 'flex' },\n { 'bottom-controls': mode === 'bottom' },\n { [STATE_CLASS.CONTROLS_AUTOHIDE]: autoHide },\n { 'xgplayer-controls-initshow': initShow || !autoHide })\n return `<xg-controls class=\"${className}\" unselectable=\"on\" onselectstart=\"return false\">\n <xg-inner-controls class=\"xg-inner-controls xg-pos\">\n <xg-left-grid class=\"xg-left-grid\">\n </xg-left-grid>\n <xg-center-grid class=\"xg-center-grid\"></xg-center-grid>\n <xg-right-grid class=\"xg-right-grid\">\n </xg-right-grid>\n </xg-inner-controls>\n </xg-controls>`\n }\n}\n\nexport default Controls\n","import Util from '../utils/util'\nimport EN from './en'\n/**\n * @typedef { {\n * LANG: string,\n * TEXT: {\n * [propName: string]: any\n * }\n * } } IXGI18nText\n */\n\n/**\n * @typedef { {\n * lang: { [propName: string]: IXGI18nText },\n * langKeys: Array<string>, // list of all currently supported languages\n * textKeys: { [propName: string]: string } // list of all currently supported texts\n * } } IXGI18n\n */\n\nconst XGI18nLang = {\n lang: {},\n langKeys: [],\n textKeys: []\n}\n\nfunction deepMerge (dst, src) {\n Object.keys(src).forEach(key => {\n const _s = Util.typeOf(src[key])\n const _t = Util.typeOf(dst[key])\n if (_s === 'Array') {\n if (_t !== 'Array') {\n dst[key] = []\n }\n dst[key].push(...src[key])\n } else if (_s === 'Object') {\n if (_t !== 'Object') {\n dst[key] = {}\n }\n deepMerge(dst[key], src[key])\n } else {\n dst[key] = src[key]\n }\n })\n return dst\n}\n\nfunction updateKeys () {\n Object.keys(XGI18nLang.lang.en).map(key => {\n XGI18nLang.textKeys[key] = key // key.toLowerCase()\n })\n}\n\n/**\n * @param { Array<IXGI18nText> } i18nTextList\n * @param { IXGI18n } [i18nLangs]\n */\nfunction extend (i18nTextList, i18nLangs) {\n let ext = []\n if (!i18nLangs) {\n i18nLangs = XGI18nLang\n }\n if (!i18nLangs.lang) {\n return\n }\n if (Util.typeOf(i18nTextList) !== 'Array') {\n ext = Object.keys(i18nTextList).map(lang => {\n const keyLang = lang === 'zh' ? 'zh-cn' : lang\n return {\n LANG: keyLang,\n TEXT: i18nTextList[lang]\n }\n })\n } else {\n ext = i18nTextList\n }\n const { lang } = i18nLangs\n ext.map(item => {\n if (item.LANG === 'zh') {\n item.LANG = 'zh-cn'\n }\n if (!lang[item.LANG]) {\n use(item, i18nLangs)\n } else {\n deepMerge(lang[item.LANG] || {}, item.TEXT || {})\n }\n })\n updateKeys()\n}\n\n/**\n * @param { IXGI18nText } langData\n * @param { IXGI18n } [i18nLangs]\n */\nfunction use (langData, i18nLangs) {\n let _clang = langData.LANG\n if (!i18nLangs) {\n i18nLangs = XGI18nLang\n }\n if (!i18nLangs.lang) {\n return\n }\n const texts = langData.TEXT || {}\n if (_clang === 'zh') {\n _clang = 'zh-cn'\n }\n if (!i18nLangs.lang[_clang]) {\n i18nLangs.langKeys.push(_clang)\n i18nLangs.lang[_clang] = texts\n } else {\n deepMerge(i18nLangs.lang[_clang], texts)\n }\n updateKeys()\n}\n\n/**\n *\n * @returns { IXGI18n }\n */\nfunction init (id) {\n const ret = {\n lang: {},\n langKeys: [],\n textKeys: {},\n pId: id\n }\n deepMerge(ret.lang, XGI18nLang.lang)\n ret.langKeys.push(...XGI18nLang.langKeys)\n deepMerge(ret.textKeys, XGI18nLang.textKeys)\n return ret\n}\n\nuse(EN)\n\nconst I18N = {\n get textKeys () {\n return XGI18nLang.textKeys\n },\n /**\n * @description List of languages currently supported\n * @type { Array<string> }\n */\n get langKeys () {\n return XGI18nLang.langKeys\n },\n /**\n * @type {{\n * [propName: string]: {\n * [propName: string]: string\n * }\n * }}\n */\n get lang () {\n const ret = {}\n XGI18nLang.langKeys.map(key => {\n ret[key] = XGI18nLang.lang[key]\n })\n if (XGI18nLang.lang['zh-cn']) {\n ret.zh = XGI18nLang.lang['zh-cn'] || {}\n }\n return ret\n },\n\n /**\n * @desc Extend existing languages text\n * @type {(I18nText: IXGI18nText) => {}}\n */\n extend: extend,\n\n /**\n * Add new language text\n * @type {(lang: IXGI18nText) => {}}\n */\n use: use,\n\n /**\n * Initialize a language text\n * @return { IXGI18n }\n */\n init: init\n}\n\nexport default I18N\n","export default {\n LANG: 'en',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: 'video download error'\n },\n mse: {\n code: 2,\n msg: 'stream append error'\n },\n parse: {\n code: 3,\n msg: 'parsing error'\n },\n format: {\n code: 4,\n msg: 'wrong format'\n },\n decoder: {\n code: 5,\n msg: 'decoding error'\n },\n runtime: {\n code: 6,\n msg: 'grammatical errors'\n },\n timeout: {\n code: 7,\n msg: 'play timeout'\n },\n other: {\n code: 8,\n msg: 'other errors'\n }\n },\n HAVE_NOTHING: 'There is no information on whether audio/video is ready',\n HAVE_METADATA: 'Audio/video metadata is ready ',\n HAVE_CURRENT_DATA: 'Data about the current play location is available, but there is not enough data to play the next frame/millisecond',\n HAVE_FUTURE_DATA: 'Current and at least one frame of data is available',\n HAVE_ENOUGH_DATA: 'The available data is sufficient to start playing',\n NETWORK_EMPTY: 'Audio/video has not been initialized',\n NETWORK_IDLE: 'Audio/video is active and has been selected for resources, but no network is used',\n NETWORK_LOADING: 'The browser is downloading the data',\n NETWORK_NO_SOURCE: 'No audio/video source was found',\n MEDIA_ERR_ABORTED: 'The fetch process is aborted by the user',\n MEDIA_ERR_NETWORK: 'An error occurred while downloading',\n MEDIA_ERR_DECODE: 'An error occurred while decoding',\n MEDIA_ERR_SRC_NOT_SUPPORTED: 'Audio/video is not supported',\n REPLAY: 'Replay',\n ERROR: 'Network is offline',\n PLAY_TIPS: 'Play',\n PAUSE_TIPS: 'Pause',\n PLAYNEXT_TIPS: 'Play next',\n DOWNLOAD_TIPS: 'Download',\n ROTATE_TIPS: 'Rotate',\n RELOAD_TIPS: 'Reload',\n FULLSCREEN_TIPS: 'Fullscreen',\n EXITFULLSCREEN_TIPS: 'Exit fullscreen',\n CSSFULLSCREEN_TIPS: 'Cssfullscreen',\n EXITCSSFULLSCREEN_TIPS: 'Exit cssfullscreen',\n TEXTTRACK: 'Caption',\n PIP: 'PIP',\n SCREENSHOT: 'Screenshot',\n LIVE: 'LIVE',\n OFF: 'Off',\n OPEN: 'Open',\n MINI_DRAG: 'Click and hold to drag',\n MINISCREEN: 'Miniscreen',\n REFRESH_TIPS: 'Please Try',\n REFRESH: 'Refresh',\n FORWARD: 'forward',\n LIVE_TIP: 'Live'\n }\n}\n","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'\n\n/**\n * @typedef { import ('./defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef { import ('./defaultConfig').IDefinition } IDefinition\n */\n\n/* eslint-disable camelcase */\nconst PlAYER_HOOKS = ['play', 'pause', 'replay', 'retry']\nlet REAL_TIME_SPEED = 0 // 实时下载速率, kb/s\nlet AVG_SPEED = 0 // 平均下载速率, kb/s\n\nclass Player extends MediaProxy {\n /**\n * @type {number}\n * @description set debugger level\n * 1 - only print error logs\n * 2 - print warn logs and error logs\n * 3 - print all debug logs and error stack logs\n */\n static set debugger (value) {\n XG_DEBUG.config.debug = value\n }\n\n static get debugger () {\n return XG_DEBUG.config.debug\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | string | null }\n */\n static getCurrentUserActivePlayerId () {\n return pluginsManager.getCurrentUseActiveId()\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n */\n static setCurrentUserActive (playerId, isActive) {\n pluginsManager.setCurrentUserActive(playerId, isActive)\n }\n\n /**\n * @param { IPlayerOptions } options\n */\n constructor (options) {\n const config = Util.deepMerge(getDefaultConfig(), options)\n super(config)\n hooksDescriptor(this, PlAYER_HOOKS)\n\n /**\n * @type { IPlayerOptions }\n * @description 当前播放器的配置信息\n */\n this.config = config\n\n /**\n * @type { string }\n * @private\n */\n this._pluginInfoId = Util.generateSessionId()\n\n bindDebug(this)\n // resolve default preset\n const defaultPreset = this.constructor.defaultPreset\n if (this.config.presets.length) {\n const defaultIdx = this.config.presets.indexOf('default')\n if (defaultIdx >= 0 && defaultPreset) {\n this.config.presets[defaultIdx] = defaultPreset\n }\n } else if (defaultPreset) {\n this.config.presets.push(defaultPreset)\n }\n\n // timer and flags\n this.userTimer = null\n /**\n * @private\n */\n this.waitTimer = null\n\n /**\n * @private\n */\n this._state = STATES.INITIAL\n\n /**\n * @public\n * @readonly\n * @type { boolean }\n */\n this.isError = false\n\n /**\n * @private\n */\n this._hasStart = false\n /**\n * Whether the player is in the seeking state\n * @type { boolean }\n * @readonly\n */\n this.isSeeking = false\n\n /**\n * @type { boolean }\n * @readonly\n */\n this.isCanplay = false\n /**\n * @private\n * @readonly\n */\n this._useAutoplay = false\n /**\n * @type { number }\n */\n this.rotateDeg = 0\n /**\n * Whether the player is focus\n * @type { boolean }\n * @readonly\n */\n this.isActive = false\n\n /**\n * Whether player is currently in fullscreen\n * @type { boolean }\n * @readonly\n */\n this.fullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.cssfullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.isRotateFullscreen = false\n\n /**\n * fullscreenElement\n * @type { HTMLElement | null }\n * @readonly\n */\n this._fullscreenEl = null\n\n /**\n * cssfullscreen target Element\n * @type { HTMLElement | null }\n * @readonly\n */\n this._cssfullscreenEl = null\n\n /**\n * @type { IDefinition | null }\n * @readonly\n */\n this.curDefinition = null\n /**\n * @private\n * @type { string }\n */\n this._orgCss = ''\n /**\n * @readonly\n * @type { number }\n */\n this._fullScreenOffset = null\n /**\n * @private\n * @type { number }\n */\n this._videoHeight = 0\n /**\n * @private\n * @type { number }\n */\n this._videoWidth = 0\n\n /**\n * @private\n * @type { { t: number, acc:number, acc: number, loopAcc: number, [propName: string]: any;} }\n */\n this._accPlayed = {\n t: 0,\n acc: 0,\n loopAcc: 0\n }\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 控制栏和video不同布局的时候内部容器\n */\n this.innerContainer = null\n\n /**\n * @type { null | Object }\n * @readonly\n * @description 控制栏插件\n */\n this.controls = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n */\n this.topBar = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 当前播放器根节点\n */\n this.root = null\n\n this.__i18n = I18N.init(this._pluginInfoId)\n\n // android 6以下不支持自动播放\n if (\n Sniffer.os.isAndroid &&\n Sniffer.osVersion > 0 &&\n Sniffer.osVersion < 6\n ) {\n this.config.autoplay = false\n }\n\n /**\n * @readonly\n * @type {any}\n */\n this.database = new Database()\n\n /**\n * @readonly\n * @type { boolean }\n */\n this.isUserActive = false\n\n /**\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 const rootInit = this._initDOM()\n if (!rootInit) {\n console.error(\n new Error(\n `can't find the dom which id is ${this.config.id} or this.config.el does not exist`\n )\n )\n return\n }\n\n // url为空的情况下 根据definition或playnext.urlList设置播放地址\n // 若未配置definition.defaultDefinition,默认将配置为definition.list[0].definition\n const { definition = {}, url } = this.config\n\n if (!url && definition.list && definition.list.length > 0) {\n let defaultDefinitionObj = definition.list.find(\n (e) => e.definition && e.definition === definition.defaultDefinition\n )\n if (!defaultDefinitionObj) {\n definition.defaultDefinition = definition.list[0].definition\n defaultDefinitionObj = definition.list[0]\n }\n this.config.url = defaultDefinitionObj.url\n this.curDefinition = defaultDefinitionObj\n }\n\n this._bindEvents()\n this._registerPresets()\n this._registerPlugins()\n pluginsManager.onPluginsReady(this)\n\n // url为空的情况下 根据definition设置播放地址\n this.getInitDefinition()\n\n this.setState(STATES.READY)\n Util.setTimeout(this, () => {\n this.emit(Events.READY)\n }, 0)\n this.onReady && this.onReady()\n\n if (this.config.videoInit || this.config.autoplay) {\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n this.start()\n }\n }\n }\n\n /**\n * init control domElement\n * @private\n */\n _initDOM () {\n this.root = this.config.id ? document.getElementById(this.config.id) : null\n if (!this.root) {\n const el = this.config.el\n if (el && el.nodeType === 1) {\n this.root = el\n } else {\n this.emit(\n Events.ERROR,\n new Errors('use', this.config.vid, {\n line: 32,\n handle: 'Constructor',\n msg: 'container id can\\'t be empty'\n })\n )\n console.error('this.confg.id or this.config.el can\\'t be empty')\n return false\n }\n }\n const ret = pluginsManager.checkPlayerRoot(this.root)\n if (ret) {\n XG_DEBUG.logWarn(\n 'The is an Player instance already exists in this.root, destroy it and reinitialize'\n )\n ret.destroy()\n }\n this.root.setAttribute(PLATER_ID, this.playerId)\n pluginsManager.init(this)\n this._initBaseDoms()\n\n // 允许自定义video对象的构造\n const XgVideoProxy = this.constructor.XgVideoProxy\n if (XgVideoProxy && this.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 return true\n }\n\n /**\n * @private\n */\n _initBaseDoms () {\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.topBar = null\n /**\n * @readonly\n * @type { HTMLElement |null }\n */\n this.leftBar = null\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.rightBar = null\n\n if (this.config.marginControls) {\n this.innerContainer = Util.createDom(\n 'xg-video-container',\n '',\n { 'data-index': -1 },\n 'xg-video-container'\n )\n this.root.appendChild(this.innerContainer)\n }\n }\n\n /**\n * @private\n */\n _bindEvents () {\n ['focus', 'blur'].forEach((item) => {\n this.on(item, this['on' + item.charAt(0).toUpperCase() + item.slice(1)])\n })\n\n FULLSCREEN_EVENTS.forEach((item) => {\n document && document.addEventListener(item, this.onFullscreenChange)\n })\n\n if (Sniffer.os.isIos) {\n this.media.addEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.addEventListener( 'webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n this.once(Events.LOADED_DATA, this.resize)\n\n this.playFunc = () => {\n if (!this.config.closeFocusVideoFocus) {\n this.media.focus()\n }\n }\n this.once(Events.PLAY, this.playFunc)\n }\n\n /**\n * @private\n */\n _unbindEvents () {\n this.root.removeEventListener('mousemove', this.mousemoveFunc)\n FULLSCREEN_EVENTS.forEach((item) => {\n document.removeEventListener(item, this.onFullscreenChange)\n })\n this.playFunc && this.off(Events.PLAY, this.playFunc)\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.media.removeEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.removeEventListener('webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n /**\n *\n * @param { any } url\n * @returns\n */\n _startInit (url) {\n if (!this.media) {\n return\n }\n if (\n !url ||\n url === '' ||\n (Util.typeOf(url) === 'Array' && url.length === 0)\n ) {\n url = ''\n this.emit(Events.URL_NULL)\n XG_DEBUG.logWarn(\n 'config.url is null, please get url and run player._startInit(url)'\n )\n if (this.config.nullUrlStart) {\n return\n }\n }\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array' && url.length > 0) {\n this._attachSourceEvents(this.media, url)\n } else if (!this.media.src || this.media.src !== url) {\n this.media.src = url\n } else if (!url) {\n this.media.removeAttribute('src')\n }\n\n if (Util.typeOf(this.config.volume) === 'Number') {\n this.volume = this.config.volume\n }\n\n const _root = this.innerContainer ? this.innerContainer : this.root\n if (this.media instanceof window.Element && !_root.contains(this.media)) {\n _root.insertBefore(this.media, _root.firstChild)\n }\n\n const { readyState } = this.media\n XG_DEBUG.logInfo('_startInit readyState', readyState)\n if (this.config.autoplay) {\n !(/^blob/.test(this.media.currentSrc) || /^blob/.test(this.media.src)) &&\n this.load();\n // ios端无法自动播放的场景下,不调用play不会触发canplay loadeddata等事件\n (Sniffer.os.isIpad || Sniffer.os.isPhone) && this.mediaPlay()\n }\n\n if (readyState >= 2) {\n this.canPlayFunc()\n } else {\n this.once(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(\n this,\n () => {\n this.emit(Events.COMPLETE)\n },\n 0\n )\n }\n\n /**\n * @description 注册组件 组件列表config.plugins\n * @param { {boolean} } [isInit] 是否是首次初始化\n * @private\n */\n _registerPlugins (isInit = true) {\n /**\n * @private\n */\n this._loadingPlugins = []\n const ignores = this.config.ignores || []\n const plugins = this.config.plugins || []\n const i18n = this.config.i18n || []\n isInit && I18N.extend(i18n, this.__i18n)\n const ignoresStr = ignores.join('||').toLowerCase().split('||')\n const cuPlugins = this.plugins\n plugins.forEach((plugin) => {\n try {\n const pluginName = plugin.plugin\n ? plugin.plugin.pluginName\n : plugin.pluginName\n // 在ignores中的不做组装\n if (pluginName && ignoresStr.indexOf(pluginName.toLowerCase()) > -1) {\n return null\n }\n\n if (!isInit && cuPlugins[pluginName.toLowerCase()]) {\n return\n }\n\n if (plugin.lazy && plugin.loader) {\n const loadingPlugin = pluginsManager.lazyRegister(this, plugin)\n if (plugin.forceBeforeInit) {\n loadingPlugin\n .then(() => {\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n .catch((e) => {\n XG_DEBUG.logError('_registerPlugins:loadingPlugin', e)\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n this._loadingPlugins.push(loadingPlugin)\n }\n\n return\n }\n return this.registerPlugin(plugin)\n } catch (err) {\n XG_DEBUG.logError('_registerPlugins:', err)\n // return\n }\n })\n }\n\n /**\n * @private\n */\n _registerPresets () {\n this.config.presets.forEach((preset) => {\n usePreset(this, preset)\n })\n }\n\n /**\n * @private\n * @param { string } position ]\n */\n _getRootByPosition (position) {\n let _root = null\n switch (position) {\n case POSITIONS.ROOT_RIGHT:\n if (!this.rightBar) {\n this.rightBar = Util.createPositionBar('xg-right-bar', this.root)\n }\n _root = this.rightBar\n break\n case POSITIONS.ROOT_LEFT:\n if (!this.leftBar) {\n this.leftBar = Util.createPositionBar('xg-left-bar', this.root)\n }\n _root = this.leftBar\n break\n case POSITIONS.ROOT_TOP:\n if (!this.topBar) {\n this.topBar = Util.createPositionBar('xg-top-bar', this.root)\n if (this.config.topBarAutoHide) {\n Util.addClass(this.topBar, STATE_CLASS.TOP_BAR_AUTOHIDE)\n }\n }\n _root = this.topBar\n break\n default:\n _root = this.innerContainer || this.root\n break\n }\n return _root\n }\n\n /**\n *\n * @param { {plugin: function, options:object} | function } plugin\n * @param { {[propName: string]: any;} } [config]\n * @returns { any } plugin\n */\n registerPlugin (plugin, config) {\n const _retPlugin = pluginsManager.formatPluginInfo(plugin, config)\n const { PLUFGIN, options } = _retPlugin\n\n // 如果当前配置plugins中不存在该组件, 则将其push\n const { plugins } = this.config\n const exits = pluginsManager.checkPluginIfExits(PLUFGIN.pluginName, plugins)\n !exits && plugins.push(PLUFGIN)\n\n // 获取配置的position或者root\n const _pConfig = pluginsManager.getRootByConfig(PLUFGIN.pluginName, this.config)\n _pConfig.root && (options.root = _pConfig.root)\n _pConfig.position && (options.position = _pConfig.position)\n\n const position = options.position\n ? options.position\n : (options.config && options.config.position) ||\n (PLUFGIN.defaultConfig && PLUFGIN.defaultConfig.position)\n if (\n !options.root &&\n typeof position === 'string' &&\n position.indexOf('controls') > -1\n ) {\n return (\n this.controls &&\n this.controls.registerPlugin(PLUFGIN, options, PLUFGIN.pluginName)\n )\n }\n if (!options.root) {\n options.root = this._getRootByPosition(position)\n }\n return pluginsManager.register(this, PLUFGIN, options)\n }\n\n /**\n *\n * @param { any } plugin\n */\n deregister (plugin) {\n if (typeof plugin === 'string') {\n pluginsManager.unRegister(this, plugin)\n } else if (plugin instanceof BasePlugin) {\n pluginsManager.unRegister(this, plugin.pluginName)\n }\n }\n\n /**\n *\n * @param { any } plugin\n * @param { boolean } removedFromConfig\n */\n unRegisterPlugin (plugin, removedFromConfig = false) {\n this.deregister(plugin)\n if (removedFromConfig) {\n this.removePluginFromConfig(plugin)\n }\n }\n\n removePluginFromConfig (plugin) {\n let pluginName\n if (typeof plugin === 'string') {\n pluginName = plugin\n } else if (plugin instanceof BasePlugin) {\n pluginName = plugin.pluginName\n }\n if (!pluginName) {\n return\n }\n for (let i = this.config.plugins.length - 1; i > -1; i--) {\n const plugin = this.config.plugins[i]\n if (plugin.pluginName.toLowerCase() === pluginName.toLowerCase()) {\n this.config.plugins.splice(i, 1)\n break\n }\n }\n }\n\n /**\n * 当前播放器挂载的插件实例列表\n * @type { {[propName: string]: any | null } }\n */\n get plugins () {\n return pluginsManager.getPlugins(this)\n }\n\n /**\n * get a plugin instance\n * @param { string } pluginName\n * @return { null | any } plugin\n */\n getPlugin (pluginName) {\n const plugin = pluginsManager.findPlugin(this, pluginName)\n return plugin && plugin.pluginName ? plugin : null\n }\n\n /**\n *\n * @param { string } className\n */\n addClass (className) {\n if (!this.root) {\n return\n }\n if (!Util.hasClass(this.root, className)) {\n Util.addClass(this.root, className)\n }\n }\n\n /**\n *\n * @param { string } className\n * @returns\n */\n removeClass (className) {\n if (!this.root) {\n return\n }\n Util.removeClass(this.root, className)\n }\n\n /**\n *\n * @param { string } className\n * @returns { boolean } has\n */\n hasClass (className) {\n if (!this.root) {\n return\n }\n return Util.hasClass(this.root, className)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n setAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.setAttribute(key, value)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n removeAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.removeAttribute(key, value)\n }\n\n /**\n *\n * @param { any } url\n * @returns { Promise<void> | void }\n * @description 启动播放器,start一般都是播放器内部隐式调用,主要功能是将video添加到DOM\n */\n start (url) {\n // 已经开始初始化播放了 则直接调用play\n if (this.state > STATES.ATTACHING) {\n return\n }\n if (!url && !this.config.url) {\n this.getInitDefinition()\n }\n this.hasStart = true\n this.setState(STATES.ATTACHING)\n\n this._registerPlugins(false)\n return pluginsManager\n .beforeInit(this)\n .then(() => {\n // this.config为空即已经销毁,不再执行后面的异步流程\n if (!this.config) {\n return\n }\n if (!url) {\n url = this.url || this.config.url\n }\n const ret = this._startInit(url)\n return ret\n })\n .catch((e) => {\n e.fileName = 'player'\n e.lineNumber = '236'\n XG_DEBUG.logError('start:beforeInit:', e)\n throw e\n })\n }\n\n /**\n * @param { string | object } url\n * @param { boolean | {\n * seamless?: boolean,\n * currentTime?: number,\n * bitrate?: number\n * } } [options]\n * @returns { Promise | null } 执行结果\n */\n switchURL (url, options) {\n let _src = url\n if (Util.typeOf(url) === 'Object') {\n _src = url.url\n }\n const curTime = this.currentTime\n const isPaused = this.paused && !this.isError\n this.src = _src\n return new Promise((resolve) => {\n const _canplay = () => {\n this.currentTime = curTime\n if (isPaused) {\n this.once('canplay', () => {\n this.pause()\n })\n }\n resolve()\n }\n if (Sniffer.os.isAndroid) {\n this.once('timeupdate', () => {\n _canplay()\n })\n } else {\n this.once('canplay', () => {\n _canplay()\n })\n }\n this.play()\n })\n }\n\n /**\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.CANPLAY, 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.CANPLAY, this._onceSeekCanplay)\n\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n this.addClass(STATE_CLASS.ENTER)\n this.currentTime = time\n // 未起播状态不论希望保持什么状态,都要触发一次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.ENTER)\n this.emit(Events.RESET)\n }\n\n /**\n * 重置播放实例\n * @param { Array<string> } unregisterPlugins 重置的时候需要卸载重新初始化的插件列表\n * @param { boolean } [isResetConfig] 是否需要重置配置列表\n * @returns\n */\n reset (unregisterPlugins = [], isResetConfig) {\n this.resetState()\n const { plugins } = this\n\n if (!plugins) {\n return\n }\n\n unregisterPlugins.map((pn) => {\n this.deregister(pn)\n })\n\n if (isResetConfig) {\n const de = getDefaultConfig()\n Object.keys(this.config).keys((k) => {\n if (\n this.config[k] !== 'undefined' &&\n (k === 'plugins' || k === 'presets' || k === 'el' || k === 'id')\n ) {\n this.config[k] = de[k]\n }\n })\n }\n }\n\n /**\n * @description destroy the player instance\n * @returns\n */\n destroy () {\n const { innerContainer, root, media } = this\n if (!root || !media) {\n return\n }\n this.hasStart = false\n this._useAutoplay = false\n root.removeAttribute(PLATER_ID)\n this.updateAcc('destroy')\n this._unbindEvents()\n this._detachSourceEvents(this.media)\n Util.clearAllTimers(this)\n this.emit(Events.DESTROY)\n pluginsManager.destroy(this)\n delHooksDescriptor(this)\n super.destroy()\n // 退出全屏\n if (this.fullscreen && this._fullscreenEl === this.root) {\n this.exitFullscreen()\n }\n\n if (innerContainer) {\n const _c = innerContainer.children\n for (let i = 0; i < _c.length; i++) {\n innerContainer.removeChild(_c[i])\n }\n }\n !innerContainer &&\n media instanceof window.Node &&\n root.contains(media) &&\n root.removeChild(media);\n ['topBar', 'leftBar', 'rightBar', 'innerContainer'].map((item) => {\n this[item] && root.removeChild(this[item])\n this[item] = null\n })\n const cList = root.className.split(' ')\n if (cList.length > 0) {\n root.className = cList\n .filter((name) => name.indexOf('xgplayer') < 0)\n .join(' ')\n } else {\n root.className = ''\n }\n this.removeAttribute('data-xgfill');\n\n [\n 'isSeeking',\n 'isCanplay',\n 'isActive',\n 'cssfullscreen',\n 'fullscreen'\n ].forEach((key) => {\n this[key] = false\n })\n }\n\n replay () {\n this.removeClass(STATE_CLASS.ENDED)\n this.currentTime = 0\n this.isSeeking = false\n runHooks(this, 'replay', () => {\n this.once(Events.CANPLAY, () => {\n const playPromise = this.mediaPlay()\n if (playPromise && playPromise.catch) {\n playPromise.catch((err) => {\n console.log(err)\n })\n }\n })\n this.play()\n this.emit(Events.REPLAY)\n this.onPlay()\n })\n }\n\n retry () {\n this.removeClass(STATE_CLASS.ERROR)\n this.addClass(STATE_CLASS.LOADING)\n runHooks(this, 'retry', () => {\n const cur = this.currentTime\n this.src = this.config.url\n !this.config.isLive && (this.currentTime = cur)\n this.once(Events.CANPLAY, () => {\n this.mediaPlay()\n })\n })\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n changeFullStyle (root, el, rootClass, pClassName) {\n if (!root) {\n return\n }\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (!this._orgCss) {\n this._orgCss = Util.filterStyleFromText(root)\n }\n Util.addClass(root, rootClass)\n if (el && el !== root && !this._orgPCss) {\n /**\n * @private\n */\n this._orgPCss = Util.filterStyleFromText(el)\n Util.addClass(el, pClassName)\n el.setAttribute(PLATER_ID, this.playerId)\n }\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n recoverFullStyle (root, el, rootClass, pClassName) {\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (this._orgCss) {\n Util.setStyleFromCsstext(root, this._orgCss)\n this._orgCss = ''\n }\n Util.removeClass(root, rootClass)\n if (el && el !== root && this._orgPCss) {\n Util.setStyleFromCsstext(el, this._orgPCss)\n this._orgPCss = ''\n Util.removeClass(el, pClassName)\n el.removeAttribute(PLATER_ID)\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise<void> }\n */\n getFullscreen (el = this.config.fullscreenTarget) {\n const { root, media } = this\n if (!el) {\n el = root\n }\n this._fullScreenOffset = {\n top: Util.scrollTop(),\n left: Util.scrollLeft()\n }\n\n this._fullscreenEl = el\n /**\n * @private\n */\n this._fullActionFrom = 'get'\n const fullEl = Util.getFullScreenEl()\n if (fullEl === this._fullscreenEl) {\n this.onFullscreenChange()\n return\n }\n try {\n for (let i = 0; i < GET_FULLSCREEN_API.length; i++) {\n const key = GET_FULLSCREEN_API[i]\n if (el[key]) {\n const ret =\n key === 'webkitRequestFullscreen'\n ? el.webkitRequestFullscreen(window.Element.ALLOW_KEYBOARD_INPUT)\n : el[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (media.fullscreenEnabled || media.webkitSupportsFullscreen) {\n media.webkitEnterFullscreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call getFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call getFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise<void> }\n */\n exitFullscreen (el) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n }\n if (!this._fullscreenEl && !Util.getFullScreenEl()) {\n return\n }\n const { root, media } = this\n if (el) {\n el = root\n }\n this._fullActionFrom = 'exit'\n try {\n for (let i = 0; i < EXIT_FULLSCREEN_API.length; i++) {\n const key = EXIT_FULLSCREEN_API[i]\n if (document[key]) {\n const ret = document[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (media && media.webkitSupportsFullscreen) {\n media.webkitExitFullScreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call exitFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call exitFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n getCssFullscreen (el = this.config.fullscreenTarget) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n } else if (this.fullscreen) {\n this.exitFullscreen()\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n this.changeFullStyle(this.root, el, _class)\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.fullscreen = true\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n this._cssfullscreenEl = el\n this.cssfullscreen = true\n this.emit(Events.CSS_FULLSCREEN_CHANGE, true)\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n exitCssFullscreen () {\n const _class = this._cssfullscreenEl\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n if (!this.fullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n } else {\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n this.fullscreen = false\n this.emit(Events.FULLSCREEN_CHANGE, false)\n } else {\n this.removeClass(_class)\n }\n }\n this._cssfullscreenEl = null\n this.cssfullscreen = false\n this.emit(Events.CSS_FULLSCREEN_CHANGE, false)\n }\n\n /**\n * 进入旋转全屏\n * @param { HTMLElement } [el]\n */\n getRotateFullscreen (el) {\n if (this.cssfullscreen) {\n this.exitCssFullscreen(el)\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this._fullscreenEl = el || this.root\n this.changeFullStyle(\n this.root,\n el,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = true\n this.fullscreen = true\n this.setRotateDeg(90)\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n\n /**\n * 退出旋转全屏\n * @param { HTMLElement } [el]\n */\n exitRotateFullscreen (el) {\n const _class =\n this._fullscreenEl !== this.root\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this.recoverFullStyle(\n this.root,\n this._fullscreenEl,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = false\n this.fullscreen = false\n this.setRotateDeg(0)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n }\n\n setRotateDeg (deg) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.rotateDeg = 0\n } else {\n this.rotateDeg = deg\n }\n }\n\n /**\n * @description 播放器焦点状态,控制栏显示\n * @param { {\n * autoHide?: boolean, // 是否可以自动隐藏\n * delay?: number // 自动隐藏的延迟时间, ms, 不传默认使用3000ms\n * } } [data]\n */\n focus (\n data = {\n autoHide: !this.config.closeDelayBlur,\n delay: this.config.inactive\n }\n ) {\n if (this.isActive) {\n this.onFocus(data)\n return\n }\n this.emit(Events.PLAYER_FOCUS, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @description 取消播放器当前焦点状态\n * @param { { ignorePaused?: boolean } } [data]\n */\n blur (data = { ignorePaused: false }) {\n if (!this.isActive) {\n this.onBlur(data)\n return\n }\n this.emit(Events.PLAYER_BLUR, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @protected\n * @param { { autoHide?: boolean, delay?: number} } [data]\n * @returns\n */\n onFocus ({\n autoHide = !this.config.closePlayerBlur,\n delay = this.config.inactive\n } = {}) {\n this.isActive = true\n this.removeClass(STATE_CLASS.INACTIVE)\n if (this.userTimer) {\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n if (!autoHide) {\n if (this.userTimer) {\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n return\n }\n this.userTimer = Util.setTimeout(\n this,\n () => {\n this.userTimer = null\n this.blur()\n },\n delay\n )\n }\n\n /**\n * @protected\n * @param {{ ignorePaused?: boolean }} [data]\n * @returns\n */\n onBlur ({ ignorePaused = false } = {}) {\n if (!this.isActive) {\n return\n }\n const { closePauseVideoFocus } = this.config\n this.isActive = false\n if (ignorePaused || closePauseVideoFocus || (!this.paused && !this.ended)) {\n this.addClass(STATE_CLASS.INACTIVE)\n }\n }\n\n canPlayFunc = () => {\n if (!this.config) {\n return\n }\n const { autoplay, startTime, defaultPlaybackRate } = this.config\n\n XG_DEBUG.logInfo('player', 'canPlayFunc, startTime', startTime)\n if (startTime) {\n this.currentTime = startTime > this.duration ? this.duration : startTime\n this.config.startTime = 0 // 仅仅使用一次\n }\n\n // 解决浏览器安装了一些倍速扩展插件的情况下,倍速设置失效问题\n this.playbackRate = defaultPlaybackRate;\n\n (autoplay || this._useAutoplay) && this.mediaPlay()\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.removeClass(STATE_CLASS.ENTER)\n }\n\n /**\n *\n */\n onFullscreenChange = (event, isFullScreen) => {\n const delayResize = () => {\n Util.setTimeout(this, () => {\n this.resize()\n }, 100)\n }\n const fullEl = Util.getFullScreenEl()\n if (this._fullActionFrom) {\n this._fullActionFrom = ''\n } else {\n // 快捷键触发\n this.emit(Events.USER_ACTION, {\n eventType: 'system',\n action: 'switch_fullscreen',\n pluginName: 'player',\n currentTime: this.currentTime,\n duration: this.duration,\n props: [{\n prop: 'fullscreen',\n from: true,\n to: false\n }]\n })\n }\n const isVideo = checkIsCurrentVideo(fullEl, this.playerId, PLATER_ID)\n if (isFullScreen || (fullEl && (fullEl === this._fullscreenEl || isVideo))) {\n delayResize()\n !this.config.closeFocusVideoFocus && this.media.focus()\n this.fullscreen = true\n // this.addClass(STATE_CLASS.FULLSCREEN)\n this.changeFullStyle(this.root, fullEl, STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, true, this._fullScreenOffset)\n if (this.cssfullscreen) {\n this.exitCssFullscreen()\n }\n } else if (this.fullscreen) {\n delayResize()\n const { _fullScreenOffset, config } = this\n if (config.needFullscreenScroll) {\n // 保证页面scroll的情况下退出全屏 页面回到原位置\n window.scrollTo(_fullScreenOffset.left, _fullScreenOffset.top)\n Util.setTimeout( this, () => {\n this.fullscreen = false\n this._fullScreenOffset = null\n }, 100)\n } else {\n // 保证页面scroll的情况下退出全屏 页面定位在播放器位置\n !this.config.closeFocusVideoFocus && this.media.focus()\n this.fullscreen = false\n this._fullScreenOffset = null\n }\n if (!this.cssfullscreen) {\n this.recoverFullStyle( this.root,this._fullscreenEl, STATE_CLASS.FULLSCREEN)\n } else {\n this.removeClass(STATE_CLASS.FULLSCREEN)\n }\n this._fullscreenEl = null\n // this.removeClass(STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n }\n }\n\n _onWebkitbeginfullscreen = (e) => {\n this._fullscreenEl = this.media\n this.onFullscreenChange(e, true)\n }\n\n _onWebkitendfullscreen = (e) => {\n this.onFullscreenChange(e, false)\n }\n\n onEmptied () {\n this.updateAcc('emptied')\n }\n\n /**\n * @protected\n */\n onCanplay () {\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.ERROR)\n this.removeClass(STATE_CLASS.LOADING)\n this.isCanplay = true\n this.waitTimer && Util.clearTimeout(this, this.waitTimer)\n }\n\n onLoadeddata () {\n this.isError = false\n }\n\n onLoadstart () {\n this.removeClass(STATE_CLASS.ERROR)\n this.isCanplay = false\n }\n\n /**\n * @protected\n */\n onPlay () {\n if (this.state === STATES.ENDED) {\n this.setState(STATES.RUNNING)\n }\n this.removeClass(STATE_CLASS.PAUSED)\n this.ended && this.removeClass(STATE_CLASS.ENDED)\n !this.config.closePlayVideoFocus && this.focus()\n }\n\n /**\n * @protected\n */\n onPause () {\n this.addClass(STATE_CLASS.PAUSED)\n this.updateAcc('pause')\n if (!this.config.closePauseVideoFocus) {\n if (this.userTimer) {\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n this.focus()\n }\n }\n\n /**\n * @protected\n */\n onEnded () {\n this.updateAcc('ended')\n this.addClass(STATE_CLASS.ENDED)\n this.setState(STATES.ENDED)\n // this.removeClass(STATE_CLASS.PLAYING)\n }\n\n /**\n * @protected\n */\n onError () {\n // this.setState(STATES.ERROR)\n this.isError = true\n this.updateAcc('error')\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.LOADING)\n this.addClass(STATE_CLASS.ERROR)\n }\n\n /**\n * @protected\n */\n onSeeking () {\n if (!this.isSeeking) {\n this.updateAcc('seeking')\n }\n this.isSeeking = true\n this.addClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onSeeked () {\n this.isSeeking = false\n // for ie,playing fired before waiting\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.removeClass(STATE_CLASS.LOADING)\n this.removeClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onWaiting () {\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.updateAcc('waiting')\n this.waitTimer = Util.setTimeout(this, () => {\n this.addClass(STATE_CLASS.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }, 200)\n }\n\n /**\n * @protected\n */\n onPlaying () {\n this.isError = false\n const { NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING } = STATE_CLASS\n const clsList = [NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING]\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n }\n\n /**\n * @protected\n */\n onTimeupdate () {\n !this._videoHeight && this.resize()\n if ((this.waitTimer || this.hasClass(STATE_CLASS.LOADING)) &&\n this.media.readyState > 2\n ) {\n this.removeClass(STATE_CLASS.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }\n\n // 兼容safari在调整为静音之后未调用play自动起播问题\n if (!this.paused && this.state < STATES.RUNNING && this.duration) {\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n\n if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n onVolumechange () {\n Util.typeOf(this.config.volume) === 'Number' &&\n (this.config.volume = this.volume)\n }\n\n onRatechange () {\n this.config.defaultPlaybackRate = this.playbackRate\n }\n\n /**\n * 触发用户行为事件,第一个参数是Dom事件\n * @param { Event } event\n * @param { string } action\n * @param {[propName: string]: any; } [params]\n * @returns\n */\n emitUserAction (event, action, params) {\n if (!this.media || !action || !event) {\n return\n }\n const eventType =\n Util.typeOf(event) === 'String' ? event : event.type || ''\n\n // if (action === 'switch_play_pause') {\n // Util.typeOf(params.paused) === 'Undefined' && (params.paused = this.paused)\n // params.isFirstStart = !this.playing\n // }\n\n if (params.props && Util.typeOf(params.props) !== 'Array') {\n params.props = [params.props]\n }\n this.emit(Events.USER_ACTION, {\n eventType,\n action,\n // pluginName: this.pluginName,\n currentTime: this.currentTime,\n duration: this.duration,\n ended: this.ended,\n event,\n ...params\n })\n }\n\n updateAcc (endType) {\n if (this._accPlayed.t) {\n const _at = new Date().getTime() - this._accPlayed.t\n this._accPlayed.acc += _at\n this._accPlayed.t = 0\n if (endType === 'ended' || this.ended) {\n this._accPlayed.loopAcc = this._accPlayed.acc\n }\n }\n }\n\n /**\n *\n * @param { number } time\n * @returns { boolean }\n */\n checkBuffer (time) {\n const buffered = this.media.buffered\n if (!buffered || buffered.length === 0 || !this.duration) {\n return true\n }\n const currentTime = time || this.media.currentTime || 0.2\n const len = buffered.length\n for (let i = 0; i < len; i++) {\n if (buffered.start(i) <= currentTime && buffered.end(i) > currentTime) {\n return true\n }\n }\n return false\n }\n\n /**\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 rvH = 1 / pos.h\n let _transform = rvH !== 1 ? `scale(${rvH})` : ''\n let _tx = 0\n let _ty = 0\n if (pos.y) {\n _ty = (100 - pos.h * 100) / 2 - pos.y * 100\n }\n if (pos.w && pos.x) {\n _tx = (100 - pos.w * 100) / 2 - pos.x * 100\n }\n _transform += ` translate(${_tx}%, ${_ty}%)`\n this.media.style.transform = _transform\n this.media.style.webkitTransform = _transform\n }\n\n /**\n * @description Update configuration parameters\n * @param { IPlayerOptions } config\n */\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map((key) => {\n if (key !== 'plugins') {\n this.config[key] = config[key]\n const plugin = this.plugins[key.toLowerCase()]\n if (plugin && Util.typeOf(plugin.setConfig) === 'Function') {\n plugin.setConfig(config[key])\n }\n }\n })\n }\n\n /**\n * @description play another video resource\n * @param { IPlayerOptions } config\n */\n playNext (config) {\n this.resetState()\n this.setConfig(config)\n this._currentTime = 0\n this._duration = 0\n 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 { videoWidth, videoHeight } = this.media\n const { fitVideoSize, videoFillMode } = this.config\n\n if (videoFillMode === 'fill' || videoFillMode === 'cover') {\n this.setAttribute('data-xgfill', videoFillMode)\n }\n\n if (!videoHeight || !videoWidth) {\n return\n }\n this._videoHeight = videoHeight\n this._videoWidth = videoWidth\n const containerSize = this.root.getBoundingClientRect()\n const controlsHeight =\n this.controls && this.innerContainer\n ? this.controls.root.getBoundingClientRect().height\n : 0\n const width = containerSize.width\n const height = containerSize.height - controlsHeight\n const videoFit = parseInt((videoWidth / videoHeight) * 1000, 10)\n const fit = parseInt((width / height) * 1000, 10)\n let rWidth = width\n let rHeight = height\n const _style = {}\n if (\n (fitVideoSize === 'auto' && fit > videoFit) ||\n fitVideoSize === 'fixWidth'\n ) {\n rHeight = (width / videoFit) * 1000\n if (this.config.fluid) {\n _style.paddingTop = `${(rHeight * 100) / rWidth}%`\n } else {\n _style.height = `${rHeight + controlsHeight}px`\n }\n } else if (\n (fitVideoSize === 'auto' && fit < videoFit) ||\n fitVideoSize === 'fixHeight'\n ) {\n rWidth = (videoFit * height) / 1000\n _style.width = `${rWidth}px`\n }\n // 全屏不做行间css设置\n if (!this.fullscreen && !this.cssfullscreen) {\n Object.keys(_style).forEach((key) => {\n this.root.style[key] = _style[key]\n })\n }\n // video填充模式\n if (\n (videoFillMode === 'fillHeight' && fit < videoFit) ||\n (videoFillMode === 'fillWidth' && fit > videoFit)\n ) {\n this.setAttribute('data-xgfill', 'cover')\n }\n const data = {\n videoScale: videoFit,\n vWidth: rWidth,\n vHeight: rHeight,\n cWidth: rWidth,\n cHeight: rHeight + controlsHeight\n }\n this.emit(Events.VIDEO_RESIZE, data)\n }\n\n /**\n *\n * @param { number } left\n * @param { number } top\n * @returns\n */\n updateObjectPosition (left = 0, top = 0) {\n if (this.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 * @type { number }\n */\n get state () {\n return this._state\n }\n\n /**\n * @type { boolean }\n */\n get isFullscreen () {\n return this.fullscreen\n }\n\n /**\n * @type { boolean }\n */\n get isCssfullScreen () {\n return this.cssfullscreen\n }\n\n /**\n * @type { boolean }\n * @description 是否开始播放\n */\n get hasStart () {\n return this._hasStart\n }\n\n set hasStart (bool) {\n if (typeof bool === 'boolean') {\n this._hasStart = bool\n if (bool === false) {\n this.setState(STATES.READY)\n }\n this.emit('hasstart')\n }\n }\n\n /**\n * @type { boolean }\n * @description 是否已经进入起播状态\n */\n get isPlaying () {\n return this._state === STATES.RUNNING || this._state === STATES.ENDED\n }\n\n set isPlaying (value) {\n if (value) {\n this.setState(STATES.RUNNING)\n } else {\n this._state >= STATES.RUNNING && (this.setState(STATES.ATTACHED))\n }\n }\n\n /**\n * @type { Array.<IDefinition> }\n */\n set definitionList (list) {\n const { definition } = this.config\n let curDef = null\n let targetDef = null\n\n definition.list = list\n this.emit('resourceReady', list)\n\n list.forEach((item) => {\n if (this.curDefinition?.definition === item.definition) {\n curDef = item\n }\n if (definition.defaultDefinition === item.definition) {\n targetDef = item\n }\n })\n if (!targetDef && list.length > 0) {\n targetDef = list[0]\n }\n curDef\n ? this.changeDefinition(curDef)\n : targetDef && this.changeDefinition(targetDef)\n }\n\n get definitionList () {\n if (!this.config || !this.config.definition) {\n return []\n }\n return this.config.definition.list || []\n }\n\n /**\n * @description VideoFrames infos\n * @type { {\n * total: number,\n * dropped: number,\n * corrupted: number,\n * droppedRate: number,\n * droppedDuration: number\n * } }\n */\n get videoFrameInfo () {\n const ret = {\n total: 0,\n dropped: 0,\n corrupted: 0,\n droppedRate: 0,\n droppedDuration: 0\n }\n if (!this.media || !this.media.getVideoPlaybackQuality) {\n return ret\n }\n const _quality = this.media.getVideoPlaybackQuality()\n ret.dropped = _quality.droppedVideoFrames || 0\n ret.total = _quality.totalVideoFrames || 0\n ret.corrupted = _quality.corruptedVideoFrames || 0\n if (ret.total > 0) {\n ret.droppedRate = (ret.dropped / ret.total) * 100\n ret.droppedDuration = parseInt(\n (this.cumulateTime / ret.total) * ret.dropped,\n 0\n )\n }\n return ret\n }\n\n /**\n * @type { 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 { _accPlayed } = this\n this.updateAcc('get')\n return _accPlayed.acc\n }\n\n /**\n * @type { number }\n */\n get zoom () {\n return this.config.zoom\n }\n\n /**\n * @type { number }\n */\n set zoom (value) {\n this.config.zoom = value\n }\n\n /**\n * @description 均衡下载速度,单位kb/s, 根据10条最新下载速度计算出来的加权值,如果没有测速能力则默认是0\n * @type { number }\n */\n set avgSpeed (val) {\n AVG_SPEED = val\n }\n\n get avgSpeed () {\n return AVG_SPEED\n }\n\n /**\n * @type { number }\n * 最新一次下载速度,单位kb/s, 如果没有测速能力则默认是0\n */\n set realTimeSpeed (val) {\n REAL_TIME_SPEED = val\n }\n\n get realTimeSpeed () {\n return REAL_TIME_SPEED\n }\n\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns {boolean} isSuccess\n */\n useHooks (hookName, handler) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise<any> } handler\n * @returns\n */\n removeHooks (hookName, handler) {\n return removeHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n usePluginHooks (pluginName, hookName, handler, ...args) {\n return usePluginHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n removePluginHooks (pluginName, hookName, handler, ...args) {\n return removePluginHooks.call(this, ...arguments)\n }\n\n /**\n * 设置当前实例的用户激活态\n * @param { boolean } isActive\n * @param { boolean } [isMuted]\n */\n setUserActive (isActive, isMuted) {\n if (typeof isMuted === 'boolean' && isMuted !== this.muted) {\n this.addInnerOP('volumechange')\n this.muted = isMuted\n }\n pluginsManager.setCurrentUserActive(this.playerId, isActive)\n }\n\n /**\n * 当前浏览器是否支持hevc编码\n * @returns {boolean}\n */\n static isHevcSupported () {\n return Sniffer.isHevcSupported()\n }\n\n /**\n * 检测编码参数是否被当前浏览器支持\n * @doc https://developer.mozilla.org/en-US/docs/Web/API/MediaCapabilities/decodingInfo\n * @param {MediaDecodingConfiguration} info\n * @returns {MediaCapabilitiesDecodingInfo}\n */\n static probeConfigSupported (info) {\n return Sniffer.probeConfigSupported(info)\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static install (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n if (!Player.plugins[name]) {\n Player.plugins[name] = descriptor\n }\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static use (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n Player.plugins[name] = descriptor\n }\n\n static defaultPreset = null;\n\n /**\n * @description 自定义media构造函数\n */\n static XgVideoProxy = null;\n}\n\nexport {\n Player as default,\n Plugin,\n BasePlugin,\n Events,\n Errors,\n Sniffer,\n Util,\n STATE_CLASS,\n I18N\n}\n","import BasePlugin, { Events, Util } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nfunction now () {\n return new Date().getTime()\n}\n\nconst LOG_TYPES = {\n LOAD_START: 'loadstart',\n LOADED_DATA: 'loadeddata',\n FIRST_FRAME: 'firstFrame',\n WAIT_START: 'waitingStart',\n WAIT_END: 'waitingEnd',\n SEEK_START: 'seekStart',\n SEEK_END: 'seekEnd'\n}\nclass XGLogger extends BasePlugin {\n static get pluginName () {\n return 'xgLogger'\n }\n\n static get defaultConfig () {\n return {\n waitTimeout: 10000\n }\n }\n\n afterCreate () {\n this._onReset()\n this._waitType = 'firstFrame'\n\n this._initOnceEvents()\n\n this.newPointTime = now()\n // 初始化到首帧耗时 new -> loadeddata\n this.loadedCostTime = 0\n // 初始化到开始请求耗时 new -> loadstart\n this.startCostTime = 0\n\n this.on(Events.LOAD_START, () => {\n const { _state } = this\n const { autoplayStart, isFFSend } = _state\n this.startCostTime = now() - this.newPointTime\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOAD_START`, `autoplayStart:${autoplayStart} isFFSend:${isFFSend} startCostTime:${this.startCostTime} newPointTime${this.newPointTime}`)\n if (isFFSend) {\n return\n }\n !_state.isLs && this.emitLog(LOG_TYPES.LOAD_START, {})\n _state.isLs = true\n _state.isTimeUpdate = false\n _state.isFFLoading = true\n this.pt = now()\n this.vt = 0\n this.fvt = 0 // 首帧耗时 loadstart -> loadeddata\n this._initOnceEvents()\n this._onWaitingLoadStart()\n })\n\n this.on(Events.LOADED_DATA, () => {\n this.vt = now()\n this.fvt = this.vt - this.pt\n this.loadedCostTime = this.vt - this.newPointTime\n const { isTimeUpdate, isFFSend, autoplayStart } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOADED_DATA`, `fvt:${this.fvt} isTimeUpdate:${this._state.isTimeUpdate} loadedCostTime:${this.loadedCostTime}`)\n if (isTimeUpdate || autoplayStart) {\n this._sendFF('loadedData')\n }\n if (!isFFSend) {\n this.emitLog(LOG_TYPES.LOADED_DATA, {})\n }\n this.suspendWaitingStatus('loadeddata')\n })\n\n this.on(Events.SEEKING, this._onSeeking)\n this.on(Events.SEEKED, this._onSeeked)\n\n this.on(Events.DESTROY, () => {\n this.endState('destroy')\n })\n\n this.on(Events.URL_CHANGE, () => {\n this.endState('urlChange')\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} URL_CHANGE`)\n this._state.isFFSend && this._onReset()\n })\n\n this.on([Events.PLAYING, Events.CANPLAY], this._onPlaying)\n\n this.on(Events.WAITING, this._onWaiting)\n this.on(Events.ERROR, this._onError)\n this.on(Events.RESET, () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} RESET`)\n this.endState('reset')\n this._initOnceEvents()\n this._onReset()\n })\n }\n\n _initOnceEvents () {\n this.off(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.off(Events.TIME_UPDATE, this._onTimeupdate)\n this.once(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.once(Events.TIME_UPDATE, this._onTimeupdate)\n }\n\n _sendFF (endType) {\n this.s = now()\n const { isFFLoading, isFFSend } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _sendFF`, `${endType} fvt:${this.fvt} isFFLoading:${isFFLoading} !isFFSend:${!isFFSend}`)\n if (this.vt > 0 && isFFLoading && !isFFSend) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} emitLog_firstFrame`, endType)\n this._state.isFFLoading = false\n this._state.isFFSend = true\n this.emitLog(LOG_TYPES.FIRST_FRAME, { fvt: this.fvt, costTime: this.fvt, vt: this.vt, startCostTime: this.startCostTime, loadedCostTime: this.loadedCostTime })\n }\n }\n\n _onTimeupdate = () => {\n this._state.isTimeUpdate = true\n if (this._state.autoplayStart) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onTimeupdate`)\n this._sendFF('onTimeupdate')\n }\n }\n\n _onAutoplayStart = () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onAutoplayStart`)\n this._state.autoplayStart = true\n this.vt && this._sendFF('onAutoplayStart')\n }\n\n _onReset = () => {\n this._state = {\n autoplayStart: false, // 是否已经自动起播\n isFFLoading: false, // LOAD_START是否已经触发\n isTimeUpdate: false, // 第一次timeupdate是否已经触发\n isFFSend: false, // 首帧事件是否已经触发\n isLs: false // loadstart是否已经发送\n }\n this.vt = 0\n this.pt = 0\n this.fvt = 0\n this.newPointTime = now()\n this.loadedCostTime = 0\n this.startCostTime = 0\n this._isSeeking = false\n this.seekingStart = 0\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this._isWaiting = false\n this._waitTimer && Util.clearTimeout(this, this._waitTimer)\n this._waittTimer && Util.clearTimeout(this, this._waittTimer)\n this._waitTimer = null\n this._waittTimer = null\n this._waitType = 0 // 0 - 普通卡顿 1-起播卡顿 2-seek卡顿\n }\n\n _onSeeking = () => {\n if (this.seekingStart) {\n return\n }\n this.suspendWaitingStatus('seek')\n this.seekingStart = now()\n this.emitLog(LOG_TYPES.SEEK_START, { start: now() })\n }\n\n _onSeeked = () => {\n this.suspendSeekingStatus('seeked')\n }\n\n _onWaitingLoadStart = () => {\n if (this._isWaiting || this.vt) {\n return\n }\n this._isWaiting = true\n this.waitingStart = now()\n this.fixedWaitingStart = now()\n this._waitType = 1\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, start: this.waitingStart, type: 1, endType: 'loadstart' })\n }\n\n _onWaiting = () => {\n // 普通卡顿起播之前不产生\n if (this._isWaiting || !this.vt) {\n return\n }\n // 卡顿标记开始\n this._isWaiting = true\n if (!this.vt) {\n this._waitType = 1\n } else if (this.seekingStart) {\n this._waitType = 2\n } else {\n this._waitType = 0\n }\n // 原始卡顿耗时起始时间\n this.fixedWaitingStart = now()\n this._waitTimer = Util.setTimeout(this, () => {\n if (this._isWaiting) {\n this.waitingStart = now()\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n this._startWaitTimeout()\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, start: this.waitingStart, type: this._waitType, endType: this._waitType === 2 ? 'seek' : 'playing' })\n }\n }, 200)\n }\n\n _onError = () => {\n this.suspendSeekingStatus('error')\n this.suspendWaitingStatus('error')\n }\n\n _startWaitTimeout () {\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n }\n this._waittTimer = Util.setTimeout(this, () => {\n this.suspendWaitingStatus('timeout')\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }, this.config.waitTimeout)\n }\n\n _onPlaying = () => {\n this._isWaiting && this.suspendWaitingStatus('playing')\n }\n\n endState (endType) {\n this.suspendWaitingStatus(endType)\n this.suspendSeekingStatus(endType)\n }\n\n suspendSeekingStatus (endType) {\n if (!this.seekingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.seekingStart\n this.seekingStart = 0\n this.emitLog(LOG_TYPES.SEEK_END, { end: _now, costTime: _cost, endType })\n }\n\n suspendWaitingStatus (endType) {\n if (this._waitTimer) {\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n }\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }\n this._isWaiting = false\n if (!this.waitingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.waitingStart\n const _fixedCost = _now - this.fixedWaitingStart\n const { waitTimeout } = this.config\n this._isWaiting = false\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this.emitLog(LOG_TYPES.WAIT_END, {\n fixedCostTime: _fixedCost > waitTimeout ? waitTimeout : _fixedCost,\n costTime: _cost > waitTimeout ? waitTimeout : _cost,\n type: endType === 'loadeddata' ? 1 : this._waitType,\n endType: this._waitType === 2 ? 'seek' : endType\n })\n }\n\n emitLog (eventType, data) {\n const { player } = this\n this.emit(Events.XGLOG, {\n t: now(),\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype,\n eventType,\n currentTime: this.player.currentTime,\n readyState: player.video.readyState,\n networkState: player.video.networkState,\n ...data\n })\n }\n}\nexport {\n LOG_TYPES,\n XGLogger as default\n}\n","import Plugin, { Events, Util } from '../../plugin'\nimport ReplaySvg from '../assets/replay.svg'\nimport './index.scss'\n\nclass Replay extends Plugin {\n static get pluginName () {\n return 'replay'\n }\n\n static get defaultConfig () {\n return {\n disable: false\n }\n }\n\n registerIcons () {\n return {\n replay: ReplaySvg\n }\n }\n\n afterCreate () {\n Plugin.insert(this.icons.replay, this.root, 0)\n this.__handleReplay = this.hook('replayClick', () => {\n this.player.replay()\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.bind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n // this.bind('svg', ['click', 'touchend'], this.__handleReplay)\n // this.bind('.xgplayer-replay-txt', ['click', 'touchend'], this.__handleReplay)\n\n this.on(Events.ENDED, () => {\n if (!this.playerConfig.loop) {\n Util.addClass(this.player.root, 'replay')\n }\n if (this.config.disable) {\n return\n }\n this.show()\n const path = this.root.querySelector('path')\n if (path) {\n const transform = window.getComputedStyle(path).getPropertyValue('transform')\n if (typeof transform === 'string' && transform.indexOf('none') > -1) {\n return null\n } else {\n path.setAttribute('transform', transform)\n }\n }\n })\n\n this.on(Events.PLAY, () => {\n this.hide()\n })\n }\n\n handleReplay (e) {\n e.preventDefault()\n e.stopPropagation()\n this.player.replay()\n Util.removeClass(this.player.root, 'replay')\n }\n\n show () {\n if (this.config.disable) {\n return\n }\n this.root.style.display = 'flex'\n }\n\n enable () {\n this.config.disable = false\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n this.unbind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n }\n\n render () {\n return `<xg-replay class=\"xgplayer-replay\">\n <xg-replay-txt class=\"xgplayer-replay-txt\" lang-key=\"${this.i18nKeys.REPLAY}\">${this.i18n.REPLAY}</xg-replay-txt>\n </xg-replay>`\n }\n}\nexport default Replay\n","import Plugin, { Events, Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * isEndedShow?: boolean, // 是否在播放结束之后显示\n * hideCanplay?: boolean, // cnaplay 时间大于1的时候才隐藏\n * poster?: string // 封面图地址\n * }} IPosterConfig\n */\nclass Poster extends Plugin {\n static get pluginName () {\n return 'poster'\n }\n\n /**\n * @type IPosterConfig\n */\n static get defaultConfig () {\n return {\n isEndedShow: true, // 是否在播放结束之后显示\n hideCanplay: false, // cnaplay 时间大于1的时候才隐藏\n poster: '' // 封面图地址\n }\n }\n\n set isEndedShow (value) {\n this.config.isEndedShow = value\n }\n\n get isEndedShow () {\n return this.config.isEndedShow\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n show () {\n Util.removeClass(this.root, 'hide')\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.poster === 'string') {\n args.config.poster = args.player.config.poster\n }\n }\n\n afterCreate () {\n this.on(Events.ENDED, () => {\n if (this.isEndedShow) {\n Util.removeClass(this.root, 'hide')\n }\n })\n\n if (this.config.hideCanplay) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n this.on(Events.URL_CHANGE, () => {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'xg-showplay')\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n })\n } else {\n this.on(Events.PLAY, () => {\n Util.addClass(this.root, 'hide')\n })\n }\n }\n\n onTimeUpdate () {\n if (!this.player.currentTime) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n } else {\n Util.removeClass(this.root, 'xg-showplay')\n }\n }\n\n update (poster) {\n if (!poster) {\n return\n }\n this.config.poster = poster\n this.root.style.backgroundImage = `url(${poster})`\n }\n\n render () {\n const { poster, hideCanplay } = this.config\n const style = poster ? `background-image:url(${poster});` : ''\n return `<xg-poster class=\"xgplayer-poster ${hideCanplay ? 'xg-showplay' : ''}\" style=\"${style}\">\n </xg-poster>`\n }\n}\n\nexport default Poster\n","import Plugin, { Util, Events, STATES } from '../../plugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * isShowPause?: boolean, // 暂停是否常驻\n * isShowEnd?: boolean, // 播放结束常驻\n * disableAnimate?: boolean, // 禁用点击动画\n * mode?: 'hide' | 'show' | 'auto' // 控制模式: hide 常驻: show 跟随:auto\n * [propName: string]: any\n * }} IStartConfig\n */\n\nconst AnimateMap = {}\nfunction addAnimate (key, seconds, callback = { start: null, end: null }) {\n if (AnimateMap[key]) {\n window.clearTimeout(AnimateMap[key].id)\n }\n AnimateMap[key] = {}\n callback.start && callback.start()\n AnimateMap[key].id = window.setTimeout(() => {\n callback.end && callback.end()\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n }, seconds)\n}\n\nfunction clearAnimation () {\n Object.keys(AnimateMap).map(key => {\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n })\n}\n\nclass Start extends Plugin {\n static get pluginName () {\n return 'start'\n }\n\n /**\n * @type IStartConfig\n */\n static get defaultConfig () {\n return {\n isShowPause: false, // 暂停是否常驻\n isShowEnd: false, // 播放结束常驻\n disableAnimate: false, // 禁用点击动画\n mode: 'hide' // 控制模式: hide 常驻: show 跟随:auto\n }\n }\n\n constructor (args) {\n super(args)\n this.autoPlayStart = false\n }\n\n afterCreate () {\n const { player, playerConfig } = this\n\n this.initIcons()\n this.once(Events.READY, () => {\n if (playerConfig) {\n if (playerConfig.lang && playerConfig.lang === 'en') {\n Util.addClass(player.root, 'lang-is-en')\n } else if (playerConfig.lang === 'jp') {\n Util.addClass(player.root, 'lang-is-jp')\n }\n }\n })\n\n this.on(Events.AUTOPLAY_STARTED, this.onAutoplayStart)\n\n if (!playerConfig.autoplay) {\n this.show()\n }\n\n this.on(Events.AUTOPLAY_PREVENTED, () => {\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n })\n\n this.on(Events.PLAY, () => {\n this.onPlayPause('play')\n })\n\n this.on(Events.PAUSE, () => {\n this.onPlayPause('pause')\n })\n\n this.on(Events.RESET, () => {\n this.onPlayerReset()\n })\n\n this.clickHandler = this.hook('startClick', this.switchPausePlay, {\n pre: (e) => {\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n const { paused } = this.player\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: paused, to: !paused })\n }\n })\n\n this.bind(['click', 'touchend'], this.clickHandler)\n }\n\n onPlayerReset = () => {\n this.autoPlayStart = false\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n }\n\n onAutoplayStart = () => {\n if (this.autoPlayStart) {\n return\n }\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n Util.addClass(this.root, className)\n this.autoPlayStart = true\n this.onPlayPause('play')\n }\n\n registerIcons () {\n return {\n startPlay: { icon: PlaySvg, class: 'xg-icon-play' },\n startPause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('xg-start-inner', icons.startPlay)\n this.appendChild('xg-start-inner', icons.startPause)\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n show () {\n Util.removeClass(this.root, 'hide')\n }\n\n focusHide () {\n Util.addClass(this.root, 'focus-hide')\n }\n\n recover () {\n Util.removeClass(this.root, 'focus-hide')\n }\n\n switchStatus (isAnimate) {\n if (isAnimate) {\n this.setAttr('data-state', !this.player.paused ? 'play' : 'pause')\n } else {\n this.setAttr('data-state', this.player.paused ? 'play' : 'pause')\n }\n }\n\n animate (endShow) {\n addAnimate('pauseplay', 400, {\n start: () => {\n Util.addClass(this.root, 'interact')\n this.show()\n this.switchStatus(true)\n },\n end: () => {\n Util.removeClass(this.root, 'interact')\n !endShow && this.hide()\n }\n })\n }\n\n switchPausePlay (e) {\n const { player } = this\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n if (player.state < STATES.READY) {\n return\n }\n const paused = this.player.paused\n if (!paused && player.state === STATES.RUNNING) {\n player.pause()\n } else {\n player.play()\n }\n }\n\n onPlayPause (status) {\n const { config, player } = this\n if (player.state < STATES.RUNNING || !this.autoPlayStart) {\n return\n }\n // 一直显示\n if (config.mode === 'show') {\n this.switchStatus()\n this.show()\n return\n }\n\n // 跟随播放器的focus状态显示和隐藏\n if (config.mode === 'auto') {\n this.switchStatus()\n return\n }\n // 暂停/播放结束状态强制显示\n if ((config.isShowPause && player.paused && !player.ended) || (config.isShowEnd && player.ended)) {\n this.switchStatus()\n this.show()\n return\n }\n\n if (config.disableAnimate) {\n this.switchStatus()\n this.hide()\n return\n }\n\n if (status === 'play') {\n this.autoPlayStart ? this.animate() : this.hide()\n } else {\n if (!this.autoPlayStart || player.ended) {\n return\n }\n this.animate()\n }\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.clickHandler)\n clearAnimation()\n }\n\n render () {\n const className = this.playerConfig.autoplay ? (this.config.mode === 'auto' ? 'auto-hide' : 'hide') : ''\n return `\n <xg-start class=\"xgplayer-start ${className}\">\n <xg-start-inner></xg-start-inner>\n </xg-start>`\n }\n}\n\nexport default Start\n","import Plugin, { Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef { {\n * innerHtml?: string,\n * [propName: string]: any\n * } } IEnterConfig\n */\n\nclass Enter extends Plugin {\n static get pluginName () {\n return 'enter'\n }\n\n /**\n * @type IEnterConfig\n */\n static get defaultConfig () {\n return {\n innerHtml: '',\n logo: ''\n }\n }\n\n render () {\n const { innerHtml } = this.config\n const root = Util.createDom('xg-enter', '', {}, 'xgplayer-enter')\n\n if (innerHtml && innerHtml instanceof window.HTMLElement) {\n root.appendChild(innerHtml)\n } else if (innerHtml && typeof innerHtml === 'string') {\n root.innerHTML = innerHtml\n } else {\n let barStr = ''\n for (let i = 1; i <= 12; i++) {\n barStr += `<div class=\"xgplayer-enter-bar${i}\"></div>`\n }\n root.innerHTML = `<div class=\"xgplayer-enter-spinner\">${barStr}</div>`\n }\n return root\n }\n}\n\nexport default Enter\n","export function xgIconTips (plugin, textKey, isShow) {\n try {\n return ` <div class=\"xg-tips ${isShow ? 'hide' : ' '}\" lang-key=\"${plugin.i18nKeys[textKey]}\">\n ${plugin.i18n[textKey]}\n </div>`\n } catch (e) {\n return '<div class=\"xg-tips hide\"></div>'\n }\n}","import Plugin, { POSITIONS } from '../../plugin'\n\nclass MiniScreenIcon extends Plugin {\n static get pluginName () {\n return 'miniscreenIcon'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 10\n }\n }\n\n afterCreate () {\n this.getMini = this.getMini.bind(this)\n this.exitMini = this.exitMini.bind(this)\n this.bind('click', this.getMini)\n }\n\n getMini () {\n this.config.onClick && this.config.onClick()\n }\n\n exitMini () {\n this.config.onClick && this.config.onClick()\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.getMini)\n }\n\n render () {\n const langKey = 'MINISCREEN'\n return `\n <xg-icon class=\"xgplayer-miniicon\">\n <div class=\"xgplayer-icon btn-text\"><span class=\"icon-text\" lang-key=\"${this.i18nKeys[langKey]}\">${this.i18n[langKey]}</span></div>\n </xg-icon>`\n }\n}\n\nexport default MiniScreenIcon\n","import EventEmitter from 'eventemitter3'\n\nfunction getStyleSize (value) {\n const num = parseFloat(value)\n // not a percent like '100%', and a number\n const isValid = value.indexOf('%') === -1 && !Number.isNaN(num)\n return isValid && num\n}\n\nconst measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n]\n\nconst measurementsLength = measurements.length\n\nfunction getZeroSize () {\n const size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n }\n for (let i = 0; i < measurementsLength; i++) {\n const measurement = measurements[i]\n size[measurement] = 0\n }\n return size\n}\n\nfunction getStyle (elem) {\n const style = window.getComputedStyle(elem)\n // if ( !style ) {\n // logError( 'Style returned ' + style +\n // '. Are you running this code in a hidden iframe on Firefox? ' +\n // 'See http://bit.ly/getsizebug1' );\n // }\n return style\n}\n\nfunction getSize (elem) {\n // use querySeletor if elem is string\n if (typeof elem === 'string') {\n elem = document.querySelector(elem)\n }\n\n // do not proceed on non-objects\n if (!elem || typeof elem !== 'object' || !elem.nodeType) {\n return\n }\n\n const style = getStyle(elem)\n\n // if hidden, everything is 0\n if (style.display === 'none') {\n return getZeroSize()\n }\n\n const size = {}\n size.width = elem.offsetWidth\n size.height = elem.offsetHeight\n\n const isBorderBox = size.isBorderBox = style.boxSizing === 'border-box'\n\n // get all measurements\n for (let i = 0; i < measurementsLength; i++) {\n const measurement = measurements[i]\n const value = style[measurement]\n const num = parseFloat(value)\n // any 'auto', 'medium' value will be 0\n size[measurement] = !Number.isNaN(num) ? num : 0\n }\n\n const paddingWidth = size.paddingLeft + size.paddingRight\n const paddingHeight = size.paddingTop + size.paddingBottom\n const marginWidth = size.marginLeft + size.marginRight\n const marginHeight = size.marginTop + size.marginBottom\n const borderWidth = size.borderLeftWidth + size.borderRightWidth\n const borderHeight = size.borderTopWidth + size.borderBottomWidth\n\n const isBorderBoxSizeOuter = isBorderBox// isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n const styleWidth = getStyleSize(style.width)\n if (styleWidth !== false) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n (isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth)\n }\n\n const styleHeight = getStyleSize(style.height)\n if (styleHeight !== false) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n (isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight)\n }\n\n size.innerWidth = size.width - (paddingWidth + borderWidth)\n size.innerHeight = size.height - (paddingHeight + borderHeight)\n\n size.outerWidth = size.width + marginWidth\n size.outerHeight = size.height + marginHeight\n\n return size\n}\n\nfunction getTouch (touches, dentifier) {\n for (let i = 0; i < touches.length; i++) {\n const touch = touches[i]\n if (touch.identifier === dentifier) {\n return touch\n }\n }\n}\n\nconst EVENTS = {\n START: 'dragStart',\n MOVE: 'dragMove',\n ENDED: 'dragEnded'\n}\n\nconst POST_START_EVENTS = {\n mousedown: ['mousemove', 'mouseup'],\n touchstart: ['touchmove', 'touchend', 'touchcancel'],\n pointerdown: ['pointermove', 'pointerup', 'pointercancel']\n}\n\nexport default class Draggabilly extends EventEmitter {\n constructor (root, options = {}) {\n super()\n this.isEnabled = true\n this.isDragging = false\n this.isDown = false\n this.position = {}\n this.downPoint = {}\n this.dragPoint = { x: 0, y: 0 }\n this.startPos = { x: 0, y: 0 }\n // eslint-disable-next-line no-undef\n this._root = root instanceof Element ? root : document.querySelector(root)\n // eslint-disable-next-line no-undef\n this._handlerDom = options.handle instanceof Element ? options.handle : document.querySelector(options.handle)\n if (!this._root || !this._handlerDom) {\n return\n }\n // ['onDown', 'onUp', 'onMove', 'onCancel', 'onDocUp'].map(key => {\n // this[key] = this[key].bind(this)\n // })\n\n // if ('ontouchstart' in window) {\n // this._handlerKeys = TOUCH_HANDLERS\n // this._startKey = 'touchstart'\n // this._endKey = 'touchend'\n // } else {\n // this._handlerKeys = HANDLERS\n // this._startKey = 'mousedown'\n // this._endKey = 'mouseup'\n // }\n // this._handlerDom.addEventListener(this._startKey, this.onDown)\n this._bindStartEvent()\n }\n\n _bindStartEvent () {\n if ('ontouchstart' in window) {\n this._startKey = 'touchstart'\n } else {\n this._startKey = 'mousedown'\n }\n this[`on${this._startKey}`] = this[`on${this._startKey}`].bind(this)\n this._handlerDom.addEventListener(this._startKey, this[`on${this._startKey}`])\n POST_START_EVENTS[this._startKey].map(key => {\n this[`on${key}`] = this[`on${key}`].bind(this)\n })\n }\n\n _unbindStartEvent () {\n this._handlerDom.removeEventListener(this._startKey, this[`on${this._startKey}`])\n }\n\n _bindPostStartEvents (event) {\n if (!event) {\n return\n }\n const events = POST_START_EVENTS[this._startKey]\n // bind events to node\n events.map(eventName => {\n window.addEventListener(eventName, this[`on${eventName}`])\n })\n // save these arguments\n this._boundPointerEvents = events\n }\n\n _unbindPostStartEvents () {\n if (!this._boundPointerEvents) {\n return\n }\n this._boundPointerEvents.map(eventName => {\n // console.log('eventName', eventName, this[`on${eventName}`])\n window.removeEventListener(eventName, this[`on${eventName}`])\n })\n\n delete this._boundPointerEvents\n }\n\n enable () {\n this.isEnabled = true\n }\n\n disable () {\n this.isEnabled = false\n if (this.isDragging) {\n this.onUp()\n }\n }\n\n onDocUp (e) {\n this.onUp()\n }\n\n animate () {\n // only render and animate if dragging\n if (!this.isDragging) {\n return\n }\n\n this.positionDrag()\n\n window.requestAnimationFrame(() => {\n this.animate()\n })\n }\n\n positionDrag () {\n // this._root.style.transform = 'translate3d( ' + this.dragPoint.x +\n // 'px, ' + this.dragPoint.y + 'px, 0)';\n const transform = `translate3d(${this.dragPoint.x}px, ${this.dragPoint.y}px, 0)`\n this._root.style.transform = transform\n this._root.style.webKitTransform = transform\n }\n\n setLeftTop () {\n this._root.style.left = this.position.x + 'px'\n this._root.style.top = this.position.y + 'px'\n }\n\n onmousedown (e) {\n this.dragStart(e, e)\n }\n\n onmousemove (e) {\n this.dragMove(e, e)\n }\n\n onmouseup (e) {\n this.dragEnd(e, e)\n }\n\n ontouchstart (e) {\n const touch = e.changedTouches[0]\n this.dragStart(e, touch)\n this.touchIdentifier = touch.pointerId !== undefined\n ? touch.pointerId\n : touch.identifier\n e.preventDefault()\n }\n\n ontouchmove (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragMove(e, touch)\n }\n }\n\n ontouchend (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragEnd(e, touch)\n }\n e.preventDefault()\n }\n\n ontouchcancel (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragCancel(e, touch)\n }\n }\n\n dragStart (e, pointer) {\n if (!this._root || this.isDown || !this.isEnabled) {\n return\n }\n this.downPoint = pointer\n this.dragPoint.x = 0\n this.dragPoint.y = 0\n\n this._getPosition()\n\n const size = getSize(this._root)\n\n this.startPos.x = this.position.x\n this.startPos.y = this.position.y\n this.startPos.maxY = window.innerHeight - size.height\n this.startPos.maxX = window.innerWidth - size.width\n this.setLeftTop()\n\n this.isDown = true\n this._bindPostStartEvents(e)\n }\n\n dragRealStart (e, pointer) {\n this.isDragging = true\n this.animate()\n this.emit(EVENTS.START, this.startPos)\n }\n\n dragEnd (e, pointer) {\n if (!this._root) {\n return\n }\n this._unbindPostStartEvents()\n if (this.isDragging) {\n this._root.style.transform = ''\n this.setLeftTop()\n this.emit(EVENTS.ENDED)\n }\n this.presetInfo()\n }\n\n _dragPointerMove (e, pointer) {\n const moveVector = {\n x: pointer.pageX - this.downPoint.pageX,\n y: pointer.pageY - this.downPoint.pageY\n }\n // 检测是否有移动\n if (!this.isDragging && this.hasDragStarted(moveVector)) {\n this.dragRealStart(e, pointer)\n }\n return moveVector\n }\n\n dragMove (e, pointer) {\n e = e || window.event\n if (!this.isDown) {\n return\n }\n const { x, y } = this.startPos\n const moveVector = this._dragPointerMove(e, pointer)\n let dragX = moveVector.x\n let dragY = moveVector.y\n dragX = this.checkContain('x', dragX, x)\n dragY = this.checkContain('y', dragY, y)\n this.position.x = x + dragX\n this.position.y = y + dragY\n this.dragPoint.x = dragX\n this.dragPoint.y = dragY\n this.emit(EVENTS.MOVE, this.position)\n }\n\n dragCancel (e, pointer) {\n this.dragEnd(e, pointer)\n }\n\n presetInfo () {\n this.isDragging = false\n this.startPos = {\n x: 0,\n y: 0\n }\n this.dragPoint = {\n x: 0,\n y: 0\n }\n this.isDown = false\n }\n\n destroy () {\n this._unbindStartEvent()\n this._unbindPostStartEvents()\n if (this.isDragging) {\n this.dragEnd()\n }\n this.removeAllListeners()\n this._handlerDom = null\n }\n\n hasDragStarted (moveVector) {\n return Math.abs(moveVector.x) > 3 || Math.abs(moveVector.y) > 3\n }\n\n checkContain (axis, drag, grid) {\n if (drag + grid < 0) {\n return 0 - grid\n }\n\n if (axis === 'x' && drag + grid > this.startPos.maxX) {\n return this.startPos.maxX - grid\n }\n if (axis === 'y' && drag + grid > this.startPos.maxY) {\n return this.startPos.maxY - grid\n }\n return drag\n }\n\n _getPosition () {\n const style = window.getComputedStyle(this._root)\n const x = this._getPositionCoord(style.left, 'width')\n const y = this._getPositionCoord(style.top, 'height')\n // clean up 'auto' or other non-integer values\n this.position.x = Number.isNaN(x) ? 0 : x\n this.position.y = Number.isNaN(y) ? 0 : y\n\n this._addTransformPosition(style)\n }\n\n _addTransformPosition (style) {\n const transform = style.transform\n // bail out if value is 'none'\n if (transform.indexOf('matrix') !== 0) {\n return\n }\n // split matrix(1, 0, 0, 1, x, y)\n const matrixValues = transform.split(',')\n // translate X value is in 12th or 4th position\n const xIndex = transform.indexOf('matrix3d') === 0 ? 12 : 4\n const translateX = parseInt(matrixValues[xIndex], 10)\n // translate Y value is in 13th or 5th position\n const translateY = parseInt(matrixValues[xIndex + 1], 10)\n this.position.x += translateX\n this.position.y += translateY\n }\n\n _getPositionCoord (styleSide, measure) {\n if (styleSide.indexOf('%') !== -1) {\n // convert percent into pixel for Safari, #75\n const parentSize = getSize(this._root.parentNode)\n // prevent not-in-DOM element throwing bug, #131\n return !parentSize\n ? 0\n : (parseFloat(styleSide) / 100) * parentSize[measure]\n }\n return parseInt(styleSide, 10)\n }\n}\n","import Plugin, { Util, Events } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport PlayIcon from '../assets/play.svg'\nimport PauseIcon from '../assets/pause.svg'\nimport MiniScreenIcon from './miniScreenIcon'\nimport Draggabilly from '../../utils/draggabilly'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disable?: boolean,\n * width?: number,\n * height?: number,\n * left?: number, // 默认左下角\n * top?: number, // 默认左下角\n * isShowIcon?: boolean, // 是否显示icon\n * isScrollSwitch?: boolean, // 滚动自动切换自动切换\n * scrollTop?: number, // 触发滚动的高度\n * disableDrag?: boolean, // 禁用拖拽\n * [propName: string]: any\n * }} IMiniScreenConfig\n */\nclass MiniScreen extends Plugin {\n static get pluginName () {\n return 'miniscreen'\n }\n\n /**\n * @type IMiniScreenConfig\n */\n static get defaultConfig () {\n return {\n index: 10,\n disable: false,\n width: 320,\n height: 180,\n left: -1, // Default bottom left corner\n top: -1, // Default bottom left corner\n isShowIcon: false, // Whether to show icon\n isScrollSwitch: false,\n scrollTop: 0, // Height to trigger scroll\n disableDrag: false // Disable drag and drop\n }\n }\n\n constructor (args) {\n super(args)\n this.isMini = false\n this.isClose = false\n const { config } = this\n this.pos = {\n left: config.left < 0 ? window.innerWidth - config.width - 20 : config.left,\n top: config.top < 0 ? window.innerHeight - config.height - 20 : config.top,\n height: this.config.height,\n width: this.config.width,\n scrollY: window.scrollY || 0\n }\n this.lastStyle = null\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.mini === 'boolean') {\n args.config.isShowIcon = args.player.config.mini\n }\n }\n\n afterCreate () {\n this.initIcons()\n this.on(Events.PAUSE, () => {\n this.setAttr('data-state', 'pause')\n })\n this.on(Events.PLAY, () => {\n this.setAttr('data-state', 'play')\n })\n }\n\n onPluginsReady () {\n const { player, config } = this\n if (config.disable) {\n return\n }\n if (this.config.isShowIcon) {\n const options = {\n config: {\n onClick: () => {\n this.getMini()\n }\n }\n }\n player.controls.registerPlugin(MiniScreenIcon, options, MiniScreenIcon.pluginName)\n }\n const eventName = Util.checkTouchSupport() ? 'touchend' : 'click'\n this.bind('.mini-cancel-btn', eventName, this.onCancelClick)\n this.bind('.play-icon', eventName, this.onCenterClick)\n if (!this.config.disableDrag) {\n this._draggabilly = new Draggabilly(this.player.root, {\n handle: this.root\n })\n }\n if (this.config.isScrollSwitch) {\n window.addEventListener('scroll', this.onScroll)\n }\n }\n\n registerIcons () {\n return {\n play: { icon: PlayIcon, class: 'xg-icon-play' },\n pause: { icon: PauseIcon, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.play-icon', icons.play)\n this.appendChild('.play-icon', icons.pause)\n }\n\n onCancelClick = (e) => {\n // e.preventDefault()\n // e.stopPropagation()\n this.exitMini()\n this.isClose = true\n }\n\n onCenterClick = (e) => {\n const { player } = this\n player.paused ? player.play() : player.pause()\n }\n\n onScroll = (e) => {\n if ((!window.scrollY && window.scrollY !== 0) || Math.abs(window.scrollY - this.pos.scrollY) < 50) {\n return\n }\n let scrollHeight = parseInt(Util.getCss(this.player.root, 'height'))\n scrollHeight += this.config.scrollTop\n this.pos.scrollY = window.scrollY\n if (window.scrollY > scrollHeight + 5) {\n !this.isMini && !this.isClose && this.getMini()\n } else if (window.scrollY <= scrollHeight) {\n this.isMini && this.exitMini()\n this.isClose = false\n }\n }\n\n getMini () {\n if (this.isMini) {\n return\n }\n const { player, playerConfig } = this\n const target = this.config.target || this.player.root\n this.lastStyle = {}\n Util.addClass(player.root, 'xgplayer-mini');\n ['width', 'height', 'top', 'left'].map(key => {\n this.lastStyle[key] = target.style[key]\n target.style[key] = `${this.pos[key]}px`\n })\n if (playerConfig.fluid) {\n target.style['padding-top'] = ''\n }\n this.emit(Events.MINI_STATE_CHANGE, true)\n player.isMini = this.isMini = true\n }\n\n exitMini () {\n if (!this.isMini) {\n return false\n }\n const { player, playerConfig } = this\n const target = this.config.target || this.player.root\n Util.removeClass(player.root, 'xgplayer-mini')\n if (this.lastStyle) {\n Object.keys(this.lastStyle).map(key => {\n target.style[key] = this.lastStyle[key]\n })\n }\n this.lastStyle = null\n if (playerConfig.fluid) {\n player.root.style.width = '100%'\n player.root.style.height = '0'\n player.root.style['padding-top'] = `${playerConfig.height * 100 / playerConfig.width}%`\n }\n this.emit(Events.MINI_STATE_CHANGE, false)\n this.isMini = player.isMini = false\n }\n\n destroy () {\n window.removeEventListener('scroll', this.onScroll)\n const eventName = Util.checkTouchSupport() ? 'touchend' : 'click'\n this.unbind('.mini-cancel-btn', eventName, this.onCancelClick)\n this.unbind('.play-icon', eventName, this.onCenterClick)\n this._draggabilly && this._draggabilly.destroy()\n this._draggabilly = null\n this.exitMini()\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n <xg-mini-layer class=\"xg-mini-layer\">\n <xg-mini-header class=\"xgplayer-mini-header\">\n ${xgIconTips(this, 'MINI_DRAG', this.playerConfig.isHideTips)}\n </xg-mini-header>\n <div class=\"mini-cancel-btn\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <path fill=\"#fff\" fill-rule=\"evenodd\" d=\"M3.99 3.49a1 1 0 0 1 1.414 0L10 8.085l4.596-4.595a1 1 0 1 1 1.414 1.414L11.414 9.5l4.596 4.596a1 1 0 0 1 .084 1.32l-.084.094a1 1 0 0 1-1.414 0L10 10.914 5.404 15.51a1 1 0 0 1-1.414-1.414L8.585 9.5 3.99 4.904a1 1 0 0 1-.084-1.32z\"></path>\n </svg>\n </div>\n <div class=\"play-icon\">\n </div>\n </xg-mini-layer>`\n }\n}\n\nexport {\n MiniScreen as default,\n MiniScreenIcon\n}\n","import { BasePlugin, Sniffer } from '../../plugin'\nimport { runHooks } from '../../plugin/hooksDescriptor'\nimport './index.scss'\n\nconst MOUSE_EVENTS = {\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousemove: 'onMouseMove'\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nexport default class PCPlugin extends BasePlugin {\n static get pluginName () {\n return 'pc'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n afterCreate () {\n this._clickCount = 0\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { isMobileSimulateMode } = this.playerConfig\n if (isMobileSimulateMode === 'mobile' || (Sniffer.device === 'mobile' && !Sniffer.os.isIpad)) {\n return\n }\n this.initEvents()\n }\n\n initEvents () {\n const { video, 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 && video && video.addEventListener('contextmenu', this.onContextmenu, false)\n }\n\n switchPlayPause (e) {\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: player.paused, to: !player.paused })\n if (!player.ended) {\n player.paused ? player.play() : player.pause()\n } else {\n player.duration !== Infinity && player.duration > 0 && player.replay()\n }\n }\n\n onMouseMove = (e) => {\n const { player, playerConfig } = this\n if (!player.isActive) {\n player.focus({ autoHide: !playerConfig.closeDelayBlur })\n !playerConfig.closeFocusVideoFocus && player.media.focus()\n }\n }\n\n onMouseEnter = (e) => {\n const { playerConfig, player } = this\n !playerConfig.closeFocusVideoFocus && player.media.focus()\n if (playerConfig.closeDelayBlur) {\n player.focus({ autoHide: false })\n } else {\n player.focus()\n }\n }\n\n onMouseLeave = (e) => {\n const { closePlayerBlur, leavePlayerTime, closeDelayBlur } = this.playerConfig\n if (!closePlayerBlur && !closeDelayBlur) {\n if (leavePlayerTime) {\n this.player.focus({ autoHide: true, delay: leavePlayerTime })\n } else {\n this.player.blur()\n }\n }\n }\n\n onContextmenu (e) {\n e = e || window.event\n if (e.preventDefault) {\n e.preventDefault()\n }\n if (e.stopPropagation) {\n e.stopPropagation()\n } else {\n e.returnValue = false // 解决IE8右键弹出\n e.cancelBubble = true\n }\n }\n\n onVideoClick = (e) => {\n const { player, playerConfig } = this\n if (e.target && playerConfig.closeVideoClick) {\n return\n }\n if (e.target === player.root || e.target === player.media || e.target === player.innerContainer || e.target === player.media.__canvas) {\n e.preventDefault()\n if (!playerConfig.closeVideoStopPropagation) {\n e.stopPropagation()\n }\n this._clickCount++\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n this.clickTimer = setTimeout(() => {\n if (!this._clickCount) {\n return\n }\n this._clickCount--\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.switchPlayPause(data.e)\n }, { e, paused: player.paused })\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }, 300)\n }\n }\n\n onVideoDblClick = (e) => {\n const { player, playerConfig } = this\n if (playerConfig.closeVideoDblclick || !e.target || (e.target !== player.media && e.target !== player.media.__canvas)) {\n return\n }\n if (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 preventToucheDefault (e) {\n const ua = navigator.userAgent;\n /(?:iPhone|iPad)/.test(ua) && e.cancelable && e.preventDefault()\n}\n\nfunction getDefaultConfig () {\n return {\n pressDelay: 600,\n dbClickDelay: 200,\n disablePress: false,\n disableDbClick: false,\n miniStep: 2,\n needPreventDefault: true\n }\n}\n\nclass Touche {\n constructor (dom, config = { eventType: 'touch' }) {\n this._pos = {\n moving: false,\n start: false,\n x: 0,\n y: 0\n }\n this.config = getDefaultConfig()\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n this.root = dom\n this.events = config.eventType === 'mouse' ? MOUSES : TOUCHS\n this.pressIntrvalId = null\n this.dbIntrvalId = null\n this.__handlers = {}\n this._initEvent()\n }\n\n _initEvent () {\n this.onTouchStart = this.onTouchStart.bind(this)\n this.onTouchMove = this.onTouchMove.bind(this)\n this.onTouchEnd = this.onTouchEnd.bind(this)\n this.onTouchCancel = this.onTouchCancel.bind(this)\n this.root.addEventListener(this.events.start, this.onTouchStart)\n }\n\n __setPress (e) {\n const { config } = this\n if (this.pressIntrvalId) {\n this.__clearPress()\n }\n this.pressIntrvalId = setTimeout(() => {\n this.trigger(EVENTS.PRESS, e)\n this._pos.press = true\n this.__clearPress()\n }, config.pressDelay)\n }\n\n __clearPress () {\n window.clearTimeout(this.pressIntrvalId)\n this.pressIntrvalId = null\n }\n\n __setDb (e) {\n const { config } = this\n if (this.dbIntrvalId) {\n this.__clearDb()\n this.trigger(EVENTS.DOUBlE_CLICK, e)\n return\n }\n this.dbIntrvalId = setTimeout(() => {\n this.__clearDb()\n if (!this._pos.start && !this._pos.press && !this._pos.moving) {\n this.trigger(EVENTS.CLICK, e)\n }\n }, config.dbClickDelay)\n }\n\n __clearDb () {\n clearTimeout(this.dbIntrvalId)\n this.dbIntrvalId = null\n }\n\n on (event, handler) {\n if (!this.__handlers[event]) {\n this.__handlers[event] = []\n }\n this.__handlers[event].push(handler)\n }\n\n off (event, handler) {\n if (!this.__handlers[event]) {\n return\n }\n const handlers = this.__handlers[event]\n let index = -1\n for (let i = 0; i < handlers.length; i++) {\n if (handlers[i] === handler) {\n index = i\n break\n }\n }\n if (index >= 0) {\n this.__handlers[event].splice(index, 1)\n }\n }\n\n trigger (event, e) {\n if (!this.__handlers[event]) {\n return\n }\n this.__handlers[event].map(handler => {\n try {\n handler(e)\n } catch (error) {\n console.error(`trigger>>:${event}`, error)\n }\n })\n }\n\n onTouchStart (e) {\n const { _pos, root, config } = this\n config.needPreventDefault && preventToucheDefault(e)\n const touch = getTouch(e.touches)\n _pos.x = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.y = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.start = true\n this.__setPress(e)\n root.addEventListener(this.events.end, this.onTouchEnd)\n root.addEventListener(this.events.cancel, this.onTouchCancel)\n root.addEventListener(this.events.move, this.onTouchMove)\n this.trigger(EVENTS.TOUCH_START, e)\n }\n\n onTouchCancel (e) {\n this.onTouchEnd(e)\n }\n\n onTouchEnd (e) {\n const { _pos, root, config } = this\n config.needPreventDefault && preventToucheDefault(e)\n this.__clearPress()\n root.removeEventListener(this.events.cancel, this.onTouchCancel)\n root.removeEventListener(this.events.end, this.onTouchEnd)\n root.removeEventListener(this.events.move, this.onTouchMove)\n e.moving = _pos.moving\n e.press = _pos.press\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n this.trigger(EVENTS.TOUCH_END, e)\n !_pos.press && !_pos.moving && this.__setDb(e)\n _pos.press = false\n _pos.start = false\n _pos.moving = false\n }\n\n onTouchMove (e) {\n const { _pos, config } = this\n const touch = getTouch(e.touches)\n const x = touch ? parseInt(touch.pageX, 10) : e.pageX\n const y = touch ? parseInt(touch.pageY, 10) : e.pageX\n const diffx = x - _pos.x\n const diffy = y - _pos.y\n if (Math.abs(diffy) < config.miniStep && Math.abs(diffx) < config.miniStep) {\n return\n }\n this.__clearPress()\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n _pos.press = false\n _pos.moving = true\n this.trigger(EVENTS.TOUCH_MOVE, e)\n }\n\n destroy () {\n const map = {\n touchend: 'onTouchEnd',\n touchmove: 'onTouchMove',\n touchstart: 'onTouchStart'\n }\n Object.keys(map).map(key => {\n this.root.removeEventListener('touchend', this[map[key]])\n })\n }\n}\n\nexport default Touche\n","import Plugin, { Events, Util, Sniffer, STATES } from '../../plugin'\nimport Touche from './touch'\nimport SeekTipIcon from '../assets/seekicon.svg'\nimport { runHooks } from '../../plugin/hooksDescriptor'\n// import BackSvg from './back.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disableGesture?: boolean,\n * gestureX?: boolean,\n * gestureY?: boolean,\n * gradient?: 'normal' | 'none' | 'top' | 'bottom',\n * isTouchingSeek?: boolean,\n * miniMoveStep?: number,\n * miniYPer?: number,\n * scopeL?: number,\n * scopeR?: number,\n * pressRate?: number,\n * darkness?: boolean,\n * maxDarkness?: number,\n * disableActive?: boolean,\n * disableTimeProgress?: boolean,\n * hideControlsActive?: boolean,\n * hideControlsEnd?: boolean,\n * moveDuration?: number,\n * closedbClick?: boolean,\n * disablePress?: boolean,\n * disableSeekIcon?: boolean,\n * focusVideoClick?: boolean,\n * [propName: string]: any\n * }} IMobileConfig\n */\n\nconst ACTIONS = {\n AUTO: 'auto',\n SEEKING: 'seeking',\n PLAYBACK: 'playbackrate',\n LIGHT: ''\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nclass MobilePlugin extends Plugin {\n static get pluginName () {\n return 'mobile'\n }\n\n /**\n * @type IMobileConfig & { [propName: string]: any}\n */\n static get defaultConfig () {\n return {\n index: 0,\n disableGesture: false, // Whether to disable gestures\n gestureX: true, // Whether to enable horizontal gestures\n gestureY: true, // Whether to enable vertical gestures\n gradient: 'normal', // Gradient shadow, 'none'/'top'/'bottom'\n isTouchingSeek: false, // Whether to update currentTime at the same time as touchMove\n miniMoveStep: 5, // Minimum moving distance, used for move throttling\n miniYPer: 5, // Percentage of minimum displacement in y direction\n scopeL: 0.25, // Gesture range on the left\n scopeR: 0.25, // Gesture range on the right\n scopeM: 0.9, // Middle gesture range\n pressRate: 2, // playbackRate when long press\n darkness: true, // Whether to enable the dimming function on the right\n maxDarkness: 0.8, // Maximum darkness,maximum transparency of the mask\n disableActive: false, // Whether to disable the time prompt\n disableTimeProgress: false, // Whether to disable the time progress bar\n hideControlsActive: false, // Whether to hide the control bar when dragging by gesture\n hideControlsEnd: false, // Whether to hide the control bar when the gesture ended\n moveDuration: 60 * 6 * 1000, // The duration corresponding to the dragging width of the player\n closedbClick: false, // Whether to turn off the double tap gesture\n disablePress: true, // Whether to turn off the long press gesture\n disableSeekIcon: false, // Disable seek prompt\n focusVideoClick: false // Click on force toggle to pause/play\n }\n }\n\n constructor (options) {\n super(options)\n /**\n * @readonly\n */\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n time: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1\n }\n /**\n * @private\n */\n this.timer = null\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n /**\n * @private\n * @returns {[propName: string]: any}\n */\n registerIcons () {\n return {\n seekTipIcon: { icon: SeekTipIcon, class: 'xg-seek-pre' }\n }\n }\n\n afterCreate () {\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { playerConfig, config, player } = this\n if (playerConfig.closeVideoDblclick === true) {\n config.closedbClick = true\n }\n this.resetPos()\n if (!Util.isUndefined(playerConfig.disableGesture)) {\n config.disableGesture = !!playerConfig.disableGesture\n }\n this.appendChild('.xg-seek-icon', this.icons.seekTipIcon)\n\n this.xgMask = Util.createDom('xg-mask', '', {}, 'xgmask')\n player.root.appendChild(this.xgMask)\n\n this.initCustomStyle()\n\n this.registerThumbnail()\n\n const eventType = this.domEventType === 'mouse' ? 'mouse' : 'touch'\n this.touch = new Touche(this.root, { eventType, needPreventDefault: !this.config.disableGesture })\n\n this.root.addEventListener('contextmenu', e => {\n e.preventDefault()\n })\n\n /**\n * 对根节点做touchmove和touchend绑定,解决控制栏手势无作用的问题\n */\n player.root.addEventListener('touchmove', this.onRootTouchMove, true)\n player.root.addEventListener('touchend', this.onRootTouchEnd, true)\n this.on(Events.DURATION_CHANGE, () => {\n const { player, config } = this\n if (player.duration * 1000 < config.moveDuration) {\n config.moveDuration = player.duration * 1000\n }\n })\n\n this.on([Events.CANPLAY, Events.ENDED], () => {\n const { time, isStart } = this.pos\n if (!isStart && time > 0) {\n this.pos.time = 0\n }\n })\n\n const eventsMap = {\n touchstart: 'onTouchStart',\n touchmove: 'onTouchMove',\n touchend: 'onTouchEnd',\n press: 'onPress',\n pressend: 'onPressEnd',\n click: 'onClick',\n doubleclick: 'onDbClick'\n }\n\n Object.keys(eventsMap).map(key => {\n this.touch.on(key, (e) => {\n this[eventsMap[key]](e)\n })\n })\n\n if (!config.disableActive) {\n // Add progress bar drag event callback\n const progressPlugin = player.plugins.progress\n if (progressPlugin) {\n progressPlugin.addCallBack('dragmove', (data) => {\n this.activeSeekNote(data.currentTime, data.forward)\n })\n progressPlugin.addCallBack('dragend', () => {\n this.changeAction(ACTIONS.AUTO)\n })\n }\n }\n }\n\n registerThumbnail () {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail = thumbnail.createThumbnail(null, 'mobile-thumbnail')\n const timePreview = this.find('.time-preview')\n timePreview.insertBefore(this.thumbnail, timePreview.children[0])\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { playedColor, progressColor } = commonStyle\n if (playedColor) {\n this.find('.xg-curbar').style.backgroundColor = playedColor\n this.find('.xg-cur').style.color = playedColor\n }\n if (progressColor) {\n this.find('.xg-bar').style.backgroundColor = progressColor\n this.find('.time-preview').style.color = progressColor\n }\n this.config.disableTimeProgress && Util.addClass(this.find('.xg-timebar'), 'hide')\n }\n\n resetPos (time = 0) {\n if (this.pos) {\n this.pos.isStart = false\n this.pos.scope = -1;\n ['x', 'y', 'width', 'height', 'scopeL', 'scopeR', 'scopeM1', 'scopeM2'].map(item => {\n this.pos[item] = 0\n })\n } else {\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1,\n time: 0\n }\n }\n }\n\n changeAction (action) {\n const { player, root } = this\n root.setAttribute('data-xg-action', action)\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.recover()\n }\n\n getTouche (e) {\n const rotateDeg = this.player.rotateDeg\n const touche = e.touches && e.touches.length > 0 ? e.touches[e.touches.length - 1] : e\n // if (touches && touches.length > 0) {\n // const touche = touches[touches.length - 1]\n // if (rotateDeg === 0) {\n // return {\n // pageX: touche.pageX,\n // pageY: touche.pageY\n // }\n // } else {\n // return {\n // pageX: touche.pageY,\n // pageY: touche.pageX\n // }\n // }\n // } else {\n // }\n return rotateDeg === 0\n ? {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n : {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n }\n\n /**\n * 校验具体的操作范围\n * @param { number } x 方向位移\n * @param { number } y 方向位移\n * @param { number } diffx 方向位移差\n * @param { number } diffy 方向位移差\n * @param { any } pos 当前操作区域位置信息 包含{width, height}\n * @return { number } scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n */\n checkScope (x, y, diffx, diffy, pos) {\n const { width } = pos\n let scope = -1\n if (x < 0 || x > width) {\n return scope\n }\n const mold = diffy === 0 ? Math.abs(diffx) : Math.abs(diffx / diffy)\n if (Math.abs(diffx) > 0 && mold >= 1.73 && x > pos.scopeM1 && x < pos.scopeM2) {\n scope = 0\n } else if (Math.abs(diffx) === 0 || mold <= 0.57) {\n scope = x < pos.scopeL ? 1 : (x > pos.scopeR ? 2 : 3)\n }\n return scope\n }\n\n /**\n * 根据位移和操作类型进行对应处理\n * @param {number} diffx x方向位移差\n * @param {number} diffy y方向位移差\n * @param {number} scope scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} width 总体宽度\n * @param {number} height 总高度\n */\n executeMove (diffx, diffy, scope, width, height) {\n switch (scope) {\n case 0:\n this.updateTime(diffx / width * this.config.scopeM)\n break\n case 1:\n this.updateBrightness(diffy / height)\n break\n case 2:\n // ios系统不支持音量调节\n if (!Sniffer.os.isIos) {\n this.updateVolume(diffy / height)\n }\n break\n default:\n }\n }\n\n /**\n * 结束手势操作\n * @param {number} scope 当前手势类型 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} lastScope 上一次手势类型\n */\n endLastMove (lastScope) {\n const { pos, player, config } = this\n const time = (pos.time - this.timeOffset) / 1000\n switch (lastScope) {\n case 0:\n player.seek(Number(time).toFixed(1))\n config.hideControlsEnd ? player.blur() : player.focus()\n this.timer = setTimeout(() => {\n this.pos.time = 0\n }, 500)\n break\n case 1:\n case 2:\n default:\n }\n this.changeAction(ACTIONS.AUTO)\n }\n\n onTouchStart = (e) => {\n const { player, config, pos, playerConfig } = this\n const touche = this.getTouche(e)\n if (touche && !config.disableGesture && this.duration > 0 && !player.ended) {\n pos.isStart = true\n // e.cancelable && e.preventDefault()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n // pos.volume = player.volume * 100\n const rect = this.root.getBoundingClientRect()\n if (player.rotateDeg === 90) {\n pos.top = rect.left\n pos.left = rect.top\n pos.width = rect.height\n pos.height = rect.width\n } else {\n pos.top = rect.top\n pos.left = rect.left\n pos.width = rect.width\n pos.height = rect.height\n }\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n pos.x = player.rotateDeg === 90 ? _y : _x // parseInt(touche.pageX - pos.left, 10)\n pos.y = player.rotateDeg === 90 ? _x : _y // parseInt(touche.pageY - pos.top, 10)\n pos.scopeL = config.scopeL * pos.width\n pos.scopeR = (1 - config.scopeR) * pos.width\n pos.scopeM1 = pos.width * (1 - config.scopeM) / 2\n pos.scopeM2 = pos.width - pos.scopeM1\n }\n }\n\n onTouchMove = (e) => {\n const touche = this.getTouche(e)\n const { pos, config, player } = this\n if (!touche || config.disableGesture || !this.duration || !pos.isStart) {\n return\n }\n const { miniMoveStep, hideControlsActive } = config\n\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n const x = player.rotateDeg === 90 ? _y : _x\n const y = player.rotateDeg === 90 ? _x : _y\n\n if (Math.abs(x - pos.x) > miniMoveStep || Math.abs(y - pos.y) > miniMoveStep) {\n const diffx = x - pos.x\n const diffy = y - pos.y\n let scope = pos.scope\n if (scope === -1) {\n scope = this.checkScope(x, y, diffx, diffy, pos)\n // 手势为快进快退记录起始操作时间\n if (scope === 0) {\n !hideControlsActive ? player.focus({ autoHide: false }) : player.blur()\n !pos.time && (pos.time = parseInt(player.currentTime * 1000, 10) + this.timeOffset * 1000)\n }\n pos.scope = scope\n }\n if (scope === -1 || (scope > 0 && !config.gestureY) || (scope === 0 && !config.gestureX)) {\n return\n }\n e.cancelable && e.preventDefault()\n this.executeMove(diffx, diffy, scope, pos.width, pos.height)\n pos.x = x\n pos.y = y\n } else {\n // console.log('touche.pageX - pos.x', touche.pageX - pos.x)\n }\n }\n\n onTouchEnd = (e) => {\n const { player, pos, playerConfig } = this\n if (!pos.isStart) {\n return\n }\n if (pos.scope > -1) {\n e.cancelable && e.preventDefault()\n }\n\n const { disableGesture, gestureX } = this.config\n if (!disableGesture && gestureX) {\n this.endLastMove(pos.scope)\n setTimeout(() => {\n player.getPlugin('progress') && player.getPlugin('progress').resetSeekState()\n }, 10)\n } else {\n pos.time = 0\n }\n pos.scope = -1\n this.resetPos()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n this.changeAction(ACTIONS.AUTO)\n }\n\n checkIsRootTarget (e) {\n const plugins = this.player.plugins || {}\n if (plugins.progress && plugins.progress.root.contains(e.target)) {\n return false\n }\n return (plugins.start && plugins.start.root.contains(e.target)) || (plugins.controls && plugins.controls.root.contains(e.target))\n }\n\n onRootTouchMove = (e) => {\n if (this.config.disableGesture || !this.config.gestureX) {\n return\n }\n if (this.checkIsRootTarget(e)) {\n e.stopPropagation()\n if (!this.pos.isStart) {\n this.onTouchStart(e)\n } else {\n this.onTouchMove(e)\n }\n }\n }\n\n onRootTouchEnd = (e) => {\n if (this.pos.isStart && this.checkIsRootTarget(e)) {\n e.stopPropagation()\n this.onTouchEnd(e)\n // const { controls } = this.player\n // controls && controls.recoverAutoHide()\n }\n }\n\n sendUseAction (event) {\n const { paused } = this.player\n this.emitUserAction(event, 'switch_play_pause', {\n prop: 'paused',\n from: paused,\n to: !paused\n })\n }\n\n clickHandler (e) {\n const { player, config, playerConfig } = this\n if (player.state < STATES.RUNNING) {\n if (!playerConfig.closeVideoClick) {\n this.sendUseAction(Util.createEvent('click'))\n player.play()\n }\n return\n }\n\n if (!config.closedbClick || playerConfig.closeVideoClick) {\n player.isActive ? player.blur() : player.focus()\n } else if (!playerConfig.closeVideoClick) {\n if (player.isActive || config.focusVideoClick) {\n this.sendUseAction(Util.createEvent('click'))\n this.switchPlayPause()\n }\n player.focus()\n }\n }\n\n dbClickHandler (e) {\n const { config, player } = this\n if (!config.closedbClick && player.state >= STATES.RUNNING) {\n this.sendUseAction(Util.createEvent('dblclick'))\n this.switchPlayPause()\n }\n }\n\n onClick (e) {\n const { player } = this\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.clickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onDbClick (e) {\n const { player } = this\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.dbClickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onPress (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n pos.rate = this.player.playbackRate\n this.emitUserAction('press', 'change_rate', {\n prop: 'playbackRate',\n from: player.playbackRate,\n to: config.pressRate\n })\n player.playbackRate = config.pressRate\n this.changeAction(ACTIONS.PLAYBACK)\n }\n\n onPressEnd (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n this.emitUserAction('pressend', 'change_rate', { prop: 'playbackRate', from: player.playbackRate, to: pos.rate })\n player.playbackRate = pos.rate\n pos.rate = 1\n this.changeAction(ACTIONS.AUTO)\n }\n\n updateTime (percent) {\n const { player, config } = this\n const { duration } = this.player\n percent = Number(percent.toFixed(4))\n let time = parseInt(percent * config.moveDuration, 10) + this.timeOffset\n time += this.pos.time\n time = time < 0 ? 0 : (time > duration * 1000 ? duration * 1000 - 200 : time)\n player.getPlugin('time') && player.getPlugin('time').updateTime(time / 1000)\n player.getPlugin('progress') && player.getPlugin('progress').updatePercent(time / 1000 / this.duration, true)\n this.activeSeekNote(time / 1000, percent > 0)\n // 在滑动的同时实时seek\n if (config.isTouchingSeek) {\n // player.currentTime = time / 1000\n player.seek(Number((time - this.timeOffset) / 1000).toFixed(1))\n }\n this.pos.time = time\n }\n\n updateVolume (percent) {\n if (this.player.rotateDeg) {\n percent = -percent\n }\n const { player, pos } = this\n percent = parseInt(percent * 100, 10)\n pos.volume += percent\n if (Math.abs(pos.volume) < 10) {\n return\n }\n let volume = parseInt(player.volume * 10, 10) - parseInt(pos.volume / 10, 10)\n volume = volume > 10 ? 10 : (volume < 1 ? 0 : volume)\n player.volume = volume / 10\n pos.volume = 0\n }\n\n updateBrightness (percent) {\n if (this.player.rotateDeg) {\n percent = -percent\n }\n const { pos, config, xgMask } = this\n let light = pos.light + (0.8 * percent)\n light = light > config.maxDarkness ? config.maxDarkness : (light < 0 ? 0 : light)\n if (xgMask) {\n xgMask.style.backgroundColor = `rgba(0,0,0,${light})`\n }\n pos.light = light\n }\n\n activeSeekNote (time, isForward = true) {\n const { player, config } = this\n const isLive = !(this.duration !== Infinity && this.duration > 0)\n if (!time || typeof time !== 'number' || isLive || config.disableActive) {\n return\n }\n if (time < 0) {\n time = 0\n } else if (time > player.duration) {\n time = player.duration - 0.2\n }\n this.changeAction(ACTIONS.SEEKING)\n\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.focusHide()\n\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n this.find('.xg-cur').innerHTML = Util.format(time)\n this.find('.xg-curbar').style.width = `${time / this.duration * 100}%`\n if (isForward) {\n Util.removeClass(this.find('.xg-seek-show'), 'xg-back')\n } else {\n Util.addClass(this.find('.xg-seek-show'), 'xg-back')\n }\n this.updateThumbnails(time)\n // const {thumbnail} = player.plugins\n // this.thumbnailPlugin && thumbnail.update(time)\n }\n\n updateThumbnails (time) {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, 160, 90)\n // this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n switchPlayPause () {\n const { player } = this\n if (player.state < STATES.ATTACHED) {\n return false\n } else if (!player.ended) {\n if (player.paused) {\n player.play()\n } else {\n player.pause()\n }\n }\n }\n\n // 动态禁用手势\n disableGesture () {\n this.config.disableGesture = false\n }\n\n // 动态启用手势\n enableGesture () {\n this.config.disableGesture = true\n }\n\n destroy () {\n const { player } = this\n this.timer && clearTimeout(this.timer)\n this.thumbnail = null\n player.root.removeChild(this.xgMask)\n this.xgMask = null\n this.touch && this.touch.destroy()\n this.touch = null\n player.root.removeEventListener('touchmove', this.onRootTouchMove, true)\n player.root.removeEventListener('touchend', this.onRootTouchEnd, true)\n }\n\n render () {\n const className = this.config.gradient !== 'normal' ? `gradient ${this.config.gradient}` : 'gradient'\n return `\n <xg-trigger class=\"trigger\">\n <div class=\"${className}\"></div>\n <div class=\"time-preview\">\n <div class=\"xg-seek-show ${this.config.disableSeekIcon ? ' hide-seek-icon' : ''}\">\n <i class=\"xg-seek-icon\"></i>\n <span class=\"xg-cur\">00:00</span>\n <span>/</span>\n <span class=\"xg-dur\">00:00</span>\n </div>\n <div class=\"xg-bar xg-timebar\">\n <div class=\"xg-curbar\"></div>\n </div>\n </div>\n <div class=\"xg-playbackrate xg-top-note\">\n <span><i>${this.config.pressRate}X</i>${this.i18n.FORWARD}</span>\n </div>\n </xg-trigger>\n `\n }\n}\n\nexport default MobilePlugin\n","import { BasePlugin, Events } from '../../plugin'\n/**\n * @typedef {{\n * seekStep?: number,\n * checkVisible?: boolean,\n * disableBodyTrigger?: boolean,\n * keyCodeMap?: { [propName: string]: any },\n * disable: boolean,\n * isIgnoreUserActive: boolean,\n * [propName: string]: any\n * }} IKeyboardConfig\n */\n\nfunction preventDefault (e) {\n e.preventDefault()\n e.returnValue = false\n}\n\nfunction isDisableTag (el) {\n const tagName = el.tagName\n\n if (tagName === 'INPUT' || tagName === 'TEXTAREA' || el.isContentEditable) {\n return true\n }\n\n return false\n}\n\nclass Keyboard extends BasePlugin {\n static get pluginName () {\n return 'keyboard'\n }\n\n /**\n * @type IKeyboardConfig\n */\n static get defaultConfig () {\n return {\n seekStep: 10, // Left/right fast forward each operation time\n checkVisible: true, // Whether to check the visibility when the shortcut key takes effect\n disableBodyTrigger: false, // Whether to monitor the shortcut keys on the body\n disableRootTrigger: false, // 是否在player.root上做快捷键监听\n isGlobalTrigger: false, // Whether the shortcut key needs to be triggered globally\n keyCodeMap: {},\n disable: false,\n isIgnoreUserActive: false // 是否忽略用户激活状态\n }\n }\n\n mergekeyCodeMap () {\n const extendkeyCodeMap = this.config.keyCodeMap\n if (extendkeyCodeMap) {\n Object.keys(extendkeyCodeMap).map(key => {\n if (!this.keyCodeMap[key]) {\n this.keyCodeMap[key] = extendkeyCodeMap[key]\n } else {\n ['keyCode', 'action', 'disable', 'isBodyTarget'].map(key1 => {\n extendkeyCodeMap[key][key1] && (this.keyCodeMap[key][key1] = extendkeyCodeMap[key][key1])\n })\n }\n })\n }\n }\n\n afterCreate () {\n this.config.disable = !this.playerConfig.keyShortcut\n const seekStep = typeof this.config.seekStep === 'function' ? this.config.seekStep(this.player) : this.config.seekStep\n if (!(!seekStep || typeof seekStep !== 'number')) {\n this.seekStep = seekStep\n }\n this.keyCodeMap = {\n space: {\n keyCode: 32,\n action: 'playPause',\n disable: false,\n noBodyTarget: false\n },\n up: {\n keyCode: 38,\n action: 'upVolume',\n disable: false,\n noBodyTarget: true\n },\n down: {\n keyCode: 40,\n action: 'downVolume',\n disable: false,\n noBodyTarget: true\n },\n left: {\n keyCode: 37,\n action: 'seekBack',\n disable: false\n },\n right: {\n keyCode: 39,\n action: 'seek',\n disable: false\n },\n esc: {\n keyCode: 27,\n action: 'exitFullscreen',\n disable: false\n }\n }\n this.mergekeyCodeMap()\n this.player.root.addEventListener('keydown', this.onKeydown)\n document.addEventListener('keydown', this.onBodyKeyDown)\n }\n\n checkIsVisible () {\n if (!this.config.checkVisible) {\n return true\n }\n const rec = this.player.root.getBoundingClientRect()\n const { height, top, bottom } = rec\n const h = window.innerHeight\n if ((top < 0 && top < 0 - height * 0.9) || (bottom > 0 && bottom - h > height * 0.9)) {\n return false\n }\n return true\n }\n\n checkCode (code, isBodyTarget) {\n let flag = false\n Object.keys(this.keyCodeMap).map(key => {\n if (this.keyCodeMap[key] && code === this.keyCodeMap[key].keyCode && !this.keyCodeMap[key].disable) {\n flag = !isBodyTarget || (isBodyTarget && !this.keyCodeMap[key].noBodyTarget)\n }\n })\n return flag\n }\n\n downVolume (event) {\n const { player } = this\n const val = parseFloat((player.volume - 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val >= 0) {\n player.volume = val\n } else {\n player.volume = 0\n }\n }\n\n upVolume (event) {\n const { player } = this\n const val = parseFloat((player.volume + 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val <= 1) {\n player.volume = val\n } else {\n player.volume = 1\n }\n }\n\n seek (event) {\n const { currentTime, duration } = this.player\n let _time = currentTime\n if (currentTime + this.seekStep <= duration) {\n _time = currentTime + this.seekStep\n } else {\n _time = duration - 1\n }\n const props = {\n currentTime: {\n from: currentTime,\n to: _time\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _time\n }\n\n seekBack (event) {\n const { currentTime } = this.player\n let _time = 0\n if (currentTime - this.seekStep >= 0) {\n _time = currentTime - this.seekStep\n }\n const props = {\n currentTime: {\n from: currentTime,\n to: _time\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _time\n }\n\n playPause (event) {\n const { player } = this\n if (!player) {\n return\n }\n this.emitUserAction(event, 'switch_play_pause')\n if (player.paused) {\n // eslint-disable-next-line handle-callback-err\n player.play()\n } else {\n player.pause()\n }\n }\n\n exitFullscreen (event) {\n const { player } = this\n const { fullscreen, cssfullscreen } = player\n if (fullscreen) {\n this.emitUserAction('keyup', 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n player.exitFullscreen()\n }\n if (cssfullscreen) {\n this.emitUserAction('keyup', 'switch_css_fullscreen', {\n prop: 'cssfullscreen',\n from: cssfullscreen,\n to: !cssfullscreen\n })\n player.exitCssFullscreen()\n }\n }\n\n onBodyKeyDown = (event) => {\n const e = event || window.event\n if (!this.player || (!this.player.isUserActive && !this.config.isIgnoreUserActive)) {\n return\n }\n if (this.config.disable || this.config.disableBodyTrigger || !this.checkIsVisible() || e.metaKey || e.altKey || e.ctrlKey) {\n return\n }\n const keyCode = e.keyCode\n if ((e.target === document.body || (this.config.isGlobalTrigger && !isDisableTag(e.target))) && this.checkCode(keyCode, true)) {\n preventDefault(e)\n this.handleKeyCode(keyCode, event)\n return false\n }\n return false\n }\n\n onKeydown = (event) => {\n const e = event || window.event\n if (this.config.disable || this.config.disableRootTrigger || e.metaKey || e.altKey || e.ctrlKey) {\n return\n }\n if (!this.player.isUserActive && !this.config.isIgnoreUserActive) {\n return\n }\n if (!this.player.isUserActive && !this.config.isIgnoreUserActive) {\n return\n }\n if (e && (e.keyCode === 37 || this.checkCode(e.keyCode)) && (e.target === this.player.root || e.target === this.player.video || e.target === this.player.controls.el)) {\n preventDefault(e)\n } else {\n return true\n }\n this.handleKeyCode(e.keyCode, event)\n }\n\n handleKeyCode (curKeyCode, event) {\n Object.keys(this.keyCodeMap).map(key => {\n const { action, keyCode, disable } = this.keyCodeMap[key]\n if (keyCode === curKeyCode && !disable) {\n if (typeof action === 'function') {\n action(event, this.player)\n } else if (typeof action === 'string') {\n if (typeof this[action] === 'function') {\n this[action](event, this.player)\n }\n }\n this.emit(Events.SHORTCUT, {\n key: key,\n target: event.target,\n ...this.keyCodeMap[key]\n })\n }\n })\n }\n\n destroy () {\n this.player.root.removeEventListener('keydown', this.onKeydown)\n document.removeEventListener('keydown', this.onBodyKeyDown)\n }\n\n disable () {\n this.config.disable = true\n }\n\n enable () {\n this.config.disable = false\n }\n}\n\nexport default Keyboard\n","import Plugin, { POSITIONS } from '../../plugin/plugin'\nimport loadingIcon from '../assets/loading.svg'\nimport './index.scss'\n\nclass Loading extends Plugin {\n static get pluginName () {\n return 'loading'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT\n }\n }\n\n registerIcons () {\n return {\n loadingIcon: loadingIcon\n }\n }\n\n afterCreate () {\n this.appendChild('xg-loading-inner', this.icons.loadingIcon)\n }\n\n render () {\n return `\n <xg-loading class=\"xgplayer-loading\">\n <xg-loading-inner></xg-loading-inner>\n </xg-loading>`\n }\n}\n\nexport default Loading\n","import { Util } from '../../plugin'\n\nconst TPL = [\n { tag: 'xg-cache', className: 'xgplayer-progress-cache', styleKey: 'cachedColor' },\n { tag: 'xg-played', className: 'xgplayer-progress-played', styleKey: 'playedColor' }\n]\n\nexport default class InnerList {\n constructor (args) {\n this.fragments = args.fragments || []\n if (this.fragments.length === 0) {\n this.fragments.push({ percent: 1 })\n }\n this._callBack = args.actionCallback\n this.fragConfig = {\n fragFocusClass: args.fragFocusClass || 'inner-focus-point', // 'inner-focus',\n fragAutoFocus: !!args.fragAutoFocus,\n fragClass: args.fragClass || ''\n }\n this.style = args.style || {\n playedColor: '',\n cachedColor: '',\n progressColor: ''\n }\n this.duration = 0\n this.cachedIndex = 0\n this.playedIndex = 0\n this.focusIndex = -1\n }\n\n updateDuration (duration) {\n this.duration = duration\n let start = 0\n const { fragments } = this\n this.fragments = fragments.map(item => {\n item.start = parseInt(start, 10)\n item.end = parseInt(start + item.percent * this.duration, 10)\n item.duration = parseInt(item.percent * this.duration, 10)\n start += item.percent * this.duration\n return item\n })\n }\n\n updateProgress (type = 'played', data = { newIndex: 0, curIndex: 0, millisecond: 0 }) {\n const { progressList, fragments } = this\n if (progressList.length < 1) {\n return\n }\n const { newIndex, curIndex, millisecond } = data\n if (newIndex !== curIndex) {\n progressList.map((item, index) => {\n if (index < newIndex) {\n item[type].style.width = '100%'\n } else if (index > newIndex) {\n item[type].style.width = 0\n }\n })\n }\n const curPFrag = fragments[newIndex]\n const per = millisecond === 0 ? 0 : (millisecond - curPFrag.start) / curPFrag.duration\n progressList[newIndex][type].style.width = per < 0 ? 0 : `${per * 100}%`\n }\n\n updateFocus (data) {\n if (!this.fragConfig.fragAutoFocus || this.fragments.length < 2) {\n return\n }\n if (!data) {\n // 取消焦点\n if (this.focusIndex > -1) {\n this.unHightLight(this.focusIndex)\n const _data = {\n index: -1,\n preIndex: this.focusIndex,\n fragment: null\n }\n this._callBack && this._callBack(_data)\n this.focusIndex = -1\n }\n return\n }\n const newPIndex = this.findIndex(data.currentTime * 1000, this.focusIndex)\n if (newPIndex >= 0 && newPIndex !== this.focusIndex) {\n this.focusIndex > -1 && this.unHightLight(this.focusIndex)\n this.setHightLight(newPIndex)\n const _data = {\n index: newPIndex,\n preIndex: this.focusIndex,\n fragment: this.fragments[this.focusIndex]\n }\n this.focusIndex = newPIndex\n this._callBack && this._callBack(_data)\n }\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!this.duration || parseInt(duration * 1000, 10) !== this.duration) {\n if (!duration && duration !== 0) {\n return\n }\n this.updateDuration(parseInt(duration * 1000, 10))\n }\n const { playedIndex, cachedIndex } = this\n if (Util.typeOf(data.played) !== 'Undefined') {\n const newPIndex = this.findIndex(data.played * 1000, playedIndex)\n if (newPIndex < 0) {\n return\n }\n this.updateProgress('played', {\n newIndex: newPIndex,\n curIndex: playedIndex,\n millisecond: parseInt(data.played * 1000, 10)\n })\n this.playedIndex = newPIndex\n }\n\n if (Util.typeOf(data.cached) !== 'Undefined') {\n const newCIndex = this.findIndex(data.cached * 1000, cachedIndex)\n if (newCIndex < 0) {\n return\n }\n this.updateProgress('cached', {\n newIndex: newCIndex,\n curIndex: cachedIndex,\n millisecond: parseInt(data.cached * 1000, 10)\n })\n this.cachedIndex = newCIndex\n }\n }\n\n findIndex (time, curIndex) {\n const { fragments } = this\n if (!fragments || fragments.length === 0) {\n return -1\n }\n if (fragments.length === 1) {\n return 0\n }\n if (curIndex > -1 && curIndex < fragments.length && time > fragments[curIndex].start && time < fragments[curIndex].end) {\n return curIndex\n }\n if (time > fragments[fragments.length - 1].start) {\n return fragments.length - 1\n }\n\n for (let i = 0; i < fragments.length; i++) {\n if (time > fragments[i].start && time <= fragments[i].end) {\n curIndex = i\n break\n }\n }\n return curIndex\n }\n\n findHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n if (Util.hasClass(children[i], this.fragConfig.fragFocusClass)) {\n return {\n dom: children[i],\n pos: children[i].getBoundingClientRect()\n }\n }\n }\n }\n\n // 根据索引获取进度条片段\n findFragment (index) {\n const children = this.root.children\n if (index < 0 || index >= children.length) {\n return null\n }\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n\n unHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n Util.removeClass(children[i], this.fragConfig.fragFocusClass)\n }\n }\n\n setHightLight (index) {\n const children = this.root.children\n if (index < children.length) {\n Util.addClass(children[index], this.fragConfig.fragFocusClass)\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n }\n\n destroy () {\n this.progressList = null\n this.fragments = null\n this.root.innerHTML = ''\n }\n\n /**\n * 重置当前\n * @param {*} newOptions\n */\n reset (newOptions) {\n // 更新fragConfig\n Object.keys(this.fragConfig).forEach(key => {\n if (newOptions[key] !== undefined) {\n this.fragConfig[key] = newOptions[key]\n }\n })\n if (newOptions.fragments) {\n this.fragments = newOptions.fragments.length === 0 ? [{ percent: 1 }] : newOptions.fragments\n this.updateDuration(this.duration)\n this.playedIndex = 0\n this.cachedIndex = 0\n // 移除分段信息\n if (this.root) {\n const _c = this.root.children\n while (_c.length > 0) {\n this.root.removeChild(_c[0])\n }\n }\n // 重新渲染\n this.render()\n }\n }\n\n render () {\n const { progressColor } = this.style\n if (!this.root) {\n this.root = Util.createDom('xg-inners', '', {}, 'progress-list')\n }\n if (this.fragments) {\n const { fragClass, fragFocusClass } = this.fragConfig\n this.progressList = this.fragments.map((item) => {\n const inner = Util.createDom('xg-inner', '', {\n style: progressColor ? `background:${progressColor}; flex: ${item.percent}` : `flex: ${item.percent}`\n }, `${item.isFocus ? fragFocusClass : ''} xgplayer-progress-inner ${fragClass}`)\n\n this.root.appendChild(inner)\n\n TPL.forEach(item => {\n inner.appendChild(Util.createDom(item.tag, '', {\n style: item.styleKey ? `background: ${this.style[item.styleKey]}; width:0;` : 'width:0;'\n }, item.className))\n })\n\n return {\n cached: inner.children[0],\n played: inner.children[1]\n }\n })\n }\n return this.root\n }\n}\n","import Plugin, { Events, Util, POSITIONS, Sniffer } from '../../plugin'\nimport InnerList from './innerList'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?:string,\n * disable?: boolean,\n * isDragingSeek?: boolean, // 是否在拖拽的过程中更新currentTime\n * closeMoveSeek?: boolean, // 是否关闭滑块seek能力\n * isPauseMoving?: boolean, // 是否在move的时候暂停视频内容\n * isCloseClickSeek?: boolean, // 是否关闭点击进度条的时候seek\n * fragments?: Array<{percent: number}>,\n * fragFocusClass?: string, // 进度条分段高亮类名\n * fragAutoFocus?: boolean, // 是否hover的时候自动高亮\n * miniMoveStep?: number,\n * miniStartStep?: number,\n * onMoveStart?: () => any, // 手势开始移动回调,\n * onMoveEnd?: () => any, // 手势移动结束回调\n * endedDiff?: number,\n * [propName: string]: any\n * }} IProgressConfig\n */\n/**\n * 进度条组件\n */\n\n// 分段获取焦点显示的时候的两种class类型\nconst FRAGMENT_FOCUS_CLASS = {\n POINT: 'inner-focus-point',\n HIGHLIGHT: 'inner-focus-highlight'\n}\nclass Progress extends Plugin {\n static get pluginName () {\n return 'progress'\n }\n\n /**\n * @type IProgressConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_CENTER,\n index: 0,\n disable: false,\n isDragingSeek: true, // 是否在拖拽的过程中更新currentTime\n closeMoveSeek: false, // 是否关闭滑块seek能力\n isPauseMoving: false, // 是否在move的时候暂停视频内容\n isCloseClickSeek: false, // 是否关闭点击进度条的时候seek\n fragments: [{ percent: 1 }],\n fragFocusClass: FRAGMENT_FOCUS_CLASS.POINT,\n fragClass: '', // 内置进度条类名\n fragAutoFocus: false, // 是否hover的时候自动高亮\n miniMoveStep: 5,\n miniStartStep: 2,\n onMoveStart: () => {\n }, // 手势开始移动回调\n onMoveEnd: () => {}, // 手势移动结束回调\n endedDiff: 0.2\n }\n }\n\n static get FRAGMENT_FOCUS_CLASS () {\n return FRAGMENT_FOCUS_CLASS\n }\n\n constructor (args) {\n super(args)\n /**\n * @readonly\n */\n this.useable = false\n /**\n * @readonly\n */\n this.isProgressMoving = false\n\n /**\n * @private\n */\n this.__dragCallBacks = []\n /**\n * @private\n */\n this._state = {\n now: -1,\n direc: 0,\n time: 0,\n prePlayTime: -1\n }\n\n this._disableBlur = false\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n changeState (useable = true) {\n this.useable = useable\n }\n\n show () {\n this.root && (this.root.style.display = 'flex')\n }\n /**\n * @description 创建内部进度条,并挂载到xg-outer上,\n * 并把一些对外API绑定在progress上供外部调用\n *\n */\n _initInner (fragments = [], config = {}) {\n if (!fragments || fragments.length === 0) {\n fragments = [{ percent: 1 }]\n }\n const _c = {\n fragments,\n ...config,\n actionCallback: (data) => {\n this.emitUserAction('fragment_focus', 'fragment_focus', data)\n }\n }\n if (!this.innerList) {\n this.innerList = new InnerList(_c)\n this.outer.insertBefore(this.innerList.render(), this.outer.children[0]);\n ['findHightLight', 'unHightLight', 'setHightLight', 'findFragment'].map(item => {\n this[item] = this.innerList[item].bind(this.innerList)\n })\n } else {\n this.innerList.reset(_c)\n }\n }\n\n _updateInnerFocus (data) {\n this.innerList && this.innerList.updateFocus(data)\n }\n\n afterCreate () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n this.pos = {\n x: 0, // 水平方向位移\n y: 0, // 垂直方向位移\n moving: false, // 是否正在移动\n isDown: false, // 是否mouseDown\n isEnter: false, // 是否触发了mouseEnter\n isLocked: false // 是否刚刚锁定回过进度条\n }\n this.outer = this.find('xg-outer')\n const { fragFocusClass, fragAutoFocus, fragClass } = this.config\n this._initInner(this.config.fragments, { fragFocusClass, fragAutoFocus, fragClass, style: this.playerConfig.commonStyle || {} })\n if (Sniffer.device === 'mobile') {\n this.config.isDragingSeek = false\n this.isMobile = true\n }\n\n this.progressBtn = this.find('.xgplayer-progress-btn')\n\n this.on(Events.DURATION_CHANGE, () => {\n this.onMouseLeave()\n })\n\n this.on(Events.TIME_UPDATE, () => {\n this.onTimeupdate()\n })\n\n this.on(Events.SEEKED, () => {\n this.onTimeupdate()\n this.onCacheUpdate()\n })\n\n this.on(Events.PROGRESS, () => {\n this.onCacheUpdate()\n })\n\n this.on(Events.ENDED, () => {\n this.onCacheUpdate(true)\n this.onTimeupdate(true)\n this._state.now = 0\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n\n this.on(Events.VIDEO_RESIZE, () => {\n this.onVideoResize()\n })\n\n this.bindDomEvents()\n this.initCustomStyle()\n }\n\n /**\n * @description 配置更新响应,插件内置调用api, 播放器整体配置更新的时候调用\n * @param {IProgressConfig} config\n */\n setConfig (config) {\n let frags = null\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n if (key === 'fragments') {\n frags = config[key]\n }\n })\n if (frags) {\n this._initInner(frags, config)\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { sliderBtnStyle } = commonStyle\n const { progressBtn } = this\n if (sliderBtnStyle) {\n if (typeof sliderBtnStyle === 'string') {\n progressBtn.style.boxShadow = sliderBtnStyle\n } else if (typeof sliderBtnStyle === 'object') {\n Object.keys(sliderBtnStyle).map(key => {\n progressBtn.style[key] = sliderBtnStyle[key]\n })\n }\n }\n }\n\n /**\n * 触发某一类回调监听\n * @param { string } type 类型 drag/dragend\n * @param { any} data 具体数据\n */\n triggerCallbacks (type, data, event) {\n if (this.__dragCallBacks.length > 0) {\n this.__dragCallBacks.map(item => {\n if (item && item.handler && item.type === type) {\n try {\n item.handler(data, event)\n } catch (error) {\n console.error(`[XGPLAYER][triggerCallbacks] ${item} error`, error)\n }\n }\n })\n }\n }\n\n /**\n * 供外部插件添加回调\n * @param {string} type 类型 drag/dragend\n * @param {function} handle 回调函数句柄\n */\n addCallBack (type, handle) {\n if (handle && typeof handle === 'function') {\n this.__dragCallBacks.push({ type: type, handler: handle })\n }\n }\n\n /**\n * 供外部插件移除回调\n * @param {string} type 类型 drag/dragend\n * @param {Function} event 回调函数句柄\n */\n removeCallBack (type, event) {\n const { __dragCallBacks } = this\n let _index = -1\n __dragCallBacks.map((item, index) => {\n if (item && item.type === type && item.handler === event) {\n _index = index\n }\n })\n if (_index > -1) {\n __dragCallBacks.splice(_index, 1)\n }\n }\n\n /**\n * @description 解除进度条的所动状态\n * @returns\n */\n unlock () {\n const { player, pos } = this\n pos.isEnter = false\n if (player.isMini) {\n return\n }\n this.unbind('mousemove', this.onMoveOnly)\n if (pos.isDown) {\n this.unbind('mouseleave', this.onMouseLeave)\n return\n }\n this.blur()\n }\n\n bindDomEvents () {\n const { controls, config } = this.player\n this._mouseDownHandlerHook = this.hook('dragstart', this._mouseDownHandler)\n this._mouseUpHandlerHook = this.hook('dragend', this._mouseUpHandler)\n this._mouseMoveHandlerHook = this.hook('drag', this._mouseMoveHandler)\n\n if (this.domEventType === 'touch' || this.domEventType === 'compatible') {\n this.root.addEventListener('touchstart', this.onMouseDown)\n if (controls) {\n controls.root && controls.root.addEventListener('touchmove', Util.stopPropagation)\n controls.center && controls.center.addEventListener('touchend', Util.stopPropagation)\n }\n }\n\n if (this.domEventType === 'mouse' || this.domEventType === 'compatible') {\n this.bind('mousedown', this.onMouseDown)\n config.isMobileSimulateMode !== 'mobile' && this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseover', this.onMouseOver)\n this.bind('mouseout', this.onMouseOut)\n // 避免触发videoClick 暂停/播放切换\n this.player.root.addEventListener('click', this.onBodyClick, true)\n }\n }\n\n focus () {\n this.player.controls.pauseAutoHide()\n Util.addClass(this.root, 'active')\n }\n\n blur () {\n if (this._disableBlur) {\n return\n }\n this.player.controls.recoverAutoHide()\n Util.removeClass(this.root, 'active')\n }\n\n disableBlur () {\n this._disableBlur = true\n }\n\n enableBlur () {\n this._disableBlur = false\n }\n\n onMoveOnly = (e, data) => {\n const { pos, config, player } = this\n let ret = data\n if (e) {\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (pos.moving && Math.abs(pos.x - x) < config.miniMoveStep) {\n return\n }\n pos.moving = true\n pos.x = x\n ret = this.computeTime(e, x)\n }\n this.triggerCallbacks('dragmove', ret, e)\n this._updateInnerFocus(ret)\n }\n\n /**\n * 避免mouseup的时候触发父辈节点的click事件,和单击视频区域切换暂停/播放互斥\n * @param {*} e\n * @returns\n */\n onBodyClick = (e) => {\n if (!this.pos.isLocked) {\n return\n }\n this.pos.isLocked = false\n e.preventDefault()\n e.stopPropagation()\n }\n\n _mouseDownHandler = (event, data) => {\n this._state.time = data.currentTime\n this.updateWidth(data.currentTime, data.percent, 0)\n this._updateInnerFocus(data)\n }\n\n _mouseUpHandler = (e, data) => {\n const { pos } = this\n pos.moving && this.updateWidth(data.currentTime, 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.percent, 1)\n this.triggerCallbacks('dragmove', data, e)\n this._updateInnerFocus(data)\n }\n\n onMouseDown = (e) => {\n const { _state, player, pos, config, playerConfig } = this\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (player.isMini || config.closeMoveSeek || (!playerConfig.allowSeekAfterEnded && player.ended)) {\n return\n }\n\n if (!player.duration && !player.isPlaying) {\n player.play()\n return\n }\n e.stopPropagation()\n // e.preventDefault()\n this.focus()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n Util.checkIsFunction(config.onMoveStart) && config.onMoveStart()\n Util.event(e)\n pos.x = x\n pos.isDown = true\n pos.moving = false\n _state.prePlayTime = player.currentTime\n\n // 交互开始 禁止控制栏的自动隐藏功能\n player.focus({ autoHide: false })\n this.isProgressMoving = true\n Util.addClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseDownHandlerHook(e, ret)\n\n const eventType = e.type\n if (eventType === 'touchstart') {\n this.root.addEventListener('touchmove', this.onMouseMove)\n this.root.addEventListener('touchend', this.onMouseUp)\n } else {\n this.unbind('mousemove', this.onMoveOnly)\n\n document.addEventListener('mousemove', this.onMouseMove, false)\n document.addEventListener('mouseup', this.onMouseUp, false)\n // this.bind('mouseup', this.onMouseUp, false)\n }\n return true\n }\n\n onMouseUp = (e) => {\n const { player, config, pos, playerConfig, _state } = this\n e.stopPropagation()\n e.preventDefault()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n Util.checkIsFunction(config.onMoveEnd) && config.onMoveEnd()\n Util.event(e)\n Util.removeClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, pos.x)\n ret.prePlayTime = _state.prePlayTime\n if (pos.moving) {\n this.triggerCallbacks('dragend', ret, e)\n this.emitUserAction('drag', 'dragend', ret)\n } else {\n this.triggerCallbacks('click', ret, e)\n this.emitUserAction('click', 'click', ret)\n }\n this._mouseUpHandlerHook(e, ret)\n\n pos.moving = false\n pos.isDown = false\n pos.x = 0\n pos.y = 0\n pos.isLocked = true\n _state.prePlayTime = 0\n _state.time = 0\n const eventType = e.type\n if (eventType === 'touchend') {\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n // 交互结束 恢复控制栏的隐藏流程\n this.blur()\n } else {\n document.removeEventListener('mousemove', this.onMouseMove, false)\n document.removeEventListener('mouseup', this.onMouseUp, false)\n if (!pos.isEnter) {\n this.onMouseLeave(e)\n } else {\n playerConfig.isMobileSimulateMode !== 'mobile' && this.bind('mousemove', this.onMoveOnly)\n }\n }\n // 延迟复位,状态复位要在dom相关时间回调执行之后\n Util.setTimeout(this, () => {\n this.resetSeekState()\n }, 10)\n // 交互结束 恢复控制栏的隐藏流程\n player.focus()\n }\n\n onMouseMove = (e) => {\n const { _state, pos, player, config } = this\n if (Util.checkTouchSupport()) {\n // e.stopPropagation()\n e.preventDefault()\n }\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const diff = Math.abs(pos.x - x)\n if ((pos.moving && diff < config.miniMoveStep) || (!pos.moving && diff < config.miniStartStep)) {\n return\n }\n pos.x = x\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseMoveHandlerHook(e, ret)\n }\n\n onMouseOut = (e) => {\n this.triggerCallbacks('mouseout', null, e)\n }\n\n onMouseOver = (e) => {\n this.triggerCallbacks('mouseover', null, e)\n }\n\n onMouseEnter = (e) => {\n const { player, pos } = this\n if (pos.isDown || pos.isEnter || player.isMini || (!player.config.allowSeekAfterEnded && player.ended)) {\n return\n }\n pos.isEnter = true\n this.bind('mousemove', this.onMoveOnly)\n this.bind('mouseleave', this.onMouseLeave)\n // 计算预览位置\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const ret = this.computeTime(e, x)\n this.triggerCallbacks('mouseenter', ret, e)\n this.focus()\n }\n\n onMouseLeave = (e) => {\n this.triggerCallbacks('mouseleave', null, e)\n this.unlock()\n this._updateInnerFocus(null)\n }\n\n onVideoResize = () => {\n const { x, isDown, isEnter } = this.pos\n if (isEnter && !isDown) {\n const ret = this.computeTime(null, x)\n this.onMoveOnly(null, ret)\n }\n }\n\n /**\n * @description 根据currenTime和占用百分比更新进度条\n * @param {Number} currentTime 需要更新到的时间\n * @param {Number} percent 更新时间占比\n * @param {Int} type 触发类型 0-down 1-move 2-up\n */\n updateWidth (currentTime, percent, type) {\n const { config, player } = this\n if (config.isCloseClickSeek && type === 0) {\n return\n }\n const realTime = currentTime >= player.duration ? player.duration - config.endedDiff : Number(currentTime).toFixed(1)\n this.updatePercent(percent)\n this.updateTime(currentTime)\n if (type === 1 && (!config.isDragingSeek || player.config.mediaType === 'audio')) {\n return\n }\n this._state.now = realTime\n this._state.direc = realTime > player.currentTime ? 0 : 1\n player.seek(realTime)\n }\n\n computeTime (e, x) {\n const { player } = this\n const { width, height, top, left } = this.root.getBoundingClientRect()\n let rWidth, rLeft\n const clientX = x\n if (player.rotateDeg === 90) {\n rWidth = height\n rLeft = top\n } else {\n rWidth = width\n rLeft = left\n }\n let offset = clientX - rLeft\n offset = offset > rWidth ? rWidth : (offset < 0 ? 0 : offset)\n let percent = offset / rWidth\n percent = percent < 0 ? 0 : (percent > 1 ? 1 : percent)\n const currentTime = parseInt(percent * this.duration * 1000, 10) / 1000\n return {\n percent,\n currentTime,\n offset,\n width: rWidth,\n left: rLeft,\n e\n }\n }\n\n /**\n * @description 更新时间插件,在拖拽状态下要接管时间插件的更新状态\n * 本位置会和time插件交互\n * @param {number} time 根据拖拽距离计算出的时间\n */\n updateTime (time) {\n const { player, duration } = this\n if (time > duration) {\n time = duration\n } else if (time < 0) {\n time = 0\n }\n const timeIcon = player.plugins.time\n if (timeIcon) {\n timeIcon.updateTime(time)\n }\n }\n\n /**\n * @description 复位正在拖拽状态 ,拖拽的时候要避免timeupdate更新\n */\n resetSeekState () {\n this.isProgressMoving = false\n const timeIcon = this.player.plugins.time\n timeIcon && timeIcon.resetActive()\n }\n\n /**\n * @description 拖拽过程中更新UI\n * @param {number} percent 小于0的小数\n *\n */\n updatePercent (percent, notSeek) {\n this.isProgressMoving = true\n if (this.config.disable) {\n return\n }\n percent = percent > 1 ? 1 : (percent < 0 ? 0 : percent)\n this.progressBtn.style.left = `${percent * 100}%`\n this.innerList.update({ played: percent * this.duration }, this.duration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: percent * this.duration }, this.duration)\n }\n\n /**\n * @description 播放进度更新\n * @param { boolean } isEnded 是否是播放结束的时候调用\n * @returns\n */\n onTimeupdate (isEnded) {\n const { player, _state, duration } = this\n if (player.isSeeking || this.isProgressMoving) {\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.timeOffset + player.currentTime\n time = Util.adjustTimeByDuration(time, duration, isEnded)\n this.innerList.update({ played: time }, duration)\n this.progressBtn.style.left = `${time / duration * 100}%`\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: time }, duration)\n }\n\n /**\n * @description 缓存进度更新\n * @param { boolean } isEnded 是否是结束时触发\n * @returns\n */\n onCacheUpdate (isEnded) {\n const { player, duration } = this\n if (!player) {\n return\n }\n // 兼容设置了customDuration, 实际时长和要显示的时不一致问题\n let _end = player.bufferedPoint.end\n _end = Util.adjustTimeByDuration(_end, duration, isEnded)\n this.innerList.update({ cached: _end }, duration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ cached: _end }, duration)\n }\n\n onReset () {\n this.innerList.update({ played: 0, cached: 0 }, 0)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ cached: 0, played: 0 }, 0)\n }\n\n destroy () {\n const { player } = this\n const { controls } = player\n this.thumbnailPlugin = null\n this.innerList.destroy()\n this.innerList = null\n const { domEventType } = this\n if (domEventType === 'touch' || domEventType === 'compatible') {\n this.root.removeEventListener('touchstart', this.onMouseDown)\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n if (controls) {\n controls.root && controls.root.removeEventListener('touchmove', Util.stopPropagation)\n controls.center && controls.center.removeEventListener('touchend', Util.stopPropagation)\n }\n }\n if (domEventType === 'mouse' || domEventType === 'compatible') {\n this.unbind('mousedown', this.onMouseDown)\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mousemove', this.onMoveOnly)\n this.unbind('mouseleave', this.onMouseLeave)\n document.removeEventListener('mousemove', this.onMouseMove, false)\n document.removeEventListener('mouseup', this.onMouseUp, false)\n player.root.removeEventListener('click', this.onBodyClick, true)\n }\n }\n\n render () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n const controlsMode = this.player.controls ? this.player.controls.config.mode : ''\n const className = controlsMode === 'bottom' ? 'xgplayer-progress-bottom' : ''\n return `\n <xg-progress class=\"xgplayer-progress ${className}\">\n <xg-outer class=\"xgplayer-progress-outer\">\n <xg-progress-btn class=\"xgplayer-progress-btn\"></xg-progress-btn>\n </xg-outer>\n </xg-progress>\n `\n }\n}\n\nexport default Progress\n","import Plugin from '../../plugin'\n\nexport default class Icon extends Plugin {\n afterCreate () {\n this.bind('mouseenter', this._onMouseenter)\n this.bind('mouseleave', this._onMouseLeave)\n }\n\n _onMouseenter = (e) => {\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n _onMouseLeave = (e) => {\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n destroy () {\n this.unbind('mouseenter', this._onMouseenter)\n this.unbind('mouseleave', this._onMouseLeave)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\nclass Play extends IconPlugin {\n static get pluginName () {\n return 'play'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 0,\n disable: false\n }\n }\n\n afterCreate () {\n super.afterCreate()\n const { player, config } = this\n if (config.disable) {\n return\n }\n this.initIcons()\n this.btnClick = this.btnClick.bind(this)\n this.bind(['touchend', 'click'], this.btnClick)\n\n this.on([Events.PAUSE, Events.ERROR, Events.EMPTIED], () => {\n this.animate(player.paused)\n })\n this.on(Events.PLAY, () => {\n this.animate(player.paused)\n })\n this.animate(true)\n }\n\n registerIcons () {\n return {\n play: { icon: PlaySvg, class: 'xg-icon-play' },\n pause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n btnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { prop: 'paused', from: player.paused, to: !player.paused })\n if (player.ended) {\n player.replay()\n } else if (player.paused) {\n player.play()\n this.animate(false)\n } else {\n player.pause()\n this.animate(true)\n }\n return false\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.play)\n this.appendChild('.xgplayer-icon', icons.pause)\n }\n\n animate (paused) {\n if (!this.player) {return}\n const { i18nKeys } = this\n const tipDom = this.find('.xg-tips')\n if (paused) {\n this.setAttr('data-state', 'pause')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PLAY_TIPS)\n } else {\n this.setAttr('data-state', 'play')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PAUSE_TIPS)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['touchend', 'click'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-play\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'PLAY_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\nexport default Play\n","import Plugin, { POSITIONS, Util } from '../../plugin'\nimport BackSVG from '../assets/back.svg'\n\nexport default class TopBackIcon extends Plugin {\n static get pluginName () {\n return 'topbackicon'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT_TOP,\n index: 0\n }\n }\n\n afterCreate () {\n this.initIcons()\n this.onClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n this.config.onClick(e)\n }\n\n this.bind(['click', 'touchend'], this.onClick)\n }\n\n registerIcons () {\n return {\n screenBack: { icon: BackSVG, class: 'xg-fullscreen-back' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild(this.root, icons.screenBack)\n }\n\n show () {\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n render () {\n return `<xg-icon class=\"xgplayer-back\">\n </xg-icon>`\n }\n}\n","import { Events, POSITIONS, Sniffer, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport TopBackIcon from './backicon'\nimport FullScreenSvg from '../assets/requestFull.svg'\nimport ExitFullScreenSvg from '../assets/exitFull.svg'\nimport './index.scss'\n\n/**\n * @typedef { {\n * position?: string,\n * index?: number,\n * useCssFullscreen?: boolean,\n * rotateFullscreen?: boolean,\n * switchCallback?: () => any,\n * target?: null | HTMLElement,\n * disable?: boolean,\n * needBackIcon?: boolean,\n * [propName: string]: any\n * } } IFullscreenConfig\n */\nexport default class Fullscreen extends IconPlugin {\n static get pluginName () {\n return 'fullscreen'\n }\n\n /**\n * @type IFullscreenConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 0,\n useCssFullscreen: false, // Whether to use the page full screen\n rotateFullscreen: false, // Whether to enable rotating full screen\n switchCallback: null, // Custom switch function\n target: null, // Trigger Dom element\n disable: false,\n needBackIcon: false // Whether to enable the return button in the upper left corner of the full screen exit\n }\n }\n\n /**\n * @private\n */\n afterCreate () {\n super.afterCreate()\n const { config, playerConfig } = this\n if (config.disable) {\n return\n }\n\n if (config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n const fullEl = Util.getFullScreenEl()\n\n if (playerConfig.fullscreenTarget === fullEl) {\n this.player.getFullscreen().catch(e=>{})\n }\n\n this.initIcons()\n\n this.handleFullscreen = this.hook('fullscreenChange', this.toggleFullScreen, {\n pre: (e) => {\n const { fullscreen } = this.player\n this.emitUserAction(e, 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n }\n })\n\n this.bind('.xgplayer-fullscreen', ['touchend', 'click'], this.handleFullscreen)\n\n this.on(Events.FULLSCREEN_CHANGE, (isFullScreen) => {\n const tipsDom = this.find('.xg-tips')\n tipsDom && this.changeLangTextKey(tipsDom, isFullScreen ? this.i18nKeys.EXITFULLSCREEN_TIPS : this.i18nKeys.FULLSCREEN_TIPS)\n this.animate(isFullScreen)\n })\n if (this.config.needBackIcon) {\n this.topBackIcon = this.player.registerPlugin({\n plugin: TopBackIcon,\n options: {\n config: {\n onClick: (e) => {\n this.handleFullscreen(e)\n }\n }\n }\n })\n }\n if (Sniffer.device === 'mobile') {\n window.addEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n /**\n * @private\n */\n _onOrientationChange = (e) => {\n if (this.player.fullscreen && this.config.rotateFullscreen) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.player.setRotateDeg(0)\n } else {\n this.player.setRotateDeg(90)\n }\n }\n }\n\n /**\n * @private\n */\n registerIcons () {\n return {\n fullscreen: { icon: FullScreenSvg, class: 'xg-get-fullscreen' },\n exitFullscreen: { icon: ExitFullScreenSvg, class: 'xg-exit-fullscreen' }\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.handleFullscreen)\n if (Sniffer.device === 'mobile') {\n window.removeEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.fullscreen)\n this.appendChild('.xgplayer-icon', icons.exitFullscreen)\n }\n\n /**\n * 切换全屏\n * @param { Event } [e]\n */\n toggleFullScreen (e) {\n if (e) {\n e.preventDefault()\n e.stopPropagation()\n }\n const { player, config } = this\n const useCssFullscreen = config.useCssFullscreen === true || (typeof config.useCssFullscreen === 'function' && config.useCssFullscreen())\n if (useCssFullscreen) {\n if (player.fullscreen) {\n player.exitCssFullscreen()\n } else {\n player.getCssFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.rotateFullscreen) {\n if (player.fullscreen) {\n player.exitRotateFullscreen()\n } else {\n player.getRotateFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.switchCallback && typeof config.switchCallback === 'function') {\n config.switchCallback(player.fullscreen)\n } else {\n if (player.fullscreen) {\n player.exitFullscreen()\n } else {\n player.getFullscreen().catch(e=>{})\n }\n }\n }\n\n /**\n *\n * @param { boolean } isFullScreen\n */\n animate (isFullScreen) {\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n if (this.topBackIcon) {\n if (isFullScreen) {\n this.topBackIcon.show()\n this.hide()\n } else {\n this.topBackIcon.hide()\n this.show()\n }\n }\n }\n\n show () {\n super.show()\n }\n\n hide () {\n super.hide()\n }\n\n /**\n * @private\n * @returns\n */\n render () {\n if (this.config.disable) {\n return\n }\n const langKey = 'FULLSCREEN_TIPS'\n return `<xg-icon class=\"xgplayer-fullscreen\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, langKey, this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import Plugin, { Util, Events, POSITIONS } from '../../plugin'\nimport './index.scss'\n\nclass Time extends Plugin {\n static get pluginName () {\n return 'time'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 2,\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.isActiving = false\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get currentTime () {\n return this.player.currentTime || 0\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n afterCreate () {\n const constrolsMode = this.player.controls.config.mode\n this.mode = constrolsMode === 'flex' ? 'flex' : 'normal'\n if (this.config.disable) {\n return\n }\n if (this.mode === 'flex') {\n this.createCenterTime()\n this.root.style.display = 'none'\n }\n this.durationDom = this.find('.time-duration')\n this.timeDom = this.find('.time-current')\n this.on(Events.DURATION_CHANGE, () => {\n this.onTimeUpdate()\n })\n this.on(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n\n this.on(Events.ENDED, () => {\n // 因为customDuration存在,最终播放currentTime可能和显示的duration不统一,所以在ended的时候修正\n this.onTimeUpdate(true)\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n }\n\n show () {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'block')\n this.centerDurDom && (this.centerDurDom.style.display = 'block')\n return\n }\n this.root.style.display = 'block'\n }\n\n hide () {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'none')\n this.centerDurDom && (this.centerDurDom.style.display = 'none')\n return\n }\n this.root.style.display = 'none'\n }\n\n onTimeUpdate (isEnded) {\n const { player, config, duration } = this\n if (config.disable || this.isActiving || !player.hasStart) {\n return\n }\n let current = player.currentTime + this.timeOffset\n current = Util.adjustTimeByDuration(current, duration, isEnded)\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = Util.format(current)\n if (duration !== Infinity && duration > 0) {\n this.centerDurDom.innerHTML = Util.format(duration)\n }\n } else {\n this.timeDom.innerHTML = 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 = Util.format(0)\n this.centerDurDom.innerHTML = Util.format(0)\n } else {\n this.timeDom.innerHTML = Util.format(0)\n this.durationDom.innerHTML = Util.format(0)\n }\n }\n\n createCenterTime () {\n const { player } = this\n if (!player.controls || !player.controls.center) {\n return\n }\n const center = player.controls.center\n this.centerCurDom = Util.createDom('xg-icon', '00:00', {}, 'xgplayer-time xg-time-left')\n this.centerDurDom = Util.createDom('xg-icon', '00:00', {}, 'xgplayer-time xg-time-right')\n center.children.length > 0 ? center.insertBefore(this.centerCurDom, center.children[0]) : center.appendChild(this.centerCurDom)\n center.appendChild(this.centerDurDom)\n }\n\n afterPlayerInit () {\n const { config } = this\n if (this.duration === Infinity || this.playerConfig.isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n }\n if (config.hide) {\n this.hide()\n return\n }\n this.show()\n }\n\n changeLiveState (isLive) {\n if (isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n Util.show(this.find('.time-separator'))\n Util.show(this.durationDom)\n Util.show(this.timeDom)\n }\n }\n\n updateTime (time) {\n this.isActiving = true\n if ((!time && time !== 0) || time > this.duration) {\n return\n }\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = Util.format(time)\n return\n }\n this.timeDom.innerHTML = Util.format(time)\n }\n\n resetActive () {\n const { player } = this\n const updateState = () => {\n this.isActiving = false\n }\n this.off(Events.SEEKED, updateState)\n if (player.isSeeking) {\n this.once(Events.SEEKED, updateState)\n } else {\n this.isActiving = false\n }\n }\n\n destroy () {\n const { center } = this.player.controls\n this.centerCurDom && center.removeChild(this.centerCurDom)\n this.centerCurDom = null\n this.centerDurDom && center.removeChild(this.centerDurDom)\n this.centerDurDom = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-time\">\n <span class=\"time-current\">00:00</span>\n <span class=\"time-separator\">/</span>\n <span class=\"time-duration\">00:00</span>\n <span class=\"time-live-tag\">${this.i18n.LIVE_TIP}</span>\n </xg-icon>`\n }\n}\nexport default Time\n","import Plugin, { Util, Events, Sniffer, POSITIONS } from '../../plugin'\nimport volumeLargeSvg from '../assets/volumeLarge.svg'\nimport volumeSmallSvg from '../assets/volumeSmall.svg'\nimport volumeMutedSvg from '../assets/volumeMuted.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string, // [可选]插件挂载的dom\n * index?: number // [可选]插件在播放器中挂载的位置\n * disable?: boolean, // [可选]是否禁用插件交互行为\n * showValueLabel?: boolean, // [可选]是否显示当前滑动的音量数值\n * default?: number // [可选]默认\n * [propName: string]: any\n * }} IVolumeConfig\n */\n\nclass Volume extends Plugin {\n static get pluginName () {\n return 'volume'\n }\n\n /**\n * @type IVolumeConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT, // [可选]插件挂载的dom\n index: 1, // [可选]插件在播放器中挂载的位置\n disable: false, // [可选]是否禁用插件交互行为\n showValueLabel: false, // [可选]是否显示当前滑动的音量数值\n default: 0.6, // [可选]默认音量\n miniVolume: 0.2 // 静音恢复的时候最小音量\n }\n }\n\n registerIcons () {\n return {\n volumeSmall: { icon: volumeSmallSvg, class: 'xg-volume-small' },\n volumeLarge: { icon: volumeLargeSvg, class: 'xg-volume' },\n volumeMuted: { icon: volumeMutedSvg, class: 'xg-volume-mute' }\n }\n }\n\n afterCreate () {\n this._timerId = null\n this._d = {\n isStart: false,\n isMoving: false,\n isActive: false\n }\n if (this.config.disable) {\n return\n }\n\n this.initIcons()\n\n const { commonStyle, volume } = this.playerConfig\n if (commonStyle.volumeColor) {\n this.find('.xgplayer-drag').style.backgroundColor = commonStyle.volumeColor\n }\n this.changeMutedHandler = this.hook('mutedChange', (e) => {\n this.changeMuted(e)\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this._onMouseenterHandler = this.hook('mouseenter', this.onMouseenter)\n this._onMouseleaveHandler = this.hook('mouseleave', this.onMouseleave)\n\n if (!(Sniffer.device === 'mobile') && this.playerConfig.isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this._onMouseenterHandler)\n\n this.bind(['blur', 'mouseleave'], this._onMouseleaveHandler)\n\n this.bind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.bind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.bind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n }\n\n this.bind('.xgplayer-icon', ['touchend', 'click'], this.changeMutedHandler)\n\n this.on(Events.VOLUME_CHANGE, this.onVolumeChange)\n this.once(Events.LOADED_DATA, this.onVolumeChange)\n\n if (Util.typeOf(volume) !== 'Number') {\n this.player.volume = this.config.default\n }\n\n this.onVolumeChange()\n }\n\n onBarMousedown = (e) => {\n const { player } = this\n const bar = this.find('.xgplayer-bar')\n Util.event(e)\n\n const barRect = bar.getBoundingClientRect()\n const pos = Util.getEventPos(e, player.zoom)\n const height = barRect.height - (pos.clientY - barRect.top)\n pos.h = height\n pos.barH = barRect.height\n this.pos = pos\n // 差值小于0,说明点击的不是音量滑块位置 不做响应\n if (height < -2) {\n return\n }\n this.updateVolumePos(height, e)\n document.addEventListener('mouseup', this.onBarMouseUp)\n this._d.isStart = true\n return false\n }\n\n onBarMouseMove = (e) => {\n const { _d } = this\n if (!_d.isStart) {\n return\n }\n const { pos, player } = this\n e.preventDefault()\n e.stopPropagation()\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n _d.isMoving = true\n const w = pos.h - _ePos.clientY + pos.clientY\n if (w > pos.barH) {\n return\n }\n this.updateVolumePos(w, e)\n }\n\n onBarMouseUp = (e) => {\n Util.event(e)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n const { _d } = this\n _d.isStart = false\n _d.isMoving = false\n }\n\n updateVolumePos (height, event) {\n const { player } = this\n const drag = this.find('.xgplayer-drag')\n const bar = this.find('.xgplayer-bar')\n if (!bar || !drag) {\n return\n }\n const now = parseInt(height / bar.getBoundingClientRect().height * 1000, 10)\n drag.style.height = `${height}px`\n const to = Math.max(Math.min(now / 1000, 1), 0)\n const props = {\n volume: {\n from: player.volume,\n to\n }\n }\n if (player.muted) {\n props.muted = {\n from: true,\n to: false\n }\n }\n this.emitUserAction(event, 'change_volume', { muted: player.muted, volume: player.volume, props })\n player.volume = Math.max(Math.min(now / 1000, 1), 0)\n player.muted && (player.muted = false)\n\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n\n /**\n * 修改音量数值标签\n *\n * @memberof Volume\n */\n updateVolumeValue () {\n const { volume, muted } = this.player\n const $labelValue = this.find('.xgplayer-value-label')\n const vol = Math.max(Math.min(volume, 1), 0)\n\n $labelValue.innerText = muted ? 0 : Math.ceil(vol * 100)\n }\n\n /**\n * @desc 聚焦\n */\n focus () {\n const { player } = this\n player.focus({ autoHide: false })\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n Util.addClass(this.root, 'slide-show')\n }\n\n /**\n * 失去焦点\n * @param { number } delay 延迟隐藏时长,ms\n * @param { boolean } isForce 是否立即隐藏控制栏\n * @param { Event} [e] 事件\n * @returns\n */\n unFocus (delay = 100, isForce = true, e) {\n const { _d, player } = this\n if (_d.isActive) {\n return\n }\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this._timerId = Util.setTimeout(this, () => {\n if (!_d.isActive) {\n isForce ? player.blur() : player.focus()\n Util.removeClass(this.root, 'slide-show')\n _d.isStart && this.onBarMouseUp(e)\n }\n this._timerId = null\n }, delay)\n }\n\n onMouseenter = (e) => {\n this._d.isActive = true\n this.focus()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n onMouseleave = (e) => {\n this._d.isActive = false\n this.unFocus(100, false, e)\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n changeMuted (e) {\n // e.preventDefault()\n e && e.stopPropagation()\n const { player, _d } = this\n // 取消bar的状态\n _d.isStart && this.onBarMouseUp(e)\n this.emitUserAction(e, 'change_muted', {\n muted: player.muted,\n volume: player.volume,\n props: {\n muted: {\n from: player.muted,\n to: !player.muted\n }\n }\n })\n if (player.volume > 0) {\n player.muted = !player.muted\n }\n if (player.volume < 0.01) {\n player.volume = this.config.miniVolume\n }\n }\n\n onVolumeChange = (e) => {\n if (!this.player) {\n return\n }\n const { muted, volume } = this.player\n if (!this._d.isMoving) {\n this.find('.xgplayer-drag').style.height = muted || volume === 0 ? '4px' : `${volume * 100}%`\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n this.animate(muted, volume)\n }\n\n animate (muted, volume) {\n if (muted || volume === 0) {\n this.setAttr('data-state', 'mute')\n } else if (volume < 0.5 && this.icons.volumeSmall) {\n this.setAttr('data-state', 'small')\n } else {\n this.setAttr('data-state', 'normal')\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.volumeSmall)\n this.appendChild('.xgplayer-icon', icons.volumeLarge)\n this.appendChild('.xgplayer-icon', icons.volumeMuted)\n }\n\n destroy () {\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this.unbind('mouseenter', this.onMouseenter)\n\n this.unbind(['blur', 'mouseleave'], this.onMouseleave)\n\n this.unbind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.unbind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.unbind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.changeMutedHandler)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const volume = this.config.default || this.player.volume\n const isShowVolumeValue = this.config.showValueLabel\n return `\n <xg-icon class=\"xgplayer-volume\" data-state=\"normal\">\n <div class=\"xgplayer-icon\">\n </div>\n <xg-slider class=\"xgplayer-slider\">\n ${isShowVolumeValue ? `<div class=\"xgplayer-value-label\">${volume * 100}</div>` : ''}\n <div class=\"xgplayer-bar\">\n <xg-drag class=\"xgplayer-drag\" style=\"height: ${volume * 100}%\"></xg-drag>\n </div>\n </xg-slider>\n </xg-icon>`\n }\n}\nexport default Volume\n","import { POSITIONS, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport { Events } from '../../plugin/basePlugin'\nimport RotateSvg from '../assets/rotate.svg'\nimport './index.scss'\n\nexport default class Rotate extends IconPlugin {\n static get pluginName () {\n return 'rotate'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n innerRotate: true, // true为只有画面旋转,false为整个播放器旋转\n clockwise: false,\n rotateDeg: 0, // 初始旋转角度\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.rotateDeg = this.config.rotateDeg || 0\n }\n\n afterCreate () {\n if (this.config.disable) {\n return\n }\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.rotate)\n this.onBtnClick = this.onBtnClick.bind(this)\n this.bind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n // 全屏/css全屏/容器宽高发生变化 需要重新计算\n this.on(Events.VIDEO_RESIZE, () => {\n // console.log('Events.VIDEO_RESIZE')\n if (this.rotateDeg) {\n Util.setTimeout(this, () => {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }, 100)\n }\n })\n if (this.rotateDeg) {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n }\n\n onBtnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'rotate')\n this.rotate(this.config.clockwise, this.config.innerRotate, 1)\n }\n\n updateRotateDeg (rotateDeg, innerRotate) {\n const player = this.player\n if (!rotateDeg) {\n rotateDeg = 0\n }\n const { root, innerContainer } = this.player\n const video = this.player.media\n const width = root.offsetWidth\n const height = innerContainer && innerRotate ? innerContainer.offsetHeight : root.offsetHeight\n let rWidth = '100%'\n let rHeight = '100%'\n let x = 0\n let y = 0\n if (rotateDeg === 0.75 || rotateDeg === 0.25) {\n rWidth = `${height}px`\n rHeight = `${width}px`\n x = -(height - width) / 2\n y = -(width - height) / 2\n }\n const _transform = `translate(${x}px,${y}px) rotate(${rotateDeg}turn)`\n const _styles = {\n transformOrigin: 'center center',\n transform: _transform,\n webKitTransform: _transform,\n height: rHeight,\n width: rWidth\n }\n\n const _target = innerRotate ? video : root\n const poster = innerRotate ? player.getPlugin('poster') : null\n Object.keys(_styles).map(key => {\n _target.style[key] = _styles[key]\n poster && poster.root && (poster.root.style[key] = _styles[key])\n })\n }\n\n rotate (clockwise = false, innerRotate = true, times = 1) {\n const player = this.player\n if (!this.rotateDeg) {\n this.rotateDeg = 0\n }\n const factor = clockwise ? 1 : -1\n\n this.rotateDeg = (this.rotateDeg + 1 + factor * 0.25 * times) % 1\n this.updateRotateDeg(this.rotateDeg, innerRotate)\n player.emit(Events.ROTATE, this.rotateDeg * 360)\n }\n\n registerIcons () {\n return {\n rotate: RotateSvg\n }\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n <xg-icon class=\"xgplayer-rotate\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'ROTATE_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import { 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 */\n\nconst PresentationMode = {\n PIP: 'picture-in-picture',\n INLINE: 'inline',\n FULLSCREEN: 'fullscreen'\n}\n\nclass PIP extends IconPlugin {\n static get pluginName () {\n return 'pip'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n showIcon: false\n }\n }\n\n static checkWebkitSetPresentationMode (video) {\n return typeof video.webkitSetPresentationMode === 'function'\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.pip === 'boolean') {\n args.config.showIcon = args.player.config.pip\n }\n }\n\n afterCreate () {\n // 非可用状态不做初始化\n if (!this.isPIPAvailable()) {\n return\n }\n super.afterCreate()\n this.pMode = PresentationMode.INLINE\n this.initPipEvents()\n // 确认开启按钮的情况下才初始化按钮\n if (this.config.showIcon) {\n this.initIcons()\n }\n // video初始化之后再做判断是否显示\n this.once(Events.COMPLETE, () => {\n if (this.config.showIcon) {\n Util.removeClass(this.find('.xgplayer-icon'), 'xg-icon-disable')\n this.bind('click', this.switchPIP)\n }\n })\n }\n\n registerIcons () {\n return {\n pipIcon: { icon: PipIcon, class: 'xg-get-pip' },\n pipIconExit: { icon: PipIconExit, class: 'xg-exit-pip' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.pipIcon)\n this.appendChild('.xgplayer-icon', icons.pipIconExit)\n }\n\n initPipEvents () {\n const { player } = this\n this.leavePIPCallback = () => {\n // 处理点击x关闭画中画的时候暂停问题\n const paused = player.paused\n Util.setTimeout(this, () => {\n // 使用mediaPlay避免多次触发 playhooks\n !paused && player.mediaPlay()\n }, 0)\n !paused && player.mediaPlay()\n this.setAttr('data-state', 'normal')\n player.emit(Events.PIP_CHANGE, false)\n }\n\n this.enterPIPCallback = (e) => {\n player.emit(Events.PIP_CHANGE, true)\n this.pipWindow = e.pictureInPictureWindow\n this.setAttr('data-state', 'pip')\n }\n\n this.onWebkitpresentationmodechanged = (e) => {\n const mode = player.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 /*\n * 进入画中画\n */\n requestPIP () {\n const { player, playerConfig } = this\n if (!this.isPIPAvailable() || this.isPip) {\n return\n }\n try {\n const { poster } = playerConfig\n if (poster) {\n player.media.poster = Util.typeOf(poster) === 'String' ? poster : poster.poster\n }\n PIP.checkWebkitSetPresentationMode(player.media) ? player.media.webkitSetPresentationMode('picture-in-picture') : player.media.requestPictureInPicture()\n return true\n } catch (reason) {\n console.error('requestPiP', reason)\n return false\n }\n }\n\n /**\n * 退出画中画\n */\n exitPIP () {\n const { player } = this\n try {\n if (this.isPIPAvailable() && this.isPip) {\n PIP.checkWebkitSetPresentationMode(player.media) ? player.media.webkitSetPresentationMode('inline') : document.exitPictureInPicture()\n }\n return true\n } catch (reason) {\n console.error('exitPIP', reason)\n return false\n }\n }\n\n get isPip () {\n const { player } = this\n return (document.pictureInPictureElement && document.pictureInPictureElement === player.media) || player.media.webkitPresentationMode === PresentationMode.PIP\n }\n\n isPIPAvailable () {\n const video = this.player.media\n const _isEnabled = Util.typeOf(document.pictureInPictureEnabled) === 'Boolean' ? document.pictureInPictureEnabled : true\n return _isEnabled &&\n ((Util.typeOf(video.disablePictureInPicture) === 'Boolean' && !video.disablePictureInPicture) ||\n (video.webkitSupportsPresentationMode && Util.typeOf(video.webkitSetPresentationMode) === 'Function'))\n }\n\n destroy () {\n super.destroy()\n const { player } = this\n player.media.removeEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.removeEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.removeEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n this.exitPIP()\n this.unbind('click', this.btnClick)\n }\n\n render () {\n if (!this.config.showIcon || !this.isPIPAvailable()) {\n return\n }\n return `<xg-icon class=\"xgplayer-pip\">\n <div class=\"xgplayer-icon xg-icon-disable\">\n </div>\n ${xgIconTips(this, 'PIP', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\nexport default PIP\n","/**\n * 下一个按钮组件\n */\nimport Plugin, { POSITIONS, Sniffer, Events } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport Next from '../assets/playNext.svg'\nimport './index.scss'\n\nexport default class PlayNextIcon extends Plugin {\n static get pluginName () {\n return 'playNext'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 1,\n url: null,\n urlList: []\n }\n }\n\n constructor (options) {\n super(options)\n this.idx = -1\n }\n\n afterCreate () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.playNext)\n this.initEvents()\n }\n\n registerIcons () {\n return {\n playNext: Next\n }\n }\n\n initEvents () {\n this.nextHandler = this.hook('nextClick', this.changeSrc)\n const event = Sniffer.device === 'mobile' ? 'touchend' : 'click'\n this.bind(event, this.playNext)\n this.show()\n }\n\n playNext = (e) => {\n const { player } = this\n e.preventDefault()\n e.stopPropagation()\n if (this.idx + 1 < this.config.urlList.length) {\n this.idx++\n this.nextHandler(this.config.urlList[this.idx], this.idx)\n player.emit(Events.PLAYNEXT, this.idx + 1)\n } else {\n this.nextHandler()\n player.emit(Events.PLAYNEXT)\n }\n }\n\n changeSrc (url) {\n const { player } = this\n if (!url) {\n return\n }\n player.pause()\n player.currentTime = 0\n if (player.switchURL) {\n player.switchURL(url)\n } else {\n player.src = url\n }\n player.config.url = url\n player.play()\n }\n\n destroy () {\n this.unbind(['touchend', 'click'], this.playNext)\n }\n\n render () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n return `\n <xg-icon class=\"xgplayer-playnext\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'PLAYNEXT_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>\n `\n }\n}\n","//download.js v4.2, by dandavis; 2008-2016. [MIT] see http://danml.com/download.html for tests/usage\n// v1 landed a FF+Chrome compat way of downloading strings to local un-named files, upgraded to use a hidden frame and optional mime\n// v2 added named files via a[download], msSaveBlob, IE (10+) support, and window.URL support for larger+faster saves than dataURLs\n// v3 added dataURL and Blob Input, bind-toggle arity, and legacy dataURL fallback was improved with force-download mime and base64 support. 3.1 improved safari handling.\n// v4 adds AMD/UMD, commonJS, and plain browser support\n// v4.1 adds url download capability via solo URL argument (same domain/CORS only)\n// v4.2 adds semantic variable names, long (over 2MB) dataURL support, and hidden by default temp anchors\n// https://github.com/rndme/download\n\n(function (root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([], factory);\n\t} else if (typeof exports === 'object') {\n\t\t// Node. Does not work with strict CommonJS, but\n\t\t// only CommonJS-like environments that support module.exports,\n\t\t// like Node.\n\t\tmodule.exports = factory();\n\t} else {\n\t\t// Browser globals (root is window)\n\t\troot.download = factory();\n }\n}(this, function () {\n\n\treturn function download(data, strFileName, strMimeType) {\n\n\t\tvar self = window, // this script is only for browsers anyway...\n\t\t\tdefaultMime = \"application/octet-stream\", // this default mime also triggers iframe downloads\n\t\t\tmimeType = strMimeType || defaultMime,\n\t\t\tpayload = data,\n\t\t\turl = !strFileName && !strMimeType && payload,\n\t\t\tanchor = document.createElement(\"a\"),\n\t\t\ttoString = function(a){return String(a);},\n\t\t\tmyBlob = (self.Blob || self.MozBlob || self.WebKitBlob || toString),\n\t\t\tfileName = strFileName || \"download\",\n\t\t\tblob,\n\t\t\treader;\n\t\t\tmyBlob= myBlob.call ? myBlob.bind(self) : Blob ;\n\t \n\t\tif(String(this)===\"true\"){ //reverse arguments, allowing download.bind(true, \"text/xml\", \"export.xml\") to act as a callback\n\t\t\tpayload=[payload, mimeType];\n\t\t\tmimeType=payload[0];\n\t\t\tpayload=payload[1];\n\t\t}\n\n\n\t\tif(url && url.length< 2048){ // if no filename and no mime, assume a url was passed as the only argument\n\t\t\tfileName = url.split(\"/\").pop().split(\"?\")[0];\n\t\t\tanchor.href = url; // assign href prop to temp anchor\n\t\t \tif(anchor.href.indexOf(url) !== -1){ // if the browser determines that it's a potentially valid url path:\n \t\tvar ajax=new XMLHttpRequest();\n \t\tajax.open( \"GET\", url, true);\n \t\tajax.responseType = 'blob';\n \t\tajax.onload= function(e){ \n\t\t\t\t download(e.target.response, fileName, defaultMime);\n\t\t\t\t};\n \t\tsetTimeout(function(){ ajax.send();}, 0); // allows setting custom ajax headers using the return:\n\t\t\t return ajax;\n\t\t\t} // end if valid url?\n\t\t} // end if url?\n\n\n\t\t//go ahead and download dataURLs right away\n\t\tif(/^data:([\\w+-]+\\/[\\w+.-]+)?[,;]/.test(payload)){\n\t\t\n\t\t\tif(payload.length > (1024*1024*1.999) && myBlob !== toString ){\n\t\t\t\tpayload=dataUrlToBlob(payload);\n\t\t\t\tmimeType=payload.type || defaultMime;\n\t\t\t}else{\t\t\t\n\t\t\t\treturn navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs:\n\t\t\t\t\tnavigator.msSaveBlob(dataUrlToBlob(payload), fileName) :\n\t\t\t\t\tsaver(payload) ; // everyone else can save dataURLs un-processed\n\t\t\t}\n\t\t\t\n\t\t}else{//not data url, is it a string with special needs?\n\t\t\tif(/([\\x80-\\xff])/.test(payload)){\t\t\t \n\t\t\t\tvar i=0, tempUiArr= new Uint8Array(payload.length), mx=tempUiArr.length;\n\t\t\t\tfor(i;i<mx;++i) tempUiArr[i]= payload.charCodeAt(i);\n\t\t\t \tpayload=new myBlob([tempUiArr], {type: mimeType});\n\t\t\t}\t\t \n\t\t}\n\t\tblob = payload instanceof myBlob ?\n\t\t\tpayload :\n\t\t\tnew myBlob([payload], {type: mimeType}) ;\n\n\n\t\tfunction dataUrlToBlob(strUrl) {\n\t\t\tvar parts= strUrl.split(/[:;,]/),\n\t\t\ttype= parts[1],\n\t\t\tdecoder= parts[2] == \"base64\" ? atob : decodeURIComponent,\n\t\t\tbinData= decoder( parts.pop() ),\n\t\t\tmx= binData.length,\n\t\t\ti= 0,\n\t\t\tuiArr= new Uint8Array(mx);\n\n\t\t\tfor(i;i<mx;++i) uiArr[i]= binData.charCodeAt(i);\n\n\t\t\treturn new myBlob([uiArr], {type: type});\n\t\t }\n\n\t\tfunction saver(url, winMode){\n\n\t\t\tif ('download' in anchor) { //html5 A[download]\n\t\t\t\tanchor.href = url;\n\t\t\t\tanchor.setAttribute(\"download\", fileName);\n\t\t\t\tanchor.className = \"download-js-link\";\n\t\t\t\tanchor.innerHTML = \"downloading...\";\n\t\t\t\tanchor.style.display = \"none\";\n\t\t\t\tdocument.body.appendChild(anchor);\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tanchor.click();\n\t\t\t\t\tdocument.body.removeChild(anchor);\n\t\t\t\t\tif(winMode===true){setTimeout(function(){ self.URL.revokeObjectURL(anchor.href);}, 250 );}\n\t\t\t\t}, 66);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// handle non-a[download] safari as best we can:\n\t\t\tif(/(Version)\\/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*Safari\\//.test(navigator.userAgent)) {\n\t\t\t\tif(/^data:/.test(url))\turl=\"data:\"+url.replace(/^data:([\\w\\/\\-\\+]+)/, defaultMime);\n\t\t\t\tif(!window.open(url)){ // popup blocked, offer direct download:\n\t\t\t\t\tif(confirm(\"Displaying New Document\\n\\nUse Save As... to download, then click back to return to this page.\")){ location.href=url; }\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t//do iframe dataURL download (old ch+FF):\n\t\t\tvar f = document.createElement(\"iframe\");\n\t\t\tdocument.body.appendChild(f);\n\n\t\t\tif(!winMode && /^data:/.test(url)){ // force a mime that will download:\n\t\t\t\turl=\"data:\"+url.replace(/^data:([\\w\\/\\-\\+]+)/, defaultMime);\n\t\t\t}\n\t\t\tf.src=url;\n\t\t\tsetTimeout(function(){ document.body.removeChild(f); }, 333);\n\n\t\t}//end saver\n\n\n\n\n\t\tif (navigator.msSaveBlob) { // IE10+ : (has Blob, but not a[download] or URL)\n\t\t\treturn navigator.msSaveBlob(blob, fileName);\n\t\t}\n\n\t\tif(self.URL){ // simple fast and modern way using Blob and URL:\n\t\t\tsaver(self.URL.createObjectURL(blob), true);\n\t\t}else{\n\t\t\t// handle non-Blob()+non-URL browsers:\n\t\t\tif(typeof blob === \"string\" || blob.constructor===toString ){\n\t\t\t\ttry{\n\t\t\t\t\treturn saver( \"data:\" + mimeType + \";base64,\" + self.btoa(blob) );\n\t\t\t\t}catch(y){\n\t\t\t\t\treturn saver( \"data:\" + mimeType + \",\" + encodeURIComponent(blob) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Blob but not URL support:\n\t\t\treader=new FileReader();\n\t\t\treader.onload=function(e){\n\t\t\t\tsaver(this.result);\n\t\t\t};\n\t\t\treader.readAsDataURL(blob);\n\t\t}\n\t\treturn true;\n\t}; /* end download() */\n}));\n","import downloadUtil from 'downloadjs'\nimport { POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport DownloadSvg from '../assets/download.svg'\nimport './index.scss'\n/**\n * @typedef { {\n * position: string,\n * index: number,\n * disable: boolean,\n * [propName: string]: any\n * } } IDownloadConfig\n */\nexport default class Download extends IconPlugin {\n static get pluginName () {\n return 'download'\n }\n\n /**\n * @type IDownloadConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n disable: true\n }\n }\n\n constructor (args) {\n super(args)\n this.timer = null\n this.isLock = false\n }\n\n afterCreate () {\n super.afterCreate()\n if (this.config.disable) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.download)\n this.bind(['click', 'touchend'], this.download)\n }\n\n registerIcons () {\n return {\n download: DownloadSvg\n }\n }\n\n download = (e) => {\n if (this.isLock) {\n return\n }\n this.emitUserAction(e, 'download')\n const url = this.getAbsoluteURL(this.player.src)\n downloadUtil(url)\n this.isLock = true\n this.timer = window.setTimeout(() => {\n this.isLock = false\n window.clearTimeout(this.timer)\n this.timer = null\n }, 300)\n }\n\n getAbsoluteURL (url) {\n // Check if absolute URL\n if (!url.match(/^https?:\\/\\//)) {\n const div = document.createElement('div')\n div.innerHTML = `<a href=\"${url}\">x</a>`\n url = div.firstChild.href\n }\n return url\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.download)\n window.clearTimeout(this.timer)\n this.timer = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-download\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'DOWNLOAD_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import { POSITIONS, Events } from '../../plugin'\nimport IconPlugin from '../common/iconPlugin'\nimport './index.scss'\n\nexport default class ScreenShot extends IconPlugin {\n static get pluginName () {\n return 'screenShot'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 5,\n quality: 0.92,\n type: 'image/png',\n format: '.png',\n width: 600,\n height: 337,\n fitVideo: true,\n disable: false,\n name: 'screenshot'\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.screenShot === 'boolean') {\n args.config.disable = !args.player.config.screenShot\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.screenshotIcon)\n const { config } = this\n this.initSize = (data) => {\n if (config.fitVideo) {\n config.width = data.vWidth\n config.height = data.vHeight\n }\n }\n this.once(Events.VIDEO_RESIZE, this.initSize)\n }\n\n onPluginsReady () {\n this.show()\n this.onClickBtn = this.onClickBtn.bind(this)\n this.bind(['click', 'touchend'], this.onClickBtn)\n }\n\n saveScreenShot (data, filename) {\n const saveLink = document.createElement('a')\n saveLink.href = data\n saveLink.download = filename\n const event = document.createEvent('MouseEvents')\n event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)\n saveLink.dispatchEvent(event)\n }\n\n createCanvas (width, height) {\n const canvas = document.createElement('canvas')\n const canvasCtx = canvas.getContext('2d')\n\n this.canvasCtx = canvasCtx\n this.canvas = canvas\n\n canvas.width = width || this.config.width\n canvas.height = height || this.config.height\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingQuality\n canvasCtx.imageSmoothingEnabled = true\n if (canvasCtx.imageSmoothingEnabled) {\n canvasCtx.imageSmoothingQuality = 'high'\n }\n }\n\n onClickBtn (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'shot')\n this.shot().then((data) => {\n this.emit(Events.SCREEN_SHOT, data)\n this.saveScreenShot(data, this.config.name + this.config.format)\n })\n }\n\n shot (width, height, option = { quality: 0.92, type: 'image/png' }) {\n const { config, player } = this\n const quality = option.quality || config.quality\n const type = option.type || config.type\n return new Promise((resolve, reject) => {\n let canvas = null\n let canvasCtx\n\n if (player.media.canvas) {\n canvas = player.media.canvas\n } else {\n if (!this.canvas) {\n this.createCanvas(width, height)\n } else {\n this.canvas.width = width || config.width\n this.canvas.height = height || config.height\n }\n canvas = this.canvas\n canvasCtx = this.canvasCtx\n\n const mediaRatio = player.media.videoWidth / player.media.videoHeight\n const canvasRatio = canvas.width / canvas.height\n const sx = 0, sy = 0, sw = player.media.videoWidth, sh = player.media.videoHeight\n let dx, dy, dw, dh\n\n if (mediaRatio > canvasRatio) {\n dw = canvas.width\n dh = canvas.width / mediaRatio\n dx = 0\n dy = Math.round((canvas.height - dh) / 2)\n } else if (mediaRatio === canvasRatio) {\n dw = canvas.width\n dh = canvas.height\n dx = 0\n dy = 0\n } else if (mediaRatio < canvasRatio) {\n dw = canvas.height * mediaRatio\n dh = canvas.height\n dx = Math.round((canvas.width - dw) / 2)\n dy = 0\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage\n canvasCtx.drawImage(player.media, sx, sy, sw, sh, dx, dy, dw, dh)\n }\n let src = canvas.toDataURL(type, quality).replace(type, 'image/octet-stream')\n src = src.replace(/^data:image\\/[^;]+/, 'data:application/octet-stream')\n resolve(src)\n })\n }\n\n registerIcons () {\n return {\n screenshotIcon: null\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.onClickBtn)\n this.off(Events.VIDEO_RESIZE, this.initSize)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const className = this.icons.screenshotIcon ? 'xgplayer-icon' : 'xgplayer-icon btn-text'\n const langKey = 'SCREENSHOT'\n return `\n <xg-icon class=\"xgplayer-shot\">\n <div class=\"${className}\">\n ${this.icons.screenshotIcon ? '' : `<span lang-key=\"${this.i18nKeys[langKey]}\">${this.i18n[langKey]}</span>`}\n </div>\n </xg-icon>`\n }\n}\n","import Plugin, { Util, Sniffer } from '../../plugin'\n\nexport default class OptionList {\n constructor (args) {\n this.config = args.config\n this.parent = args.root\n this.root = Util.createDom('ul', '', {}, `xg-options-list ${this.config.className}`)\n args.root.appendChild(this.root)\n this.onItemClick = this.onItemClick.bind(this)\n this.renderItemList()\n const eventName = Sniffer.device === 'mobile' ? 'touchend' : 'click'\n this._delegates = Plugin.delegate.call(this, this.root, 'li', eventName, this.onItemClick)\n }\n\n renderItemList (data) {\n const { config, root } = this\n if (data) {\n config.data = data\n } else {\n data = config.data\n }\n\n if (config.style) {\n Object.keys(config.style).map(key => {\n root.style[key] = config[key]\n })\n }\n\n if (data.length > 0) {\n this.attrKeys = Object.keys(data[0])\n }\n\n this.root.innerHTML = ''\n\n data.map((item, index) => {\n const className = item.selected ? 'option-item selected' : 'option-item'\n item['data-index'] = index\n this.root.appendChild(Util.createDom('li', `<span>${item.showText}</span>`, item, className))\n })\n }\n\n onItemClick (e) {\n if (!e.delegateTarget) {\n e.delegateTarget = e.target\n }\n const target = e.delegateTarget\n if (target && Util.hasClass(target, 'selected')) {\n return false\n }\n const changeCallback = typeof this.config.onItemClick === 'function' ? this.config.onItemClick : null\n const curSelected = this.root.querySelector('.selected')\n Util.addClass(target, 'selected')\n curSelected && Util.removeClass(curSelected, 'selected')\n changeCallback(e, {\n from: curSelected ? this.getAttrObj(curSelected, this.attrKeys) : null,\n to: this.getAttrObj(target, this.attrKeys)\n })\n }\n\n getAttrObj (dom, keys) {\n if (!dom || !keys) {\n return {}\n }\n const obj = {}\n keys.map(key => {\n obj[key] = dom.getAttribute(key)\n })\n const index = dom.getAttribute('data-index')\n if (index) {\n obj.index = Number(index)\n }\n return obj\n }\n\n show () {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'active')\n }\n\n hide () {\n Util.removeClass(this.root, 'active')\n Util.addClass(this.root, 'hide')\n }\n\n setStyle (style) {\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\n }\n\n destroy () {\n if (this._delegates) {\n this._delegates.map(item => {\n item.destroy && item.destroy()\n })\n this._delegates = null\n }\n this.root.innerHTML = null\n this.parent.removeChild(this.root)\n this.root = null\n }\n}\n","\nimport Plugin, { Events, Util, Sniffer, POSITIONS } from '../../plugin'\nimport OptionList from './optionList'\n// import './optionsIcon.scss'\n\nconst LIST_TYPES = {\n SIDE: 'side',\n MIDDLE: 'middle'\n}\n\nconst TOGGLE_MODES = {\n CLICK: 'click',\n HOVER: 'hover'\n}\n\nfunction getListClassName (listType, position) {\n if (listType === LIST_TYPES.SIDE) {\n return position === POSITIONS.CONTROLS_LEFT ? 'xg-side-list xg-left-side' : 'xg-side-list xg-right-side'\n } else {\n return ''\n }\n}\n\n/**\n * @typedef {{\n * isShow?: boolean,\n * index?: number,\n * list?: Array<any>,\n * listType?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IOptionsIconConfig\n */\n\nconst IS_MOBILE = Sniffer.device === 'mobile'\n\nexport default class OptionsIcon extends Plugin {\n static get pluginName () {\n return 'optionsIcon'\n }\n\n /**\n * @type { IOptionsIconConfig }\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 100,\n list: [],\n listType: 'middle', // 模式 side-右侧边栏 middle-中间显示\n listStyle: {},\n hidePortrait: true,\n isShowIcon: false,\n isItemClickHide: true, // 列表点击之后是否隐藏列表\n toggleMode: TOGGLE_MODES.HOVER // 激活状态切换模式\n }\n }\n\n constructor (args) {\n super(args)\n this.isIcons = false\n this.isActive = false\n this.curValue = null // 当前值\n this.curIndex = 0\n }\n\n updateLang (value) {\n this.renderItemList(this.config.list, this.curIndex)\n }\n\n afterCreate () {\n const { config } = this\n this.initIcons()\n if (IS_MOBILE && config.listType !== LIST_TYPES.MIDDLE) {\n config.listType = LIST_TYPES.SIDE\n }\n\n config.hidePortrait && Util.addClass(this.root, 'portrait')\n\n this.once(Events.CANPLAY, () => {\n if (config.list && config.list.length > 0) {\n this.renderItemList(config.list)\n this.show()\n }\n })\n // 移动端控制栏和列表互斥\n IS_MOBILE && this.on(Events.PLAYER_FOCUS, () => {\n if (!this.isActive) {\n return\n }\n this.optionsList && this.optionsList.hide()\n this.isActive = false\n })\n\n if (IS_MOBILE) {\n config.toggleMode = TOGGLE_MODES.CLICK\n this.activeEvent = 'touchend'\n } else {\n this.activeEvent = config.toggleMode === TOGGLE_MODES.CLICK ? 'click' : 'mouseenter'\n }\n\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.bind(this.activeEvent, this.switchActiveState)\n } else {\n this.bind(this.activeEvent, this.onEnter)\n this.bind('mouseleave', this.onLeave)\n }\n this.isIcons && this.bind('click', this.onIconClick)\n }\n\n initIcons () {\n const { icons } = this\n const _c = Object.keys(icons)\n let _isIcons = false\n if (_c.length > 0) {\n _c.forEach(key => {\n this.appendChild('.xgplayer-icon', icons[key])\n !_isIcons && (_isIcons = icons[key])\n })\n this.isIcons = _isIcons\n }\n if (_isIcons) {\n return\n }\n this.appendChild('.xgplayer-icon', Util.createDom('span', '', {}, 'icon-text'))\n Util.addClass(this.find('.xgplayer-icon'), 'btn-text')\n }\n\n show () {\n if (!this.config.list || this.config.list.length < 2) {\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n getTextByLang (item, key, lang) {\n if (item === undefined) {\n return ''\n }\n const { list } = this.config\n !lang && (lang = this.player.lang)\n key = (!key || Util.isUndefined(item[key])) ? 'text' : key\n typeof item === 'number' && (item = list[item])\n try {\n if (typeof item[key] === 'object') {\n return item[key][lang] || item[key].zh\n } else {\n return item[key]\n }\n } catch (err) {\n console.warn(err)\n return ''\n }\n }\n\n onEnter = (e) => {\n e.preventDefault()\n e.stopPropagation()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n this.switchActiveState(e)\n }\n\n switchActiveState = (e) => {\n e.preventDefault()\n e.stopPropagation()\n const { toggleMode } = this.config\n // console.log('>>>switchActiveState', e.type, this.activeEvent, this.isActive)\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.preventDefault()\n e.stopPropagation()\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n if (this.config.listType !== LIST_TYPES.SIDE) {\n this.isActive && this.toggle(false)\n }\n }\n\n onListEnter = (e) => {\n // console.log('onListEnter')\n this.enterType = 2\n }\n\n onListLeave = (e) => {\n // console.log('onListLeave', e.target)\n this.enterType = 0\n this.isActive && this.toggle(false)\n }\n\n // 状态切换\n toggle (isActive) {\n if (isActive === this.isActive) return\n const { controls } = this.player\n const { listType } = this.config\n if (isActive) {\n listType === LIST_TYPES.SIDE ? controls.blur() : controls.focus()\n this.optionsList && this.optionsList.show()\n } else {\n listType === LIST_TYPES.SIDE ? controls.focus() : controls.focusAwhile()\n this.optionsList && this.optionsList.hide()\n }\n this.isActive = isActive\n }\n\n // 列表点击回调\n onItemClick (e, data) {\n e.preventDefault()\n e.stopPropagation()\n const { listType, list } = this.config\n this.curIndex = data.to.index\n this.curItem = list[this.curIndex]\n this.changeCurrentText()\n const { isItemClickHide } = this.config;\n (isItemClickHide || IS_MOBILE || listType === LIST_TYPES.SIDE) && this.toggle(false)\n }\n\n onIconClick (e) {\n //\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n if (!curItem) return\n this.find('.icon-text').innerHTML = this.getTextByLang(curItem, 'iconText')\n }\n\n renderItemList (itemList, curIndex) {\n const { config, optionsList, player } = this\n if (typeof curIndex === 'number') {\n this.curIndex = curIndex\n this.curItem = config.list[curIndex]\n }\n\n if (optionsList) {\n optionsList.renderItemList(itemList)\n this.changeCurrentText()\n return\n }\n\n const options = {\n config: {\n data: itemList || [],\n className: getListClassName(config.listType, config.position), // config.listType === LIST_TYPES.SIDE ? 'xg-right-side' : '',\n onItemClick: (e, data) => {\n this.onItemClick(e, data)\n }\n },\n root: config.listType === LIST_TYPES.SIDE ? (player.innerContainer || player.root) : this.root\n }\n\n if (this.config.isShowIcon) {\n this.optionsList = new OptionList(options)\n // this.optionsList.root.addEventListener('mouseenter', this.onListEnter)\n // this.optionsList.root.addEventListener('mouseleave', this.onListLeave)\n this.changeCurrentText()\n this.show()\n }\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n this.optionsList && this.optionsList.setStyle({ maxHeight: `${_maxH}px` })\n }\n\n destroy () {\n const { config } = this\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.unbind(this.activeEvent, this.switchActiveState)\n } else {\n this.unbind(this.activeEvent, this.onEnter)\n this.unbind('mouseleave', this.onLeave)\n }\n this.isIcons && this.unbind('click', this.onIconClick)\n if (this.optionsList) {\n this.optionsList.destroy()\n this.optionsList = null\n }\n }\n\n render () {\n if (!this.config.isShowIcon) {\n return\n }\n return `<xg-icon class=\"xg-options-icon ${this.config.className || ''}\">\n <div class=\"xgplayer-icon\">\n </div>\n </xg-icon>`\n }\n}\n","import { Events, POSITIONS, Util } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {import('../../defaultConfig').IDefinition} IDefinition\n */\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array<IDefinition>,\n * defaultDefinition?: any,\n * disable?: any,\n * hidePortrait?: boolean,\n * className?: string\n * }} IDefinitionConfig\n */\nexport default class DefinitionIcon extends OptionsIcon {\n static get pluginName () {\n return 'definition'\n }\n\n /**\n * @type IDefinitionConfig\n */\n static get defaultConfig () {\n return {\n ...OptionsIcon.defaultConfig,\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n list: [],\n defaultDefinition: '',\n disable: false,\n hidePortrait: false, // Whether to hide in the vertical screen state of the mobile terminal\n className: 'xgplayer-definition',\n isShowIcon: true\n }\n }\n\n beforeCreate (args) {\n const { list } = args.config\n if (Array.isArray(list) && list.length > 0) {\n args.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n }\n }\n\n constructor (args) {\n super(args)\n // 记录切换的时候的播放器状态\n this.curTime = 0\n this.isPaused = true\n }\n\n afterCreate () {\n super.afterCreate()\n this.on('resourceReady', (list) => {\n this.changeDefinitionList(list)\n })\n\n this.on(Events.DEFINITION_CHANGE, (data) => {\n this.renderItemList(this.config.list, data.to)\n })\n if (this.player.definitionList.length < 2) {\n this.hide()\n }\n }\n\n show () {\n if (!this.config.list || this.config.list.length < 2){\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n initDefinition () {\n const { list, defaultDefinition } = this.config\n if (list.length > 0) {\n let to = null\n list.map(item => {\n if (item.definition === defaultDefinition) {\n to = item\n }\n })\n if (!to) {\n to = list[0]\n }\n this.changeDefinition(to)\n }\n }\n\n renderItemList (list = this.config.list || [], to) {\n const targetDef = to && to.definition ? to.definition : this.config.defaultDefinition\n if (to) {\n list.forEach((item) => {\n item.selected = false\n })\n }\n let curIndex = 0\n const items = list.map((item, index) => {\n const showItem = {\n ...item,\n showText: this.getTextByLang(item) || item.definition,\n selected: false\n }\n\n if (item.selected || (item.definition\n // eslint-disable-next-line eqeqeq\n && item.definition == targetDef)\n ) {\n showItem.selected = true\n curIndex = index\n }\n return showItem\n })\n super.renderItemList(items, curIndex)\n }\n\n // 对外暴露 切换清晰度\n changeDefinitionList (list) {\n if (!Array.isArray(list)) {\n return\n }\n this.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n this.renderItemList()\n this.config.list.length < 2 ? this.hide() : this.show()\n }\n\n changeDefinition (to, from) {\n this.player.changeDefinition(to, from)\n }\n\n onItemClick (e, data) {\n const { definitionList } = this.player\n super.onItemClick(...arguments)\n this.emitUserAction(e, 'change_definition', { from: data.from, to: data.to })\n for (let i = 0; i < definitionList.length; i++) {\n if (data.to && definitionList[i].definition === data.to.definition) {\n data.to.url = definitionList[i].url\n }\n\n if (data.from && (definitionList[i].definition === data.from.definition)) {\n data.from.url = definitionList[i].url\n }\n }\n this.player.changeDefinition(data.to, data.from)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array<number | { [propName: string]: any }>,\n * className?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IPlaybackRateConfig\n */\n\nexport default class PlaybackRate extends OptionsIcon {\n static get pluginName () {\n return 'playbackRate'\n }\n\n /**\n * @type IPlaybackRateConfig\n */\n static get defaultConfig () {\n return {\n ...OptionsIcon.defaultConfig,\n position: POSITIONS.CONTROLS_RIGHT,\n index: 4,\n list: [2, 1.5, 1, 0.75, 0.5],\n className: 'xgplayer-playbackrate',\n isShowIcon: true,\n hidePortrait: false\n }\n }\n\n constructor (args) {\n super(args)\n this.curRate = 1\n }\n\n beforeCreate (args) {\n const { playbackRate } = args.player.config\n const list = !playbackRate ? [] : Array.isArray(playbackRate) ? playbackRate : args.config.list\n if (Array.isArray(list)) {\n args.config.list = list.map(item => {\n if (typeof item === 'number') {\n item = {\n rate: item,\n text: `${item}x`\n }\n } else if (!item.text && item.rate) {\n item.text = `${item.rate}x`\n }\n return item\n })\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.on(Events.RATE_CHANGE, () => {\n if (this.curValue === this.player.playbackRate) {\n return\n }\n this.renderItemList()\n })\n this.renderItemList()\n }\n\n show () {\n if (!this.config.list || this.config.list.length === 0) {\n return\n }\n super.show()\n }\n\n onItemClick (e, data) {\n super.onItemClick(...arguments)\n const target = e.delegateTarget\n const rate = Number(target.getAttribute('rate'))\n if (!rate || rate === this.curValue) {\n return false\n }\n const props = {\n playbackRate: {\n from: this.player.playbackRate,\n to: rate\n }\n }\n this.emitUserAction(e, 'change_rate', { props })\n this.curValue = rate\n this.player.playbackRate = rate\n }\n\n renderItemList () {\n const playbackRate = this.player.playbackRate || 1\n this.curValue = playbackRate\n let curIndex = -1\n const items = this.config.list.map((item, index) => {\n const itemInfo = {\n rate: item.rate\n }\n if (itemInfo.rate === playbackRate) {\n itemInfo.selected = true\n curIndex = index\n }\n itemInfo.showText = this.getTextByLang(item)\n return itemInfo\n })\n super.renderItemList(items, curIndex)\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n let _text = ''\n // 在列表中没有匹配的选项的时候,默认展示`${playbackRate}x'\n if (!curItem || this.curIndex < 0) {\n _text = `${this.player.playbackRate}x`\n } else {\n _text = this.getTextByLang(curItem, 'iconText')\n }\n this.find('.icon-text').innerHTML = _text\n }\n\n destroy () {\n super.destroy()\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport CssFullSceenSvg from '../assets/requestCssFull.svg'\nimport ExitCssFullSceenSvg from '../assets/exitCssFull.svg'\nimport './index.scss'\n\n/**\n * @typedef { {\n * position: string,\n * index: number,\n * disable: boolean,\n * target: null | HTMLElement,\n * [propName: string]: any\n * } } ICssConfig\n */\n\nexport default class CssFullScreen extends IconPlugin {\n static get pluginName () {\n return 'cssFullscreen'\n }\n\n /**\n * @type ICssConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 1,\n disable: false,\n target: null\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.cssFullscreen === 'boolean') {\n args.config.disable = !args.player.config.cssFullscreen\n }\n }\n\n afterCreate () {\n super.afterCreate()\n if (this.config.disable) {\n return\n }\n\n if (this.config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n this.initIcons()\n this.on(Events.CSS_FULLSCREEN_CHANGE, (isCssfullScreen) => {\n this.animate(isCssfullScreen)\n })\n this.btnClick = this.btnClick.bind(this)\n this.handleCssFullscreen = this.hook('cssFullscreen_change', this.btnClick, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this.handleCssFullscreen)\n }\n\n initIcons () {\n const { icons } = this\n const contentIcon = this.find('.xgplayer-icon')\n contentIcon.appendChild(icons.cssFullscreen)\n contentIcon.appendChild(icons.exitCssFullscreen)\n }\n\n btnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n const { isCssfullScreen } = this.player\n this.emitUserAction(e, 'switch_cssfullscreen', { cssfullscreen: isCssfullScreen })\n if (!isCssfullScreen) {\n this.player.getCssFullscreen()\n } else {\n this.player.exitCssFullscreen()\n }\n }\n\n animate (isFullScreen) {\n if (!this.root) {\n return\n }\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n this.switchTips(isFullScreen)\n }\n\n switchTips (isFullScreen) {\n const { i18nKeys } = this\n const tipDom = this.find('.xg-tips')\n tipDom && this.changeLangTextKey(tipDom, isFullScreen ? i18nKeys.EXITCSSFULLSCREEN_TIPS : i18nKeys.CSSFULLSCREEN_TIPS)\n }\n\n registerIcons () {\n return {\n cssFullscreen: { icon: CssFullSceenSvg, class: 'xg-get-cssfull' },\n exitCssFullscreen: { icon: ExitCssFullSceenSvg, class: 'xg-exit-cssfull' }\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class='xgplayer-cssfullscreen'>\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'CSSFULLSCREEN_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import Plugin, { Events } from '../../plugin'\nimport './index.scss'\n\nexport default class ErrorPlugin extends Plugin {\n static get pluginName () {\n return 'error'\n }\n\n afterCreate () {\n this.clickHandler = this.hook('errorRetry', this.errorRetry, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.onError = this.hook('showError', this.handleError)\n\n this.bind('.xgplayer-error-refresh', 'click', this.clickHandler)\n\n this.on(Events.ERROR, (error) => {\n this.onError(error)\n })\n }\n\n errorRetry (e) {\n this.emitUserAction(e, 'error_retry', {})\n this.player.retry()\n }\n\n handleError (error = {}) {\n const { player } = this\n const type = error.errorType\n let errorNote = player.errorNote ? this.i18n[player.errorNote] : ''\n if (!errorNote) {\n switch (type) {\n case 'decoder':\n errorNote = this.i18n.MEDIA_ERR_DECODE\n break\n case 'network':\n errorNote = this.i18n.MEDIA_ERR_NETWORK\n break\n default:\n errorNote = this.i18n.MEDIA_ERR_SRC_NOT_SUPPORTED\n }\n }\n this.find('.xgplayer-error-text').innerHTML = errorNote\n this.find('.xgplayer-error-tips').innerHTML = `${this.i18n.REFRESH_TIPS}<span class=\"xgplayer-error-refresh\">${this.i18n.REFRESH}</span>`\n }\n\n destroy () {\n this.unbind('.xgplayer-error-refresh', 'click', this.clickHandler)\n }\n\n render () {\n return `<xg-error class=\"xgplayer-error\">\n <div class=\"xgplayer-errornote\">\n <span class=\"xgplayer-error-text\"></span>\n <span class=\"xgplayer-error-tips\"><em class=\"xgplayer-error-refresh\"></em></span>\n </div>\n </xg-error>`\n }\n}\n","import Plugin, { STATE_CLASS, Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * 消息组件\n */\nclass Prompt extends Plugin {\n static get pluginName () {\n return 'prompt'\n }\n\n static get defaultConfig () {\n return {\n interval: 3000,\n style: {},\n mode: 'arrow',\n autoHide: true,\n detail: {\n text: '',\n highlight: ''\n },\n onClick: () => {\n }\n }\n }\n\n afterCreate () {\n this.intervalId = 0\n this.customConfig = null\n this.bind('.highlight', ['click', 'touchend'], (e) => {\n if (this.config.onClick || this.customOnClick) {\n e.preventDefault()\n e.stopPropagation()\n this.customOnClick ? this.customOnClick(e) : this.config.onClick(e)\n }\n })\n\n this.player.showPrompt = (...args) => {\n this.show(...args)\n }\n\n this.player.hidePrompt = () => {\n this.hide()\n }\n }\n\n setStyle (style) {\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n }\n\n show (detail, config = {}, onClick = () => {}) {\n if (!detail) {\n return\n }\n this.customOnClick = onClick\n const { interval } = this.config\n if (this.intervalId) {\n clearTimeout(this.intervalId)\n this.intervalId = null\n }\n Util.addClass(this.root, 'show')\n config.mode === 'arrow' && Util.addClass(this.root, 'arrow')\n if (typeof detail === 'string') {\n this.find('.xgplayer-prompt-detail').innerHTML = detail\n } else {\n this.find('.xgplayer-prompt-detail').innerHTML = `${detail.text || ''}` + `${detail.highlight ? `<i class=\"highlight\">${detail.highlight}</i>` : ''}`\n }\n\n config.style && this.setStyle(config.style)\n\n const autoHide = typeof config.autoHide === 'boolean' ? config.autoHide : this.config.autoHide\n if (autoHide) {\n const hideinterval = config.interval || interval\n this.intervalId = setTimeout(() => {\n this.hide()\n }, hideinterval)\n }\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n Util.removeClass(this.root, 'arrow')\n this.root.removeAttribute('style')\n this.customOnClick = null\n }\n\n render () {\n return `<xg-prompt class=\"xgplayer-prompt ${STATE_CLASS.CONTROLS_FOLLOW}\">\n <span class=\"xgplayer-prompt-detail\"></span>\n </xg-prompt>`\n }\n}\n\nexport default Prompt\n","import { Util, Events } from '../../plugin'\n\nconst ISPOT = {\n time: 0, // 进度条在此时间戳打点 单位为s\n text: '', // 打点处的自定义文案\n id: 1, // 标记唯一标识,用于删除的时候索引\n duration: 1, // 进度条标识点的时长 默认1s【可选】单位为s\n color: '#fff', // 进度条标识点的显示颜色【可选】\n style: {}, // 指定样式\n width: 6,\n height: 6\n}\n\nfunction mergeISPOT (iSpot) {\n Object.keys(ISPOT).map(key => {\n if (iSpot[key] === undefined) {\n iSpot[key] = ISPOT[key]\n }\n })\n}\n\nconst APIS = {\n _updateDotDom (iSpot, dotDom) {\n if (!dotDom) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n dotDom.setAttribute('data-text', iSpot.text)\n dotDom.setAttribute('data-time', iSpot.time)\n if (ret.isMini) {\n Util.addClass(dotDom, 'mini')\n } else {\n Util.removeClass(dotDom, 'mini')\n }\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n },\n initDots () {\n this._ispots.map(item => {\n this.createDot(item, false)\n })\n this.ispotsInit = true\n },\n\n /**\n * 创建一个故事点\n * @param { object } iSpot\n * @param { boolean } isNew\n */\n createDot (iSpot, isNew = true) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (isNew) {\n mergeISPOT(iSpot)\n this._ispots.push(iSpot)\n }\n if (!this.ispotsInit && isNew) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n let className = `xgspot_${iSpot.id} xgplayer-spot`\n ret.isMini && (className += ' mini')\n const dotDom = Util.createDom('xg-spot', iSpot.template || '', {\n 'data-text': iSpot.text,\n 'data-time': iSpot.time,\n 'data-id': iSpot.id\n }, className)\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n progress.outer && progress.outer.appendChild(dotDom)\n },\n\n /**\n * 根据id查找节点\n * @param {string} id\n */\n findDot (id) {\n if (!this.player.plugins.progress) {\n return\n }\n const ret = this._ispots.filter((cur, index) => {\n return cur.id === id\n })\n return ret.length > 0 ? ret[0] : null\n },\n\n /**\n * 更新故事点\n * @param {any} iSpot\n * @param {boolean} needShow\n */\n updateDot (iSpot, needShow = false) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const dot = this.findDot(iSpot.id)\n if (dot) {\n Object.keys(iSpot).map(key => {\n dot[key] = iSpot[key]\n })\n }\n if (!this.ispotsInit) {\n return\n }\n const dotDom = progress.find(`xg-spot[data-id=\"${iSpot.id}\"]`)\n if (!dotDom) {\n return\n }\n 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 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.on(Events.DURATION_CHANGE, () => {\n if (!plugin.ispotsInit) {\n plugin.initDots()\n } else {\n // 更新节点\n plugin.updateDuration()\n }\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: 'onProgressMove'\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.currentTime) {\n this.player.seek(data.currentTime)\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, timePoint, player, config } = this\n const { mode } = player.controls\n const isflex = mode === 'flex'\n let lwidth = root.getBoundingClientRect().width\n // 如果当前预览图宽度获取不到,无法计算位移,不做渲染\n if (!lwidth) {\n return\n }\n const tWidth = timePoint.getBoundingClientRect().width\n lwidth = this._hasThumnail && lwidth < config.width ? config.width : lwidth\n let x = offset - lwidth / 2\n let _t, _tt\n if (x < 0 && !isflex) {\n x = 0\n _t = offset - lwidth / 2\n !this.thumbnail && (_tt = offset - lwidth / 2 - tWidth / 2)\n } else if (x > cwidth - lwidth && !isflex) {\n _t = x - (cwidth - lwidth)\n !this.thumbnail && (_tt = x - (cwidth - lwidth) - tWidth / 2)\n x = cwidth - lwidth\n } else {\n _t = 0\n !this.thumbnail && (_tt = -tWidth / 2)\n }\n _t !== undefined && (previewLine.style.transform = `translateX(${_t.toFixed(2)}px)`)\n _tt !== undefined && (timePoint.style.transform = `translateX(${_tt.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.textContent = timeStr\n !this.thumbnail && (timePoint.textContent = timeStr)\n }\n\n updatePosition (offset, cwidth, time, e) {\n const { root, config, _state } = this\n if (!root) {\n return\n }\n\n this.updateLinePos(offset, cwidth)\n // let now = offset / cwidth * player.duration\n // now = now < 0 ? 0 : (now > player.duration ? player.duration : now)\n _state.now = time\n this.transformTimeHook(time)\n const timeStr = this.timeStr\n if (e && e.target && Util.hasClass(e.target, 'xgplayer-spot')) {\n this.showTips(e.target.getAttribute('data-text'), false, timeStr)\n this.focusDot(e.target)\n _state.f = true\n config.isFocusDots && _state.f && (_state.now = parseInt(e.target.getAttribute('data-time'), 10))\n } else if (config.defaultText) {\n _state.f = false\n this.showTips(config.defaultText, true, timeStr)\n } else {\n _state.f = false\n this.hideTips('')\n // this.blurDot()\n }\n this.updateTimeText(timeStr)\n this.updateThumbnails(_state.now)\n }\n\n /**\n * @description 设置自定义时间显示字符串\n * @param {string} str\n */\n setTimeContent (str) {\n this.timeStr = str\n }\n\n updateThumbnails (time) {\n const { player, videoPreview, config } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, config.width, config.height)\n const rect = videoPreview && videoPreview.getBoundingClientRect()\n this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n registerThumbnail (thumbnailConfig = {}) {\n if (Sniffer.device === 'mobile') {\n return\n }\n const { player, config } = this\n const thumbnail = player.getPlugin('thumbnail')\n if (thumbnail) {\n thumbnail.setConfig(thumbnailConfig)\n }\n if (!thumbnail || !thumbnail.usable || !config.isShowThumbnail) {\n Util.addClass(this.root, 'short-line no-thumbnail')\n return\n } else {\n Util.removeClass(this.root, 'short-line no-thumbnail')\n }\n if (config.mode === 'short') {\n Util.addClass(this.root, 'short-line')\n }\n this._hasThumnail = true\n const tRoot = this.find('.xg-spot-thumbnail')\n this.thumbnail = thumbnail.createThumbnail(tRoot, 'progress-thumbnail')\n if (config.isShowCoverPreview) {\n this.videoPreview = Util.createDom('xg-video-preview', '', {}, 'xgvideo-preview')\n player.root.appendChild(this.videoPreview)\n this.videothumbnail = thumbnail.createThumbnail(this.videoPreview, 'xgvideo-thumbnail')\n }\n this.updateThumbnails(0)\n }\n\n calcuPosition (time, duration) {\n const { progress } = this.player.plugins\n const { player } = this\n const totalWidth = progress.root.getBoundingClientRect().width\n const widthPerSeconds = player.duration / totalWidth * 6\n const ret = {}\n if (time + duration > player.duration) {\n duration = player.duration - time\n }\n ret.left = time / player.duration * 100\n ret.width = duration / player.duration\n ret.isMini = widthPerSeconds > duration\n return {\n left: time / player.duration * 100,\n width: duration / player.duration * 100,\n isMini: duration < widthPerSeconds\n }\n }\n\n showDot (id) {\n const dot = this.findDot(id)\n if (dot) {\n const rect = this.root.getBoundingClientRect()\n const { width } = rect\n const offset = dot.time / this.player.duration * width\n this.updatePosition(offset, width, dot.time)\n }\n }\n\n focusDot (target, id) {\n if (!target) {\n return\n }\n if (!id) {\n id = target.getAttribute('data-id')\n }\n Util.addClass(target, 'active')\n this._activeDotId = id\n }\n\n blurDot (target) {\n if (!target) {\n const id = this._activeDotId\n target = this.getDotDom(id)\n }\n if (!target) {\n return\n }\n Util.removeClass(target, 'active')\n this._activeDotId = null\n }\n\n showTips (text, isDefault, timeStr = '') {\n Util.addClass(this.root, 'no-timepoint')\n if (!text) {\n return\n }\n Util.addClass(this.find('.xg-spot-content'), 'show-text')\n if (isDefault && this.config.mode === 'production') {\n Util.addClass(this.root, 'product')\n this.tipText.textContent = text\n } else {\n Util.removeClass(this.root, 'product')\n this.tipText.textContent = this._hasThumnail ? text : `${timeStr} ${text}`\n }\n }\n\n hideTips () {\n Util.removeClass(this.root, 'no-timepoint')\n this.tipText.textContent = ''\n Util.removeClass(this.find('.xg-spot-content'), 'show-text')\n Util.removeClass(this.root, 'product')\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n show () {\n Util.removeClass(this.root, 'hide')\n }\n\n enable () {\n const { config, playerConfig } = this\n this.config.disable = false\n this.show()\n if (!this.thumbnail && config.isShowThumbnail) {\n this.registerThumbnail(playerConfig.thumbnail || {})\n }\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n const { progress } = this.player.plugins\n progress && Object.keys(CALLBACK_MAP).map(key => {\n progress.removeCallBack(key, this[CALLBACK_MAP[key]])\n })\n this.videothumbnail = null\n this.thumbnail = null\n this.videoPreview && this.player.root.removeChild(this.videoPreview)\n this.unbind('.xg-spot-info', 'mousemove', this.onMousemove)\n this.unbind('.xg-spot-info', 'mousedown', this.onMousedown)\n this.unbind('.xg-spot-info', 'mouseup', this.onMouseup)\n this.unbind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n render () {\n if (Sniffer.device === 'mobile' || this.playerConfig.isMobileSimulateMode === 'mobile') {\n return ''\n }\n\n return `<div class=\"xg-spot-info hide ${this.config.mode === 'short' ? 'short-line' : ''}\">\n <div class=\"xg-spot-content\">\n <div class=\"xg-spot-thumbnail\">\n <span class=\"xg-spot-time\"></span>\n </div>\n <div class=\"xg-spot-text\"><span class=\"spot-inner-text\"></span></div>\n </div>\n <div class=\"xgplayer-progress-point\">00:00</div>\n <div class=\"xg-spot-ext-text\"></div>\n <div class=\"xg-spot-line\"></div>\n </div>`\n }\n}\n","/* eslint-disable camelcase */\nimport BasePlugin, { Util, Events } from '../../plugin'\n/**\n * @typedef {{\n * isShow?: boolean,\n * urls?: Array<string>, // 有多张大图就多个url\n * pic_num?: number, // 每张图含有几个雪碧图\n * col?: number, // 截图列数\n * row?: number, // 截图行数\n * height?: number, // 缩略图高度\n * width?: number, // 缩略图宽度\n * scale?: number, // 缩放\n * className?: string, // 额外添加在dom上的class\n * hidePortrait?: boolean, // 是否在竖屏的时候隐藏\n * [propName: string]: any\n * }} IThumbnailConfig\n */\nexport default class Thumbnail extends BasePlugin {\n static get pluginName () {\n return 'thumbnail'\n }\n\n /**\n * @type IThumbnailConfig\n */\n static get defaultConfig () {\n return {\n isShow: false,\n urls: [], // 有多张大图就多个url就好\n pic_num: 0, // 每张图含有几个雪碧图\n col: 0, // 截图列数\n row: 0, // 截图行数\n height: 90, // 缩略图高度\n width: 160, // 缩略图宽度\n scale: 1, // 缩放\n className: '', // 额外添加在dom上的class\n hidePortrait: false // 是否在竖屏的时候隐藏\n }\n }\n\n constructor (args) {\n super(args)\n this.ratio = 1\n this.interval = null\n this._preloadMark = {}\n }\n\n afterCreate () {\n if (this.usable) {\n this.initThumbnail()\n }\n this.on([Events.DURATION_CHANGE], () => {\n const { pic_num, interval } = this.config\n this.usable && (this.interval = interval > 0 ? interval : Math.round(this.player.duration * 1000 / pic_num) / 1000)\n })\n }\n\n setConfig (config) {\n if (!config) {\n return\n }\n const keys = Object.keys(config)\n if (keys.length < 1) {\n return\n }\n keys.forEach(key => {\n this.config[key] = config[key]\n })\n this.usable && this.initThumbnail()\n }\n\n get usable () {\n const { urls, pic_num } = this.config\n return urls && urls.length > 0 && pic_num > 0\n }\n\n initThumbnail () {\n const { width, height, pic_num, interval } = this.config\n this.ratio = width / height * 100\n this.interval = interval || Math.round(this.player.duration / pic_num)\n this._preloadMark = {}\n // this.preload(0)\n // this.preIndex = new Array(urls.length)\n // this.interval = interval || Math.round(this.player.duration / pic_num)\n // this.ratio = width / height * 100\n // className && Util.addClass(this.root, className)\n // hidePortrait && Util.addClass(this.root, 'portrait')\n // width && (this.root.style.width = `${width}px`)\n // height && (this.root.style.height = `${height}px`)\n // this.root.style.backgroundSize = `${width * col}px auto`\n }\n\n getUrlByIndex (index) {\n return index >= 0 && index < this.config.urls.length ? this.config.urls[index] : ''\n }\n\n preload (index) {\n if (this._preloadMark[index]) {\n return\n }\n const { urls } = this.config\n const len = urls.length\n const arr = []\n index > 0 && arr.push(index - 1)\n arr.push(index)\n index > 0 && index < len - 1 && arr.push(index + 1)\n arr.map(item => {\n if (!this._preloadMark[item] && item >= 0 && item < len) {\n this._preloadMark[item] = 1\n Util.preloadImg(urls[item], () => {\n this._preloadMark[item] = 2\n })\n }\n })\n }\n\n getPosition (now, containerWidth = 0, containerHeight = 0) {\n const { pic_num, row, col, width, height } = this.config\n this.interval = Math.round(this.player.duration / pic_num)\n let index = Math.ceil(now / this.interval) // 当前时间对应的图像索引\n index = index > pic_num ? pic_num : index\n const urlIndex = index < row * col ? 0 : (Math.ceil(index / (row * col)) - 1)// 当前图像所在的url索引\n const indexInPage = index - urlIndex * (col * row) // 当前图像在当前url中的索引\n const rowIndex = indexInPage > 0 ? Math.ceil(indexInPage / col) - 1 : 0// 当前图像在当前url中的行索引\n const colIndex = indexInPage > 0 ? indexInPage - rowIndex * col - 1 : 0 // 当前图像在当前url中的列索引\n let swidth = 0 // containerWidth || width\n let sHeight = 0 // swidth * height / width\n\n // 根据入参的宽高适配样式\n if (containerWidth && containerHeight) {\n const per = containerWidth / containerHeight\n if (per < width / height) {\n sHeight = containerHeight\n swidth = sHeight * (width / height)\n // swidth = containerWidth\n // sHeight = swidth / (width / height)\n } else {\n swidth = containerWidth\n sHeight = swidth / (width / height)\n }\n } else if (!containerHeight) {\n swidth = containerWidth || width\n sHeight = swidth / (width / height)\n } else if (!containerWidth) {\n sHeight = containerHeight || height\n swidth = sHeight * (width / height)\n }\n const url = this.getUrlByIndex(urlIndex)\n return {\n urlIndex,\n rowIndex,\n colIndex,\n url,\n height: sHeight,\n width: swidth,\n style: {\n backgroundImage: `url(${url})`,\n backgroundSize: `${swidth * col}px auto`,\n backgroundPosition: `-${colIndex * swidth}px -${rowIndex * sHeight}px`,\n width: `${swidth}px`,\n height: `${sHeight}px`\n }\n }\n }\n\n update (dom, now, containerWidth = 0, containerHeight = 0, customStyle = '') {\n const { pic_num, urls } = this.config\n if (pic_num <= 0 || !urls || urls.length === 0) {\n return\n }\n const pos = this.getPosition(now, containerWidth, containerHeight)\n this.preload(pos.urlIndex)\n\n Object.keys(pos.style).map((key) => {\n dom.style[key] = pos.style[key]\n })\n Object.keys(customStyle).map(key => {\n dom.style[key] = customStyle[key]\n })\n }\n\n // 对外暴露 切换缩略图配置\n changeConfig (newConfig = {}) {\n this.setConfig(newConfig)\n }\n\n createThumbnail (root, className) {\n const dom = Util.createDom('xg-thumbnail', '', {}, `thumbnail ${className}`)\n root && root.appendChild(dom)\n return dom\n }\n}\n","import Plugin from '../../plugin'\nclass MiniProgress extends Plugin {\n static get pluginName () {\n return 'MiniProgress'\n }\n\n static get defaultConfig () {\n return {}\n }\n\n afterCreate () {\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!duration || !this.root) {\n return\n }\n if (data.cached) {\n this.find('xg-mini-progress-cache').style.width = `${data.cached / duration * 100}%`\n }\n if (data.played) {\n this.find('xg-mini-progress-played').style.width = `${data.played / duration * 100}%`\n }\n }\n\n render () {\n if (!this.playerConfig.progress || !this.playerConfig.miniprogress) {\n return\n }\n return `<xg-mini-progress class=\"xg-mini-progress\">\n <xg-mini-progress-cache class=\"xg-mini-progress-cache\"></xg-mini-progress-cache>\n <xg-mini-progress-played class=\"xg-mini-progress-played\"></xg-mini-progress-played>\n </xg-mini-progress>`\n }\n}\n\nexport default MiniProgress\n","import Plugin, { Events, Util, Sniffer } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nimport './index.scss'\n\nconst MODES = {\n REAL_TIME: 'realtime',\n FIRST_FRAME: 'firstframe',\n FRAME_RATE: 'framerate',\n POSTER: 'poster'\n}\n\nfunction nowTime () {\n try {\n return parseInt(window.performance.now(), 10)\n } catch (e) {\n return new Date().getTime()\n }\n}\n\n/**\n * Check whether the current environment supports canvas\n * @returns { Boolean }\n */\nfunction checkIsSupportCanvas () {\n try {\n const ctx = document.createElement('canvas').getContext\n if (ctx) {\n return true\n }\n return false\n } catch (e) {\n return false\n }\n}\n\n/**\n * @typedef { {\n * disable?: boolean,\n * mode?: \"realtime\" | \"firstframe\" | \"framerate\",\n * frameRate?: number\n * filter?: string,\n * addMask?: boolean,\n * maskBg?: string,\n * multiple? : number,\n * [propName: string]: any\n * } } IDynamicBgConfig\n */\n\nlet isSupportCanvas = null\nclass DynamicBg extends Plugin {\n static get pluginName () {\n return 'dynamicBg'\n }\n\n /**\n * @type IDynamicBgConfig\n */\n static get defaultConfig () {\n return {\n isInnerRender: false,\n disable: true,\n /**\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 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.once(Events.COMPLETE, () => {\n if (!this.player) {\n return\n }\n this.init()\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 this._checkIfCanStart() && this.start()\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 }\n\n onLoadedData = (e) => {\n if (!this.player) { return }\n this._frameCount = this.config.startFrameCount\n this.renderOnTimeupdate(e)\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n this.on(Events.TIME_UPDATE, this.renderOnTimeupdate)\n }\n\n /**\n * @private\n * 初始化 canvas对象并使用海报图先渲染首帧w11\n */\n init () {\n const { player, config } = this\n this.canvasFilter = DynamicBg.supportCanvasFilter()\n try {\n // 保证节点插入到video之前\n const parent = !this.config.isInnerRender ? player.root : (player.innerContainer || player.root)\n parent.insertAdjacentHTML('afterbegin',\n `<div class=\"xgplayer-dynamic-bg\"><canvas>\n </canvas><xgmask></xgmask></div>`)\n this.root = parent.children[0]\n this.canvas = this.find('canvas')\n // safari中canvas filter不生效, 使用css滤镜\n if (!this.canvasFilter) {\n this.canvas.style.filter = config.filter\n this.canvas.style.webkitFilter = config.filter\n }\n this.mask = this.find('xgmask')\n\n config.addMask && (this.mask.style.background = config.maskBg)\n this.canvasCtx = this.canvas.getContext('2d')\n this.renderByPoster()\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n /**\n * Check whether the current video object supports screenshots\n * @param { Object } video\n * @returns { DomElement | null }\n */\n checkVideoIsSupport (video) {\n if (!video) {\n return null\n }\n const _tVideo = video && video instanceof window.HTMLVideoElement ? video : (video.canvas ? video.canvas : (video.flyVideo ? video.flyVideo : null))\n if (_tVideo && !(Sniffer.browser === 'safari' && (/^blob/.test(_tVideo.currentSrc) || /^blob/.test(_tVideo.src)))) {\n return _tVideo\n }\n\n const _tagName = _tVideo ? _tVideo.tagName.toLowerCase() : ''\n if (_tagName === 'canvas' || _tagName === 'img') {\n return _tVideo\n }\n\n return null\n }\n\n renderByPoster () {\n const { poster } = this.playerConfig\n if (poster) {\n const url = Util.typeOf(poster) === 'String' ? poster : (Util.typeOf(poster.poster) === 'String' ? poster.poster : null)\n this.updateImg(url)\n }\n }\n\n 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 !this.player.paused && this._checkIfCanStart() && this.start()\n }\n }\n\n _checkIfCanStart () {\n const { mode } = this.config\n return this._isLoaded && mode !== MODES.FIRST_FRAME && mode !== MODES.POSTER\n }\n\n /**\n * just render once\n * @returns\n */\n renderOnce () {\n const video = this.player.media\n if (!video.videoWidth || !video.videoHeight) {\n return\n }\n this.videoPI = parseInt(video.videoWidth / video.videoHeight * 100, 10)\n const _sVideo = this.checkVideoIsSupport(video)\n _sVideo && video.videoWidth && this.update(_sVideo, this.videoPI)\n }\n\n start = () => {\n const video = this.player.media\n const _now = nowTime()\n const _sVideo = this.checkVideoIsSupport(video)\n if (!_sVideo || !this.canvasCtx) {\n return\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 >= this.interval) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n }\n }\n this.frameId = Util.requestAnimationFrame(this.start)\n }\n\n stop = () => {\n if (this.frameId) {\n Util.cancelAnimationFrame(this.frameId)\n // window.clearTimeout(this.frameId)\n this.frameId = null\n }\n }\n\n updateImg (url) {\n // TODO: 需要改造,使用domcss样式渲染,不再使用canvas渲染\n if (!url) {\n return\n }\n // Render using the image\n const { width, height } = this.canvas.getBoundingClientRect()\n let image = new window.Image()\n image.onload = () => {\n if (!this.canvas || this.frameId || this.isStart) {\n return\n }\n this.canvas.height = height\n this.canvas.width = width\n const pi = parseInt(width / height * 100, 10)\n this.update(image, pi)\n image = null\n }\n image.src = url\n }\n\n update (video, sourcePI) {\n if (!this.canvas || !this.canvasCtx || !sourcePI) {\n return\n }\n try {\n const { _pos, config } = this\n const { width, height } = this.canvas.getBoundingClientRect()\n if (width !== _pos.width || height !== _pos.height || _pos.pi !== sourcePI) {\n const pi = parseInt(width / height * 100, 10)\n _pos.pi = sourcePI\n _pos.width = this.canvas.width = width\n _pos.height = this.canvas.height = height\n let rheight = height\n let rwidth = width\n if (pi < sourcePI) {\n rwidth = parseInt(height * sourcePI / 100, 10)\n } else if (pi > sourcePI) {\n rheight = parseInt(width * 100 / sourcePI, 10)\n }\n _pos.rwidth = rwidth * config.multiple\n _pos.rheight = rheight * config.multiple\n _pos.x = (width - _pos.rwidth) / 2\n _pos.y = (height - _pos.rheight) / 2\n }\n // console.log(`x:${_pos.x} y:${_pos.y} rwidth:${_pos.rwidth} rheight:${_pos.rheight}`)\n this.canvasFilter && (this.canvasCtx.filter = config.filter)\n this.canvasCtx.drawImage(video, _pos.x, _pos.y, _pos.rwidth, _pos.rheight)\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n destroy () {\n this.stop()\n this.canvasCtx = null\n this.canvas = null\n }\n\n render () {\n return ''\n }\n}\n\nexport default DynamicBg\n","import { BasePlugin, Events } from '../../plugin'\nconst INFO = 'info'\n\nconst { STATS_EVENTS } = Events\nexport default class Stats extends BasePlugin {\n static get pluginName () {\n return 'stats'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n _recordUserActions = (actionData) => {\n const time = this._getTime()\n const payload = Object.assign({}, actionData, { msg: actionData.msg || actionData.action })\n this._stats[INFO].push({\n type: 'userAction',\n ...time,\n payload\n })\n }\n\n _getTime () {\n return {\n timestamp: Date.now(),\n timeFormat: new Date().toISOString()\n }\n }\n\n afterCreate () {\n this.reset()\n this.on(Events.USER_ACTION, this._recordUserActions)\n this.on(STATS_EVENTS.STATS_INFO, this._recordInfo)\n this.on(STATS_EVENTS.STATS_DOWNLOAD, this._downloadStats)\n this.on(STATS_EVENTS.STATS_RESET, this._onReset)\n }\n\n destroy () {\n this.offAll()\n }\n\n _onReset = () => {\n this.reset()\n }\n\n _recordInfo = (data) => {\n this.info(data)\n }\n\n _downloadStats = () => {\n const stats = this.getStats()\n const blob = new Blob([JSON.stringify(stats)], { type: 'application/json' })\n const downloadUrl = window.URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.style.display = 'none'\n link.href = downloadUrl\n link.download = 'player.txt'\n link.disabled = false\n link.click()\n }\n\n downloadStats () {\n this._downloadStats()\n }\n\n /**\n * @params type\n */\n info (data) {\n if (data.profile) {\n this._infoProfile(data)\n } else {\n this._info(data)\n }\n }\n\n _info (data) {\n const time = this._getTime()\n this._stats[INFO].push({\n ...time,\n payload: data\n })\n }\n\n _infoProfile (data) {\n if (data && data.startMs) {\n const endMs = Date.now()\n const dur = endMs - data.startMs\n const profile = {\n cat: 'function',\n dur: dur,\n name: data.name || data.msg,\n ph: 'X',\n pid: 0,\n tid: 0,\n ts: data.startMs,\n profile: true,\n ...data\n }\n this._info(profile)\n } else {\n console.warn('infoProfile need object data, include startMs')\n }\n }\n\n reset () {\n this._stats = {\n [INFO]: [],\n media: {}\n }\n }\n\n getStats () {\n const { player } = this\n const mediaElem = player.media\n const buffered = []\n for (let i = 0; i < mediaElem.buffered.length; i++) {\n buffered.push({\n start: mediaElem.buffered.start(i),\n end: mediaElem.buffered.end(i)\n })\n }\n const mediaInfo = {\n currentTime: mediaElem.currentTime,\n readyState: mediaElem.readyState,\n buffered,\n paused: mediaElem.paused,\n ended: mediaElem.ended\n }\n\n this._stats.media = mediaInfo\n return {\n raw: this._stats,\n timestat: this._getTimeStats(),\n profile: this._getProfile()\n }\n }\n\n _getTimeStats () {\n const allStat = this._stats[INFO]\n const msgs = allStat.map(stat => {\n const data = stat.payload.data\n let msg = ''\n try {\n if (data instanceof Error) {\n msg = data.msg\n } else if (data !== undefined) {\n msg = JSON.stringify(data)\n }\n } catch (error) {\n console.log('err', error)\n }\n\n return `[${stat.timeFormat}] : ${stat.payload.msg} ${msg} `\n })\n return msgs\n }\n\n _getProfile () {\n const profile = {\n traceEvents: []\n }\n const allStat = this._stats[INFO]\n allStat.forEach(stat => {\n if (stat.payload.profile) {\n profile.traceEvents.push(stat.payload)\n }\n })\n return profile\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class GapJump extends BasePlugin {\n static get pluginName () {\n return 'gapJump'\n }\n\n static get defaultConfig () {\n return {\n useGapJump: false,\n smallGapLimit: 0.5,\n gapDetectionThreshold: 0.3\n }\n }\n\n afterCreate () {\n const { useGapJump } = this.config\n if (useGapJump === false) {\n return\n }\n this.hasPlayed = false\n this.seekingEventReceived = false\n this.isSafari = /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform)\n this.on(Events.WAITING, this.onGapJump)\n\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n\n this.on(Events.SEEKING, () => {\n this.seekingEventReceived = true\n })\n }\n\n onGapJump = () => {\n const { player, config } = this\n if (player.media.readyState === HTMLMediaElement.HAVE_NOTHING) {\n return\n }\n if (player.media.seeking) {\n if (!this.seekingEventReceived) { return }\n } else {\n this.seekingEventReceived = false\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n\n const buffered = player.media.buffered\n const smallGapLimit = config.smallGapLimit || 0.5\n const gapDetectionThreshold = config.gapDetectionThreshold || 0.3\n const currentTime = player.media.currentTime\n const idx = this._getIndex(buffered, currentTime, gapDetectionThreshold)\n if (idx === null || idx === 0) {\n return\n }\n console.log('GapJump bufferRange ', buffered.start(idx), buffered.end(idx))\n const jumpTo = buffered.start(idx) + 0.1\n const seekEnd = player.media.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n const jumpSize = jumpTo - currentTime\n const isGapSmall = jumpSize <= smallGapLimit\n if (jumpSize < GapJump.BROWSER_GAP_TOLERANCE) {\n return\n }\n\n if (isGapSmall) {\n if (config.useGapJump !== false) {\n player.media.currentTime = this.isSafari ? jumpTo + 0.1 : jumpTo\n }\n this.player && this.player.emit('detectGap')\n console.log('gapJump gapIndex', idx, ' isGapSamll:', isGapSmall, ' currentTime:', player.media.currentTime, ' jumpSize:', (currentTime - player.media.currentTime))\n // 目前转码视频首个分片cts存在,在Safari下为0.08,先忽略\n if (jumpTo !== 0.08) {\n player && player.emit('log', {\n type: 'oneevent', // 事件类型\n end_type: 'gap',\n vid: player.config.vid,\n ext: {\n video_postion: Math.floor(jumpTo * 1000) // ms\n }\n })\n }\n }\n }\n\n _getIndex (buffered, time, threshold) {\n if (!buffered || !buffered.length) {\n return null\n }\n if (buffered.length === 1 && buffered.end(0) - buffered.start(0) < 1e-6) {\n return null\n }\n const bufferedInfo = this._getBuffered(buffered)\n let idx = null\n for (let i = 0; i < bufferedInfo.length; i++) {\n const item = bufferedInfo[i]\n if (item.start > time && (i === 0 || bufferedInfo[i - 1].end - time <= threshold)) {\n idx = i\n break\n }\n }\n return idx\n }\n\n _getBuffered (b) {\n if (!b) {\n return []\n }\n const ret = []\n for (let i = 0; i < b.length; i++) {\n ret.push({\n start: b.start(i),\n end: b.end(i)\n })\n }\n return ret\n }\n}\nGapJump.BROWSER_GAP_TOLERANCE = 0.001\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class WaitingTimeoutJump extends BasePlugin {\n static get pluginName () {\n return 'waitingTimeoutJump'\n }\n\n static get defaultConfig () {\n return {\n useWaitingTimeoutJump: false,\n waitingTime: 15, // wait超过此时间没恢复,则向前跳jumpSize,单位s\n jumpSize: 2, // 单位s,\n jumpCntMax: 4 // 一次播放最大向前跳几次\n }\n }\n\n afterCreate () {\n const { useWaitingTimeoutJump, jumpSize } = this.config\n if (useWaitingTimeoutJump === false) {\n return\n }\n this.hasPlayed = false\n this.jumpCnt = 0\n this.timer = null\n this.jumpSize = jumpSize\n this.on(Events.WAITING, this.onWaiting)\n this.on([Events.PLAYING, Events.CANPLAY], () => {\n clearTimeout(this.timer)\n this.timer = null\n this.jumpSize = this.config.jumpSize\n })\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n }\n\n onWaiting = () => {\n const { config } = this\n if (this.jumpCnt > config.jumpCntMax || this.timer || config.useWaitingTimeoutJump === false) {\n return\n }\n this.timer = setTimeout(this.onJump, config.waitingTime * 1000)\n }\n\n onJump = () => {\n const { player, config } = this\n clearTimeout(this.timer)\n this.timer = null\n if (this.jumpCnt > config.jumpCntMax || config.useWaitingTimeoutJump === false) {\n return\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n this.jumpSize = config.jumpSize * (this.jumpCnt + 1)\n if (this.jumpCnt === config.jumpSize && this.jumpSize < 6) {\n this.jumpSize = 6\n }\n const jumpTo = player.currentTime + this.jumpSize\n const seekEnd = player.media.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n console.log('waitintTimeout, currentTime:', player.currentTime, ', jumpTo:', jumpTo)\n this.jumpCnt++\n player.currentTime = jumpTo\n }\n}\n","import BasePlugin, { Events, Util } from '../../plugin'\n\nexport default class TestSpeed extends BasePlugin {\n static get pluginName () {\n return 'testspeed'\n }\n\n static get defaultConfig () {\n return {\n openSpeed: false, // 测速开关,默认关\n testCnt: 3, // 一次播放的测速次数,默认1次\n loadSize: 200 * 1024, // 一次播放的测速请求的数据量大小,单位字节,默认200k\n testTimeStep: 3000, // 每次测速的时间间隔,第一次在开播后的testTimeStep 秒,默认是3s\n url: '', // 每次测速的url,一般传播放的备用地址测速\n saveSpeedMax: 5 // 保留最近多少次测速记录,最后的速度求这个记录列表平均值,默认5条\n }\n }\n\n getSpeed = (speedList) => {\n if (this.speedListCache.length <= 0) return 0\n let total = 0\n this.speedListCache.map(item => {\n total += item\n })\n return Math.floor(total / this.speedListCache.length)\n }\n\n afterCreate () {\n this.speedListCache = []\n const { openSpeed, testTimeStep } = this.config\n this.timer = null\n this.cnt = 0\n this.xhr = null\n if (!openSpeed) {\n return\n }\n this.on('real_time_speed', this._onRealSpeedChange)\n\n this.on([Events.LOADED_DATA, Events.REPLAY], () => {\n if (Util.isMSE(this.player.video)) {\n return\n }\n this.speedListCache = []\n this.cnt = 0\n this.timer = setTimeout(this.testSpeed, testTimeStep)\n })\n }\n\n _onRealSpeedChange = (data) => {\n data.speed && this.appendList(data.speed)\n }\n\n testSpeed = () => {\n clearTimeout(this.timer)\n this.timer = null\n if (!this.player || !this.config.openSpeed) return\n const { url, loadSize, testCnt, testTimeStep } = this.config\n const testSpeedUrl = url + (url.indexOf('?') < 0 ? '?testst=' : '&testst=') + Date.now()\n if (this.cnt >= testCnt) {\n return\n }\n this.cnt++\n try {\n const start = new Date().getTime()\n let end = null\n const xhr = new XMLHttpRequest()\n this.xhr = xhr\n xhr.open('GET', testSpeedUrl)\n const headers = {}\n const random = Math.floor(Math.random() * 10)\n headers.Range = 'bytes=' + random + '-' + (loadSize + random)\n if (headers) {\n Object.keys(headers).forEach(k => {\n xhr.setRequestHeader(k, headers[k])\n })\n }\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4) {\n this.xhr = null\n end = new Date().getTime()\n const size = xhr.getResponseHeader('Content-Length') / 1024 * 8\n const speed = Math.round(size * 1000 / (end - start))\n this.appendList(speed)\n this.timer = setTimeout(this.testSpeed, testTimeStep)\n }\n }\n xhr.send()\n } catch (e) {\n console.error(e)\n }\n }\n\n appendList = (speed) => {\n const { saveSpeedMax } = this.config\n if (this.speedListCache.length >= saveSpeedMax) {\n this.speedListCache.shift()\n }\n this.speedListCache.push(speed)\n this.player && (this.player.realTimeSpeed = speed)\n this.updateSpeed()\n }\n\n updateSpeed = () => {\n const speed = this.getSpeed()\n const { player } = this\n if (player && (!player.avgSpeed || speed !== player.avgSpeed)) {\n player.avgSpeed = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, { speed: speed, realTimeSpeed: player.realTimeSpeed })\n }\n }\n\n set openSpeed (value) {\n this.config.openSpeed = value\n if (!value && this.timer) {\n clearTimeout(this.timer)\n this.timer = null\n return\n }\n if (this.config.openSpeed) {\n if (this.timer) return\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n }\n\n get openSpeed () {\n return this.config.openSpeed\n }\n\n destroy () {\n clearTimeout(this.timer)\n this.timer = null\n if (this.xhr && this.xhr.readyState !== 4) {\n this.xhr.cancel()\n this.xhr = null\n }\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\n/**\n * @typedef { {\n * tick?: number,\n * stuckCount?: number,\n * disable?: boolean,\n * reportFrame?: number\n * } } IFullscreenConfig\n */\nexport default class FpsDetect extends BasePlugin {\n static get pluginName () {\n return 'FpsDetect'\n }\n\n static get defaultConfig () {\n return {\n disabled:false,\n tick:1000, // tick时间,默认1000 ms\n stuckCount:3, // 三次\n reportFrame:0 // 每次解码帧率小于多少时统计\n }\n }\n\n afterCreate () {\n const { player, config } = this\n this.timer = null\n this._lastDecodedFrames = 0\n this._currentStuckCount = 0\n this._lastCheckPoint = null\n if (config.disabled) return\n const getVideoPlaybackQuality = player.media.getVideoPlaybackQuality\n if (!getVideoPlaybackQuality) return\n this.on(Events.PLAY, ()=>{\n this._startTick()\n })\n\n this.on(Events.PAUSE, ()=>{\n this._stopTick()\n })\n\n this.on(Events.ENDED, ()=>{\n this._stopTick()\n })\n\n this.on(Events.EMPTIED, ()=>{\n this._stopTick()\n })\n }\n\n _startTick (){\n this._stopTick()\n this._timer = setTimeout(()=>{\n this._checkDecodeFPS()\n this._startTick()\n }, this.config.tick)\n }\n\n _stopTick (){\n clearTimeout(this._timer)\n this._timer = null\n }\n\n _checkStuck (curDecodedFrames){\n const { media } = this.player\n const hidden = document.hidden\n const paused = media.paused\n if (typeof hidden === 'boolean' && !hidden && !paused){\n const curTime = media.currentTime\n const buffered = media.buffered\n let enoughBuffer = false\n for (let i = 0; i < buffered.length; i++){\n const start = buffered.start(i)\n const end = buffered.end(i)\n if (start <= curTime && curTime <= end - 1){\n enoughBuffer = true\n break\n }\n }\n if (media.readyState === 4 && enoughBuffer){\n if (this._currentStuckCount > this.config.stuckCount){\n this.emit(Events.FPS_STUCK)\n this._currentStuckCount = 0\n } else {\n if (curDecodedFrames <= this.config.reportFrame){\n this._currentStuckCount ++\n } else {\n this._currentStuckCount = 0\n }\n }\n }\n }\n }\n\n _checkDecodeFPS (){\n if (!this.player.media){\n return\n }\n const { totalVideoFrames } = this.player.media.getVideoPlaybackQuality()\n const currTime = performance.now()\n if (totalVideoFrames){\n if (this._lastCheckPoint){\n const curDecoded = totalVideoFrames - this._lastDecodedFrames\n this._checkStuck(curDecoded)\n }\n }\n this._lastDecodedFrames = totalVideoFrames\n this._lastCheckPoint = currTime\n }\n\n destroy () {\n this._stopTick()\n }\n}","import sniffer from '../utils/sniffer'\n// import Danmu from '../plugins/danmu'\nimport Xglogger from '../plugins/logger'\nimport Replay from '../plugins/replay'\nimport Poster from '../plugins/poster'\nimport Start from '../plugins/start'\nimport Enter from '../plugins/enter'\nimport Miniscreen from '../plugins/miniScreen'\nimport PC from '../plugins/pc'\nimport Mobile from '../plugins/mobile'\nimport Keyboard from '../plugins/keyboard'\nimport Loading from '../plugins/loading'\nimport Progress from '../plugins/progress'\nimport PlayIcon from '../plugins/play'\nimport FullScreen from '../plugins/fullscreen'\nimport TimeIcon from '../plugins/time'\nimport Volume from '../plugins/volume'\nimport RotateIcon from '../plugins/rotate'\nimport PIPIcon from '../plugins/pip'\nimport PlayNextIcon from '../plugins/playNext'\nimport DownLoadIcon from '../plugins/download'\nimport ScreenShotIcon from '../plugins/screenShot'\nimport DefinitionIcon from '../plugins/definition'\nimport PlaybackRateIcon from '../plugins/playbackRate'\nimport CssFullScreen from '../plugins/cssFullScreen'\nimport Error from '../plugins/error'\nimport Prompt from '../plugins/prompt'\nimport ProgressPreview from '../plugins/progressPreview'\nimport Thumbnail from '../plugins/common/thumbnail'\nimport MiniProgress from '../plugins/progress/miniProgress'\nimport DynamicBg from '../plugins/dynamicBg'\nimport ZH from '../lang/zh-cn'\nimport Stats from '../plugins/stats'\nimport GapJump from '../plugins/gapJump'\nimport WaitingTimeoutJump from '../plugins/waitingTimeoutJump'\nimport TestSpeed from '../plugins/testspeed'\nimport I18N from '../lang/i18n'\nimport FpsDetect from '../plugins/fpsDetect'\n\nI18N.use(ZH)\n\nexport default class DefaultPreset {\n constructor (options, playerConfig) {\n const simulateMode = playerConfig && playerConfig.isMobileSimulateMode === 'mobile'\n const { isLive } = playerConfig\n const vodPlugins = isLive ? [] : [Progress, MiniProgress, ProgressPreview, TimeIcon]\n\n const contolsIcons = [...vodPlugins, PlayIcon, FullScreen,\n RotateIcon, PlayNextIcon, DefinitionIcon, PlaybackRateIcon, DownLoadIcon, ScreenShotIcon, Volume, PIPIcon]\n\n const layers = [Replay, Poster, Start, Loading, Enter, Error, Prompt, Thumbnail, Miniscreen]\n\n this.plugins = [Stats, Xglogger, ...contolsIcons, ...layers, GapJump, WaitingTimeoutJump]\n const mode = simulateMode ? 'mobile' : sniffer.device\n switch (mode) {\n case 'pc':\n this.plugins.push(...[Keyboard, PC, CssFullScreen, TestSpeed, FpsDetect])\n break\n case 'mobile':\n this.plugins.push(...[Mobile])\n break\n default:\n this.plugins.push(...[Keyboard, PC, CssFullScreen])\n }\n if (sniffer.os.isIpad || mode === 'pc') {\n this.plugins.push(DynamicBg)\n }\n if (sniffer.os.isIpad) {\n this.plugins.push(PC)\n }\n this.ignores = []\n this.i18n = []\n }\n}\n","export default {\n LANG: 'zh-cn',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: '视频下载错误'\n },\n mse: {\n code: 2,\n msg: '流追加错误'\n },\n parse: {\n code: 3,\n msg: '解析错误'\n },\n format: {\n code: 4,\n msg: '格式错误'\n },\n decoder: {\n code: 5,\n msg: '解码错误'\n },\n runtime: {\n code: 6,\n msg: '语法错误'\n },\n timeout: {\n code: 7,\n msg: '播放超时'\n },\n other: {\n code: 8,\n msg: '其他错误'\n }\n },\n HAVE_NOTHING: '没有关于音频/视频是否就绪的信息',\n HAVE_METADATA: '音频/视频的元数据已就绪',\n HAVE_CURRENT_DATA: '关于当前播放位置的数据是可用的,但没有足够的数据来播放下一帧/毫秒',\n HAVE_FUTURE_DATA: '当前及至少下一帧的数据是可用的',\n HAVE_ENOUGH_DATA: '可用数据足以开始播放',\n NETWORK_EMPTY: '音频/视频尚未初始化',\n NETWORK_IDLE: '音频/视频是活动的且已选取资源,但并未使用网络',\n NETWORK_LOADING: '浏览器正在下载数据',\n NETWORK_NO_SOURCE: '未找到音频/视频来源',\n MEDIA_ERR_ABORTED: '取回过程被用户中止',\n MEDIA_ERR_NETWORK: '网络错误',\n MEDIA_ERR_DECODE: '解码错误',\n MEDIA_ERR_SRC_NOT_SUPPORTED: '不支持的音频/视频格式',\n REPLAY: '重播',\n ERROR: '网络连接似乎出现了问题',\n PLAY_TIPS: '播放',\n PAUSE_TIPS: '暂停',\n PLAYNEXT_TIPS: '下一集',\n DOWNLOAD_TIPS: '下载',\n ROTATE_TIPS: '旋转',\n RELOAD_TIPS: '重新载入',\n FULLSCREEN_TIPS: '进入全屏',\n EXITFULLSCREEN_TIPS: '退出全屏',\n CSSFULLSCREEN_TIPS: '进入样式全屏',\n EXITCSSFULLSCREEN_TIPS: '退出样式全屏',\n TEXTTRACK: '字幕',\n PIP: '画中画',\n SCREENSHOT: '截图',\n LIVE: '正在直播',\n OFF: '关闭',\n OPEN: '开启',\n MINI_DRAG: '点击按住可拖动视频',\n MINISCREEN: '小屏幕',\n REFRESH_TIPS: '请试试',\n REFRESH: '刷新',\n FORWARD: '快进中',\n LIVE_TIP: '直播'\n }\n}\n","import Player from './player'\nimport Plugin from './plugin/plugin'\nimport BasePlugin from './plugin/basePlugin'\nimport * as Events from './events'\nimport STATE_CLASS from './stateClassMap'\nimport I18N from './lang/i18n'\nimport Errors from './error'\nimport Sniffer from './utils/sniffer'\nimport Util from './utils/util'\nimport './index.scss'\n\nimport defaultPreset from './presets/default'\n\nclass PresetPlayer extends Player {\n static defaultPreset = defaultPreset;\n static Util = Util;\n static Sniffer = Sniffer\n static Errors = Errors\n static Events = Events\n static Plugin = Plugin\n static BasePlugin = BasePlugin\n static I18N = I18N\n static STATE_CLASS = STATE_CLASS\n}\n\nexport default PresetPlayer\n"],"names":["has","Object","prototype","hasOwnProperty","prefix","Events","EE","fn","context","once","this","addListener","emitter","event","TypeError","listener","evt","_events","push","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","names","events","name","call","slice","getOwnPropertySymbols","concat","listeners","handlers","i","l","length","ee","Array","listenerCount","emit","a1","a2","a3","a4","a5","args","len","arguments","removeListener","undefined","apply","j","on","removeAllListeners","off","prefixed","module","exports","XG_DEBUG_OPEN","window","location","href","indexOf","STYLE","info","error","warn","XGTAG","XG_DEBUG","config","debug","logInfo","message","_console","_len","optionalParams","_key","console","log","logWarn","_console2","_len2","_key2","logError","_console3","_fun","_len3","_key3","XgplayerTimeRange","bufferedList","_classCallCheck","_createClass","key","value","index","start","end","get","util","checkIsIn","list","isObject","type","_typeof","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","useRAF","requestAnimationFrame","invokeFunc","time","thisArg","startTimer","pendingFunc","cancelAnimationFrame","setTimeout","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","Date","now","trailingEdge","timeSinceLastInvoke","timeWaiting","Math","min","remainingWait","debounced","isInvoking","max","cancel","id","clearTimeout","cancelTimer","flush","pending","createDom","el","tpl","attrs","cname","dom","document","createElement","className","innerHTML","keys","forEach","item","setAttribute","createDomFromHtml","html","classname","doc","children","addClass","err","hasClass","some","classList","e","orgClassName","getAttribute","match","RegExp","replace","split","add","removeClass","remove","reg","toggleClass","classNames","_arguments","_loop","typeOf","map","join","findDom","sel","querySelector","getElementById","getCss","currentStyle","defaultView","getComputedStyle","padStart","str","pad","charstr","String","maxlen","ceil","chars","r","substring","format","isNaN","round","hour","floor","minute","second","touches","touch","changedTouches","clientX","clientY","offsetX","pageX","target","offsetLeft","offsetY","pageY","offsetTop","_target","srcElement","obj","toString","deepCopy","dst","src","Node","deepMerge","_dst$key","_toConsumableArray","getBgImage","url","backgroundImage","a","copyDom","nodeType","back","tagName","attributes","node","setInterval","eventName","intervalFunc","frequency","_interval","bind","clearInterval","fun","_timers","splice","clearAllTimers","_timerIds","createImgBtn","imgUrl","width","height","w","h","unit","btn","style","every","parseFloat","trim","backgroundSize","margin","Hex2RGBA","hex","alpha","rgb","test","sixHex","kw","parseInt","getFullScreenEl","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","checkIsFunction","checkIsObject","hide","display","show","isUndefined","val","isNotNull","setStyleFromCsstext","text","arr","filterStyleFromText","_cssText","cssText","styleArr","ret","remain","getStyleFromCsstext","preloadImg","onload","onerror","img","Image","stopPropagation","cancelable","preventDefault","scrollTop","pageYOffset","documentElement","body","scrollLeft","pageXOffset","checkTouchSupport","getBuffered2","vbuffered","maxHoleDuration","buffered","sort","b","diff","buffered2","buf2len","buf2end","getEventPos","zoom","x","y","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","getHostFromUrl","results","domain","frameId","mozCancelAnimationFrame","cancelRequestAnimationFrame","isMSE","video","HTMLMediaElement","currentSrc","generateSessionId","did","d","getTime","performance","uuid","c","random","createEvent","Event","initEvent","adjustTimeByDuration","duration","isEnded","createPositionBar","root","appendChild","VERSION_REG","H264_MIMETYPES","sniffer","device","os","isPc","browser","navigator","ua","userAgent","toLowerCase","ie","firefox","chrome","opera","safari","filter","isWindowsPhone","isSymbian","isAndroid","isFireFox","isTablet","isPhone","isIpad","isIos","osVersion","_match","exec","version","isWeixin","toLocaleLowerCase","isSupportMP4","isSupport","mime","supportResult","canPlayType","isHevcSupported","MediaSource","isTypeSupported","probeConfigSupported","defaults","supported","smooth","powerEfficient","Promise","resolve","mediaCapabilities","decodingInfo","videoConfig","audioConfig","audio","videoSupported","contentType","audioSupported","ERROR_TYPE_MAP","ERROR_MAP","Errors","player","errorInfo","errorType","errorCode","errorMessage","originError","ext","mediaError","ERROR_TYPES","i18n","media","currentTime","ended","_player$media","readyState","networkState","_errc","code","playerVersion","stack","host","Util","ex","msg","PLAY","PLAYING","ENDED","PAUSE","ERROR","SEEKING","SEEKED","TIME_UPDATE","WAITING","CANPLAY","DURATION_CHANGE","VOLUME_CHANGE","LOADED_DATA","RATE_CHANGE","PROGRESS","LOAD_START","EMPTIED","PLAYER_FOCUS","PLAYER_BLUR","READY","URL_NULL","AUTOPLAY_STARTED","AUTOPLAY_PREVENTED","COMPLETE","REPLAY","DESTROY","URL_CHANGE","DOWNLOAD_SPEED_CHANGE","FULLSCREEN_CHANGE","CSS_FULLSCREEN_CHANGE","MINI_STATE_CHANGE","DEFINITION_CHANGE","AFTER_DEFINITION_CHANGE","VIDEO_RESIZE","PIP_CHANGE","ROTATE","SCREEN_SHOT","PLAYNEXT","SHORTCUT","XGLOG","USER_ACTION","RESET","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","defaultPlaybackRate","autoplayMuted","attachVideoEvents","middlewares","_this2","_this3","_this4","_evHandlers","funName","charAt","toUpperCase","_defineProperty","addEventListener","_this5","removeEventListener","urls","_this6","removeAttribute","load","_c","_videoSourceCount","_eHandler","_sourceError","removeChild","_e","k","pause","detachVideoEvents","set","play","range","isTrue","_buffered","crossOrigin","defaultMuted","rate","Infinity","played","preload","seekable","seeking","onWaiting","_detachSourceEvents","_attachSourceEvents","vol","data","_get2","_get","_getPrototypeOf","_get3","_get4","_get5","_len4","_key4","INDEXDB","mydb","db","ojstore","keypath","indexedDB","webkitindexedDB","IDBKeyRange","webkitIDBKeyRange","myDB","self","request","open","onsuccess","onupgradeneeded","transaction","objectStoreNames","contains","createObjectStore","keyPath","deleteDatabase","close","storename","store","objectStore","put","delete","clear","FULLSCREEN_EVENTS","GET_FULLSCREEN_API","EXIT_FULLSCREEN_API","PLATER_ID","callHandler","handler","next","then","hook","hookName","preset","pre","__hooks","_preset$pre","pluginName","_this$__hooks$hookNam","preRet","isContinue","catch","useHooks","removeHooks","usePluginHooks","plugins","plugin","removePluginHooks","hooksDescriptor","instance","presetHooks","defineProperty","delHooksDescriptor","runHooks","_len5","_key5","_obj$__hooks$hookName","showErrorMsg","BasePlugin","beforeCreate","__args","__events","__onceEvents","playerConfig","__init","constructor","logger","lang","i18nKeys","domEventType","isArray","_this$player","res","action","params","nParams","_objectSpread","emitUserAction","registerPlugin","getPlugin","offAll","destroy","unRegisterPlugin","Obj","Element","matches","proto","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","closest","element","selector","parentNode","_delegate","useCapture","listenerFn","delegateTarget","delegate_1","elements","querySelectorAll","ROOT_TYPES","CONTROLS","ROOT","POSITIONS","ROOT_LEFT","ROOT_RIGHT","ROOT_TOP","CONTROLS_LEFT","CONTROLS_RIGTH","CONTROLS_RIGHT","CONTROLS_CENTER","isUrl","createIcon","icon","attr","newIcon","tag","registerIconsObj","iconsConfig","_icons","icons","orgIcon","class","mergeIconClass","mergeIconAttr","Plugin","_BasePlugin","__delegates","_parent","_el","parent","registerIcons","langText","textConfig","defaultTexConfig","registerLanguageTexts","renderStr","render","Error","insert","setAttr","setStyle","__registerChildren","_children","_plugin","checkChildren","langKey","langTextShow","qs","eventType","bindEL","delegate","unbindEL","htmlStr","eventHandle","isBubble","getPropertyValue","pdom","child","find","_this7","insertIdx","Number","isDomElement","coordinate","mode","curIdx","insertBefore","insertAdjacentHTML","capture","dels","ResizeObserver","entries","t","__runHandler","__handlers","observer","throttle","__trigger","observe","_pid","playerId","unobserve","disconnect","resizeObserver","pluginsManager","pluginGroup","init","cgid","_pluginInfoId","closeResizeObserver","resize","addObserver","isUserActive","_player","_originalOptions","_plugins","checkPlayerRoot","_keys","_p","formatPluginInfo","PLUFGIN","checkPluginIfExits","getRootByConfig","_pConfig","position","lazyRegister","lazyPlugin","timeout","race","loader","__esModule","default","register","reject","originalOptions","isSupported","codecType","disable","defaultConfig","unRegister","_instance","afterCreate","__destroy","deletePlugin","getPlugins","findPlugin","cName","beforeInit","retPromise","prevTask","_loadingPlugins","all","pluginsRet","pName","beforePlayerInit","afterInit","afterPlayerInit","setLang","updateLang","reRender","_pList","onPluginsReady","setCurrentUserActive","isActive","getCurrentUseActiveId","unObserver","_i","_Object$keys","_isUseActive","isUseActive","STATE_CLASS","DEFAULT","DEFAULT_SKIN","ENTER","PAUSED","LOADING","NO_START","ACTIVE","INACTIVE","FULLSCREEN","CSS_FULLSCREEN","ROTATE_FULLSCREEN","PARENT_ROTATE_FULLSCREEN","PARENT_FULLSCREEN","INNER_FULLSCREEN","NO_CONTROLS","FLEX_CONTROLS","CONTROLS_FOLLOW","CONTROLS_AUTOHIDE","TOP_BAR_AUTOHIDE","NOT_ALLOW_AUTOPLAY","PC","MOBILE","MINI","getDefaultConfig","nullUrlStart","fluid","fitVideoSize","videoFillMode","isLive","videoInit","poster","isMobileSimulateMode","execBeforePluginsCall","allowSeekAfterEnded","enableContextmenu","closeVideoClick","closeVideoDblclick","closePlayerBlur","closeDelayBlur","leavePlayerTime","closePlayVideoFocus","closePauseVideoFocus","closeFocusVideoFocus","closeControlsBlur","topBarAutoHide","startTime","seekedStatus","miniprogress","disableSwipeHandler","enableSwipeHandler","ignores","whitelist","inactive","language","marginControls","fullscreenTarget","screenShot","rotate","pip","download","mini","cssFullscreen","keyShortcut","presets","definition","customDuration","timeOffset","thumbnail","isHideTips","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","PlAYER_HOOKS","REAL_TIME_SPEED","AVG_SPEED","Player","_MediaProxy","_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","_state","isError","isSeeking","isCanplay","rotateDeg","isRotateFullscreen","_cssfullscreenEl","curDefinition","_orgCss","_videoHeight","_videoWidth","_accPlayed","acc","loopAcc","innerContainer","topBar","__i18n","database","Database","_onceSeekCanplay","_isPauseBeforeSeek","_initDOM","_possibleConstructorReturn","_this$config2$definit","defaultDefinitionObj","defaultDefinition","_bindEvents","_registerPresets","_registerPlugins","getInitDefinition","setState","onReady","hasStart","state","vid","line","handle","_initBaseDoms","XgVideoProxy","_nVideo","_root","_this$config3","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","_getRootByPosition","removedFromConfig","deregister","removePluginFromConfig","_this8","_startInit","fileName","lineNumber","_this9","_src","curTime","isPaused","_canplay","_this10","playPromise","onError","_errorTimer","_this11","_this12","status","_this13","_this$config4","isSeekedPlay","_status","_this14","_this$config5","_this15","bitrate","switchURL","seamless","reloadFunc","_this16","clsList","mediaPause","cls","_this17","unregisterPlugins","isResetConfig","resetState","pn","de","_this18","updateAcc","_unbindEvents","exitFullscreen","cList","_this19","onPlay","_this20","cur","rootClass","pClassName","_orgPCss","webkitRequestFullscreen","ALLOW_KEYBOARD_INPUT","fullscreenEnabled","webkitSupportsFullscreen","webkitEnterFullscreen","exitRotateFullscreen","webkitExitFullScreen","_class","_this$config$fullscre","useCssFullscreen","_this$config$fullscre2","setRotateDeg","deg","orientation","delay","onFocus","onBlur","_this21","_ref","_ref$autoHide","_ref$delay","_ref2","_ref2$ignorePaused","_this22","_this23","endType","_at","pos","rvH","_transform","_tx","_ty","transform","webkitTransform","_this24","setConfig","_this25","_this26","_this$media","videoWidth","videoHeight","_this$config6","containerSize","getBoundingClientRect","controlsHeight","videoFit","fit","rWidth","rHeight","_style","paddingTop","videoScale","vWidth","vHeight","cWidth","cHeight","updateObjectPosition","objectPosition","newState","bool","_this27","curDef","targetDef","_this27$curDefinition","changeDefinition","total","dropped","corrupted","droppedRate","droppedDuration","getVideoPlaybackQuality","_quality","droppedVideoFrames","totalVideoFrames","corruptedVideoFrames","cumulateTime","_l","__url","posterUrl","update","isMuted","addInnerOP","descriptor","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","path","Poster","isEndedShow","hideCanplay","onTimeUpdate","AnimateMap","Start","autoPlayStart","onPlayPause","initIcons","onAutoplayStart","onPlayerReset","clickHandler","switchPausePlay","startPlay","PlaySvg","startPause","PauseSvg","isAnimate","endShow","addAnimate","seconds","switchStatus","isShowPause","isShowEnd","disableAnimate","animate","Enter","innerHtml","HTMLElement","barStr","logo","xgIconTips","textKey","isShow","MiniScreenIcon","getMini","exitMini","onClick","getStyleSize","num","measurements","measurementsLength","getSize","elem","getStyle","size","innerWidth","innerHeight","outerWidth","outerHeight","getZeroSize","offsetWidth","offsetHeight","isBorderBox","boxSizing","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderWidth","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","getTouch","dentifier","identifier","EVENTS","POST_START_EVENTS","mousedown","touchstart","pointerdown","Draggabilly","isEnabled","isDragging","isDown","downPoint","dragPoint","startPos","_handlerDom","_bindStartEvent","_startKey","_boundPointerEvents","onUp","positionDrag","webKitTransform","dragStart","dragMove","dragEnd","touchIdentifier","pointerId","dragCancel","pointer","_getPosition","maxY","maxX","setLeftTop","_bindPostStartEvents","_unbindPostStartEvents","presetInfo","moveVector","hasDragStarted","dragRealStart","_this$startPos","_dragPointerMove","dragX","dragY","checkContain","_unbindStartEvent","abs","axis","drag","grid","_getPositionCoord","_addTransformPosition","matrixValues","xIndex","translateX","translateY","styleSide","measure","parentSize","MiniScreen","isClose","scrollY","scrollHeight","lastStyle","isShowIcon","onCancelClick","onCenterClick","disableDrag","_draggabilly","isScrollSwitch","onScroll","PlayIcon","PauseIcon","MOUSE_EVENTS","mouseenter","mouseleave","mousemove","HOOKS","PCPlugin","_assertThisInitialize2","_this$playerConfig","_assertThisInitialize3","__canvas","closeVideoStopPropagation","_clickCount","clickTimer","switchPlayPause","_assertThisInitialize4","getFullscreen","initEvents","onVideoClick","onVideoDblClick","onContextmenu","returnValue","cancelBubble","_this$player2","TOUCHS","move","MOUSES","preventToucheDefault","Touche","_pos","moving","pressDelay","dbClickDelay","disablePress","disableDbClick","miniStep","needPreventDefault","pressIntrvalId","dbIntrvalId","_initEvent","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel","__clearPress","trigger","press","__clearDb","__setPress","__setDb","diffx","diffy","touchend","touchmove","ACTIONS","MobilePlugin","touche","getTouche","disableGesture","isStart","rect","_x","_y","scopeL","scopeR","scopeM1","scopeM","scopeM2","miniMoveStep","hideControlsActive","scope","checkScope","gestureY","gestureX","executeMove","endLastMove","resetSeekState","resetPos","changeAction","checkIsRootTarget","light","timer","seekTipIcon","SeekTipIcon","closedbClick","xgMask","initCustomStyle","registerThumbnail","onRootTouchMove","onRootTouchEnd","moveDuration","_this2$pos","eventsMap","pressend","click","doubleclick","disableActive","progressPlugin","progress","addCallBack","activeSeekNote","forward","usable","createThumbnail","timePreview","backgroundColor","color","disableTimeProgress","startPlugin","recover","mold","updateTime","updateBrightness","updateVolume","lastScope","seek","toFixed","hideControlsEnd","sendUseAction","focusVideoClick","dbClickHandler","pressRate","percent","updatePercent","isTouchingSeek","maxDarkness","isForward","focusHide","updateThumbnails","gradient","disableSeekIcon","miniYPer","darkness","isDisableTag","isContentEditable","Keyboard","isIgnoreUserActive","disableBodyTrigger","checkIsVisible","metaKey","altKey","ctrlKey","keyCode","isGlobalTrigger","checkCode","handleKeyCode","disableRootTrigger","extendkeyCodeMap","keyCodeMap","key1","seekStep","space","noBodyTarget","up","down","esc","mergekeyCodeMap","onKeydown","onBodyKeyDown","checkVisible","rec","bottom","isBodyTarget","flag","_time","curKeyCode","_this4$keyCodeMap$key","Loading","loadingIcon","TPL","styleKey","InnerList","fragments","_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","isPauseMoving","closeMoveSeek","isPlaying","onMoveStart","prePlayTime","isProgressMoving","progressBtn","_mouseDownHandlerHook","onMouseMove","onMouseUp","onMoveOnly","_assertThisInitialize5","onMoveEnd","_mouseUpHandlerHook","isEnter","_assertThisInitialize6","miniStartStep","_mouseMoveHandlerHook","_assertThisInitialize7","unlock","_this$pos","useable","__dragCallBacks","direc","_disableBlur","innerList","reset","outer","updateFocus","_initInner","isDragingSeek","isMobile","onTimeupdate","onCacheUpdate","onReset","onVideoResize","bindDomEvents","frags","boxShadow","_index","_mouseDownHandler","_mouseUpHandler","_mouseMoveHandler","onMouseDown","onMouseOver","onMouseOut","onBodyClick","pauseAutoHide","recoverAutoHide","isCloseClickSeek","realTime","endedDiff","rLeft","_this$root$getBoundin","offset","timeIcon","resetActive","notSeek","_end","bufferedPoint","thumbnailPlugin","controlsMode","Icon","_onMouseenter","_onMouseLeave","Play","_IconPlugin","btnClick","tipDom","changeLangTextKey","IconPlugin","TopBackIcon","screenBack","BackSVG","Fullscreen","rotateFullscreen","handleFullscreen","toggleFullScreen","tipsDom","needBackIcon","topBackIcon","_onOrientationChange","FullScreenSvg","ExitFullScreenSvg","getCssFullscreen","getRotateFullscreen","switchCallback","Time","isActiving","constrolsMode","createCenterTime","durationDom","timeDom","centerCurDom","centerDurDom","current","updateState","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","updateRotateDeg","innerRotate","clockwise","_styles","transformOrigin","times","factor","RotateSvg","PresentationMode","isPIPAvailable","isPip","exitPIP","requestPIP","showIcon","pMode","initPipEvents","switchPIP","pipIcon","PipIcon","pipIconExit","PipIconExit","leavePIPCallback","enterPIPCallback","pipWindow","pictureInPictureWindow","onWebkitpresentationmodechanged","webkitPresentationMode","checkWebkitSetPresentationMode","webkitSetPresentationMode","requestPictureInPicture","reason","exitPictureInPicture","pictureInPictureElement","pictureInPictureEnabled","disablePictureInPicture","webkitSupportsPresentationMode","PlayNextIcon","idx","urlList","nextHandler","playNext","Next","changeSrc","strFileName","strMimeType","blob","reader","defaultMime","mimeType","payload","anchor","myBlob","Blob","MozBlob","WebKitBlob","pop","ajax","XMLHttpRequest","responseType","response","send","msSaveBlob","dataUrlToBlob","saver","tempUiArr","Uint8Array","mx","charCodeAt","strUrl","parts","binData","atob","decodeURIComponent","uiArr","winMode","URL","revokeObjectURL","confirm","f","createObjectURL","btoa","encodeURIComponent","FileReader","readAsDataURL","Download","isLock","getAbsoluteURL","downloadUtil","DownloadSvg","div","ScreenShot","screenshotIcon","initSize","fitVideo","onClickBtn","filename","saveLink","initMouseEvent","dispatchEvent","canvas","canvasCtx","getContext","imageSmoothingEnabled","imageSmoothingQuality","shot","saveScreenShot","option","quality","createCanvas","dx","dy","dw","dh","mediaRatio","canvasRatio","sw","sh","drawImage","toDataURL","OptionList","onItemClick","renderItemList","_delegates","attrKeys","selected","showText","changeCallback","curSelected","getAttrObj","LIST_TYPES","TOGGLE_MODES","IS_MOBILE","OptionsIcon","switchActiveState","toggleMode","toggle","listType","enterType","isIcons","curValue","hidePortrait","optionsList","activeEvent","onEnter","onLeave","onIconClick","_isIcons","focusAwhile","curItem","changeCurrentText","isItemClickHide","getTextByLang","itemList","_maxH","maxHeight","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","findDot","updateDot","needShow","dot","showDot","deleteDot","del","parentElement","deleteAllDots","dotDoms","getElementsByTagName","updateAllDots","iSpots","ispot","getAllDotsDom","getDotDom","CALLBACK_MAP","dragmove","dragstart","dragend","mouseover","ProgressPreview","isHideThumbnailHover","isDrag","_curDot","onDotMouseLeave","blurDot","enableBlur","focusDot","disableBlur","videoPreview","videothumbnail","timeStr","handlerSpotClick","_event","transformTimeHook","setTimeContent","ispots","progressDot","initDotsAPI","extTextRoot","previewLine","timePoint","timeText","tipText","_hasThumnail","bindEvents","onMousemove","onMousedown","onMouseup","handlerPreviewClick","updatePosition","cwidth","isflex","lwidth","tWidth","_tt","textContent","updateLinePos","showTips","isFocusDots","defaultText","hideTips","updateTimeText","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","newConfig","scale","MiniProgress","MODES","nowTime","isSupportCanvas","DynamicBg","_frameCount","startFrameCount","renderOnTimeupdate","renderOnce","_isLoaded","_checkIfCanStart","_sVideo","checkVideoIsSupport","stop","videoPI","preTime","dynamicBg","frameRate","rwidth","rheight","pi","onLoadedData","canvasFilter","supportCanvasFilter","isInnerRender","webkitFilter","mask","addMask","background","maskBg","renderByPoster","_tVideo","HTMLVideoElement","flyVideo","_tagName","updateImg","_this$canvas$getBound","image","sourcePI","_this$canvas$getBound2","multiple","checkIsSupportCanvas","INFO","Stats","actionData","_getTime","_stats","stats","getStats","JSON","stringify","downloadUrl","link","disabled","timestamp","timeFormat","toISOString","_recordUserActions","_recordInfo","_downloadStats","profile","_infoProfile","_info","startMs","endMs","cat","dur","ph","tid","ts","_this$_stats","mediaElem","mediaInfo","raw","timestat","_getTimeStats","_getProfile","msgs","stat","traceEvents","GapJump","seekingEventReceived","hasPlayed","smallGapLimit","gapDetectionThreshold","_getIndex","jumpTo","jumpSize","isGapSmall","BROWSER_GAP_TOLERANCE","useGapJump","isSafari","end_type","video_postion","platform","onGapJump","threshold","bufferedInfo","_getBuffered","WaitingTimeoutJump","jumpCnt","jumpCntMax","useWaitingTimeoutJump","onJump","waitingTime","TestSpeed","speedList","speedListCache","speed","appendList","openSpeed","loadSize","testCnt","testTimeStep","testSpeedUrl","cnt","xhr","headers","Range","setRequestHeader","onreadystatechange","getResponseHeader","testSpeed","saveSpeedMax","shift","realTimeSpeed","updateSpeed","getSpeed","avgSpeed","_onRealSpeedChange","FpsDetect","_lastDecodedFrames","_currentStuckCount","_lastCheckPoint","_startTick","_stopTick","_timer","_checkDecodeFPS","tick","curDecodedFrames","hidden","enoughBuffer","stuckCount","reportFrame","currTime","curDecoded","_checkStuck","DefaultPreset","_this$plugins","_this$plugins2","_this$plugins3","simulateMode","contolsIcons","TimeIcon","FullScreen","RotateIcon","PlaybackRateIcon","DownLoadIcon","ScreenShotIcon","PIPIcon","layers","Miniscreen","Xglogger","Mobile","PresetPlayer","_Player"],"mappings":"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"}