xgplayer 3.0.22 → 3.0.23-beta.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/es/mediaProxy.js +1 -1
- package/es/player.d.ts +4 -0
- package/es/player.js +12 -4
- package/es/version.js +1 -1
- package/package.json +3 -3
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.min.js","sources":["../src/version.js","../src/utils/debug.js","../src/utils/xgplayerTimeRange.js","../src/utils/util.js","../src/error.js","../src/events.js","../../../node_modules/eventemitter3/index.js","../src/instManager.js","../src/lang/en.js","../src/lang/i18n.js","../src/utils/sniffer.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/player.js","../src/plugins/common/iconTools.js","../src/plugins/common/iconPlugin.js","../src/plugins/cssFullScreen/index.js","../src/plugins/fullscreen/backicon.js","../src/plugins/fullscreen/index.js","../src/plugins/play/index.js","../src/plugins/progress/innerList.js","../src/plugins/progress/index.js","../src/plugins/time/index.js","../src/plugins/volume/index.js","../src/plugins/logger/index.js","../src/plugins/replay/index.js","../src/plugins/poster/index.js","../src/plugins/start/index.js","../src/plugins/enter/index.js","../src/plugins/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/time/timesegments.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/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":["/**\n * @type {string}\n * */\nexport default __VERSION__\n","\nconst XG_DEBUG_OPEN = typeof (window) !== 'undefined' && window.location && window.location.href.indexOf('xgplayerdebugger=1') > -1\n\nconst STYLE = {\n info: 'color: #525252; background-color: #90ee90;',\n error: 'color: #525252; background-color: red;',\n warn: 'color: #525252; background-color: yellow; '\n}\n\nconst XGTAG = '%c[xgplayer]'\n\nconst XG_DEBUG = {\n config: {\n debug: XG_DEBUG_OPEN ? 3 : 0\n },\n\n logInfo: function (message, ...optionalParams) {\n this.config.debug >= 3 && console.log(XGTAG, STYLE.info, message, ...optionalParams)\n },\n\n logWarn: function (message, ...optionalParams) {\n this.config.debug >= 1 && console.warn(XGTAG, STYLE.warn, message, ...optionalParams)\n },\n\n logError: function (message, ...optionalParams) {\n if (this.config.debug < 1) {\n return\n }\n const _fun = this.config.debug >= 2 ? 'trace' : 'error'\n console[_fun](XGTAG, STYLE.error, message, ...optionalParams)\n }\n}\n\nfunction bindDebug (player) {\n player.logInfo = XG_DEBUG.logInfo.bind(player)\n player.logWarn = XG_DEBUG.logWarn.bind(player)\n player.logError = XG_DEBUG.logError.bind(player)\n}\n\nexport {\n XG_DEBUG as default,\n bindDebug\n}\n","export default class XgplayerTimeRange {\n constructor (bufferedList) {\n this.bufferedList = bufferedList\n }\n\n start (index) {\n return this.bufferedList[index].start\n }\n\n end (index) {\n return this.bufferedList[index].end\n }\n\n get length () {\n return this.bufferedList.length\n }\n}\n","import XG_DEBUG from './debug'\nimport XgplayerTimeRange from './xgplayerTimeRange'\nconst util = {}\n\n/**\n *\n * @param { string } el\n * @param { string } [tpl=]\n * @param { {[propName: string]: any }} [attrs={}]\n * @param { string } [cname='']\n * @returns { HTMLElement | null }\n */\nutil.createDom = function (el = 'div', tpl = '', attrs = {}, cname = '') {\n const dom = document.createElement(el)\n dom.className = cname\n dom.innerHTML = tpl\n Object.keys(attrs).forEach(item => {\n const key = item\n const value = attrs[item]\n if (el === 'video' || el === 'audio' || el === 'live-video') {\n if (value) {\n dom.setAttribute(key, value)\n }\n } else {\n dom.setAttribute(key, value)\n }\n })\n return dom\n}\n\n/**\n *\n * @param { string } html\n * @param { {[propName: string]: any} } [attrs={}]\n * @param { string } [classname=\"\"]\n * @returns { HTMLElement | null }\n */\nutil.createDomFromHtml = function (html, attrs = {}, classname = '') {\n try {\n let doc = document.createElement('div')\n doc.innerHTML = html\n let dom = doc.children\n doc = null\n if (dom.length > 0) {\n dom = dom[0]\n classname && util.addClass(dom, classname)\n if (attrs) {\n Object.keys(attrs).forEach(key => {\n dom.setAttribute(key, attrs[key])\n })\n }\n return dom\n }\n return null\n } catch (err) {\n XG_DEBUG.logError('util.createDomFromHtml', err)\n return null\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { boolean }\n */\nutil.hasClass = function (el, className) {\n if (!el || !className) {\n return false\n }\n try {\n return Array.prototype.some.call(el.classList, item => item === className)\n } catch (e) {\n const orgClassName = el.className && typeof el.className === 'object' ? el.getAttribute('class') : el.className\n return orgClassName && !!orgClassName.match(new RegExp('(\\\\s|^)' + className + '(\\\\s|$)'))\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.addClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.add(item)\n })\n } catch (e) {\n if (!util.hasClass(el, className)) {\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class') + ' ' + className)\n } else {\n el.className += ' ' + className\n }\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.removeClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.remove(item)\n })\n } catch (e) {\n if (util.hasClass(el, className)) {\n className.split(/\\s+/g).forEach(item => {\n const reg = new RegExp('(\\\\s|^)' + item + '(\\\\s|$)')\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class').replace(reg, ' '))\n } else {\n el.className = el.className.replace(reg, ' ')\n }\n })\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.toggleClass = function (el, className) {\n if (!el) {\n return\n }\n\n className.split(/\\s+/g).forEach(item => {\n if (util.hasClass(el, item)) {\n util.removeClass(el, item)\n } else {\n util.addClass(el, item)\n }\n })\n}\n\n/**\n *\n * @param { string | Object } args0\n * @param { string } [className]\n * @returns { string }\n */\nutil.classNames = function () {\n const classname = []\n for (let i = 0; i < arguments.length; i++) {\n if (util.typeOf(arguments[i]) === 'String') {\n // classname += `${arguments[i]}`\n classname.push(arguments[i])\n } else if (util.typeOf(arguments[i]) === 'Object') {\n Object.keys(arguments[i]).map(key => {\n if (arguments[i][key]) {\n // classname += key\n classname.push(key)\n }\n })\n }\n // if (i < arguments.length - 1) {\n // classname += ' '\n // }\n }\n return classname.join(' ')\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } sel\n * @returns { HTMLElement }\n */\nutil.findDom = function (el = document, sel) {\n let dom\n // fix querySelector IDs that start with a digit\n // https://stackoverflow.com/questions/37270787/uncaught-syntaxerror-failed-to-execute-queryselector-on-document\n try {\n dom = el.querySelector(sel)\n } catch (e) {\n XG_DEBUG.logError('util.findDom', e)\n if (sel.indexOf('#') === 0) {\n dom = el.getElementById(sel.slice(1))\n }\n }\n return dom\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } key\n * @returns { any }\n */\nutil.getCss = function (dom, key) {\n return dom.currentStyle ? dom.currentStyle[key] : document.defaultView.getComputedStyle(dom, false)[key]\n}\n\nutil.padStart = function (str, length, pad) {\n const charstr = String(pad)\n const len = length >> 0\n let maxlen = Math.ceil(len / charstr.length)\n const chars = []\n const r = String(str)\n while (maxlen--) {\n chars.push(charstr)\n }\n return chars.join('').substring(0, len - r.length) + r\n}\n\n/**\n *\n * @param { number } time\n * @returns { string }\n */\nutil.format = function (time) {\n if (window.isNaN(time)) {\n return ''\n }\n time = Math.round(time)\n const hour = util.padStart(Math.floor(time / 3600), 2, 0)\n const minute = util.padStart(Math.floor((time - hour * 3600) / 60), 2, 0)\n const second = util.padStart(Math.floor((time - hour * 3600 - minute * 60)), 2, 0)\n return (hour === '00' ? [minute, second] : [hour, minute, second]).join(':')\n}\n\n/**\n *\n * @param { Object } e\n * @returns { Object }\n */\nutil.event = function (e) {\n if (e.touches) {\n const touch = e.touches[0] || e.changedTouches[0]\n e.clientX = touch.clientX || 0\n e.clientY = touch.clientY || 0\n e.offsetX = touch.pageX - touch.target.offsetLeft\n e.offsetY = touch.pageY - touch.target.offsetTop\n }\n e._target = e.target || e.srcElement\n}\n\n/**\n *\n * @param { any } obj\n * @returns { string }\n */\nutil.typeOf = function (obj) {\n // eslint-disable-next-line no-lookahead-lookbehind-regexp/no-lookahead-lookbehind-regexp\n return Object.prototype.toString.call(obj).match(/([^\\s.*]+)(?=]$)/g)[0]\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepCopy = function (dst, src) {\n if (util.typeOf(src) === 'Object' && util.typeOf(dst) === 'Object') {\n Object.keys(src).forEach(key => {\n // eslint-disable-next-line no-undef\n if (util.typeOf(src[key]) === 'Object' && !(src[key] instanceof Node)) {\n if (dst[key] === undefined || dst[key] === undefined) {\n dst[key] = src[key]\n } else {\n util.deepCopy(dst[key], src[key])\n }\n } else if (util.typeOf(src[key]) === 'Array') {\n dst[key] = util.typeOf(dst[key]) === 'Array' ? dst[key].concat(src[key]) : src[key]\n } else {\n dst[key] = src[key]\n }\n })\n return dst\n }\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepMerge = function (dst, src) {\n Object.keys(src).map(key => {\n if (util.typeOf(src[key]) === 'Array' && util.typeOf(dst[key]) === 'Array') {\n if (util.typeOf(dst[key]) === 'Array') {\n dst[key].push(...src[key])\n }\n } else if (util.typeOf(dst[key]) === util.typeOf(src[key]) && dst[key] !== null && util.typeOf(dst[key]) === 'Object' && !(src[key] instanceof window.Node)) {\n util.deepMerge(dst[key], src[key])\n } else {\n src[key] !== null && (dst[key] = src[key])\n }\n })\n return dst\n}\n\nutil.getBgImage = function (el) {\n // fix: return current page url when url is none\n const url = (el.currentStyle || window.getComputedStyle(el, null)).backgroundImage\n if (!url || url === 'none') {\n return ''\n }\n const a = document.createElement('a')\n a.href = url.replace(/url\\(\"|\"\\)/g, '')\n return a.href\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { HTMLElement | null }\n */\nutil.copyDom = function (dom) {\n if (dom && dom.nodeType === 1) {\n const back = document.createElement(dom.tagName)\n Array.prototype.forEach.call(dom.attributes, (node) => {\n back.setAttribute(node.name, node.value)\n })\n if (dom.innerHTML) {\n back.innerHTML = dom.innerHTML\n }\n return back\n } else {\n return ''\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @param { function } intervalFunc\n * @param { number } frequency\n */\nutil.setInterval = function (context, eventName, intervalFunc, frequency) {\n if (!context._interval[eventName]) {\n context._interval[eventName] = window.setInterval(intervalFunc.bind(context), frequency)\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @returns { void }\n */\nutil.clearInterval = function (context, eventName) {\n clearInterval(context._interval[eventName])\n context._interval[eventName] = null\n}\n\n/**\n *\n * @param { any } context\n * @param { function } fun\n * @param { number } time\n * @returns { number }\n */\nutil.setTimeout = function (context, fun, time) {\n if (!context._timers) {\n context._timers = []\n }\n const id = setTimeout(() => {\n fun()\n util.clearTimeout(context, id)\n }, time)\n context._timers.push(id)\n return id\n}\n\n/**\n *\n * @param { any } context\n * @param { number } id\n */\nutil.clearTimeout = function (context, id) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n for (let i = 0; i < _timers.length; i++) {\n if (_timers[i] === id) {\n _timers.splice(i, 1)\n clearTimeout(id)\n break\n }\n }\n } else {\n clearTimeout(id)\n }\n}\n\n/**\n *\n * @param { any } context\n */\nutil.clearAllTimers = function (context) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n _timers.map(item => {\n clearTimeout(item)\n })\n context._timerIds = []\n }\n}\n\n/**\n *\n * @param { string } name\n * @param { string } imgUrl\n * @param { number } [width]\n * @param { number } [height]\n * @returns { HTMLElement }\n */\nutil.createImgBtn = function (name, imgUrl, width, height) {\n const btn = util.createDom(`xg-${name}`, '', {}, `xgplayer-${name}-img`)\n btn.style.backgroundImage = `url(\"${imgUrl}\")`\n if (width && height) {\n let w, h, unit\n ['px', 'rem', 'em', 'pt', 'dp', 'vw', 'vh', 'vm', '%'].every((item) => {\n if (width.indexOf(item) > -1 && height.indexOf(item) > -1) {\n w = parseFloat(width.slice(0, width.indexOf(item)).trim())\n h = parseFloat(height.slice(0, height.indexOf(item)).trim())\n unit = item\n return false\n } else {\n return true\n }\n })\n btn.style.width = `${w}${unit}`\n btn.style.height = `${h}${unit}`\n btn.style.backgroundSize = `${w}${unit} ${h}${unit}`\n if (name === 'start') {\n btn.style.margin = `-${h / 2}${unit} auto auto -${w / 2}${unit}`\n } else {\n btn.style.margin = 'auto 5px auto 5px'\n }\n }\n return btn\n}\n\n/**\n *\n * @param { string } hex\n * @param { string | number } alpha\n * @returns { string }\n */\nutil.Hex2RGBA = function (hex, alpha) {\n const rgb = [] // 定义rgb数组\n // eslint-disable-next-line no-useless-escape\n if (/^\\#[0-9A-F]{3}$/i.test(hex)) {\n let sixHex = '#'\n hex.replace(/[0-9A-F]/ig, function (kw) {\n sixHex += kw + kw\n })\n hex = sixHex\n }\n if (/^#[0-9A-F]{6}$/i.test(hex)) {\n hex.replace(/[0-9A-F]{2}/ig, function (kw) {\n rgb.push(parseInt(kw, 16))\n })\n return `rgba(${rgb.join(',')}, ${alpha})`\n } else {\n return 'rgba(255, 255, 255, 0.1)'\n }\n}\n\n/**\n *\n * @returns { HTMLElement | null }\n */\nutil.getFullScreenEl = function () {\n return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsFunction = function (fun) {\n return fun && typeof fun === 'function'\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsObject = function (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * @param { HTMLElement }\n */\nutil.hide = function (dom) {\n dom.style.display = 'none'\n}\n\n/**\n * @param { HTMLElement }\n * @param { block | flex | inline-block | inline-flex } [display]\n */\nutil.show = function (dom, display) {\n dom.style.display = display || 'block'\n}\n\n/**\n *\n * @param { any } val\n * @returns { boolean }\n */\nutil.isUndefined = function (val) {\n if (typeof val === 'undefined' || val === null) {\n return true\n }\n}\n\nutil.isNotNull = function (val) {\n return !(val === undefined || val === null)\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } [text]\n * @returns\n */\nutil.setStyleFromCsstext = function (dom, text) {\n // dom.setAttribute(style, text)\n if (!text) {\n return\n }\n if (util.typeOf(text) === 'String') {\n const styleArr = text.replace(/\\s+/g, '').split(';')\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n dom.style[arr[0]] = arr[1]\n }\n }\n })\n } else {\n Object.keys(text).map(key => {\n dom.style[key] = text[key]\n })\n }\n}\n\n/**\n *\n * @param { string } key\n * @param { Array<any>} list\n * @returns { boolean }\n */\nfunction checkIsIn (key, list) {\n for (let i = 0, len = list.length; i < len; i++) {\n if (key.indexOf(list[i]) > -1) {\n return true\n }\n }\n return false\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { Array<string> } [list] attribute names to filter\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.filterStyleFromText = function (dom, list = ['width', 'height', 'top', 'left', 'bottom', 'right', 'position', 'z-index', 'padding', 'margin', 'transform']) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n const remain = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n if (checkIsIn(arr[0], list)) {\n ret[arr[0]] = arr[1]\n // dom.style[arr[0]] = 'initial'\n } else {\n remain[arr[0]] = arr[1]\n }\n }\n }\n })\n dom.setAttribute('style', '')\n Object.keys(remain).map(key => {\n // netStyle += `${key}: ${remain[key]};`\n dom.style[key] = remain[key]\n })\n return ret\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.getStyleFromCsstext = function (dom) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n ret[arr[0]] = arr[1]\n }\n }\n })\n return ret\n}\n\nutil.preloadImg = (url, onload = () => {}, onerror = () => {}) => {\n if (!url) {\n return\n }\n let img = new window.Image()\n img.onload = (e) => {\n img = null\n onload && onload(e)\n }\n img.onerror = (e) => {\n img = null\n onerror && onerror(e)\n }\n img.src = url\n}\n\nutil.stopPropagation = (e) => {\n if (e) {\n e.stopPropagation()\n }\n}\n\nutil.scrollTop = function () {\n return window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0\n}\n\nutil.scrollLeft = function () {\n return window.pageXOffset ||\n document.documentElement.scrollLeft ||\n document.body.scrollLeft ||\n 0\n}\n\nutil.checkTouchSupport = function () {\n return 'ontouchstart' in window\n}\n\nutil.getBuffered2 = (vbuffered, maxHoleDuration = 0.5) => { // ref: hls.js\n const buffered = []\n for (let i = 0; i < vbuffered.length; i++) {\n buffered.push({ start: vbuffered.start(i) < 0.5 ? 0 : vbuffered.start(i), end: vbuffered.end(i) })\n }\n buffered.sort(function (a, b) {\n const diff = a.start - b.start\n if (diff) {\n return diff\n } else {\n return b.end - a.end\n }\n })\n let buffered2 = []\n if (maxHoleDuration) {\n for (let i = 0; i < buffered.length; i++) {\n const buf2len = buffered2.length\n if (buf2len) {\n const buf2end = buffered2[buf2len - 1].end\n if ((buffered[i].start - buf2end) < maxHoleDuration) {\n if (buffered[i].end > buf2end) {\n buffered2[buf2len - 1].end = buffered[i].end\n }\n } else {\n buffered2.push(buffered[i])\n }\n } else {\n buffered2.push(buffered[i])\n }\n }\n } else {\n buffered2 = buffered\n }\n return new XgplayerTimeRange(buffered2)\n}\n\n/**\n * @description css中有zoom的时候,位移会等比缩放,但是元素的宽高不会等比缩放,所以通过该api做统一\n * https://bugs.chromium.org/p/chromium/issues/detail?id=429140#c8\n * @param {Event} e\n * @param {number} zoom\n * @returns\n */\nutil.getEventPos = function (e, zoom = 1) {\n if (e.touches && e.touches.length > 0) {\n e = e.touches[0]\n }\n return {\n x: e.x / zoom,\n y: e.y / zoom,\n clientX: e.clientX / zoom,\n clientY: e.clientY / zoom,\n offsetX: e.offsetX / zoom,\n offsetY: e.offsetY / zoom,\n pageX: e.pageX / zoom,\n pageY: e.pageY / zoom\n }\n}\n\nutil.requestAnimationFrame = function (callback) {\n const _fun = window.requestAnimationFrame ||\n // Older versions Chrome/Webkit\n window.webkitRequestAnimationFrame ||\n\n // Firefox < 23\n window.mozRequestAnimationFrame ||\n\n // opera\n window.oRequestAnimationFrame ||\n\n // ie\n window.msRequestAnimationFrame\n if (_fun) {\n return _fun(callback)\n }\n}\n\nutil.getHostFromUrl = function (url) {\n if (util.typeOf(url) !== 'String') {\n return ''\n }\n const results = url.split('/') // 以“/”进行分割\n let domain = ''\n if (results.length > 3 && results[2]) {\n domain = results[2]\n }\n return domain\n}\n\nutil.cancelAnimationFrame = function (frameId) {\n const _fun = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.cancelRequestAnimationFrame\n _fun && _fun(frameId)\n}\n\n/**\n * @desc Check whether it is MediaSource start\n * @param { HTMLVideoElement | HTMLAudioElement | HTMLElement } video\n * @returns { boolean }\n */\nutil.isMSE = function (video) {\n if (video.media) {\n video = video.media\n }\n if (!video || !(video instanceof HTMLMediaElement)) {\n return false\n }\n return /^blob/.test(video.currentSrc) || /^blob/.test(video.src)\n}\n\nutil.isBlob = function (url) {\n return typeof url === 'string' && /^blob/.test(url)\n}\n\n/**\n * @param { number } did\n * @returns { string }\n */\nutil.generateSessionId = function (did = 0) {\n let d = new Date().getTime()\n try {\n did = parseInt(did)\n } catch (e) {\n did = 0\n }\n d += did\n if (window.performance && typeof window.performance.now === 'function') {\n d += parseInt(window.performance.now()) // use high-precision timer if available\n }\n const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (d + Math.random() * 16) % 16 | 0\n d = Math.floor(d / 16)\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16)\n })\n return uuid\n}\n\nutil.createEvent = function (eventName) {\n let event\n if (typeof window.Event === 'function') {\n event = new Event(eventName)\n } else {\n event = document.createEvent('Event')\n event.initEvent(eventName, true, true)\n }\n return event\n}\n\n/**\n * @description Adjust currentTime according to duration, when ended is true and currentTime is less than duration, or\n * currentTime is greater than duration, return duration\n * @param { number } time\n * @param { number } duration\n * @param { boolean } isEnded\n * @returns { number } Adjusted time\n */\nutil.adjustTimeByDuration = function (time, duration, isEnded) {\n if (!duration || !time) {\n return time\n }\n if (time > duration || (isEnded && time < duration)) {\n return duration\n }\n return time\n}\n\nutil.createPositionBar = function (className, root) {\n const dom = util.createDom(\n 'xg-bar',\n '',\n { 'data-index': -1 },\n className\n )\n root.appendChild(dom)\n return dom\n}\n\nutil.getTransformStyle = function (pos = { x: 0, y: 0, scale: 1, rotate: 0 }, transformValue = '') {\n const styles = {\n scale: `${pos.scale || 1}`,\n translate: `${pos.x || 0}%, ${pos.y || 0}%`,\n rotate: `${pos.rotate || 0}deg`\n }\n const stylesKeys = Object.keys(styles)\n\n // 只复写Transform中已知的函数,对于其他函数不修改。解决全屏或者rotate插件执行时,对于镜像插件的影响\n stylesKeys.forEach((key) => {\n const reg = new RegExp(`${key}\\\\([^\\\\(]+\\\\)`, 'g') // reg match: TransformFunc(values)\n const fn = `${key}(${styles[key]})`\n if (reg.test(transformValue)) {\n reg.lastIndex = -1\n transformValue = transformValue.replace(reg, fn)\n } else {\n transformValue += `${fn} `\n }\n })\n return transformValue\n}\n\n/**\n * @description 角度换算\n * @param {number} val\n * @returns {number}\n */\nutil.convertDeg = function (val) {\n if (Math.abs(val) <= 1) {\n return val * 360\n }\n return val % 360\n}\n\nutil.getIndexByTime = function (time, segments) {\n const _len = segments.length\n let _index = -1\n if (_len < 1) {\n return _index\n }\n if (time <= segments[0].end || _len < 2) {\n _index = 0\n } else if (time > segments[_len - 1].end) {\n _index = _len - 1\n } else {\n for (let i = 1; i < _len; i++) {\n if (time > segments[i - 1].end && time <= segments[i].end){\n _index = i\n break\n }\n }\n }\n return _index\n}\nutil.getOffsetCurrentTime = function (currentTime, segments, index = -1) {\n let _index = -1\n if (index >= 0 && index < segments.length) {\n _index = index\n } else {\n _index = util.getIndexByTime(currentTime, segments)\n }\n if (_index < 0) {\n return -1\n }\n const _len = segments.length\n const { start, end, cTime, offset } = segments[_index]\n if (currentTime < start) {\n return cTime\n } else if (currentTime >= start && currentTime <= end) {\n return currentTime - offset\n } else if (currentTime > end && _index >= _len - 1) {\n return end\n }\n return -1\n}\n\n/**\n *\n * @param {*} offsetTime\n * @param {*} segments\n * @returns\n */\nutil.getCurrentTimeByOffset = function (offsetTime, segments) {\n let _index = -1\n if (!segments || segments.length < 0) {\n return offsetTime\n }\n for (let i = 0; i < segments.length; i++) {\n if (offsetTime <= segments[i].duration) {\n _index = i\n break\n }\n }\n if (_index !== -1) {\n const { start } = segments[_index]\n if (_index - 1 < 0) {\n return start + offsetTime\n } else {\n return start + (offsetTime - segments[_index - 1].duration)\n }\n }\n return offsetTime\n}\n\nfunction isObject (value) {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\nfunction debounce (func, wait, options) {\n let lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime\n\n let lastInvokeTime = 0\n let leading = false\n let maxing = false\n let trailing = true\n\n // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.\n const useRAF = (!wait && wait !== 0 && typeof window.requestAnimationFrame === 'function')\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n wait = +wait || 0\n if (isObject(options)) {\n leading = !!options.leading\n maxing = 'maxWait' in options\n maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n\n function invokeFunc (time) {\n const args = lastArgs\n const thisArg = lastThis\n\n lastArgs = lastThis = undefined\n lastInvokeTime = time\n result = func.apply(thisArg, args)\n return result\n }\n\n function startTimer (pendingFunc, wait) {\n if (useRAF) {\n window.cancelAnimationFrame(timerId)\n return window.requestAnimationFrame(pendingFunc)\n }\n return setTimeout(pendingFunc, wait)\n }\n\n function cancelTimer (id) {\n if (useRAF) {\n return window.cancelAnimationFrame(id)\n }\n clearTimeout(id)\n }\n\n function leadingEdge (time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time\n // Start the timer for the trailing edge.\n timerId = startTimer(timerExpired, wait)\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result\n }\n\n function remainingWait (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n const timeWaiting = wait - timeSinceLastCall\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting\n }\n\n function shouldInvoke (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait))\n }\n\n function timerExpired () {\n const time = Date.now()\n if (shouldInvoke(time)) {\n return trailingEdge(time)\n }\n // Restart the timer.\n timerId = startTimer(timerExpired, remainingWait(time))\n }\n\n function trailingEdge (time) {\n timerId = undefined\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time)\n }\n lastArgs = lastThis = undefined\n return result\n }\n\n function cancel () {\n if (timerId !== undefined) {\n cancelTimer(timerId)\n }\n lastInvokeTime = 0\n lastArgs = lastCallTime = lastThis = timerId = undefined\n }\n\n function flush () {\n return timerId === undefined ? result : trailingEdge(Date.now())\n }\n\n function pending () {\n return timerId !== undefined\n }\n\n function debounced (...args) {\n const time = Date.now()\n const isInvoking = shouldInvoke(time)\n\n lastArgs = args\n lastThis = this\n lastCallTime = time\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime)\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = startTimer(timerExpired, wait)\n return invokeFunc(lastCallTime)\n }\n }\n if (timerId === undefined) {\n timerId = startTimer(timerExpired, wait)\n }\n return result\n }\n debounced.cancel = cancel\n debounced.flush = flush\n debounced.pending = pending\n return debounced\n}\n\nfunction throttle (func, wait, options) {\n let leading = true\n let trailing = true\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n return debounce(func, wait, {\n leading,\n trailing,\n maxWait: wait\n })\n}\n\n/**\n * @returns { string }\n */\nfunction getLang () {\n let lang = (document.documentElement.getAttribute('lang') || navigator.language || 'zh-cn').toLocaleLowerCase()\n if (lang === 'zh-cn') {\n lang = 'zh'\n }\n return lang\n}\n\nfunction checkIsCurrentVideo (element, playerId, key) {\n if (!element) {\n return\n }\n const pid = element.getAttribute(key)\n if (pid && pid === playerId && (element.tagName === 'VIDEO' || element.tagName === 'AUDIO')) {\n return true\n }\n return false\n}\n\nexport {\n util as default,\n checkIsCurrentVideo,\n debounce,\n throttle,\n getLang\n}\n","// eslint-disable-next-line no-undef\nimport version from './version'\nimport Util from './utils/util'\n/**\n * @typedef { import ('./player').default } Player\n */\n\nconst ERROR_TYPE_MAP = {\n 1: 'media',\n 2: 'media',\n 3: 'media',\n 4: 'media',\n 5: 'media',\n 6: 'media'\n}\n\nconst ERROR_MAP = {\n 1: 5101,\n 2: 5102,\n 3: 5103,\n 4: 5104,\n 5: 5105,\n 6: 5106\n}\n\nconst ErrorTypes = {\n network: {\n code: 1\n },\n mse: {\n code: 2\n },\n parse: {\n code: 3\n },\n format: {\n code: 4\n },\n decoder: {\n code: 5\n },\n runtime: {\n code: 6\n },\n timeout: {\n code: 7\n },\n drm: {\n code: 8\n },\n ad: {\n code: 9\n },\n other: {\n code: 1000\n }\n}\n\n/**\n * @typedef { {\n * playerVersion: string,\n * currentTime: number,\n * duration: number,\n * ended: boolean,\n * readyState: number,\n * networkState: number,\n * src: any,\n * errorType: string,\n * errorCode: number,\n * message: string,\n * mediaError?: {\n * code: number,\n * message?: string\n * },\n * originError?: any,\n * url?: any,\n * host?: string,\n * [propName: string]: any\n * } } IError\n */\n\n/**\n * @type { IError }\n */\nclass Errors {\n /**\n *\n * @param { Player } player\n * @param { {\n * errorType: string,\n * errorCode: number,\n * errorMessage: string,\n * originError: any,\n * ext: { [propName: string]: any; }\n * } } errorInfo\n * @returns\n */\n constructor (player, errorInfo = { errorType: '', errorCode: 0, errorMessage: '', originError: '', ext: {}, mediaError: null }) {\n const ERROR_TYPES = player && player.i18n ? player.i18n.ERROR_TYPES : null\n if (player.media) {\n const mediaError = errorInfo.mediaError ? errorInfo.mediaError : (player.media.error || {})\n const { duration, currentTime, ended, src, currentSrc } = player\n const { readyState, networkState } = player.media\n let _errc = errorInfo.errorCode || mediaError.code\n if (ERROR_MAP[_errc]) {\n _errc = ERROR_MAP[_errc]\n }\n const r = {\n playerVersion: version,\n currentTime,\n duration,\n ended,\n readyState,\n networkState,\n src: src || currentSrc,\n errorType: errorInfo.errorType,\n errorCode: _errc,\n message: errorInfo.errorMessage || mediaError.message,\n mediaError,\n originError: errorInfo.originError ? errorInfo.originError.stack : '',\n host: Util.getHostFromUrl(src || currentSrc)\n }\n errorInfo.ext && Object.keys(errorInfo.ext).map(key => {\n r[key] = errorInfo.ext[key]\n })\n return r\n } else {\n if (arguments.length > 1) {\n const r = {\n playerVersion: version,\n domain: document.domain\n }\n const arr = ['errorType', 'currentTime', 'duration', 'networkState', 'readyState', 'src', 'currentSrc', 'ended', 'errd', 'errorCode', 'mediaError']\n for (let i = 0; i < arguments.length; i++) {\n r[arr[i]] = arguments[i]\n }\n r.ex = ERROR_TYPES ? (ERROR_TYPES[arguments[0]] || {}).msg : ''// 补充信息\n return r\n }\n }\n }\n}\n\nexport {\n Errors as default,\n ErrorTypes,\n ERROR_TYPE_MAP\n}\n","export const PLAY = 'play'\nexport const PLAYING = 'playing'\nexport const ENDED = 'ended'\nexport const PAUSE = 'pause'\nexport const ERROR = 'error'\nexport const SEEKING = 'seeking'\nexport const SEEKED = 'seeked'\nexport const TIME_UPDATE = 'timeupdate'\nexport const WAITING = 'waiting'\nexport const CANPLAY = 'canplay'\nexport const CANPLAY_THROUGH = 'canplaythrough'\nexport const DURATION_CHANGE = 'durationchange'\nexport const VOLUME_CHANGE = 'volumechange'\nexport const LOADED_DATA = 'loadeddata'\nexport const LOADED_METADATA = 'loadedmetadata'\nexport const RATE_CHANGE = 'ratechange'\nexport const PROGRESS = 'progress'\nexport const LOAD_START = 'loadstart'\nexport const EMPTIED = 'emptied'\nexport const STALLED = 'stalled'\nexport const SUSPEND = 'suspend'\nexport const ABORT = 'abort'\n\n// player events\nexport const BUFFER_CHANGE = 'bufferedChange'\nexport const PLAYER_FOCUS = 'focus'\nexport const PLAYER_BLUR = 'blur'\nexport const READY = 'ready'\nexport const URL_NULL = 'urlNull'\nexport const AUTOPLAY_STARTED = 'autoplay_started'\nexport const AUTOPLAY_PREVENTED = 'autoplay_was_prevented'\nexport const COMPLETE = 'complete'\nexport const REPLAY = 'replay'\nexport const DESTROY = 'destroy'\nexport const URL_CHANGE = 'urlchange'\nexport const DOWNLOAD_SPEED_CHANGE = 'download_speed_change'\nexport const LEAVE_PLAYER = 'leaveplayer'\nexport const ENTER_PLAYER = 'enterplayer'\nexport const LOADING = 'loading'\n\n// screen change evnets\nexport const FULLSCREEN_CHANGE = 'fullscreen_change'\nexport const CSS_FULLSCREEN_CHANGE = 'cssFullscreen_change'\nexport const MINI_STATE_CHANGE = 'mini_state_change'\n\nexport const DEFINITION_CHANGE = 'definition_change'\nexport const BEFORE_DEFINITION_CHANGE = 'before_definition_change'\nexport const AFTER_DEFINITION_CHANGE = 'after_definition_change'\n\n// transmuxer events\nexport const SEI_PARSED = 'SEI_PARSED'\n\nexport const RETRY = 'retry'\n\n// 容器宽高变化\nexport const VIDEO_RESIZE = 'video_resize'\n\n// picture-in-picture状态变化\nexport const PIP_CHANGE = 'pip_change'\n\n// rotate change\nexport const ROTATE = 'rotate'\n\n// screenShot\nexport const SCREEN_SHOT = 'screenShot'\n\n// play next\nexport const PLAYNEXT = 'playnext'\n\nexport const SHORTCUT = 'shortcut'\n\nexport const XGLOG = 'xglog'\n\nexport const USER_ACTION = 'user_action'\n\nexport const RESET = 'reset'\n\nexport const SOURCE_ERROR = 'source_error'\n\nexport const SOURCE_SUCCESS = 'source_success'\n\nexport const SWITCH_SUBTITLE = 'switch_subtitle'\n\nexport const VIDEO_EVENTS = [\n 'play',\n 'playing',\n 'ended',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'timeupdate',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'durationchange',\n 'volumechange',\n 'loadeddata',\n 'loadedmetadata',\n 'ratechange',\n 'progress',\n 'loadstart',\n 'emptied',\n 'stalled',\n 'suspend',\n 'abort',\n 'lowdecode'\n]\n\nexport const STATS_EVENTS = {\n STATS_INFO: 'stats_info',\n STATS_DOWNLOAD: 'stats_download',\n STATS_RESET: 'stats_reset'\n}\n\nexport const FPS_STUCK = 'fps_stuck'","'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","import { EventEmitter } from 'eventemitter3'\n\n/**\n * @typedef { (Player) => ?boolean } IterateFunction\n */\n/**\n * @typedef { import('./player').default } Player\n */\n\n/**\n * global player instance memory\n * @type {{\n * [key:string]:\n * }}\n */\nconst store = {}\n\nlet instance = null\n/**\n * Design as a class so that can be inherited to enhance functionality\n */\nexport class InstManager extends EventEmitter {\n static getInstance () {\n instance ||= new InstManager()\n return instance\n }\n\n add (player) {\n if (!player) {\n return\n }\n store[player.playerId] = player\n\n // By default, the first one is active\n if (Object.keys(store).length === 1) {\n this.setActive(player.playerId, true)\n }\n }\n\n remove (player) {\n if (!player) {\n return\n }\n const isUserActive = player.isUserActive\n\n delete store[player.playerId]\n\n if (isUserActive) {\n // 暂时注释,有需求再打开\n // const keys = Object.keys(this.store)\n // if (keys.length > 0) {\n // this.setActive(keys[keys.length - 1], true)\n // }\n }\n }\n\n /**\n * @private\n * @param {IterateFunction} fn\n * @param {?boolean} endEarly\n */\n _iterate (fn, endEarly = false) {\n for (const key in store) {\n if (Object.prototype.hasOwnProperty.call(store, key)) {\n const player = store[key]\n\n if (endEarly) {\n if (fn(player)) {\n break\n }\n } else {\n fn(player)\n }\n }\n }\n }\n\n /**\n * @param {IterateFunction} fn\n */\n forEach (fn) {\n this._iterate(fn)\n }\n\n /**\n * Iterates over items of store, returning the first one\n * @param {IterateFunction} fn\n * @returns {Player}\n */\n find (fn) {\n let result = null\n\n this._iterate((player) => {\n const flag = fn(player)\n if (flag) {\n result = player\n }\n return flag\n }, true)\n\n return result\n }\n\n /**\n * @param {IterateFunction} fn\n * @returns {Player[]}\n */\n findAll (fn) {\n const results = []\n\n this._iterate((player) => {\n if (fn(player)) {\n results.push(player)\n }\n })\n\n return results\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n * @returns { number | null }\n */\n setActive (playerId, isActive = true) {\n if (!store[playerId]) {\n return\n }\n if (isActive) {\n this.forEach(inst => {\n if (playerId === inst.playerId) {\n inst.isUserActive = true\n inst.isInstNext = false\n } else {\n inst.isUserActive = false\n }\n })\n } else {\n store[playerId].isUserActive = isActive\n }\n return playerId\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | null }\n */\n getActiveId () {\n const keys = Object.keys(store)\n for (let i = 0; i < keys.length; i++) {\n const c = store[keys[i]]\n if (c && c.isUserActive) {\n return keys[i]\n }\n }\n return null\n }\n\n /**\n * 标记下一个实例\n * @param { number | string } playerId\n * @param { boolean } isNext\n * @returns { number | null }\n */\n setNext (playerId, isNext = true) {\n if (!store[playerId]) {\n return\n }\n if (isNext) {\n this.forEach(inst => {\n if (playerId === inst.playerId) {\n inst.isUserActive = false\n inst.isInstNext = true\n } else {\n inst.isInstNext = false\n }\n })\n } else {\n store[playerId].isInstNext = isNext\n }\n\n return playerId\n }\n}\n\n/**\n* Check whether there is a player instance in the current dom\n* @param {Element} root\n*/\nexport function checkPlayerRoot (root) {\n const keys = Object.keys(store)\n for (let i = 0; i < keys.length; i++) {\n const p = store[keys[i]]\n if (p.root === root) {\n return p\n }\n }\n return null\n}\n","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 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","/**\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 '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 isTizen = /(?:Tizen)/ig.test(ua) // Samsung Tizen TV\n const isWebOS = /(?:Web0S)/ig.test(ua) // LG TV\n const isAndroid = /(?:Android)/.test(ua)\n const isFireFox = /(?:Firefox)/.test(ua)\n const isIpad = /(?:iPad|PlayBook)/.test(ua) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)\n const isTablet =\n isIpad ||\n (isAndroid && !/(?:Mobile)/.test(ua)) ||\n (isFireFox && /(?:Tablet)/.test(ua))\n const isPhone = /(?:iPhone)/.test(ua) && !isTablet\n const isPc = !isPhone && !isAndroid && !isSymbian && !isTablet\n return {\n isTablet,\n isPhone,\n isIpad,\n isIos: isPhone || isIpad,\n isAndroid,\n isPc,\n isSymbian,\n isWindowsPhone,\n isFireFox,\n isTizen,\n isWebOS\n }\n },\n\n get osVersion () {\n if (typeof navigator === 'undefined') {\n return 0\n }\n const ua = navigator.userAgent\n let reg = ''\n // ios\n if (/(?:iPhone)|(?:iPad|PlayBook)/.test(ua)) {\n reg = VERSION_REG.ios\n // android\n } else {\n reg = VERSION_REG.android\n }\n const _match = reg ? reg.exec(ua) : []\n if (_match && _match.length >= 3) {\n const version = _match[2].split('.')\n return version.length > 0 ? parseInt(version[0]) : 0\n }\n return 0\n },\n\n get isWeixin () {\n if (typeof navigator === 'undefined') {\n return false\n }\n const reg = /(micromessenger)\\/([\\d.]+)/\n const match = reg.exec(navigator.userAgent.toLocaleLowerCase())\n if (match) {\n return true\n }\n return false\n },\n\n /**\n *\n * @returns {{\n * isSupport: boolean,\n * mime: string\n * }}\n */\n isSupportMP4 () {\n const result = {\n isSupport: false,\n mime: ''\n }\n if (typeof document === 'undefined') {\n return result\n }\n if (this.supportResult) {\n return this.supportResult\n }\n let a = document.createElement('video')\n if (typeof a.canPlayType === 'function') {\n H264_MIMETYPES.map((key) => {\n if (a.canPlayType(`video/mp4; codecs=\"${key}\"`) === 'probably') {\n result.isSupport = true\n result.mime += `||${key}`\n }\n })\n }\n this.supportResult = result\n a = null\n return result\n },\n\n /**\n * @description check is support MediaSource Extends\n * @param {string} [mime]\n * @returns { boolean }\n */\n isMSESupport (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n if (typeof MediaSource === 'undefined' || !MediaSource) return false\n try {\n return MediaSource.isTypeSupported(mime)\n } catch (error) {\n this._logger.error(mime, error)\n return false\n }\n },\n\n /**\n * Is HEVC Hardware decoding supported by current browser\n * @returns {boolean}\n */\n isHevcSupported () {\n if (typeof MediaSource === 'undefined' || !MediaSource.isTypeSupported) {\n return false\n }\n return (\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.1.6.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.2.4.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.3.E.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.4.10.L120.90\"')\n )\n },\n\n /**\n * @param { MediaDecodingConfiguration } info\n * @returns { Promise<MediaCapabilitiesDecodingInfo> }\n */\n probeConfigSupported (info) {\n const defaults = {\n supported: false,\n smooth: false,\n powerEfficient: false\n }\n if (!info || typeof navigator === 'undefined') {\n return Promise.resolve(defaults)\n }\n if (\n navigator.mediaCapabilities &&\n navigator.mediaCapabilities.decodingInfo\n ) {\n return navigator.mediaCapabilities.decodingInfo(info)\n } else {\n const videoConfig = info.video || {}\n const audioConfig = info.audio || {}\n try {\n const videoSupported = MediaSource.isTypeSupported(\n videoConfig.contentType\n )\n const audioSupported = MediaSource.isTypeSupported(\n audioConfig.contentType\n )\n\n return Promise.resolve({\n supported: videoSupported && audioSupported,\n smooth: false,\n powerEfficient: false\n })\n } catch (e) {\n return Promise.resolve(defaults)\n }\n }\n }\n}\n\nexport default sniffer\n","import EventEmitter from 'eventemitter3'\nimport Util from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Errors, { ERROR_TYPE_MAP } from './error'\nimport { URL_CHANGE, WAITING, VIDEO_EVENTS, SOURCE_ERROR, SOURCE_SUCCESS } from './events'\n/**\n * @typedef { import ('eventemitter3') } EventEmitter\n */\n/**\n * @typedef { {\n * duration: number,\n * currentTime: number,\n * muted: boolean,\n * defaultMuted: boolean,\n * volume: number,\n * playbackRate: number,\n * defaultPlaybackRate: number,\n * autoplay: boolean,\n * readonly paused: boolean,\n * readonly ended: boolean,\n * readonly networkState: number,\n * readonly readyState: number,\n * readonly seeking: boolean,\n * src: any,\n * play: Function,\n * pause: Function,\n * } } IMediaProxy\n */\n/**\n * @typedef { import ('./defaultConfig').IPlayerOptions } IPlayerOptions\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 /**\n * @param { IPlayerOptions } options\n */\n constructor (options) {\n super(options)\n /**\n * @type { boolean }\n * @private\n */\n this._hasStart = false\n /**\n * @type { number }\n * @private\n */\n this._currentTime = 0\n /**\n * @type { number }\n * @private\n */\n this._duration = 0\n /**\n * @type {{[propName: string]: any}}\n * @private\n */\n this._internalOp = {}\n /**\n * @type { boolean }\n * @private\n */\n this._lastMuted = false\n\n /**\n * @type {string}\n * 当前播放类型\n */\n this.vtype = 'MP4'\n\n /**\n * @type {number}\n * @private\n */\n this._rate = -1\n /**\n * @description 初始化时添加在video上的属性集合\n * @type { {[propName: string]: any } }\n */\n this.mediaConfig = Object.assign({}, {\n controls: false,\n autoplay: options.autoplay,\n playsinline: options.playsinline,\n 'x5-playsinline': options.playsinline,\n 'webkit-playsinline': options.playsinline,\n 'x5-video-player-fullscreen': options['x5-video-player-fullscreen'] || options.x5VideoPlayerFullscreen,\n 'x5-video-orientation': options['x5-video-orientation'] || options.x5VideoOrientation,\n airplay: options.airplay,\n 'webkit-airplay': options.airplay,\n tabindex: options.tabindex | 0,\n mediaType: options.mediaType || 'video',\n 'data-index': -1\n }, options.videoConfig, options.videoAttributes)\n /**\n * @description Compatible with WeChat webview\n * \"x5-playsinline' and 'x5-video-player-type' only one needs to exist\n * @doc https://x5.tencent.com/docs/video.html\n */\n const playerType = options['x5-video-player-type'] || options.x5VideoPlayerType\n if (Sniffer.isWeixin && Sniffer.os.isAndroid && playerType) {\n this.mediaConfig['x5-video-player-type'] = playerType\n delete this.mediaConfig.playsinline\n delete this.mediaConfig['webkit-playsinline']\n delete this.mediaConfig['x5-playsinline']\n }\n\n if (options.loop) {\n this.mediaConfig.loop = 'loop'\n }\n\n // Warning:一些移动端浏览器需要设置DOM属性,否则会导致非静音切换频地址后开播失败\n if (options.autoplayMuted && !Object.prototype.hasOwnProperty.call(this.mediaConfig, 'muted')) {\n this.mediaConfig.muted = true\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n */\n this.media =\n options.mediaEl instanceof HTMLMediaElement\n ? options.mediaEl\n : typeof options.mediaEl === 'function'\n ? options.mediaEl(this.mediaConfig)\n : 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 // Warning:一些移动端浏览器(Like Vivo)需要直接设置JS属性,否则会导致失效\n if (options.playsinline) {\n this.media.playsinline = true\n }\n\n /**\n * @private\n */\n this._interval = {}\n /**\n * @readonly\n */\n this.mediaEventMiddleware = {}\n this.attachVideoEvents()\n }\n\n /**\n * @description set middleware\n * @param { {[propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n setEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n this.mediaEventMiddleware[key] = middlewares[key]\n })\n }\n\n /**\n * @description remove middleware\n * @param { { [propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n removeEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n delete this.mediaEventMiddleware[key]\n })\n }\n\n /**\n * Add media eventListener to the video object\n * @param { any } [media]\n */\n attachVideoEvents (media = this.media) {\n if (!this._evHandlers) {\n /**\n * @private\n */\n this._evHandlers = VIDEO_EVENTS.map(eventKey => {\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.on(eventKey, this[funName])\n }\n\n return {\n [eventKey]: getVideoEventHandler(eventKey, this)\n }\n })\n }\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n media.addEventListener(eventKey, item[eventKey], false)\n })\n }\n\n /**\n * @description remove media eventListener from the video object\n * @param { any } [media]\n */\n detachVideoEvents (media = this.media) {\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n media.removeEventListener(eventKey, item[eventKey], false)\n })\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.off(eventKey, this[funName])\n }\n })\n\n this._evHandlers = null\n }\n\n /**\n * 针对source列表播放方式添加错误监听\n * @doc https://stackoverflow.com/questions/47557135/html5-detect-the-type-of-error-when-trying-to-load-a-video-using-a-source-elem\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n * @param { Array<{src: string, type: string }>} urls\n */\n _attachSourceEvents (video, urls) {\n video.removeAttribute('src')\n video.load()\n urls.forEach((item, index) => {\n this.media.appendChild(Util.createDom('source', '', {\n src: `${item.src}`,\n type: `${item.type || ''}`,\n 'data-index': index + 1\n }))\n })\n const _c = video.children\n if (!_c) {\n return\n }\n /**\n * @private\n */\n this._videoSourceCount = _c.length\n\n this._videoSourceIndex = _c.length\n\n this._vLoadeddata = (e) => {\n this.emit(SOURCE_SUCCESS, { src: e.target.currentSrc, host: Util.getHostFromUrl(e.target.currentSrc) })\n }\n\n /**\n * @private\n */\n let _eHandler = null\n\n for (let i = 0; i < this._evHandlers.length; i++) {\n if (Object.keys(this._evHandlers[i])[0] === 'error') {\n _eHandler = this._evHandlers[i]\n break\n }\n }\n // safari有些版本不是所有source都请求,导致单独使用_videoSourceIndex计算会报错\n !this._sourceError && (this._sourceError = (e) => {\n const _dIndex = parseInt(e.target.getAttribute('data-index'), 10)\n this._videoSourceIndex--\n if (this._videoSourceIndex === 0 || _dIndex >= this._videoSourceCount) {\n const _err = { code: 4, message: 'sources_load_error' }\n _eHandler ? _eHandler.error(e, _err) : this.errorHandler('error', _err)\n }\n const type = ERROR_TYPE_MAP[4]\n this.emit(SOURCE_ERROR, new Errors(this, {\n errorType: type,\n errorCode: 4,\n errorMessage: 'sources_load_error',\n mediaError: { code: 4, message: 'sources_load_error' },\n src: e.target.src\n }))\n })\n for (let i = 0; i < _c.length; i++) {\n _c[i].addEventListener('error', this._sourceError)\n }\n video.addEventListener('loadeddata', this._vLoadeddata)\n }\n\n /**\n * 移除source列表错误事件监听\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n */\n _detachSourceEvents (video) {\n const _c = video.children\n if (!_c || _c.length === 0 || !this._sourceError) {\n return\n }\n for (let i = 0; i < _c.length; i++) {\n _c[i].removeEventListener('error', this._sourceError)\n }\n while (_c.length > 0) {\n video.removeChild(_c[0])\n }\n this._vLoadeddata && video.removeEventListener('loadeddata', this._vLoadeddata)\n }\n\n /**\n * @description Media Error handler\n * @param { string } eventName\n */\n errorHandler (name, error = null) {\n if (this.media && (this.media.error || error)) {\n let _e = this.media.error || error\n const type = _e.code ? ERROR_TYPE_MAP[_e.code] : 'other'\n let message = _e.message\n if (!(this.media.currentSrc || this.media.srcObject)) {\n message = 'empty_src'\n _e = {\n code: 6,\n message\n }\n }\n this.emit(name, new Errors(this, {\n errorType: type,\n errorCode: _e.code,\n errorMessage: _e.message || '',\n mediaError: _e\n }))\n }\n }\n\n destroy () {\n if (this.media) {\n if (this.media.pause) {\n this.media.pause()\n this.media.muted = true\n }\n this.media.removeAttribute('src') // empty source\n this.media.load()\n }\n this._currentTime = 0\n this._duration = 0\n this.mediaConfig = null\n for (const k in this._interval) {\n if (Object.prototype.hasOwnProperty.call(this._interval, k)) {\n clearInterval(this._interval[k])\n this._interval[k] = null\n }\n }\n this.detachVideoEvents()\n this.media = null\n this.mediaEventMiddleware = {}\n this.removeAllListeners()\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media\n */\n get video () {\n return this.media\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media= xx\n */\n set video (media) {\n this.media = media\n }\n\n /**\n *\n * @returns { Promise<void> | null }\n */\n play () {\n const ret = this.media ? this.media.play() : null\n return ret\n }\n\n pause () {\n this.media && this.media.pause()\n }\n\n load () {\n this.media && this.media.load()\n }\n\n /**\n *\n * @param { string } type\n * @returns { boolean }\n */\n canPlayType (type) {\n return this.media ? this.media.canPlayType(type) : false\n }\n\n /**\n *\n * @param { any } [buffered]\n * @returns { Array<number> }\n */\n getBufferedRange (buffered) {\n const range = [0, 0]\n if (!this.media) {\n return range\n }\n if (!buffered) {\n buffered = this.media.buffered\n }\n const currentTime = this.media.currentTime\n if (buffered) {\n for (let i = 0, len = buffered.length; i < len; i++) {\n range[0] = buffered.start(i)\n range[1] = buffered.end(i)\n if (range[0] <= currentTime && currentTime <= range[1]) {\n break\n }\n }\n }\n if (range[0] - currentTime <= 0 && currentTime - range[1] <= 0) {\n return range\n } else {\n return [0, 0]\n }\n }\n\n /**\n * @type { boolean }\n * @description 设置/返回 自动播放属性\n */\n set autoplay (isTrue) {\n this.media && (this.media.autoplay = isTrue)\n }\n\n get autoplay () {\n return this.media ? this.media.autoplay : false\n }\n\n /**\n * @type { TimeRanges | null }\n * @description 返回当前缓冲的TimeRange对象集合\n */\n get buffered () {\n return this.media ? this.media.buffered : null\n }\n\n /**\n * @type { Array<{start: number, end: number}> | null}\n * @description 返回当前自定义的缓存列表\n */\n get buffered2 () {\n return this.media && this.media.buffered ? Util.getBuffered2(this.media.buffered) : null\n }\n\n /**\n * @type { {start: number, end: number} }\n */\n get bufferedPoint () {\n const ret = {\n start: 0,\n end: 0\n }\n if (!this.media) {\n return ret\n }\n const _buffered = this.media.buffered\n if (!_buffered || _buffered.length === 0) {\n return ret\n }\n for (let i = 0; i < _buffered.length; i++) {\n if ((_buffered.start(i) <= this.currentTime || _buffered.start(i) < 0.1) && _buffered.end(i) >= this.currentTime) {\n return {\n start: _buffered.start(i),\n end: _buffered.end(i)\n }\n }\n }\n return ret\n }\n\n /**\n * @type { string}\n * @description 设置/返回是否跨域\n * */\n get crossOrigin () {\n return this.media ? this.media.crossOrigin : ''\n }\n\n set crossOrigin (isTrue) {\n this.media && (this.media.crossOrigin = isTrue)\n }\n\n /**\n * @type { string }\n * @description 设置/返回视频播放地址\n * */\n get currentSrc () {\n return this.media ? this.media.currentSrc : ''\n }\n\n set currentSrc (src) {\n this.media && (this.media.currentSrc = src)\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频当前播放时间\n * */\n get currentTime () {\n if (!this.media) {\n return 0\n }\n return this.media.currentTime !== undefined ? this.media.currentTime : this._currentTime\n }\n\n set currentTime (time) {\n this.media && (this.media.currentTime = time)\n }\n\n /**\n * @type { boolean }\n * 设置/返回视频默认静音\n * */\n get defaultMuted () {\n return this.media ? this.media.defaultMuted : false\n }\n\n set defaultMuted (isTrue) {\n this.media && (this.media.defaultMuted = isTrue)\n }\n\n /**\n * @type { number }\n * @description 返回视频时长,单位:s\n * */\n get duration () {\n return this._duration\n }\n\n /**\n * @type { boolean }\n * @description 回视频是否播放结束\n * */\n get ended () {\n return this.media ? this.media.ended : false\n }\n\n /**\n * @type { MediaError }\n * @description the player current error\n */\n get error () {\n return this.media.error\n }\n\n /**\n * @type { string }\n * @description return error description text\n */\n get errorNote () {\n const err = this.media.error\n if (!err) {\n return ''\n }\n const status = [\n 'MEDIA_ERR_ABORTED',\n 'MEDIA_ERR_NETWORK',\n 'MEDIA_ERR_DECODE',\n 'MEDIA_ERR_SRC_NOT_SUPPORTED'\n ]\n return status[this.media.error.code - 1]\n }\n\n /**\n * @type { boolean }\n * @description 否开启了循环播放\n */\n get loop () {\n return this.media ? this.media.loop : false\n }\n\n set loop (isTrue) {\n this.media && (this.media.loop = isTrue)\n }\n\n /**\n * @type { boolean }\n * @description 静音\n */\n get muted () {\n return this.media ? this.media.muted : false\n }\n\n set muted (isTrue) {\n if (!this.media || this.media.muted === isTrue) {\n return\n }\n this._lastMuted = this.media.muted\n this.media.muted = isTrue\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 }\n * @description 返回视频的当前网络状态\n */\n get networkState () {\n return this.media.networkState\n }\n\n /**\n * @type { boolean }\n * @description 回当前视频是否是暂停状态\n */\n get paused () {\n return this.media ? this.media.paused : true\n }\n\n /**\n * @type { number }\n * @description 返回/设置倍速\n */\n get playbackRate () {\n return this.media ? this.media.playbackRate : 0\n }\n\n set playbackRate (rate) {\n if (!this.media || rate === Infinity) {\n return\n }\n this.media.defaultPlaybackRate = rate\n this.media.playbackRate = rate\n }\n\n /**\n * @type { TimeRanges | null}\n */\n get played () {\n return this.media ? this.media.played : null\n }\n\n /**\n * @type { boolean }\n */\n get preload () {\n return this.media ? this.media.preload : false\n }\n\n set preload (isTrue) {\n this.media && (this.media.preload = isTrue)\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 | 4 }\n * @description 回视频的就绪状态\n */\n get readyState () {\n return this.media.readyState\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否可以seek\n */\n get seekable () {\n return this.media ? this.media.seekable : false\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否处于seeking状态下\n */\n get seeking () {\n return this.media ? this.media.seeking : false\n }\n\n /**\n * @type { any }\n * @description 设置/返回当前视频的地址\n */\n get src () {\n return this.media ? this.media.src : ''\n }\n\n set src (url) {\n if (!this.media) {\n return\n }\n this.emit(URL_CHANGE, url)\n this.emit(WAITING)\n // this.media.pause()\n this._currentTime = 0\n this._duration = 0\n // Some firefox versions firefox Cannot recognize currentSrc of type Blob\n if (Util.isMSE(this.media)) {\n this.onWaiting()\n return\n }\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array') {\n this._attachSourceEvents(this.media, url)\n } else if (url) {\n this.media.src = url\n } else {\n this.media.removeAttribute('src')\n }\n this.load()\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频的音量\n */\n get volume () {\n return this.media ? this.media.volume : 0\n }\n\n set volume (vol) {\n if (vol === Infinity || !this.media) {\n return\n }\n this.media.volume = vol\n }\n\n /**\n * @type { number }\n * @description 返回视频的纵横比\n */\n get aspectRatio () {\n return this.media ? this.media.videoWidth / this.media.videoHeight : 0\n }\n\n addInnerOP (event) {\n this._internalOp[event] = true\n }\n\n removeInnerOP (event) {\n delete this._internalOp[event]\n }\n /** ******************* 以下api只有申明作用,具体实现依赖EventEmitter ******************/\n\n /**\n * @param { string } event\n * @param { any } [data]\n * @returns\n */\n emit (event, data, ...args) {\n super.emit(event, data, ...args)\n }\n\n /**\n * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n on (event, callback, ...args) {\n super.on(event, callback, ...args)\n }\n\n /**\n * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n once (event, callback, ...args) {\n super.once(event, callback, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n off (event, callback, ...args) {\n super.off(event, callback, ...args)\n }\n\n offAll () {\n super.removeAllListeners()\n }\n}\n\nexport default MediaProxy\n","class INDEXDB {\n constructor (mydb = { name: 'xgplayer', version: 1, db: null, ojstore: { name: 'xg-m4a', keypath: 'vid' } }) {\n this.indexedDB = window.indexedDB || window.webkitindexedDB\n this.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange // 键范围\n this.myDB = mydb\n }\n\n openDB (callback) {\n // 建立或打开数据库,建立对象存储空间(ObjectStore)\n const self = this\n const version = this.myDB.version || 1\n const request = self.indexedDB.open(self.myDB.name, version)\n request.onerror = function (e) {\n // console.log('e.currentTarget.error.message')\n }\n request.onsuccess = e => {\n this.myDB.db = e.target.result\n // console.log('成功建立并打开数据库:' + this.myDB.name + ' version' + this.myDB.version)\n callback.call(self)\n }\n request.onupgradeneeded = e => {\n const db = e.target.result\n // eslint-disable-next-line no-unused-vars\n const transaction = e.target.transaction\n // eslint-disable-next-line no-unused-vars\n let store\n if (!db.objectStoreNames.contains(self.myDB.ojstore.name)) {\n // 没有该对象空间时创建该对象空间\n // eslint-disable-next-line no-unused-vars\n store = db.createObjectStore(self.myDB.ojstore.name, { keyPath: self.myDB.ojstore.keypath })\n // console.log('成功建立对象存储空间:' + this.myDB.ojstore.name)\n }\n }\n }\n\n deletedb () {\n // 删除数据库\n const self = this\n self.indexedDB.deleteDatabase(this.myDB.name)\n // console.log(this.myDB.name + '数据库已删除')\n }\n\n closeDB () {\n // 关闭数据库\n this.myDB.db.close()\n // console.log('数据库已关闭')\n }\n\n addData (storename, data) {\n // 添加数据,重复添加会报错\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.add(data[i])\n request.onerror = function () {\n // console.error('add添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('add添加数据已存入数据库')\n }\n }\n }\n\n putData (storename, data) {\n // 添加数据,重复添加会更新原有数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.put(data[i])\n request.onerror = function () {\n // console.error('put添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('put添加数据已存入数据库')\n }\n }\n }\n\n getDataByKey (storename, key, callback) {\n const self = this\n // 根据存储空间的键找到对应数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n const request = store.get(key)\n request.onerror = function () {\n // console.error('getDataByKey error')\n callback.call(self, null)\n }\n request.onsuccess = function (e) {\n const result = e.target.result\n // console.log('查找数据成功')\n callback.call(self, result)\n }\n }\n\n deleteData (storename, key) {\n // 删除某一条记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.delete(key)\n // console.log('已删除存储空间' + storename + '中' + key + '记录')\n }\n\n clearData (storename) {\n // 删除存储空间全部记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.clear()\n // console.log('已删除存储空间' + storename + '全部记录')\n }\n}\n\nexport default INDEXDB\n","export const FULLSCREEN_EVENTS = ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange']\n\nexport const GET_FULLSCREEN_API = ['requestFullscreen', 'webkitRequestFullscreen', 'mozRequestFullScreen', 'msRequestFullscreen']\n\nexport const EXIT_FULLSCREEN_API = ['exitFullscreen', 'webkitExitFullscreen', 'mozCancelFullScreen', 'msExitFullscreen']\n\nexport const PLATER_ID = 'data-xgplayerid'","function callHandler (obj, handler, next, ...args) {\n const ret = handler.call(obj, ...args)\n if (!next || typeof next !== 'function') {\n return\n }\n if (ret && ret.then) {\n ret.then((...args) => {\n next.call(obj, ...args)\n })\n } else {\n next.call(obj, ...args)\n }\n}\n\n/**\n * 给某个处理函数添加hook能力\n * @param { string } hookName\n * @param { Function } handler\n * @param { { pre?: any, next?:any } } preset\n * {\n * pre: () => { // run beafore hook},\n * next: () => { // run after hook return}\n * }\n */\nfunction hook (hookName, handler, preset = { pre: null, next: null }) {\n if (!this.__hooks) {\n this.__hooks = {}\n }\n !this.__hooks[hookName] && (this.__hooks[hookName] = null)\n return function () {\n if (preset.pre) {\n try {\n preset.pre.call(this, ...arguments)\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}:pre error] >> ${e.message}`\n throw e\n }\n }\n if (this.__hooks && this.__hooks[hookName]) {\n try {\n const preRet = runHooks(this, hookName, handler)\n if (preRet) {\n if (preRet.then) {\n preRet.then((isContinue) => {\n if (isContinue !== false) {\n callHandler(this, handler, preset.next, ...arguments)\n // handler.call(this, ...arguments)\n }\n }).catch(e => {\n throw e\n })\n } else {\n callHandler(this, handler, preset.next, ...arguments)\n // handler.call(this, ...arguments)\n }\n } else if (preRet === undefined) {\n callHandler(this, handler, preset.next, ...arguments)\n }\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}] >> ${e.message}`\n throw e\n }\n } else {\n callHandler(this, handler, preset.next, ...arguments)\n }\n }.bind(this)\n}\n\nfunction findHookIndex (hookName, handler) {\n const { __hooks } = this\n if (!__hooks || !Array.isArray(__hooks[hookName])) {\n return -1\n }\n const hookHandlers = __hooks[hookName]\n for (let i = 0; i < hookHandlers.length; i++) {\n if (hookHandlers[i] === handler) {\n return i\n }\n }\n return -1\n}\n\n/**\n * add hooks\n * @param { string } hookName\n * @param { Function } handler\n */\nfunction useHooks (hookName, handler) {\n const { __hooks } = this\n if (!__hooks) {\n return\n }\n // eslint-disable-next-line no-prototype-builtins\n if (!__hooks.hasOwnProperty(hookName)) {\n console.warn(`has no supported hook which name [${hookName}]`)\n return false\n }\n if (!Array.isArray(__hooks[hookName])) {\n __hooks[hookName] = []\n }\n\n if (findHookIndex.call(this, hookName, handler) === -1) {\n __hooks[hookName].push(handler)\n }\n return true\n}\n\n/**\n * remove hook\n * @param { string } hookName\n * @param { (plugin: any, ..args) => {} } handler\n * @returns void\n */\nfunction removeHooks (hookName, handler) {\n const { __hooks } = this\n if (!__hooks) {\n return\n }\n\n if (Array.isArray(__hooks[hookName])) {\n const hooks = __hooks[hookName]\n const index = findHookIndex.call(this, hookName, handler)\n\n if (index !== -1) {\n hooks.splice(index, 1)\n }\n } else if (__hooks[hookName]) {\n __hooks[hookName] = null\n // delete __hooks[hookName]\n }\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 && Array.isArray(obj.__hooks[hookName])) {\n const hooks = obj.__hooks[hookName]\n let index = -1\n /**\n * @private\n */\n const runHooksRecursive = function (obj, hookName, handler, ...args) {\n index++\n // 递归终止条件\n if (hooks.length === 0 || index === hooks.length) {\n return handler.call(obj, obj, ...args)\n }\n // 递归调用\n const hook = hooks[index]\n const ret = hook.call(obj, obj, ...args)\n if (ret && ret.then) {\n return ret.then((data) => {\n return data === false ? null : runHooksRecursive(obj, hookName, handler, ...args)\n }).catch(e => {\n console.warn(`[runHooks]${hookName} reject`, e.message)\n })\n } else if (ret !== false) {\n return runHooksRecursive(obj, hookName, handler, ...args)\n }\n }\n\n return runHooksRecursive(obj, hookName, handler, ...args)\n } else {\n return handler.call(obj, obj, ...args)\n }\n}\n\nexport {\n hooksDescriptor as default,\n hook,\n useHooks,\n usePluginHooks,\n removePluginHooks,\n removeHooks,\n delHooksDescriptor,\n runHooks\n}\n","import Util from '../utils/util'\nimport Sniffer from '../utils/sniffer'\nimport Errors from '../error'\nimport * as Events from '../events'\nimport XG_DEBUG from '../utils/debug'\nimport hooksDescriptor, { hook, useHooks, removeHooks, delHooksDescriptor } from './hooksDescriptor'\n\nfunction showErrorMsg (pluginName, msg) {\n XG_DEBUG.logError(`[${pluginName}] event or callback cant be undefined or null when call ${msg}`)\n}\n\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef { import ('../defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * [propName: string]: any;\n * }} IBasePluginOptions\n */\nclass BasePlugin {\n static defineGetterOrSetter (Obj, map) {\n for (const key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key)) {\n Object.defineProperty(Obj, key, map[key])\n }\n }\n }\n static defineMethod (Obj, map) {\n for (const key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key) && typeof map[key] === 'function') {\n Object.defineProperty(Obj, key, {\n configurable: true,\n value: map[key]\n })\n }\n }\n }\n\n /**\n * @type { { [propName: string]: any } }\n */\n static get defaultConfig () {\n return {}\n }\n\n /**\n * @type { string }\n */\n static get pluginName () {\n return 'pluginName'\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n constructor (args) {\n if (Util.checkIsFunction(this.beforeCreate)) {\n this.beforeCreate(args)\n }\n hooksDescriptor(this)\n /**\n * @private\n */\n this.__args = args\n /**\n * @private\n */\n this.__events = {} // 对player的事件监听缓存\n this.__onceEvents = {}\n this.config = args.config || {}\n /**\n * @readonly\n * @type { Player }\n */\n this.player = null\n /**\n * @readonly\n * @type { IPlayerOptions }\n */\n this.playerConfig = {}\n /**\n * @readonly\n * @type {string}\n */\n this.pluginName = ''\n this.__init(args)\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n beforeCreate (args) {}\n afterCreate () {}\n beforePlayerInit () {}\n onPluginsReady () {}\n afterPlayerInit () {}\n destroy () {}\n\n /**\n * @protected\n * @param { any } args\n */\n __init (args) {\n this.player = args.player\n this.playerConfig = args.player && args.player.config\n this.pluginName = args.pluginName ? args.pluginName.toLowerCase() : this.constructor.pluginName.toLowerCase()\n this.logger = args.player && args.player.logger\n // BasePlugin.defineGetterOrSetter(this, {\n // player: {\n // get: () => {\n // return args.player\n // },\n // configurable: true\n // },\n // playerConfig: {\n // get: () => {\n // return args.player && args.player.config\n // },\n // configurable: true\n // },\n\n // pluginName: {\n // get: () => {\n // if (args.pluginName) {\n // return args.pluginName.toLowerCase()\n // } else {\n // return this.constructor.pluginName.toLowerCase()\n // }\n // },\n // configurable: true\n // },\n // logger: {\n // get: () => {\n // return args.player.logger\n // },\n // configurable: true\n // }\n // })\n }\n\n /**\n * 更新语言\n * @param { string } lang\n */\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n }\n\n /**\n * @type { string }\n */\n get lang () {\n return this.player.lang\n }\n\n get i18n () {\n return this.player.i18n\n }\n\n get i18nKeys () {\n return this.player.i18nKeys\n }\n\n /**\n * @description当前支持的事件类型\n * @type { 'touch' | 'mouse' }\n */\n get domEventType () {\n let _e = Util.checkTouchSupport() ? 'touch' : 'mouse'\n if (this.playerConfig && (this.playerConfig.domEventType === 'touch' || this.playerConfig.domEventType === 'mouse')) {\n _e = this.playerConfig.domEventType\n }\n return _e\n }\n\n /**\n *\n * @param { string | Array<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\nconst PLUGIN_STATE_CLASS = {\n ICON_DISABLE: 'xg-icon-disable',\n ICON_HIDE: 'xg-icon-hide'\n}\n\n/**\n * Check if the url is a link address\n * @param { string } str\n */\nfunction isUrl (str) {\n if (!str) {\n return false\n }\n return str.indexOf && /^(?:http|data:|\\/)/.test(str)\n}\n\nfunction mergeIconClass (icon, classname) {\n if (typeof icon === 'object' && icon.class && typeof icon.class === 'string') {\n return `${classname} ${icon.class}`\n }\n return classname\n}\n\nfunction mergeIconAttr (icon, attr) {\n if (typeof icon === 'object' && icon.attr && typeof icon.attr === 'object') {\n Object.keys(icon.attr).map(key => {\n attr[key] = icon.attr[key]\n })\n }\n return attr\n}\n\nfunction createIcon (icon, key, classname = '', attr = {}, pluginName = '') {\n let newIcon = null\n if (icon instanceof window.Element) {\n Util.addClass(icon, classname)\n Object.keys(attr).map(key => {\n icon.setAttribute(key, attr[key])\n })\n return icon\n }\n\n if (isUrl(icon) || isUrl(icon.url)) {\n attr.src = isUrl(icon) ? icon : (icon.url || '')\n newIcon = Util.createDom(icon.tag || 'img', '', attr, `xg-img ${classname}`)\n return newIcon\n }\n\n if (typeof icon === 'function') {\n try {\n newIcon = icon()\n if (newIcon instanceof window.Element) {\n Util.addClass(newIcon, classname)\n Object.keys(attr).map(key => {\n newIcon.setAttribute(key, attr[key])\n })\n return newIcon\n } else {\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is a function mast return an Element Object`)\n }\n return null\n } catch (e) {\n XG_DEBUG.logError(`Plugin named [${pluginName}]:createIcon`, e)\n return null\n }\n }\n\n if (typeof icon === 'string') {\n return Util.createDomFromHtml(icon, attr, classname)\n }\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is invalid`)\n return null\n}\n\nfunction registerIconsObj (iconsConfig, plugin) {\n const _icons = plugin.config.icons || plugin.playerConfig.icons\n Object.keys(iconsConfig).map(key => {\n const orgIcon = iconsConfig[key]\n let classname = orgIcon && orgIcon.class ? orgIcon.class : ''\n let attr = orgIcon && orgIcon.attr ? orgIcon.attr : {}\n let newIcon = null\n if (_icons && _icons[key]) {\n classname = mergeIconClass(_icons[key], classname)\n attr = mergeIconAttr(_icons[key], attr)\n newIcon = createIcon(_icons[key], key, classname, attr, plugin.pluginName)\n }\n if (!newIcon && orgIcon) {\n newIcon = createIcon((orgIcon.icon ? orgIcon.icon : orgIcon), attr, classname, {}, plugin.pluginName)\n }\n plugin.icons[key] = newIcon\n })\n}\n\nfunction registerTextObj (textConfig, plugin) {\n Object.keys(textConfig).map((key) => {\n Object.defineProperty(plugin.langText, key, {\n get: () => {\n const { lang, i18n } = plugin\n if (i18n[key]) {\n return i18n[key]\n } else {\n return textConfig[key] ? (textConfig[key][lang] || '') : ''\n }\n }\n })\n })\n}\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * root?: HTMLElement,\n * position?: string,\n * [propName: string]: any\n * }} IPluginOptions\n*/\nclass Plugin extends BasePlugin {\n /**\n * 插入dom结构\n * @param { string | HTMLElement } html html字符串或者dom\n * @param { HTMLElement } parent\n * @param { number } index\n * @returns { HTMLElement }\n */\n static insert (html, parent, index = 0) {\n const len = parent.children.length\n const insertIdx = Number(index)\n const isDomElement = html instanceof window.Node\n\n if (len) {\n let i = 0\n let coordinate = null\n let mode = ''\n for (;i < len; i++) {\n coordinate = parent.children[i]\n const curIdx = Number(coordinate.getAttribute('data-index'))\n if (curIdx >= insertIdx) {\n mode = 'beforebegin'\n break\n } else if (curIdx < insertIdx) {\n mode = 'afterend'\n }\n }\n\n if (isDomElement) {\n if (mode === 'afterend') {\n // as last element\n parent.appendChild(html)\n } else {\n parent.insertBefore(html, coordinate)\n }\n } else {\n coordinate.insertAdjacentHTML(mode, html)\n }\n return mode === 'afterend' ? parent.children[parent.children.length - 1] : parent.children[i]\n } else {\n isDomElement ? parent.appendChild(html) : parent.insertAdjacentHTML('beforeend', html)\n return parent.children[parent.children.length - 1]\n }\n }\n\n static get defaultConfig () {\n return {}\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { string } querySelector\n * @param { string | Array<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 * @protected\n */\n __init (args) {\n super.__init(args)\n if (!args.root) {\n return\n }\n const _parent = args.root\n let _el = null\n /**\n * @readonly\n */\n this.icons = {}\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.root = null\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.parent = null\n\n const _orgicons = this.registerIcons() || {}\n registerIconsObj(_orgicons, this)\n /**\n * @readonly\n */\n this.langText = {}\n const defaultTexConfig = this.registerLanguageTexts() || {}\n registerTextObj(defaultTexConfig, this)\n let renderStr = ''\n try {\n renderStr = this.render()\n } catch (e) {\n XG_DEBUG.logError(`Plugin:${this.pluginName}:render`, e)\n throw (new Error(`Plugin:${this.pluginName}:render:${e.message}`))\n }\n if (renderStr) {\n _el = Plugin.insert(renderStr, _parent, args.index)\n _el.setAttribute('data-index', args.index)\n } else if (args.tag) {\n _el = Util.createDom(args.tag, '', args.attr, args.name)\n _el.setAttribute('data-index', args.index)\n _parent.appendChild(_el)\n } else {\n return\n }\n\n this.root = _el\n this.parent = _parent\n\n // Plugin.defineGetterOrSetter(this, {\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // root: {\n // get: () => {\n // return _el\n // },\n // configurable: true\n // },\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // parent: {\n // get: () => {\n // return _parent\n // },\n // configurable: true\n // }\n // })\n\n const attr = this.config.attr || {}\n const style = this.config.style || {}\n\n this.setAttr(attr)\n this.setStyle(style)\n if (this.config.index) {\n this.root.setAttribute('data-index', this.config.index)\n }\n this.__registerChildren()\n }\n\n /**\n * @private\n */\n __registerChildren () {\n if (!this.root) {\n return\n }\n /**\n * @private\n */\n this._children = []\n const children = this.children()\n if (children && typeof children === 'object') {\n if (Object.keys(children).length > 0) {\n Object.keys(children).map(item => {\n const name = item\n const _plugin = children[name]\n const options = {\n root: this.root\n }\n // eslint-disable-next-line no-unused-vars\n let config, Plugin\n if (typeof _plugin === 'function') {\n config = this.config[name] || {}\n Plugin = _plugin\n } else if (typeof _plugin === 'object' && typeof _plugin.plugin === 'function') {\n config = _plugin.options ? Util.deepCopy((this.config[name] || {}), _plugin.options) : (this.config[name] || {})\n Plugin = _plugin.plugin\n }\n options.config = config\n config.index !== undefined && (options.index = config.index)\n config.root && (options.root = config.root)\n this.registerPlugin(Plugin, options, name)\n })\n }\n }\n }\n\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n function checkChildren (node, callback) {\n for (let i = 0; i < node.children.length; i++) {\n if (node.children[i].children.length > 0) {\n checkChildren(node.children[i], callback)\n } else {\n callback(node.children[i])\n }\n }\n }\n const { root, i18n, langText } = this\n if (root) {\n checkChildren(root, (node) => {\n const langKey = node.getAttribute && node.getAttribute('lang-key')\n if (!langKey) {\n return\n }\n const langTextShow = i18n[langKey.toUpperCase()] || langText[langKey]\n if (langTextShow) {\n node.innerHTML = typeof langTextShow === 'function' ? langTextShow(lang) : langTextShow\n }\n })\n }\n }\n\n get lang () {\n return this.player.lang\n }\n\n changeLangTextKey (dom, key = '') {\n const i18n = this.i18n || {}\n const langText = this.langText\n dom.setAttribute && dom.setAttribute('lang-key', key)\n const text = i18n[key] || langText[key] || ''\n if (text) {\n dom.innerHTML = text\n }\n }\n\n plugins () {\n return this._children\n }\n\n /**\n *\n */\n disable () {\n this.config.disable = true\n Util.addClass(this.find('.xgplayer-icon'), PLUGIN_STATE_CLASS.ICON_DISABLE)\n }\n\n enable () {\n this.config.disable = false\n Util.removeClass(this.find('.xgplayer-icon'), PLUGIN_STATE_CLASS.ICON_DISABLE)\n }\n\n children () {\n return {}\n }\n\n registerPlugin (plugin, options = {}, name = '') {\n options.root = options.root || this.root\n const _c = super.registerPlugin(plugin, options, name)\n this._children.push(_c)\n return _c\n }\n\n registerIcons () {\n return {}\n }\n\n registerLanguageTexts () {\n return {}\n }\n\n /**\n *\n * @param { string } qs\n * @returns { HTMLElement | null }\n */\n find (qs) {\n if (!this.root) {\n return\n }\n return this.root.querySelector(qs)\n }\n\n /**\n * 绑定事件\n * @param { string | Array<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 PLUGIN_STATE_CLASS\n}\n","import { throttle } from '../utils/util'\nimport { PLATER_ID } from '../constant'\n/**\n * 添加\n */\nclass ResizeObserver {\n constructor () {\n this.__handlers = []\n this.timeStamp = 0\n this.observer = null\n if (!window.ResizeObserver) {\n return\n }\n try {\n this.observer = new window.ResizeObserver(throttle(this.__trigger, 100, { trailing: true }))\n this.timeStamp = new Date().getTime()\n } catch (e) {\n console.error(e)\n }\n }\n\n addObserver (target, handler) {\n if (!this.observer) {\n return\n }\n this.observer.observe(target)\n const _pid = target.getAttribute(PLATER_ID)\n const { __handlers } = this\n let index = -1\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n index = i\n }\n }\n if (index > -1) {\n this.__handlers[index].handler = handler\n } else {\n this.__handlers.push({\n target,\n handler: handler,\n playerId: _pid\n })\n }\n }\n\n unObserver (target) {\n let i = -1\n this.__handlers.map((item, index) => {\n if (target === item.target) {\n i = index\n }\n })\n try {\n this.observer?.unobserve(target)\n } catch (e) {}\n i > -1 && this.__handlers.splice(i, 1)\n }\n\n destroyObserver () {\n this.observer?.disconnect()\n this.observer = null\n this.__handlers = null\n }\n\n __runHandler (target) {\n const { __handlers } = this\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n try {\n __handlers[i].handler(target)\n } catch (error) {\n console.error(error)\n }\n return true\n }\n }\n return false\n }\n\n __trigger = (entries) => {\n const t = new Date().getTime()\n this.timeStamp = t\n for (let i = 0; i < entries.length; i++) {\n this.__runHandler(entries[i].target)\n }\n }\n}\n\n/**\n * @type {ResizeObserver | null}\n */\nlet resizeObserver = null\n\nfunction addObserver (target, handler) {\n if (!resizeObserver) {\n resizeObserver = new ResizeObserver()\n // window.___resizeObserver = resizeObserver\n }\n resizeObserver.addObserver(target, handler)\n return resizeObserver\n}\n\nfunction unObserver (target, handler) {\n resizeObserver?.unObserver(target, handler)\n}\n\nfunction destroyObserver (target, handler) {\n resizeObserver?.destroyObserver(target, handler)\n}\n\nexport {\n addObserver,\n unObserver,\n destroyObserver\n}\n","import { addObserver, unObserver } from './resizeObserver'\nimport Util from '../utils/util'\n\n/**\n* a plugins manager to register and search\n**/\n\nconst pluginsManager = {\n pluginGroup: {},\n init (player) {\n // mark every player instance by _pluginInfoId\n let cgid = player._pluginInfoId\n if (!cgid) {\n cgid = new Date().getTime()\n player._pluginInfoId = cgid\n }\n\n !player.config.closeResizeObserver && addObserver(player.root, () => {\n player.resize()\n })\n\n this.pluginGroup[cgid] = {\n _originalOptions: player.config || {},\n _plugins: {}\n }\n },\n\n formatPluginInfo (plugin, config) {\n let PLUFGIN = null\n let options = null\n if (plugin.plugin && typeof plugin.plugin === 'function') {\n PLUFGIN = plugin.plugin\n options = plugin.options\n } else {\n PLUFGIN = plugin\n options = {}\n }\n if (config) {\n options.config = config || {}\n }\n\n return {\n PLUFGIN,\n options\n }\n },\n\n /**\n * check the plugin if exits in plugins\n * @param {string} pluginName\n * @param { Array <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 = player\n\n const pluginName = options.pluginName || plugin.pluginName\n if (!pluginName) {\n throw new Error('The property pluginName is necessary')\n }\n\n if (plugin.isSupported && !plugin.isSupported(player.config.mediaType, player.config.codecType)) {\n console.warn(`not supported plugin [${pluginName}]`)\n return\n }\n\n if (!options.config) {\n options.config = {}\n }\n\n // get config items from player.config\n const keys = Object.keys(originalOptions)\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n const config = originalOptions[keys[i]]\n if (Util.typeOf(config) === 'Object') {\n options.config = Object.assign({}, options.config, originalOptions[keys[i]])\n } else if (Util.typeOf(config) === 'Boolean') {\n options.config.disable = !config\n }\n break\n }\n }\n\n // copy the default configuration items of the plugin\n if (plugin.defaultConfig) {\n Object.keys(plugin.defaultConfig).forEach(key => {\n if (typeof options.config[key] === 'undefined') {\n options.config[key] = plugin.defaultConfig[key]\n }\n })\n }\n\n // get the parent dom which added the plugin will be mounted\n if (!options.root) {\n options.root = player.root\n } else if (typeof options.root === 'string') {\n options.root = player[options.root]\n }\n\n options.index = options.config.index || 0\n try {\n // if there is already a plugin instance with the same pluginName, destroy it\n if (plugins[pluginName.toLowerCase()]) {\n this.unRegister(cgid, pluginName.toLowerCase())\n console.warn(`the is one plugin with same pluginName [${pluginName}] exist, destroy the old instance`)\n }\n // eslint-disable-next-line new-cap\n const _instance = new plugin(options)\n plugins[pluginName.toLowerCase()] = _instance\n plugins[pluginName.toLowerCase()].func = plugin\n if (_instance && typeof _instance.afterCreate === 'function') {\n _instance.afterCreate()\n }\n return _instance\n } catch (err) {\n console.error(err)\n throw (err)\n }\n },\n\n /**\n * Unregister a plugin from player instance\n * @param { string } cgid\n * @param { string } name\n */\n unRegister (cgid, name) {\n if (cgid._pluginInfoId) {\n cgid = cgid._pluginInfoId\n }\n name = name.toLowerCase()\n try {\n const plugin = this.pluginGroup[cgid]._plugins[name]\n if (plugin) {\n plugin.pluginName && plugin.__destroy()\n delete this.pluginGroup[cgid]._plugins[name]\n }\n } catch (e) {\n console.error(`[unRegister:${name}] cgid:[${cgid}] error`, e)\n }\n },\n\n /**\n * remove a plugin instance from the player plugin list\n * @param { any } player\n * @param { string } name\n */\n deletePlugin (player, name) {\n const cgid = player._pluginInfoId\n if (cgid && this.pluginGroup[cgid] && this.pluginGroup[cgid]._plugins) {\n delete this.pluginGroup[cgid]._plugins[name]\n }\n },\n\n /**\n * get all plugin instance of player\n * @param { any } player\n */\n getPlugins (player) {\n const cgid = player._pluginInfoId\n return cgid && this.pluginGroup[cgid] ? this.pluginGroup[cgid]._plugins : {}\n },\n\n findPlugin (player, name) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return null\n }\n const cName = name.toLowerCase()\n return this.pluginGroup[cgid]._plugins[cName]\n },\n\n beforeInit (player) {\n function retPromise (fun) {\n if (!fun || !fun.then) {\n return new Promise((resolve) => {\n resolve()\n })\n } else {\n return fun\n }\n }\n return new Promise((resolve) => {\n if (!this.pluginGroup) {\n return\n }\n\n let prevTask\n if (player._loadingPlugins && player._loadingPlugins.length) {\n prevTask = Promise.all(player._loadingPlugins)\n } else {\n prevTask = Promise.resolve()\n }\n\n return prevTask.then(() => {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n resolve()\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const pluginsRet = []\n Object.keys(plugins).forEach(pName => {\n if (plugins[pName] && plugins[pName].beforePlayerInit) {\n try {\n const ret = plugins[pName].beforePlayerInit()\n pluginsRet.push(retPromise(ret))\n } catch (e) {\n pluginsRet.push(retPromise(null))\n throw e\n }\n }\n })\n\n Promise.all([...pluginsRet]).then(() => {\n resolve()\n }).catch((e) => {\n console.error(e)\n resolve()\n })\n })\n })\n },\n\n afterInit (player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(pName => {\n if (plugins[pName] && plugins[pName].afterPlayerInit) {\n plugins[pName].afterPlayerInit()\n }\n })\n },\n\n setLang (lang, player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(item => {\n if (plugins[item].updateLang) {\n plugins[item].updateLang(lang)\n } else {\n // 兼容旧版本通过set lang更新语言的问题\n try {\n plugins[item].lang = lang\n } catch (error) {\n console.warn(`${item} setLang`)\n }\n }\n })\n },\n\n reRender (player) {\n const cgid = player._pluginInfoId\n\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const _pList = []\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(pName => {\n if (pName !== 'controls' && plugins[pName]) {\n _pList.push({\n plugin: plugins[pName].func,\n options: plugins[pName].__args\n })\n this.unRegister(cgid, pName)\n }\n })\n _pList.forEach(item => {\n this.register(player, item.plugin, item.options)\n })\n },\n\n onPluginsReady (player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins || {}\n Object.keys(plugins).forEach(key => {\n if (plugins[key].onPluginsReady && typeof plugins[key].onPluginsReady === 'function') {\n plugins[key].onPluginsReady()\n }\n })\n },\n\n destroy (player) {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n return\n }\n unObserver(player.root)\n const plugins = this.pluginGroup[cgid]._plugins\n for (const item of Object.keys(plugins)) {\n this.unRegister(cgid, item)\n }\n delete this.pluginGroup[cgid]\n delete player._pluginInfoId\n }\n}\n\nexport default pluginsManager\n","export default {\n DEFAULT: 'xgplayer',\n DEFAULT_SKIN: 'xgplayer-skin-default',\n ENTER: 'xgplayer-is-enter',\n PAUSED: 'xgplayer-pause',\n PLAYING: 'xgplayer-playing',\n ENDED: 'xgplayer-ended',\n CANPLAY: 'xgplayer-canplay',\n LOADING: 'xgplayer-isloading',\n ERROR: 'xgplayer-is-error',\n REPLAY: 'xgplayer-replay',\n NO_START: 'xgplayer-nostart',\n ACTIVE: 'xgplayer-active',\n INACTIVE: 'xgplayer-inactive',\n FULLSCREEN: 'xgplayer-is-fullscreen',\n CSS_FULLSCREEN: 'xgplayer-is-cssfullscreen',\n ROTATE_FULLSCREEN: 'xgplayer-rotate-fullscreen',\n PARENT_ROTATE_FULLSCREEN: 'xgplayer-rotate-parent',\n PARENT_FULLSCREEN: 'xgplayer-fullscreen-parent',\n INNER_FULLSCREEN: 'xgplayer-fullscreen-inner',\n NO_CONTROLS: 'no-controls',\n FLEX_CONTROLS: 'flex-controls',\n CONTROLS_FOLLOW: 'controls-follow',\n CONTROLS_AUTOHIDE: 'controls-autohide',\n TOP_BAR_AUTOHIDE: 'top-bar-autohide',\n NOT_ALLOW_AUTOPLAY: 'not-allow-autoplay',\n SEEKING: 'seeking',\n PC: 'xgplayer-pc',\n MOBILE: 'xgplayer-mobile',\n MINI: 'xgplayer-mini' // mini screen play status\n}\n","import { getLang } from './utils/util'\n\n/**\n * @typedef { string | MediaStream | Array<{src: string, type?:string, [propName: string]: any}> } IUrl\n */\n\n/**\n * @typedef {{\n * url: IUrl,\n * definition: any,\n * bitrate?: number,\n * bandwidth?: number,\n * text?: string | { [propName: string]: any },\n * iconText?: string | { [propName: string]: any },\n * [propName: string]: any\n * }} IDefinition\n */\n\n/**\n * @typedef { {\n * id?: string,\n * el?: HTMLElement,\n * mediaEl?: HTMLMediaElement | (mediaConfig: { [propName: string]: any }) => HTMLMediaElement,\n * url?: IUrl,\n * domEventType?: 'default' | 'touch' | 'mouse',\n * nullUrlStart?: boolean,\n * width?: number | string,\n * height?: number | string,\n * fluid?: boolean,\n * fitVideoSize?: 'fixWidth'|'fixHeight'|'fixed',\n * videoFillMode?: 'auto'|'fillHeight'|'fillWidth'|'fill'|'cover'|'contain',\n * volume?: number | { [propName: string]: any },\n * autoplay?: boolean,\n * autoplayMuted?: boolean,\n * loop?: boolean,\n * isLive?: boolean,\n * zoom?: number,\n * videoInit?: boolean,\n * poster?: string | { [propName: string]: any },\n * isMobileSimulateMode?: 'mobile' | 'pc',\n * defaultPlaybackRate?: number,\n * execBeforePluginsCall?: () => any,\n * allowSeekAfterEnded?: boolean,\n * enableContextmenu?: boolean,\n * closeVideoClick?: boolean,\n * closeVideoDblclick?: boolean,\n * closePlayerBlur?: boolean,\n * closeDelayBlur?: boolean,\n * leavePlayerTime?: number,\n * closePlayVideoFocus?: boolean,\n * closePauseVideoFocus?: boolean,\n * closeFocusVideoFocus?: boolean,\n * closeControlsBlur?: boolean,\n * topBarAutoHide?: boolean,\n * videoAttributes?: { [propName: string]: any },\n * startTime?: number,\n * seekedStatus?: 'play' | 'pause' | 'auto',\n * miniprogress?: boolean,\n * disableSwipeHandler?: () => any,\n * enableSwipeHandler?: () => any,\n * preProcessUrl?: (url: IUrl, ext?: { [propName: string]: any }) => { url: IUrl, [propName: string]: any },\n * ignores?: Array<'cssfullscreen' | 'screenshot' | 'pip' | 'miniscreen' | 'keyboard' | 'download' | 'playbackrate' | 'time' | 'definition' | 'error' | 'fullscreen' | 'loading' | 'mobile' | 'pc' | 'play' | 'poster' | 'progress' | 'replay' | 'start' | 'volume' | string>,\n * inactive?: number,\n * lang?: string,\n * controls?: boolean | { [propName: string]: any },\n * marginControls?: boolean,\n * fullscreenTarget?: HTMLElement, // 全屏作用的dom元素\n * screenShot?: boolean | { [propName: string]: any },\n * rotate?: boolean | { [propName: string]: any },\n * pip?: boolean | { [propName: string]: any },\n * download?: boolean | { [propName: string]: any },\n * mini?: boolean | { [propName: string]: any },\n * cssFullscreen?: boolean | { [propName: string]: any },\n * keyShortcut?: boolean,\n * presets?: any[],\n * plugins?: any[]\n * playbackRate?: boolean | Array<number> | { [propName: string]: any },\n * definition?: { list: Array<IDefinition> , defaultDefinition?: IDefinition['definition'], [propName: string]: any},\n * playsinline?: boolean,\n * customDuration?: number,\n * timeOffset?: number,\n * icons?: { [propName: string]: string | HTMLElement | () => HTMLElement | string },\n * i18n?: Array<any>,\n * tabindex?: number,\n * thumbnail?: {\n * urls: Array<string>,\n * pic_num: number,\n * col: number,\n * row: number,\n * height?: number,\n * width?: number,\n * },\n * videoConfig?: { [propName: string]: any },\n * isHideTips?: boolean,\n * minWaitDelay?: number,\n * commonStyle?: {\n * progressColor?: string,\n * playedColor?: string,\n * cachedColor?: string,\n * sliderBtnStyle?: { [propName: string]: any },\n * volumeColor?: string\n * },\n * remainMediaAfterDestroy?: boolean,\n * [propName: string]: any;\n * } } IPlayerOptions\n */\n\n/**\n * @returns { IPlayerOptions }\n */\nexport default function getDefaultConfig () {\n return {\n id: '', // container DOM id\n el: null, // container domElement\n url: '', // the url need to play\n domEventType: 'default', // 事件类型,默认值default, touch | mouse\n nullUrlStart: false, // Whether to start broadcasting with empty url\n width: 600, // Width, unit px\n height: 337.5, // height, unit px\n fluid: false,\n fitVideoSize: 'fixed', // adaptation method of container width and height, fixWidth/fixHeight/fixed/auto\n videoFillMode: 'auto', // video screen fill mode, fillHeight/fillWidth/fill/auto/cover\n volume: 0.6, // default volume or config of plug-in volume\n autoplay: false,\n autoplayMuted: false, // whether to mute the start\n loop: false, // whether to loop\n isLive: false, // whether is live\n zoom: 1,\n videoInit: true, // whether to load the video/audio when initializing\n poster: '', // cover poster url or the configuration object for poster plugin\n isMobileSimulateMode: false, // simulation state, mobile/pc\n defaultPlaybackRate: 1, // default playback rate\n execBeforePluginsCall: null,\n allowSeekAfterEnded: true, // whether to allow seek after the playback ended\n enableContextmenu: true, // whether to allow the right-click function to be enabled\n closeVideoClick: false, // is to close the video’s click/touchend behavior to switch playback and pause\n closeVideoDblclick: false, // is to close the video`s double-click behavior to switch through full screen\n closePlayerBlur: false, // whether to close the behavior of calling player.blur() when the mouse moves out of the player area\n closeDelayBlur: false, // whether to close the automatic hide control bar behavior,only PC\n leavePlayerTime: 3000, // auto hide delay time when the mouse moves out of the player area\n closePlayVideoFocus: false, // whether to close the behavior of calling player.focus() in the play event callback\n closePauseVideoFocus: false, // whether to close the behavior of calling player.focus() in the pause event callback\n closeFocusVideoFocus: true, // whether to close the behavior of calling player.media.focus() when start play\n closeControlsBlur: true, // whether to close the behavior of calling player.focus() when the mouse moves out of the control bar area\n topBarAutoHide: true, // Whether to enable auto hide the top bar when player.blur()\n videoAttributes: {}, // video extended attributes\n startTime: 0, // auto play start time\n seekedStatus: 'play', // play state after seek ends play/pause/auto\n miniprogress: false, // whether to enable the mini progress bar\n disableSwipeHandler: () => {\n },\n enableSwipeHandler: () => {\n },\n preProcessUrl: null, // url preprocessing callback\n ignores: [], // list of plug-in names to be disabled\n whitelist: [],\n inactive: 3000, // delay time for the control bar to disappear automatically\n lang: getLang(),\n controls: true,\n marginControls: false, // Whether the control bar is located at the bottom of the video and does not overlap with the video\n fullscreenTarget: null,\n screenShot: false, // whether to enable the screenshot plug-in\n rotate: false, // whether to enable the rotate plug-in\n pip: false, // whether to enable the picture-in-picture plug-in\n download: false, // whether to enable the download plug-in\n mini: false, // whether to enable the mini-screen plug-in\n cssFullscreen: true, // whether to enable the web page full-screen plug-in\n keyShortcut: true, // whether to open the shortcut key\n presets: [],\n plugins: [],\n playbackRate: 1,\n definition: { list: [] },\n playsinline: true,\n customDuration: 0, // User-defined duration\n timeOffset: 0, // currentTime offset\n icons: {},\n i18n: [],\n tabindex: 0, // The order of mediaElement focus\n thumbnail: null, // Preview image configuration\n videoConfig: {}, // video attribute configuration\n isHideTips: false, // if hide the icon tips\n minWaitDelay: 200, // The min threshold of waiting delay time\n commonStyle: { // General style configuration\n progressColor: '', // Background color of progress bar\n playedColor: '', // The background color of played part in the progress bar\n cachedColor: '', // The background color of cached part in the progress bar\n sliderBtnStyle: {}, // progress bar slider style\n volumeColor: ''\n }\n }\n}\n","export const usePreset = (player, Preset) => {\n let presetInst\n if (Preset.preset && Preset.options) {\n // eslint-disable-next-line new-cap\n presetInst = new (Preset.preset)(Preset.options, player.config)\n } else {\n presetInst = new Preset({}, player.config)\n }\n const { plugins = [], ignores = [], icons = {}, i18n = [] } = presetInst\n if (!player.config.plugins) {\n player.config.plugins = []\n }\n\n if (!player.config.ignores) {\n player.config.ignores = []\n }\n\n player.config.plugins.push(...plugins)\n player.config.ignores.push(...ignores)\n Object.keys(icons).map(key => {\n if (!player.config.icons[key]) {\n player.config.icons[key] = icons[key]\n }\n })\n const _ci18n = player.config.i18n || []\n i18n.push(..._ci18n)\n player.config.i18n = i18n\n}\n","export const STATES = {\n INITIAL: 1,\n READY: 2,\n ATTACHING: 3,\n ATTACHED: 4,\n NOTALLOW: 5,\n RUNNING: 6,\n ENDED: 7,\n DESTROYED: 8\n}\n\nexport const STATE_ARRAY = [\n 'ERROR',\n 'INITIAL',\n 'READY',\n 'ATTACHING',\n 'ATTACHED',\n 'NOTALLOW',\n 'RUNNING',\n 'ENDED',\n 'DESTROYED'\n]\n","import Plugin, { Events, Util, POSITIONS, Sniffer, STATE_CLASS } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * disable?: boolean,\n * autoHide?: boolean,\n * mode?: \"flex\"|\"normal\"|\"bottom\",\n * initShow?: boolean,\n * [propName: string]: any\n * }} IControlsConfig\n */\n\nclass Controls extends Plugin {\n static get pluginName () {\n return 'controls'\n }\n\n /**\n * @type IControlsConfig\n */\n static get defaultConfig () {\n return {\n disable: false,\n autoHide: true, // Whether to hide automatically\n mode: '', // Display mode, flex/normal/bottom\n initShow: false // Display when player is initialized\n }\n }\n\n beforeCreate (args) {\n if (!args.config.mode && Sniffer.device === 'mobile') {\n args.config.mode = 'flex'\n }\n if (args.player.config.marginControls) {\n args.config.autoHide = false\n }\n }\n\n afterCreate () {\n const { disable, height, mode } = this.config\n if (disable) {\n return\n }\n\n mode === 'flex' && this.player.addClass(STATE_CLASS.FLEX_CONTROLS)\n const style = {\n height: `${height}px`\n }\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.left = this.find('xg-left-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.center = this.find('xg-center-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.right = this.find('xg-right-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.innerRoot = this.find('xg-inner-controls')\n\n // The progress bar is switched synchronously when switching to the small window state\n this.on(Events.MINI_STATE_CHANGE, (isMini) => {\n isMini ? Util.addClass(this.root, 'mini-controls') : Util.removeClass(this.root, 'mini-controls')\n })\n\n const { isMobileSimulateMode } = this.playerConfig\n if (Sniffer.device !== 'mobile' && isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseleave', this.onMouseLeave)\n }\n }\n\n onMouseEnter = (e) => {\n const { player, playerConfig } = this\n playerConfig.closeControlsBlur && player.focus({ autoHide: false })\n }\n\n onMouseLeave = (e) => {\n const { player } = this\n player.focus()\n }\n\n focus () {\n this.player.focus({ autoHide: false })\n }\n\n focusAwhile () {\n this.player.focus({ autoHide: true })\n }\n\n blur () {\n this.player.blur({ ignorePaused: true })\n }\n\n recoverAutoHide () {\n // this.config.autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n this.config.autoHide && Util.addClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n pauseAutoHide () {\n // Util.removeClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n Util.removeClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n this.root.style.display = ''\n this.player.focus()\n }\n\n hide () {\n this.root.style.display = 'none'\n }\n\n /**\n * @type {string}\n */\n get mode () {\n return this.config.mode\n }\n\n /**\n *\n * @param {} plugin\n * @param { {config?: {[propName: string]: any}, position?:string, root?: HTMLElement, pluginName?: string}} options\n * @param { string } name\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name) {\n if (!this.root) {\n return\n }\n const defaultConfig = plugin.defaultConfig || {}\n if (!options.root) {\n const position = options.position ? options.position : options.config && options.config.position ? options.config.position : defaultConfig.position\n switch (position) {\n case POSITIONS.CONTROLS_LEFT:\n options.root = this.left\n break\n case POSITIONS.CONTROLS_RIGHT:\n options.root = this.right\n break\n case POSITIONS.CONTROLS_CENTER:\n options.root = this.center\n break\n case POSITIONS.CONTROLS:\n options.root = this.root\n break\n default:\n options.root = this.left\n }\n return super.registerPlugin(plugin, options, name)\n }\n }\n\n destroy () {\n if (Sniffer.device !== 'mobile') {\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mouseleave', this.onMouseLeave)\n }\n this.left = null\n this.center = null\n this.right = null\n this.innerRoot = null\n }\n\n render () {\n const { mode, autoHide, initShow, disable } = this.config\n if (disable) {\n return\n }\n\n // autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n const className = Util.classNames(\n { 'xgplayer-controls': true },\n { 'flex-controls': mode === 'flex' },\n { 'bottom-controls': mode === 'bottom' },\n { [STATE_CLASS.CONTROLS_AUTOHIDE]: autoHide },\n { 'xgplayer-controls-initshow': initShow || !autoHide })\n return `<xg-controls class=\"${className}\" unselectable=\"on\">\n <xg-inner-controls class=\"xg-inner-controls xg-pos\">\n <xg-left-grid class=\"xg-left-grid\">\n </xg-left-grid>\n <xg-center-grid class=\"xg-center-grid\"></xg-center-grid>\n <xg-right-grid class=\"xg-right-grid\">\n </xg-right-grid>\n </xg-inner-controls>\n </xg-controls>`\n }\n}\n\nexport default Controls\n","import MediaProxy from './mediaProxy'\nimport Util, { checkIsCurrentVideo } from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Database from './utils/database'\nimport Errors from './error'\nimport * as Events from './events'\nimport { FULLSCREEN_EVENTS, GET_FULLSCREEN_API, EXIT_FULLSCREEN_API, PLATER_ID } from './constant'\nimport Plugin, { POSITIONS } from './plugin/plugin'\nimport BasePlugin from './plugin/basePlugin'\nimport pluginsManager from './plugin/pluginsManager'\nimport STATE_CLASS from './stateClassMap'\nimport getDefaultConfig from './defaultConfig'\nimport { usePreset } from './plugin/preset'\nimport hooksDescriptor, { runHooks, useHooks, removeHooks, delHooksDescriptor, usePluginHooks, removePluginHooks, hook } from './plugin/hooksDescriptor'\nimport Controls from './plugins/controls/index'\nimport XG_DEBUG, { bindDebug } from './utils/debug'\nimport I18N from './lang/i18n'\nimport version from './version'\nimport { STATES, STATE_ARRAY } from './state'\nimport { InstManager, checkPlayerRoot } from './instManager'\n\n/**\n * @typedef { import ('./defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef { import ('./defaultConfig').IDefinition } IDefinition\n * @typedef { import ('./defaultConfig').IUrl } IUrl\n */\n\n/**\n * @typedef {boolean | {\n * seamless?: boolean,\n * currentTime?: number,\n * bitrate?: number\n * }} SwitchUrlOptions\n */\n\n/* eslint-disable camelcase */\nconst PlAYER_HOOKS = ['play', 'pause', 'replay', 'retry']\nlet REAL_TIME_SPEED = 0 // 实时下载速率, kb/s\nlet AVG_SPEED = 0 // 平均下载速率, kb/s\n/** @type { InstManager } */\nlet instManager = null\n\nclass Player extends MediaProxy {\n /**\n * @type {number}\n * @description set debugger level\n * 1 - only print error logs\n * 2 - print warn logs and error logs\n * 3 - print all debug logs and error stack logs\n */\n static set debugger (value) {\n XG_DEBUG.config.debug = value\n }\n\n static get debugger () {\n return XG_DEBUG.config.debug\n }\n\n /**\n * @param {import('./instManager').InstManager} value\n */\n static set instManager (value) {\n instManager = value\n }\n\n /**\n * @param {import('./instManager').InstManager} value\n */\n static get instManager () {\n return instManager\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | string | null }\n * @deprecated 该方法转移到 InstManager 上去使用: player.instManager.getActiveId()\n */\n static getCurrentUserActivePlayerId () {\n return instManager?.getActiveId()\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n * @deprecated 该方法转移到 InstManager 上去使用: player.instManager.setActive()\n */\n static setCurrentUserActive (playerId, isActive) {\n instManager?.setActive(playerId, isActive)\n }\n\n /**\n * @param { IPlayerOptions } options\n */\n constructor (options) {\n const config = Util.deepMerge(getDefaultConfig(), options)\n super(config)\n hooksDescriptor(this, PlAYER_HOOKS)\n\n /**\n * @type { IPlayerOptions }\n * @description 当前播放器的配置信息\n */\n this.config = config\n\n /**\n * @type { string }\n * @private\n */\n this._pluginInfoId = Util.generateSessionId()\n\n bindDebug(this)\n // resolve default preset\n const defaultPreset = this.constructor.defaultPreset\n if (this.config.presets.length) {\n const defaultIdx = this.config.presets.indexOf('default')\n if (defaultIdx >= 0 && defaultPreset) {\n this.config.presets[defaultIdx] = defaultPreset\n }\n } else if (defaultPreset) {\n this.config.presets.push(defaultPreset)\n }\n\n // timer and flags\n this.userTimer = null\n /**\n * @private\n */\n this.waitTimer = null\n\n /**\n * @public\n * @description This switch provides the playback plugin with the ability\n * to handle media source by itself.\n */\n this.handleSource = true\n\n /**\n * @private\n */\n this._state = STATES.INITIAL\n\n /**\n * @public\n * @readonly\n * @type { boolean }\n */\n this.isAd = false\n\n /**\n * @public\n * @readonly\n * @type { boolean }\n */\n this.isError = false\n\n /**\n * @private\n */\n this._hasStart = false\n /**\n * Whether the player is in the seeking state\n * @type { boolean }\n * @readonly\n */\n this.isSeeking = false\n\n /**\n * @type { boolean }\n * @readonly\n */\n this.isCanplay = false\n /**\n * @private\n * @readonly\n */\n this._useAutoplay = false\n /**\n * @description 记录起播需要seek的时间点\n * @type { number }\n * @private\n * @readonly\n */\n this.__startTime = -1\n /**\n * @type { number }\n */\n this.rotateDeg = 0\n /**\n * Whether the player is focus\n * @type { boolean }\n * @readonly\n */\n this.isActive = false\n\n /**\n * Whether player is currently in fullscreen\n * @type { boolean }\n * @readonly\n */\n this.fullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.cssfullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.isRotateFullscreen = false\n\n /**\n * fullscreenElement\n * @type { HTMLElement | null }\n * @readonly\n */\n this._fullscreenEl = null\n\n this.timeSegments = []\n\n /**\n * cssfullscreen target Element\n * @type { HTMLElement | null }\n * @readonly\n */\n this._cssfullscreenEl = null\n\n /**\n * @type { ?IDefinition }\n * @public\n */\n this.curDefinition = null\n /**\n * @private\n * @type { string }\n */\n this._orgCss = ''\n /**\n * @readonly\n * @type { number }\n */\n this._fullScreenOffset = null\n /**\n * @private\n * @type { number }\n */\n this._videoHeight = 0\n /**\n * @private\n * @type { number }\n */\n this._videoWidth = 0\n\n this.videoPos = {\n pi: 1, // 宽高比\n scale: 0,\n rotate: -1,\n x: 0,\n y: 0,\n h: -1, // 高度占比\n w: -1, // 宽度占比\n vy: 0, // 画面在y方向的偏移\n vx: 0 // 画面在x方向的偏移\n }\n\n this.sizeInfo = {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n\n /**\n * @private\n * @type { { t: number, acc:number, acc: number, loopAcc: number, [propName: string]: any;} }\n */\n this._accPlayed = {\n t: 0,\n acc: 0,\n loopAcc: 0\n }\n\n /**\n * @description 播放器时长、播放时间偏移信息\n */\n this._offsetInfo = {\n currentTime: -1,\n duration: 0\n }\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 控制栏和video不同布局的时候内部容器\n */\n this.innerContainer = null\n\n /**\n * @type { ?Controls }\n * @readonly\n * @description 控制栏插件\n */\n this.controls = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n */\n this.topBar = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 当前播放器根节点\n */\n this.root = null\n\n this.__i18n = I18N.init(this._pluginInfoId)\n\n // android 6以下不支持自动播放\n if (\n Sniffer.os.isAndroid &&\n Sniffer.osVersion > 0 &&\n Sniffer.osVersion < 6\n ) {\n this.config.autoplay = false\n }\n\n /**\n * @readonly\n * @type {any}\n */\n this.database = new Database()\n\n /**\n * @readonly\n * @type { boolean }\n */\n this.isUserActive = false\n\n /**\n * @private\n * @description seek之后canplay回调函数定义\n * @type { Function | null }\n */\n this._onceSeekCanplay = null\n\n /**\n * @description 记录seek之前是否处于暂停状态\n * @type { number }\n * @private\n */\n this._isPauseBeforeSeek = 0\n\n /**\n * @description 内部状态记录\n * @type { {\n * isActiveLocked: boolean;\n * } }\n * @readonly\n */\n this.innerStates = {\n // 当前的active是否是锁定状态\n isActiveLocked: false\n }\n\n /**\n * @type {InstManager}\n */\n this.instManager = instManager\n const rootInit = this._initDOM()\n if (!rootInit) {\n console.error(\n new Error(\n `can't find the dom which id is ${this.config.id} or this.config.el does not exist`\n )\n )\n return\n }\n\n // url为空的情况下 根据definition或playnext.urlList设置播放地址\n // 若未配置definition.defaultDefinition,默认将配置为definition.list[0].definition\n const { definition = {}, url } = this.config\n\n if (!url && definition.list && definition.list.length > 0) {\n let defaultDefinitionObj = definition.list.find(\n (e) => e.definition && e.definition === definition.defaultDefinition\n )\n if (!defaultDefinitionObj) {\n definition.defaultDefinition = definition.list[0].definition\n defaultDefinitionObj = definition.list[0]\n }\n this.config.url = defaultDefinitionObj.url\n this.curDefinition = defaultDefinitionObj\n }\n\n this._bindEvents()\n this._registerPresets()\n this._registerPlugins()\n pluginsManager.onPluginsReady(this)\n\n // url为空的情况下 根据definition设置播放地址\n this.getInitDefinition()\n\n this.setState(STATES.READY)\n Util.setTimeout(this, () => {\n this.emit(Events.READY)\n }, 0)\n this.onReady && this.onReady()\n\n if (this.config.videoInit || this.config.autoplay) {\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n this.start()\n }\n }\n }\n\n /**\n * init control domElement\n * @private\n */\n _initDOM () {\n this.root = this.config.id ? document.getElementById(this.config.id) : null\n if (!this.root) {\n const el = this.config.el\n if (el && el.nodeType === 1) {\n this.root = el\n } else {\n this.emit(\n Events.ERROR,\n new Errors('use', this.config.vid, {\n line: 32,\n handle: 'Constructor',\n msg: 'container id can\\'t be empty'\n })\n )\n console.error('this.confg.id or this.config.el can\\'t be empty')\n return false\n }\n }\n const ret = checkPlayerRoot(this.root)\n if (ret) {\n XG_DEBUG.logWarn(\n 'The is an Player instance already exists in this.root, destroy it and reinitialize'\n )\n ret.destroy()\n }\n this.root.setAttribute(PLATER_ID, this.playerId)\n this.media.setAttribute(PLATER_ID, this.playerId)\n\n instManager?.add(this)\n pluginsManager.init(this)\n this._initBaseDoms()\n\n if (this.config.controls) {\n const _root = this.config.controls.root || null\n const controls = pluginsManager.register(this, Controls, { root: _root })\n this.controls = controls\n }\n const device =\n this.config.isMobileSimulateMode === 'mobile' ? 'mobile' : Sniffer.device\n this.addClass(\n `${STATE_CLASS.DEFAULT} ${STATE_CLASS.INACTIVE} xgplayer-${device} ${\n this.config.controls ? '' : STATE_CLASS.NO_CONTROLS\n }`\n )\n if (this.config.autoplay) {\n this.addClass(STATE_CLASS.ENTER)\n } else {\n this.addClass(STATE_CLASS.NO_START)\n }\n if (this.config.fluid) {\n let { width, height } = this.config\n if (typeof width !== 'number' || typeof height !== 'number') {\n width = 600\n height = 337.5\n }\n const style = {\n width: '100%',\n height: '0',\n 'max-width': '100%',\n 'padding-top': `${(height * 100) / width}%`\n // position: 'relative',\n // top: '0',\n // left: '0'\n }\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\n } else {\n ['width', 'height'].forEach((key) => {\n if (this.config[key]) {\n if (typeof this.config[key] !== 'number') {\n this.root.style[key] = this.config[key]\n } else {\n this.root.style[key] = `${this.config[key]}px`\n }\n }\n })\n }\n const { width, height, left, top } = this.root.getBoundingClientRect()\n this.sizeInfo.width = width\n this.sizeInfo.height = height\n this.sizeInfo.left = left\n this.sizeInfo.top = top\n return true\n }\n\n /**\n * @private\n */\n _initBaseDoms () {\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.topBar = null\n /**\n * @readonly\n * @type { HTMLElement |null }\n */\n this.leftBar = null\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.rightBar = null\n\n if (this.config.marginControls) {\n this.innerContainer = Util.createDom(\n 'xg-video-container',\n '',\n { 'data-index': -1 },\n 'xg-video-container'\n )\n this.root.appendChild(this.innerContainer)\n }\n }\n\n /**\n * @private\n */\n _bindEvents () {\n ['focus', 'blur'].forEach((item) => {\n this.on(item, this['on' + item.charAt(0).toUpperCase() + item.slice(1)])\n })\n\n FULLSCREEN_EVENTS.forEach((item) => {\n document && document.addEventListener(item, this.onFullscreenChange)\n })\n\n if (Sniffer.os.isIos) {\n this.media.addEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.addEventListener( 'webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n this.once(Events.LOADED_DATA, this.resize)\n\n this.playFunc = () => {\n if (!this.config.closeFocusVideoFocus) {\n this.media.focus()\n }\n }\n this.once(Events.PLAY, this.playFunc)\n }\n\n /**\n * @private\n */\n _unbindEvents () {\n this.root.removeEventListener('mousemove', this.mousemoveFunc)\n FULLSCREEN_EVENTS.forEach((item) => {\n document.removeEventListener(item, this.onFullscreenChange)\n })\n this.playFunc && this.off(Events.PLAY, this.playFunc)\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.media.removeEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.removeEventListener('webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n _clearUserTimer () {\n if (!this.userTimer) {\n return\n }\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n\n /**\n *\n * @param { any } [url]\n * @returns\n */\n _startInit (url) {\n if (!this.media) {\n return\n }\n if (\n !url ||\n url === '' ||\n (Util.typeOf(url) === 'Array' && url.length === 0)\n ) {\n url = ''\n this.emit(Events.URL_NULL)\n XG_DEBUG.logWarn(\n 'config.url is null, please get url and run player._startInit(url)'\n )\n if (this.config.nullUrlStart) {\n return\n }\n }\n\n if (this.handleSource) {\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array' && url.length > 0) {\n this._attachSourceEvents(this.media, url)\n } else if (!this.media.src || this.media.src !== url) {\n this.media.src = url\n } else if (!url) {\n this.media.removeAttribute('src')\n }\n }\n\n if (Util.typeOf(this.config.volume) === 'Number') {\n this.volume = this.config.volume\n }\n\n const _root = this.innerContainer ? this.innerContainer : this.root\n if (this.media instanceof window.Element && !_root.contains(this.media)) {\n _root.insertBefore(this.media, _root.firstChild)\n }\n\n const { readyState } = this.media\n XG_DEBUG.logInfo('_startInit readyState', readyState)\n if (this.config.autoplay) {\n !Util.isMSE(this.media) && this.load();\n // ios端无法自动播放的场景下,不调用play不会触发canplay loadeddata等事件\n (Sniffer.os.isIpad || Sniffer.os.isPhone) && this.mediaPlay()\n }\n\n const { startTime } = this.config\n this.__startTime = startTime > 0 ? startTime : -1\n this.config.startTime = 0\n if (readyState >= 2 && this.duration > 0) {\n this.canPlayFunc()\n } else {\n this.on(Events.CANPLAY, this.canPlayFunc)\n }\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n pluginsManager.afterInit(this)\n }\n this.hasStart = true\n this.setState(STATES.ATTACHED)\n Util.setTimeout(this, () => {\n this.emit(Events.COMPLETE)\n }, 0)\n }\n\n /**\n * @description 注册组件 组件列表config.plugins\n * @param { {boolean} } [isInit] 是否是首次初始化\n * @private\n */\n _registerPlugins (isInit = true) {\n /**\n * @private\n */\n this._loadingPlugins = []\n const ignores = this.config.ignores || []\n const plugins = this.config.plugins || []\n const i18n = this.config.i18n || []\n isInit && I18N.extend(i18n, this.__i18n)\n const ignoresStr = ignores.join('||').toLowerCase().split('||')\n const cuPlugins = this.plugins\n plugins.forEach((plugin) => {\n try {\n const pluginName = plugin.plugin\n ? plugin.plugin.pluginName\n : plugin.pluginName\n // 在ignores中的不做组装\n if (pluginName && ignoresStr.indexOf(pluginName.toLowerCase()) > -1) {\n return null\n }\n\n if (!isInit && cuPlugins[pluginName.toLowerCase()]) {\n return\n }\n\n if (plugin.lazy && plugin.loader) {\n const loadingPlugin = pluginsManager.lazyRegister(this, plugin)\n if (plugin.forceBeforeInit) {\n loadingPlugin\n .then(() => {\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n .catch((e) => {\n XG_DEBUG.logError('_registerPlugins:loadingPlugin', e)\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n this._loadingPlugins.push(loadingPlugin)\n }\n\n return\n }\n return this.registerPlugin(plugin)\n } catch (err) {\n XG_DEBUG.logError('_registerPlugins:', err)\n // return\n }\n })\n }\n\n /**\n * @private\n */\n _registerPresets () {\n this.config.presets.forEach((preset) => {\n usePreset(this, preset)\n })\n }\n\n /**\n * @private\n * @param { string } position ]\n */\n _getRootByPosition (position) {\n let _root = null\n switch (position) {\n case POSITIONS.ROOT_RIGHT:\n if (!this.rightBar) {\n this.rightBar = Util.createPositionBar('xg-right-bar', this.root)\n }\n _root = this.rightBar\n break\n case POSITIONS.ROOT_LEFT:\n if (!this.leftBar) {\n this.leftBar = Util.createPositionBar('xg-left-bar', this.root)\n }\n _root = this.leftBar\n break\n case POSITIONS.ROOT_TOP:\n if (!this.topBar) {\n this.topBar = Util.createPositionBar('xg-top-bar', this.root)\n if (this.config.topBarAutoHide) {\n Util.addClass(this.topBar, STATE_CLASS.TOP_BAR_AUTOHIDE)\n }\n }\n _root = this.topBar\n break\n default:\n _root = this.innerContainer || this.root\n break\n }\n return _root\n }\n\n /**\n *\n * @param { {plugin: function, options:object} | function } plugin\n * @param { {[propName: string]: any;} } [config]\n * @returns { any } plugin\n */\n registerPlugin (plugin, config) {\n const _retPlugin = pluginsManager.formatPluginInfo(plugin, config)\n const { PLUFGIN, options } = _retPlugin\n\n // 如果当前配置plugins中不存在该组件, 则将其push\n const { plugins } = this.config\n const exits = pluginsManager.checkPluginIfExits(PLUFGIN.pluginName, plugins)\n !exits && plugins.push(PLUFGIN)\n\n // 获取配置的position或者root\n const _pConfig = pluginsManager.getRootByConfig(PLUFGIN.pluginName, this.config)\n _pConfig.root && (options.root = _pConfig.root)\n _pConfig.position && (options.position = _pConfig.position)\n\n const position = options.position\n ? options.position\n : (options.config && options.config.position) ||\n (PLUFGIN.defaultConfig && PLUFGIN.defaultConfig.position)\n if (\n !options.root &&\n typeof position === 'string' &&\n position.indexOf('controls') > -1\n ) {\n return this.controls?.registerPlugin(PLUFGIN, options, PLUFGIN.pluginName)\n }\n if (!options.root) {\n options.root = this._getRootByPosition(position)\n }\n return pluginsManager.register(this, PLUFGIN, options)\n }\n\n /**\n *\n * @param { any } plugin\n */\n deregister (plugin) {\n if (typeof plugin === 'string') {\n pluginsManager.unRegister(this, plugin)\n } else if (plugin instanceof BasePlugin) {\n pluginsManager.unRegister(this, plugin.pluginName)\n }\n }\n\n /**\n *\n * @param { any } plugin\n * @param { boolean } removedFromConfig\n */\n unRegisterPlugin (plugin, removedFromConfig = false) {\n this.deregister(plugin)\n if (removedFromConfig) {\n this.removePluginFromConfig(plugin)\n }\n }\n\n removePluginFromConfig (plugin) {\n let pluginName\n if (typeof plugin === 'string') {\n pluginName = plugin\n } else if (plugin instanceof BasePlugin) {\n pluginName = plugin.pluginName\n }\n if (!pluginName) {\n return\n }\n for (let i = this.config.plugins.length - 1; i > -1; i--) {\n const plugin = this.config.plugins[i]\n if (plugin.pluginName.toLowerCase() === pluginName.toLowerCase()) {\n this.config.plugins.splice(i, 1)\n break\n }\n }\n }\n\n /**\n * 当前播放器挂载的插件实例列表\n * @type { {[propName: string]: any | null } }\n */\n get plugins () {\n return pluginsManager.getPlugins(this)\n }\n\n /**\n * get a plugin instance\n * @param { string } pluginName\n * @return { null | any } plugin\n */\n getPlugin (pluginName) {\n const plugin = pluginsManager.findPlugin(this, pluginName)\n return plugin && plugin.pluginName ? plugin : null\n }\n\n /**\n *\n * @param { string } className\n */\n addClass (className) {\n if (!this.root) {\n return\n }\n if (!Util.hasClass(this.root, className)) {\n Util.addClass(this.root, className)\n }\n }\n\n /**\n *\n * @param { string } className\n * @returns\n */\n removeClass (className) {\n if (!this.root) {\n return\n }\n Util.removeClass(this.root, className)\n }\n\n /**\n *\n * @param { string } className\n * @returns { boolean } has\n */\n hasClass (className) {\n if (!this.root) {\n return\n }\n return Util.hasClass(this.root, className)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n setAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.setAttribute(key, value)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n removeAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.removeAttribute(key, value)\n }\n\n /**\n *\n * @param { any } [url]\n * @returns { Promise<void> | void }\n * @description 启动播放器,start一般都是播放器内部隐式调用,主要功能是将video添加到DOM\n */\n start (url) {\n // 已经开始初始化播放了 则直接调用play\n if (this.state > STATES.ATTACHING) {\n return\n }\n if (!url && !this.config.url) {\n this.getInitDefinition()\n }\n this.hasStart = true\n this.setState(STATES.ATTACHING)\n\n this._registerPlugins(false)\n return pluginsManager\n .beforeInit(this)\n .then(() => {\n // this.config为空即已经销毁,不再执行后面的异步流程\n if (!this.config) {\n return\n }\n if (!url) {\n url = this.url || this.config.url\n }\n const _furl = this.preProcessUrl(url)\n const ret = this._startInit(_furl.url)\n return ret\n })\n .catch((e) => {\n e.fileName = 'player'\n e.lineNumber = '236'\n XG_DEBUG.logError('start:beforeInit:', e)\n throw e\n })\n }\n\n /**\n * @param { string | object } url\n * @param { SwitchUrlOptions } [options]\n * @returns { Promise | null } 执行结果\n */\n switchURL (url, options) {\n let _src = url\n if (Util.typeOf(url) === 'Object') {\n _src = url.url\n }\n _src = this.preProcessUrl(_src).url\n const curTime = this.currentTime\n this.__startTime = curTime\n const isPaused = this.paused && !this.isError\n this.src = _src\n return new Promise((resolve, reject) => {\n const _error = (e) => {\n this.off('timeupdate', _canplay)\n this.off('canplay', _canplay)\n reject(e)\n }\n const _canplay = () => {\n this._seekToStartTime()\n if (isPaused) {\n this.pause()\n }\n this.off('error', _error)\n resolve(true)\n }\n this.once('error', _error)\n if (!_src){\n this.errorHandler('error', {code: 6, message: 'empty_src'})\n return\n }\n if (Sniffer.os.isAndroid) {\n this.once('timeupdate', _canplay)\n } else {\n this.once('canplay', _canplay)\n }\n this.play()\n })\n }\n\n /**\n * @description call play without play hook\n * @deprecated this api renamed to mediaPlay, you can call it as player.mediaPlay()\n */\n videoPlay () {\n this.mediaPlay()\n }\n\n /**\n * @description call play without play hook\n */\n mediaPlay () {\n if (!this.hasStart && this.state < STATES.ATTACHED) {\n this.removeClass(STATE_CLASS.NO_START)\n this.addClass(STATE_CLASS.ENTER)\n this.start()\n this._useAutoplay = true\n return\n }\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n !this.isCanplay && this.addClass(STATE_CLASS.ENTER)\n }\n const playPromise = super.play()\n if (playPromise !== undefined && playPromise && playPromise.then) {\n playPromise\n .then(() => {\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.addClass(STATE_CLASS.PLAYING)\n if (this.state < STATES.RUNNING) {\n XG_DEBUG.logInfo('>>>>playPromise.then')\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n })\n .catch((e) => {\n XG_DEBUG.logWarn('>>>>playPromise.catch', e.name)\n if (this.media && this.media.error) {\n this.onError()\n // this.errorHandler('error')\n this.removeClass(STATE_CLASS.ENTER)\n // this.setState(STATES.ERROR)\n return\n }\n // 避免AUTOPLAY_PREVENTED先于playing和play触发\n if (e.name === 'NotAllowedError') {\n /**\n * @private\n */\n this._errorTimer = Util.setTimeout(\n this,\n () => {\n this._errorTimer = null\n this.emit(Events.AUTOPLAY_PREVENTED)\n this.addClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.ENTER)\n this.pause()\n this.setState(STATES.NOTALLOW)\n },\n 0\n )\n }\n })\n } else {\n XG_DEBUG.logWarn('video.play not return promise')\n if (this.state < STATES.RUNNING) {\n this.setState(STATES.RUNNING)\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.addClass(STATE_CLASS.PLAYING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n }\n return playPromise\n }\n\n /**\n * @description call play without pause hook\n */\n mediaPause () {\n super.pause()\n }\n\n /**\n * @description call play without pause hook\n * @deprecated this api renamed to mediaPause, you can call it as player.mediaPause()\n */\n videoPause () {\n super.pause()\n }\n\n play () {\n this.removeClass(STATE_CLASS.PAUSED)\n return runHooks(this, 'play', () => {\n return this.mediaPlay()\n })\n }\n\n pause () {\n runHooks(this, 'pause', () => {\n super.pause()\n })\n }\n\n /**\n *\n * @param { number } time\n * @param { 'play' | 'pause' | 'auto' } [status]\n * @returns\n */\n seek (time, status) {\n if (!this.media || Number.isNaN(Number(time)) || !this.hasStart) {\n return\n }\n const { isSeekedPlay, seekedStatus } = this.config\n const _status = status || (isSeekedPlay ? 'play' : seekedStatus)\n time = time < 0 ? 0 : time > this.duration ? parseInt(this.duration, 10) : time\n\n !this._isPauseBeforeSeek && (this._isPauseBeforeSeek = this.paused ? 2 : 1)\n\n this._onceSeekCanplay && this.off(Events.SEEKED, this._onceSeekCanplay)\n\n this._onceSeekCanplay = () => {\n // const { seekedStatus } = this.config\n this.removeClass(STATE_CLASS.ENTER)\n this.isSeeking = false\n switch (_status) {\n case 'play':\n this.play()\n break\n case 'pause':\n this.pause()\n break\n default:\n this._isPauseBeforeSeek > 1 || this.paused ? this.pause() : this.play()\n }\n this._isPauseBeforeSeek = 0\n this._onceSeekCanplay = null\n }\n\n this.once(Events.SEEKED, this._onceSeekCanplay)\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n this.currentTime = time\n // 未起播状态不论希望保持什么状态,都要触发一次play, 避免ios下起播异常问题\n this.play()\n } else {\n this.currentTime = time\n }\n }\n\n getInitDefinition () {\n // url为空的情况下 根据definition设置播放地址\n const { definition, url } = this.config\n if (\n !url &&\n definition &&\n definition.list &&\n definition.list.length > 0 &&\n definition.defaultDefinition\n ) {\n definition.list.map((item) => {\n if (item.definition === definition.defaultDefinition) {\n this.config.url = item.url\n this.curDefinition = item\n }\n })\n }\n }\n\n /**\n * @typedef { import('./defaultConfig').IDefinition } definition\n */\n /**\n * @description change the definition of the current playback\n * @param { definition } to\n * @param { definition } [from]\n */\n changeDefinition (to, from) {\n const { definition } = this.config\n\n if (Array.isArray(definition?.list)) {\n definition.list.forEach((item) => {\n if (to?.definition === item.definition) {\n this.curDefinition = item\n }\n })\n }\n\n if (to?.bitrate && typeof to.bitrate !== 'number') {\n to.bitrate = parseInt(to.bitrate, 10) || 0\n }\n\n this.emit(Events.DEFINITION_CHANGE, { from, to })\n if (!this.hasStart) {\n this.config.url = to.url\n return\n }\n const ret = this.switchURL(to.url, {\n seamless: definition.seamless !== false\n && typeof MediaSource !== 'undefined'\n && typeof MediaSource.isTypeSupported === 'function',\n ...to\n })\n if (ret && ret.then) {\n ret.then(() => {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n })\n } else {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n }\n }\n\n reload () {\n this.load()\n /**\n * @private\n */\n this.reloadFunc = function () {\n this.play()\n }\n this.once(Events.LOADED_DATA, this.reloadFunc)\n }\n\n resetState () {\n const {\n NOT_ALLOW_AUTOPLAY,\n PLAYING,\n NO_START,\n PAUSED,\n REPLAY,\n ENTER,\n ENDED,\n ERROR,\n LOADING\n } = STATE_CLASS\n const clsList = [\n NOT_ALLOW_AUTOPLAY,\n PLAYING,\n NO_START,\n PAUSED,\n REPLAY,\n ENTER,\n ENDED,\n ERROR,\n LOADING\n ]\n this.hasStart = false\n this.isError = false\n this._useAutoplay = false\n this.mediaPause()\n this._accPlayed.acc = 0\n this._accPlayed.t = 0\n this._accPlayed.loopAcc = 0\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n this.addClass(STATE_CLASS.NO_START)\n this.emit(Events.RESET)\n }\n\n /**\n * 重置播放实例\n * @param { Array<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 media.removeAttribute(PLATER_ID)\n this.updateAcc('destroy')\n this._unbindEvents()\n this._detachSourceEvents(this.media)\n Util.clearAllTimers(this)\n this.emit(Events.DESTROY)\n instManager?.remove(this)\n pluginsManager.destroy(this)\n delHooksDescriptor(this)\n super.destroy()\n // 退出全屏\n if (this.fullscreen && this._fullscreenEl === this.root) {\n this.exitFullscreen()\n }\n\n if (innerContainer) {\n const _c = innerContainer.children\n for (let i = 0; i < _c.length; i++) {\n innerContainer.removeChild(_c[i])\n }\n }\n !innerContainer &&\n media instanceof window.Node &&\n root.contains(media) && !this.config.remainMediaAfterDestroy &&\n root.removeChild(media);\n ['topBar', 'leftBar', 'rightBar', 'innerContainer'].map((item) => {\n this[item] && root.removeChild(this[item])\n this[item] = null\n })\n const cList = root.className.split(' ')\n if (cList.length > 0) {\n root.className = cList\n .filter((name) => name.indexOf('xgplayer') < 0)\n .join(' ')\n } else {\n root.className = ''\n }\n this.removeAttribute('data-xgfill');\n\n [\n 'isSeeking',\n 'isCanplay',\n 'isActive',\n 'cssfullscreen',\n 'fullscreen'\n ].forEach((key) => {\n this[key] = false\n })\n }\n\n replay () {\n this.removeClass(STATE_CLASS.ENDED)\n this.currentTime = 0\n this.isSeeking = false\n runHooks(this, 'replay', () => {\n this.once(Events.SEEKED, () => {\n const playPromise = this.mediaPlay()\n if (playPromise && playPromise.catch) {\n playPromise.catch(err => {\n console.log(err)\n })\n }\n })\n this.emit(Events.REPLAY)\n this.onPlay()\n })\n }\n\n retry () {\n this.removeClass(STATE_CLASS.ERROR)\n this.addClass(STATE_CLASS.LOADING)\n runHooks(this, 'retry', () => {\n const cur = this.currentTime\n const { url } = this.config\n const _srcRet = !Util.isMSE(this.media) ? this.preProcessUrl(url) : { url }\n this.src = _srcRet.url\n !this.config.isLive && (this.currentTime = cur)\n this.once(Events.CANPLAY, () => {\n this.mediaPlay()\n })\n })\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n changeFullStyle (root, el, rootClass, pClassName) {\n if (!root) {\n return\n }\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (!this._orgCss) {\n this._orgCss = Util.filterStyleFromText(root)\n }\n Util.addClass(root, rootClass)\n if (el && el !== root && !this._orgPCss) {\n /**\n * @private\n */\n this._orgPCss = Util.filterStyleFromText(el)\n Util.addClass(el, pClassName)\n el.setAttribute(PLATER_ID, this.playerId)\n }\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n recoverFullStyle (root, el, rootClass, pClassName) {\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (this._orgCss) {\n Util.setStyleFromCsstext(root, this._orgCss)\n this._orgCss = ''\n }\n Util.removeClass(root, rootClass)\n if (el && el !== root && this._orgPCss) {\n Util.setStyleFromCsstext(el, this._orgPCss)\n this._orgPCss = ''\n Util.removeClass(el, pClassName)\n el.removeAttribute(PLATER_ID)\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise<void> }\n */\n getFullscreen (el = this.config.fullscreenTarget) {\n const { root, media } = this\n if (el === 'video' || el === 'media') {\n el = this[el]\n }\n if (!el) {\n el = root\n }\n this._fullScreenOffset = {\n top: Util.scrollTop(),\n left: Util.scrollLeft()\n }\n\n this._fullscreenEl = el\n /**\n * @private\n */\n this._fullActionFrom = 'get'\n const fullEl = Util.getFullScreenEl()\n if (fullEl === this._fullscreenEl) {\n this.onFullscreenChange()\n return Promise.resolve()\n }\n try {\n for (let i = 0; i < GET_FULLSCREEN_API.length; i++) {\n const key = GET_FULLSCREEN_API[i]\n if (el[key]) {\n const ret =\n key === 'webkitRequestFullscreen'\n ? el.webkitRequestFullscreen(window.Element.ALLOW_KEYBOARD_INPUT)\n : el[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (media.fullscreenEnabled || media.webkitSupportsFullscreen) {\n media.webkitEnterFullscreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call getFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call getFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise<void> }\n */\n exitFullscreen (el) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n }\n if (!this._fullscreenEl && !Util.getFullScreenEl()) {\n return\n }\n const { root, media } = this\n if (!el) {\n el = root\n }\n this._fullActionFrom = 'exit'\n try {\n for (let i = 0; i < EXIT_FULLSCREEN_API.length; i++) {\n const key = EXIT_FULLSCREEN_API[i]\n if (document[key]) {\n const ret = document[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (media && media.webkitSupportsFullscreen) {\n media.webkitExitFullScreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call exitFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call exitFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n getCssFullscreen (el = this.config.fullscreenTarget) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n } else if (this.fullscreen) {\n this.exitFullscreen()\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n this.changeFullStyle(this.root, el, _class)\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.fullscreen = true\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n this._cssfullscreenEl = el\n this.cssfullscreen = true\n this.emit(Events.CSS_FULLSCREEN_CHANGE, true)\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n exitCssFullscreen () {\n const _class = this._cssfullscreenEl\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n if (!this.fullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n } else {\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n this.fullscreen = false\n this.emit(Events.FULLSCREEN_CHANGE, false)\n } else {\n this.removeClass(_class)\n }\n }\n this._cssfullscreenEl = null\n this.cssfullscreen = false\n this.emit(Events.CSS_FULLSCREEN_CHANGE, false)\n }\n\n /**\n * 进入旋转全屏\n * @param { HTMLElement } [el]\n */\n getRotateFullscreen (el = this.config.fullscreenTarget) {\n if (this.cssfullscreen) {\n this.exitCssFullscreen(el)\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this._fullscreenEl = el || this.root\n this.changeFullStyle(\n this.root,\n el,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = true\n this.fullscreen = true\n this.setRotateDeg(90)\n this._rootStyle = this.root.getAttribute('style')\n this.root.style.width = `${window.innerHeight}px`\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n\n /**\n * 退出旋转全屏\n * @param { HTMLElement } [el]\n */\n exitRotateFullscreen (el) {\n const _class =\n this._fullscreenEl !== this.root\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this.recoverFullStyle(\n this.root,\n this._fullscreenEl,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = false\n this.fullscreen = false\n this.setRotateDeg(0)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n if (this._rootStyle) {\n this.root.style.style = this._rootStyle\n this._rootStyle = false\n }\n }\n\n setRotateDeg (deg) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.rotateDeg = 0\n } else {\n this.rotateDeg = deg\n }\n }\n\n /**\n * @description 播放器焦点状态,控制栏显示\n * @param { {\n * autoHide?: boolean, // 是否可以自动隐藏\n * delay?: number // 自动隐藏的延迟时间, ms, 不传默认使用3000ms\n * isLock?: boolean // 是否锁定, 锁定之后自动呼出和blur调用都不生效, 默认值false\n * } } [data]\n */\n focus (\n data = {\n autoHide: !this.config.closeDelayBlur,\n delay: this.config.inactive\n }\n ) {\n if (this.isActive) {\n this.onFocus(data)\n return\n }\n this.emit(Events.PLAYER_FOCUS, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @description 取消播放器当前焦点状态\n * @param { { ignorePaused?: boolean } } [data]\n */\n blur (data = { ignorePaused: false }) {\n if (!this.isActive) {\n this.onBlur(data)\n return\n }\n this._clearUserTimer()\n this.emit(Events.PLAYER_BLUR, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @protected\n * @param { { autoHide?: boolean, delay?: number, isLock?: boolean } } [data]\n * @returns\n */\n onFocus (data = { autoHide: true, delay: 3000 }) {\n const { innerStates } = this\n this.isActive = true\n this.removeClass(STATE_CLASS.INACTIVE)\n this._clearUserTimer()\n if (data.isLock !== undefined) {\n innerStates.isActiveLocked = data.isLock\n }\n if (data.autoHide === false || data.isLock === true || innerStates.isActiveLocked) {\n this._clearUserTimer()\n return\n }\n const time = data && data.delay ? data.delay : this.config.inactive\n this.userTimer = Util.setTimeout(this, () => {\n this.userTimer = null\n this.blur()\n }, time)\n }\n\n /**\n * @protected\n * @param {{ ignorePaused?: boolean }} [data]\n * @returns\n */\n onBlur ({ ignorePaused = false } = {}) {\n if (this.innerStates.isActiveLocked) {\n return\n }\n const { closePauseVideoFocus } = this.config\n this.isActive = false\n if (ignorePaused || closePauseVideoFocus || (!this.paused && !this.ended)) {\n this.addClass(STATE_CLASS.INACTIVE)\n }\n }\n\n canPlayFunc = () => {\n if (!this.config) {\n return\n }\n const { autoplay, defaultPlaybackRate } = this.config\n\n XG_DEBUG.logInfo('player', 'canPlayFunc, startTime', this.__startTime)\n this._seekToStartTime()\n\n // 解决浏览器安装了一些倍速扩展插件的情况下,倍速设置失效问题\n this.playbackRate = defaultPlaybackRate;\n\n (autoplay || this._useAutoplay) && this.mediaPlay()\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.removeClass(STATE_CLASS.ENTER)\n }\n\n /**\n *\n */\n onFullscreenChange = (event, isFullScreen) => {\n const delayResize = () => {\n Util.setTimeout(this, () => {\n this.resize()\n }, 100)\n }\n const fullEl = Util.getFullScreenEl()\n if (this._fullActionFrom) {\n this._fullActionFrom = ''\n } else {\n // 快捷键触发\n this.emit(Events.USER_ACTION, {\n eventType: 'system',\n action: 'switch_fullscreen',\n pluginName: 'player',\n currentTime: this.currentTime,\n duration: this.duration,\n props: [{\n prop: 'fullscreen',\n from: true,\n to: false\n }]\n })\n }\n const isVideo = checkIsCurrentVideo(fullEl, this.playerId, PLATER_ID)\n if (isFullScreen || (fullEl && (fullEl === this._fullscreenEl || isVideo))) {\n delayResize()\n !this.config.closeFocusVideoFocus && this.media.focus()\n this.fullscreen = true\n // this.addClass(STATE_CLASS.FULLSCREEN)\n this.changeFullStyle(this.root, fullEl, STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, true, this._fullScreenOffset)\n if (this.cssfullscreen) {\n this.exitCssFullscreen()\n }\n } else if (this.fullscreen) {\n delayResize()\n const { _fullScreenOffset, config } = this\n if (config.needFullscreenScroll) {\n // 保证页面scroll的情况下退出全屏 页面回到原位置\n window.scrollTo(_fullScreenOffset.left, _fullScreenOffset.top)\n Util.setTimeout( this, () => {\n this.fullscreen = false\n this._fullScreenOffset = null\n }, 100)\n } else {\n // 保证页面scroll的情况下退出全屏 页面定位在播放器位置\n !this.config.closeFocusVideoFocus && this.media.focus()\n this.fullscreen = false\n this._fullScreenOffset = null\n }\n if (!this.cssfullscreen) {\n let el = this._fullscreenEl\n if (!el && (this.root.contains(event.target) || event.target === this.root)) {\n el = event.target\n }\n this.recoverFullStyle( this.root, el, STATE_CLASS.FULLSCREEN)\n } else {\n this.removeClass(STATE_CLASS.FULLSCREEN)\n }\n this._fullscreenEl = null\n // this.removeClass(STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n }\n }\n\n _onWebkitbeginfullscreen = (e) => {\n this._fullscreenEl = this.media\n this.onFullscreenChange(e, true)\n }\n\n _onWebkitendfullscreen = (e) => {\n this.onFullscreenChange(e, false)\n }\n\n onEmptied () {\n this.updateAcc('emptied')\n }\n\n /**\n * @protected\n */\n onCanplay () {\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.ERROR)\n this.removeClass(STATE_CLASS.LOADING)\n this.isCanplay = true\n this.waitTimer && Util.clearTimeout(this, this.waitTimer)\n }\n\n onLoadeddata () {\n this.isError = false\n this.isSeeking = false\n if (this.__startTime > 0) {\n if (this.duration > 0) {\n this._seekToStartTime()\n } else {\n // 在安卓原生video播放hls时,loadeddata触发时durationchange事件虽然已经触发过了但duration仍然为0,\n // 需要在下一次durationchange触发时再重新设置起播时间\n this.once(Events.DURATION_CHANGE, () => {\n this._seekToStartTime()\n })\n }\n }\n }\n\n onLoadstart () {\n this.removeClass(STATE_CLASS.ERROR)\n this.isCanplay = false\n }\n\n /**\n * @protected\n */\n onPlay () {\n if (this.state === STATES.ENDED) {\n this.setState(STATES.RUNNING)\n }\n this.removeClass(STATE_CLASS.PAUSED)\n this.ended && this.removeClass(STATE_CLASS.ENDED)\n !this.config.closePlayVideoFocus && this.focus()\n }\n\n /**\n * @protected\n */\n onPause () {\n this.addClass(STATE_CLASS.PAUSED)\n this.updateAcc('pause')\n if (!this.config.closePauseVideoFocus) {\n this._clearUserTimer()\n this.focus()\n }\n }\n\n /**\n * @protected\n */\n onEnded () {\n this.updateAcc('ended')\n this.addClass(STATE_CLASS.ENDED)\n this.setState(STATES.ENDED)\n // this.removeClass(STATE_CLASS.PLAYING)\n }\n\n /**\n * @protected\n */\n onError () {\n // this.setState(STATES.ERROR)\n this.isError = true\n this.updateAcc('error')\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.LOADING)\n this.addClass(STATE_CLASS.ERROR)\n }\n\n /**\n * @protected\n */\n onSeeking () {\n if (!this.isSeeking) {\n this.updateAcc('seeking')\n }\n this.isSeeking = true\n this.addClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onSeeked () {\n this.isSeeking = false\n // for ie,playing fired before waiting\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.removeClass(STATE_CLASS.LOADING)\n this.removeClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onWaiting () {\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.updateAcc('waiting')\n this.waitTimer = Util.setTimeout(this, () => {\n this.addClass(STATE_CLASS.LOADING)\n this.emit(Events.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }, this.config.minWaitDelay)\n }\n\n /**\n * @protected\n */\n onPlaying () {\n this.isError = false\n const { NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING } = STATE_CLASS\n const clsList = [NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING]\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n /**\n * @protected\n */\n onTimeupdate () {\n !this._videoHeight && this.media.videoHeight && this.resize()\n if ((this.waitTimer || this.hasClass(STATE_CLASS.LOADING)) &&\n this.media.readyState > 2\n ) {\n this.removeClass(STATE_CLASS.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }\n\n // 兼容safari在调整为静音之后未调用play自动起播问题\n if (!this.paused && this.state === STATES.NOTALLOW && this.duration) {\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n\n if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n onVolumechange () {\n Util.typeOf(this.config.volume) === 'Number' &&\n (this.config.volume = this.volume)\n }\n\n onRatechange () {\n this.config.defaultPlaybackRate = this.playbackRate\n }\n\n /**\n * 触发用户行为事件,第一个参数是Dom事件\n * @param { Event } event\n * @param { string } action\n * @param {[propName: string]: any; } [params]\n * @returns\n */\n emitUserAction (event, action, params) {\n if (!this.media || !action || !event) {\n return\n }\n const eventType =\n Util.typeOf(event) === 'String' ? event : event.type || ''\n\n // if (action === 'switch_play_pause') {\n // Util.typeOf(params.paused) === 'Undefined' && (params.paused = this.paused)\n // params.isFirstStart = !this.playing\n // }\n\n if (params.props && Util.typeOf(params.props) !== 'Array') {\n params.props = [params.props]\n }\n this.emit(Events.USER_ACTION, {\n eventType,\n action,\n // pluginName: this.pluginName,\n currentTime: this.currentTime,\n duration: this.duration,\n ended: this.ended,\n event,\n ...params\n })\n }\n\n updateAcc (endType) {\n if (this._accPlayed.t) {\n const _at = new Date().getTime() - this._accPlayed.t\n this._accPlayed.acc += _at\n this._accPlayed.t = 0\n if (endType === 'ended' || this.ended) {\n this._accPlayed.loopAcc = this._accPlayed.acc\n }\n }\n }\n\n /**\n * 目标时间点是否在buffer内\n * @param { number } time 时间点\n * @param options 判断阈值配置,可选的\n * @param options.startDiff 判断起始阈值,即该时间下距离buffer开始点超过阈值时才算作在buffer内,默认为0\n * @param options.endDiff 判断结束阈值,即该时间下距离buffer结束点超过阈值时才算作在buffer内,默认为0\n * @returns { boolean }\n */\n checkBuffer (\n time,\n options = {\n startDiff: 0,\n endDiff: 0\n }) {\n const { startDiff = 0, endDiff = 0 } = options || {}\n const buffered = this.media.buffered\n if (!buffered || buffered.length === 0 || !this.duration) {\n return true\n }\n const currentTime = time || this.media.currentTime || 0.2\n const len = buffered.length\n for (let i = 0; i < len; i++) {\n if (buffered.start(i) + startDiff <= currentTime && buffered.end(i) - endDiff > currentTime) {\n return true\n }\n }\n return false\n }\n\n resizePosition () {\n const { vy, vx, h, w } = this.videoPos\n let rotate = this.videoPos.rotate\n if (rotate < 0 && h < 0 && w < 0) {\n return\n }\n let _pi = this.videoPos._pi\n if (!_pi && this.media.videoHeight) {\n _pi = this.media.videoWidth / this.media.videoHeight * 100\n }\n if (!_pi) {\n return\n }\n this.videoPos.pi = _pi\n rotate = rotate < 0 ? 0 : rotate\n const _pos = {\n rotate\n }\n let offsetY = 0\n let offsetX = 0\n let scale = 1\n const _t = Math.abs(rotate / 90)\n const { root, innerContainer } = this\n const width = root.offsetWidth\n const height = innerContainer ? innerContainer.offsetHeight : root.offsetHeight\n const styles = {}\n let rHeight = height\n let rWidth = width\n\n if (_t % 2 === 0) {\n scale = h > 0 ? 100 / h : (w > 0 ? 100 / w : 1)\n _pos.scale = scale\n offsetY = vy > 0 ? (100 - h) / 2 - vy : 0\n _pos.y = _t === 2 ? 0 - offsetY : offsetY\n offsetX = vx > 0 ? (100 - w) / 2 - vx : 0\n _pos.x = _t === 2 ? 0 - offsetX : offsetX\n styles.width = `${rWidth}px`\n styles.height = `${rHeight}px`\n styles.maxWidth = ''\n styles.maxHeight = ''\n } else if (_t % 2 === 1) {\n rWidth = height\n rHeight = width\n const offset = height - width\n offsetX = -offset / 2 / rWidth * 100\n _pos.x = _t === 3 ? offsetX + vy / 2 : offsetX - vy / 2\n offsetY = offset / 2 / rHeight * 100\n _pos.y = _t === 3 ? offsetY + vx / 2 : offsetY - vx / 2\n _pos.scale = scale\n styles.width = `${rWidth}px`\n styles.maxWidth = `${rWidth}px`\n styles.height = `${rHeight}px`\n styles.maxHeight = `${rHeight}px`\n }\n const formStyle = Util.getTransformStyle(_pos, this.media.style.transform || this.media.style.webkitTransform)\n styles.transform = formStyle\n styles.webkitTransform = formStyle\n\n Object.keys(styles).map(key => {\n this.media.style[key] = styles[key]\n })\n }\n\n /**\n * @description position video/audio according to height ratio and y coordinate\n * @param { { h: number, y?: number, x?:number, w?:number} } pos\n * @returns\n */\n position (pos = { h: 0, y: 0, x: 0, w: 0 }) {\n if (!this.media || !pos || !pos.h) {\n return\n }\n const { videoPos } = this\n videoPos.h = pos.h * 100 || 0\n videoPos.w = pos.w * 100 || 0\n videoPos.vx = pos.x * 100 || 0\n videoPos.vy = pos.y * 100 || 0\n this.resizePosition()\n }\n\n /**\n * @description Update configuration parameters\n * @param { IPlayerOptions } config\n */\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map((key) => {\n if (key !== 'plugins') {\n this.config[key] = config[key]\n const plugin = this.plugins[key.toLowerCase()]\n if (plugin && Util.typeOf(plugin.setConfig) === 'Function') {\n plugin.setConfig(config[key])\n }\n }\n })\n }\n\n /**\n * @description play another video resource\n * @param { IPlayerOptions } config\n */\n playNext (config) {\n this.resetState()\n this.setConfig(config)\n this._currentTime = 0\n this._duration = 0\n runHooks(this, 'playnext', () => {\n this.start()\n this.emit(Events.PLAYNEXT, config)\n })\n }\n\n resize () {\n if (!this.media) {\n return\n }\n const containerSize = this.root.getBoundingClientRect()\n this.sizeInfo.width = containerSize.width\n this.sizeInfo.height = containerSize.height\n this.sizeInfo.left = containerSize.left\n this.sizeInfo.top = containerSize.top\n const { videoWidth, videoHeight } = this.media\n const { fitVideoSize, videoFillMode } = this.config\n\n if (videoFillMode === 'fill' || videoFillMode === 'cover' || videoFillMode === 'contain') {\n this.setAttribute('data-xgfill', videoFillMode)\n }\n\n if (!videoHeight || !videoWidth) {\n return\n }\n this._videoHeight = videoHeight\n this._videoWidth = videoWidth\n const controlsHeight =\n this.controls && this.innerContainer\n ? this.controls.root.getBoundingClientRect().height\n : 0\n const width = containerSize.width\n const height = containerSize.height - controlsHeight\n const videoFit = parseInt((videoWidth / videoHeight) * 1000, 10)\n const fit = parseInt((width / height) * 1000, 10)\n let rWidth = width\n let rHeight = height\n const _style = {}\n if (\n (fitVideoSize === 'auto' && fit > videoFit) ||\n fitVideoSize === 'fixWidth'\n ) {\n rHeight = (width / videoFit) * 1000\n if (this.config.fluid) {\n _style.paddingTop = `${(rHeight * 100) / rWidth}%`\n } else {\n _style.height = `${rHeight + controlsHeight}px`\n }\n } else if (\n (fitVideoSize === 'auto' && fit < videoFit) ||\n fitVideoSize === 'fixHeight'\n ) {\n rWidth = (videoFit * height) / 1000\n _style.width = `${rWidth}px`\n }\n // 全屏不做行间css设置\n if (!this.fullscreen && !this.cssfullscreen) {\n Object.keys(_style).forEach((key) => {\n this.root.style[key] = _style[key]\n })\n }\n // video填充模式\n if (\n (videoFillMode === 'fillHeight' && fit < videoFit) ||\n (videoFillMode === 'fillWidth' && fit > videoFit)\n ) {\n this.setAttribute('data-xgfill', 'cover')\n }\n const data = {\n videoScale: videoFit,\n vWidth: rWidth,\n vHeight: rHeight,\n cWidth: rWidth,\n cHeight: rHeight + controlsHeight\n }\n this.resizePosition()\n this.emit(Events.VIDEO_RESIZE, data)\n }\n\n /**\n *\n * @param { number } left\n * @param { number } top\n * @returns\n */\n updateObjectPosition (left = 0, top = 0) {\n if (this.media.updateObjectPosition) {\n this.media.updateObjectPosition(left, top)\n return\n }\n this.media.style.objectPosition = `${left * 100}% ${top * 100}%`\n }\n\n /**\n * @protected\n * @param { number } newState\n */\n setState (newState) {\n XG_DEBUG.logInfo(\n 'setState',\n `state from:${STATE_ARRAY[this.state]} to:${STATE_ARRAY[newState]}`\n )\n this._state = newState\n }\n\n /**\n * @description url preprocessing\n * @param { IUrl } url\n * @param { {[propName: string]: any} } [ext]\n * @returns { url: IUrl, [propName: string]: any }\n * @public\n */\n preProcessUrl (url, ext) {\n const { preProcessUrl, preProcessUrlOptions } = this.config\n const processUrlOptions = Object.assign({}, preProcessUrlOptions, ext)\n return !Util.isBlob(url) && typeof preProcessUrl === 'function' ? preProcessUrl(url, processUrlOptions) : { url }\n }\n\n\n /**\n * @description 跳转至配置的起播时间点\n */\n _seekToStartTime () {\n if (this.__startTime > 0 && this.duration > 0) {\n this.currentTime = this.__startTime > this.duration ? this.duration : this.__startTime\n this.__startTime = -1\n }\n }\n\n /**\n * @type { number }\n */\n get state () {\n return this._state\n }\n\n /**\n * @type { boolean }\n */\n get isFullscreen () {\n return this.fullscreen\n }\n\n /**\n * @type { boolean }\n */\n get isCssfullScreen () {\n return this.cssfullscreen\n }\n\n /**\n * @type { boolean }\n * @description 是否开始播放\n */\n get hasStart () {\n return this._hasStart\n }\n\n set hasStart (bool) {\n if (typeof bool === 'boolean') {\n this._hasStart = bool\n if (bool === false) {\n this.setState(STATES.READY)\n }\n this.emit('hasstart')\n }\n }\n\n /**\n * @type { boolean }\n * @description 是否已经进入起播状态\n */\n get isPlaying () {\n return this._state === STATES.RUNNING || this._state === STATES.ENDED\n }\n\n set isPlaying (value) {\n if (value) {\n this.setState(STATES.RUNNING)\n } else {\n this._state >= STATES.RUNNING && (this.setState(STATES.ATTACHED))\n }\n }\n\n /**\n * @type { Array.<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 { acc, t } = this._accPlayed\n return t ? new Date().getTime() - t + acc : acc\n }\n\n /**\n * @type { number }\n */\n get zoom () {\n return this.config.zoom\n }\n\n /**\n * @type { number }\n */\n set zoom (value) {\n this.config.zoom = value\n }\n\n /**\n * @type {number}\n * @description Media element rotation angle, Only multiples of 90 degrees are supported\n */\n set videoRotateDeg (val) {\n val = Util.convertDeg(val)\n if (val % 90 !== 0 || val === this.videoPos.rotate) {\n return\n }\n this.videoPos.rotate = val\n this.resizePosition()\n }\n\n get videoRotateDeg () {\n return this.videoPos.rotate\n }\n\n /**\n * @description 均衡下载速度,单位kb/s, 根据10条最新下载速度计算出来的加权值,如果没有测速能力则默认是0\n * @type { number }\n */\n set avgSpeed (val) {\n AVG_SPEED = val\n }\n\n get avgSpeed () {\n return AVG_SPEED\n }\n\n /**\n * @type { number }\n * 最新一次下载速度,单位kb/s, 如果没有测速能力则默认是0\n */\n set realTimeSpeed (val) {\n REAL_TIME_SPEED = val\n }\n\n get realTimeSpeed () {\n return REAL_TIME_SPEED\n }\n\n get offsetCurrentTime () {\n return this._offsetInfo.currentTime || 0\n }\n\n set offsetCurrentTime (val) {\n this._offsetInfo.currentTime = val\n }\n\n get offsetDuration () {\n return this._offsetInfo.duration || 0\n }\n\n set offsetDuration (val) {\n this._offsetInfo.duration = val || 0\n }\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns {boolean} isSuccess\n */\n useHooks (hookName, handler) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise<any> } handler\n * @returns\n */\n removeHooks (hookName, handler) {\n return removeHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n usePluginHooks (pluginName, hookName, handler, ...args) {\n return usePluginHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n removePluginHooks (pluginName, hookName, handler, ...args) {\n return removePluginHooks.call(this, ...arguments)\n }\n\n /**\n * 设置当前实例的用户激活态\n * @param { boolean } isActive\n * @param { boolean } [isMuted]\n */\n setUserActive (isActive, isMuted) {\n if (typeof isMuted === 'boolean' && isMuted !== this.muted) {\n this.addInnerOP('volumechange')\n if (Util.typeOf(isMuted) === Boolean) {\n /**\n * @type {boolean}\n */\n this.muted = isMuted\n }\n }\n instManager?.setActive(this.playerId, isActive)\n }\n\n /**\n * 当前浏览器是否支持hevc编码\n * @returns {boolean}\n */\n static isHevcSupported () {\n return Sniffer.isHevcSupported()\n }\n\n /**\n * 检测编码参数是否被当前浏览器支持\n * @doc https://developer.mozilla.org/en-US/docs/Web/API/MediaCapabilities/decodingInfo\n * @param {MediaDecodingConfiguration} info\n * @returns {MediaCapabilitiesDecodingInfo}\n */\n static probeConfigSupported (info) {\n return Sniffer.probeConfigSupported(info)\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static install (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n if (!Player.plugins[name]) {\n Player.plugins[name] = descriptor\n }\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static use (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n Player.plugins[name] = descriptor\n }\n\n static defaultPreset = null;\n\n /**\n * @description 自定义media构造函数\n */\n static XgVideoProxy = null;\n}\n\n// use the default instance manager.\nPlayer.instManager = InstManager.getInstance()\n\nexport {\n Player as default,\n Plugin,\n BasePlugin,\n Events,\n Errors,\n Sniffer,\n Util,\n STATE_CLASS,\n I18N\n}\n","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 from '../../plugin'\n\nexport default class Icon extends Plugin {\n afterCreate () {\n this.bind('mouseenter', this._onMouseenter)\n this.bind('mouseleave', this._onMouseLeave)\n if (this.config.disable) {\n this.disable()\n }\n }\n\n _onMouseenter = (e) => {\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n _onMouseLeave = (e) => {\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n destroy () {\n this.unbind('mouseenter', this._onMouseenter)\n this.unbind('mouseleave', this._onMouseLeave)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport 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, { 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 * useScreenOrientation?: boolean,\n * lockOrientationType?: OrientationType,\n * switchCallback?: () => any,\n * target?: null | HTMLElement,\n * disable?: boolean,\n * needBackIcon?: boolean,\n * [propName: string]: any\n * } } IFullscreenConfig\n */\nexport default class Fullscreen extends IconPlugin {\n static get pluginName () {\n return 'fullscreen'\n }\n\n /**\n * @type IFullscreenConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 0,\n useCssFullscreen: false, // Whether to use the page full screen\n rotateFullscreen: false, // Whether to enable rotating full screen\n useScreenOrientation: false, // Whether to use ScreenOrientation lock after requestFullScreen if ScreenOrientation available\n lockOrientationType: 'landscape', // Whether to lock screen if video width is greater than height\n switchCallback: null, // Custom switch function\n target: null, // Trigger Dom element\n disable: false,\n needBackIcon: false // Whether to enable the return button in the upper left corner of the full screen exit\n }\n }\n\n afterCreate () {\n super.afterCreate()\n const { config, playerConfig } = this\n if (config.disable) {\n return\n }\n\n if (config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n const fullEl = Util.getFullScreenEl()\n\n if (playerConfig.fullscreenTarget === fullEl) {\n this.player.getFullscreen().catch(e=>{})\n }\n\n this.initIcons()\n\n this.handleFullscreen = this.hook('fullscreenChange', this.toggleFullScreen, {\n pre: (e) => {\n const { fullscreen } = this.player\n this.emitUserAction(e, 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n }\n })\n\n this.bind('.xgplayer-fullscreen', ['touchend', 'click'], this.handleFullscreen)\n\n this.on(Events.FULLSCREEN_CHANGE, (isFullScreen) => {\n const tipsDom = this.find('.xg-tips')\n tipsDom && this.changeLangTextKey(tipsDom, isFullScreen ? this.i18nKeys.EXITFULLSCREEN_TIPS : this.i18nKeys.FULLSCREEN_TIPS)\n this.animate(isFullScreen)\n })\n if (this.config.needBackIcon) {\n this.topBackIcon = this.player.registerPlugin({\n plugin: TopBackIcon,\n options: {\n config: {\n onClick: (e) => {\n this.handleFullscreen(e)\n }\n }\n }\n })\n }\n if (Sniffer.device === 'mobile') {\n window.addEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n /**\n * @private\n */\n _onOrientationChange = (e) => {\n if (this.player.fullscreen && this.config.rotateFullscreen) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.player.setRotateDeg(0)\n } else {\n this.player.setRotateDeg(90)\n }\n }\n }\n\n registerIcons () {\n return {\n fullscreen: { icon: FullScreenSvg, class: 'xg-get-fullscreen' },\n exitFullscreen: { icon: ExitFullScreenSvg, class: 'xg-exit-fullscreen' }\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.handleFullscreen)\n if (Sniffer.device === 'mobile') {\n window.removeEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.fullscreen)\n this.appendChild('.xgplayer-icon', icons.exitFullscreen)\n }\n\n /**\n * 切换全屏\n * @param { Event } [e]\n */\n toggleFullScreen (e) {\n if (e instanceof Event) {\n e.preventDefault()\n e.stopPropagation()\n }\n const { player, config } = this\n const useCssFullscreen = config.useCssFullscreen === true || (typeof config.useCssFullscreen === 'function' && config.useCssFullscreen())\n if (useCssFullscreen) {\n if (player.fullscreen) {\n player.exitCssFullscreen()\n } else {\n player.getCssFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.rotateFullscreen) {\n if (player.fullscreen) {\n player.exitRotateFullscreen()\n } else {\n player.getRotateFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.switchCallback && typeof config.switchCallback === 'function') {\n config.switchCallback(player.fullscreen)\n } else {\n if (player.fullscreen) {\n player.exitFullscreen()\n\n if (config.useScreenOrientation) {\n this.unlockScreen()\n }\n } else {\n player.getFullscreen().catch(e => {})\n\n if (config.useScreenOrientation && player.aspectRatio > 1) {\n this.lockScreen(config.lockOrientationType)\n }\n }\n }\n }\n\n /**\n *\n * @param { boolean } isFullScreen\n */\n animate (isFullScreen) {\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n if (this.topBackIcon) {\n if (isFullScreen) {\n this.topBackIcon.show()\n this.hide()\n } else {\n this.topBackIcon.hide()\n this.show()\n }\n }\n }\n\n /**\n * @returns\n */\n render () {\n if (this.config.disable) {\n return\n }\n const langKey = 'FULLSCREEN_TIPS'\n return `<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 /**\n * 锁定屏幕方向,只有部分移动端浏览器支持\n * 兼容性参考:https://caniuse.com/mdn-api_screenorientation_lock\n * @param {OrientationType} orientation\n */\n lockScreen (orientation) {\n try {\n screen.orientation.lock(orientation).catch(e => {})\n } catch (e) {\n }\n }\n\n /**\n * 解锁屏幕方向锁定,只有部分移动端浏览器支持\n */\n unlockScreen () {\n try {\n screen.orientation.unlock().catch(e => {})\n } catch (e) {\n }\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\nclass Play extends IconPlugin {\n static get pluginName () {\n return 'play'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 0,\n disable: false\n }\n }\n\n afterCreate () {\n super.afterCreate()\n const { config } = this\n if (config.disable) {\n return\n }\n this.initIcons()\n this.bind(['touchend', 'click'], this.btnClick)\n\n this.listenEvents()\n this.animate(true)\n }\n\n listenEvents () {\n const { player } = this\n this.on([Events.PLAY, Events.PAUSE, Events.ERROR, Events.EMPTIED], () => {\n this.animate(player.paused)\n })\n }\n\n registerIcons () {\n return {\n play: { icon: PlaySvg, class: 'xg-icon-play' },\n pause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n btnClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { prop: 'paused', from: player.paused, to: !player.paused })\n if (player.ended) {\n player.replay()\n } else if (player.paused) {\n player.play()\n this.animate(false)\n } else {\n player.pause()\n this.animate(true)\n }\n return false\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.play)\n this.appendChild('.xgplayer-icon', icons.pause)\n }\n\n animate (paused) {\n if (!this.player) {return}\n const { i18nKeys } = this\n const tipDom = this.find('.xg-tips')\n if (paused) {\n this.setAttr('data-state', 'pause')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PLAY_TIPS)\n } else {\n this.setAttr('data-state', 'play')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PAUSE_TIPS)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['touchend', 'click'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<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 { Util } from '../../plugin'\n\nconst TPL = [\n { tag: 'xg-cache', className: 'xgplayer-progress-cache', styleKey: 'cachedColor' },\n { tag: 'xg-played', className: 'xgplayer-progress-played', styleKey: 'playedColor' }\n]\n\nexport default class InnerList {\n constructor (args) {\n this.fragments = args.fragments || []\n if (this.fragments.length === 0) {\n this.fragments.push({ percent: 1 })\n }\n this._callBack = args.actionCallback\n this.fragConfig = {\n fragFocusClass: args.fragFocusClass || 'inner-focus-point', // 'inner-focus',\n fragAutoFocus: !!args.fragAutoFocus,\n fragClass: args.fragClass || ''\n }\n this.style = args.style || {\n playedColor: '',\n cachedColor: '',\n progressColor: ''\n }\n this.duration = 0\n this.cachedIndex = 0\n this.playedIndex = 0\n this.focusIndex = -1\n }\n\n updateDuration (duration) {\n this.duration = duration\n let start = 0\n const { fragments } = this\n this.fragments = fragments.map(item => {\n item.start = parseInt(start, 10)\n item.end = parseInt(start + item.percent * this.duration, 10)\n item.duration = parseInt(item.percent * this.duration, 10)\n start += item.percent * this.duration\n return item\n })\n }\n\n updateProgress (type = 'played', data = { newIndex: 0, curIndex: 0, millisecond: 0 }) {\n const { progressList, fragments } = this\n if (progressList.length < 1) {\n return\n }\n const { newIndex, curIndex, millisecond } = data\n if (newIndex !== curIndex) {\n progressList.map((item, index) => {\n if (index < newIndex) {\n item[type].style.width = '100%'\n } else if (index > newIndex) {\n item[type].style.width = 0\n }\n })\n }\n const curPFrag = fragments[newIndex]\n const per = millisecond === 0 ? 0 : (millisecond - curPFrag.start) / curPFrag.duration\n progressList[newIndex][type].style.width = per < 0 ? 0 : `${per * 100}%`\n }\n\n updateFocus (data) {\n if (!this.fragConfig.fragAutoFocus || this.fragments.length < 2) {\n return\n }\n if (!data) {\n // 取消焦点\n if (this.focusIndex > -1) {\n this.unHightLight(this.focusIndex)\n const _data = {\n index: -1,\n preIndex: this.focusIndex,\n fragment: null\n }\n this._callBack && this._callBack(_data)\n this.focusIndex = -1\n }\n return\n }\n const newPIndex = this.findIndex(data.currentTime * 1000, this.focusIndex)\n if (newPIndex >= 0 && newPIndex !== this.focusIndex) {\n this.focusIndex > -1 && this.unHightLight(this.focusIndex)\n this.setHightLight(newPIndex)\n const _data = {\n index: newPIndex,\n preIndex: this.focusIndex,\n fragment: this.fragments[this.focusIndex]\n }\n this.focusIndex = newPIndex\n this._callBack && this._callBack(_data)\n }\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!this.duration || parseInt(duration * 1000, 10) !== this.duration) {\n if (!duration && duration !== 0) {\n return\n }\n this.updateDuration(parseInt(duration * 1000, 10))\n }\n const { playedIndex, cachedIndex } = this\n if (Util.typeOf(data.played) !== 'Undefined') {\n const newPIndex = this.findIndex(data.played * 1000, playedIndex)\n if (newPIndex < 0) {\n return\n }\n this.updateProgress('played', {\n newIndex: newPIndex,\n curIndex: playedIndex,\n millisecond: parseInt(data.played * 1000, 10)\n })\n this.playedIndex = newPIndex\n }\n\n if (Util.typeOf(data.cached) !== 'Undefined') {\n const newCIndex = this.findIndex(data.cached * 1000, cachedIndex)\n if (newCIndex < 0) {\n return\n }\n this.updateProgress('cached', {\n newIndex: newCIndex,\n curIndex: cachedIndex,\n millisecond: parseInt(data.cached * 1000, 10)\n })\n this.cachedIndex = newCIndex\n }\n }\n\n findIndex (time, curIndex) {\n const { fragments } = this\n if (!fragments || fragments.length === 0) {\n return -1\n }\n if (fragments.length === 1) {\n return 0\n }\n if (curIndex > -1 && curIndex < fragments.length && time > fragments[curIndex].start && time < fragments[curIndex].end) {\n return curIndex\n }\n if (time > fragments[fragments.length - 1].start) {\n return fragments.length - 1\n }\n\n for (let i = 0; i < fragments.length; i++) {\n if (time > fragments[i].start && time <= fragments[i].end) {\n curIndex = i\n break\n }\n }\n return curIndex\n }\n\n findHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n if (Util.hasClass(children[i], this.fragConfig.fragFocusClass)) {\n return {\n dom: children[i],\n pos: children[i].getBoundingClientRect()\n }\n }\n }\n }\n\n // 根据索引获取进度条片段\n findFragment (index) {\n const children = this.root.children\n if (index < 0 || index >= children.length) {\n return null\n }\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n\n unHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n Util.removeClass(children[i], this.fragConfig.fragFocusClass)\n }\n }\n\n setHightLight (index) {\n const children = this.root.children\n if (index < children.length) {\n Util.addClass(children[index], this.fragConfig.fragFocusClass)\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n }\n\n destroy () {\n this.progressList = null\n this.fragments = null\n this.root.innerHTML = ''\n }\n\n /**\n * 重置当前\n * @param {*} newOptions\n */\n reset (newOptions) {\n // 更新fragConfig\n Object.keys(this.fragConfig).forEach(key => {\n if (newOptions[key] !== undefined) {\n this.fragConfig[key] = newOptions[key]\n }\n })\n if (newOptions.fragments) {\n this.fragments = newOptions.fragments.length === 0 ? [{ percent: 1 }] : newOptions.fragments\n this.updateDuration(this.duration)\n this.playedIndex = 0\n this.cachedIndex = 0\n // 移除分段信息\n if (this.root) {\n const _c = this.root.children\n while (_c.length > 0) {\n this.root.removeChild(_c[0])\n }\n }\n // 重新渲染\n this.render()\n }\n }\n\n render () {\n const { progressColor } = this.style\n if (!this.root) {\n this.root = Util.createDom('xg-inners', '', {}, 'progress-list')\n }\n if (this.fragments) {\n const { fragClass, fragFocusClass } = this.fragConfig\n this.progressList = this.fragments.map((item) => {\n const inner = Util.createDom('xg-inner', '', {\n style: progressColor ? `background:${progressColor}; flex: ${item.percent}` : `flex: ${item.percent}`\n }, `${item.isFocus ? fragFocusClass : ''} xgplayer-progress-inner ${fragClass}`)\n\n this.root.appendChild(inner)\n\n TPL.forEach(item => {\n inner.appendChild(Util.createDom(item.tag, '', {\n style: item.styleKey ? `background: ${this.style[item.styleKey]}; width:0;` : 'width:0;'\n }, item.className))\n })\n\n return {\n cached: inner.children[0],\n played: inner.children[1]\n }\n })\n }\n return this.root\n }\n}\n","import Plugin, { Events, Util, POSITIONS, Sniffer } from '../../plugin'\nimport InnerList from './innerList'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?:string,\n * disable?: boolean,\n * isDraggingSeek?: boolean, // 是否在拖拽的过程中更新currentTime\n * closeMoveSeek?: boolean, // 是否关闭滑块seek能力\n * isPauseMoving?: boolean, // 是否在move的时候暂停视频内容\n * isCloseClickSeek?: boolean, // 是否关闭点击进度条的时候seek\n * fragments?: Array<{percent: number}>,\n * fragFocusClass?: string, // 进度条分段高亮类名\n * fragAutoFocus?: boolean, // 是否hover的时候自动高亮\n * miniMoveStep?: number,\n * miniStartStep?: number,\n * onMoveStart?: () => any, // 手势开始移动回调,\n * onMoveEnd?: () => any, // 手势移动结束回调\n * endedDiff?: number,\n * [propName: string]: any\n * }} IProgressConfig\n */\n/**\n * 进度条组件\n */\n\n// 分段获取焦点显示的时候的两种class类型\nconst FRAGMENT_FOCUS_CLASS = {\n POINT: 'inner-focus-point',\n HIGHLIGHT: 'inner-focus-highlight'\n}\nclass Progress extends Plugin {\n static get pluginName () {\n return 'progress'\n }\n\n /**\n * @type IProgressConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_CENTER,\n index: 0,\n disable: false,\n isDraggingSeek: true, // 是否在拖拽的过程中更新currentTime\n closeMoveSeek: false, // 是否关闭滑块seek能力\n isPauseMoving: false, // 是否在move的时候暂停视频内容\n isCloseClickSeek: false, // 是否关闭点击进度条的时候seek\n fragments: [{ percent: 1 }],\n fragFocusClass: FRAGMENT_FOCUS_CLASS.POINT,\n fragClass: '', // 内置进度条类名\n fragAutoFocus: false, // 是否hover的时候自动高亮\n miniMoveStep: 5,\n miniStartStep: 2,\n onMoveStart: () => {\n }, // 手势开始移动回调\n onMoveEnd: () => {}, // 手势移动结束回调\n endedDiff: 0.2\n }\n }\n\n static get FRAGMENT_FOCUS_CLASS () {\n return FRAGMENT_FOCUS_CLASS\n }\n\n constructor (args) {\n super(args)\n /**\n * @readonly\n */\n this.useable = false\n /**\n * @readonly\n */\n this.isProgressMoving = false\n\n /**\n * @private\n */\n this.__dragCallBacks = []\n /**\n * @private\n */\n this._state = {\n now: -1,\n direc: 0,\n time: 0,\n prePlayTime: -1\n }\n\n this._disableBlur = false\n\n // 兼容旧版本\n if (typeof this.config.isDragingSeek === 'boolean') {\n console.warn('[XGPLAYER] \\'isDragingSeek\\' is deprecated, please use \\'isDraggingSeek\\' instead')\n this.config.isDraggingSeek = this.config.isDragingSeek\n }\n }\n\n get offsetDuration () {\n return this.playerConfig.customDuration || this.player.offsetDuration || this.player.duration\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : (currentTime + this.timeOffset)\n }\n\n changeState (useable = true) {\n this.useable = useable\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n this.root && (this.root.style.display = 'flex')\n }\n /**\n * @description 创建内部进度条,并挂载到xg-outer上,\n * 并把一些对外API绑定在progress上供外部调用\n *\n */\n _initInner (fragments = [], config = {}) {\n if (!fragments || fragments.length === 0) {\n fragments = [{ percent: 1 }]\n }\n const _c = {\n fragments,\n ...config,\n actionCallback: (data) => {\n this.emitUserAction('fragment_focus', 'fragment_focus', data)\n }\n }\n if (!this.innerList) {\n this.innerList = new InnerList(_c)\n this.outer.insertBefore(this.innerList.render(), this.outer.children[0]);\n ['findHightLight', 'unHightLight', 'setHightLight', 'findFragment'].map(item => {\n this[item] = this.innerList[item].bind(this.innerList)\n })\n } else {\n this.innerList.reset(_c)\n }\n }\n\n _updateInnerFocus (data) {\n this.innerList && this.innerList.updateFocus(data)\n }\n\n afterCreate () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n this.pos = {\n x: 0, // 水平方向位移\n y: 0, // 垂直方向位移\n moving: false, // 是否正在移动\n isDown: false, // 是否mouseDown\n isEnter: false, // 是否触发了mouseEnter\n isLocked: false // 是否刚刚锁定回过进度条\n }\n this.outer = this.find('xg-outer')\n const { fragFocusClass, fragAutoFocus, fragClass } = this.config\n this._initInner(this.config.fragments, { fragFocusClass, fragAutoFocus, fragClass, style: this.playerConfig.commonStyle || {} })\n if (Sniffer.device === 'mobile') {\n this.config.isDraggingSeek = false\n this.isMobile = true\n }\n\n this.progressBtn = this.find('.xgplayer-progress-btn')\n\n this.listenEvents()\n this.bindDomEvents()\n this.initCustomStyle()\n }\n\n /**\n * This method can be overridden.\n * Eg. xgplayer-ads/ui/adProgress.js\n */\n listenEvents () {\n this.on(Events.DURATION_CHANGE, () => {\n this.onMouseLeave()\n })\n\n this.on(Events.TIME_UPDATE, () => {\n this.onTimeupdate()\n })\n\n this.on(Events.SEEKED, () => {\n this.onTimeupdate()\n this.onCacheUpdate()\n })\n\n this.on(Events.PROGRESS, () => {\n this.onCacheUpdate()\n })\n\n this.on(Events.ENDED, () => {\n this.onCacheUpdate(true)\n this.onTimeupdate(true)\n this._state.now = 0\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n\n this.on(Events.VIDEO_RESIZE, () => {\n this.onVideoResize()\n })\n }\n\n /**\n * @description 配置更新响应,插件内置调用api, 播放器整体配置更新的时候调用\n * @param {IProgressConfig} config\n */\n setConfig (config) {\n let frags = null\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n if (key === 'fragments') {\n frags = config[key]\n }\n })\n if (frags) {\n this._initInner(frags, config)\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { sliderBtnStyle } = commonStyle\n const { progressBtn } = this\n if (sliderBtnStyle) {\n if (typeof sliderBtnStyle === 'string') {\n progressBtn.style.boxShadow = sliderBtnStyle\n } else if (typeof sliderBtnStyle === 'object') {\n Object.keys(sliderBtnStyle).map(key => {\n progressBtn.style[key] = sliderBtnStyle[key]\n })\n }\n }\n }\n\n /**\n * 触发某一类回调监听\n * @param { string } type 类型 drag/dragend\n * @param { any} data 具体数据\n */\n triggerCallbacks (type, data, event) {\n if (this.__dragCallBacks.length > 0) {\n this.__dragCallBacks.map(item => {\n if (item && item.handler && item.type === type) {\n try {\n item.handler(data, event)\n } catch (error) {\n console.error(`[XGPLAYER][triggerCallbacks] ${item} error`, error)\n }\n }\n })\n }\n }\n\n /**\n * 供外部插件添加回调\n * @param {string} type 类型 drag/dragend\n * @param {function} handle 回调函数句柄\n */\n addCallBack (type, handle) {\n if (handle && typeof handle === 'function') {\n this.__dragCallBacks.push({ type: type, handler: handle })\n }\n }\n\n /**\n * 供外部插件移除回调\n * @param {string} type 类型 drag/dragend\n * @param {Function} event 回调函数句柄\n */\n removeCallBack (type, event) {\n const { __dragCallBacks } = this\n let _index = -1\n __dragCallBacks.map((item, index) => {\n if (item && item.type === type && item.handler === event) {\n _index = index\n }\n })\n if (_index > -1) {\n __dragCallBacks.splice(_index, 1)\n }\n }\n\n /**\n * @description 解除进度条的所动状态\n * @returns\n */\n unlock () {\n const { player, pos } = this\n pos.isEnter = false\n pos.isLocked = false\n if (player.isMini) {\n return\n }\n this.unbind('mousemove', this.onMoveOnly)\n if (pos.isDown) {\n this.unbind('mouseleave', this.onMouseLeave)\n return\n }\n this.blur()\n }\n\n bindDomEvents () {\n const { config } = this.player\n this._mouseDownHandlerHook = this.hook('dragstart', this._mouseDownHandler)\n this._mouseUpHandlerHook = this.hook('dragend', this._mouseUpHandler)\n this._mouseMoveHandlerHook = this.hook('drag', this._mouseMoveHandler)\n\n if (this.domEventType === 'touch' || this.domEventType === 'compatible') {\n this.root.addEventListener('touchstart', this.onMouseDown)\n }\n\n if (this.domEventType === 'mouse' || this.domEventType === 'compatible') {\n this.bind('mousedown', this.onMouseDown)\n config.isMobileSimulateMode !== 'mobile' && this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseover', this.onMouseOver)\n this.bind('mouseout', this.onMouseOut)\n // 避免触发videoClick 暂停/播放切换\n this.player.root.addEventListener('click', this.onBodyClick, true)\n }\n }\n\n focus () {\n this.player.controls.pauseAutoHide()\n Util.addClass(this.root, 'active')\n }\n\n blur () {\n if (this._disableBlur) {\n return\n }\n this.player.controls.recoverAutoHide()\n Util.removeClass(this.root, 'active')\n }\n\n disableBlur () {\n this._disableBlur = true\n }\n\n enableBlur () {\n this._disableBlur = false\n }\n\n onMoveOnly = (e, data) => {\n const { pos, config, player } = this\n let ret = data\n if (e) {\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (pos.moving && Math.abs(pos.x - x) < config.miniMoveStep) {\n return\n }\n pos.moving = true\n pos.x = x\n ret = this.computeTime(e, x)\n }\n this.triggerCallbacks('dragmove', ret, e)\n this._updateInnerFocus(ret)\n }\n\n /**\n * 避免mouseup的时候触发父辈节点的click事件,和单击视频区域切换暂停/播放互斥\n * @param {*} e\n * @returns\n */\n onBodyClick = (e) => {\n if (!this.pos.isLocked) {\n return\n }\n this.pos.isLocked = false\n e.preventDefault()\n e.stopPropagation()\n }\n\n _mouseDownHandler = (event, data) => {\n this._state.time = data.currentTime\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 0)\n this._updateInnerFocus(data)\n }\n\n _mouseUpHandler = (e, data) => {\n const { pos } = this\n pos.moving && this.updateWidth(data.currentTime, data.seekTime, data.percent, 2)\n }\n\n _mouseMoveHandler = (e, data) => {\n const { _state, pos, config, player } = this\n if (_state.time < data.currentTime) {\n data.forward = true\n } else {\n data.forward = false\n }\n _state.time = data.currentTime\n if (pos.isDown && !pos.moving) {\n pos.moving = true\n config.isPauseMoving && player.pause()\n this.triggerCallbacks('dragstart', data, e)\n this.emitUserAction('drag', 'dragstart', data)\n }\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 1)\n this.triggerCallbacks('dragmove', data, e)\n this._updateInnerFocus(data)\n }\n\n onMouseDown = (e) => {\n const { _state, player, pos, config, playerConfig } = this\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (player.isMini || config.closeMoveSeek || (!playerConfig.allowSeekAfterEnded && player.ended)) {\n return\n }\n\n if (!player.duration && !player.isPlaying) {\n player.play()\n return\n }\n e.stopPropagation()\n // e.preventDefault()\n this.focus()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n Util.checkIsFunction(config.onMoveStart) && config.onMoveStart()\n Util.event(e)\n pos.x = x\n pos.isDown = true\n pos.moving = false\n _state.prePlayTime = player.currentTime\n\n // 交互开始 禁止控制栏的自动隐藏功能\n player.focus({ autoHide: false })\n this.isProgressMoving = true\n Util.addClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseDownHandlerHook(e, ret)\n\n const eventType = e.type\n if (eventType === 'touchstart') {\n this.root.addEventListener('touchmove', this.onMouseMove)\n this.root.addEventListener('touchend', this.onMouseUp)\n this.root.addEventListener('touchcancel', this.onMouseUp)\n } else {\n this.unbind('mousemove', this.onMoveOnly)\n\n document.addEventListener('mousemove', this.onMouseMove, false)\n document.addEventListener('mouseup', this.onMouseUp, false)\n // this.bind('mouseup', this.onMouseUp, false)\n }\n return true\n }\n\n onMouseUp = (e) => {\n const { player, config, pos, playerConfig, _state } = this\n if (!pos) {\n return\n }\n e.stopPropagation()\n e.preventDefault()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n Util.checkIsFunction(config.onMoveEnd) && config.onMoveEnd()\n Util.event(e)\n Util.removeClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, pos.x)\n ret.prePlayTime = _state.prePlayTime\n if (pos.moving) {\n this.triggerCallbacks('dragend', ret, e)\n this.emitUserAction('drag', 'dragend', ret)\n } else {\n this.triggerCallbacks('click', ret, e)\n this.emitUserAction('click', 'click', ret)\n }\n this._mouseUpHandlerHook(e, ret)\n\n pos.moving = false\n pos.isDown = false\n pos.x = 0\n pos.y = 0\n pos.isLocked = true\n _state.prePlayTime = 0\n _state.time = 0\n const eventType = e.type\n if (eventType === 'touchend' || eventType === 'touchcancel') {\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n this.root.removeEventListener('touchcancel', this.onMouseUp)\n // 交互结束 恢复控制栏的隐藏流程\n this.blur()\n } else {\n document.removeEventListener('mousemove', this.onMouseMove, false)\n document.removeEventListener('mouseup', this.onMouseUp, false)\n if (!pos.isEnter) {\n this.onMouseLeave(e)\n } else {\n playerConfig.isMobileSimulateMode !== 'mobile' && this.bind('mousemove', this.onMoveOnly)\n }\n }\n // 延迟复位,状态复位要在dom相关时间回调执行之后\n Util.setTimeout(this, () => {\n this.resetSeekState()\n }, 1)\n // 交互结束 恢复控制栏的隐藏流程\n player.focus()\n }\n\n onMouseMove = (e) => {\n const { _state, pos, player, config } = this\n if (Util.checkTouchSupport()) {\n // e.stopPropagation()\n e.preventDefault()\n }\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const diff = Math.abs(pos.x - x)\n if ((pos.moving && diff < config.miniMoveStep) || (!pos.moving && diff < config.miniStartStep)) {\n return\n }\n pos.x = x\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseMoveHandlerHook(e, ret)\n }\n\n onMouseOut = (e) => {\n this.triggerCallbacks('mouseout', null, e)\n }\n\n onMouseOver = (e) => {\n this.triggerCallbacks('mouseover', null, e)\n }\n\n onMouseEnter = (e) => {\n const { player, pos } = this\n if (pos.isDown || pos.isEnter || player.isMini || (!player.config.allowSeekAfterEnded && player.ended)) {\n return\n }\n pos.isEnter = true\n this.bind('mousemove', this.onMoveOnly)\n this.bind('mouseleave', this.onMouseLeave)\n // 计算预览位置\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const ret = this.computeTime(e, x)\n this.triggerCallbacks('mouseenter', ret, e)\n this.focus()\n }\n\n onMouseLeave = (e) => {\n this.triggerCallbacks('mouseleave', null, e)\n this.unlock()\n this._updateInnerFocus(null)\n }\n\n onVideoResize = () => {\n const { x, isDown, isEnter } = this.pos\n if (isEnter && !isDown) {\n const ret = this.computeTime(null, x)\n this.onMoveOnly(null, ret)\n }\n }\n\n /**\n * @description 根据currenTime和占用百分比更新进度条\n * @param {number} currentTime 需要更新到的时间\n * @param {number} seekTime 实际seek的时间\n * @param {number} percent 更新时间占比\n * @param {number} type 触发类型 0-down 1-move 2-up\n */\n updateWidth (currentTime, seekTime, percent, type) {\n const { config, player } = this\n if (config.isCloseClickSeek && type === 0) {\n return\n }\n\n const realTime = seekTime = seekTime >= player.duration ? player.duration - config.endedDiff : Number(seekTime).toFixed(1)\n\n this.updatePercent(percent)\n this.updateTime(currentTime)\n if (type === 1 && (!config.isDraggingSeek || player.config.mediaType === 'audio')) {\n return\n }\n this._state.now = realTime\n this._state.direc = realTime > player.currentTime ? 0 : 1\n player.seek(realTime)\n }\n\n computeTime (e, x) {\n const { player } = this\n const { width, height, top, left } = this.root.getBoundingClientRect()\n let rWidth, rLeft\n const clientX = x\n if (player.rotateDeg === 90) {\n rWidth = height\n rLeft = top\n } else {\n rWidth = width\n rLeft = left\n }\n let offset = clientX - rLeft\n offset = offset > rWidth ? rWidth : (offset < 0 ? 0 : offset)\n let percent = offset / rWidth\n percent = percent < 0 ? 0 : (percent > 1 ? 1 : percent)\n if(Number.isNaN(percent)){\n percent = this.player.currentTime / this.offsetDuration\n }\n const currentTime = parseInt(percent * this.offsetDuration * 1000, 10) / 1000\n const seekTime = Util.getCurrentTimeByOffset(currentTime, player.timeSegments)\n return {\n percent,\n currentTime,\n seekTime,\n offset,\n width: rWidth,\n left: rLeft,\n e\n }\n }\n\n /**\n * @description 更新时间插件,在拖拽状态下要接管时间插件的更新状态\n * 本位置会和time插件交互\n * @param {number} time 根据拖拽距离计算出的时间\n */\n updateTime (time) {\n const { player, duration } = this\n if (time > duration) {\n time = duration\n } else if (time < 0) {\n time = 0\n }\n const timeIcon = player.plugins.time\n if (timeIcon) {\n timeIcon.updateTime(time)\n }\n }\n\n /**\n * @description 复位正在拖拽状态 ,拖拽的时候要避免timeupdate更新\n */\n resetSeekState () {\n this.isProgressMoving = false\n const timeIcon = this.player.plugins.time\n timeIcon && timeIcon.resetActive()\n }\n\n /**\n * @description 拖拽过程中更新UI\n * @param {number} percent 小于0的小数\n *\n */\n updatePercent (percent, notSeek) {\n this.isProgressMoving = true\n if (this.config.disable) {\n return\n }\n percent = percent > 1 ? 1 : (percent < 0 ? 0 : percent)\n this.progressBtn.style.left = `${percent * 100}%`\n this.innerList.update({ played: percent * this.offsetDuration }, this.offsetDuration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: percent * this.offsetDuration }, this.offsetDuration)\n }\n\n /**\n * @description 播放进度更新\n * @param { boolean } isEnded 是否是播放结束的时候调用\n * @returns\n */\n onTimeupdate (isEnded) {\n const { player, _state, offsetDuration } = this\n if ((player.isSeeking && player.media.seeking) || this.isProgressMoving || !player.hasStart) {\n return\n }\n if (_state.now > -1) {\n const abs = parseInt(_state.now * 1000, 10) - parseInt(player.currentTime * 1000, 10)\n if ((_state.direc === 0 && abs > 300) || (_state.direc === 1 && abs > -300)) {\n _state.now = -1\n return\n } else {\n _state.now = -1\n }\n }\n let time = this.currentTime // this.timeOffset + player.currentTime\n time = Util.adjustTimeByDuration(time, offsetDuration, isEnded)\n this.innerList.update({ played: time }, offsetDuration)\n this.progressBtn.style.left = `${time / offsetDuration * 100}%`\n }\n\n /**\n * @description 缓存进度更新\n * @param { boolean } isEnded 是否是结束时触发\n * @returns\n */\n onCacheUpdate (isEnded) {\n const { player, duration } = this\n if (!player) {\n return\n }\n // 兼容设置了customDuration, 实际时长和要显示的时不一致问题\n let _end = player.bufferedPoint.end\n _end = Util.adjustTimeByDuration(_end, duration, isEnded)\n this.innerList.update({ cached: _end }, duration)\n }\n\n onReset () {\n this.innerList.update({ played: 0, cached: 0 }, 0)\n this.progressBtn.style.left = '0%'\n }\n\n destroy () {\n const { player } = this\n this.thumbnailPlugin = null\n this.innerList.destroy()\n this.innerList = null\n const { domEventType } = this\n if (domEventType === 'touch' || domEventType === 'compatible') {\n this.root.removeEventListener('touchstart', this.onMouseDown)\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n this.root.removeEventListener('touchcancel', this.onMouseUp)\n }\n if (domEventType === 'mouse' || domEventType === 'compatible') {\n this.unbind('mousedown', this.onMouseDown)\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mousemove', this.onMoveOnly)\n this.unbind('mouseleave', this.onMouseLeave)\n document.removeEventListener('mousemove', this.onMouseMove, false)\n document.removeEventListener('mouseup', this.onMouseUp, false)\n player.root.removeEventListener('click', this.onBodyClick, true)\n }\n }\n\n render () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n const controlsMode = this.player.controls ? this.player.controls.config.mode : ''\n const className = controlsMode === 'bottom' ? 'xgplayer-progress-bottom' : ''\n return `\n <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, { Util, Events, POSITIONS } from '../../plugin'\nimport './index.scss'\n\nclass Time extends Plugin {\n static get pluginName () {\n return 'time'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 2,\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.isActiving = false\n }\n\n get duration () {\n const { offsetDuration, duration } = this.player\n return this.playerConfig.customDuration || offsetDuration || duration\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : currentTime\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n afterCreate () {\n const constrolsMode = this.player.controls.config.mode\n this.mode = constrolsMode === 'flex' ? 'flex' : 'normal'\n if (this.config.disable) {\n return\n }\n if (this.mode === 'flex') {\n this.createCenterTime()\n this.root.style.display = 'none'\n }\n this.durationDom = this.find('.time-duration')\n this.timeDom = this.find('.time-current')\n\n this.listenEvents()\n }\n\n /**\n * This method can be overridden.\n * Eg. xgplayer-ads/ui/adTime.js\n */\n listenEvents () {\n this.on([Events.DURATION_CHANGE, Events.SEEKED, Events.TIME_UPDATE], (e) => {\n if (e.eventName === 'durationchange') {\n this.isActiving = false\n }\n this.onTimeUpdate()\n })\n\n this.on(Events.ENDED, () => {\n // 因为customDuration存在,最终播放currentTime可能和显示的duration不统一,所以在ended的时候修正\n this.onTimeUpdate(true)\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'block')\n this.centerDurDom && (this.centerDurDom.style.display = 'block')\n return\n }\n this.root.style.display = 'block'\n }\n\n hide () {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'none')\n this.centerDurDom && (this.centerDurDom.style.display = 'none')\n return\n }\n this.root.style.display = 'none'\n }\n\n onTimeUpdate (isEnded) {\n const { player, config, duration } = this\n if (config.disable || this.isActiving || !player.hasStart) {\n return\n }\n let current = this.currentTime + this.timeOffset\n current = Util.adjustTimeByDuration(current, duration, isEnded)\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.centerDurDom.innerHTML = Util.format(duration)\n }\n } else {\n this.timeDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.durationDom.innerHTML = Util.format(duration)\n }\n }\n }\n\n onReset () {\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(0))\n this.centerDurDom.innerHTML = Util.format(0)\n } else {\n this.timeDom.innerHTML = this.minWidthTime(Util.format(0))\n this.durationDom.innerHTML = Util.format(0)\n }\n }\n\n createCenterTime () {\n const { player } = this\n if (!player.controls || !player.controls.center) {\n return\n }\n const center = player.controls.center\n this.centerCurDom = Util.createDom(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-left'\n )\n this.centerDurDom = Util.createDom(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-right'\n )\n center.children.length > 0\n ? center.insertBefore(this.centerCurDom, center.children[0])\n : center.appendChild(this.centerCurDom)\n center.appendChild(this.centerDurDom)\n }\n\n afterPlayerInit () {\n const { config } = this\n if (this.duration === Infinity || this.playerConfig.isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n }\n if (config.hide) {\n this.hide()\n return\n }\n this.show()\n }\n\n changeLiveState (isLive) {\n if (isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n Util.show(this.find('.time-separator'))\n Util.show(this.durationDom)\n Util.show(this.timeDom)\n }\n }\n\n updateTime (time) {\n this.isActiving = true\n if ((!time && time !== 0) || time > this.duration) {\n return\n }\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(time))\n return\n }\n this.timeDom.innerHTML = this.minWidthTime(Util.format(time))\n }\n\n minWidthTime (timeStr) {\n return timeStr\n .split(':')\n .map(value => `<span class=\"time-min-width\">${value}</span>`)\n .join(':')\n }\n\n resetActive () {\n const { player } = this\n const updateState = () => {\n this.isActiving = false\n }\n this.off(Events.SEEKED, updateState)\n if (player.isSeeking && player.media.seeking) {\n this.once(Events.SEEKED, updateState)\n } else {\n this.isActiving = false\n }\n }\n\n destroy () {\n const { center } = this.player.controls\n this.centerCurDom && center.removeChild(this.centerCurDom)\n this.centerCurDom = null\n this.centerDurDom && center.removeChild(this.centerDurDom)\n this.centerDurDom = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-time\">\n <span class=\"time-current\">00:00</span>\n <span class=\"time-separator\">/</span>\n <span class=\"time-duration\">00:00</span>\n <span class=\"time-live-tag\">${this.i18n.LIVE_TIP}</span>\n </xg-icon>`\n }\n}\nexport default Time\n","import Plugin, { Util, Events, Sniffer, POSITIONS } from '../../plugin'\nimport volumeLargeSvg from '../assets/volumeLarge.svg'\nimport volumeSmallSvg from '../assets/volumeSmall.svg'\nimport volumeMutedSvg from '../assets/volumeMuted.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string, // [可选]插件挂载的dom\n * index?: number // [可选]插件在播放器中挂载的位置\n * disable?: boolean, // [可选]是否禁用插件交互行为\n * showValueLabel?: boolean, // [可选]是否显示当前滑动的音量数值\n * default?: number // [可选]默认\n * [propName: string]: any\n * }} IVolumeConfig\n */\n\nclass Volume extends Plugin {\n static get pluginName () {\n return 'volume'\n }\n\n /**\n * @type IVolumeConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT, // [可选]插件挂载的dom\n index: 1, // [可选]插件在播放器中挂载的位置\n disable: false, // [可选]是否禁用插件交互行为\n showValueLabel: false, // [可选]是否显示当前滑动的音量数值\n default: 0.6, // [可选]默认音量\n miniVolume: 0.2 // 静音恢复的时候最小音量\n }\n }\n\n registerIcons () {\n return {\n volumeSmall: { icon: volumeSmallSvg, class: 'xg-volume-small' },\n volumeLarge: { icon: volumeLargeSvg, class: 'xg-volume' },\n volumeMuted: { icon: volumeMutedSvg, class: 'xg-volume-mute' }\n }\n }\n\n afterCreate () {\n this._timerId = null\n this._d = {\n isStart: false,\n isMoving: false,\n isActive: false\n }\n if (this.config.disable) {\n return\n }\n\n this.initIcons()\n\n const { commonStyle, volume } = this.playerConfig\n if (commonStyle.volumeColor) {\n this.find('.xgplayer-drag').style.backgroundColor = commonStyle.volumeColor\n }\n this.changeMutedHandler = this.hook('mutedChange', (e) => {\n this.changeMuted(e)\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this._onMouseenterHandler = this.hook('mouseenter', this.onMouseenter)\n this._onMouseleaveHandler = this.hook('mouseleave', this.onMouseleave)\n\n if (!(Sniffer.device === 'mobile') && this.playerConfig.isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this._onMouseenterHandler)\n\n this.bind(['blur', 'mouseleave'], this._onMouseleaveHandler)\n\n this.bind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.bind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.bind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n }\n\n this.bind('.xgplayer-icon', ['touchend', 'click'], this.changeMutedHandler)\n\n this.on(Events.VOLUME_CHANGE, this.onVolumeChange)\n this.once(Events.LOADED_DATA, this.onVolumeChange)\n\n if (Util.typeOf(volume) !== 'Number') {\n this.player.volume = this.config.default\n }\n\n this.onVolumeChange()\n }\n\n onBarMousedown = (e) => {\n const { player } = this\n const bar = this.find('.xgplayer-bar')\n Util.event(e)\n\n const barRect = bar.getBoundingClientRect()\n const pos = Util.getEventPos(e, player.zoom)\n const height = barRect.height - (pos.clientY - barRect.top)\n pos.h = height\n pos.barH = barRect.height\n this.pos = pos\n // 差值小于0,说明点击的不是音量滑块位置 不做响应\n if (height < -2) {\n return\n }\n this.updateVolumePos(height, e)\n document.addEventListener('mouseup', this.onBarMouseUp)\n this._d.isStart = true\n return false\n }\n\n onBarMouseMove = (e) => {\n const { _d } = this\n if (!_d.isStart) {\n return\n }\n const { pos, player } = this\n e.preventDefault()\n e.stopPropagation()\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n _d.isMoving = true\n const w = pos.h - _ePos.clientY + pos.clientY\n if (w > pos.barH) {\n return\n }\n this.updateVolumePos(w, e)\n }\n\n onBarMouseUp = (e) => {\n Util.event(e)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n const { _d } = this\n _d.isStart = false\n _d.isMoving = false\n }\n\n updateVolumePos (height, event) {\n const { player } = this\n const drag = this.find('.xgplayer-drag')\n const bar = this.find('.xgplayer-bar')\n if (!bar || !drag) {\n return\n }\n const now = parseInt(height / bar.getBoundingClientRect().height * 1000, 10)\n drag.style.height = `${height}px`\n const to = Math.max(Math.min(now / 1000, 1), 0)\n const props = {\n volume: {\n from: player.volume,\n to\n }\n }\n if (player.muted) {\n props.muted = {\n from: true,\n to: false\n }\n }\n this.emitUserAction(event, 'change_volume', { muted: player.muted, volume: player.volume, props })\n player.volume = Math.max(Math.min(now / 1000, 1), 0)\n player.muted && (player.muted = false)\n\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n\n /**\n * 修改音量数值标签\n *\n * @memberof Volume\n */\n updateVolumeValue () {\n const { volume, muted } = this.player\n const $labelValue = this.find('.xgplayer-value-label')\n const vol = Math.max(Math.min(volume, 1), 0)\n\n // Math.ceil有精度问题,比如Math.ceil(0.55 * 100) == 56,因此这里使用Math.round\n // 0.58 * 100 === 57.99999999999999\n // 0.55 * 100 === 55.00000000000001\n $labelValue.innerText = muted ? 0 : Math.round(vol * 100)\n }\n\n /**\n * @desc 聚焦\n */\n focus () {\n const { player } = this\n player.focus({ autoHide: false })\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n Util.addClass(this.root, 'slide-show')\n }\n\n /**\n * 失去焦点\n * @param { number } delay 延迟隐藏时长,ms\n * @param { boolean } isForce 是否立即隐藏控制栏\n * @param { Event} [e] 事件\n * @returns\n */\n unFocus (delay = 100, isForce = true, e) {\n const { _d, player } = this\n if (_d.isActive) {\n return\n }\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this._timerId = Util.setTimeout(this, () => {\n if (!_d.isActive) {\n isForce ? player.blur() : player.focus()\n Util.removeClass(this.root, 'slide-show')\n _d.isStart && this.onBarMouseUp(e)\n }\n this._timerId = null\n }, delay)\n }\n\n onMouseenter = (e) => {\n this._d.isActive = true\n this.focus()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n onMouseleave = (e) => {\n this._d.isActive = false\n this.unFocus(100, false, e)\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n changeMuted (e) {\n // e.preventDefault()\n e && e.stopPropagation()\n const { player, _d } = this\n // 取消bar的状态\n _d.isStart && this.onBarMouseUp(e)\n this.emitUserAction(e, 'change_muted', {\n muted: player.muted,\n volume: player.volume,\n props: {\n muted: {\n from: player.muted,\n to: !player.muted\n }\n }\n })\n if (player.volume > 0) {\n player.muted = !player.muted\n }\n if (player.volume < 0.01) {\n player.volume = this.config.miniVolume\n }\n }\n\n onVolumeChange = (e) => {\n if (!this.player) {\n return\n }\n const { muted, volume } = this.player\n if (!this._d.isMoving) {\n this.find('.xgplayer-drag').style.height = muted || volume === 0 ? '4px' : `${volume * 100}%`\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n this.animate(muted, volume)\n }\n\n animate (muted, volume) {\n if (muted || volume === 0) {\n this.setAttr('data-state', 'mute')\n } else if (volume < 0.5 && this.icons.volumeSmall) {\n this.setAttr('data-state', 'small')\n } else {\n this.setAttr('data-state', 'normal')\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.volumeSmall)\n this.appendChild('.xgplayer-icon', icons.volumeLarge)\n this.appendChild('.xgplayer-icon', icons.volumeMuted)\n }\n\n destroy () {\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this.unbind('mouseenter', this.onMouseenter)\n\n this.unbind(['blur', 'mouseleave'], this.onMouseleave)\n\n this.unbind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.unbind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.unbind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.changeMutedHandler)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const volume = this.config.default || this.player.volume\n const isShowVolumeValue = this.config.showValueLabel\n return `\n <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 BasePlugin, { Events, Util } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nfunction now () {\n return new Date().getTime()\n}\n\nconst LOG_TYPES = {\n LOAD_START: 'loadstart',\n LOADED_DATA: 'loadeddata',\n FIRST_FRAME: 'firstFrame',\n WAIT_START: 'waitingStart',\n WAIT_END: 'waitingEnd',\n SEEK_START: 'seekStart',\n SEEK_END: 'seekEnd'\n}\nclass XGLogger extends BasePlugin {\n static get pluginName () {\n return 'xgLogger'\n }\n\n static get defaultConfig () {\n return {\n waitTimeout: 10000\n }\n }\n\n afterCreate () {\n this._onReset()\n this._waitType = 'firstFrame'\n\n this._initOnceEvents()\n\n this.newPointTime = now()\n // 初始化到首帧耗时 new -> loadeddata\n this.loadedCostTime = 0\n // 初始化到开始请求耗时 new -> loadstart\n this.startCostTime = 0\n\n this.on(Events.LOAD_START, () => {\n const { _state } = this\n const { autoplayStart, isFFSend } = _state\n this.startCostTime = now() - this.newPointTime\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOAD_START`, `autoplayStart:${autoplayStart} isFFSend:${isFFSend} startCostTime:${this.startCostTime} newPointTime${this.newPointTime}`)\n if (isFFSend) {\n return\n }\n !_state.isLs && this.emitLog(LOG_TYPES.LOAD_START, {})\n _state.isLs = true\n _state.isTimeUpdate = false\n _state.isFFLoading = true\n this.pt = now()\n this.vt = 0\n this.fvt = 0 // 首帧耗时 loadstart -> loadeddata\n this._initOnceEvents()\n this._onWaitingLoadStart()\n })\n\n this.on(Events.LOADED_DATA, () => {\n this.vt = now()\n this.fvt = this.vt - this.pt\n this.loadedCostTime = this.vt - this.newPointTime\n const { isTimeUpdate, isFFSend, autoplayStart } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOADED_DATA`, `fvt:${this.fvt} isTimeUpdate:${this._state.isTimeUpdate} loadedCostTime:${this.loadedCostTime}`)\n if (isTimeUpdate || autoplayStart) {\n this._sendFF('loadedData')\n }\n if (!isFFSend) {\n this.emitLog(LOG_TYPES.LOADED_DATA, {})\n }\n this.suspendWaitingStatus('loadeddata')\n })\n\n this.on(Events.SEEKING, this._onSeeking)\n this.on(Events.SEEKED, this._onSeeked)\n\n this.on(Events.DESTROY, () => {\n this.endState('destroy')\n })\n\n this.on(Events.URL_CHANGE, () => {\n this.endState('urlChange')\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} URL_CHANGE`)\n this._state.isFFSend && this._onReset()\n })\n\n this.on([Events.PLAYING, Events.CANPLAY], this._onPlaying)\n\n this.on(Events.WAITING, this._onWaiting)\n this.on(Events.ERROR, this._onError)\n this.on(Events.RESET, () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} RESET`)\n this.endState('reset')\n this._initOnceEvents()\n this._onReset()\n })\n }\n\n _initOnceEvents () {\n this.off(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.off(Events.TIME_UPDATE, this._onTimeupdate)\n this.once(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.once(Events.TIME_UPDATE, this._onTimeupdate)\n }\n\n _sendFF (endType) {\n this.s = now()\n const { isFFLoading, isFFSend } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _sendFF`, `${endType} fvt:${this.fvt} isFFLoading:${isFFLoading} !isFFSend:${!isFFSend}`)\n if (this.vt > 0 && isFFLoading && !isFFSend) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} emitLog_firstFrame`, endType)\n this._state.isFFLoading = false\n this._state.isFFSend = true\n this.emitLog(LOG_TYPES.FIRST_FRAME, { fvt: this.fvt, costTime: this.fvt, vt: this.vt, startCostTime: this.startCostTime, loadedCostTime: this.loadedCostTime })\n }\n }\n\n _onTimeupdate = () => {\n this._state.isTimeUpdate = true\n if (this._state.autoplayStart) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onTimeupdate`)\n this._sendFF('onTimeupdate')\n }\n }\n\n _onAutoplayStart = () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onAutoplayStart`)\n this._state.autoplayStart = true\n this.vt && this._sendFF('onAutoplayStart')\n }\n\n _onReset = () => {\n this._state = {\n autoplayStart: false, // 是否已经自动起播\n isFFLoading: false, // LOAD_START是否已经触发\n isTimeUpdate: false, // 第一次timeupdate是否已经触发\n isFFSend: false, // 首帧事件是否已经触发\n isLs: false // loadstart是否已经发送\n }\n this.vt = 0\n this.pt = 0\n this.fvt = 0\n this.newPointTime = now()\n this.loadedCostTime = 0\n this.startCostTime = 0\n this._isSeeking = false\n this.seekingStart = 0\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this._isWaiting = false\n this._waitTimer && Util.clearTimeout(this, this._waitTimer)\n this._waittTimer && Util.clearTimeout(this, this._waittTimer)\n this._waitTimer = null\n this._waittTimer = null\n this._waitType = 0 // 0 - 普通卡顿 1-起播卡顿 2-seek卡顿\n }\n\n _onSeeking = () => {\n if (this.seekingStart) {\n return\n }\n this.suspendWaitingStatus('seek')\n this.seekingStart = now()\n this.emitLog(LOG_TYPES.SEEK_START, { start: now() })\n }\n\n _onSeeked = () => {\n this.suspendSeekingStatus('seeked')\n }\n\n _onWaitingLoadStart = () => {\n if (this._isWaiting || this.vt) {\n return\n }\n this._isWaiting = true\n this.waitingStart = now()\n this.fixedWaitingStart = now()\n this._waitType = 1\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, start: this.waitingStart, type: 1, endType: 'loadstart' })\n }\n\n _onWaiting = () => {\n // 普通卡顿起播之前不产生\n if (this._isWaiting || !this.vt) {\n return\n }\n // 卡顿标记开始\n this._isWaiting = true\n if (!this.vt) {\n this._waitType = 1\n } else if (this.seekingStart) {\n this._waitType = 2\n } else {\n this._waitType = 0\n }\n // 原始卡顿耗时起始时间\n this.fixedWaitingStart = now()\n this._waitTimer = Util.setTimeout(this, () => {\n if (this._isWaiting) {\n this.waitingStart = now()\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n this._startWaitTimeout()\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, start: this.waitingStart, type: this._waitType, endType: this._waitType === 2 ? 'seek' : 'playing' })\n }\n }, 200)\n }\n\n _onError = () => {\n this.suspendSeekingStatus('error')\n this.suspendWaitingStatus('error')\n }\n\n _startWaitTimeout () {\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n }\n this._waittTimer = Util.setTimeout(this, () => {\n this.suspendWaitingStatus('timeout')\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }, this.config.waitTimeout)\n }\n\n _onPlaying = () => {\n this._isWaiting && this.suspendWaitingStatus('playing')\n }\n\n endState (endType) {\n this.suspendWaitingStatus(endType)\n this.suspendSeekingStatus(endType)\n }\n\n suspendSeekingStatus (endType) {\n if (!this.seekingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.seekingStart\n this.seekingStart = 0\n this.emitLog(LOG_TYPES.SEEK_END, { end: _now, costTime: _cost, endType })\n }\n\n suspendWaitingStatus (endType) {\n if (this._waitTimer) {\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n }\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }\n this._isWaiting = false\n if (!this.waitingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.waitingStart\n const _fixedCost = _now - this.fixedWaitingStart\n const { waitTimeout } = this.config\n this._isWaiting = false\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this.emitLog(LOG_TYPES.WAIT_END, {\n fixedCostTime: _fixedCost > waitTimeout ? waitTimeout : _fixedCost,\n costTime: _cost > waitTimeout ? waitTimeout : _cost,\n type: endType === 'loadeddata' ? 1 : this._waitType,\n endType: this._waitType === 2 ? 'seek' : endType\n })\n }\n\n emitLog (eventType, data) {\n const { player } = this\n this.emit(Events.XGLOG, {\n t: now(),\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype,\n eventType,\n currentTime: this.player.currentTime,\n readyState: player.video.readyState,\n networkState: player.video.networkState,\n ...data\n })\n }\n}\nexport {\n LOG_TYPES,\n XGLogger as default\n}\n","import Plugin, { Events, Util } from '../../plugin'\nimport ReplaySvg from '../assets/replay.svg'\nimport './index.scss'\n\nclass Replay extends Plugin {\n static get pluginName () {\n return 'replay'\n }\n\n static get defaultConfig () {\n return {\n disable: false\n }\n }\n\n registerIcons () {\n return {\n replay: ReplaySvg\n }\n }\n\n afterCreate () {\n Plugin.insert(this.icons.replay, this.root, 0)\n this.__handleReplay = this.hook('replayClick', () => {\n this.player.replay()\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.bind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n // this.bind('svg', ['click', 'touchend'], this.__handleReplay)\n // this.bind('.xgplayer-replay-txt', ['click', 'touchend'], this.__handleReplay)\n\n this.on(Events.ENDED, () => {\n if (!this.playerConfig.loop) {\n Util.addClass(this.player.root, 'replay')\n }\n if (this.config.disable) {\n return\n }\n this.show()\n const path = this.root.querySelector('path')\n if (path) {\n const transform = window.getComputedStyle(path).getPropertyValue('transform')\n if (typeof transform === 'string' && transform.indexOf('none') > -1) {\n return null\n } else {\n path.setAttribute('transform', transform)\n }\n }\n })\n\n this.on(Events.PLAY, () => {\n this.hide()\n })\n }\n\n handleReplay (e) {\n e.preventDefault()\n e.stopPropagation()\n this.player.replay()\n Util.removeClass(this.player.root, 'replay')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (this.config.disable) {\n return\n }\n this.root.style.display = 'flex'\n }\n\n enable () {\n this.config.disable = false\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n this.unbind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n }\n\n render () {\n return `<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, // 设置为true时,播放后才隐藏,在视频地址更新后会重新显示poster。默认为false,即在play事件触发后隐藏poster\n * poster?: string // 封面图地址\n * }} IPosterConfig\n */\nclass Poster extends Plugin {\n static get pluginName () {\n return 'poster'\n }\n\n /**\n * @type IPosterConfig\n */\n static get defaultConfig () {\n return {\n isEndedShow: true, // 是否在播放结束之后显示\n hideCanplay: false, // 设置为true时,播放后才隐藏,在视频地址更新后会重新显示poster。默认为false,即在play事件触发后隐藏poster\n notHidden: false, // 是否一直显示\n poster: '', // 封面图地址\n fillMode: 'fixWidth' // 封面图填充方式,fixWidth / fixHeight / cover / contain\n }\n }\n\n set isEndedShow (value) {\n this.config.isEndedShow = value\n }\n\n get isEndedShow () {\n return this.config.isEndedShow\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n Util.removeClass(this.root, 'hide')\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.poster === 'string') {\n args.config.poster = args.player.config.poster\n }\n }\n\n afterCreate () {\n this.on(Events.ENDED, () => {\n if (this.isEndedShow) {\n Util.removeClass(this.root, 'hide')\n }\n })\n\n if (this.config.hideCanplay) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n this.on(Events.URL_CHANGE, () => {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'xg-showplay')\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n })\n } else {\n this.on(Events.PLAY, () => {\n Util.addClass(this.root, 'hide')\n })\n }\n }\n\n setConfig (config) {\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n })\n const { poster } = this.config\n this.update(poster)\n }\n\n onTimeUpdate () {\n if (!this.player.currentTime) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n } else {\n Util.removeClass(this.root, 'xg-showplay')\n }\n }\n\n update (poster) {\n if (!poster) {\n return\n }\n this.config.poster = poster\n this.root.style.backgroundImage = `url(${poster})`\n }\n\n getBgSize (mode) {\n let _bg = ''\n switch (mode) {\n case 'cover':\n _bg = 'cover'\n break\n case 'contain':\n _bg = 'contain'\n break\n case 'fixHeight':\n _bg = 'auto 100%'\n break\n default:\n _bg = ''\n }\n return _bg ? `background-size: ${_bg};` : ''\n }\n\n render () {\n const { poster, hideCanplay, fillMode, notHidden } = this.config\n const _bg = this.getBgSize(fillMode)\n const style = poster ? `background-image:url(${poster});${_bg}` : _bg\n const className = notHidden ? 'xg-not-hidden' : (hideCanplay ? 'xg-showplay' : '')\n return `<xg-poster class=\"xgplayer-poster ${className}\" style=\"${style}\">\n </xg-poster>`\n }\n}\n\nexport default Poster\n","import Plugin, { Util, Events, STATES } from '../../plugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * isShowPause?: boolean, // 暂停是否常驻\n * isShowEnd?: boolean, // 播放结束常驻\n * disableAnimate?: boolean, // 禁用点击动画\n * mode?: 'hide' | 'show' | 'auto' // 控制模式: hide 常驻: show 跟随:auto\n * [propName: string]: any\n * }} IStartConfig\n */\n\nconst AnimateMap = {}\nfunction addAnimate (key, seconds, callback = { start: null, end: null }) {\n if (AnimateMap[key]) {\n window.clearTimeout(AnimateMap[key].id)\n }\n AnimateMap[key] = {}\n callback.start && callback.start()\n AnimateMap[key].id = window.setTimeout(() => {\n callback.end && callback.end()\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n }, seconds)\n return AnimateMap[key].id\n}\n\nfunction clearAnimation (id) {\n if (id) {\n window.clearTimeout(id)\n return\n }\n Object.keys(AnimateMap).map(key => {\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n })\n}\n\n\nclass Start extends Plugin {\n static get pluginName () {\n return 'start'\n }\n\n /**\n * @type IStartConfig\n */\n static get defaultConfig () {\n return {\n isShowPause: false, // 暂停是否常驻\n isShowEnd: false, // 播放结束常驻\n disableAnimate: false, // 禁用点击动画\n mode: 'hide' // 控制模式: hide 常驻: show 跟随:auto\n }\n }\n\n constructor (args) {\n super(args)\n this.autoPlayStart = false\n }\n\n afterCreate () {\n const { playerConfig } = this\n\n this.initIcons()\n this.listenEvents()\n this.bindClickEvents()\n\n if (!playerConfig.autoplay) {\n this.show()\n }\n }\n\n /**\n * @public\n * This method can be overridden.\n */\n listenEvents () {\n const { player, playerConfig } = this\n\n this.once(Events.READY, () => {\n if (playerConfig) {\n if (playerConfig.lang && playerConfig.lang === 'en') {\n Util.addClass(player.root, 'lang-is-en')\n } else if (playerConfig.lang === 'jp') {\n Util.addClass(player.root, 'lang-is-jp')\n }\n }\n })\n\n this.on(Events.AUTOPLAY_STARTED, this.onAutoplayStart)\n\n this.on(Events.AUTOPLAY_PREVENTED, () => {\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n })\n\n this.on(Events.PLAY, () => {\n this.toggleTo('play')\n })\n\n this.on(Events.PAUSE, () => {\n this.toggleTo('pause')\n })\n\n this.on(Events.RESET, () => {\n this.onPlayerReset()\n })\n }\n\n /**\n * @public\n */\n bindClickEvents () {\n this.clickHandler = this.hook('startClick', this.switchPausePlay, {\n pre: (e) => {\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n const { paused } = this.player\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: paused, to: !paused })\n }\n })\n\n this.bind(['click', 'touchend'], this.clickHandler)\n }\n\n onPlayerReset = () => {\n this.autoPlayStart = false\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n }\n\n onAutoplayStart = () => {\n if (this.autoPlayStart) {\n return\n }\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n Util.addClass(this.root, className)\n this.autoPlayStart = true\n this.toggleTo('play')\n }\n\n registerIcons () {\n return {\n startPlay: { icon: PlaySvg, class: 'xg-icon-play' },\n startPause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('xg-start-inner', icons.startPlay)\n this.appendChild('xg-start-inner', icons.startPause)\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n Util.removeClass(this.root, 'hide')\n }\n\n focusHide () {\n Util.addClass(this.root, 'focus-hide')\n }\n\n recover () {\n Util.removeClass(this.root, 'focus-hide')\n }\n\n switchStatus (isAnimate) {\n if (isAnimate) {\n this.setAttr('data-state', !this.player.paused ? 'play' : 'pause')\n } else {\n this.setAttr('data-state', this.player.paused ? 'play' : 'pause')\n }\n }\n\n animate (endShow) {\n this._animateId = addAnimate('pauseplay', 400, {\n start: () => {\n Util.addClass(this.root, 'interact')\n this.show()\n this.switchStatus(true)\n },\n end: () => {\n Util.removeClass(this.root, 'interact')\n !endShow && this.hide()\n this._animateId = null\n }\n })\n }\n\n endAnimate () {\n Util.removeClass(this.root, 'interact')\n clearAnimation(this._animateId)\n this._animateId = null\n }\n\n /**\n * @public\n */\n switchPausePlay (e) {\n const { player } = this\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n if (player.state < STATES.READY) {\n return\n }\n const paused = this.player.paused\n if (!paused && player.state === STATES.RUNNING) {\n player.pause()\n } else {\n player.play()\n }\n }\n\n /**\n * @deprecated\n */\n onPlayPause (status) {\n this.toggleTo(status)\n }\n\n /**\n * @param {'play'|'pause'} status\n */\n toggleTo (status) {\n const { config, player } = this\n if (!player || player.state < STATES.RUNNING || !this.autoPlayStart) {\n return\n }\n // 一直显示\n if (config.mode === 'show') {\n this.switchStatus()\n this.show()\n return\n }\n\n // 跟随播放器的focus状态显示和隐藏\n if (config.mode === 'auto') {\n this.switchStatus()\n return\n }\n // 暂停/播放结束状态强制显示\n if ((config.isShowPause && player.paused && !player.ended) || (config.isShowEnd && player.ended)) {\n this.switchStatus()\n this.show()\n this.endAnimate()\n return\n }\n\n if (config.disableAnimate) {\n this.switchStatus()\n this.hide()\n return\n }\n\n if (status === 'play') {\n this.autoPlayStart ? this.animate() : this.hide()\n } else {\n if (!this.autoPlayStart || player.ended) {\n return\n }\n this.animate()\n }\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.clickHandler)\n clearAnimation(this._animateId)\n }\n\n render () {\n const className = this.playerConfig.autoplay ? (this.config.mode === 'auto' ? 'auto-hide' : 'hide') : ''\n return `\n <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","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\n updatePos (pos) {\n this.pos = Object.assign(this.pos, pos)\n if (this.isMini) {\n this.player.root.style.left = `${this.pos.left}px`\n this.player.root.style.top = `${this.pos.top}px`\n this.player.root.style.width = `${this.pos.width}px`\n this.player.root.style.height = `${this.pos.height}px`\n }\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 { LEAVE_PLAYER, ENTER_PLAYER } from '../../events'\nimport './index.scss'\n\nconst MOUSE_EVENTS = {\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousemove: 'onMouseMove'\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nexport default class PCPlugin extends BasePlugin {\n static get pluginName () {\n return 'pc'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n afterCreate () {\n this._clickCount = 0\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { isMobileSimulateMode } = this.playerConfig\n if (isMobileSimulateMode === 'mobile' || (Sniffer.device === 'mobile' && !Sniffer.os.isIpad)) {\n return\n }\n this.initEvents()\n }\n\n initEvents () {\n const { media, root } = this.player\n const { enableContextmenu } = this.playerConfig\n\n root && root.addEventListener('click', this.onVideoClick, false)\n root && root.addEventListener('dblclick', this.onVideoDblClick, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.addEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n !enableContextmenu && media && media.addEventListener('contextmenu', this.onContextmenu, false)\n }\n\n switchPlayPause (e) {\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: player.paused, to: !player.paused })\n if (!player.ended) {\n player.paused ? player.play() : player.pause()\n } else {\n player.duration !== Infinity && player.duration > 0 && player.replay()\n }\n }\n\n onMouseMove = (e) => {\n const { player, playerConfig } = this\n if (!player.isActive) {\n player.focus({ autoHide: !playerConfig.closeDelayBlur })\n !playerConfig.closeFocusVideoFocus && player.media.focus()\n }\n }\n\n onMouseEnter = (e) => {\n const { playerConfig, player } = this\n !playerConfig.closeFocusVideoFocus && player.media.focus()\n if (playerConfig.closeDelayBlur) {\n player.focus({ autoHide: false })\n } else {\n player.focus()\n }\n this.emit(ENTER_PLAYER)\n }\n\n onMouseLeave = (e) => {\n const { closePlayerBlur, leavePlayerTime, closeDelayBlur } = this.playerConfig\n if (!closePlayerBlur && !closeDelayBlur) {\n if (leavePlayerTime) {\n this.player.focus({ autoHide: true, delay: leavePlayerTime })\n } else {\n this.player.blur({ignorePaused: true})\n }\n }\n this.emit(LEAVE_PLAYER)\n }\n\n onContextmenu (e) {\n e = e || window.event\n if (e.preventDefault) {\n e.preventDefault()\n }\n if (e.stopPropagation) {\n e.stopPropagation()\n } else {\n e.returnValue = false // 解决IE8右键弹出\n e.cancelBubble = true\n }\n }\n\n onVideoClick = (e) => {\n const { player, playerConfig } = this\n if (e.target && playerConfig.closeVideoClick) {\n return\n }\n if (e.target === player.root || e.target === player.media || e.target === player.innerContainer || e.target === player.media.__canvas) {\n e.preventDefault()\n if (!playerConfig.closeVideoStopPropagation) {\n e.stopPropagation()\n }\n this._clickCount++\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n this.clickTimer = setTimeout(() => {\n if (!this._clickCount) {\n return\n }\n this._clickCount--\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.switchPlayPause(data.e)\n }, { e, paused: player.paused })\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }, 300)\n }\n }\n\n onVideoDblClick = (e) => {\n const { player, playerConfig } = this\n if (playerConfig.closeVideoDblclick || !e.target || (e.target !== player.media && e.target !== player.media.__canvas)) {\n return\n }\n if (!playerConfig.closeVideoClick && this._clickCount < 2) {\n this._clickCount = 0\n return\n }\n this._clickCount = 0\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n e.preventDefault()\n e.stopPropagation()\n\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.emitUserAction(data.e, 'switch_fullscreen', { props: 'fullscreen', from: player.fullscreen, to: !player.fullscreen })\n player.fullscreen ? player.exitFullscreen() : player.getFullscreen()\n }, { e, fullscreen: player.fullscreen })\n }\n\n destroy () {\n const { video, root } = this.player\n this.clickTimer && clearTimeout(this.clickTimer)\n root.removeEventListener('click', this.onVideoClick, false)\n root.removeEventListener('dblclick', this.onVideoDblClick, false)\n video.removeEventListener('contextmenu', this.onContextmenu, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.removeEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n }\n}\n","\nconst EVENTS = {\n PRESS: 'press',\n PRESS_END: 'pressend',\n DOUBlE_CLICK: 'doubleclick',\n CLICK: 'click',\n TOUCH_MOVE: 'touchmove',\n TOUCH_START: 'touchstart',\n TOUCH_END: 'touchend'\n}\n\nconst TOUCHS = {\n start: 'touchstart',\n end: 'touchend',\n move: 'touchmove',\n cancel: 'touchcancel'\n}\n\nconst MOUSES = {\n start: 'mousedown',\n end: 'mouseup',\n move: 'mousemove',\n cancel: 'mouseleave'\n}\n\nfunction getTouch (touches) {\n if (touches && touches.length > 0) {\n return touches[touches.length - 1]\n } else {\n return null\n }\n}\n\nfunction getDefaultConfig () {\n return {\n pressDelay: 600,\n dbClickDelay: 200,\n disablePress: false,\n disableDbClick: false,\n miniStep: 2,\n needPreventDefault: true\n }\n}\n\nclass Touche {\n constructor (dom, config = { eventType: 'touch' }) {\n this._pos = {\n moving: false,\n start: false,\n x: 0,\n y: 0\n }\n this.config = getDefaultConfig()\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n this.root = dom\n this.events = config.eventType === 'mouse' ? MOUSES : TOUCHS\n /**\n * @type { null | number}\n */\n this.pressIntrvalId = null\n /**\n * @type { null | number}\n */\n this.dbIntrvalId = null\n this.__handlers = {}\n this._initEvent()\n }\n\n _initEvent () {\n this.root.addEventListener(this.events.start, this.onTouchStart)\n }\n\n __setPress (e) {\n const { config } = this\n if (this.pressIntrvalId) {\n this.__clearPress()\n }\n this.pressIntrvalId = setTimeout(() => {\n this.trigger(EVENTS.PRESS, e)\n this._pos.press = true\n this.__clearPress()\n }, config.pressDelay)\n }\n\n __clearPress () {\n window.clearTimeout(this.pressIntrvalId)\n this.pressIntrvalId = null\n }\n\n __setDb (e) {\n const { config } = this\n if (this.dbIntrvalId) {\n this.__clearDb()\n this.trigger(EVENTS.DOUBlE_CLICK, e)\n return\n }\n this.dbIntrvalId = setTimeout(() => {\n this.__clearDb()\n if (!this._pos.start && !this._pos.press && !this._pos.moving) {\n this.trigger(EVENTS.CLICK, e)\n }\n }, config.dbClickDelay)\n }\n\n __clearDb () {\n clearTimeout(this.dbIntrvalId)\n this.dbIntrvalId = null\n }\n\n on (event, handler) {\n if (!this.__handlers[event]) {\n this.__handlers[event] = []\n }\n this.__handlers[event].push(handler)\n }\n\n off (event, handler) {\n if (!this.__handlers[event]) {\n return\n }\n const handlers = this.__handlers[event]\n let index = -1\n for (let i = 0; i < handlers.length; i++) {\n if (handlers[i] === handler) {\n index = i\n break\n }\n }\n if (index >= 0) {\n this.__handlers[event].splice(index, 1)\n }\n }\n\n trigger (event, e) {\n if (!this.__handlers[event]) {\n return\n }\n this.__handlers[event].map(handler => {\n try {\n handler(e)\n } catch (error) {\n console.error(`trigger>>:${event}`, error)\n }\n })\n }\n\n onTouchStart = (e) => {\n const { _pos, root } = this\n // config.needPreventDefault && preventToucheDefault(e)\n const touch = getTouch(e.touches)\n _pos.x = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.y = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.start = true\n this.__setPress(e)\n root.addEventListener(this.events.end, this.onTouchEnd)\n root.addEventListener(this.events.cancel, this.onTouchCancel)\n root.addEventListener(this.events.move, this.onTouchMove)\n this.trigger(EVENTS.TOUCH_START, e)\n }\n\n onTouchCancel = (e) => {\n this.onTouchEnd(e)\n }\n\n onTouchEnd = (e) => {\n const { _pos, root } = this\n this.__clearPress()\n root.removeEventListener(this.events.cancel, this.onTouchCancel)\n root.removeEventListener(this.events.end, this.onTouchEnd)\n root.removeEventListener(this.events.move, this.onTouchMove)\n e.moving = _pos.moving\n e.press = _pos.press\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n this.trigger(EVENTS.TOUCH_END, e)\n !_pos.press && !_pos.moving && this.__setDb(e)\n _pos.press = false\n _pos.start = false\n _pos.moving = false\n }\n\n onTouchMove = (e) => {\n const { _pos, config } = this\n const touch = getTouch(e.touches)\n const x = touch ? parseInt(touch.pageX, 10) : e.pageX\n const y = touch ? parseInt(touch.pageY, 10) : e.pageX\n const diffx = x - _pos.x\n const diffy = y - _pos.y\n if (Math.abs(diffy) < config.miniStep && Math.abs(diffx) < config.miniStep) {\n return\n }\n this.__clearPress()\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n _pos.press = false\n _pos.moving = true\n this.trigger(EVENTS.TOUCH_MOVE, e)\n }\n\n destroy () {\n const map = {\n touchend: 'onTouchEnd',\n touchmove: 'onTouchMove',\n touchstart: 'onTouchStart'\n }\n Object.keys(map).forEach(key => {\n this.root.removeEventListener(key, this[map[key]])\n })\n }\n}\n\nexport default Touche\n\n","import Plugin, { Events, Util, Sniffer, STATES } from '../../plugin'\nimport Touche from './touch'\nimport SeekTipIcon from '../assets/seekicon.svg'\nimport { runHooks } from '../../plugin/hooksDescriptor'\n// import BackSvg from './back.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disableGesture?: boolean,\n * gestureX?: boolean,\n * gestureY?: boolean,\n * gradient?: 'normal' | 'none' | 'top' | 'bottom',\n * isTouchingSeek?: boolean,\n * miniMoveStep?: number,\n * miniYPer?: number,\n * scopeL?: number,\n * scopeR?: number,\n * pressRate?: number,\n * darkness?: boolean,\n * maxDarkness?: number,\n * disableActive?: boolean,\n * disableTimeProgress?: boolean,\n * hideControlsActive?: boolean,\n * hideControlsEnd?: boolean,\n * moveDuration?: number,\n * closedbClick?: boolean,\n * disablePress?: boolean,\n * disableSeekIcon?: boolean,\n * focusVideoClick?: boolean,\n * [propName: string]: any\n * }} IMobileConfig\n */\n\nconst ACTIONS = {\n AUTO: 'auto',\n SEEKING: 'seeking',\n PLAYBACK: 'playbackrate',\n LIGHT: ''\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nclass MobilePlugin extends Plugin {\n static get pluginName () {\n return 'mobile'\n }\n\n /**\n * @type IMobileConfig & { [propName: string]: any}\n */\n static get defaultConfig () {\n return {\n index: 0,\n disableGesture: false, // Whether to disable gestures\n gestureX: true, // Whether to enable horizontal gestures\n gestureY: true, // Whether to enable vertical gestures\n gradient: 'normal', // Gradient shadow, 'none'/'top'/'bottom'\n isTouchingSeek: false, // Whether to update currentTime at the same time as touchMove\n miniMoveStep: 5, // Minimum moving distance, used for move throttling\n miniYPer: 5, // Percentage of minimum displacement in y direction\n scopeL: 0.25, // Gesture range on the left\n scopeR: 0.25, // Gesture range on the right\n scopeM: 0.9, // Middle gesture range\n pressRate: 2, // playbackRate when long press\n darkness: true, // Whether to enable the dimming function on the left\n maxDarkness: 0.8, // Maximum darkness,maximum transparency of the mask\n disableActive: false, // Whether to disable the time prompt\n disableTimeProgress: false, // Whether to disable the time progress bar\n hideControlsActive: false, // Whether to hide the control bar when dragging by gesture\n hideControlsEnd: false, // Whether to hide the control bar when the gesture ended\n moveDuration: 60 * 6 * 1000, // The duration corresponding to the dragging width of the player\n closedbClick: false, // Whether to turn off the double tap gesture\n disablePress: true, // Whether to turn off the long press gesture\n disableSeekIcon: false, // Disable seek prompt\n focusVideoClick: false // Click on force toggle to pause/play\n }\n }\n\n constructor (options) {\n super(options)\n /**\n * @readonly\n */\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n time: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1\n }\n /**\n * @private\n */\n this.timer = null\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n registerIcons () {\n return {\n seekTipIcon: { icon: SeekTipIcon, class: 'xg-seek-pre' }\n }\n }\n\n afterCreate () {\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { playerConfig, config, player } = this\n if (playerConfig.closeVideoDblclick === true) {\n config.closedbClick = true\n }\n this.resetPos()\n if (!Util.isUndefined(playerConfig.disableGesture)) {\n config.disableGesture = !!playerConfig.disableGesture\n }\n this.appendChild('.xg-seek-icon', this.icons.seekTipIcon)\n\n this.xgMask = Util.createDom('xg-mask', '', {}, 'xgmask')\n player.root.appendChild(this.xgMask)\n\n this.initCustomStyle()\n\n this.registerThumbnail()\n\n const eventType = this.domEventType === 'mouse' ? 'mouse' : 'touch'\n this.touch = new Touche(this.root, { eventType, needPreventDefault: !this.config.disableGesture })\n\n this.root.addEventListener('contextmenu', e => {\n e.preventDefault()\n })\n\n /**\n * 对根节点做touchmove和touchend绑定,解决控制栏手势无作用的问题\n */\n player.root.addEventListener('touchmove', this.onRootTouchMove, true)\n player.root.addEventListener('touchend', this.onRootTouchEnd, true)\n player.root.addEventListener('touchcancel', this.onRootTouchEnd, true)\n const { controls } = this.player\n if (controls && controls.center) {\n controls.center.addEventListener('touchmove', this.onRootTouchMove, true)\n controls.center.addEventListener('touchend', this.onRootTouchEnd, true)\n controls.center.addEventListener('touchcancel', this.onRootTouchEnd, true)\n }\n this.on(Events.DURATION_CHANGE, () => {\n const { player, config } = this\n if (player.duration > 0 && player.duration * 1000 < config.moveDuration) {\n config.moveDuration = player.duration * 1000\n }\n })\n\n this.on([Events.CANPLAY, Events.ENDED], () => {\n const { time, isStart } = this.pos\n if (!isStart && time > 0) {\n this.pos.time = 0\n }\n })\n\n const eventsMap = {\n touchstart: 'onTouchStart',\n touchmove: 'onTouchMove',\n touchend: 'onTouchEnd',\n press: 'onPress',\n pressend: 'onPressEnd',\n click: 'onClick',\n doubleclick: 'onDbClick'\n }\n\n Object.keys(eventsMap).map(key => {\n this.touch.on(key, (e) => {\n this[eventsMap[key]](e)\n })\n })\n\n if (!config.disableActive) {\n // Add progress bar drag event callback\n const progressPlugin = player.plugins.progress\n if (progressPlugin) {\n progressPlugin.addCallBack('dragmove', (data) => {\n this.activeSeekNote(data.currentTime, data.forward)\n });\n ['dragend', 'click'].forEach(key => {\n progressPlugin.addCallBack(key, () => {\n this.changeAction(ACTIONS.AUTO)\n })\n })\n }\n }\n }\n\n registerThumbnail () {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail = thumbnail.createThumbnail(null, 'mobile-thumbnail')\n const timePreview = this.find('.time-preview')\n timePreview.insertBefore(this.thumbnail, timePreview.children[0])\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { playedColor, progressColor, timePreviewStyle, curTimeColor, durationColor } = commonStyle\n if (playedColor) {\n this.find('.xg-curbar').style.backgroundColor = playedColor\n }\n if (progressColor) {\n this.find('.xg-bar').style.backgroundColor = progressColor\n }\n if (timePreviewStyle) {\n const previewDom = this.find('.time-preview')\n Object.keys(timePreviewStyle).forEach(key => {\n previewDom.style[key] = timePreviewStyle[key]\n })\n }\n const curColor = curTimeColor || playedColor\n const durColor = durationColor\n curColor && (this.find('.xg-cur').style.color = curColor)\n durColor && (this.find('.xg-dur').style.color = durColor)\n this.config.disableTimeProgress && Util.addClass(this.find('.xg-timebar'), 'hide')\n }\n\n resetPos (time = 0) {\n if (this.pos) {\n this.pos.isStart = false\n this.pos.scope = -1;\n ['x', 'y', 'width', 'height', 'scopeL', 'scopeR', 'scopeM1', 'scopeM2'].map(item => {\n this.pos[item] = 0\n })\n } else {\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1,\n time: 0\n }\n }\n }\n\n changeAction (action) {\n const { player, root } = this\n root.setAttribute('data-xg-action', action)\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.recover()\n }\n\n getTouche (e) {\n const rotateDeg = this.player.rotateDeg\n const touche = e.touches && e.touches.length > 0 ? e.touches[e.touches.length - 1] : e\n // if (touches && touches.length > 0) {\n // const touche = touches[touches.length - 1]\n // if (rotateDeg === 0) {\n // return {\n // pageX: touche.pageX,\n // pageY: touche.pageY\n // }\n // } else {\n // return {\n // pageX: touche.pageY,\n // pageY: touche.pageX\n // }\n // }\n // } else {\n // }\n return rotateDeg === 0\n ? {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n : {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n }\n\n /**\n * 校验具体的操作范围\n * @param { number } x 方向位移\n * @param { number } y 方向位移\n * @param { number } diffx 方向位移差\n * @param { number } diffy 方向位移差\n * @param { any } pos 当前操作区域位置信息 包含{width, height}\n * @return { number } scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n */\n checkScope (x, y, diffx, diffy, pos) {\n const { width } = pos\n let scope = -1\n if (x < 0 || x > width) {\n return scope\n }\n const mold = diffy === 0 ? Math.abs(diffx) : Math.abs(diffx / diffy)\n if (Math.abs(diffx) > 0 && mold >= 1.73 && x > pos.scopeM1 && x < pos.scopeM2) {\n scope = 0\n } else if (Math.abs(diffx) === 0 || mold <= 0.57) {\n scope = x < pos.scopeL ? 1 : (x > pos.scopeR ? 2 : 3)\n }\n return scope\n }\n\n /**\n * 根据位移和操作类型进行对应处理\n * @param {number} diffx x方向位移差\n * @param {number} diffy y方向位移差\n * @param {number} scope scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} width 总体宽度\n * @param {number} height 总高度\n */\n executeMove (diffx, diffy, scope, width, height) {\n switch (scope) {\n case 0:\n this.updateTime(diffx / width * this.config.scopeM)\n break\n case 1:\n this.updateBrightness(diffy / height)\n break\n case 2:\n // ios系统不支持音量调节\n if (!Sniffer.os.isIos) {\n this.updateVolume(diffy / height)\n }\n break\n default:\n }\n }\n\n /**\n * 结束手势操作\n * @param {number} scope 当前手势类型 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} lastScope 上一次手势类型\n */\n endLastMove (lastScope) {\n const { pos, player, config } = this\n\n const time = (pos.time - this.timeOffset) / 1000\n switch (lastScope) {\n case 0:\n player.seek(Number(time).toFixed(1))\n config.hideControlsEnd ? player.blur() : player.focus()\n this.timer = setTimeout(() => {\n this.pos.time = 0\n }, 500)\n break\n case 1:\n case 2:\n default:\n }\n this.changeAction(ACTIONS.AUTO)\n }\n\n onTouchStart = (e) => {\n const { player, config, pos, playerConfig } = this\n const touche = this.getTouche(e)\n if (touche && !config.disableGesture && this.duration > 0 && !player.ended) {\n pos.isStart = true\n this.timer && clearTimeout(this.timer)\n // e.cancelable && e.preventDefault()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n // pos.volume = player.volume * 100\n const rect = this.root.getBoundingClientRect()\n if (player.rotateDeg === 90) {\n pos.top = rect.left\n pos.left = rect.top\n pos.width = rect.height\n pos.height = rect.width\n } else {\n pos.top = rect.top\n pos.left = rect.left\n pos.width = rect.width\n pos.height = rect.height\n }\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n pos.x = player.rotateDeg === 90 ? _y : _x // parseInt(touche.pageX - pos.left, 10)\n pos.y = player.rotateDeg === 90 ? _x : _y // parseInt(touche.pageY - pos.top, 10)\n pos.scopeL = config.scopeL * pos.width\n pos.scopeR = (1 - config.scopeR) * pos.width\n pos.scopeM1 = pos.width * (1 - config.scopeM) / 2\n pos.scopeM2 = pos.width - pos.scopeM1\n }\n }\n\n onTouchMove = (e) => {\n const touche = this.getTouche(e)\n const { pos, config, player } = this\n if (!touche || config.disableGesture || !this.duration || !pos.isStart) {\n return\n }\n const { miniMoveStep, hideControlsActive } = config\n\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n const x = player.rotateDeg === 90 ? _y : _x\n const y = player.rotateDeg === 90 ? _x : _y\n\n if (Math.abs(x - pos.x) > miniMoveStep || Math.abs(y - pos.y) > miniMoveStep) {\n const diffx = x - pos.x\n const diffy = y - pos.y\n let scope = pos.scope\n if (scope === -1) {\n scope = this.checkScope(x, y, diffx, diffy, pos)\n // 手势为快进快退记录起始操作时间\n if (scope === 0) {\n !hideControlsActive ? player.focus({ autoHide: false }) : player.blur()\n !pos.time && (pos.time = parseInt(player.currentTime * 1000, 10) + this.timeOffset * 1000)\n }\n pos.scope = scope\n }\n if (scope === -1 || (scope > 0 && !config.gestureY) || (scope === 0 && !config.gestureX)) {\n return\n }\n // e.cancelable && e.preventDefault()\n this.executeMove(diffx, diffy, scope, pos.width, pos.height)\n pos.x = x\n pos.y = y\n } else {\n // console.log('touche.pageX - pos.x', touche.pageX - pos.x)\n }\n }\n\n onTouchEnd = (e) => {\n const { player, pos, playerConfig } = this\n setTimeout(() => {\n player.getPlugin('progress') && player.getPlugin('progress').resetSeekState()\n }, 10)\n if (!pos.isStart) {\n return\n }\n if (pos.scope > -1) {\n e.cancelable && e.preventDefault()\n }\n\n const { disableGesture, gestureX } = this.config\n if (!disableGesture && gestureX) {\n this.endLastMove(pos.scope)\n } else {\n pos.time = 0\n }\n pos.scope = -1\n this.resetPos()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n this.changeAction(ACTIONS.AUTO)\n }\n\n checkIsRootTarget (e) {\n const plugins = this.player.plugins || {}\n if (plugins.progress && plugins.progress.root.contains(e.target)) {\n return false\n }\n return (plugins.start && plugins.start.root.contains(e.target)) || (plugins.controls && plugins.controls.root.contains(e.target))\n }\n\n onRootTouchMove = (e) => {\n if (this.config.disableGesture || !this.config.gestureX) {\n return\n }\n if (this.checkIsRootTarget(e)) {\n e.stopPropagation()\n if (!this.pos.isStart) {\n this.onTouchStart(e)\n } else {\n this.onTouchMove(e)\n }\n }\n }\n\n onRootTouchEnd = (e) => {\n if (this.pos.scope > -1) {\n this.onTouchEnd(e)\n // const { controls } = this.player\n // controls && controls.recoverAutoHide()\n }\n }\n\n sendUseAction (event) {\n const { paused } = this.player\n this.emitUserAction(event, 'switch_play_pause', {\n prop: 'paused',\n from: paused,\n to: !paused\n })\n }\n\n clickHandler (e) {\n const { player, config, playerConfig } = this\n if (player.state < STATES.RUNNING) {\n if (!playerConfig.closeVideoClick) {\n this.sendUseAction(Util.createEvent('click'))\n player.play()\n }\n return\n }\n\n if (!config.closedbClick || playerConfig.closeVideoClick) {\n player.isActive ? player.blur() : player.focus()\n } else if (!playerConfig.closeVideoClick) {\n if (player.isActive || config.focusVideoClick) {\n this.sendUseAction(Util.createEvent('click'))\n this.switchPlayPause()\n }\n player.focus()\n }\n }\n\n dbClickHandler (e) {\n const { config, player } = this\n if (!config.closedbClick && player.state >= STATES.RUNNING) {\n this.sendUseAction(Util.createEvent('dblclick'))\n this.switchPlayPause()\n }\n }\n\n onClick (e) {\n const { player } = this\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.clickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onDbClick (e) {\n const { player } = this\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.dbClickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onPress (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n pos.rate = this.player.playbackRate\n this.emitUserAction('press', 'change_rate', {\n prop: 'playbackRate',\n from: player.playbackRate,\n to: config.pressRate\n })\n player.playbackRate = config.pressRate\n this.changeAction(ACTIONS.PLAYBACK)\n }\n\n onPressEnd (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n this.emitUserAction('pressend', 'change_rate', { prop: 'playbackRate', from: player.playbackRate, to: pos.rate })\n player.playbackRate = pos.rate\n pos.rate = 1\n this.changeAction(ACTIONS.AUTO)\n }\n\n updateTime (percent) {\n const { player, config } = this\n const { duration } = this.player\n percent = Number(percent.toFixed(4))\n let time = parseInt(percent * config.moveDuration, 10) + this.timeOffset\n time += this.pos.time\n time = time < 0 ? 0 : (time > duration * 1000 ? duration * 1000 - 200 : time)\n player.getPlugin('time') && player.getPlugin('time').updateTime(time / 1000)\n player.getPlugin('progress') && player.getPlugin('progress').updatePercent(time / 1000 / this.duration, true)\n this.activeSeekNote(time / 1000, percent > 0)\n // 在滑动的同时实时seek\n if (config.isTouchingSeek) {\n // player.currentTime = time / 1000\n player.seek(Number((time - this.timeOffset) / 1000).toFixed(1))\n }\n this.pos.time = time\n }\n\n updateVolume (percent) {\n if (this.player.rotateDeg) {\n percent = -percent\n }\n const { player, pos } = this\n percent = parseInt(percent * 100, 10)\n pos.volume += percent\n if (Math.abs(pos.volume) < 10) {\n return\n }\n let volume = parseInt(player.volume * 10, 10) - parseInt(pos.volume / 10, 10)\n volume = volume > 10 ? 10 : (volume < 1 ? 0 : volume)\n player.volume = volume / 10\n pos.volume = 0\n }\n\n updateBrightness (percent) {\n const { pos, config, xgMask } = this\n if (!config.darkness) {\n return\n }\n if (this.player.rotateDeg) {\n percent = -percent\n }\n let light = pos.light + (0.8 * percent)\n light = light > config.maxDarkness ? config.maxDarkness : (light < 0 ? 0 : light)\n if (xgMask) {\n xgMask.style.backgroundColor = `rgba(0,0,0,${light})`\n }\n pos.light = light\n }\n\n activeSeekNote (time, isForward = true) {\n const { player, config } = this\n const isLive = !(this.duration !== Infinity && this.duration > 0)\n if (!time || typeof time !== 'number' || isLive || config.disableActive) {\n return\n }\n if (time < 0) {\n time = 0\n } else if (time > player.duration) {\n time = player.duration - 0.2\n }\n this.changeAction(ACTIONS.SEEKING)\n\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.focusHide()\n\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n this.find('.xg-cur').innerHTML = Util.format(time)\n this.find('.xg-curbar').style.width = `${time / this.duration * 100}%`\n if (isForward) {\n Util.removeClass(this.find('.xg-seek-show'), 'xg-back')\n } else {\n Util.addClass(this.find('.xg-seek-show'), 'xg-back')\n }\n this.updateThumbnails(time)\n // const {thumbnail} = player.plugins\n // this.thumbnailPlugin && thumbnail.update(time)\n }\n\n updateThumbnails (time) {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, 160, 90)\n // this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n switchPlayPause () {\n const { player } = this\n if (player.state < STATES.ATTACHED) {\n return false\n } else if (!player.ended) {\n if (player.paused) {\n player.play()\n } else {\n player.pause()\n }\n }\n }\n\n // 动态禁用手势\n disableGesture () {\n this.config.disableGesture = true\n }\n\n // 动态启用手势\n enableGesture () {\n this.config.disableGesture = false\n }\n\n destroy () {\n const { player } = this\n this.timer && clearTimeout(this.timer)\n this.thumbnail = null\n player.root.removeChild(this.xgMask)\n this.xgMask = null\n this.touch && this.touch.destroy()\n this.touch = null\n player.root.removeEventListener('touchmove', this.onRootTouchMove, true)\n player.root.removeEventListener('touchend', this.onRootTouchEnd, true)\n player.root.removeEventListener('touchcancel', this.onRootTouchEnd, true)\n const { controls } = this.player\n if (controls && controls.center) {\n controls.center.removeEventListener('touchmove', this.onRootTouchMove, true)\n controls.center.removeEventListener('touchend', this.onRootTouchEnd, true)\n controls.center.removeEventListener('touchcancel', this.onRootTouchEnd, true)\n }\n }\n\n render () {\n const className = this.config.gradient !== 'normal' ? `gradient ${this.config.gradient}` : 'gradient'\n return `\n <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 class=\"xg-separator\">/</span>\n <span class=\"xg-dur\">00:00</span>\n </div>\n <div class=\"xg-bar xg-timebar\">\n <div class=\"xg-curbar\"></div>\n </div>\n </div>\n <div class=\"xg-playbackrate xg-top-note\">\n <span><i>${this.config.pressRate}X</i>${this.i18n.FORWARD}</span>\n </div>\n </xg-trigger>\n `\n }\n}\n\nexport default MobilePlugin\n","import { BasePlugin, Events, Util } from '../../plugin'\n\n/**\n * @typedef {{\n * seekStep?: number,\n * checkVisible?: boolean,\n * disableBodyTrigger?: boolean,\n * keyCodeMap?: { [propName: string]: any },\n * disable: boolean,\n * playbackRate: number,\n * isIgnoreUserActive: boolean,\n * [propName: string]: any\n * }} IKeyboardConfig\n */\n\nfunction preventDefault (e) {\n e.preventDefault()\n e.returnValue = false\n}\n\nfunction isDisableTag (el) {\n const tagName = el.tagName\n\n if (tagName === 'INPUT' || tagName === 'TEXTAREA' || el.isContentEditable) {\n return true\n }\n\n return false\n}\n\nclass Keyboard extends BasePlugin {\n static get pluginName () {\n return 'keyboard'\n }\n\n /**\n * @type IKeyboardConfig\n */\n static get defaultConfig () {\n return {\n seekStep: 10, // Left/right fast forward each operation time\n checkVisible: false, // Whether to check the visibility when the shortcut key takes effect\n disableBodyTrigger: false, // Whether to monitor the shortcut keys on the body\n disableRootTrigger: false, // 是否在player.root上做快捷键监听\n isGlobalTrigger: true, // Whether the shortcut key needs to be triggered globally\n keyCodeMap: {},\n disable: false,\n playbackRate: 2, // 长按倍速限制\n isIgnoreUserActive: true // 是否忽略用户激活状态\n }\n }\n\n mergekeyCodeMap () {\n const extendkeyCodeMap = this.config.keyCodeMap\n if (extendkeyCodeMap) {\n Object.keys(extendkeyCodeMap).map(key => {\n if (!this.keyCodeMap[key]) {\n this.keyCodeMap[key] = extendkeyCodeMap[key]\n } else {\n ['keyCode', 'action', 'disable', 'pressAction', 'disablePress', 'isBodyTarget'].map(key1 => {\n extendkeyCodeMap[key][key1] && (this.keyCodeMap[key][key1] = extendkeyCodeMap[key][key1])\n })\n }\n })\n }\n }\n\n afterCreate () {\n this.config.disable = !this.playerConfig.keyShortcut\n const seekStep = typeof this.config.seekStep === 'function' ? this.config.seekStep(this.player) : this.config.seekStep\n if (!(!seekStep || typeof seekStep !== 'number')) {\n this.seekStep = seekStep\n }\n this.keyCodeMap = {\n space: {\n keyCode: 32,\n action: 'playPause',\n disable: false,\n disablePress: false,\n noBodyTarget: false\n },\n up: {\n keyCode: 38,\n action: 'upVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n down: {\n keyCode: 40,\n action: 'downVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n left: {\n keyCode: 37,\n action: 'seekBack',\n disablePress: false,\n disable: false\n },\n right: {\n keyCode: 39,\n action: 'seek',\n pressAction: 'changePlaybackRate',\n disablePress: false,\n disable: false\n },\n esc: {\n keyCode: 27,\n action: 'exitFullscreen',\n disablePress: true,\n disable: false\n }\n }\n this.mergekeyCodeMap()\n this._keyState = {\n isKeyDown: false,\n isBodyKeyDown: false,\n isPress: false,\n tt: 0,\n playbackRate: 0\n }\n this.player.root.addEventListener('keydown', this.onKeydown)\n document.addEventListener('keydown', this.onBodyKeyDown)\n }\n\n setConfig (newConfig) {\n Object.keys(newConfig).forEach(key => {\n this.config[key] = newConfig[key]\n })\n }\n\n checkIsVisible () {\n if (!this.config.checkVisible) {\n return true\n }\n const rec = this.player.root.getBoundingClientRect()\n const { height, top, bottom } = rec\n const h = window.innerHeight\n if ((top < 0 && top < 0 - height * 0.9) || (bottom > 0 && bottom - h > height * 0.9)) {\n return false\n }\n return true\n }\n\n checkCode (code, isBodyTarget) {\n let flag = false\n Object.keys(this.keyCodeMap).map(key => {\n if (this.keyCodeMap[key] && code === this.keyCodeMap[key].keyCode && !this.keyCodeMap[key].disable) {\n flag = !isBodyTarget || (isBodyTarget && !this.keyCodeMap[key].noBodyTarget)\n }\n })\n return flag\n }\n\n downVolume (event) {\n const { player } = this\n if (player.volume <= 0) {\n return\n }\n const val = parseFloat((player.volume - 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val >= 0) {\n player.volume = val\n } else {\n player.volume = 0\n }\n }\n\n upVolume (event) {\n const { player } = this\n if (player.volume >= 1) {\n return\n }\n const val = parseFloat((player.volume + 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val <= 1) {\n player.volume = val\n } else {\n player.volume = 1\n }\n }\n\n seek (event) {\n const { currentTime, offsetCurrentTime, duration, offsetDuration, timeSegments } = this.player\n let _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n const _duration = offsetDuration || duration\n const _step = event.repeat && this.seekStep >= 4 ? parseInt(this.seekStep / 2, 10) : this.seekStep\n if (_time + _step <= _duration) {\n _time = _time + _step\n } else {\n _time = _duration\n }\n const _seekTime = Util.getCurrentTimeByOffset(_time, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n seekBack (event) {\n const { currentTime, offsetCurrentTime, timeSegments } = this.player\n const _step = event.repeat ? parseInt(this.seekStep / 2, 10) : this.seekStep\n const _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n let _seekTime = _time - _step\n if (_seekTime < 0) {\n _seekTime = 0\n }\n _seekTime = Util.getCurrentTimeByOffset(_seekTime, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n changePlaybackRate (event) {\n const { _keyState, config, player } = this\n if (_keyState.playbackRate === 0) {\n _keyState.playbackRate = player.playbackRate\n player.playbackRate = config.playbackRate\n }\n }\n\n playPause (event) {\n const { player } = this\n if (!player) {\n return\n }\n this.emitUserAction(event, 'switch_play_pause')\n if (player.paused) {\n // eslint-disable-next-line handle-callback-err\n player.play()\n } else {\n player.pause()\n }\n }\n\n exitFullscreen (event) {\n const { player } = this\n const { fullscreen, cssfullscreen } = player\n if (fullscreen) {\n this.emitUserAction('keyup', 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n player.exitFullscreen()\n }\n if (cssfullscreen) {\n this.emitUserAction('keyup', 'switch_css_fullscreen', {\n prop: 'cssfullscreen',\n from: cssfullscreen,\n to: !cssfullscreen\n })\n player.exitCssFullscreen()\n }\n }\n\n onBodyKeyDown = (event) => {\n if (!this.player) {\n return\n }\n const e = event || window.event\n const keyCode = e.keyCode\n const { _keyState, player } = this\n const { disable, disableBodyTrigger, isIgnoreUserActive } = this.config\n // 以下条件不响应\n if (disable || disableBodyTrigger || !(player.isUserActive || isIgnoreUserActive) || isDisableTag(e.target) || !this.checkIsVisible() || e.metaKey || e.altKey || e.ctrlKey) {\n _keyState.isBodyKeyDown = false\n return\n }\n // 首次进入进行是否生效校验\n if (!event.repeat && !_keyState.isKeyDown) {\n if ((e.target === document.body || (this.config.isGlobalTrigger && !isDisableTag(e.target))) && this.checkCode(keyCode, true)) {\n _keyState.isBodyKeyDown = true\n }\n document.addEventListener('keyup', this.onBodyKeyUp)\n }\n _keyState.isBodyKeyDown && this.handleKeyDown(e)\n }\n\n onBodyKeyUp = (event) => {\n if (!this.player) {\n return\n }\n document.removeEventListener('keyup', this.onBodyKeyUp)\n this.handleKeyUp(event)\n }\n\n onKeydown = (event) => {\n if (!this.player) {\n return\n }\n const e = event || window.event\n const { _keyState } = this\n // 首次按下检查是否满足触发他条件\n if (!e.repeat) {\n if (this.config.disable || this.config.disableRootTrigger || e.metaKey || e.altKey || e.ctrlKey) {\n return\n }\n if (e && (e.keyCode === 37 || this.checkCode(e.keyCode)) && (e.target === this.player.root || e.target === this.player.video || e.target === this.player.controls.el)) {\n _keyState.isKeyDown = true\n }\n this.player.root.addEventListener('keyup', this.onKeyup)\n }\n // 长按不满足触发条件直接返回\n if (!_keyState.isKeyDown) {\n return\n }\n this.handleKeyDown(e)\n }\n\n onKeyup = (event) => {\n if (!this.player) {\n return\n }\n this.player.root.removeEventListener('keyup', this.onKeyup)\n this.handleKeyUp(event)\n }\n\n handleKeyDown (e) {\n const { _keyState } = this\n if (e.repeat) {\n _keyState.isPress = true\n const _t = Date.now()\n if (_t - _keyState.tt < 200) {\n return\n }\n _keyState.tt = _t\n }\n this.handleKeyCode(e.keyCode, e, _keyState.isPress)\n }\n\n handleKeyUp (e) {\n const { _keyState } = this\n if (_keyState.playbackRate > 0) {\n this.player.playbackRate = _keyState.playbackRate\n _keyState.playbackRate = 0\n }\n _keyState.isKeyDown = false\n _keyState.isPress = false\n _keyState.tt = 0\n }\n\n handleKeyCode (curKeyCode, event, isPress) {\n const arr = Object.keys(this.keyCodeMap)\n for (let i = 0; i < arr.length; i++) {\n const { action, keyCode, disable, pressAction, disablePress } = this.keyCodeMap[arr[i]]\n if (keyCode === curKeyCode) {\n if (!disable && !(isPress && disablePress)) {\n const _action = !isPress ? action : (pressAction || action)\n if (typeof _action === 'function') {\n action(event, this.player, isPress)\n } else if (typeof _action === 'string') {\n if (typeof this[_action] === 'function') {\n this[_action](event, this.player, isPress)\n }\n }\n this.emit(Events.SHORTCUT, {\n key: arr[i],\n target: event.target,\n isPress: isPress,\n ...this.keyCodeMap[arr[i]]\n })\n }\n preventDefault(event)\n event.stopPropagation()\n break\n }\n }\n }\n\n destroy () {\n this.player.root.removeEventListener('keydown', this.onKeydown)\n document.removeEventListener('keydown', this.onBodyKeyDown)\n this.player.root.removeEventListener('keyup', this.onKeyup)\n document.removeEventListener('keyup', this.onBodyKeyUp)\n }\n\n disable () {\n this.config.disable = true\n }\n\n enable () {\n this.config.disable = false\n }\n}\n\nexport default Keyboard\n","import Plugin, { POSITIONS } from '../../plugin/plugin'\nimport loadingIcon from '../assets/loading.svg'\nimport './index.scss'\n\nclass Loading extends Plugin {\n static get pluginName () {\n return 'loading'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT\n }\n }\n\n registerIcons () {\n return {\n loadingIcon: loadingIcon\n }\n }\n\n afterCreate () {\n this.appendChild('xg-loading-inner', this.icons.loadingIcon)\n }\n\n render () {\n return `\n <xg-loading class=\"xgplayer-loading\">\n <xg-loading-inner></xg-loading-inner>\n </xg-loading>`\n }\n}\n\nexport default Loading\n","import { BasePlugin, Events, Util } from '../../plugin'\n/**\n * 进行事件分段控制\n */\nexport default class TimeSegmentsControls extends BasePlugin {\n static get pluginName () {\n return 'TimeSegmentsControls'\n }\n\n static get defaultConfig () {\n return {\n disable: true,\n segments: []\n }\n }\n\n afterCreate () {\n this.curIndex = -1\n this.curPos = null\n this.lastCurrentTime = 0\n\n this.updateSegments()\n\n this.on(Events.DURATION_CHANGE, this._onDurationChange)\n this.on(Events.LOADED_DATA, this._onLoadedData)\n\n this.on(Events.TIME_UPDATE, this._onTimeupdate)\n\n this.on(Events.SEEKING, this._onSeeking)\n\n this.on(Events.PLAY, this._onPlay)\n }\n\n setConfig (newConfig) {\n if (!newConfig) {\n return\n }\n const keys = Object.keys(newConfig)\n if (keys.length < 1) {\n return\n }\n keys.forEach(key => {\n this.config[key] = newConfig[key]\n })\n this.updateSegments()\n }\n\n updateSegments () {\n const { disable, segments } = this.config\n const { player } = this\n if (disable || !segments || segments.length === 0) {\n player.timeSegments = []\n player.offsetDuration = 0\n player.offsetCurrentTime = -1\n } else {\n const _segs = this.formatTimeSegments(segments, player.duration)\n player.timeSegments = _segs\n player.offsetDuration = _segs.length > 0 ? _segs[_segs.length - 1].duration : 0\n }\n }\n\n formatTimeSegments (timeSegments, duration) {\n const ret = []\n if (!timeSegments) {\n return []\n }\n // console.log('>>>formatTimeSegments', duration)\n timeSegments.sort((a,b) =>{ return a.start - b.start })\n timeSegments.forEach((item, index) => {\n const _item = {}\n _item.start = item.start < 0 ? 0 : item.start\n _item.end = duration > 0 && item.end > duration ? duration : item.end\n if (duration > 0 && _item.start > duration) {\n return\n }\n ret.push(_item)\n const _segDuration = _item.end - _item.start\n if (index === 0) {\n _item.offset = item.start // 偏移量\n _item.cTime = 0\n _item.segDuration = _segDuration\n _item.duration = _segDuration\n } else {\n const last = ret[index - 1]\n _item.offset = last.offset + (_item.start - last.end)\n _item.cTime = last.duration + last.cTime\n _item.segDuration = _segDuration\n _item.duration = last.duration + _segDuration\n }\n })\n return ret\n }\n\n _onDurationChange = () => {\n this.updateSegments()\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const index = Util.getIndexByTime(currentTime,timeSegments)\n const time = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n this.player.offsetCurrentTime = time\n this.changeIndex(index, timeSegments)\n }\n\n _onLoadedData = () => {\n const { timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const time = Util.getOffsetCurrentTime(0, timeSegments)\n this.player.offsetCurrentTime = time\n this.changeIndex(0, timeSegments)\n if (this.curPos.start > 0){\n this.player.currentTime = this.curPos.start\n }\n }\n\n _onTimeupdate = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const _len = timeSegments.length\n this.lastCurrentTime = currentTime\n const index = Util.getIndexByTime(currentTime, timeSegments)\n if (index !== this.curIndex) {\n this.changeIndex(index, timeSegments)\n }\n const curTime = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n\n this.player.offsetCurrentTime = curTime\n\n // 根据分段信息进行放时间点跳转\n if (!this.curPos) {\n return\n }\n const { start, end } = this.curPos\n if (currentTime < start) {\n this.player.currentTime = start\n } else if (currentTime > end && index >= _len - 1) {\n this.player.pause()\n }\n }\n\n _onSeeking = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n if (currentTime < timeSegments[0].start) {\n this.player.currentTime = timeSegments[0].start\n } else if (currentTime > timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[timeSegments.length - 1].end\n } else {\n const _index = Util.getIndexByTime(currentTime, timeSegments)\n if (_index >= 0) {\n const _seekTime = this.getSeekTime(currentTime, this.lastCurrentTime, _index, timeSegments)\n if (_seekTime >= 0 ) {\n this.player.currentTime = _seekTime\n }\n }\n }\n }\n\n _onPlay = () => {\n const { currentTime, timeSegments } = this.player\n if (this._checkIfEnabled(timeSegments) && currentTime >= timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[0].start\n }\n }\n\n getSeekTime (currentTime, lastCurrentTime, index, timeSegments) {\n let _time = -1\n const { start, end } = timeSegments[index]\n if (currentTime >= start && currentTime <= end) {\n // console.log('>>>>_onSeeking noSeek', currentTime, lastCurrentTime, start, end, _time)\n return _time\n }\n const diff = currentTime - lastCurrentTime\n if (diff < 0) {\n if (currentTime < start) {\n const diff2 = lastCurrentTime > start ? lastCurrentTime - start : 0\n _time = index - 1 >= 0 ? timeSegments[index - 1].end + diff + diff2 : 0\n // console.log('>>>>_onSeeking seek3', currentTime, lastCurrentTime, diff, start, end, _time)\n return _time\n }\n }\n return -1\n }\n\n _checkIfEnabled (segments) {\n return !(!segments || segments.length < 1)\n }\n\n changeIndex (index, timeSegments) {\n this.curIndex = index\n if (index >= 0 && timeSegments.length > 0) {\n this.curPos = timeSegments[index]\n } else {\n this.curPos = null\n }\n }\n}","import { POSITIONS, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport { Events } from '../../plugin/basePlugin'\nimport RotateSvg from '../assets/rotate.svg'\nimport './index.scss'\n\nexport default class Rotate extends IconPlugin {\n static get pluginName () {\n return 'rotate'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n innerRotate: true, // true为只有画面旋转,false为整个播放器旋转\n clockwise: false,\n rotateDeg: 0, // 初始旋转角度\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.rotateDeg = this.config.rotateDeg || 0\n }\n\n afterCreate () {\n if (this.config.disable) {\n return\n }\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.rotate)\n this.onBtnClick = this.onBtnClick.bind(this)\n this.bind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n // 全屏/css全屏/容器宽高发生变化 需要重新计算\n this.on(Events.VIDEO_RESIZE, () => {\n if (this.rotateDeg && this.config.innerRotate) {\n Util.setTimeout(this, () => {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }, 100)\n }\n })\n\n const root = this.player.root\n this.rootWidth = root.style.width || root.offsetWidth || root.clientWidth\n this.rootHeight = root.style.height || root.offsetHeight || root.clientHeight\n\n if (this.rotateDeg) {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n }\n\n onBtnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'rotate')\n this.rotate(this.config.clockwise, this.config.innerRotate, 1)\n }\n\n updateRotateDeg (rotateDeg, innerRotate) {\n if (!rotateDeg) {\n rotateDeg = 0\n }\n if (innerRotate) {\n this.player.videoRotateDeg = rotateDeg\n return\n }\n const { player, rootWidth, rootHeight } = this\n const { root, innerContainer } = player\n const video = player.media\n const width = root.offsetWidth\n const height = innerContainer && innerRotate ? innerContainer.offsetHeight : root.offsetHeight\n let rWidth = rootWidth\n let rHeight = rootHeight\n let x = 0\n let y = 0\n if (rotateDeg === 0.75 || rotateDeg === 0.25) {\n rWidth = `${height}px`\n rHeight = `${width}px`\n x = -(height - width) / 2\n y = -(width - height) / 2\n }\n const _transform = `translate(${x}px,${y}px) rotate(${rotateDeg}turn)`\n const _styles = {\n transformOrigin: 'center center',\n transform: _transform,\n webKitTransform: _transform,\n height: rHeight,\n width: rWidth\n }\n\n const _target = innerRotate ? video : root\n const poster = innerRotate ? player.getPlugin('poster') : null\n Object.keys(_styles).map(key => {\n _target.style[key] = _styles[key]\n poster && poster.root && (poster.root.style[key] = _styles[key])\n })\n }\n\n rotate (clockwise = false, innerRotate = true, times = 1) {\n const player = this.player\n if (!this.rotateDeg) {\n this.rotateDeg = 0\n }\n const factor = clockwise ? 1 : -1\n\n this.rotateDeg = (this.rotateDeg + 1 + factor * 0.25 * times) % 1\n this.updateRotateDeg(this.rotateDeg, innerRotate)\n player.emit(Events.ROTATE, this.rotateDeg * 360)\n }\n\n registerIcons () {\n return {\n rotate: RotateSvg\n }\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n <xg-icon class=\"xgplayer-rotate\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'ROTATE_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","/* global documentPictureInPicture */\nimport { Events, Util, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport PipIcon from '../assets/pipIcon.svg'\nimport PipIconExit from '../assets/pipIconExit.svg'\nimport './index.scss'\n\n/**\n * @description picture-in-picture plugin\n * @doc https://www.w3.org/TR/picture-in-picture/\n * @doc https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n * @doc https://wicg.github.io/document-picture-in-picture/\n */\n\nconst PresentationMode = {\n PIP: 'picture-in-picture',\n INLINE: 'inline',\n FULLSCREEN: 'fullscreen'\n}\n\nclass PIP extends IconPlugin {\n static get pluginName () {\n return 'pip'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n showIcon: false,\n preferDocument: false,\n width: undefined,\n height: undefined,\n docPiPNode: undefined,\n docPiPStyle: undefined\n }\n }\n\n static checkWebkitSetPresentationMode (video) {\n return typeof video.webkitSetPresentationMode === 'function'\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.pip === 'boolean') {\n args.config.showIcon = args.player.config.pip\n }\n }\n\n afterCreate () {\n // 非可用状态不做初始化\n if (!this.isPIPAvailable()) {\n return\n }\n super.afterCreate()\n this.pMode = PresentationMode.INLINE\n this.initPipEvents()\n // 确认开启按钮的情况下才初始化按钮\n if (this.config.showIcon) {\n this.initIcons()\n }\n // video初始化之后再做判断是否显示\n this.once(Events.COMPLETE, () => {\n if (this.config.showIcon) {\n Util.removeClass(this.find('.xgplayer-icon'), 'xg-icon-disable')\n this.bind('click', this.switchPIP)\n }\n })\n }\n\n registerIcons () {\n return {\n pipIcon: { icon: PipIcon, class: 'xg-get-pip' },\n pipIconExit: { icon: PipIconExit, class: 'xg-exit-pip' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.pipIcon)\n this.appendChild('.xgplayer-icon', icons.pipIconExit)\n }\n\n initPipEvents () {\n const { player } = this\n this.leavePIPCallback = () => {\n // 处理点击x关闭画中画的时候暂停问题\n const paused = player.paused\n Util.setTimeout(this, () => {\n // 使用mediaPlay避免多次触发 playhooks\n !paused && player.mediaPlay()\n }, 0)\n !paused && player.mediaPlay()\n this.setAttr('data-state', 'normal')\n this.pipWindow = null\n player.emit(Events.PIP_CHANGE, false)\n }\n\n this.enterPIPCallback = (e) => {\n player.emit(Events.PIP_CHANGE, true)\n if (e?.pictureInPictureWindow) {\n this.pipWindow = e.pictureInPictureWindow\n }\n this.setAttr('data-state', 'pip')\n }\n\n this.onWebkitpresentationmodechanged = (e) => {\n const mode = player.media.webkitPresentationMode\n // 如果在全屏下进入了该逻辑,调用退出全屏处理\n if (this.pMode === PresentationMode.FULLSCREEN && mode !== PresentationMode.FULLSCREEN) {\n player.onFullscreenChange(null, false)\n }\n this.pMode = mode\n if (mode === PresentationMode.PIP) {\n this.enterPIPCallback(e)\n } else if (mode === PresentationMode.INLINE) {\n this.leavePIPCallback(e)\n }\n }\n\n if (player.media) {\n player.media.addEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.addEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.addEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n }\n }\n\n switchPIP = (e) => {\n if (!this.isPIPAvailable()) {\n return false\n }\n e.stopPropagation && e.stopPropagation()\n if (this.isPip) {\n this.exitPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: true, to: false })\n this.setAttr('data-state', 'normal')\n } else if (this.player.media.readyState === 4) {\n this.requestPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: false, to: true })\n this.setAttr('data-state', 'pip')\n }\n }\n\n copyStyleIntoPiPWindow (pipWin) {\n const textContent = [...document.styleSheets]\n .map((style) => {\n try {\n return [...style.cssRules].map((rule) => rule.cssText).join('')\n } catch (e) {\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.type = style.type\n link.media = style.media\n link.href = style.href\n pipWin.document.head.appendChild(link)\n }\n return ''\n })\n .filter(Boolean)\n .join('\\n')\n const style = document.createElement('style')\n\n style.textContent = textContent\n pipWin.document.head.appendChild(style)\n }\n\n /*\n * 进入画中画\n */\n requestPIP () {\n const { player, playerConfig, config } = this\n if (!this.isPIPAvailable() || this.isPip) {\n return\n }\n try {\n const { poster } = playerConfig\n if (poster) {\n player.media.poster = Util.typeOf(poster) === 'String' ? poster : poster.poster\n }\n\n if (config.preferDocument && this.isDocPIPAvailable()) {\n const pipOptions = {}\n\n if (config.width && config.height) {\n pipOptions.width = config.width\n pipOptions.height = config.height\n } else {\n const playerRect = player.root.getBoundingClientRect()\n pipOptions.width = playerRect.width\n pipOptions.height = playerRect.height\n }\n\n documentPictureInPicture.requestWindow(pipOptions).then((pipWin) => {\n const { docPiPNode, docPiPStyle } = config\n\n this.enterPIPCallback()\n\n // record original position\n const pipRoot = docPiPNode || player.root\n const parentNode = pipRoot.parentElement\n const previousSibling = pipRoot.previousSibling\n const nextSibling = pipRoot.nextSibling\n\n this.copyStyleIntoPiPWindow(pipWin)\n\n // Make sure player fits in the Picture-in-Picture window.\n const styles = document.createElement('style')\n styles.append('body{padding:0; margin:0;}')\n if (docPiPStyle) {\n let cssContent = ''\n if (typeof docPiPStyle === 'string') {\n cssContent = docPiPStyle\n } else if (typeof docPiPStyle === 'function') {\n cssContent = docPiPStyle.call(config)\n }\n if (cssContent) {\n styles.append(cssContent)\n }\n } else if (pipRoot === player.root) {\n styles.append(`\n .xgplayer{width: 100%!important; height: 100%!important;}\n `)\n }\n pipWin.document.head.append(styles)\n\n // Add player to the PiP window.\n pipWin.document.body.append(pipRoot)\n\n // Listen for the PiP closing event to put the video back.\n pipWin.addEventListener('pagehide', (event) => {\n // Restore nodes to their original location\n if (parentNode) {\n if (nextSibling) {\n parentNode.insertBefore(pipRoot, nextSibling)\n } else if (previousSibling) {\n parentNode.insertBefore(pipRoot, previousSibling.nextSibling)\n } else {\n parentNode.appendChild(pipRoot)\n }\n } else {\n // console.log('无法找到原始父节点')\n }\n\n this.leavePIPCallback()\n }, { once: true })\n })\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('picture-in-picture')\n } else {\n player.media.requestPictureInPicture()\n }\n\n\n return true\n } catch (reason) {\n console.error('requestPiP', reason)\n return false\n }\n }\n\n /**\n * 退出画中画\n */\n exitPIP () {\n const { player } = this\n try {\n if (this.isPIPAvailable() && this.isPip) {\n if (this.isDocPIPAvailable() && documentPictureInPicture?.window) {\n documentPictureInPicture.window.close()\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('inline')\n } else {\n document.exitPictureInPicture()\n }\n }\n return true\n } catch (reason) {\n console.error('exitPIP', reason)\n return false\n }\n }\n\n /**\n * 处于画中画状态\n */\n get isPip () {\n const { player } = this\n return (\n !!(this.isDocPIPAvailable() && documentPictureInPicture?.window) ||\n (document.pictureInPictureElement &&\n document.pictureInPictureElement === player.media) ||\n player.media.webkitPresentationMode === PresentationMode.PIP\n )\n }\n\n isPIPAvailable () {\n const video = this.player.media\n const _isEnabled = Util.typeOf(document.pictureInPictureEnabled) === 'Boolean' ? document.pictureInPictureEnabled : false\n return _isEnabled &&\n ((Util.typeOf(video.disablePictureInPicture) === 'Boolean' && !video.disablePictureInPicture) ||\n (video.webkitSupportsPresentationMode && Util.typeOf(video.webkitSetPresentationMode) === 'Function')) ||\n this.isDocPIPAvailable()\n }\n\n isDocPIPAvailable () {\n return 'documentPictureInPicture' in window && /^(https|file)/.test(location.protocol)\n }\n\n destroy () {\n super.destroy()\n const { player } = this\n player.media.removeEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.removeEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.removeEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n this.exitPIP()\n this.unbind('click', this.btnClick)\n }\n\n render () {\n if (!this.config.showIcon || !this.isPIPAvailable()) {\n return\n }\n return `<xg-icon class=\"xgplayer-pip\">\n <div class=\"xgplayer-icon xg-icon-disable\">\n </div>\n ${xgIconTips(this, 'PIP', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\nexport default PIP\n","/**\n * 下一个按钮组件\n */\nimport Plugin, { POSITIONS, Sniffer, Events } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport Next from '../assets/playNext.svg'\nimport './index.scss'\n\nexport default class PlayNextIcon extends Plugin {\n static get pluginName () {\n return 'playNext'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 1,\n url: null,\n urlList: []\n }\n }\n\n constructor (options) {\n super(options)\n this.idx = -1\n }\n\n afterCreate () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.playNext)\n this.initEvents()\n }\n\n registerIcons () {\n return {\n playNext: Next\n }\n }\n\n initEvents () {\n this.nextHandler = this.hook('nextClick', this.changeSrc)\n const event = Sniffer.device === 'mobile' ? 'touchend' : 'click'\n this.bind(event, this.playNext)\n this.show()\n }\n\n playNext = (e) => {\n const { player } = this\n e.preventDefault()\n e.stopPropagation()\n if (this.idx + 1 < this.config.urlList.length) {\n this.idx++\n this.nextHandler(this.config.urlList[this.idx], this.idx)\n player.emit(Events.PLAYNEXT, this.idx + 1)\n } else {\n this.nextHandler()\n player.emit(Events.PLAYNEXT)\n }\n }\n\n changeSrc (url) {\n const { player } = this\n if (!url) {\n return\n }\n player.pause()\n player.currentTime = 0\n if (player.switchURL) {\n player.switchURL(url)\n } else {\n player.src = url\n }\n player.config.url = url\n player.play()\n }\n\n destroy () {\n this.unbind(['touchend', 'click'], this.playNext)\n }\n\n render () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n return `\n <xg-icon class=\"xgplayer-playnext\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'PLAYNEXT_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>\n `\n }\n}\n","//download.js v4.2, by dandavis; 2008-2016. [MIT] see http://danml.com/download.html for tests/usage\n// v1 landed a FF+Chrome compat way of downloading strings to local un-named files, upgraded to use a hidden frame and optional mime\n// v2 added named files via a[download], msSaveBlob, IE (10+) support, and window.URL support for larger+faster saves than dataURLs\n// v3 added dataURL and Blob Input, bind-toggle arity, and legacy dataURL fallback was improved with force-download mime and base64 support. 3.1 improved safari handling.\n// v4 adds AMD/UMD, commonJS, and plain browser support\n// v4.1 adds url download capability via solo URL argument (same domain/CORS only)\n// v4.2 adds semantic variable names, long (over 2MB) dataURL support, and hidden by default temp anchors\n// https://github.com/rndme/download\n\n(function (root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([], factory);\n\t} else if (typeof exports === 'object') {\n\t\t// Node. Does not work with strict CommonJS, but\n\t\t// only CommonJS-like environments that support module.exports,\n\t\t// like Node.\n\t\tmodule.exports = factory();\n\t} else {\n\t\t// Browser globals (root is window)\n\t\troot.download = factory();\n }\n}(this, function () {\n\n\treturn function download(data, strFileName, strMimeType) {\n\n\t\tvar self = window, // this script is only for browsers anyway...\n\t\t\tdefaultMime = \"application/octet-stream\", // this default mime also triggers iframe downloads\n\t\t\tmimeType = strMimeType || defaultMime,\n\t\t\tpayload = data,\n\t\t\turl = !strFileName && !strMimeType && payload,\n\t\t\tanchor = document.createElement(\"a\"),\n\t\t\ttoString = function(a){return String(a);},\n\t\t\tmyBlob = (self.Blob || self.MozBlob || self.WebKitBlob || toString),\n\t\t\tfileName = strFileName || \"download\",\n\t\t\tblob,\n\t\t\treader;\n\t\t\tmyBlob= myBlob.call ? myBlob.bind(self) : Blob ;\n\t \n\t\tif(String(this)===\"true\"){ //reverse arguments, allowing download.bind(true, \"text/xml\", \"export.xml\") to act as a callback\n\t\t\tpayload=[payload, mimeType];\n\t\t\tmimeType=payload[0];\n\t\t\tpayload=payload[1];\n\t\t}\n\n\n\t\tif(url && url.length< 2048){ // if no filename and no mime, assume a url was passed as the only argument\n\t\t\tfileName = url.split(\"/\").pop().split(\"?\")[0];\n\t\t\tanchor.href = url; // assign href prop to temp anchor\n\t\t \tif(anchor.href.indexOf(url) !== -1){ // if the browser determines that it's a potentially valid url path:\n \t\tvar ajax=new XMLHttpRequest();\n \t\tajax.open( \"GET\", url, true);\n \t\tajax.responseType = 'blob';\n \t\tajax.onload= function(e){ \n\t\t\t\t download(e.target.response, fileName, defaultMime);\n\t\t\t\t};\n \t\tsetTimeout(function(){ ajax.send();}, 0); // allows setting custom ajax headers using the return:\n\t\t\t return ajax;\n\t\t\t} // end if valid url?\n\t\t} // end if url?\n\n\n\t\t//go ahead and download dataURLs right away\n\t\tif(/^data:([\\w+-]+\\/[\\w+.-]+)?[,;]/.test(payload)){\n\t\t\n\t\t\tif(payload.length > (1024*1024*1.999) && myBlob !== toString ){\n\t\t\t\tpayload=dataUrlToBlob(payload);\n\t\t\t\tmimeType=payload.type || defaultMime;\n\t\t\t}else{\t\t\t\n\t\t\t\treturn navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs:\n\t\t\t\t\tnavigator.msSaveBlob(dataUrlToBlob(payload), fileName) :\n\t\t\t\t\tsaver(payload) ; // everyone else can save dataURLs un-processed\n\t\t\t}\n\t\t\t\n\t\t}else{//not data url, is it a string with special needs?\n\t\t\tif(/([\\x80-\\xff])/.test(payload)){\t\t\t \n\t\t\t\tvar i=0, tempUiArr= new Uint8Array(payload.length), mx=tempUiArr.length;\n\t\t\t\tfor(i;i<mx;++i) tempUiArr[i]= payload.charCodeAt(i);\n\t\t\t \tpayload=new myBlob([tempUiArr], {type: mimeType});\n\t\t\t}\t\t \n\t\t}\n\t\tblob = payload instanceof myBlob ?\n\t\t\tpayload :\n\t\t\tnew myBlob([payload], {type: mimeType}) ;\n\n\n\t\tfunction dataUrlToBlob(strUrl) {\n\t\t\tvar parts= strUrl.split(/[:;,]/),\n\t\t\ttype= parts[1],\n\t\t\tdecoder= parts[2] == \"base64\" ? atob : decodeURIComponent,\n\t\t\tbinData= decoder( parts.pop() ),\n\t\t\tmx= binData.length,\n\t\t\ti= 0,\n\t\t\tuiArr= new Uint8Array(mx);\n\n\t\t\tfor(i;i<mx;++i) uiArr[i]= binData.charCodeAt(i);\n\n\t\t\treturn new myBlob([uiArr], {type: type});\n\t\t }\n\n\t\tfunction saver(url, winMode){\n\n\t\t\tif ('download' in anchor) { //html5 A[download]\n\t\t\t\tanchor.href = url;\n\t\t\t\tanchor.setAttribute(\"download\", fileName);\n\t\t\t\tanchor.className = \"download-js-link\";\n\t\t\t\tanchor.innerHTML = \"downloading...\";\n\t\t\t\tanchor.style.display = \"none\";\n\t\t\t\tdocument.body.appendChild(anchor);\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tanchor.click();\n\t\t\t\t\tdocument.body.removeChild(anchor);\n\t\t\t\t\tif(winMode===true){setTimeout(function(){ self.URL.revokeObjectURL(anchor.href);}, 250 );}\n\t\t\t\t}, 66);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// handle non-a[download] safari as best we can:\n\t\t\tif(/(Version)\\/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*Safari\\//.test(navigator.userAgent)) {\n\t\t\t\tif(/^data:/.test(url))\turl=\"data:\"+url.replace(/^data:([\\w\\/\\-\\+]+)/, defaultMime);\n\t\t\t\tif(!window.open(url)){ // popup blocked, offer direct download:\n\t\t\t\t\tif(confirm(\"Displaying New Document\\n\\nUse Save As... to download, then click back to return to this page.\")){ location.href=url; }\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t//do iframe dataURL download (old ch+FF):\n\t\t\tvar f = document.createElement(\"iframe\");\n\t\t\tdocument.body.appendChild(f);\n\n\t\t\tif(!winMode && /^data:/.test(url)){ // force a mime that will download:\n\t\t\t\turl=\"data:\"+url.replace(/^data:([\\w\\/\\-\\+]+)/, defaultMime);\n\t\t\t}\n\t\t\tf.src=url;\n\t\t\tsetTimeout(function(){ document.body.removeChild(f); }, 333);\n\n\t\t}//end saver\n\n\n\n\n\t\tif (navigator.msSaveBlob) { // IE10+ : (has Blob, but not a[download] or URL)\n\t\t\treturn navigator.msSaveBlob(blob, fileName);\n\t\t}\n\n\t\tif(self.URL){ // simple fast and modern way using Blob and URL:\n\t\t\tsaver(self.URL.createObjectURL(blob), true);\n\t\t}else{\n\t\t\t// handle non-Blob()+non-URL browsers:\n\t\t\tif(typeof blob === \"string\" || blob.constructor===toString ){\n\t\t\t\ttry{\n\t\t\t\t\treturn saver( \"data:\" + mimeType + \";base64,\" + self.btoa(blob) );\n\t\t\t\t}catch(y){\n\t\t\t\t\treturn saver( \"data:\" + mimeType + \",\" + encodeURIComponent(blob) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Blob but not URL support:\n\t\t\treader=new FileReader();\n\t\t\treader.onload=function(e){\n\t\t\t\tsaver(this.result);\n\t\t\t};\n\t\t\treader.readAsDataURL(blob);\n\t\t}\n\t\treturn true;\n\t}; /* end download() */\n}));\n","import downloadUtil from 'downloadjs'\nimport { POSITIONS, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport DownloadSvg from '../assets/download.svg'\nimport './index.scss'\n/**\n * @typedef { {\n * position: string,\n * index: number,\n * disable: boolean,\n * [propName: string]: any\n * } } IDownloadConfig\n */\nexport default class Download extends IconPlugin {\n static get pluginName () {\n return 'download'\n }\n\n /**\n * @type IDownloadConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n disable: true\n }\n }\n\n constructor (args) {\n super(args)\n this.timer = null\n this.isLock = false\n }\n\n afterCreate () {\n super.afterCreate()\n if (this.config.disable) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.download)\n this._handler = this.hook('click', this.download, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this._handler)\n }\n\n registerIcons () {\n return {\n download: DownloadSvg\n }\n }\n download = (e) => {\n if (this.isLock) {\n return\n }\n this.emitUserAction(e, 'download')\n const { url } = this.playerConfig\n let dUrl = ''\n if (Util.typeOf(url) === 'String') {\n dUrl = url\n } else if (Util.typeOf(url) === 'Array' && url.length > 0) {\n dUrl = url[0].src\n }\n const newUrl = this.getAbsoluteURL(dUrl)\n downloadUtil(newUrl)\n this.isLock = true\n this.timer = window.setTimeout(() => {\n this.isLock = false\n window.clearTimeout(this.timer)\n this.timer = null\n }, 300)\n }\n\n getAbsoluteURL (url) {\n // Check if absolute URL\n if (!url.match(/^https?:\\/\\//)) {\n const div = document.createElement('div')\n div.innerHTML = `<a href=\"${url}\">x</a>`\n url = div.firstChild.href\n }\n return url\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.download)\n window.clearTimeout(this.timer)\n this.timer = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-download\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'DOWNLOAD_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import { POSITIONS, Events } from '../../plugin'\nimport IconPlugin from '../common/iconPlugin'\nimport './index.scss'\n\nexport default class ScreenShot extends IconPlugin {\n static get pluginName () {\n return 'screenShot'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 5,\n quality: 0.92,\n type: 'image/png',\n format: '.png',\n width: 600,\n height: 337,\n saveImg: true,\n fitVideo: true,\n disable: false,\n name: 'screenshot'\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.screenShot === 'boolean') {\n args.config.disable = !args.player.config.screenShot\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.screenshotIcon)\n const { config } = this\n this.initSize = (data) => {\n if (config.fitVideo) {\n config.width = data.vWidth\n config.height = data.vHeight\n }\n }\n this.once(Events.VIDEO_RESIZE, this.initSize)\n }\n\n onPluginsReady () {\n this.show()\n this.onClickBtn = this.onClickBtn.bind(this)\n this.bind(['click', 'touchend'], this.onClickBtn)\n }\n\n saveScreenShot (data, filename) {\n const saveLink = document.createElement('a')\n saveLink.href = data\n saveLink.download = filename\n\n let event\n try {\n if (typeof MouseEvent !== 'undefined') {\n event = new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window\n })\n } else {\n event = document.createEvent('MouseEvents')\n event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)\n }\n } catch (e) {\n console.error('MouseEvent unsupported', e)\n }\n\n if (event) {\n saveLink.dispatchEvent(event)\n }\n }\n\n createCanvas (width, height) {\n const canvas = document.createElement('canvas')\n const canvasCtx = canvas.getContext('2d')\n\n this.canvasCtx = canvasCtx\n this.canvas = canvas\n\n canvas.width = width || this.config.width\n canvas.height = height || this.config.height\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingQuality\n canvasCtx.imageSmoothingEnabled = true\n if (canvasCtx.imageSmoothingEnabled) {\n canvasCtx.imageSmoothingQuality = 'high'\n }\n }\n\n onClickBtn (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'shot')\n const { config } = this\n this.shot(config.width, config.height).then((data) => {\n this.emit(Events.SCREEN_SHOT, data)\n if (config.saveImg) {\n this.saveScreenShot(data, config.name + config.format)\n }\n })\n }\n\n shot (width, height, option = { quality: 0.92, type: 'image/png' }) {\n const { config, player } = this\n const quality = option.quality || config.quality\n const type = option.type || config.type\n return new Promise((resolve, reject) => {\n let canvas = null\n let canvasCtx\n\n if (player.media.canvas) {\n canvas = player.media.canvas\n } else {\n if (!this.canvas) {\n this.createCanvas(width, height)\n } else {\n this.canvas.width = width || config.width\n this.canvas.height = height || config.height\n }\n canvas = this.canvas\n canvasCtx = this.canvasCtx\n\n const mediaRatio = player.media.videoWidth / player.media.videoHeight\n const canvasRatio = canvas.width / canvas.height\n const sx = 0, sy = 0, sw = player.media.videoWidth, sh = player.media.videoHeight\n let dx, dy, dw, dh\n\n if (mediaRatio > canvasRatio) {\n dw = canvas.width\n dh = canvas.width / mediaRatio\n dx = 0\n dy = Math.round((canvas.height - dh) / 2)\n } else if (mediaRatio === canvasRatio) {\n dw = canvas.width\n dh = canvas.height\n dx = 0\n dy = 0\n } else if (mediaRatio < canvasRatio) {\n dw = canvas.height * mediaRatio\n dh = canvas.height\n dx = Math.round((canvas.width - dw) / 2)\n dy = 0\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage\n canvasCtx.drawImage(player.media, sx, sy, sw, sh, dx, dy, dw, dh)\n }\n let src = canvas.toDataURL(type, quality).replace(type, 'image/octet-stream')\n src = src.replace(/^data:image\\/[^;]+/, 'data:application/octet-stream')\n resolve(src)\n })\n }\n\n registerIcons () {\n return {\n screenshotIcon: null\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.onClickBtn)\n this.off(Events.VIDEO_RESIZE, this.initSize)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const className = this.icons.screenshotIcon ? 'xgplayer-icon' : 'xgplayer-icon btn-text'\n const langKey = 'SCREENSHOT'\n return `\n <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 } from '../../plugin'\n\nexport default class OptionList {\n constructor (args) {\n this.config = args.config\n this.parent = args.root\n this.root = Util.createDom('ul', '', {}, `xg-options-list xg-list-slide-scroll ${this.config.className}`)\n args.root.appendChild(this.root)\n const { maxHeight } = this.config\n if (maxHeight) {\n this.setStyle({ maxHeight })\n }\n this.onItemClick = this.onItemClick.bind(this)\n this.renderItemList()\n const eventName = this.config.domEventType === 'touch' ? 'touchend' : 'click'\n this._delegates = Plugin.delegate.call(this, this.root, 'li', eventName, this.onItemClick)\n }\n\n renderItemList (data) {\n const { config, root } = this\n if (data) {\n config.data = data\n } else {\n data = config.data\n }\n\n if (config.style) {\n Object.keys(config.style).map(key => {\n root.style[key] = config[key]\n })\n }\n\n if (data.length > 0) {\n this.attrKeys = Object.keys(data[0])\n }\n\n this.root.innerHTML = ''\n\n data.map((item, index) => {\n const className = item.selected ? 'option-item selected' : 'option-item'\n item['data-index'] = index\n this.root.appendChild(Util.createDom('li', `<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\n show () {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'active')\n }\n\n hide () {\n Util.removeClass(this.root, 'active')\n Util.addClass(this.root, 'hide')\n }\n\n setStyle (style) {\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\n }\n\n destroy () {\n if (this._delegates) {\n this._delegates.map(item => {\n item.destroy && item.destroy()\n })\n this._delegates = null\n }\n this.root.innerHTML = null\n this.parent.removeChild(this.root)\n this.root = null\n }\n}\n","\nimport Plugin, { Events, Util, Sniffer, POSITIONS } from '../../plugin'\nimport OptionList from './optionList'\n// import './optionsIcon.scss'\n\nconst LIST_TYPES = {\n SIDE: 'side',\n MIDDLE: 'middle',\n DEFAULT: 'default'\n}\n\nconst TOGGLE_MODES = {\n CLICK: 'click',\n HOVER: 'hover'\n}\n\nfunction getListClassName (listType, position) {\n if (listType === LIST_TYPES.SIDE) {\n return position === POSITIONS.CONTROLS_LEFT ? 'xg-side-list xg-left-side' : 'xg-side-list xg-right-side'\n } else {\n return ''\n }\n}\n\n/**\n * @typedef {{\n * isShow?: boolean,\n * index?: number,\n * list?: Array<any>,\n * listType?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IOptionsIconConfig\n */\n\nlet IS_MOBILE = Sniffer.device === 'mobile'\n\nexport default class OptionsIcon extends Plugin {\n static get pluginName () {\n return 'optionsIcon'\n }\n\n /**\n * @type { IOptionsIconConfig }\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 100,\n list: [],\n listType: 'default', // 模式 side-右侧边栏 middle-中间显示\n listStyle: {},\n hidePortrait: true,\n isShowIcon: false,\n isItemClickHide: true, // 列表点击之后是否隐藏列表\n toggleMode: TOGGLE_MODES.HOVER, // 激活状态切换模式\n heightLimit: true\n }\n }\n\n constructor (args) {\n super(args)\n this.isIcons = false\n this.isActive = false\n this.curValue = null // 当前值\n this.curIndex = 0\n }\n\n updateLang (value) {\n this.renderItemList(this.config.list, this.curIndex)\n }\n\n afterCreate () {\n const { config } = this\n this.initIcons()\n IS_MOBILE = IS_MOBILE || this.domEventType === 'touch'\n if (IS_MOBILE && Sniffer.device === 'mobile' && config.listType === LIST_TYPES.DEFAULT) {\n config.listType = LIST_TYPES.SIDE\n }\n\n config.hidePortrait && Util.addClass(this.root, 'portrait')\n\n this.on([Events.VIDEO_RESIZE, Events.FULLSCREEN_CHANGE], () => {\n this._resizeList()\n })\n\n this.once(Events.CANPLAY, () => {\n if (config.list && config.list.length > 0) {\n this.renderItemList(config.list)\n this.show()\n }\n })\n // 移动端控制栏和列表互斥\n IS_MOBILE && this.on(Events.PLAYER_FOCUS, () => {\n if (!this.isActive) {\n return\n }\n this.optionsList && this.optionsList.hide()\n this.isActive = false\n })\n\n if (IS_MOBILE) {\n config.toggleMode = TOGGLE_MODES.CLICK\n this.activeEvent = 'touchend'\n } else {\n this.activeEvent = config.toggleMode === TOGGLE_MODES.CLICK ? 'click' : 'mouseenter'\n }\n\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.bind(this.activeEvent, this.switchActiveState)\n } else {\n this.bind(this.activeEvent, this.onEnter)\n this.bind('mouseleave', this.onLeave)\n }\n this.isIcons && this.bind('click', this.onIconClick)\n }\n\n initIcons () {\n const { icons } = this\n const _c = Object.keys(icons)\n let _isIcons = false\n if (_c.length > 0) {\n _c.forEach(key => {\n this.appendChild('.xgplayer-icon', icons[key])\n !_isIcons && (_isIcons = icons[key])\n })\n this.isIcons = _isIcons\n }\n if (_isIcons) {\n return\n }\n this.appendChild('.xgplayer-icon', Util.createDom('span', '', {}, 'icon-text'))\n Util.addClass(this.find('.xgplayer-icon'), 'btn-text')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length < 2) {\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n getTextByLang (item, key, lang) {\n if (item === undefined) {\n return ''\n }\n const { list } = this.config\n !lang && (lang = this.player.lang)\n key = (!key || Util.isUndefined(item[key])) ? 'text' : key\n typeof item === 'number' && (item = list[item])\n try {\n if (typeof item[key] === 'object') {\n return item[key][lang] || item[key].en\n } else {\n return item[key]\n }\n } catch (err) {\n console.warn(err)\n return ''\n }\n }\n\n onEnter = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n this.switchActiveState(e)\n }\n\n switchActiveState = (e) => {\n e.stopPropagation()\n const { toggleMode } = this.config\n if (toggleMode === TOGGLE_MODES.CLICK) {\n this.toggle(!this.isActive)\n } else {\n this.toggle(true)\n }\n }\n\n onLeave = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n if (this.config.listType !== LIST_TYPES.SIDE) {\n this.isActive && this.toggle(false)\n }\n }\n\n onListEnter = (e) => {\n // console.log('onListEnter')\n this.enterType = 2\n }\n\n onListLeave = (e) => {\n // console.log('onListLeave', e.target)\n this.enterType = 0\n this.isActive && this.toggle(false)\n }\n\n // 状态切换\n toggle (isActive) {\n if (isActive === this.isActive || this.config.disable) return\n const { controls } = this.player\n const { listType } = this.config\n if (isActive) {\n listType === LIST_TYPES.SIDE ? controls.blur() : controls.focus()\n this.optionsList && this.optionsList.show()\n } else {\n listType === LIST_TYPES.SIDE ? controls.focus() : controls.focusAwhile()\n this.optionsList && this.optionsList.hide()\n }\n this.isActive = isActive\n }\n\n // 列表点击回调\n onItemClick (e, data) {\n e.stopPropagation()\n const { listType, list } = this.config\n this.curIndex = data.to.index\n this.curItem = list[this.curIndex]\n this.changeCurrentText()\n const { isItemClickHide } = this.config;\n (isItemClickHide || IS_MOBILE || listType === LIST_TYPES.SIDE) && this.toggle(false)\n }\n\n onIconClick (e) {\n //\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n if (!curItem) return\n this.find('.icon-text').innerHTML = this.getTextByLang(curItem, 'iconText')\n }\n\n renderItemList (itemList, curIndex) {\n const { config, optionsList, player } = this\n if (typeof curIndex === 'number') {\n this.curIndex = curIndex\n this.curItem = config.list[curIndex]\n }\n\n if (optionsList) {\n optionsList.renderItemList(itemList)\n this.changeCurrentText()\n return\n }\n\n const options = {\n config: {\n data: itemList || [],\n className: getListClassName(config.listType, config.position), // config.listType === LIST_TYPES.SIDE ? 'xg-right-side' : '',\n onItemClick: (e, data) => {\n this.onItemClick(e, data)\n },\n domEventType: IS_MOBILE ? 'touch' : 'mouse'\n },\n root: config.listType === LIST_TYPES.SIDE ? (player.innerContainer || player.root) : this.root\n }\n\n if (this.config.isShowIcon) {\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n if (_maxH && config.heightLimit) {\n options.config.maxHeight = `${_maxH}px`\n }\n this.optionsList = new OptionList(options)\n this.changeCurrentText()\n this.show()\n }\n this._resizeList()\n }\n\n _resizeList () {\n if (!this.config.heightLimit) {\n return\n }\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = this.config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n this.optionsList && this.optionsList.setStyle({ maxHeight: `${_maxH}px` })\n }\n\n destroy () {\n const { config } = this\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.unbind(this.activeEvent, this.switchActiveState)\n } else {\n this.unbind(this.activeEvent, this.onEnter)\n this.unbind('mouseleave', this.onLeave)\n }\n this.isIcons && this.unbind('click', this.onIconClick)\n if (this.optionsList) {\n this.optionsList.destroy()\n this.optionsList = null\n }\n }\n\n render () {\n if (!this.config.isShowIcon) {\n return\n }\n return `<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 /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length < 2){\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n initDefinition () {\n const { list, defaultDefinition } = this.config\n if (list.length > 0) {\n let to = null\n list.map(item => {\n if (item.definition === defaultDefinition) {\n to = item\n }\n })\n if (!to) {\n to = list[0]\n }\n this.changeDefinition(to)\n }\n }\n\n renderItemList (list = this.config.list || [], to) {\n const targetDef = to && to.definition ? to.definition : this.config.defaultDefinition\n if (to) {\n list.forEach((item) => {\n item.selected = false\n })\n }\n let curIndex = 0\n const items = list.map((item, index) => {\n const showItem = {\n ...item,\n showText: this.getTextByLang(item) || item.definition,\n selected: false\n }\n\n if (item.selected || (item.definition\n // eslint-disable-next-line eqeqeq\n && item.definition == targetDef)\n ) {\n showItem.selected = true\n curIndex = index\n }\n return showItem\n })\n super.renderItemList(items, curIndex)\n }\n\n // 对外暴露 切换清晰度\n changeDefinitionList (list) {\n if (!Array.isArray(list)) {\n return\n }\n this.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n this.renderItemList()\n this.config.list.length < 2 ? this.hide() : this.show()\n }\n\n changeDefinition (to, from) {\n this.player.changeDefinition(to, from)\n }\n\n onItemClick (e, data) {\n const { definitionList } = this.player\n super.onItemClick(...arguments)\n this.emitUserAction(e, 'change_definition', { from: data.from, to: data.to })\n for (let i = 0; i < definitionList.length; i++) {\n if (data.to && definitionList[i].definition === data.to.definition) {\n data.to.url = definitionList[i].url\n }\n\n if (data.from && (definitionList[i].definition === data.from.definition)) {\n data.from.url = definitionList[i].url\n }\n }\n this.player.changeDefinition(data.to, data.from)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array<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 /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length === 0) {\n return\n }\n super.show()\n }\n\n onItemClick (e, _data) {\n super.onItemClick(e, _data)\n const target = e.delegateTarget\n const rate = Number(target.getAttribute('rate'))\n if (!rate || rate === this.curValue) {\n return false\n }\n const props = {\n playbackRate: {\n from: this.player.playbackRate,\n to: rate\n }\n }\n this.emitUserAction(e, 'change_rate', { props })\n this.curValue = rate\n this.player.playbackRate = rate\n }\n\n renderItemList () {\n const playbackRate = this.player.playbackRate || 1\n this.curValue = playbackRate\n let curIndex = -1\n const items = this.config.list.map((item, index) => {\n const itemInfo = {\n rate: item.rate\n }\n if (itemInfo.rate === playbackRate) {\n itemInfo.selected = true\n curIndex = index\n }\n itemInfo.showText = this.getTextByLang(item)\n return itemInfo\n })\n super.renderItemList(items, curIndex)\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n let _text = ''\n // 在列表中没有匹配的选项的时候,默认展示`${playbackRate}x'\n if (!curItem || this.curIndex < 0) {\n _text = `${this.player.playbackRate}x`\n } else {\n _text = this.getTextByLang(curItem, 'iconText')\n }\n this.find('.icon-text').innerHTML = _text\n }\n\n destroy () {\n super.destroy()\n }\n}\n","import 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 /**\n * @type {number}\n */\n this.intervalId = 0\n this.customConfig = null\n this.bind('.highlight', ['click', 'touchend'], (e) => {\n if (this.config.onClick || this.customOnClick) {\n e.preventDefault()\n e.stopPropagation()\n this.customOnClick ? this.customOnClick(e) : this.config.onClick(e)\n }\n })\n\n this.player.showPrompt = (...args) => {\n this.showPrompt(...args)\n }\n\n this.player.hidePrompt = () => {\n this.hide()\n }\n }\n\n setStyle (style) {\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n }\n\n showPrompt (detail, config = {}, onClick = () => {}) {\n if (!detail) {\n return\n }\n this.customOnClick = onClick\n const { interval } = this.config\n if (this.intervalId) {\n clearTimeout(this.intervalId)\n this.intervalId = null\n }\n Util.addClass(this.root, 'show')\n config.mode === 'arrow' && Util.addClass(this.root, 'arrow')\n if (typeof detail === 'string') {\n this.find('.xgplayer-prompt-detail').innerHTML = detail\n } else {\n this.find('.xgplayer-prompt-detail').innerHTML = `${detail.text || ''}` + `${detail.highlight ? `<i class=\"highlight\">${detail.highlight}</i>` : ''}`\n }\n\n config.style && this.setStyle(config.style)\n\n const autoHide = typeof config.autoHide === 'boolean' ? config.autoHide : this.config.autoHide\n if (autoHide) {\n const hideinterval = config.interval || interval\n this.intervalId = setTimeout(() => {\n this.hide()\n }, hideinterval)\n }\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n Util.removeClass(this.root, 'arrow')\n this.root.removeAttribute('style')\n this.customOnClick = null\n }\n\n render () {\n return `<xg-prompt class=\"xgplayer-prompt ${STATE_CLASS.CONTROLS_FOLLOW}\">\n <span class=\"xgplayer-prompt-detail\"></span>\n </xg-prompt>`\n }\n}\n\nexport default Prompt\n","import { Util, Events } from '../../plugin'\n\nconst ISPOT = {\n time: 0, // 进度条在此时间戳打点 单位为s\n text: '', // 打点处的自定义文案\n id: 1, // 标记唯一标识,用于删除的时候索引\n duration: 1, // 进度条标识点的时长 默认1s【可选】单位为s\n color: '#fff', // 进度条标识点的显示颜色【可选】\n style: {}, // 指定样式\n width: 6,\n height: 6\n}\n\nfunction mergeISPOT (iSpot) {\n Object.keys(ISPOT).map(key => {\n if (iSpot[key] === undefined) {\n iSpot[key] = ISPOT[key]\n }\n })\n}\n\nconst APIS = {\n _updateDotDom (iSpot, dotDom) {\n if (!dotDom) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n dotDom.setAttribute('data-text', iSpot.text)\n dotDom.setAttribute('data-time', iSpot.time)\n if (ret.isMini) {\n Util.addClass(dotDom, 'mini')\n } else {\n Util.removeClass(dotDom, 'mini')\n }\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n },\n initDots () {\n this._ispots.map(item => {\n this.createDot(item, false)\n })\n this.ispotsInit = true\n },\n\n /**\n * 创建一个故事点\n * @param { object } iSpot\n * @param { boolean } isNew\n */\n createDot (iSpot, isNew = true) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (isNew) {\n mergeISPOT(iSpot)\n this._ispots.push(iSpot)\n }\n if (!this.ispotsInit && isNew) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n let className = `xgspot_${iSpot.id} xgplayer-spot`\n ret.isMini && (className += ' mini')\n const _t = iSpot.template ? `<div class=\"xgplayer-spot-pop\">${iSpot.template}</div>` : ''\n const dotDom = Util.createDom('xg-spot', _t, {\n 'data-text': iSpot.text,\n 'data-time': iSpot.time,\n 'data-id': iSpot.id\n }, className)\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n progress.outer && progress.outer.appendChild(dotDom)\n this.positionDot(dotDom, iSpot.id)\n },\n\n /**\n * 根据id查找节点\n * @param {string} id\n */\n findDot (id) {\n if (!this.player.plugins.progress) {\n return\n }\n const ret = this._ispots.filter((cur, index) => {\n return cur.id === id\n })\n return ret.length > 0 ? ret[0] : null\n },\n\n /**\n * 更新故事点\n * @param {any} iSpot\n * @param {boolean} needShow\n */\n updateDot (iSpot, needShow = false) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const dot = this.findDot(iSpot.id)\n if (dot) {\n Object.keys(iSpot).map(key => {\n dot[key] = iSpot[key]\n })\n }\n if (!this.ispotsInit) {\n return\n }\n const dotDom = progress.find(`xg-spot[data-id=\"${iSpot.id}\"]`)\n if (!dotDom) {\n return\n }\n this._updateDotDom(iSpot, dotDom)\n if (needShow) {\n this.showDot(iSpot.id)\n }\n },\n\n /**\n * 删除某个故事点\n * @param {string | number } id\n */\n deleteDot (id) {\n const { _ispots } = this\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const del = []\n for (let i = 0; i < _ispots.length; i++) {\n if (_ispots[i].id === id) {\n del.push(i)\n }\n }\n const len = del.length\n for (let i = len - 1; i >= 0; i--) {\n _ispots.splice(del[i], 1)\n if (this.ispotsInit) {\n const dotDom = progress.find(`xg-spot[data-id=\"${id}\"]`)\n if (dotDom) {\n dotDom.parentElement.removeChild(dotDom)\n }\n }\n }\n },\n\n /**\n * 移除所有的故事点\n */\n deleteAllDots () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this.ispotsInit) {\n this._ispots = []\n return\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n for (let i = dotDoms.length - 1; i >= 0; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n this._ispots = []\n },\n /**\n * 批量全部更新当前故事点\n * @param {Array} iSpots\n */\n updateAllDots (iSpots = []) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this.ispotsInit) {\n this._ispots = iSpots\n return\n }\n this._ispots = []\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n const len = dotDoms.length\n if (len > iSpots.length) {\n for (let i = len - 1; i > iSpots.length - 1; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n }\n iSpots.forEach((ispot, index) => {\n if (index < len) {\n dotDoms[index].setAttribute('data-id', `${ispot.id}`)\n this._ispots.push(ispot)\n this.updateDot(ispot)\n } else {\n this.createDot(ispot)\n }\n })\n },\n\n positionDots () {\n const { _ispots, playerSize } = this\n const { sizeInfo } = this.player\n const { progress } = this.player.plugins\n if (!progress || sizeInfo.width === playerSize.width) {\n return\n }\n playerSize.width = sizeInfo.width\n playerSize.left = sizeInfo.left\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n dotDom && this.positionDot(dotDom, item.id)\n })\n },\n\n positionDot (dotDom, id) {\n const _pop = Util.findDom(dotDom, '.xgplayer-spot-pop')\n if (!_pop) {\n return\n }\n const pRect = this.playerSize\n\n const rect1 = dotDom.getBoundingClientRect()\n const rect = _pop.getBoundingClientRect()\n const _left = rect1.left - pRect.left\n const _diff = pRect.width - _left - rect1.width / 2\n if (_left < rect.width / 2 || pRect.width < rect.width) {\n const t = rect.width / 2 - _left\n _pop.style.left = `${t}px`\n } else if (_diff < rect.width / 2) {\n const t = _diff - rect.width / 2 + rect1.width / 2\n _pop.style.left = `${t}px`\n } else {\n _pop.style.left = '50%'\n }\n },\n\n updateDuration () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const { _ispots } = this\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n this._updateDotDom(item, dotDom)\n })\n },\n\n getAllDotsDom () {\n const { progress } = this.player.plugins\n if (!progress) {\n return []\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n return dotDoms\n },\n\n getDotDom (id) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n return progress.find(`xg-spot[data-id=\"${id}\"]`)\n }\n}\n\nexport default function initDotsAPI (plugin) {\n const { config, player } = plugin\n Object.keys(APIS).map(item => {\n plugin[item] = APIS[item].bind(plugin)\n })\n const ispots = player.config.progressDot || config.ispots || []\n plugin._ispots = ispots.map(item => {\n mergeISPOT(item)\n return item\n })\n plugin.ispotsInit = false\n plugin.playerSize = {\n left: player.sizeInfo.left,\n width: player.sizeInfo.width\n }\n plugin.on(Events.DURATION_CHANGE, () => {\n if (!plugin.ispotsInit) {\n plugin.initDots()\n } else {\n // 更新节点\n plugin.updateDuration()\n }\n })\n plugin.on(Events.VIDEO_RESIZE, () => {\n plugin.positionDots()\n })\n}\n","import Plugin, { Util, Sniffer, Events } from '../../plugin'\nimport initDotsAPI from './dotsApi'\nimport './index.scss'\n/**\n * @typedef {{\n * miniWidth?: number, // 故事点显示最小宽度\n * ispots?: Array<{ //故事点列表\n * time?: number, // 进度条在此时间戳打点 单位为s\n * text?: string, // 打点处的自定义文案\n * id?: number | string, // 标记唯一标识,用于删除的时候索引\n * duration:? number, // 进度条标识点的时长 默认1s【可选】单位为s\n * color?: string, // 进度条标识点的显示颜色【可选】\n * style?: { [propName: string]: any }, // 指定样式\n * width?: number,\n * height?: number\n * }>,\n * defaultText?: '', // 故事点hover默认文案\n * isFocusDots?: true, //\n * isShowThumbnail?: true, // 是否显示预览图\n * isShowCoverPreview?: false, // 进度条拖动时是否显示播放区域预览图\n * mode?: 'short' | 'production', // short // production\n * [propName: string]: any\n * }} IProgressPreviewConfig\n */\n\nconst CALLBACK_MAP = {\n dragmove: 'onProgressMove',\n dragstart: 'onProgressDragStart',\n dragend: 'onProgressDragEnd',\n click: 'onProgressClick',\n mouseover: 'onProgressMouseOver',\n mouseenter: 'onProgressMouseOver'\n}\n\n/** */\nexport default class ProgressPreview extends Plugin {\n constructor (args) {\n super(args)\n this._ispots = []\n this.videoPreview = null\n this.videothumbnail = null\n this.thumbnail = null\n this.timeStr = ''\n this._state = {\n now: 0,\n f: false\n }\n }\n\n static get pluginName () {\n return 'progresspreview'\n }\n\n /**\n * @type IProgressPreviewConfig\n */\n static get defaultConfig () {\n return {\n index: 1,\n miniWidth: 6, // 故事点显示最小宽度\n ispots: [], // 故事点列表\n defaultText: '', // 故事点hover默认文案\n isFocusDots: true, //\n isHideThumbnailHover: true, // 是否在hover在预览图的时候隐藏\n isShowThumbnail: true, // 是否显示预览图\n isShowCoverPreview: false, // 进度条拖动时是否显示播放区域预览图\n mode: '', // short // production\n disable: false,\n width: 160, // 显示宽度\n height: 90 // 显示高度\n }\n }\n\n beforeCreate (args) {\n const progress = args.player.plugins.progress\n if (progress) {\n args.root = progress.root\n }\n }\n\n afterCreate () {\n this._curDot = null\n this.handlerSpotClick = this.hook('spotClick', (_event, data) => {\n if (data.seekTime) {\n this.player.seek(data.seekTime)\n }\n })\n this.transformTimeHook = this.hook('transformTime', (time) => {\n this.setTimeContent(Util.format(time))\n })\n initDotsAPI(this)\n\n this.on(Events.DURATION_CHANGE, () => {\n this.show()\n })\n if (this.config.disable) {\n this.disable()\n }\n // 用于进度条预览的扩展\n this.extTextRoot = this.find('.xg-spot-ext-text')\n }\n\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n }\n\n onPluginsReady () {\n const { player } = this\n if (!player.plugins.progress) {\n return\n }\n this.previewLine = this.find('.xg-spot-line')\n this.timePoint = this.find('.xgplayer-progress-point')\n this.timeText = this.find('.xg-spot-time')\n this.tipText = this.find('.spot-inner-text')\n\n this._hasThumnail = false\n\n this.registerThumbnail()\n\n this.bindEvents()\n }\n\n bindEvents () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n Object.keys(CALLBACK_MAP).map(key => {\n this[CALLBACK_MAP[key]] = this[CALLBACK_MAP[key]].bind(this)\n progress.addCallBack(key, this[CALLBACK_MAP[key]])\n })\n\n if (Sniffer.device === 'mobile') return\n\n this.bind('.xg-spot-info', 'mousemove', this.onMousemove)\n\n this.bind('.xg-spot-info', 'mousedown', this.onMousedown)\n\n this.bind('.xg-spot-info', 'mouseup', this.onMouseup)\n\n const fun = this.hook('previewClick', (...args) => {\n // console.log('args', args)\n })\n\n this.handlerPreviewClick = (e) => {\n e.stopPropagation()\n fun(parseInt(this._state.now * 1000, 10) / 1000, e)\n\n if (progress) {\n // Make sure the mouse event is unlocked, otherwise the progress bar will still slide\n progress.onMouseUp(e)\n }\n }\n\n this.bind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n onMousemove = (e) => {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xg-spot-content') && this.config.isHideThumbnailHover) {\n this.player.plugins.progress.onMouseLeave(e)\n return\n }\n if (this._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onMousedown = (e) => {\n if (this.config.disable) {\n return\n }\n if (this._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onMouseup = (e) => {\n if (!this.isDrag) {\n return\n }\n const { progress } = this.player.plugins\n if (progress && progress.pos) {\n progress.onMouseUp(e)\n !progress.pos.isEnter && progress.onMouseLeave(e)\n }\n }\n\n onDotMouseLeave = (e) => {\n if (this.config.disable) {\n return\n }\n this._curDot.removeEventListener('mouseleave', this.onDotMouseLeave)\n this.blurDot(e.target)\n this._curDot = null\n const { progress } = this.player.plugins\n progress && progress.enableBlur()\n this.show()\n }\n\n onProgressMouseOver = (data, e) => {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xgplayer-spot') && !this._curDot) {\n this._curDot = e.target\n this.focusDot(e.target)\n if (this._curDot.children.length > 0) {\n this.hide()\n }\n const { progress } = this.player.plugins\n progress && progress.disableBlur()\n this._curDot.addEventListener('mouseleave', this.onDotMouseLeave)\n }\n }\n\n onProgressMove (data, e) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.updatePosition(data.offset, data.width, data.currentTime, data.e)\n }\n\n onProgressDragStart (data) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.isDrag = true\n this.videoPreview && Util.addClass(this.videoPreview, 'show')\n }\n\n onProgressDragEnd (data) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.isDrag = false\n this.videoPreview && Util.removeClass(this.videoPreview, 'show')\n }\n\n onProgressClick (data, e) {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xgplayer-spot')) {\n e.stopPropagation()\n e.preventDefault();\n ['time', 'id', 'text'].map(key => {\n data[key] = e.target.getAttribute(`data-${key}`)\n })\n data.time && (data.time = Number(data.time))\n this.handlerSpotClick(e, data)\n }\n }\n\n updateLinePos (offset, cwidth) {\n const { root, previewLine, player, config } = this\n const { mode } = player.controls\n const isflex = mode === 'flex'\n let lwidth = root.getBoundingClientRect().width\n // 如果当前预览图宽度获取不到,无法计算位移,不做渲染\n if (!lwidth && this._hasThumnail) {\n return\n }\n lwidth = this._hasThumnail && lwidth < config.width ? config.width : lwidth\n let x = offset - lwidth / 2\n let _t\n if (x < 0 && !isflex) {\n x = 0\n _t = offset - lwidth / 2\n } else if (x > cwidth - lwidth && !isflex) {\n _t = x - (cwidth - lwidth)\n x = cwidth - lwidth\n } else {\n _t = 0\n }\n _t !== undefined && (previewLine.style.transform = `translateX(${_t.toFixed(2)}px)`)\n root.style.transform = `translateX(${x.toFixed(2)}px) translateZ(0)`\n }\n\n updateTimeText (timeStr) {\n const { timeText, timePoint } = this\n timeText.innerHTML = timeStr\n !this.thumbnail && (timePoint.innerHTML = timeStr)\n }\n\n updatePosition (offset, cwidth, time, e) {\n const { root, config, _state } = this\n if (!root) {\n return\n }\n\n // let now = offset / cwidth * player.duration\n // now = now < 0 ? 0 : (now > player.duration ? player.duration : now)\n _state.now = time\n this.transformTimeHook(time)\n const timeStr = this.timeStr\n if (e && e.target && Util.hasClass(e.target, 'xgplayer-spot')) {\n this.showTips(e.target.getAttribute('data-text'), false, timeStr)\n this.focusDot(e.target)\n _state.f = true\n config.isFocusDots && _state.f && (_state.now = parseInt(e.target.getAttribute('data-time'), 10))\n } else if (config.defaultText) {\n _state.f = false\n this.showTips(config.defaultText, true, timeStr)\n } else {\n _state.f = false\n this.hideTips('')\n // this.blurDot()\n }\n this.updateTimeText(timeStr)\n this.updateThumbnails(_state.now)\n this.updateLinePos(offset, cwidth)\n }\n\n /**\n * @description 设置自定义时间显示字符串\n * @param {string} str\n */\n setTimeContent (str) {\n this.timeStr = str\n }\n\n updateThumbnails (time) {\n const { player, videoPreview, config } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, config.width, config.height)\n const rect = videoPreview && videoPreview.getBoundingClientRect()\n this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n registerThumbnail (thumbnailConfig = {}) {\n if (Sniffer.device === 'mobile') {\n return\n }\n const { player, config } = this\n const thumbnail = player.getPlugin('thumbnail')\n if (thumbnail) {\n thumbnail.setConfig(thumbnailConfig)\n }\n if (!thumbnail || !thumbnail.usable || !config.isShowThumbnail) {\n Util.addClass(this.root, 'short-line no-thumbnail')\n return\n } else {\n Util.removeClass(this.root, 'short-line no-thumbnail')\n }\n if (config.mode === 'short') {\n Util.addClass(this.root, 'short-line')\n }\n this._hasThumnail = true\n const tRoot = this.find('.xg-spot-thumbnail')\n this.thumbnail = thumbnail.createThumbnail(tRoot, 'progress-thumbnail')\n if (config.isShowCoverPreview) {\n this.videoPreview = Util.createDom('xg-video-preview', '', {}, 'xgvideo-preview')\n player.root.appendChild(this.videoPreview)\n this.videothumbnail = thumbnail.createThumbnail(this.videoPreview, 'xgvideo-thumbnail')\n }\n this.updateThumbnails(0)\n }\n\n calcuPosition (time, duration) {\n const { progress } = this.player.plugins\n const { player } = this\n const totalWidth = progress.root.getBoundingClientRect().width\n const widthPerSeconds = player.duration / totalWidth * 6\n const ret = {}\n if (time + duration > player.duration) {\n duration = player.duration - time\n }\n ret.left = time / player.duration * 100\n ret.width = duration / player.duration\n ret.isMini = widthPerSeconds > duration\n return {\n left: time / player.duration * 100,\n width: duration / player.duration * 100,\n isMini: duration < widthPerSeconds\n }\n }\n\n showDot (id) {\n const dot = this.findDot(id)\n if (dot) {\n const rect = this.root.getBoundingClientRect()\n const { width } = rect\n const offset = dot.time / this.player.duration * width\n this.updatePosition(offset, width, dot.time)\n }\n }\n\n focusDot (target, id) {\n if (!target) {\n return\n }\n if (!id) {\n id = target.getAttribute('data-id')\n }\n Util.addClass(target, 'active')\n this._activeDotId = id\n }\n\n blurDot (target) {\n if (!target) {\n const id = this._activeDotId\n target = this.getDotDom(id)\n }\n if (!target) {\n return\n }\n Util.removeClass(target, 'active')\n this._activeDotId = null\n }\n\n showTips (text, isDefault, timeStr = '') {\n Util.addClass(this.root, 'no-timepoint')\n if (!text) {\n return\n }\n Util.addClass(this.find('.xg-spot-content'), 'show-text')\n if (isDefault && this.config.mode === 'production') {\n Util.addClass(this.root, 'product')\n this.tipText.textContent = text\n } else {\n Util.removeClass(this.root, 'product')\n this.tipText.textContent = this._hasThumnail ? text : `${timeStr} ${text}`\n }\n }\n\n hideTips () {\n Util.removeClass(this.root, 'no-timepoint')\n this.tipText.textContent = ''\n Util.removeClass(this.find('.xg-spot-content'), 'show-text')\n Util.removeClass(this.root, 'product')\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n Util.removeClass(this.root, 'hide')\n }\n\n enable () {\n const { config, playerConfig } = this\n this.config.disable = false\n this.show()\n if (!this.thumbnail && config.isShowThumbnail) {\n this.registerThumbnail(playerConfig.thumbnail || {})\n }\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n const { progress } = this.player.plugins\n progress && Object.keys(CALLBACK_MAP).map(key => {\n progress.removeCallBack(key, this[CALLBACK_MAP[key]])\n })\n this.videothumbnail = null\n this.thumbnail = null\n this.videoPreview && this.player.root.removeChild(this.videoPreview)\n this.unbind('.xg-spot-info', 'mousemove', this.onMousemove)\n this.unbind('.xg-spot-info', 'mousedown', this.onMousedown)\n this.unbind('.xg-spot-info', 'mouseup', this.onMouseup)\n this.unbind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n render () {\n if (Sniffer.device === 'mobile' || this.playerConfig.isMobileSimulateMode === 'mobile') {\n return ''\n }\n\n return `<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, { Events, Util } from '../../plugin'\n\nfunction getBgColor (color) {\n return color ? `background:${color};` : ''\n}\n\nclass MiniProgress extends Plugin {\n static get pluginName () {\n return 'MiniProgress'\n }\n\n static get defaultConfig () {\n return {\n mode: 'auto',\n height: 2\n }\n }\n\n get offsetDuration () {\n return this.playerConfig.customDuration || this.player.offsetDuration || this.player.duration\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : currentTime\n }\n\n afterCreate () {\n if (!this.root) {\n return\n }\n this.on(Events.TIME_UPDATE, this.onTimeupdate)\n this.on(Events.EMPTIED, () => {\n this.reset()\n })\n }\n\n onTimeupdate = () => {\n const { ended } = this.player\n const { offsetDuration } = this\n let time = this.currentTime\n time = Util.adjustTimeByDuration(time, offsetDuration, ended)\n this.update({ played: time }, offsetDuration)\n }\n\n reset () {\n this.update({ played: 0, cached: 0 }, 0)\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!duration || !this.root) {\n return\n }\n if (data.cached) {\n this.find('xg-mini-progress-cache').style.width = `${data.cached / duration * 100}%`\n }\n if (data.played) {\n this.find('xg-mini-progress-played').style.width = `${data.played / duration * 100}%`\n }\n }\n\n render () {\n const { commonStyle, miniprogress } = this.playerConfig\n if (!miniprogress) {\n return\n }\n const { mode, height } = this.config\n const _style = {\n cached: getBgColor(commonStyle.cachedColor),\n played: getBgColor(commonStyle.playedColor),\n progress: getBgColor(commonStyle.progressColor),\n height: height > 0 && height !== 2 ? `height: ${height}px;` : ''\n }\n const stateClass = mode === 'show' ? 'xg-mini-progress-show' : ''\n return `<xg-mini-progress class=\"xg-mini-progress ${stateClass}\" style=\"${_style.progress} ${_style.height}\">\n <xg-mini-progress-cache class=\"xg-mini-progress-cache\" style=\"${_style.cached}\"></xg-mini-progress-cache>\n <xg-mini-progress-played class=\"xg-mini-progress-played\" style=\"${_style.played}\"></xg-mini-progress-played>\n </xg-mini-progress>`\n }\n}\n\nexport default MiniProgress\n","import Plugin, { Events, Util, Sniffer } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nimport './index.scss'\n\nconst MODES = {\n REAL_TIME: 'realtime',\n FIRST_FRAME: 'firstframe',\n FRAME_RATE: 'framerate',\n POSTER: 'poster'\n}\n\nfunction nowTime () {\n try {\n return parseInt(window.performance.now(), 10)\n } catch (e) {\n return new Date().getTime()\n }\n}\n\n/**\n * Check whether the current environment supports canvas\n * @returns { boolean }\n */\nfunction checkIsSupportCanvas () {\n try {\n const ctx = document.createElement('canvas').getContext\n if (ctx) {\n return true\n }\n return false\n } catch (e) {\n return false\n }\n}\n\n/**\n * @typedef { {\n * disable?: boolean,\n * mode?: \"realtime\" | \"firstframe\" | \"framerate\",\n * frameRate?: number\n * filter?: string,\n * addMask?: boolean,\n * maskBg?: string,\n * multiple? : number,\n * [propName: string]: any\n * } } IDynamicBgConfig\n */\n\nlet isSupportCanvas = null\nclass DynamicBg extends Plugin {\n static get pluginName () {\n return 'dynamicBg'\n }\n\n /**\n * @type IDynamicBgConfig\n */\n static get defaultConfig () {\n return {\n isInnerRender: false,\n disable: true,\n index: -1,\n /**\n * Rendering method\n * realtime - Realtime rendering\n * firstframe - Render only the first frame\n * framerate - Render by frame\n * poster - Render by poster only\n */\n mode: 'framerate',\n frameRate: 10, // Frame rate when mode=framerate\n filter: 'blur(50px)', // Filter settings\n startFrameCount: 2, // 起始连续渲染次数\n startInterval: 0, // 初始渲染间隔\n addMask: true, // Whether need a mask\n multiple: 1.2, // 画面放大倍数\n maskBg: 'rgba(0,0,0,0.7)' // Mask background color\n }\n }\n\n /**\n * @type {boolean}\n * @description Does the current environment support Canvas\n */\n static get isSupport () {\n if (typeof isSupportCanvas === 'boolean') {\n return isSupportCanvas\n }\n isSupportCanvas = checkIsSupportCanvas()\n return isSupportCanvas\n }\n\n static supportCanvasFilter () {\n return !(Sniffer.browser === 'safari' || Sniffer.browser === 'firefox')\n }\n\n afterCreate () {\n if (this.playerConfig.dynamicBg === true) {\n this.config.disable = false\n }\n if (!DynamicBg.isSupport) {\n this.config.disable = true\n }\n const { disable, mode, frameRate } = this.config\n if (disable) {\n return\n }\n /**\n * @private\n */\n this._pos = {\n width: 0,\n height: 0,\n rwidth: 0,\n rheight: 0,\n x: 0,\n y: 0,\n pi: 0\n }\n /**\n * @readonly\n */\n this.isStart = false\n\n this._isLoaded = false\n /**\n * @readonly\n */\n this.videoPI = 0\n /**\n * @readonly\n */\n this.preTime = 0\n /**\n * @readonly\n */\n this.interval = parseInt(1000 / frameRate, 10)\n\n /**\n * @readonly\n */\n this.canvas = null\n /**\n * @readonly\n */\n this.canvasCtx = null\n\n this._frameCount = 0\n\n this._loopType = this.config.mode !== MODES.REAL_TIME && this.interval >= 1000 ? 'timer' : 'animation'\n\n this.once(Events.COMPLETE, () => {\n if (!this.player) {\n return\n }\n this.init()\n this.renderByPoster()\n if (!this.player.paused) {\n this.start()\n }\n })\n\n if (mode === MODES.POSTER) {\n return\n }\n\n if (mode !== MODES.FIRST_FRAME) {\n this.on(Events.EMPTIED, () => {\n this.stop()\n })\n this.on(Events.PLAY, () => {\n const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\n })\n this.on(Events.PAUSE, () => {\n this.stop()\n })\n }\n\n this.on(Events.LOADED_DATA, this.onLoadedData)\n this.on(Events.LOAD_START, () => {\n this._isLoaded = false\n this.stop()\n })\n document.addEventListener('visibilitychange', this.onVisibilitychange)\n }\n\n setConfig (config) {\n Object.keys(config).forEach(key => {\n if (key === 'root' && config[key] !== this.config[key]) {\n this.reRender(config[key])\n } else if (key === 'frameRate') {\n this.interval = parseInt(1000 / config[key], 10)\n } else if (key === 'disable' && config[key]) {\n this.stop()\n }\n this.config[key] = config[key]\n })\n }\n\n onLoadedData = (e) => {\n if (!this.player) { return }\n this._frameCount = this.config.startFrameCount\n this.stop()\n this.renderOnTimeupdate(e)\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n this.on(Events.TIME_UPDATE, this.renderOnTimeupdate)\n }\n\n onVisibilitychange = (e) => {\n if (document.visibilityState === 'visible') {\n this._checkIfCanStart() && this.start()\n } else if (document.visibilityState === 'hidden') {\n this.stop()\n }\n }\n\n /**\n * @private\n * 初始化 canvas对象并使用海报图先渲染首帧w11\n */\n init (_root) {\n const { player, config } = this\n this.canvasFilter = DynamicBg.supportCanvasFilter()\n try {\n // 保证节点插入到video之前\n let parent = _root || config.root\n if (!parent) {\n parent = !config.isInnerRender ? player.root : (player.innerContainer || player.root)\n }\n parent.insertAdjacentHTML('afterbegin',\n `<div class=\"xgplayer-dynamic-bg\" data-index=\"${config.index}\"><canvas>\n </canvas><xgmask></xgmask></div>`)\n this.root = parent.children[0]\n this.canvas = this.find('canvas')\n // safari中canvas filter不生效, 使用css滤镜\n if (!this.canvasFilter) {\n this.canvas.style.filter = config.filter\n this.canvas.style.webkitFilter = config.filter\n }\n this.mask = this.find('xgmask')\n\n config.addMask && (this.mask.style.background = config.maskBg)\n this.canvasCtx = this.canvas.getContext('2d')\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n reRender (root) {\n const { disable } = this.config\n if (!disable && !this.root) {\n return\n }\n this.stop()\n const _p = this.root ? this.root.parentElement : null\n if (_p !== root) {\n _p.removeChild(this.root)\n }\n if (!root) {\n this.root = null\n return\n }\n this.init(root)\n this.renderOnce()\n const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\n }\n\n /**\n * Check whether the current video object supports screenshots\n * @param { Object } video\n * @returns { DomElement | null }\n */\n checkVideoIsSupport (video) {\n if (!video) {\n return null\n }\n const _tVideo = video && video instanceof window.HTMLVideoElement ? video : (video.canvas ? video.canvas : (video.flyVideo ? video.flyVideo : null))\n if (_tVideo && !(Sniffer.browser === 'safari' && Util.isMSE(_tVideo))) {\n return _tVideo\n }\n\n const _tagName = _tVideo ? _tVideo.tagName.toLowerCase() : ''\n if (_tagName === 'canvas' || _tagName === 'img') {\n return _tVideo\n }\n\n return null\n }\n\n renderByPoster () {\n const { poster } = this.playerConfig\n if (poster) {\n const url = Util.typeOf(poster) === 'String' ? poster : (Util.typeOf(poster.poster) === 'String' ? poster.poster : null)\n this.updateImg(url)\n }\n }\n\n renderOnTimeupdate = (e) => {\n if (this._frameCount > 0) {\n this.renderOnce()\n this._frameCount--\n } else {\n this._isLoaded = true\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n const { startInterval } = this.config\n !this.player.paused && this._checkIfCanStart() && this.start(0, startInterval)\n }\n }\n\n _checkIfCanStart () {\n const { mode } = this.config\n return this._isLoaded && !this.player.paused && mode !== MODES.FIRST_FRAME && mode !== MODES.POSTER\n }\n\n /**\n * just render once\n * @returns\n */\n renderOnce () {\n const video = this.player.video\n if (!video.videoWidth || !video.videoHeight) {\n return\n }\n this.videoPI = parseInt(video.videoWidth / video.videoHeight * 100, 10)\n const _sVideo = this.checkVideoIsSupport(video)\n // console.log('>>>renderOnce, update', _sVideo, this.videoPI)\n _sVideo && this.update(_sVideo, this.videoPI)\n }\n\n start = (time, interval) => {\n const video = this.player.video\n const _now = nowTime()\n const _sVideo = this.checkVideoIsSupport(video)\n if (!_sVideo || !this.canvasCtx) {\n return\n }\n\n if (!interval) {\n interval = this.interval\n }\n this.stop()\n if (video.videoWidth && video.videoHeight) {\n this.videoPI = video.videoHeight > 0 ? parseInt(video.videoWidth / video.videoHeight * 100, 10) : 0\n if (this.config.mode === MODES.REAL_TIME) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n } else if (_now - this.preTime >= interval) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n }\n }\n this.frameId = this._loopType === 'timer' ? Util.setTimeout(this, this.start, interval) : Util.requestAnimationFrame(this.start)\n }\n\n stop = () => {\n if (this.frameId) {\n this._loopType === 'timer' ? Util.clearTimeout(this, this.frameId) : Util.cancelAnimationFrame(this.frameId)\n // window.clearTimeout(this.frameId)\n this.frameId = null\n }\n }\n\n updateImg (url) {\n // TODO: 需要改造,使用domcss样式渲染,不再使用canvas渲染\n if (!url) {\n return\n }\n // Render using the image\n const { width, height } = this.canvas.getBoundingClientRect()\n let image = new window.Image()\n image.onload = () => {\n if (!this.canvas || this.frameId || this.isStart) {\n return\n }\n this.canvas.height = height\n this.canvas.width = width\n const pi = parseInt(width / height * 100, 10)\n // console.log('>>>updateImg update', image, pi)\n this.update(image, pi)\n image = null\n }\n image.src = url\n }\n\n update (video, sourcePI) {\n if (!this.canvas || !this.canvasCtx || !sourcePI) {\n return\n }\n try {\n const { _pos, config } = this\n const { width, height } = this.canvas.getBoundingClientRect()\n if (width !== _pos.width || height !== _pos.height || _pos.pi !== sourcePI) {\n const pi = parseInt(width / height * 100, 10)\n _pos.pi = sourcePI\n _pos.width !== width && (_pos.width = this.canvas.width = width)\n _pos.height !== height && (_pos.height = this.canvas.height = height)\n let rheight = height\n let rwidth = width\n if (pi < sourcePI) {\n rwidth = parseInt(height * sourcePI / 100, 10)\n } else if (pi > sourcePI) {\n rheight = parseInt(width * 100 / sourcePI, 10)\n }\n _pos.rwidth = rwidth * config.multiple\n _pos.rheight = rheight * config.multiple\n _pos.x = (width - _pos.rwidth) / 2\n _pos.y = (height - _pos.rheight) / 2\n }\n // console.log(`x:${_pos.x} y:${_pos.y} rwidth:${_pos.rwidth} rheight:${_pos.rheight}`)\n this.canvasFilter && (this.canvasCtx.filter = config.filter)\n this.canvasCtx.drawImage(video, _pos.x, _pos.y, _pos.rwidth, _pos.rheight)\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n destroy () {\n this.stop()\n document.removeEventListener('visibilitychange', this.onVisibilitychange)\n this.canvasCtx = null\n this.canvas = null\n }\n\n render () {\n return ''\n }\n}\n\nexport default DynamicBg\n","import { BasePlugin, Events } from '../../plugin'\nconst INFO = 'info'\n\nconst { STATS_EVENTS } = Events\nexport default class Stats extends BasePlugin {\n static get pluginName () {\n return 'stats'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n _recordUserActions = (actionData) => {\n const time = this._getTime()\n const payload = Object.assign({}, actionData, { msg: actionData.msg || actionData.action })\n this._stats[INFO].push({\n type: 'userAction',\n ...time,\n payload\n })\n }\n\n _getTime () {\n return {\n timestamp: Date.now(),\n timeFormat: new Date().toISOString()\n }\n }\n\n afterCreate () {\n this.reset()\n this.on(Events.USER_ACTION, this._recordUserActions)\n this.on(STATS_EVENTS.STATS_INFO, this._recordInfo)\n this.on(STATS_EVENTS.STATS_DOWNLOAD, this._downloadStats)\n this.on(STATS_EVENTS.STATS_RESET, this._onReset)\n }\n\n destroy () {\n this.offAll()\n }\n\n _onReset = () => {\n this.reset()\n }\n\n _recordInfo = (data) => {\n this.info(data)\n }\n\n _downloadStats = () => {\n const stats = this.getStats()\n const blob = new Blob([JSON.stringify(stats)], { type: 'application/json' })\n const downloadUrl = window.URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.style.display = 'none'\n link.href = downloadUrl\n link.download = 'player.txt'\n link.disabled = false\n link.click()\n }\n\n downloadStats () {\n this._downloadStats()\n }\n\n /**\n * @params type\n */\n info (data) {\n if (data.profile) {\n this._infoProfile(data)\n } else {\n this._info(data)\n }\n }\n\n _info (data) {\n const time = this._getTime()\n this._stats[INFO].push({\n ...time,\n payload: data\n })\n }\n\n _infoProfile (data) {\n if (data && data.startMs) {\n const endMs = Date.now()\n const dur = endMs - data.startMs\n const profile = {\n cat: 'function',\n dur: dur,\n name: data.name || data.msg,\n ph: 'X',\n pid: 0,\n tid: 0,\n ts: data.startMs,\n profile: true,\n ...data\n }\n this._info(profile)\n } else {\n console.warn('infoProfile need object data, include startMs')\n }\n }\n\n reset () {\n this._stats = {\n [INFO]: [],\n media: {}\n }\n }\n\n getStats () {\n const { player } = this\n const mediaElem = player.media\n const buffered = []\n for (let i = 0; i < mediaElem.buffered.length; i++) {\n buffered.push({\n start: mediaElem.buffered.start(i),\n end: mediaElem.buffered.end(i)\n })\n }\n const mediaInfo = {\n currentTime: mediaElem.currentTime,\n readyState: mediaElem.readyState,\n buffered,\n paused: mediaElem.paused,\n ended: mediaElem.ended\n }\n\n this._stats.media = mediaInfo\n return {\n raw: this._stats,\n timestat: this._getTimeStats(),\n profile: this._getProfile()\n }\n }\n\n _getTimeStats () {\n const allStat = this._stats[INFO]\n const msgs = allStat.map(stat => {\n const data = stat.payload.data\n let msg = ''\n try {\n if (data instanceof Error) {\n msg = data.msg\n } else if (data !== undefined) {\n msg = JSON.stringify(data)\n }\n } catch (error) {\n console.log('err', error)\n }\n\n return `[${stat.timeFormat}] : ${stat.payload.msg} ${msg} `\n })\n return msgs\n }\n\n _getProfile () {\n const profile = {\n traceEvents: []\n }\n const allStat = this._stats[INFO]\n allStat.forEach(stat => {\n if (stat.payload.profile) {\n profile.traceEvents.push(stat.payload)\n }\n })\n return profile\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class GapJump extends BasePlugin {\n static get pluginName () {\n return 'gapJump'\n }\n\n static get defaultConfig () {\n return {\n useGapJump: false,\n smallGapLimit: 0.5,\n gapDetectionThreshold: 0.3\n }\n }\n\n afterCreate () {\n const { useGapJump } = this.config\n if (useGapJump === false) {\n return\n }\n this.hasPlayed = false\n this.seekingEventReceived = false\n this.isSafari = /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform)\n this.on(Events.WAITING, this.onGapJump)\n\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n\n this.on(Events.SEEKING, () => {\n this.seekingEventReceived = true\n })\n }\n\n onGapJump = () => {\n const { player, config } = this\n if (player.media.readyState === HTMLMediaElement.HAVE_NOTHING) {\n return\n }\n if (player.media.seeking) {\n if (!this.seekingEventReceived) { return }\n } else {\n this.seekingEventReceived = false\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n\n const buffered = player.media.buffered\n const smallGapLimit = config.smallGapLimit || 0.5\n const gapDetectionThreshold = config.gapDetectionThreshold || 0.3\n const currentTime = player.media.currentTime\n const idx = this._getIndex(buffered, currentTime, gapDetectionThreshold)\n if (idx === null || idx === 0) {\n return\n }\n console.log('GapJump bufferRange ', buffered.start(idx), buffered.end(idx))\n const jumpTo = buffered.start(idx) + 0.1\n const seekEnd = player.media.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n const jumpSize = jumpTo - currentTime\n const isGapSmall = jumpSize <= smallGapLimit\n if (jumpSize < GapJump.BROWSER_GAP_TOLERANCE) {\n return\n }\n\n if (isGapSmall) {\n if (config.useGapJump !== false) {\n player.media.currentTime = this.isSafari ? jumpTo + 0.1 : jumpTo\n }\n this.player && this.player.emit('detectGap')\n console.log('gapJump gapIndex', idx, ' isGapSamll:', isGapSmall, ' currentTime:', player.media.currentTime, ' jumpSize:', (currentTime - player.media.currentTime))\n // 目前转码视频首个分片cts存在,在Safari下为0.08,先忽略\n if (jumpTo !== 0.08) {\n player && player.emit('log', {\n type: 'oneevent', // 事件类型\n end_type: 'gap',\n vid: player.config.vid,\n ext: {\n video_postion: Math.floor(jumpTo * 1000) // ms\n }\n })\n }\n }\n }\n\n _getIndex (buffered, time, threshold) {\n if (!buffered || !buffered.length) {\n return null\n }\n if (buffered.length === 1 && buffered.end(0) - buffered.start(0) < 1e-6) {\n return null\n }\n const bufferedInfo = this._getBuffered(buffered)\n let idx = null\n for (let i = 0; i < bufferedInfo.length; i++) {\n const item = bufferedInfo[i]\n if (item.start > time && (i === 0 || bufferedInfo[i - 1].end - time <= threshold)) {\n idx = i\n break\n }\n }\n return idx\n }\n\n _getBuffered (b) {\n if (!b) {\n return []\n }\n const ret = []\n for (let i = 0; i < b.length; i++) {\n ret.push({\n start: b.start(i),\n end: b.end(i)\n })\n }\n return ret\n }\n}\nGapJump.BROWSER_GAP_TOLERANCE = 0.001\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class WaitingTimeoutJump extends BasePlugin {\n static get pluginName () {\n return 'waitingTimeoutJump'\n }\n\n static get defaultConfig () {\n return {\n useWaitingTimeoutJump: false,\n waitingTime: 15, // wait超过此时间没恢复,则向前跳jumpSize,单位s\n jumpSize: 2, // 单位s,\n jumpCntMax: 4 // 一次播放最大向前跳几次\n }\n }\n\n afterCreate () {\n const { useWaitingTimeoutJump, jumpSize } = this.config\n if (useWaitingTimeoutJump === false) {\n return\n }\n this.hasPlayed = false\n this.jumpCnt = 0\n /**\n * @type {null | number}\n */\n this.timer = null\n this.jumpSize = jumpSize\n this.on(Events.WAITING, this.onWaiting)\n this.on([Events.PLAYING, Events.CANPLAY], () => {\n clearTimeout(this.timer)\n this.timer = null\n this.jumpSize = this.config.jumpSize\n })\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n }\n\n onWaiting = () => {\n const { config } = this\n if (this.jumpCnt > config.jumpCntMax || this.timer || config.useWaitingTimeoutJump === false) {\n return\n }\n this.timer = setTimeout(this.onJump, config.waitingTime * 1000)\n }\n\n onJump = () => {\n const { player, config } = this\n clearTimeout(this.timer)\n this.timer = null\n if (this.jumpCnt > config.jumpCntMax || config.useWaitingTimeoutJump === false) {\n return\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n this.jumpSize = config.jumpSize * (this.jumpCnt + 1)\n if (this.jumpCnt === config.jumpSize && this.jumpSize < 6) {\n this.jumpSize = 6\n }\n const jumpTo = player.currentTime + this.jumpSize\n const seekEnd = player.media.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n this.jumpCnt++\n player.currentTime = jumpTo\n }\n}\n","import BasePlugin, { Events, Util } from '../../plugin'\nconst DEFAULT_SPEED_TYPE = 'cdn'\nconst SPEED_TYPE = ['cdn'] // 默认的速度的种类,可以通过addSpeedTypeList再继续增加\nexport default class TestSpeed extends BasePlugin {\n static get pluginName () {\n return 'testspeed'\n }\n\n static get defaultConfig () {\n return {\n openSpeed: false, // 测速开关,默认关\n testCnt: 3, // 一次播放的测速次数,默认1次\n loadSize: 200 * 1024, // 一次播放的测速请求的数据量大小,单位字节,默认200k\n testTimeStep: 3000, // 每次测速的时间间隔,第一次在开播后的testTimeStep 秒,默认是3s\n url: '', // 每次测速的url,一般传播放的备用地址测速\n saveSpeedMax: 5, // 保留最近多少次测速记录,最后的速度求这个记录列表平均值,默认5条\n addSpeedTypeList:[] // 需要增加的speed的类型\n }\n }\n\n getSpeed = (type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return 0\n if (this.speedListCache[type].length <= 0) return 0\n let total = 0\n this.speedListCache[type].map(item => {\n total += item\n })\n return Math.floor(total / this.speedListCache[type].length)\n }\n\n afterCreate () {\n const { openSpeed, addSpeedTypeList } = this.config\n if (addSpeedTypeList?.length > 0) {\n SPEED_TYPE.push(...addSpeedTypeList)\n }\n this.initSpeedList()\n this.on('real_time_speed', this._onRealSpeedChange)\n /**\n * @type {null || number }\n */\n this.timer = null\n this.cnt = 0\n this.xhr = null\n if (!openSpeed) {\n return\n }\n this.on([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n }\n startTimer = () => {\n if (Util.isMSE(this.player.video)) {\n return\n }\n this.initSpeedList()\n this.cnt = 0\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n\n initSpeedList = () => {\n this.speedListCache = {}\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache[type] = []\n })\n }\n\n _onRealSpeedChange = (data) => {\n data.speed && this.appendList(data.speed, data.type || DEFAULT_SPEED_TYPE)\n }\n\n testSpeed = () => {\n clearTimeout(this.timer)\n this.timer = null\n if (!this.player || !this.config.openSpeed) return\n const { url, loadSize, testCnt, testTimeStep } = this.config\n const testSpeedUrl = url + (url.indexOf('?') < 0 ? '?testst=' : '&testst=') + Date.now()\n if (this.cnt >= testCnt) {\n return\n }\n this.cnt++\n try {\n const start = new Date().getTime()\n let end = null\n const xhr = new XMLHttpRequest()\n this.xhr = xhr\n xhr.open('GET', testSpeedUrl)\n const headers = {}\n const random = Math.floor(Math.random() * 10)\n headers.Range = 'bytes=' + random + '-' + (loadSize + random)\n if (headers) {\n Object.keys(headers).forEach(k => {\n xhr.setRequestHeader(k, headers[k])\n })\n }\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4) {\n this.xhr = null\n end = new Date().getTime()\n const size = xhr.getResponseHeader('Content-Length') / 1024 * 8\n const speed = Math.round(size * 1000 / (end - start))\n this.appendList(speed)\n this.timer = setTimeout(this.testSpeed, testTimeStep)\n }\n }\n xhr.send()\n } catch (e) {\n console.error(e)\n }\n }\n\n appendList = (speed, type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return\n const { saveSpeedMax } = this.config\n if (this.speedListCache[type].length >= saveSpeedMax) {\n this.speedListCache[type].shift()\n }\n this.speedListCache[type].push(speed)\n const { player } = this\n if (player) {\n type === DEFAULT_SPEED_TYPE ? (player.realTimeSpeed = speed) : (player[this.getSpeedName('realTime', type)] = speed)\n }\n this.updateSpeed(type)\n }\n\n getSpeedName (namePrefix, type){\n return namePrefix + 'Speed' + type.toUpperCase()\n }\n\n updateSpeed = (type = DEFAULT_SPEED_TYPE) => {\n const speed = this.getSpeed(type)\n const { player } = this\n if (player) {\n if (type === DEFAULT_SPEED_TYPE) {\n if ((!player.avgSpeed || speed !== player.avgSpeed)) {\n player.avgSpeed = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n } else {\n const speedName = this.getSpeedName('avg', type)\n if (!player[speedName] || speed !== player[speedName]) {\n player[speedName] = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n }\n }\n }\n\n set openSpeed (value) {\n this.config.openSpeed = value\n if (!value && this.timer) {\n clearTimeout(this.timer)\n this.timer = null\n return\n }\n if (this.config.openSpeed) {\n if (this.timer) return\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n }\n\n get openSpeed () {\n return this.config.openSpeed\n }\n\n destroy () {\n this.off('real_time_speed', this._onRealSpeedChange)\n this.off([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache && this.speedListCache[type] && (this.speedListCache[type] = [])\n })\n this.speedListCache && (this.speedListCache = {})\n clearTimeout(this.timer)\n this.timer = null\n if (this.xhr && this.xhr.readyState !== 4) {\n this.xhr.cancel && this.xhr.cancel()\n this.xhr = null\n }\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\n/**\n * @typedef { {\n * tick?: number,\n * stuckCount?: number,\n * disable?: boolean,\n * reportFrame?: number\n * } } IFullscreenConfig\n */\nexport default class FpsDetect extends BasePlugin {\n static get pluginName () {\n return 'FpsDetect'\n }\n\n static get defaultConfig () {\n return {\n disabled: false,\n tick: 1000, // tick时间,默认1000 ms\n stuckCount: 3, // 卡住次数\n reportFrame: 0 // 每次解码帧率小于多少时统计\n }\n }\n\n afterCreate () {\n const { player, config } = this\n const media = player.media || player.video\n this.timer = null\n this._lastDecodedFrames = 0\n this._currentStuckCount = 0\n this._lastCheckPoint = null\n this._payload = []\n if (config.disabled) return\n const getVideoPlaybackQuality = media.getVideoPlaybackQuality\n if (!getVideoPlaybackQuality) return\n this.on(Events.PLAY, () => {\n this._startTick()\n })\n\n this.on(Events.PAUSE, () => {\n this._stopTick()\n })\n\n this.on(Events.ENDED, () => {\n this._stopTick()\n })\n\n this.on(Events.EMPTIED, () => {\n this._stopTick()\n })\n }\n\n _startTick () {\n this._stopTick()\n this._timer = setTimeout(() => {\n this._checkDecodeFPS()\n this._startTick()\n }, this.config.tick)\n }\n\n _stopTick () {\n clearTimeout(this._timer)\n this._timer = null\n }\n\n _checkBuffer (curTime, buffered) {\n let enoughBuffer = false\n const buffers = []\n for (let i = 0; i < buffered.length; i++) {\n const start = buffered.start(i)\n const end = buffered.end(i)\n buffers.push({ start, end })\n if (start <= curTime && curTime <= end - 1) {\n enoughBuffer = true\n break\n }\n }\n return {\n enoughBuffer,\n buffers\n }\n }\n\n _checkStuck (curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval) {\n const media = this.player.media || this.player.video\n const hidden = document.hidden\n const { paused, readyState, currentTime, buffered } = media\n\n if (hidden || paused || readyState < 4) {\n return\n }\n const { enoughBuffer, buffers } = this._checkBuffer(currentTime, buffered)\n if (!enoughBuffer) {\n return\n }\n\n if (curDecodedFrames <= this.config.reportFrame) {\n this._currentStuckCount++\n this._payload.push({ currentTime, buffers, curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval })\n\n if (this._currentStuckCount >= this.config.stuckCount) {\n this.emit(Events.FPS_STUCK, this._payload)\n this._reset()\n }\n } else {\n this._reset()\n }\n }\n\n _reset () {\n this._payload = []\n this._currentStuckCount = 0\n }\n\n _checkDecodeFPS () {\n const media = this.player.media || this.player.video\n if (!media) {\n return\n }\n const { totalVideoFrames, droppedVideoFrames } = media.getVideoPlaybackQuality()\n\n const currTime = performance.now()\n if (totalVideoFrames) {\n if (this._lastCheckPoint) {\n const curDecoded = totalVideoFrames - this._lastDecodedFrames\n const checkInterval = currTime - this._lastCheckPoint\n this._checkStuck(curDecoded, totalVideoFrames, droppedVideoFrames, checkInterval)\n }\n }\n this._lastDecodedFrames = totalVideoFrames\n this._lastCheckPoint = currTime\n }\n\n destroy () {\n this._stopTick()\n }\n}\n","import sniffer from '../utils/sniffer'\n// import Danmu from '../plugins/danmu'\nimport Xglogger from '../plugins/logger'\nimport Replay from '../plugins/replay'\nimport Poster from '../plugins/poster'\nimport Start from '../plugins/start'\nimport Enter from '../plugins/enter'\nimport Miniscreen from '../plugins/miniScreen'\nimport PC from '../plugins/pc'\nimport Mobile from '../plugins/mobile'\nimport Keyboard from '../plugins/keyboard'\nimport Loading from '../plugins/loading'\nimport Progress from '../plugins/progress'\nimport PlayIcon from '../plugins/play'\nimport FullScreen from '../plugins/fullscreen'\nimport TimeIcon from '../plugins/time'\nimport TimeSegments from '../plugins/time/timesegments'\nimport Volume from '../plugins/volume'\nimport RotateIcon from '../plugins/rotate'\nimport PIPIcon from '../plugins/pip'\nimport PlayNextIcon from '../plugins/playNext'\nimport DownLoadIcon from '../plugins/download'\nimport ScreenShotIcon from '../plugins/screenShot'\nimport DefinitionIcon from '../plugins/definition'\nimport PlaybackRateIcon from '../plugins/playbackRate'\nimport CssFullScreen from '../plugins/cssFullScreen'\nimport Error from '../plugins/error'\nimport Prompt from '../plugins/prompt'\nimport ProgressPreview from '../plugins/progressPreview'\nimport Thumbnail from '../plugins/common/thumbnail'\nimport MiniProgress from '../plugins/progress/miniProgress'\nimport DynamicBg from '../plugins/dynamicBg'\nimport ZH from '../lang/zh-cn'\nimport Stats from '../plugins/stats'\nimport GapJump from '../plugins/gapJump'\nimport WaitingTimeoutJump from '../plugins/waitingTimeoutJump'\nimport TestSpeed from '../plugins/testspeed'\nimport I18N from '../lang/i18n'\nimport FpsDetect from '../plugins/fpsDetect'\n// import Heatmap from '../plugins/heatmap'\n\nI18N.use(ZH)\n\nexport default class DefaultPreset {\n constructor (options, playerConfig) {\n const simulateMode = playerConfig && playerConfig.isMobileSimulateMode === 'mobile'\n const { isLive } = playerConfig\n const vodPlugins = isLive ? [] : [TimeSegments, Progress, MiniProgress, ProgressPreview, TimeIcon]\n\n const contolsIcons = [...vodPlugins, PlayIcon, FullScreen,\n RotateIcon, PlayNextIcon, DefinitionIcon, PlaybackRateIcon, DownLoadIcon, ScreenShotIcon, Volume, PIPIcon]\n\n const layers = [Replay, Poster, Start, Loading, Enter, Error, Prompt, Thumbnail, Miniscreen]\n\n this.plugins = [Stats, Xglogger, ...contolsIcons, ...layers, GapJump, WaitingTimeoutJump]\n const mode = simulateMode ? 'mobile' : sniffer.device\n switch (mode) {\n case 'pc':\n this.plugins.push(...[Keyboard, PC, CssFullScreen, TestSpeed, FpsDetect])\n break\n case 'mobile':\n this.plugins.push(...[Mobile])\n break\n default:\n this.plugins.push(...[Keyboard, PC, CssFullScreen])\n }\n if (sniffer.os.isIpad || mode === 'pc') {\n this.plugins.push(DynamicBg)\n }\n if (sniffer.os.isIpad) {\n this.plugins.push(PC)\n }\n this.ignores = []\n this.i18n = []\n }\n}\n","export default {\n LANG: 'zh-cn',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: '视频下载错误'\n },\n mse: {\n code: 2,\n msg: '流追加错误'\n },\n parse: {\n code: 3,\n msg: '解析错误'\n },\n format: {\n code: 4,\n msg: '格式错误'\n },\n decoder: {\n code: 5,\n msg: '解码错误'\n },\n runtime: {\n code: 6,\n msg: '语法错误'\n },\n timeout: {\n code: 7,\n msg: '播放超时'\n },\n other: {\n code: 8,\n msg: '其他错误'\n }\n },\n HAVE_NOTHING: '没有关于音频/视频是否就绪的信息',\n HAVE_METADATA: '音频/视频的元数据已就绪',\n HAVE_CURRENT_DATA: '关于当前播放位置的数据是可用的,但没有足够的数据来播放下一帧/毫秒',\n HAVE_FUTURE_DATA: '当前及至少下一帧的数据是可用的',\n HAVE_ENOUGH_DATA: '可用数据足以开始播放',\n NETWORK_EMPTY: '音频/视频尚未初始化',\n NETWORK_IDLE: '音频/视频是活动的且已选取资源,但并未使用网络',\n NETWORK_LOADING: '浏览器正在下载数据',\n NETWORK_NO_SOURCE: '未找到音频/视频来源',\n MEDIA_ERR_ABORTED: '取回过程被用户中止',\n MEDIA_ERR_NETWORK: '网络错误',\n MEDIA_ERR_DECODE: '解码错误',\n MEDIA_ERR_SRC_NOT_SUPPORTED: '不支持的音频/视频格式',\n REPLAY: '重播',\n ERROR: '网络连接似乎出现了问题',\n PLAY_TIPS: '播放',\n PAUSE_TIPS: '暂停',\n PLAYNEXT_TIPS: '下一集',\n DOWNLOAD_TIPS: '下载',\n ROTATE_TIPS: '旋转',\n RELOAD_TIPS: '重新载入',\n FULLSCREEN_TIPS: '进入全屏',\n EXITFULLSCREEN_TIPS: '退出全屏',\n CSSFULLSCREEN_TIPS: '进入样式全屏',\n EXITCSSFULLSCREEN_TIPS: '退出样式全屏',\n TEXTTRACK: '字幕',\n PIP: '画中画',\n SCREENSHOT: '截图',\n LIVE: '正在直播',\n OFF: '关闭',\n OPEN: '开启',\n MINI_DRAG: '点击按住可拖动视频',\n MINISCREEN: '小屏幕',\n REFRESH_TIPS: '请试试',\n REFRESH: '刷新',\n FORWARD: '快进中',\n LIVE_TIP: '直播'\n }\n}\n","import Errors from './error'\nimport * as Events from './events'\nimport './index.scss'\nimport { InstManager } from './instManager'\nimport I18N from './lang/i18n'\nimport Player from './player'\nimport BasePlugin from './plugin/basePlugin'\nimport Plugin from './plugin/plugin'\nimport { default as CssFullscreenIcon } from './plugins/cssFullScreen'\nimport { default as FullscreenIcon } from './plugins/fullscreen'\nimport { default as PlayIcon } from './plugins/play'\nimport { default as Progress } from './plugins/progress'\nimport { default as TimeIcon } from './plugins/time'\nimport { default as VolumeIcon } from './plugins/volume'\nimport defaultPreset from './presets/default'\nimport STATE_CLASS from './stateClassMap'\nimport Sniffer from './utils/sniffer'\nimport Util from './utils/util'\n\nclass PresetPlayer extends Player {\n static defaultPreset = defaultPreset;\n static Util = Util;\n static Sniffer = Sniffer\n static Errors = Errors\n static Events = Events\n static Plugin = Plugin\n static BasePlugin = BasePlugin\n static I18N = I18N\n static STATE_CLASS = STATE_CLASS\n static InstManager = InstManager\n\n // UI Exports\n static PlayIcon = PlayIcon // For Ads Plugin\n static TimeIcon = TimeIcon // For Ads Plugin\n static Progress = Progress // For Ads Plugin\n static FullscreenIcon = FullscreenIcon // For Ads Plugin\n static CssFullscreenIcon = CssFullscreenIcon // For Ads Plugin\n static VolumeIcon = VolumeIcon // For Ads Plugin\n}\n\nexport default PresetPlayer\n"],"names":["version","XG_DEBUG_OPEN","window","location","href","indexOf","STYLE","info","error","warn","XGTAG","XG_DEBUG","config","debug","logInfo","message","_console","_len","arguments","length","optionalParams","Array","_key","this","console","log","apply","concat","logWarn","_console2","_len2","_key2","logError","_console3","_fun","_len3","_key3","XgplayerTimeRange","bufferedList","_classCallCheck","_createClass","key","value","index","start","end","get","util","checkIsIn","list","i","len","isObject","type","_typeof","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","useRAF","requestAnimationFrame","TypeError","invokeFunc","time","args","thisArg","undefined","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","Object","keys","forEach","item","setAttribute","createDomFromHtml","html","classname","doc","children","addClass","err","hasClass","prototype","some","call","classList","e","orgClassName","getAttribute","match","RegExp","replace","split","add","removeClass","remove","reg","toggleClass","classNames","_arguments","_loop","typeOf","push","map","join","findDom","sel","querySelector","getElementById","slice","getCss","currentStyle","defaultView","getComputedStyle","padStart","str","pad","charstr","String","maxlen","ceil","chars","r","substring","format","isNaN","round","hour","floor","minute","second","event","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","name","setInterval","context","eventName","intervalFunc","frequency","_interval","bind","clearInterval","fun","_timers","splice","clearAllTimers","_timerIds","createImgBtn","imgUrl","width","height","w","h","unit","btn","style","every","parseFloat","trim","backgroundSize","margin","Hex2RGBA","hex","alpha","rgb","test","sixHex","kw","parseInt","getFullScreenEl","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","checkIsFunction","checkIsObject","hide","display","show","isUndefined","val","isNotNull","setStyleFromCsstext","text","arr","filterStyleFromText","_cssText","cssText","styleArr","ret","remain","getStyleFromCsstext","preloadImg","onload","onerror","img","Image","stopPropagation","scrollTop","pageYOffset","documentElement","body","scrollLeft","pageXOffset","checkTouchSupport","getBuffered2","vbuffered","maxHoleDuration","buffered","sort","b","diff","buffered2","buf2len","buf2end","getEventPos","zoom","x","y","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","getHostFromUrl","results","domain","frameId","mozCancelAnimationFrame","cancelRequestAnimationFrame","isMSE","video","media","HTMLMediaElement","currentSrc","isBlob","generateSessionId","did","d","getTime","performance","uuid","c","random","createEvent","Event","initEvent","adjustTimeByDuration","duration","isEnded","createPositionBar","root","appendChild","getTransformStyle","pos","scale","rotate","transformValue","styles","translate","stylesKeys","fn","lastIndex","convertDeg","abs","getIndexByTime","segments","_index","getOffsetCurrentTime","currentTime","_segments$_index","cTime","offset","getCurrentTimeByOffset","offsetTime","ERROR_TYPE_MAP","ERROR_MAP","Errors","player","errorInfo","errorType","errorCode","errorMessage","originError","ext","mediaError","ERROR_TYPES","i18n","ended","_player$media","readyState","networkState","_errc","code","playerVersion","stack","host","Util","ex","msg","PLAY","PLAYING","ENDED","PAUSE","ERROR","SEEKING","SEEKED","TIME_UPDATE","WAITING","CANPLAY","DURATION_CHANGE","VOLUME_CHANGE","LOADED_DATA","RATE_CHANGE","PROGRESS","LOAD_START","EMPTIED","PLAYER_FOCUS","PLAYER_BLUR","READY","URL_NULL","AUTOPLAY_STARTED","AUTOPLAY_PREVENTED","COMPLETE","REPLAY","DESTROY","URL_CHANGE","DOWNLOAD_SPEED_CHANGE","LEAVE_PLAYER","ENTER_PLAYER","LOADING","FULLSCREEN_CHANGE","CSS_FULLSCREEN_CHANGE","MINI_STATE_CHANGE","DEFINITION_CHANGE","AFTER_DEFINITION_CHANGE","VIDEO_RESIZE","PIP_CHANGE","ROTATE","SCREEN_SHOT","PLAYNEXT","SHORTCUT","XGLOG","USER_ACTION","RESET","SOURCE_ERROR","SOURCE_SUCCESS","VIDEO_EVENTS","STATS_EVENTS","STATS_INFO","STATS_DOWNLOAD","STATS_RESET","FPS_STUCK","has","hasOwnProperty","prefix","Events","EE","once","addListener","emitter","listener","evt","_events","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","names","events","getOwnPropertySymbols","listeners","handlers","l","ee","listenerCount","emit","a1","a2","a3","a4","a5","removeListener","j","on","removeAllListeners","off","prefixed","module","exports","store","instance","InstManager","_EventEmitter","_inherits","_super","_createSuper","playerId","setActive","isUserActive","endEarly","_iterate","flag","isActive","inst","isInstNext","isNext","XGI18nLang","lang","langKeys","textKeys","_s","_t","updateKeys","en","use","langData","i18nLangs","_clang","LANG","texts","TEXT","network","mse","parse","decoder","runtime","timeout","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","init","_ret$langKeys","pId","VERSION_REG","H264_MIMETYPES","sniffer","device","os","isPc","browser","navigator","ua","userAgent","toLowerCase","ie","firefox","chrome","opera","safari","filter","isWindowsPhone","isSymbian","isTizen","isWebOS","isAndroid","isFireFox","isIpad","platform","maxTouchPoints","isTablet","isPhone","isIos","osVersion","_match","exec","isWeixin","toLocaleLowerCase","isSupportMP4","isSupport","mime","supportResult","canPlayType","isMSESupport","MediaSource","isTypeSupported","_logger","isHevcSupported","probeConfigSupported","defaults","supported","smooth","powerEfficient","Promise","resolve","mediaCapabilities","decodingInfo","videoConfig","audioConfig","audio","videoSupported","contentType","audioSupported","emitVideoEvent","eventKey","errorHandler","getVideoEventHandler","_err","eData","originalEvent","detail","timeStamp","paused","isInternalOp","_internalOp","muted","volume","vtype","removeInnerOP","_currentTime","_rate","playbackRate","_duration","isMutedChange","_lastMuted","mediaEventMiddleware","MediaProxy","_this","_hasStart","mediaConfig","assign","controls","autoplay","playsinline","x5VideoPlayerFullscreen","x5VideoOrientation","airplay","tabindex","mediaType","videoAttributes","playerType","x5VideoPlayerType","Sniffer","loop","autoplayMuted","mediaEl","defaultPlaybackRate","attachVideoEvents","middlewares","_this2","_this3","_this4","_evHandlers","funName","charAt","toUpperCase","_defineProperty","addEventListener","_this5","removeEventListener","urls","_this6","removeAttribute","load","_c","_videoSourceCount","_videoSourceIndex","_vLoadeddata","_eHandler","_sourceError","_dIndex","removeChild","_e","srcObject","k","pause","detachVideoEvents","set","play","range","isTrue","_buffered","crossOrigin","defaultMuted","rate","Infinity","played","preload","seekable","seeking","onWaiting","_detachSourceEvents","_attachSourceEvents","vol","videoWidth","videoHeight","data","_get2","_get","_getPrototypeOf","_get3","_get4","_get5","_len4","_key4","INDEXDB","mydb","db","ojstore","keypath","indexedDB","webkitindexedDB","IDBKeyRange","webkitIDBKeyRange","myDB","self","request","open","onsuccess","onupgradeneeded","transaction","objectStoreNames","contains","createObjectStore","keyPath","deleteDatabase","close","storename","objectStore","put","delete","clear","FULLSCREEN_EVENTS","GET_FULLSCREEN_API","EXIT_FULLSCREEN_API","PLATER_ID","callHandler","handler","next","then","hook","hookName","preset","pre","__hooks","_preset$pre","pluginName","preRet","runHooks","isContinue","catch","findHookIndex","isArray","hookHandlers","useHooks","removeHooks","hooks","usePluginHooks","plugins","plugin","removePluginHooks","hooksDescriptor","presetHooks","defineProperty","delHooksDescriptor","_len5","_key5","runHooksRecursive","_len6","_key6","showErrorMsg","BasePlugin","beforeCreate","__args","__events","__onceEvents","playerConfig","__init","constructor","logger","i18nKeys","domEventType","_this$player","res","action","params","nParams","_objectSpread","emitUserAction","registerPlugin","getPlugin","offAll","destroy","unRegisterPlugin","Obj","configurable","Element","matches","proto","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","closest","element","selector","parentNode","_delegate","useCapture","listenerFn","delegateTarget","delegate_1","elements","querySelectorAll","ROOT_TYPES","CONTROLS","ROOT","POSITIONS","ROOT_LEFT","ROOT_RIGHT","ROOT_TOP","CONTROLS_LEFT","CONTROLS_RIGTH","CONTROLS_RIGHT","CONTROLS_CENTER","PLUGIN_STATE_CLASS","isUrl","createIcon","icon","attr","newIcon","tag","registerIconsObj","iconsConfig","_icons","icons","orgIcon","class","mergeIconClass","mergeIconAttr","Plugin","_BasePlugin","__delegates","_parent","_el","parent","registerIcons","langText","textConfig","defaultTexConfig","registerLanguageTexts","renderStr","render","Error","insert","setAttr","setStyle","__registerChildren","_children","_plugin","checkChildren","langKey","langTextShow","disable","find","qs","eventType","bindEL","delegate","unbindEL","htmlStr","eventHandle","isBubble","getPropertyValue","pdom","child","_this7","insertIdx","Number","isDomElement","coordinate","mode","curIdx","insertBefore","insertAdjacentHTML","capture","dels","ResizeObserver","entries","t","__runHandler","__handlers","observer","throttle","__trigger","observe","_pid","_this$observer","unobserve","_this$observer2","disconnect","resizeObserver","pluginsManager","pluginGroup","cgid","_pluginInfoId","closeResizeObserver","resize","addObserver","_originalOptions","_plugins","formatPluginInfo","PLUFGIN","checkPluginIfExits","getRootByConfig","_pConfig","position","lazyRegister","lazyPlugin","race","loader","__esModule","default","register","reject","originalOptions","isSupported","codecType","defaultConfig","unRegister","_instance","afterCreate","__destroy","deletePlugin","getPlugins","findPlugin","cName","beforeInit","retPromise","prevTask","_loadingPlugins","all","pluginsRet","pName","beforePlayerInit","afterInit","afterPlayerInit","setLang","updateLang","reRender","_pList","onPluginsReady","unObserver","_resizeObserver","_i","_Object$keys","STATE_CLASS","DEFAULT","DEFAULT_SKIN","ENTER","PAUSED","NO_START","ACTIVE","INACTIVE","FULLSCREEN","CSS_FULLSCREEN","ROTATE_FULLSCREEN","PARENT_ROTATE_FULLSCREEN","PARENT_FULLSCREEN","INNER_FULLSCREEN","NO_CONTROLS","FLEX_CONTROLS","CONTROLS_FOLLOW","CONTROLS_AUTOHIDE","TOP_BAR_AUTOHIDE","NOT_ALLOW_AUTOPLAY","PC","MOBILE","MINI","getDefaultConfig","nullUrlStart","fluid","fitVideoSize","videoFillMode","isLive","videoInit","poster","isMobileSimulateMode","execBeforePluginsCall","allowSeekAfterEnded","enableContextmenu","closeVideoClick","closeVideoDblclick","closePlayerBlur","closeDelayBlur","leavePlayerTime","closePlayVideoFocus","closePauseVideoFocus","closeFocusVideoFocus","closeControlsBlur","topBarAutoHide","startTime","seekedStatus","miniprogress","disableSwipeHandler","enableSwipeHandler","preProcessUrl","ignores","whitelist","inactive","language","marginControls","fullscreenTarget","screenShot","pip","download","mini","cssFullscreen","keyShortcut","presets","definition","customDuration","timeOffset","thumbnail","isHideTips","minWaitDelay","commonStyle","progressColor","playedColor","cachedColor","sliderBtnStyle","volumeColor","STATES","STATE_ARRAY","Controls","_Plugin","_assertThisInitialized","_assertThisInitialize","focus","autoHide","_this$config","left","center","right","innerRoot","isMini","onMouseEnter","onMouseLeave","blur","ignorePaused","unbind","_this$config2","initShow","PlAYER_HOOKS","REAL_TIME_SPEED","AVG_SPEED","instManager","Player","_MediaProxy","__startTime","_seekToStartTime","_useAutoplay","mediaPlay","canPlayFunc","isFullScreen","delayResize","fullEl","_fullActionFrom","props","prop","from","to","isVideo","checkIsCurrentVideo","pid","_fullscreenEl","fullscreen","changeFullStyle","_fullScreenOffset","cssfullscreen","exitCssFullscreen","needFullscreenScroll","scrollTo","top","recoverFullStyle","onFullscreenChange","defaultPreset","defaultIdx","userTimer","waitTimer","handleSource","_state","isAd","isError","isSeeking","isCanplay","rotateDeg","isRotateFullscreen","timeSegments","_cssfullscreenEl","curDefinition","_orgCss","_videoHeight","_videoWidth","videoPos","pi","vy","vx","sizeInfo","_accPlayed","acc","loopAcc","_offsetInfo","innerContainer","topBar","__i18n","database","Database","_onceSeekCanplay","_isPauseBeforeSeek","innerStates","isActiveLocked","_initDOM","_possibleConstructorReturn","_this$config2$definit","defaultDefinitionObj","defaultDefinition","_bindEvents","_registerPresets","_registerPlugins","getInitDefinition","setState","onReady","hasStart","state","_instManager","vid","line","handle","p","checkPlayerRoot","_initBaseDoms","_root","_this$config3","_width","_height","_this$root$getBoundin","getBoundingClientRect","leftBar","rightBar","_onWebkitbeginfullscreen","_onWebkitendfullscreen","playFunc","mousemoveFunc","firstChild","isInit","ignoresStr","cuPlugins","lazy","loadingPlugin","forceBeforeInit","Preset","_player$config$plugin","_player$config$ignore","_presetInst","_presetInst$plugins","_presetInst$ignores","_presetInst$icons","_presetInst$i18n","_ci18n","usePreset","_retPlugin","_this$controls","_getRootByPosition","removedFromConfig","deregister","removePluginFromConfig","_this8","_furl","_startInit","fileName","lineNumber","_this9","_src","curTime","isPaused","_error","_canplay","_this10","playPromise","onError","_errorTimer","_this11","_this12","status","_this13","_this$config4","isSeekedPlay","_status","_this14","_this$config5","_this15","bitrate","switchURL","seamless","reloadFunc","_this16","clsList","mediaPause","cls","_this17","unregisterPlugins","isResetConfig","resetState","pn","de","_instManager2","_this18","updateAcc","_unbindEvents","exitFullscreen","remainMediaAfterDestroy","cList","_this19","onPlay","_this20","cur","_srcRet","rootClass","pClassName","_orgPCss","webkitRequestFullscreen","ALLOW_KEYBOARD_INPUT","fullscreenEnabled","webkitSupportsFullscreen","webkitEnterFullscreen","exitRotateFullscreen","webkitExitFullScreen","_class","_this$config$fullscre","useCssFullscreen","_this$config$fullscre2","setRotateDeg","_rootStyle","innerHeight","deg","orientation","delay","onFocus","_clearUserTimer","onBlur","_this21","isLock","_ref","_ref$ignorePaused","_this22","_this23","_this24","endType","_at","startDiff","endDiff","_ref2","_ref2$startDiff","_ref2$endDiff","_this25","_this$videoPos","_pi","_pos","offsetWidth","offsetHeight","rHeight","rWidth","maxWidth","maxHeight","formStyle","transform","webkitTransform","resizePosition","_this26","setConfig","_this27","_this28","containerSize","_this$media","_this$config6","controlsHeight","videoFit","fit","_style","paddingTop","videoScale","vWidth","vHeight","cWidth","cHeight","updateObjectPosition","objectPosition","newState","_this$config7","preProcessUrlOptions","processUrlOptions","bool","_this29","curDef","targetDef","_this29$curDefinition","changeDefinition","total","dropped","corrupted","droppedRate","droppedDuration","getVideoPlaybackQuality","_quality","droppedVideoFrames","totalVideoFrames","corruptedVideoFrames","cumulateTime","_l","__url","posterUrl","update","_this$_accPlayed","isMuted","_instManager3","addInnerOP","Boolean","_instManager4","getActiveId","_instManager5","descriptor","xgIconTips","textKey","isShow","getInstance","Icon","_onMouseenter","_onMouseLeave","CssFullScreen","_IconPlugin","initIcons","isCssfullScreen","animate","btnClick","handleCssFullscreen","preventDefault","contentIcon","getCssFullscreen","switchTips","tipDom","changeLangTextKey","CssFullSceenSvg","ExitCssFullSceenSvg","IconPlugin","TopBackIcon","onClick","screenBack","BackSVG","Fullscreen","rotateFullscreen","getFullscreen","handleFullscreen","toggleFullScreen","tipsDom","needBackIcon","topBackIcon","_onOrientationChange","FullScreenSvg","ExitFullScreenSvg","getRotateFullscreen","switchCallback","useScreenOrientation","unlockScreen","aspectRatio","lockScreen","lockOrientationType","screen","lock","unlock","Play","replay","listenEvents","PlaySvg","PauseSvg","TPL","styleKey","InnerList","fragments","percent","_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","moving","miniMoveStep","computeTime","triggerCallbacks","_updateInnerFocus","isLocked","updateWidth","seekTime","_assertThisInitialize3","forward","isDown","isPauseMoving","_assertThisInitialize4","closeMoveSeek","isPlaying","onMoveStart","prePlayTime","isProgressMoving","progressBtn","_mouseDownHandlerHook","onMouseMove","onMouseUp","onMoveOnly","_assertThisInitialize5","onMoveEnd","_mouseUpHandlerHook","isEnter","resetSeekState","_assertThisInitialize6","miniStartStep","_mouseMoveHandlerHook","_assertThisInitialize7","_this$pos","useable","__dragCallBacks","direc","_disableBlur","isDragingSeek","isDraggingSeek","offsetDuration","offsetCurrentTime","innerList","reset","outer","updateFocus","_initInner","isMobile","bindDomEvents","initCustomStyle","onTimeupdate","onCacheUpdate","onReset","onVideoResize","frags","boxShadow","_mouseDownHandler","_mouseUpHandler","_mouseMoveHandler","onMouseDown","onMouseOver","onMouseOut","onBodyClick","pauseAutoHide","recoverAutoHide","isCloseClickSeek","realTime","endedDiff","toFixed","updatePercent","updateTime","seek","rLeft","timeIcon","resetActive","notSeek","_end","bufferedPoint","thumbnailPlugin","controlsMode","Time","isActiving","_this$player2","constrolsMode","createCenterTime","durationDom","timeDom","onTimeUpdate","centerCurDom","centerDurDom","current","minWidthTime","timeStr","updateState","Volume","bar","barRect","barH","updateVolumePos","onBarMouseUp","_d","isStart","isMoving","unFocus","showValueLabel","updateVolumeValue","volumeSmall","volumeSmallSvg","volumeLarge","volumeLargeSvg","volumeMuted","volumeMutedSvg","_timerId","_this$playerConfig","backgroundColor","changeMutedHandler","changeMuted","_onMouseenterHandler","onMouseenter","_onMouseleaveHandler","onMouseleave","onBarMousedown","onBarMouseMove","onVolumeChange","drag","$labelValue","innerText","isForce","miniVolume","isShowVolumeValue","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","ReplaySvg","__handleReplay","path","Poster","isEndedShow","hideCanplay","_bg","fillMode","notHidden","getBgSize","AnimateMap","clearAnimation","Start","autoPlayStart","toggleTo","bindClickEvents","onAutoplayStart","onPlayerReset","clickHandler","switchPausePlay","cancelable","startPlay","startPause","isAnimate","endShow","_animateId","addAnimate","seconds","switchStatus","isShowPause","isShowEnd","endAnimate","disableAnimate","Enter","innerHtml","HTMLElement","barStr","logo","MiniScreenIcon","getMini","exitMini","getStyleSize","num","measurements","measurementsLength","getSize","elem","getStyle","size","innerWidth","outerWidth","outerHeight","getZeroSize","isBorderBox","boxSizing","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderWidth","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","getTouch","dentifier","identifier","EVENTS","POST_START_EVENTS","mousedown","touchstart","pointerdown","Draggabilly","isEnabled","isDragging","downPoint","dragPoint","startPos","_handlerDom","_bindStartEvent","_startKey","_boundPointerEvents","onUp","positionDrag","webKitTransform","dragStart","dragMove","dragEnd","touchIdentifier","pointerId","dragCancel","pointer","_getPosition","maxY","maxX","setLeftTop","_bindPostStartEvents","_unbindPostStartEvents","presetInfo","moveVector","hasDragStarted","dragRealStart","_this$startPos","_dragPointerMove","dragX","dragY","checkContain","_unbindStartEvent","axis","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","__canvas","closeVideoStopPropagation","_clickCount","clickTimer","switchPlayPause","initEvents","onVideoClick","onVideoDblClick","onContextmenu","returnValue","cancelBubble","TOUCHS","move","MOUSES","Touche","__setPress","onTouchEnd","onTouchCancel","onTouchMove","trigger","__clearPress","press","__setDb","diffx","diffy","miniStep","pressDelay","dbClickDelay","disablePress","disableDbClick","needPreventDefault","pressIntrvalId","dbIntrvalId","_initEvent","onTouchStart","__clearDb","touchend","touchmove","ACTIONS","MobilePlugin","touche","getTouche","disableGesture","timer","rect","_x","_y","scopeL","scopeR","scopeM1","scopeM","scopeM2","hideControlsActive","scope","checkScope","gestureY","gestureX","executeMove","endLastMove","resetPos","changeAction","checkIsRootTarget","light","seekTipIcon","SeekTipIcon","closedbClick","xgMask","registerThumbnail","onRootTouchMove","onRootTouchEnd","moveDuration","_this2$pos","eventsMap","pressend","click","doubleclick","disableActive","progressPlugin","progress","addCallBack","activeSeekNote","usable","createThumbnail","timePreview","timePreviewStyle","curTimeColor","durationColor","previewDom","curColor","durColor","color","disableTimeProgress","startPlugin","recover","mold","updateBrightness","updateVolume","lastScope","hideControlsEnd","sendUseAction","focusVideoClick","dbClickHandler","pressRate","isTouchingSeek","darkness","maxDarkness","isForward","focusHide","updateThumbnails","gradient","disableSeekIcon","miniYPer","isDisableTag","isContentEditable","Keyboard","keyCode","_keyState","disableBodyTrigger","isIgnoreUserActive","checkIsVisible","metaKey","altKey","ctrlKey","isBodyKeyDown","repeat","isKeyDown","isGlobalTrigger","checkCode","onBodyKeyUp","handleKeyDown","handleKeyUp","disableRootTrigger","onKeyup","extendkeyCodeMap","keyCodeMap","key1","seekStep","space","noBodyTarget","up","down","pressAction","esc","mergekeyCodeMap","isPress","tt","onKeydown","onBodyKeyDown","newConfig","checkVisible","rec","bottom","isBodyTarget","_time","_step","_seekTime","handleKeyCode","curKeyCode","_this$keyCodeMap$arr$","_action","Loading","loadingIcon","TimeSegmentsControls","updateSegments","_checkIfEnabled","changeIndex","curPos","lastCurrentTime","_this$curPos","_this$player3","getSeekTime","_this$player4","_onDurationChange","_onLoadedData","_onPlay","_segs","formatTimeSegments","_item","_segDuration","segDuration","last","_timeSegments$index","diff2","Rotate","onBtnClick","innerRotate","updateRotateDeg","rootWidth","clientWidth","rootHeight","clientHeight","clockwise","videoRotateDeg","_transform","_styles","transformOrigin","times","factor","RotateSvg","PresentationMode","isPIPAvailable","isPip","exitPIP","requestPIP","showIcon","pMode","initPipEvents","switchPIP","pipIcon","PipIcon","pipIconExit","PipIconExit","leavePIPCallback","pipWindow","enterPIPCallback","pictureInPictureWindow","onWebkitpresentationmodechanged","webkitPresentationMode","checkWebkitSetPresentationMode","pipWin","textContent","styleSheets","cssRules","rule","link","rel","head","preferDocument","isDocPIPAvailable","pipOptions","playerRect","documentPictureInPicture","requestWindow","docPiPNode","docPiPStyle","pipRoot","parentElement","previousSibling","nextSibling","copyStyleIntoPiPWindow","append","cssContent","webkitSetPresentationMode","requestPictureInPicture","reason","_documentPictureInPic","exitPictureInPicture","_documentPictureInPic2","pictureInPictureElement","pictureInPictureEnabled","disablePictureInPicture","webkitSupportsPresentationMode","protocol","PlayNextIcon","idx","urlList","nextHandler","playNext","Next","changeSrc","strFileName","strMimeType","blob","reader","defaultMime","mimeType","payload","anchor","myBlob","Blob","MozBlob","WebKitBlob","pop","ajax","XMLHttpRequest","responseType","response","send","msSaveBlob","dataUrlToBlob","saver","tempUiArr","Uint8Array","mx","charCodeAt","strUrl","parts","binData","atob","decodeURIComponent","uiArr","winMode","URL","revokeObjectURL","confirm","f","createObjectURL","btoa","encodeURIComponent","FileReader","readAsDataURL","Download","dUrl","newUrl","getAbsoluteURL","downloadUtil","_handler","DownloadSvg","div","ScreenShot","screenshotIcon","initSize","fitVideo","onClickBtn","filename","saveLink","MouseEvent","bubbles","view","initMouseEvent","dispatchEvent","canvas","canvasCtx","getContext","imageSmoothingEnabled","imageSmoothingQuality","shot","saveImg","saveScreenShot","option","quality","createCanvas","dx","dy","dw","dh","mediaRatio","canvasRatio","sw","sh","drawImage","toDataURL","OptionList","onItemClick","renderItemList","_delegates","attrKeys","selected","showText","changeCallback","curSelected","getAttrObj","LIST_TYPES","TOGGLE_MODES","IS_MOBILE","OptionsIcon","switchActiveState","toggleMode","toggle","listType","enterType","isIcons","curValue","hidePortrait","_resizeList","optionsList","activeEvent","onEnter","onLeave","onIconClick","_isIcons","focusAwhile","curItem","changeCurrentText","isItemClickHide","getTextByLang","itemList","_maxH","heightLimit","listStyle","DefinitionIcon","_OptionsIcon","changeDefinitionList","definitionList","items","showItem","PlaybackRate","curRate","itemInfo","_text","ErrorPlugin","errorRetry","handleError","retry","errorNote","Prompt","intervalId","customConfig","customOnClick","showPrompt","hidePrompt","interval","highlight","hideinterval","ISPOT","mergeISPOT","iSpot","APIS","_updateDotDom","dotDom","calcuPosition","initDots","_ispots","createDot","ispotsInit","isNew","template","positionDot","findDot","updateDot","needShow","dot","showDot","deleteDot","del","deleteAllDots","dotDoms","getElementsByTagName","updateAllDots","iSpots","ispot","positionDots","playerSize","_pop","pRect","rect1","_left","_diff","getAllDotsDom","getDotDom","CALLBACK_MAP","dragmove","dragstart","dragend","mouseover","ProgressPreview","isHideThumbnailHover","isDrag","_curDot","onDotMouseLeave","blurDot","enableBlur","focusDot","disableBlur","videoPreview","videothumbnail","handlerSpotClick","_event","transformTimeHook","setTimeContent","ispots","progressDot","initDotsAPI","extTextRoot","previewLine","timePoint","timeText","tipText","_hasThumnail","bindEvents","onMousemove","onMousedown","onMouseup","handlerPreviewClick","updatePosition","cwidth","isflex","lwidth","showTips","isFocusDots","defaultText","hideTips","updateTimeText","updateLinePos","thumbnailConfig","isShowThumbnail","tRoot","isShowCoverPreview","totalWidth","widthPerSeconds","_activeDotId","isDefault","removeCallBack","miniWidth","Thumbnail","ratio","_preloadMark","initThumbnail","_this2$config","pic_num","containerWidth","containerHeight","row","col","urlIndex","indexInPage","rowIndex","colIndex","swidth","sHeight","getUrlByIndex","backgroundPosition","customStyle","getPosition","getBgColor","MiniProgress","MODES","nowTime","isSupportCanvas","DynamicBg","_frameCount","startFrameCount","stop","renderOnTimeupdate","visibilityState","_checkIfCanStart","renderOnce","_isLoaded","startInterval","_sVideo","checkVideoIsSupport","videoPI","preTime","_loopType","dynamicBg","frameRate","rwidth","rheight","renderByPoster","onLoadedData","onVisibilitychange","canvasFilter","supportCanvasFilter","isInnerRender","webkitFilter","mask","addMask","background","maskBg","_p","_tVideo","HTMLVideoElement","flyVideo","_tagName","updateImg","_this$canvas$getBound","image","sourcePI","_this$canvas$getBound2","multiple","checkIsSupportCanvas","INFO","Stats","actionData","_getTime","_stats","stats","getStats","JSON","stringify","downloadUrl","disabled","timestamp","timeFormat","toISOString","_recordUserActions","_recordInfo","_downloadStats","profile","_infoProfile","_info","startMs","endMs","cat","dur","ph","tid","ts","_this$_stats","mediaElem","mediaInfo","raw","timestat","_getTimeStats","_getProfile","msgs","stat","traceEvents","GapJump","seekingEventReceived","hasPlayed","smallGapLimit","gapDetectionThreshold","_getIndex","jumpTo","jumpSize","isGapSmall","BROWSER_GAP_TOLERANCE","useGapJump","isSafari","end_type","video_postion","onGapJump","threshold","bufferedInfo","_getBuffered","WaitingTimeoutJump","jumpCnt","jumpCntMax","useWaitingTimeoutJump","onJump","waitingTime","DEFAULT_SPEED_TYPE","SPEED_TYPE","TestSpeed","speedListCache","initSpeedList","cnt","testSpeed","testTimeStep","speed","appendList","openSpeed","loadSize","testCnt","testSpeedUrl","xhr","headers","Range","setRequestHeader","onreadystatechange","getResponseHeader","saveSpeedMax","shift","realTimeSpeed","getSpeedName","updateSpeed","getSpeed","avgSpeed","speedName","addSpeedTypeList","_onRealSpeedChange","namePrefix","FpsDetect","_lastDecodedFrames","_currentStuckCount","_lastCheckPoint","_payload","_startTick","_stopTick","_timer","_checkDecodeFPS","tick","enoughBuffer","buffers","curDecodedFrames","checkInterval","hidden","_this$_checkBuffer","_checkBuffer","reportFrame","stuckCount","_reset","_media$getVideoPlayba","currTime","curDecoded","_checkStuck","DefaultPreset","_this$plugins","_this$plugins2","_this$plugins3","simulateMode","contolsIcons","TimeSegments","TimeIcon","FullScreen","RotateIcon","PlaybackRateIcon","DownLoadIcon","ScreenShotIcon","PIPIcon","layers","Miniscreen","Xglogger","Mobile","PresetPlayer","_Player","FullscreenIcon","CssFullscreenIcon","VolumeIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.min.js","sources":["../src/version.js","../src/utils/debug.js","../src/utils/xgplayerTimeRange.js","../src/utils/util.js","../src/error.js","../src/events.js","../../../node_modules/eventemitter3/index.js","../src/instManager.js","../src/lang/en.js","../src/lang/i18n.js","../src/utils/sniffer.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/player.js","../src/plugins/common/iconTools.js","../src/plugins/common/iconPlugin.js","../src/plugins/cssFullScreen/index.js","../src/plugins/fullscreen/backicon.js","../src/plugins/fullscreen/index.js","../src/plugins/play/index.js","../src/plugins/progress/innerList.js","../src/plugins/progress/index.js","../src/plugins/time/index.js","../src/plugins/volume/index.js","../src/plugins/logger/index.js","../src/plugins/replay/index.js","../src/plugins/poster/index.js","../src/plugins/start/index.js","../src/plugins/enter/index.js","../src/plugins/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/time/timesegments.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/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":["/**\n * @type {string}\n * */\nexport default __VERSION__\n","\nconst XG_DEBUG_OPEN = typeof (window) !== 'undefined' && window.location && window.location.href.indexOf('xgplayerdebugger=1') > -1\n\nconst STYLE = {\n info: 'color: #525252; background-color: #90ee90;',\n error: 'color: #525252; background-color: red;',\n warn: 'color: #525252; background-color: yellow; '\n}\n\nconst XGTAG = '%c[xgplayer]'\n\nconst XG_DEBUG = {\n config: {\n debug: XG_DEBUG_OPEN ? 3 : 0\n },\n\n logInfo: function (message, ...optionalParams) {\n this.config.debug >= 3 && console.log(XGTAG, STYLE.info, message, ...optionalParams)\n },\n\n logWarn: function (message, ...optionalParams) {\n this.config.debug >= 1 && console.warn(XGTAG, STYLE.warn, message, ...optionalParams)\n },\n\n logError: function (message, ...optionalParams) {\n if (this.config.debug < 1) {\n return\n }\n const _fun = this.config.debug >= 2 ? 'trace' : 'error'\n console[_fun](XGTAG, STYLE.error, message, ...optionalParams)\n }\n}\n\nfunction bindDebug (player) {\n player.logInfo = XG_DEBUG.logInfo.bind(player)\n player.logWarn = XG_DEBUG.logWarn.bind(player)\n player.logError = XG_DEBUG.logError.bind(player)\n}\n\nexport {\n XG_DEBUG as default,\n bindDebug\n}\n","export default class XgplayerTimeRange {\n constructor (bufferedList) {\n this.bufferedList = bufferedList\n }\n\n start (index) {\n return this.bufferedList[index].start\n }\n\n end (index) {\n return this.bufferedList[index].end\n }\n\n get length () {\n return this.bufferedList.length\n }\n}\n","import XG_DEBUG from './debug'\nimport XgplayerTimeRange from './xgplayerTimeRange'\nconst util = {}\n\n/**\n *\n * @param { string } el\n * @param { string } [tpl=]\n * @param { {[propName: string]: any }} [attrs={}]\n * @param { string } [cname='']\n * @returns { HTMLElement | null }\n */\nutil.createDom = function (el = 'div', tpl = '', attrs = {}, cname = '') {\n const dom = document.createElement(el)\n dom.className = cname\n dom.innerHTML = tpl\n Object.keys(attrs).forEach(item => {\n const key = item\n const value = attrs[item]\n if (el === 'video' || el === 'audio' || el === 'live-video') {\n if (value) {\n dom.setAttribute(key, value)\n }\n } else {\n dom.setAttribute(key, value)\n }\n })\n return dom\n}\n\n/**\n *\n * @param { string } html\n * @param { {[propName: string]: any} } [attrs={}]\n * @param { string } [classname=\"\"]\n * @returns { HTMLElement | null }\n */\nutil.createDomFromHtml = function (html, attrs = {}, classname = '') {\n try {\n let doc = document.createElement('div')\n doc.innerHTML = html\n let dom = doc.children\n doc = null\n if (dom.length > 0) {\n dom = dom[0]\n classname && util.addClass(dom, classname)\n if (attrs) {\n Object.keys(attrs).forEach(key => {\n dom.setAttribute(key, attrs[key])\n })\n }\n return dom\n }\n return null\n } catch (err) {\n XG_DEBUG.logError('util.createDomFromHtml', err)\n return null\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { boolean }\n */\nutil.hasClass = function (el, className) {\n if (!el || !className) {\n return false\n }\n try {\n return Array.prototype.some.call(el.classList, item => item === className)\n } catch (e) {\n const orgClassName = el.className && typeof el.className === 'object' ? el.getAttribute('class') : el.className\n return orgClassName && !!orgClassName.match(new RegExp('(\\\\s|^)' + className + '(\\\\s|$)'))\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.addClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.add(item)\n })\n } catch (e) {\n if (!util.hasClass(el, className)) {\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class') + ' ' + className)\n } else {\n el.className += ' ' + className\n }\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.removeClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.remove(item)\n })\n } catch (e) {\n if (util.hasClass(el, className)) {\n className.split(/\\s+/g).forEach(item => {\n const reg = new RegExp('(\\\\s|^)' + item + '(\\\\s|$)')\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class').replace(reg, ' '))\n } else {\n el.className = el.className.replace(reg, ' ')\n }\n })\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.toggleClass = function (el, className) {\n if (!el) {\n return\n }\n\n className.split(/\\s+/g).forEach(item => {\n if (util.hasClass(el, item)) {\n util.removeClass(el, item)\n } else {\n util.addClass(el, item)\n }\n })\n}\n\n/**\n *\n * @param { string | Object } args0\n * @param { string } [className]\n * @returns { string }\n */\nutil.classNames = function () {\n const classname = []\n for (let i = 0; i < arguments.length; i++) {\n if (util.typeOf(arguments[i]) === 'String') {\n // classname += `${arguments[i]}`\n classname.push(arguments[i])\n } else if (util.typeOf(arguments[i]) === 'Object') {\n Object.keys(arguments[i]).map(key => {\n if (arguments[i][key]) {\n // classname += key\n classname.push(key)\n }\n })\n }\n // if (i < arguments.length - 1) {\n // classname += ' '\n // }\n }\n return classname.join(' ')\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } sel\n * @returns { HTMLElement }\n */\nutil.findDom = function (el = document, sel) {\n let dom\n // fix querySelector IDs that start with a digit\n // https://stackoverflow.com/questions/37270787/uncaught-syntaxerror-failed-to-execute-queryselector-on-document\n try {\n dom = el.querySelector(sel)\n } catch (e) {\n XG_DEBUG.logError('util.findDom', e)\n if (sel.indexOf('#') === 0) {\n dom = el.getElementById(sel.slice(1))\n }\n }\n return dom\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } key\n * @returns { any }\n */\nutil.getCss = function (dom, key) {\n return dom.currentStyle ? dom.currentStyle[key] : document.defaultView.getComputedStyle(dom, false)[key]\n}\n\nutil.padStart = function (str, length, pad) {\n const charstr = String(pad)\n const len = length >> 0\n let maxlen = Math.ceil(len / charstr.length)\n const chars = []\n const r = String(str)\n while (maxlen--) {\n chars.push(charstr)\n }\n return chars.join('').substring(0, len - r.length) + r\n}\n\n/**\n *\n * @param { number } time\n * @returns { string }\n */\nutil.format = function (time) {\n if (window.isNaN(time)) {\n return ''\n }\n time = Math.round(time)\n const hour = util.padStart(Math.floor(time / 3600), 2, 0)\n const minute = util.padStart(Math.floor((time - hour * 3600) / 60), 2, 0)\n const second = util.padStart(Math.floor((time - hour * 3600 - minute * 60)), 2, 0)\n return (hour === '00' ? [minute, second] : [hour, minute, second]).join(':')\n}\n\n/**\n *\n * @param { Object } e\n * @returns { Object }\n */\nutil.event = function (e) {\n if (e.touches) {\n const touch = e.touches[0] || e.changedTouches[0]\n e.clientX = touch.clientX || 0\n e.clientY = touch.clientY || 0\n e.offsetX = touch.pageX - touch.target.offsetLeft\n e.offsetY = touch.pageY - touch.target.offsetTop\n }\n e._target = e.target || e.srcElement\n}\n\n/**\n *\n * @param { any } obj\n * @returns { string }\n */\nutil.typeOf = function (obj) {\n // eslint-disable-next-line no-lookahead-lookbehind-regexp/no-lookahead-lookbehind-regexp\n return Object.prototype.toString.call(obj).match(/([^\\s.*]+)(?=]$)/g)[0]\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepCopy = function (dst, src) {\n if (util.typeOf(src) === 'Object' && util.typeOf(dst) === 'Object') {\n Object.keys(src).forEach(key => {\n // eslint-disable-next-line no-undef\n if (util.typeOf(src[key]) === 'Object' && !(src[key] instanceof Node)) {\n if (dst[key] === undefined || dst[key] === undefined) {\n dst[key] = src[key]\n } else {\n util.deepCopy(dst[key], src[key])\n }\n } else if (util.typeOf(src[key]) === 'Array') {\n dst[key] = util.typeOf(dst[key]) === 'Array' ? dst[key].concat(src[key]) : src[key]\n } else {\n dst[key] = src[key]\n }\n })\n return dst\n }\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepMerge = function (dst, src) {\n Object.keys(src).map(key => {\n if (util.typeOf(src[key]) === 'Array' && util.typeOf(dst[key]) === 'Array') {\n if (util.typeOf(dst[key]) === 'Array') {\n dst[key].push(...src[key])\n }\n } else if (util.typeOf(dst[key]) === util.typeOf(src[key]) && dst[key] !== null && util.typeOf(dst[key]) === 'Object' && !(src[key] instanceof window.Node)) {\n util.deepMerge(dst[key], src[key])\n } else {\n src[key] !== null && (dst[key] = src[key])\n }\n })\n return dst\n}\n\nutil.getBgImage = function (el) {\n // fix: return current page url when url is none\n const url = (el.currentStyle || window.getComputedStyle(el, null)).backgroundImage\n if (!url || url === 'none') {\n return ''\n }\n const a = document.createElement('a')\n a.href = url.replace(/url\\(\"|\"\\)/g, '')\n return a.href\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { HTMLElement | null }\n */\nutil.copyDom = function (dom) {\n if (dom && dom.nodeType === 1) {\n const back = document.createElement(dom.tagName)\n Array.prototype.forEach.call(dom.attributes, (node) => {\n back.setAttribute(node.name, node.value)\n })\n if (dom.innerHTML) {\n back.innerHTML = dom.innerHTML\n }\n return back\n } else {\n return ''\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @param { function } intervalFunc\n * @param { number } frequency\n */\nutil.setInterval = function (context, eventName, intervalFunc, frequency) {\n if (!context._interval[eventName]) {\n context._interval[eventName] = window.setInterval(intervalFunc.bind(context), frequency)\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @returns { void }\n */\nutil.clearInterval = function (context, eventName) {\n clearInterval(context._interval[eventName])\n context._interval[eventName] = null\n}\n\n/**\n *\n * @param { any } context\n * @param { function } fun\n * @param { number } time\n * @returns { number }\n */\nutil.setTimeout = function (context, fun, time) {\n if (!context._timers) {\n context._timers = []\n }\n const id = setTimeout(() => {\n fun()\n util.clearTimeout(context, id)\n }, time)\n context._timers.push(id)\n return id\n}\n\n/**\n *\n * @param { any } context\n * @param { number } id\n */\nutil.clearTimeout = function (context, id) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n for (let i = 0; i < _timers.length; i++) {\n if (_timers[i] === id) {\n _timers.splice(i, 1)\n clearTimeout(id)\n break\n }\n }\n } else {\n clearTimeout(id)\n }\n}\n\n/**\n *\n * @param { any } context\n */\nutil.clearAllTimers = function (context) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n _timers.map(item => {\n clearTimeout(item)\n })\n context._timerIds = []\n }\n}\n\n/**\n *\n * @param { string } name\n * @param { string } imgUrl\n * @param { number } [width]\n * @param { number } [height]\n * @returns { HTMLElement }\n */\nutil.createImgBtn = function (name, imgUrl, width, height) {\n const btn = util.createDom(`xg-${name}`, '', {}, `xgplayer-${name}-img`)\n btn.style.backgroundImage = `url(\"${imgUrl}\")`\n if (width && height) {\n let w, h, unit\n ['px', 'rem', 'em', 'pt', 'dp', 'vw', 'vh', 'vm', '%'].every((item) => {\n if (width.indexOf(item) > -1 && height.indexOf(item) > -1) {\n w = parseFloat(width.slice(0, width.indexOf(item)).trim())\n h = parseFloat(height.slice(0, height.indexOf(item)).trim())\n unit = item\n return false\n } else {\n return true\n }\n })\n btn.style.width = `${w}${unit}`\n btn.style.height = `${h}${unit}`\n btn.style.backgroundSize = `${w}${unit} ${h}${unit}`\n if (name === 'start') {\n btn.style.margin = `-${h / 2}${unit} auto auto -${w / 2}${unit}`\n } else {\n btn.style.margin = 'auto 5px auto 5px'\n }\n }\n return btn\n}\n\n/**\n *\n * @param { string } hex\n * @param { string | number } alpha\n * @returns { string }\n */\nutil.Hex2RGBA = function (hex, alpha) {\n const rgb = [] // 定义rgb数组\n // eslint-disable-next-line no-useless-escape\n if (/^\\#[0-9A-F]{3}$/i.test(hex)) {\n let sixHex = '#'\n hex.replace(/[0-9A-F]/ig, function (kw) {\n sixHex += kw + kw\n })\n hex = sixHex\n }\n if (/^#[0-9A-F]{6}$/i.test(hex)) {\n hex.replace(/[0-9A-F]{2}/ig, function (kw) {\n rgb.push(parseInt(kw, 16))\n })\n return `rgba(${rgb.join(',')}, ${alpha})`\n } else {\n return 'rgba(255, 255, 255, 0.1)'\n }\n}\n\n/**\n *\n * @returns { HTMLElement | null }\n */\nutil.getFullScreenEl = function () {\n return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsFunction = function (fun) {\n return fun && typeof fun === 'function'\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsObject = function (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * @param { HTMLElement }\n */\nutil.hide = function (dom) {\n dom.style.display = 'none'\n}\n\n/**\n * @param { HTMLElement }\n * @param { block | flex | inline-block | inline-flex } [display]\n */\nutil.show = function (dom, display) {\n dom.style.display = display || 'block'\n}\n\n/**\n *\n * @param { any } val\n * @returns { boolean }\n */\nutil.isUndefined = function (val) {\n if (typeof val === 'undefined' || val === null) {\n return true\n }\n}\n\nutil.isNotNull = function (val) {\n return !(val === undefined || val === null)\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } [text]\n * @returns\n */\nutil.setStyleFromCsstext = function (dom, text) {\n // dom.setAttribute(style, text)\n if (!text) {\n return\n }\n if (util.typeOf(text) === 'String') {\n const styleArr = text.replace(/\\s+/g, '').split(';')\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n dom.style[arr[0]] = arr[1]\n }\n }\n })\n } else {\n Object.keys(text).map(key => {\n dom.style[key] = text[key]\n })\n }\n}\n\n/**\n *\n * @param { string } key\n * @param { Array<any>} list\n * @returns { boolean }\n */\nfunction checkIsIn (key, list) {\n for (let i = 0, len = list.length; i < len; i++) {\n if (key.indexOf(list[i]) > -1) {\n return true\n }\n }\n return false\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { Array<string> } [list] attribute names to filter\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.filterStyleFromText = function (dom, list = ['width', 'height', 'top', 'left', 'bottom', 'right', 'position', 'z-index', 'padding', 'margin', 'transform']) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n const remain = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n if (checkIsIn(arr[0], list)) {\n ret[arr[0]] = arr[1]\n // dom.style[arr[0]] = 'initial'\n } else {\n remain[arr[0]] = arr[1]\n }\n }\n }\n })\n dom.setAttribute('style', '')\n Object.keys(remain).map(key => {\n // netStyle += `${key}: ${remain[key]};`\n dom.style[key] = remain[key]\n })\n return ret\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.getStyleFromCsstext = function (dom) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n ret[arr[0]] = arr[1]\n }\n }\n })\n return ret\n}\n\nutil.preloadImg = (url, onload = () => {}, onerror = () => {}) => {\n if (!url) {\n return\n }\n let img = new window.Image()\n img.onload = (e) => {\n img = null\n onload && onload(e)\n }\n img.onerror = (e) => {\n img = null\n onerror && onerror(e)\n }\n img.src = url\n}\n\nutil.stopPropagation = (e) => {\n if (e) {\n e.stopPropagation()\n }\n}\n\nutil.scrollTop = function () {\n return window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0\n}\n\nutil.scrollLeft = function () {\n return window.pageXOffset ||\n document.documentElement.scrollLeft ||\n document.body.scrollLeft ||\n 0\n}\n\nutil.checkTouchSupport = function () {\n return 'ontouchstart' in window\n}\n\nutil.getBuffered2 = (vbuffered, maxHoleDuration = 0.5) => { // ref: hls.js\n const buffered = []\n for (let i = 0; i < vbuffered.length; i++) {\n buffered.push({ start: vbuffered.start(i) < 0.5 ? 0 : vbuffered.start(i), end: vbuffered.end(i) })\n }\n buffered.sort(function (a, b) {\n const diff = a.start - b.start\n if (diff) {\n return diff\n } else {\n return b.end - a.end\n }\n })\n let buffered2 = []\n if (maxHoleDuration) {\n for (let i = 0; i < buffered.length; i++) {\n const buf2len = buffered2.length\n if (buf2len) {\n const buf2end = buffered2[buf2len - 1].end\n if ((buffered[i].start - buf2end) < maxHoleDuration) {\n if (buffered[i].end > buf2end) {\n buffered2[buf2len - 1].end = buffered[i].end\n }\n } else {\n buffered2.push(buffered[i])\n }\n } else {\n buffered2.push(buffered[i])\n }\n }\n } else {\n buffered2 = buffered\n }\n return new XgplayerTimeRange(buffered2)\n}\n\n/**\n * @description css中有zoom的时候,位移会等比缩放,但是元素的宽高不会等比缩放,所以通过该api做统一\n * https://bugs.chromium.org/p/chromium/issues/detail?id=429140#c8\n * @param {Event} e\n * @param {number} zoom\n * @returns\n */\nutil.getEventPos = function (e, zoom = 1) {\n if (e.touches && e.touches.length > 0) {\n e = e.touches[0]\n }\n return {\n x: e.x / zoom,\n y: e.y / zoom,\n clientX: e.clientX / zoom,\n clientY: e.clientY / zoom,\n offsetX: e.offsetX / zoom,\n offsetY: e.offsetY / zoom,\n pageX: e.pageX / zoom,\n pageY: e.pageY / zoom\n }\n}\n\nutil.requestAnimationFrame = function (callback) {\n const _fun = window.requestAnimationFrame ||\n // Older versions Chrome/Webkit\n window.webkitRequestAnimationFrame ||\n\n // Firefox < 23\n window.mozRequestAnimationFrame ||\n\n // opera\n window.oRequestAnimationFrame ||\n\n // ie\n window.msRequestAnimationFrame\n if (_fun) {\n return _fun(callback)\n }\n}\n\nutil.getHostFromUrl = function (url) {\n if (util.typeOf(url) !== 'String') {\n return ''\n }\n const results = url.split('/') // 以“/”进行分割\n let domain = ''\n if (results.length > 3 && results[2]) {\n domain = results[2]\n }\n return domain\n}\n\nutil.cancelAnimationFrame = function (frameId) {\n const _fun = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.cancelRequestAnimationFrame\n _fun && _fun(frameId)\n}\n\n/**\n * @desc Check whether it is MediaSource start\n * @param { HTMLVideoElement | HTMLAudioElement | HTMLElement } video\n * @returns { boolean }\n */\nutil.isMSE = function (video) {\n if (video.media) {\n video = video.media\n }\n if (!video || !(video instanceof HTMLMediaElement)) {\n return false\n }\n return /^blob/.test(video.currentSrc) || /^blob/.test(video.src)\n}\n\nutil.isBlob = function (url) {\n return typeof url === 'string' && /^blob/.test(url)\n}\n\n/**\n * @param { number } did\n * @returns { string }\n */\nutil.generateSessionId = function (did = 0) {\n let d = new Date().getTime()\n try {\n did = parseInt(did)\n } catch (e) {\n did = 0\n }\n d += did\n if (window.performance && typeof window.performance.now === 'function') {\n d += parseInt(window.performance.now()) // use high-precision timer if available\n }\n const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (d + Math.random() * 16) % 16 | 0\n d = Math.floor(d / 16)\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16)\n })\n return uuid\n}\n\nutil.createEvent = function (eventName) {\n let event\n if (typeof window.Event === 'function') {\n event = new Event(eventName)\n } else {\n event = document.createEvent('Event')\n event.initEvent(eventName, true, true)\n }\n return event\n}\n\n/**\n * @description Adjust currentTime according to duration, when ended is true and currentTime is less than duration, or\n * currentTime is greater than duration, return duration\n * @param { number } time\n * @param { number } duration\n * @param { boolean } isEnded\n * @returns { number } Adjusted time\n */\nutil.adjustTimeByDuration = function (time, duration, isEnded) {\n if (!duration || !time) {\n return time\n }\n if (time > duration || (isEnded && time < duration)) {\n return duration\n }\n return time\n}\n\nutil.createPositionBar = function (className, root) {\n const dom = util.createDom(\n 'xg-bar',\n '',\n { 'data-index': -1 },\n className\n )\n root.appendChild(dom)\n return dom\n}\n\nutil.getTransformStyle = function (pos = { x: 0, y: 0, scale: 1, rotate: 0 }, transformValue = '') {\n const styles = {\n scale: `${pos.scale || 1}`,\n translate: `${pos.x || 0}%, ${pos.y || 0}%`,\n rotate: `${pos.rotate || 0}deg`\n }\n const stylesKeys = Object.keys(styles)\n\n // 只复写Transform中已知的函数,对于其他函数不修改。解决全屏或者rotate插件执行时,对于镜像插件的影响\n stylesKeys.forEach((key) => {\n const reg = new RegExp(`${key}\\\\([^\\\\(]+\\\\)`, 'g') // reg match: TransformFunc(values)\n const fn = `${key}(${styles[key]})`\n if (reg.test(transformValue)) {\n reg.lastIndex = -1\n transformValue = transformValue.replace(reg, fn)\n } else {\n transformValue += `${fn} `\n }\n })\n return transformValue\n}\n\n/**\n * @description 角度换算\n * @param {number} val\n * @returns {number}\n */\nutil.convertDeg = function (val) {\n if (Math.abs(val) <= 1) {\n return val * 360\n }\n return val % 360\n}\n\nutil.getIndexByTime = function (time, segments) {\n const _len = segments.length\n let _index = -1\n if (_len < 1) {\n return _index\n }\n if (time <= segments[0].end || _len < 2) {\n _index = 0\n } else if (time > segments[_len - 1].end) {\n _index = _len - 1\n } else {\n for (let i = 1; i < _len; i++) {\n if (time > segments[i - 1].end && time <= segments[i].end){\n _index = i\n break\n }\n }\n }\n return _index\n}\nutil.getOffsetCurrentTime = function (currentTime, segments, index = -1) {\n let _index = -1\n if (index >= 0 && index < segments.length) {\n _index = index\n } else {\n _index = util.getIndexByTime(currentTime, segments)\n }\n if (_index < 0) {\n return -1\n }\n const _len = segments.length\n const { start, end, cTime, offset } = segments[_index]\n if (currentTime < start) {\n return cTime\n } else if (currentTime >= start && currentTime <= end) {\n return currentTime - offset\n } else if (currentTime > end && _index >= _len - 1) {\n return end\n }\n return -1\n}\n\n/**\n *\n * @param {*} offsetTime\n * @param {*} segments\n * @returns\n */\nutil.getCurrentTimeByOffset = function (offsetTime, segments) {\n let _index = -1\n if (!segments || segments.length < 0) {\n return offsetTime\n }\n for (let i = 0; i < segments.length; i++) {\n if (offsetTime <= segments[i].duration) {\n _index = i\n break\n }\n }\n if (_index !== -1) {\n const { start } = segments[_index]\n if (_index - 1 < 0) {\n return start + offsetTime\n } else {\n return start + (offsetTime - segments[_index - 1].duration)\n }\n }\n return offsetTime\n}\n\nfunction isObject (value) {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\nfunction debounce (func, wait, options) {\n let lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime\n\n let lastInvokeTime = 0\n let leading = false\n let maxing = false\n let trailing = true\n\n // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.\n const useRAF = (!wait && wait !== 0 && typeof window.requestAnimationFrame === 'function')\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n wait = +wait || 0\n if (isObject(options)) {\n leading = !!options.leading\n maxing = 'maxWait' in options\n maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n\n function invokeFunc (time) {\n const args = lastArgs\n const thisArg = lastThis\n\n lastArgs = lastThis = undefined\n lastInvokeTime = time\n result = func.apply(thisArg, args)\n return result\n }\n\n function startTimer (pendingFunc, wait) {\n if (useRAF) {\n window.cancelAnimationFrame(timerId)\n return window.requestAnimationFrame(pendingFunc)\n }\n return setTimeout(pendingFunc, wait)\n }\n\n function cancelTimer (id) {\n if (useRAF) {\n return window.cancelAnimationFrame(id)\n }\n clearTimeout(id)\n }\n\n function leadingEdge (time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time\n // Start the timer for the trailing edge.\n timerId = startTimer(timerExpired, wait)\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result\n }\n\n function remainingWait (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n const timeWaiting = wait - timeSinceLastCall\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting\n }\n\n function shouldInvoke (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait))\n }\n\n function timerExpired () {\n const time = Date.now()\n if (shouldInvoke(time)) {\n return trailingEdge(time)\n }\n // Restart the timer.\n timerId = startTimer(timerExpired, remainingWait(time))\n }\n\n function trailingEdge (time) {\n timerId = undefined\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time)\n }\n lastArgs = lastThis = undefined\n return result\n }\n\n function cancel () {\n if (timerId !== undefined) {\n cancelTimer(timerId)\n }\n lastInvokeTime = 0\n lastArgs = lastCallTime = lastThis = timerId = undefined\n }\n\n function flush () {\n return timerId === undefined ? result : trailingEdge(Date.now())\n }\n\n function pending () {\n return timerId !== undefined\n }\n\n function debounced (...args) {\n const time = Date.now()\n const isInvoking = shouldInvoke(time)\n\n lastArgs = args\n lastThis = this\n lastCallTime = time\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime)\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = startTimer(timerExpired, wait)\n return invokeFunc(lastCallTime)\n }\n }\n if (timerId === undefined) {\n timerId = startTimer(timerExpired, wait)\n }\n return result\n }\n debounced.cancel = cancel\n debounced.flush = flush\n debounced.pending = pending\n return debounced\n}\n\nfunction throttle (func, wait, options) {\n let leading = true\n let trailing = true\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n return debounce(func, wait, {\n leading,\n trailing,\n maxWait: wait\n })\n}\n\n/**\n * @returns { string }\n */\nfunction getLang () {\n let lang = (document.documentElement.getAttribute('lang') || navigator.language || 'zh-cn').toLocaleLowerCase()\n if (lang === 'zh-cn') {\n lang = 'zh'\n }\n return lang\n}\n\nfunction checkIsCurrentVideo (element, playerId, key) {\n if (!element) {\n return\n }\n const pid = element.getAttribute(key)\n if (pid && pid === playerId && (element.tagName === 'VIDEO' || element.tagName === 'AUDIO')) {\n return true\n }\n return false\n}\n\nexport {\n util as default,\n checkIsCurrentVideo,\n debounce,\n throttle,\n getLang\n}\n","// eslint-disable-next-line no-undef\nimport version from './version'\nimport Util from './utils/util'\n/**\n * @typedef { import ('./player').default } Player\n */\n\nconst ERROR_TYPE_MAP = {\n 1: 'media',\n 2: 'media',\n 3: 'media',\n 4: 'media',\n 5: 'media',\n 6: 'media'\n}\n\nconst ERROR_MAP = {\n 1: 5101,\n 2: 5102,\n 3: 5103,\n 4: 5104,\n 5: 5105,\n 6: 5106\n}\n\nconst ErrorTypes = {\n network: {\n code: 1\n },\n mse: {\n code: 2\n },\n parse: {\n code: 3\n },\n format: {\n code: 4\n },\n decoder: {\n code: 5\n },\n runtime: {\n code: 6\n },\n timeout: {\n code: 7\n },\n drm: {\n code: 8\n },\n ad: {\n code: 9\n },\n other: {\n code: 1000\n }\n}\n\n/**\n * @typedef { {\n * playerVersion: string,\n * currentTime: number,\n * duration: number,\n * ended: boolean,\n * readyState: number,\n * networkState: number,\n * src: any,\n * errorType: string,\n * errorCode: number,\n * message: string,\n * mediaError?: {\n * code: number,\n * message?: string\n * },\n * originError?: any,\n * url?: any,\n * host?: string,\n * [propName: string]: any\n * } } IError\n */\n\n/**\n * @type { IError }\n */\nclass Errors {\n /**\n *\n * @param { Player } player\n * @param { {\n * errorType: string,\n * errorCode: number,\n * errorMessage: string,\n * originError: any,\n * ext: { [propName: string]: any; }\n * } } errorInfo\n * @returns\n */\n constructor (player, errorInfo = { errorType: '', errorCode: 0, errorMessage: '', originError: '', ext: {}, mediaError: null }) {\n const ERROR_TYPES = player && player.i18n ? player.i18n.ERROR_TYPES : null\n if (player.media) {\n const mediaError = errorInfo.mediaError ? errorInfo.mediaError : (player.media.error || {})\n const { duration, currentTime, ended, src, currentSrc } = player\n const { readyState, networkState } = player.media\n let _errc = errorInfo.errorCode || mediaError.code\n if (ERROR_MAP[_errc]) {\n _errc = ERROR_MAP[_errc]\n }\n const r = {\n playerVersion: version,\n currentTime,\n duration,\n ended,\n readyState,\n networkState,\n src: src || currentSrc,\n errorType: errorInfo.errorType,\n errorCode: _errc,\n message: errorInfo.errorMessage || mediaError.message,\n mediaError,\n originError: errorInfo.originError ? errorInfo.originError.stack : '',\n host: Util.getHostFromUrl(src || currentSrc)\n }\n errorInfo.ext && Object.keys(errorInfo.ext).map(key => {\n r[key] = errorInfo.ext[key]\n })\n return r\n } else {\n if (arguments.length > 1) {\n const r = {\n playerVersion: version,\n domain: document.domain\n }\n const arr = ['errorType', 'currentTime', 'duration', 'networkState', 'readyState', 'src', 'currentSrc', 'ended', 'errd', 'errorCode', 'mediaError']\n for (let i = 0; i < arguments.length; i++) {\n r[arr[i]] = arguments[i]\n }\n r.ex = ERROR_TYPES ? (ERROR_TYPES[arguments[0]] || {}).msg : ''// 补充信息\n return r\n }\n }\n }\n}\n\nexport {\n Errors as default,\n ErrorTypes,\n ERROR_TYPE_MAP\n}\n","export const PLAY = 'play'\nexport const PLAYING = 'playing'\nexport const ENDED = 'ended'\nexport const PAUSE = 'pause'\nexport const ERROR = 'error'\nexport const SEEKING = 'seeking'\nexport const SEEKED = 'seeked'\nexport const TIME_UPDATE = 'timeupdate'\nexport const WAITING = 'waiting'\nexport const CANPLAY = 'canplay'\nexport const CANPLAY_THROUGH = 'canplaythrough'\nexport const DURATION_CHANGE = 'durationchange'\nexport const VOLUME_CHANGE = 'volumechange'\nexport const LOADED_DATA = 'loadeddata'\nexport const LOADED_METADATA = 'loadedmetadata'\nexport const RATE_CHANGE = 'ratechange'\nexport const PROGRESS = 'progress'\nexport const LOAD_START = 'loadstart'\nexport const EMPTIED = 'emptied'\nexport const STALLED = 'stalled'\nexport const SUSPEND = 'suspend'\nexport const ABORT = 'abort'\n\n// player events\nexport const BUFFER_CHANGE = 'bufferedChange'\nexport const PLAYER_FOCUS = 'focus'\nexport const PLAYER_BLUR = 'blur'\nexport const READY = 'ready'\nexport const URL_NULL = 'urlNull'\nexport const AUTOPLAY_STARTED = 'autoplay_started'\nexport const AUTOPLAY_PREVENTED = 'autoplay_was_prevented'\nexport const COMPLETE = 'complete'\nexport const REPLAY = 'replay'\nexport const DESTROY = 'destroy'\nexport const URL_CHANGE = 'urlchange'\nexport const DOWNLOAD_SPEED_CHANGE = 'download_speed_change'\nexport const LEAVE_PLAYER = 'leaveplayer'\nexport const ENTER_PLAYER = 'enterplayer'\nexport const LOADING = 'loading'\n\n// screen change evnets\nexport const FULLSCREEN_CHANGE = 'fullscreen_change'\nexport const CSS_FULLSCREEN_CHANGE = 'cssFullscreen_change'\nexport const MINI_STATE_CHANGE = 'mini_state_change'\n\nexport const DEFINITION_CHANGE = 'definition_change'\nexport const BEFORE_DEFINITION_CHANGE = 'before_definition_change'\nexport const AFTER_DEFINITION_CHANGE = 'after_definition_change'\n\n// transmuxer events\nexport const SEI_PARSED = 'SEI_PARSED'\n\nexport const RETRY = 'retry'\n\n// 容器宽高变化\nexport const VIDEO_RESIZE = 'video_resize'\n\n// picture-in-picture状态变化\nexport const PIP_CHANGE = 'pip_change'\n\n// rotate change\nexport const ROTATE = 'rotate'\n\n// screenShot\nexport const SCREEN_SHOT = 'screenShot'\n\n// play next\nexport const PLAYNEXT = 'playnext'\n\nexport const SHORTCUT = 'shortcut'\n\nexport const XGLOG = 'xglog'\n\nexport const USER_ACTION = 'user_action'\n\nexport const RESET = 'reset'\n\nexport const SOURCE_ERROR = 'source_error'\n\nexport const SOURCE_SUCCESS = 'source_success'\n\nexport const SWITCH_SUBTITLE = 'switch_subtitle'\n\nexport const VIDEO_EVENTS = [\n 'play',\n 'playing',\n 'ended',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'timeupdate',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'durationchange',\n 'volumechange',\n 'loadeddata',\n 'loadedmetadata',\n 'ratechange',\n 'progress',\n 'loadstart',\n 'emptied',\n 'stalled',\n 'suspend',\n 'abort',\n 'lowdecode'\n]\n\nexport const STATS_EVENTS = {\n STATS_INFO: 'stats_info',\n STATS_DOWNLOAD: 'stats_download',\n STATS_RESET: 'stats_reset'\n}\n\nexport const FPS_STUCK = 'fps_stuck'","'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","import { EventEmitter } from 'eventemitter3'\n\n/**\n * @typedef { (Player) => ?boolean } IterateFunction\n */\n/**\n * @typedef { import('./player').default } Player\n */\n\n/**\n * global player instance memory\n * @type {{\n * [key:string]:\n * }}\n */\nconst store = {}\n\nlet instance = null\n/**\n * Design as a class so that can be inherited to enhance functionality\n */\nexport class InstManager extends EventEmitter {\n static getInstance () {\n instance ||= new InstManager()\n return instance\n }\n\n add (player) {\n if (!player) {\n return\n }\n store[player.playerId] = player\n\n // By default, the first one is active\n if (Object.keys(store).length === 1) {\n this.setActive(player.playerId, true)\n }\n }\n\n remove (player) {\n if (!player) {\n return\n }\n const isUserActive = player.isUserActive\n\n delete store[player.playerId]\n\n if (isUserActive) {\n // 暂时注释,有需求再打开\n // const keys = Object.keys(this.store)\n // if (keys.length > 0) {\n // this.setActive(keys[keys.length - 1], true)\n // }\n }\n }\n\n /**\n * @private\n * @param {IterateFunction} fn\n * @param {?boolean} endEarly\n */\n _iterate (fn, endEarly = false) {\n for (const key in store) {\n if (Object.prototype.hasOwnProperty.call(store, key)) {\n const player = store[key]\n\n if (endEarly) {\n if (fn(player)) {\n break\n }\n } else {\n fn(player)\n }\n }\n }\n }\n\n /**\n * @param {IterateFunction} fn\n */\n forEach (fn) {\n this._iterate(fn)\n }\n\n /**\n * Iterates over items of store, returning the first one\n * @param {IterateFunction} fn\n * @returns {Player}\n */\n find (fn) {\n let result = null\n\n this._iterate((player) => {\n const flag = fn(player)\n if (flag) {\n result = player\n }\n return flag\n }, true)\n\n return result\n }\n\n /**\n * @param {IterateFunction} fn\n * @returns {Player[]}\n */\n findAll (fn) {\n const results = []\n\n this._iterate((player) => {\n if (fn(player)) {\n results.push(player)\n }\n })\n\n return results\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n * @returns { number | null }\n */\n setActive (playerId, isActive = true) {\n if (!store[playerId]) {\n return\n }\n if (isActive) {\n this.forEach(inst => {\n if (playerId === inst.playerId) {\n inst.isUserActive = true\n inst.isInstNext = false\n } else {\n inst.isUserActive = false\n }\n })\n } else {\n store[playerId].isUserActive = isActive\n }\n return playerId\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | null }\n */\n getActiveId () {\n const keys = Object.keys(store)\n for (let i = 0; i < keys.length; i++) {\n const c = store[keys[i]]\n if (c && c.isUserActive) {\n return keys[i]\n }\n }\n return null\n }\n\n /**\n * 标记下一个实例\n * @param { number | string } playerId\n * @param { boolean } isNext\n * @returns { number | null }\n */\n setNext (playerId, isNext = true) {\n if (!store[playerId]) {\n return\n }\n if (isNext) {\n this.forEach(inst => {\n if (playerId === inst.playerId) {\n inst.isUserActive = false\n inst.isInstNext = true\n } else {\n inst.isInstNext = false\n }\n })\n } else {\n store[playerId].isInstNext = isNext\n }\n\n return playerId\n }\n}\n\n/**\n* Check whether there is a player instance in the current dom\n* @param {Element} root\n*/\nexport function checkPlayerRoot (root) {\n const keys = Object.keys(store)\n for (let i = 0; i < keys.length; i++) {\n const p = store[keys[i]]\n if (p.root === root) {\n return p\n }\n }\n return null\n}\n","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 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","/**\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 '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 isTizen = /(?:Tizen)/ig.test(ua) // Samsung Tizen TV\n const isWebOS = /(?:Web0S)/ig.test(ua) // LG TV\n const isAndroid = /(?:Android)/.test(ua)\n const isFireFox = /(?:Firefox)/.test(ua)\n const isIpad = /(?:iPad|PlayBook)/.test(ua) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)\n const isTablet =\n isIpad ||\n (isAndroid && !/(?:Mobile)/.test(ua)) ||\n (isFireFox && /(?:Tablet)/.test(ua))\n const isPhone = /(?:iPhone)/.test(ua) && !isTablet\n const isPc = !isPhone && !isAndroid && !isSymbian && !isTablet\n return {\n isTablet,\n isPhone,\n isIpad,\n isIos: isPhone || isIpad,\n isAndroid,\n isPc,\n isSymbian,\n isWindowsPhone,\n isFireFox,\n isTizen,\n isWebOS\n }\n },\n\n get osVersion () {\n if (typeof navigator === 'undefined') {\n return 0\n }\n const ua = navigator.userAgent\n let reg = ''\n // ios\n if (/(?:iPhone)|(?:iPad|PlayBook)/.test(ua)) {\n reg = VERSION_REG.ios\n // android\n } else {\n reg = VERSION_REG.android\n }\n const _match = reg ? reg.exec(ua) : []\n if (_match && _match.length >= 3) {\n const version = _match[2].split('.')\n return version.length > 0 ? parseInt(version[0]) : 0\n }\n return 0\n },\n\n get isWeixin () {\n if (typeof navigator === 'undefined') {\n return false\n }\n const reg = /(micromessenger)\\/([\\d.]+)/\n const match = reg.exec(navigator.userAgent.toLocaleLowerCase())\n if (match) {\n return true\n }\n return false\n },\n\n /**\n *\n * @returns {{\n * isSupport: boolean,\n * mime: string\n * }}\n */\n isSupportMP4 () {\n const result = {\n isSupport: false,\n mime: ''\n }\n if (typeof document === 'undefined') {\n return result\n }\n if (this.supportResult) {\n return this.supportResult\n }\n let a = document.createElement('video')\n if (typeof a.canPlayType === 'function') {\n H264_MIMETYPES.map((key) => {\n if (a.canPlayType(`video/mp4; codecs=\"${key}\"`) === 'probably') {\n result.isSupport = true\n result.mime += `||${key}`\n }\n })\n }\n this.supportResult = result\n a = null\n return result\n },\n\n /**\n * @description check is support MediaSource Extends\n * @param {string} [mime]\n * @returns { boolean }\n */\n isMSESupport (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n if (typeof MediaSource === 'undefined' || !MediaSource) return false\n try {\n return MediaSource.isTypeSupported(mime)\n } catch (error) {\n this._logger.error(mime, error)\n return false\n }\n },\n\n /**\n * Is HEVC Hardware decoding supported by current browser\n * @returns {boolean}\n */\n isHevcSupported () {\n if (typeof MediaSource === 'undefined' || !MediaSource.isTypeSupported) {\n return false\n }\n return (\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.1.6.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.2.4.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.3.E.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.4.10.L120.90\"')\n )\n },\n\n /**\n * @param { MediaDecodingConfiguration } info\n * @returns { Promise<MediaCapabilitiesDecodingInfo> }\n */\n probeConfigSupported (info) {\n const defaults = {\n supported: false,\n smooth: false,\n powerEfficient: false\n }\n if (!info || typeof navigator === 'undefined') {\n return Promise.resolve(defaults)\n }\n if (\n navigator.mediaCapabilities &&\n navigator.mediaCapabilities.decodingInfo\n ) {\n return navigator.mediaCapabilities.decodingInfo(info)\n } else {\n const videoConfig = info.video || {}\n const audioConfig = info.audio || {}\n try {\n const videoSupported = MediaSource.isTypeSupported(\n videoConfig.contentType\n )\n const audioSupported = MediaSource.isTypeSupported(\n audioConfig.contentType\n )\n\n return Promise.resolve({\n supported: videoSupported && audioSupported,\n smooth: false,\n powerEfficient: false\n })\n } catch (e) {\n return Promise.resolve(defaults)\n }\n }\n }\n}\n\nexport default sniffer\n","import EventEmitter from 'eventemitter3'\nimport Util from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Errors, { ERROR_TYPE_MAP } from './error'\nimport { URL_CHANGE, WAITING, VIDEO_EVENTS, SOURCE_ERROR, SOURCE_SUCCESS } from './events'\n/**\n * @typedef { import ('eventemitter3') } EventEmitter\n */\n/**\n * @typedef { {\n * duration: number,\n * currentTime: number,\n * muted: boolean,\n * defaultMuted: boolean,\n * volume: number,\n * playbackRate: number,\n * defaultPlaybackRate: number,\n * autoplay: boolean,\n * readonly paused: boolean,\n * readonly ended: boolean,\n * readonly networkState: number,\n * readonly readyState: number,\n * readonly seeking: boolean,\n * src: any,\n * play: Function,\n * pause: Function,\n * } } IMediaProxy\n */\n/**\n * @typedef { import ('./defaultConfig').IPlayerOptions } IPlayerOptions\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 /**\n * @param { IPlayerOptions } options\n */\n constructor (options) {\n super(options)\n /**\n * @type { boolean }\n * @private\n */\n this._hasStart = false\n /**\n * @type { number }\n * @private\n */\n this._currentTime = 0\n /**\n * @type { number }\n * @private\n */\n this._duration = 0\n /**\n * @type {{[propName: string]: any}}\n * @private\n */\n this._internalOp = {}\n /**\n * @type { boolean }\n * @private\n */\n this._lastMuted = false\n\n /**\n * @type {string}\n * 当前播放类型\n */\n this.vtype = 'MP4'\n\n /**\n * @type {number}\n * @private\n */\n this._rate = -1\n /**\n * @description 初始化时添加在video上的属性集合\n * @type { {[propName: string]: any } }\n */\n this.mediaConfig = Object.assign({}, {\n controls: false,\n autoplay: options.autoplay,\n playsinline: options.playsinline,\n 'x5-playsinline': options.playsinline,\n 'webkit-playsinline': options.playsinline,\n 'x5-video-player-fullscreen': options['x5-video-player-fullscreen'] || options.x5VideoPlayerFullscreen,\n 'x5-video-orientation': options['x5-video-orientation'] || options.x5VideoOrientation,\n airplay: options.airplay,\n 'webkit-airplay': options.airplay,\n tabindex: options.tabindex | 0,\n mediaType: options.mediaType || 'video',\n 'data-index': -1\n }, options.videoConfig, options.videoAttributes)\n /**\n * @description Compatible with WeChat webview\n * \"x5-playsinline' and 'x5-video-player-type' only one needs to exist\n * @doc https://x5.tencent.com/docs/video.html\n */\n const playerType = options['x5-video-player-type'] || options.x5VideoPlayerType\n if (Sniffer.isWeixin && Sniffer.os.isAndroid && playerType) {\n this.mediaConfig['x5-video-player-type'] = playerType\n delete this.mediaConfig.playsinline\n delete this.mediaConfig['webkit-playsinline']\n delete this.mediaConfig['x5-playsinline']\n }\n\n if (options.loop) {\n this.mediaConfig.loop = 'loop'\n }\n\n // Warning:一些移动端浏览器需要设置DOM属性,否则会导致非静音切换频地址后开播失败\n if (options.autoplayMuted && !Object.prototype.hasOwnProperty.call(this.mediaConfig, 'muted')) {\n this.mediaConfig.muted = true\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n */\n this.media =\n options.mediaEl instanceof HTMLMediaElement\n ? options.mediaEl\n : typeof options.mediaEl === 'function'\n ? options.mediaEl(this.mediaConfig)\n : 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 // Warning:一些移动端浏览器(Like Vivo)需要直接设置JS属性,否则会导致失效\n if (options.playsinline) {\n this.media.playsinline = true\n }\n\n /**\n * @private\n */\n this._interval = {}\n /**\n * @readonly\n */\n this.mediaEventMiddleware = {}\n this.attachVideoEvents()\n }\n\n /**\n * @description set middleware\n * @param { {[propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n setEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n this.mediaEventMiddleware[key] = middlewares[key]\n })\n }\n\n /**\n * @description remove middleware\n * @param { { [propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n removeEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n delete this.mediaEventMiddleware[key]\n })\n }\n\n /**\n * Add media eventListener to the video object\n * @param { any } [media]\n */\n attachVideoEvents (media = this.media) {\n if (!this._evHandlers) {\n /**\n * @private\n */\n this._evHandlers = VIDEO_EVENTS.map(eventKey => {\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.on(eventKey, this[funName])\n }\n\n return {\n [eventKey]: getVideoEventHandler(eventKey, this)\n }\n })\n }\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n media.addEventListener(eventKey, item[eventKey], false)\n })\n }\n\n /**\n * @description remove media eventListener from the video object\n * @param { any } [media]\n */\n detachVideoEvents (media = this.media) {\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n media.removeEventListener(eventKey, item[eventKey], false)\n })\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.off(eventKey, this[funName])\n }\n })\n\n this._evHandlers = null\n }\n\n /**\n * 针对source列表播放方式添加错误监听\n * @doc https://stackoverflow.com/questions/47557135/html5-detect-the-type-of-error-when-trying-to-load-a-video-using-a-source-elem\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n * @param { Array<{src: string, type: string }>} urls\n */\n _attachSourceEvents (video, urls) {\n video.removeAttribute('src')\n video.load()\n urls.forEach((item, index) => {\n this.media.appendChild(Util.createDom('source', '', {\n src: `${item.src}`,\n type: `${item.type || ''}`,\n 'data-index': index + 1\n }))\n })\n const _c = video.children\n if (!_c) {\n return\n }\n /**\n * @private\n */\n this._videoSourceCount = _c.length\n\n this._videoSourceIndex = _c.length\n\n this._vLoadeddata = (e) => {\n this.emit(SOURCE_SUCCESS, { src: e.target.currentSrc, host: Util.getHostFromUrl(e.target.currentSrc) })\n }\n\n /**\n * @private\n */\n let _eHandler = null\n\n for (let i = 0; i < this._evHandlers.length; i++) {\n if (Object.keys(this._evHandlers[i])[0] === 'error') {\n _eHandler = this._evHandlers[i]\n break\n }\n }\n // safari有些版本不是所有source都请求,导致单独使用_videoSourceIndex计算会报错\n !this._sourceError && (this._sourceError = (e) => {\n const _dIndex = parseInt(e.target.getAttribute('data-index'), 10)\n this._videoSourceIndex--\n if (this._videoSourceIndex === 0 || _dIndex >= this._videoSourceCount) {\n const _err = { code: 4, message: 'sources_load_error' }\n _eHandler ? _eHandler.error(e, _err) : this.errorHandler('error', _err)\n }\n const type = ERROR_TYPE_MAP[4]\n this.emit(SOURCE_ERROR, new Errors(this, {\n errorType: type,\n errorCode: 4,\n errorMessage: 'sources_load_error',\n mediaError: { code: 4, message: 'sources_load_error' },\n src: e.target.src\n }))\n })\n for (let i = 0; i < _c.length; i++) {\n _c[i].addEventListener('error', this._sourceError)\n }\n video.addEventListener('loadeddata', this._vLoadeddata)\n }\n\n /**\n * 移除source列表错误事件监听\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n */\n _detachSourceEvents (video) {\n const _c = video.children\n if (!_c || _c.length === 0 || !this._sourceError) {\n return\n }\n for (let i = 0; i < _c.length; i++) {\n _c[i].removeEventListener('error', this._sourceError)\n }\n while (_c.length > 0) {\n video.removeChild(_c[0])\n }\n this._vLoadeddata && video.removeEventListener('loadeddata', this._vLoadeddata)\n }\n\n /**\n * @description Media Error handler\n * @param { string } eventName\n */\n errorHandler (name, error = null) {\n if (this.media && (this.media.error || error)) {\n let _e = this.media.error || error\n const type = _e.code ? ERROR_TYPE_MAP[_e.code] : 'other'\n let message = _e.message\n if (!(this.media.currentSrc || this.media.srcObject)) {\n message = 'empty_src'\n _e = {\n code: 6,\n message\n }\n }\n this.emit(name, new Errors(this, {\n errorType: type,\n errorCode: _e.code,\n errorMessage: _e.message || '',\n mediaError: _e\n }))\n }\n }\n\n destroy () {\n if (this.media) {\n if (this.media.pause) {\n this.media.pause()\n this.media.muted = true\n }\n this.media.removeAttribute('src') // empty source\n this.media.load()\n }\n this._currentTime = 0\n this._duration = 0\n this.mediaConfig = null\n for (const k in this._interval) {\n if (Object.prototype.hasOwnProperty.call(this._interval, k)) {\n clearInterval(this._interval[k])\n this._interval[k] = null\n }\n }\n this.detachVideoEvents()\n this.media = null\n this.mediaEventMiddleware = {}\n this.removeAllListeners()\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media\n */\n get video () {\n return this.media\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media= xx\n */\n set video (media) {\n this.media = media\n }\n\n /**\n *\n * @returns { Promise<void> | null }\n */\n play () {\n const ret = this.media ? this.media.play() : null\n return ret\n }\n\n pause () {\n this.media && this.media.pause()\n }\n\n load () {\n this.media && this.media.load()\n }\n\n /**\n *\n * @param { string } type\n * @returns { boolean }\n */\n canPlayType (type) {\n return this.media ? this.media.canPlayType(type) : false\n }\n\n /**\n *\n * @param { any } [buffered]\n * @returns { Array<number> }\n */\n getBufferedRange (buffered) {\n const range = [0, 0]\n if (!this.media) {\n return range\n }\n if (!buffered) {\n buffered = this.media.buffered\n }\n const currentTime = this.media.currentTime\n if (buffered) {\n for (let i = 0, len = buffered.length; i < len; i++) {\n range[0] = buffered.start(i)\n range[1] = buffered.end(i)\n if (range[0] <= currentTime && currentTime <= range[1]) {\n break\n }\n }\n }\n if (range[0] - currentTime <= 0 && currentTime - range[1] <= 0) {\n return range\n } else {\n return [0, 0]\n }\n }\n\n /**\n * @type { boolean }\n * @description 设置/返回 自动播放属性\n */\n set autoplay (isTrue) {\n this.media && (this.media.autoplay = isTrue)\n }\n\n get autoplay () {\n return this.media ? this.media.autoplay : false\n }\n\n /**\n * @type { TimeRanges | null }\n * @description 返回当前缓冲的TimeRange对象集合\n */\n get buffered () {\n return this.media ? this.media.buffered : null\n }\n\n /**\n * @type { Array<{start: number, end: number}> | null}\n * @description 返回当前自定义的缓存列表\n */\n get buffered2 () {\n return this.media && this.media.buffered ? Util.getBuffered2(this.media.buffered) : null\n }\n\n /**\n * @type { {start: number, end: number} }\n */\n get bufferedPoint () {\n const ret = {\n start: 0,\n end: 0\n }\n if (!this.media) {\n return ret\n }\n const _buffered = this.media.buffered\n if (!_buffered || _buffered.length === 0) {\n return ret\n }\n for (let i = 0; i < _buffered.length; i++) {\n if ((_buffered.start(i) <= this.currentTime || _buffered.start(i) < 0.1) && _buffered.end(i) >= this.currentTime) {\n return {\n start: _buffered.start(i),\n end: _buffered.end(i)\n }\n }\n }\n return ret\n }\n\n /**\n * @type { string}\n * @description 设置/返回是否跨域\n * */\n get crossOrigin () {\n return this.media ? this.media.crossOrigin : ''\n }\n\n set crossOrigin (isTrue) {\n this.media && (this.media.crossOrigin = isTrue)\n }\n\n /**\n * @type { string }\n * @description 设置/返回视频播放地址\n * */\n get currentSrc () {\n return this.media ? this.media.currentSrc : ''\n }\n\n set currentSrc (src) {\n this.media && (this.media.currentSrc = src)\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频当前播放时间\n * */\n get currentTime () {\n if (!this.media) {\n return 0\n }\n return this.media.currentTime !== undefined ? this.media.currentTime : this._currentTime\n }\n\n set currentTime (time) {\n this.media && (this.media.currentTime = time)\n }\n\n /**\n * @type { boolean }\n * 设置/返回视频默认静音\n * */\n get defaultMuted () {\n return this.media ? this.media.defaultMuted : false\n }\n\n set defaultMuted (isTrue) {\n this.media && (this.media.defaultMuted = isTrue)\n }\n\n /**\n * @type { number }\n * @description 返回视频时长,单位:s\n * */\n get duration () {\n return this._duration\n }\n\n /**\n * @type { boolean }\n * @description 回视频是否播放结束\n * */\n get ended () {\n return this.media ? this.media.ended : false\n }\n\n /**\n * @type { MediaError }\n * @description the player current error\n */\n get error () {\n return this.media.error\n }\n\n /**\n * @type { string }\n * @description return error description text\n */\n get errorNote () {\n const err = this.media.error\n if (!err) {\n return ''\n }\n const status = [\n 'MEDIA_ERR_ABORTED',\n 'MEDIA_ERR_NETWORK',\n 'MEDIA_ERR_DECODE',\n 'MEDIA_ERR_SRC_NOT_SUPPORTED'\n ]\n return status[this.media.error.code - 1]\n }\n\n /**\n * @type { boolean }\n * @description 否开启了循环播放\n */\n get loop () {\n return this.media ? this.media.loop : false\n }\n\n set loop (isTrue) {\n this.media && (this.media.loop = isTrue)\n }\n\n /**\n * @type { boolean }\n * @description 静音\n */\n get muted () {\n return this.media ? this.media.muted : false\n }\n\n set muted (isTrue) {\n if (!this.media || this.media.muted === isTrue) {\n return\n }\n this._lastMuted = this.media.muted\n this.media.muted = isTrue\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 }\n * @description 返回视频的当前网络状态\n */\n get networkState () {\n return this.media.networkState\n }\n\n /**\n * @type { boolean }\n * @description 回当前视频是否是暂停状态\n */\n get paused () {\n return this.media ? this.media.paused : true\n }\n\n /**\n * @type { number }\n * @description 返回/设置倍速\n */\n get playbackRate () {\n return this.media ? this.media.playbackRate : 0\n }\n\n set playbackRate (rate) {\n if (!this.media || rate === Infinity) {\n return\n }\n this.media.defaultPlaybackRate = rate\n this.media.playbackRate = rate\n }\n\n /**\n * @type { TimeRanges | null}\n */\n get played () {\n return this.media ? this.media.played : null\n }\n\n /**\n * @type { boolean }\n */\n get preload () {\n return this.media ? this.media.preload : false\n }\n\n set preload (isTrue) {\n this.media && (this.media.preload = isTrue)\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 | 4 }\n * @description 回视频的就绪状态\n */\n get readyState () {\n return this.media.readyState\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否可以seek\n */\n get seekable () {\n return this.media ? this.media.seekable : false\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否处于seeking状态下\n */\n get seeking () {\n return this.media ? this.media.seeking : false\n }\n\n /**\n * @type { any }\n * @description 设置/返回当前视频的地址\n */\n get src () {\n return this.media ? this.media.src : ''\n }\n\n set src (url) {\n if (!this.media) {\n return\n }\n this.emit(URL_CHANGE, url)\n this.emit(WAITING)\n // this.media.pause()\n this._currentTime = 0\n this._duration = 0\n // Some firefox versions firefox Cannot recognize currentSrc of type Blob\n if (Util.isMSE(this.media) || this.media.srcObject) {\n this.onWaiting()\n return\n }\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array') {\n this._attachSourceEvents(this.media, url)\n } else if (url) {\n this.media.src = url\n } else {\n this.media.removeAttribute('src')\n }\n this.load()\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频的音量\n */\n get volume () {\n return this.media ? this.media.volume : 0\n }\n\n set volume (vol) {\n if (vol === Infinity || !this.media) {\n return\n }\n this.media.volume = vol\n }\n\n /**\n * @type { number }\n * @description 返回视频的纵横比\n */\n get aspectRatio () {\n return this.media ? this.media.videoWidth / this.media.videoHeight : 0\n }\n\n addInnerOP (event) {\n this._internalOp[event] = true\n }\n\n removeInnerOP (event) {\n delete this._internalOp[event]\n }\n /** ******************* 以下api只有申明作用,具体实现依赖EventEmitter ******************/\n\n /**\n * @param { string } event\n * @param { any } [data]\n * @returns\n */\n emit (event, data, ...args) {\n super.emit(event, data, ...args)\n }\n\n /**\n * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n on (event, callback, ...args) {\n super.on(event, callback, ...args)\n }\n\n /**\n * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n once (event, callback, ...args) {\n super.once(event, callback, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n off (event, callback, ...args) {\n super.off(event, callback, ...args)\n }\n\n offAll () {\n super.removeAllListeners()\n }\n}\n\nexport default MediaProxy\n","class INDEXDB {\n constructor (mydb = { name: 'xgplayer', version: 1, db: null, ojstore: { name: 'xg-m4a', keypath: 'vid' } }) {\n this.indexedDB = window.indexedDB || window.webkitindexedDB\n this.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange // 键范围\n this.myDB = mydb\n }\n\n openDB (callback) {\n // 建立或打开数据库,建立对象存储空间(ObjectStore)\n const self = this\n const version = this.myDB.version || 1\n const request = self.indexedDB.open(self.myDB.name, version)\n request.onerror = function (e) {\n // console.log('e.currentTarget.error.message')\n }\n request.onsuccess = e => {\n this.myDB.db = e.target.result\n // console.log('成功建立并打开数据库:' + this.myDB.name + ' version' + this.myDB.version)\n callback.call(self)\n }\n request.onupgradeneeded = e => {\n const db = e.target.result\n // eslint-disable-next-line no-unused-vars\n const transaction = e.target.transaction\n // eslint-disable-next-line no-unused-vars\n let store\n if (!db.objectStoreNames.contains(self.myDB.ojstore.name)) {\n // 没有该对象空间时创建该对象空间\n // eslint-disable-next-line no-unused-vars\n store = db.createObjectStore(self.myDB.ojstore.name, { keyPath: self.myDB.ojstore.keypath })\n // console.log('成功建立对象存储空间:' + this.myDB.ojstore.name)\n }\n }\n }\n\n deletedb () {\n // 删除数据库\n const self = this\n self.indexedDB.deleteDatabase(this.myDB.name)\n // console.log(this.myDB.name + '数据库已删除')\n }\n\n closeDB () {\n // 关闭数据库\n this.myDB.db.close()\n // console.log('数据库已关闭')\n }\n\n addData (storename, data) {\n // 添加数据,重复添加会报错\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.add(data[i])\n request.onerror = function () {\n // console.error('add添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('add添加数据已存入数据库')\n }\n }\n }\n\n putData (storename, data) {\n // 添加数据,重复添加会更新原有数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.put(data[i])\n request.onerror = function () {\n // console.error('put添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('put添加数据已存入数据库')\n }\n }\n }\n\n getDataByKey (storename, key, callback) {\n const self = this\n // 根据存储空间的键找到对应数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n const request = store.get(key)\n request.onerror = function () {\n // console.error('getDataByKey error')\n callback.call(self, null)\n }\n request.onsuccess = function (e) {\n const result = e.target.result\n // console.log('查找数据成功')\n callback.call(self, result)\n }\n }\n\n deleteData (storename, key) {\n // 删除某一条记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.delete(key)\n // console.log('已删除存储空间' + storename + '中' + key + '记录')\n }\n\n clearData (storename) {\n // 删除存储空间全部记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.clear()\n // console.log('已删除存储空间' + storename + '全部记录')\n }\n}\n\nexport default INDEXDB\n","export const FULLSCREEN_EVENTS = ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange']\n\nexport const GET_FULLSCREEN_API = ['requestFullscreen', 'webkitRequestFullscreen', 'mozRequestFullScreen', 'msRequestFullscreen']\n\nexport const EXIT_FULLSCREEN_API = ['exitFullscreen', 'webkitExitFullscreen', 'mozCancelFullScreen', 'msExitFullscreen']\n\nexport const PLATER_ID = 'data-xgplayerid'","function callHandler (obj, handler, next, ...args) {\n const ret = handler.call(obj, ...args)\n if (!next || typeof next !== 'function') {\n return\n }\n if (ret && ret.then) {\n ret.then((...args) => {\n next.call(obj, ...args)\n })\n } else {\n next.call(obj, ...args)\n }\n}\n\n/**\n * 给某个处理函数添加hook能力\n * @param { string } hookName\n * @param { Function } handler\n * @param { { pre?: any, next?:any } } preset\n * {\n * pre: () => { // run beafore hook},\n * next: () => { // run after hook return}\n * }\n */\nfunction hook (hookName, handler, preset = { pre: null, next: null }) {\n if (!this.__hooks) {\n this.__hooks = {}\n }\n !this.__hooks[hookName] && (this.__hooks[hookName] = null)\n return function () {\n if (preset.pre) {\n try {\n preset.pre.call(this, ...arguments)\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}:pre error] >> ${e.message}`\n throw e\n }\n }\n if (this.__hooks && this.__hooks[hookName]) {\n try {\n const preRet = runHooks(this, hookName, handler)\n if (preRet) {\n if (preRet.then) {\n preRet.then((isContinue) => {\n if (isContinue !== false) {\n callHandler(this, handler, preset.next, ...arguments)\n // handler.call(this, ...arguments)\n }\n }).catch(e => {\n throw e\n })\n } else {\n callHandler(this, handler, preset.next, ...arguments)\n // handler.call(this, ...arguments)\n }\n } else if (preRet === undefined) {\n callHandler(this, handler, preset.next, ...arguments)\n }\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}] >> ${e.message}`\n throw e\n }\n } else {\n callHandler(this, handler, preset.next, ...arguments)\n }\n }.bind(this)\n}\n\nfunction findHookIndex (hookName, handler) {\n const { __hooks } = this\n if (!__hooks || !Array.isArray(__hooks[hookName])) {\n return -1\n }\n const hookHandlers = __hooks[hookName]\n for (let i = 0; i < hookHandlers.length; i++) {\n if (hookHandlers[i] === handler) {\n return i\n }\n }\n return -1\n}\n\n/**\n * add hooks\n * @param { string } hookName\n * @param { Function } handler\n */\nfunction useHooks (hookName, handler) {\n const { __hooks } = this\n if (!__hooks) {\n return\n }\n // eslint-disable-next-line no-prototype-builtins\n if (!__hooks.hasOwnProperty(hookName)) {\n console.warn(`has no supported hook which name [${hookName}]`)\n return false\n }\n if (!Array.isArray(__hooks[hookName])) {\n __hooks[hookName] = []\n }\n\n if (findHookIndex.call(this, hookName, handler) === -1) {\n __hooks[hookName].push(handler)\n }\n return true\n}\n\n/**\n * remove hook\n * @param { string } hookName\n * @param { (plugin: any, ..args) => {} } handler\n * @returns void\n */\nfunction removeHooks (hookName, handler) {\n const { __hooks } = this\n if (!__hooks) {\n return\n }\n\n if (Array.isArray(__hooks[hookName])) {\n const hooks = __hooks[hookName]\n const index = findHookIndex.call(this, hookName, handler)\n\n if (index !== -1) {\n hooks.splice(index, 1)\n }\n } else if (__hooks[hookName]) {\n __hooks[hookName] = null\n // delete __hooks[hookName]\n }\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 && Array.isArray(obj.__hooks[hookName])) {\n const hooks = obj.__hooks[hookName]\n let index = -1\n /**\n * @private\n */\n const runHooksRecursive = function (obj, hookName, handler, ...args) {\n index++\n // 递归终止条件\n if (hooks.length === 0 || index === hooks.length) {\n return handler.call(obj, obj, ...args)\n }\n // 递归调用\n const hook = hooks[index]\n const ret = hook.call(obj, obj, ...args)\n if (ret && ret.then) {\n return ret.then((data) => {\n return data === false ? null : runHooksRecursive(obj, hookName, handler, ...args)\n }).catch(e => {\n console.warn(`[runHooks]${hookName} reject`, e.message)\n })\n } else if (ret !== false) {\n return runHooksRecursive(obj, hookName, handler, ...args)\n }\n }\n\n return runHooksRecursive(obj, hookName, handler, ...args)\n } else {\n return handler.call(obj, obj, ...args)\n }\n}\n\nexport {\n hooksDescriptor as default,\n hook,\n useHooks,\n usePluginHooks,\n removePluginHooks,\n removeHooks,\n delHooksDescriptor,\n runHooks\n}\n","import Util from '../utils/util'\nimport Sniffer from '../utils/sniffer'\nimport Errors from '../error'\nimport * as Events from '../events'\nimport XG_DEBUG from '../utils/debug'\nimport hooksDescriptor, { hook, useHooks, removeHooks, delHooksDescriptor } from './hooksDescriptor'\n\nfunction showErrorMsg (pluginName, msg) {\n XG_DEBUG.logError(`[${pluginName}] event or callback cant be undefined or null when call ${msg}`)\n}\n\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef { import ('../defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * [propName: string]: any;\n * }} IBasePluginOptions\n */\nclass BasePlugin {\n static defineGetterOrSetter (Obj, map) {\n for (const key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key)) {\n Object.defineProperty(Obj, key, map[key])\n }\n }\n }\n static defineMethod (Obj, map) {\n for (const key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key) && typeof map[key] === 'function') {\n Object.defineProperty(Obj, key, {\n configurable: true,\n value: map[key]\n })\n }\n }\n }\n\n /**\n * @type { { [propName: string]: any } }\n */\n static get defaultConfig () {\n return {}\n }\n\n /**\n * @type { string }\n */\n static get pluginName () {\n return 'pluginName'\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n constructor (args) {\n if (Util.checkIsFunction(this.beforeCreate)) {\n this.beforeCreate(args)\n }\n hooksDescriptor(this)\n /**\n * @private\n */\n this.__args = args\n /**\n * @private\n */\n this.__events = {} // 对player的事件监听缓存\n this.__onceEvents = {}\n this.config = args.config || {}\n /**\n * @readonly\n * @type { Player }\n */\n this.player = null\n /**\n * @readonly\n * @type { IPlayerOptions }\n */\n this.playerConfig = {}\n /**\n * @readonly\n * @type {string}\n */\n this.pluginName = ''\n this.__init(args)\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n beforeCreate (args) {}\n afterCreate () {}\n beforePlayerInit () {}\n onPluginsReady () {}\n afterPlayerInit () {}\n destroy () {}\n\n /**\n * @protected\n * @param { any } args\n */\n __init (args) {\n this.player = args.player\n this.playerConfig = args.player && args.player.config\n this.pluginName = args.pluginName ? args.pluginName.toLowerCase() : this.constructor.pluginName.toLowerCase()\n this.logger = args.player && args.player.logger\n // BasePlugin.defineGetterOrSetter(this, {\n // player: {\n // get: () => {\n // return args.player\n // },\n // configurable: true\n // },\n // playerConfig: {\n // get: () => {\n // return args.player && args.player.config\n // },\n // configurable: true\n // },\n\n // pluginName: {\n // get: () => {\n // if (args.pluginName) {\n // return args.pluginName.toLowerCase()\n // } else {\n // return this.constructor.pluginName.toLowerCase()\n // }\n // },\n // configurable: true\n // },\n // logger: {\n // get: () => {\n // return args.player.logger\n // },\n // configurable: true\n // }\n // })\n }\n\n /**\n * 更新语言\n * @param { string } lang\n */\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n }\n\n /**\n * @type { string }\n */\n get lang () {\n return this.player.lang\n }\n\n get i18n () {\n return this.player.i18n\n }\n\n get i18nKeys () {\n return this.player.i18nKeys\n }\n\n /**\n * @description当前支持的事件类型\n * @type { 'touch' | 'mouse' }\n */\n get domEventType () {\n let _e = Util.checkTouchSupport() ? 'touch' : 'mouse'\n if (this.playerConfig && (this.playerConfig.domEventType === 'touch' || this.playerConfig.domEventType === 'mouse')) {\n _e = this.playerConfig.domEventType\n }\n return _e\n }\n\n /**\n *\n * @param { string | Array<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\nconst PLUGIN_STATE_CLASS = {\n ICON_DISABLE: 'xg-icon-disable',\n ICON_HIDE: 'xg-icon-hide'\n}\n\n/**\n * Check if the url is a link address\n * @param { string } str\n */\nfunction isUrl (str) {\n if (!str) {\n return false\n }\n return str.indexOf && /^(?:http|data:|\\/)/.test(str)\n}\n\nfunction mergeIconClass (icon, classname) {\n if (typeof icon === 'object' && icon.class && typeof icon.class === 'string') {\n return `${classname} ${icon.class}`\n }\n return classname\n}\n\nfunction mergeIconAttr (icon, attr) {\n if (typeof icon === 'object' && icon.attr && typeof icon.attr === 'object') {\n Object.keys(icon.attr).map(key => {\n attr[key] = icon.attr[key]\n })\n }\n return attr\n}\n\nfunction createIcon (icon, key, classname = '', attr = {}, pluginName = '') {\n let newIcon = null\n if (icon instanceof window.Element) {\n Util.addClass(icon, classname)\n Object.keys(attr).map(key => {\n icon.setAttribute(key, attr[key])\n })\n return icon\n }\n\n if (isUrl(icon) || isUrl(icon.url)) {\n attr.src = isUrl(icon) ? icon : (icon.url || '')\n newIcon = Util.createDom(icon.tag || 'img', '', attr, `xg-img ${classname}`)\n return newIcon\n }\n\n if (typeof icon === 'function') {\n try {\n newIcon = icon()\n if (newIcon instanceof window.Element) {\n Util.addClass(newIcon, classname)\n Object.keys(attr).map(key => {\n newIcon.setAttribute(key, attr[key])\n })\n return newIcon\n } else {\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is a function mast return an Element Object`)\n }\n return null\n } catch (e) {\n XG_DEBUG.logError(`Plugin named [${pluginName}]:createIcon`, e)\n return null\n }\n }\n\n if (typeof icon === 'string') {\n return Util.createDomFromHtml(icon, attr, classname)\n }\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is invalid`)\n return null\n}\n\nfunction registerIconsObj (iconsConfig, plugin) {\n const _icons = plugin.config.icons || plugin.playerConfig.icons\n Object.keys(iconsConfig).map(key => {\n const orgIcon = iconsConfig[key]\n let classname = orgIcon && orgIcon.class ? orgIcon.class : ''\n let attr = orgIcon && orgIcon.attr ? orgIcon.attr : {}\n let newIcon = null\n if (_icons && _icons[key]) {\n classname = mergeIconClass(_icons[key], classname)\n attr = mergeIconAttr(_icons[key], attr)\n newIcon = createIcon(_icons[key], key, classname, attr, plugin.pluginName)\n }\n if (!newIcon && orgIcon) {\n newIcon = createIcon((orgIcon.icon ? orgIcon.icon : orgIcon), attr, classname, {}, plugin.pluginName)\n }\n plugin.icons[key] = newIcon\n })\n}\n\nfunction registerTextObj (textConfig, plugin) {\n Object.keys(textConfig).map((key) => {\n Object.defineProperty(plugin.langText, key, {\n get: () => {\n const { lang, i18n } = plugin\n if (i18n[key]) {\n return i18n[key]\n } else {\n return textConfig[key] ? (textConfig[key][lang] || '') : ''\n }\n }\n })\n })\n}\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * root?: HTMLElement,\n * position?: string,\n * [propName: string]: any\n * }} IPluginOptions\n*/\nclass Plugin extends BasePlugin {\n /**\n * 插入dom结构\n * @param { string | HTMLElement } html html字符串或者dom\n * @param { HTMLElement } parent\n * @param { number } index\n * @returns { HTMLElement }\n */\n static insert (html, parent, index = 0) {\n const len = parent.children.length\n const insertIdx = Number(index)\n const isDomElement = html instanceof window.Node\n\n if (len) {\n let i = 0\n let coordinate = null\n let mode = ''\n for (;i < len; i++) {\n coordinate = parent.children[i]\n const curIdx = Number(coordinate.getAttribute('data-index'))\n if (curIdx >= insertIdx) {\n mode = 'beforebegin'\n break\n } else if (curIdx < insertIdx) {\n mode = 'afterend'\n }\n }\n\n if (isDomElement) {\n if (mode === 'afterend') {\n // as last element\n parent.appendChild(html)\n } else {\n parent.insertBefore(html, coordinate)\n }\n } else {\n coordinate.insertAdjacentHTML(mode, html)\n }\n return mode === 'afterend' ? parent.children[parent.children.length - 1] : parent.children[i]\n } else {\n isDomElement ? parent.appendChild(html) : parent.insertAdjacentHTML('beforeend', html)\n return parent.children[parent.children.length - 1]\n }\n }\n\n static get defaultConfig () {\n return {}\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { string } querySelector\n * @param { string | Array<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 * @protected\n */\n __init (args) {\n super.__init(args)\n if (!args.root) {\n return\n }\n const _parent = args.root\n let _el = null\n /**\n * @readonly\n */\n this.icons = {}\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.root = null\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.parent = null\n\n const _orgicons = this.registerIcons() || {}\n registerIconsObj(_orgicons, this)\n /**\n * @readonly\n */\n this.langText = {}\n const defaultTexConfig = this.registerLanguageTexts() || {}\n registerTextObj(defaultTexConfig, this)\n let renderStr = ''\n try {\n renderStr = this.render()\n } catch (e) {\n XG_DEBUG.logError(`Plugin:${this.pluginName}:render`, e)\n throw (new Error(`Plugin:${this.pluginName}:render:${e.message}`))\n }\n if (renderStr) {\n _el = Plugin.insert(renderStr, _parent, args.index)\n _el.setAttribute('data-index', args.index)\n } else if (args.tag) {\n _el = Util.createDom(args.tag, '', args.attr, args.name)\n _el.setAttribute('data-index', args.index)\n _parent.appendChild(_el)\n } else {\n return\n }\n\n this.root = _el\n this.parent = _parent\n\n // Plugin.defineGetterOrSetter(this, {\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // root: {\n // get: () => {\n // return _el\n // },\n // configurable: true\n // },\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // parent: {\n // get: () => {\n // return _parent\n // },\n // configurable: true\n // }\n // })\n\n const attr = this.config.attr || {}\n const style = this.config.style || {}\n\n this.setAttr(attr)\n this.setStyle(style)\n if (this.config.index) {\n this.root.setAttribute('data-index', this.config.index)\n }\n this.__registerChildren()\n }\n\n /**\n * @private\n */\n __registerChildren () {\n if (!this.root) {\n return\n }\n /**\n * @private\n */\n this._children = []\n const children = this.children()\n if (children && typeof children === 'object') {\n if (Object.keys(children).length > 0) {\n Object.keys(children).map(item => {\n const name = item\n const _plugin = children[name]\n const options = {\n root: this.root\n }\n // eslint-disable-next-line no-unused-vars\n let config, Plugin\n if (typeof _plugin === 'function') {\n config = this.config[name] || {}\n Plugin = _plugin\n } else if (typeof _plugin === 'object' && typeof _plugin.plugin === 'function') {\n config = _plugin.options ? Util.deepCopy((this.config[name] || {}), _plugin.options) : (this.config[name] || {})\n Plugin = _plugin.plugin\n }\n options.config = config\n config.index !== undefined && (options.index = config.index)\n config.root && (options.root = config.root)\n this.registerPlugin(Plugin, options, name)\n })\n }\n }\n }\n\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n function checkChildren (node, callback) {\n for (let i = 0; i < node.children.length; i++) {\n if (node.children[i].children.length > 0) {\n checkChildren(node.children[i], callback)\n } else {\n callback(node.children[i])\n }\n }\n }\n const { root, i18n, langText } = this\n if (root) {\n checkChildren(root, (node) => {\n const langKey = node.getAttribute && node.getAttribute('lang-key')\n if (!langKey) {\n return\n }\n const langTextShow = i18n[langKey.toUpperCase()] || langText[langKey]\n if (langTextShow) {\n node.innerHTML = typeof langTextShow === 'function' ? langTextShow(lang) : langTextShow\n }\n })\n }\n }\n\n get lang () {\n return this.player.lang\n }\n\n changeLangTextKey (dom, key = '') {\n const i18n = this.i18n || {}\n const langText = this.langText\n dom.setAttribute && dom.setAttribute('lang-key', key)\n const text = i18n[key] || langText[key] || ''\n if (text) {\n dom.innerHTML = text\n }\n }\n\n plugins () {\n return this._children\n }\n\n /**\n *\n */\n disable () {\n this.config.disable = true\n Util.addClass(this.find('.xgplayer-icon'), PLUGIN_STATE_CLASS.ICON_DISABLE)\n }\n\n enable () {\n this.config.disable = false\n Util.removeClass(this.find('.xgplayer-icon'), PLUGIN_STATE_CLASS.ICON_DISABLE)\n }\n\n children () {\n return {}\n }\n\n registerPlugin (plugin, options = {}, name = '') {\n options.root = options.root || this.root\n const _c = super.registerPlugin(plugin, options, name)\n this._children.push(_c)\n return _c\n }\n\n registerIcons () {\n return {}\n }\n\n registerLanguageTexts () {\n return {}\n }\n\n /**\n *\n * @param { string } qs\n * @returns { HTMLElement | null }\n */\n find (qs) {\n if (!this.root) {\n return\n }\n return this.root.querySelector(qs)\n }\n\n /**\n * 绑定事件\n * @param { string | Array<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 PLUGIN_STATE_CLASS\n}\n","import { throttle } from '../utils/util'\nimport { PLATER_ID } from '../constant'\n/**\n * 添加\n */\nclass ResizeObserver {\n constructor () {\n this.__handlers = []\n this.timeStamp = 0\n this.observer = null\n if (!window.ResizeObserver) {\n return\n }\n try {\n this.observer = new window.ResizeObserver(throttle(this.__trigger, 100, { trailing: true }))\n this.timeStamp = new Date().getTime()\n } catch (e) {\n console.error(e)\n }\n }\n\n addObserver (target, handler) {\n if (!this.observer) {\n return\n }\n this.observer.observe(target)\n const _pid = target.getAttribute(PLATER_ID)\n const { __handlers } = this\n let index = -1\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n index = i\n }\n }\n if (index > -1) {\n this.__handlers[index].handler = handler\n } else {\n this.__handlers.push({\n target,\n handler: handler,\n playerId: _pid\n })\n }\n }\n\n unObserver (target) {\n let i = -1\n this.__handlers.map((item, index) => {\n if (target === item.target) {\n i = index\n }\n })\n try {\n this.observer?.unobserve(target)\n } catch (e) {}\n i > -1 && this.__handlers.splice(i, 1)\n }\n\n destroyObserver () {\n this.observer?.disconnect()\n this.observer = null\n this.__handlers = null\n }\n\n __runHandler (target) {\n const { __handlers } = this\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n try {\n __handlers[i].handler(target)\n } catch (error) {\n console.error(error)\n }\n return true\n }\n }\n return false\n }\n\n __trigger = (entries) => {\n const t = new Date().getTime()\n this.timeStamp = t\n for (let i = 0; i < entries.length; i++) {\n this.__runHandler(entries[i].target)\n }\n }\n}\n\n/**\n * @type {ResizeObserver | null}\n */\nlet resizeObserver = null\n\nfunction addObserver (target, handler) {\n if (!resizeObserver) {\n resizeObserver = new ResizeObserver()\n // window.___resizeObserver = resizeObserver\n }\n resizeObserver.addObserver(target, handler)\n return resizeObserver\n}\n\nfunction unObserver (target, handler) {\n resizeObserver?.unObserver(target, handler)\n}\n\nfunction destroyObserver (target, handler) {\n resizeObserver?.destroyObserver(target, handler)\n}\n\nexport {\n addObserver,\n unObserver,\n destroyObserver\n}\n","import { addObserver, unObserver } from './resizeObserver'\nimport Util from '../utils/util'\n\n/**\n* a plugins manager to register and search\n**/\n\nconst pluginsManager = {\n pluginGroup: {},\n init (player) {\n // mark every player instance by _pluginInfoId\n let cgid = player._pluginInfoId\n if (!cgid) {\n cgid = new Date().getTime()\n player._pluginInfoId = cgid\n }\n\n !player.config.closeResizeObserver && addObserver(player.root, () => {\n player.resize()\n })\n\n this.pluginGroup[cgid] = {\n _originalOptions: player.config || {},\n _plugins: {}\n }\n },\n\n formatPluginInfo (plugin, config) {\n let PLUFGIN = null\n let options = null\n if (plugin.plugin && typeof plugin.plugin === 'function') {\n PLUFGIN = plugin.plugin\n options = plugin.options\n } else {\n PLUFGIN = plugin\n options = {}\n }\n if (config) {\n options.config = config || {}\n }\n\n return {\n PLUFGIN,\n options\n }\n },\n\n /**\n * check the plugin if exits in plugins\n * @param {string} pluginName\n * @param { Array <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 = player\n\n const pluginName = options.pluginName || plugin.pluginName\n if (!pluginName) {\n throw new Error('The property pluginName is necessary')\n }\n\n if (plugin.isSupported && !plugin.isSupported(player.config.mediaType, player.config.codecType)) {\n console.warn(`not supported plugin [${pluginName}]`)\n return\n }\n\n if (!options.config) {\n options.config = {}\n }\n\n // get config items from player.config\n const keys = Object.keys(originalOptions)\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n const config = originalOptions[keys[i]]\n if (Util.typeOf(config) === 'Object') {\n options.config = Object.assign({}, options.config, originalOptions[keys[i]])\n } else if (Util.typeOf(config) === 'Boolean') {\n options.config.disable = !config\n }\n break\n }\n }\n\n // copy the default configuration items of the plugin\n if (plugin.defaultConfig) {\n Object.keys(plugin.defaultConfig).forEach(key => {\n if (typeof options.config[key] === 'undefined') {\n options.config[key] = plugin.defaultConfig[key]\n }\n })\n }\n\n // get the parent dom which added the plugin will be mounted\n if (!options.root) {\n options.root = player.root\n } else if (typeof options.root === 'string') {\n options.root = player[options.root]\n }\n\n options.index = options.config.index || 0\n try {\n // if there is already a plugin instance with the same pluginName, destroy it\n if (plugins[pluginName.toLowerCase()]) {\n this.unRegister(cgid, pluginName.toLowerCase())\n console.warn(`the is one plugin with same pluginName [${pluginName}] exist, destroy the old instance`)\n }\n // eslint-disable-next-line new-cap\n const _instance = new plugin(options)\n plugins[pluginName.toLowerCase()] = _instance\n plugins[pluginName.toLowerCase()].func = plugin\n if (_instance && typeof _instance.afterCreate === 'function') {\n _instance.afterCreate()\n }\n return _instance\n } catch (err) {\n console.error(err)\n throw (err)\n }\n },\n\n /**\n * Unregister a plugin from player instance\n * @param { string } cgid\n * @param { string } name\n */\n unRegister (cgid, name) {\n if (cgid._pluginInfoId) {\n cgid = cgid._pluginInfoId\n }\n name = name.toLowerCase()\n try {\n const plugin = this.pluginGroup[cgid]._plugins[name]\n if (plugin) {\n plugin.pluginName && plugin.__destroy()\n delete this.pluginGroup[cgid]._plugins[name]\n }\n } catch (e) {\n console.error(`[unRegister:${name}] cgid:[${cgid}] error`, e)\n }\n },\n\n /**\n * remove a plugin instance from the player plugin list\n * @param { any } player\n * @param { string } name\n */\n deletePlugin (player, name) {\n const cgid = player._pluginInfoId\n if (cgid && this.pluginGroup[cgid] && this.pluginGroup[cgid]._plugins) {\n delete this.pluginGroup[cgid]._plugins[name]\n }\n },\n\n /**\n * get all plugin instance of player\n * @param { any } player\n */\n getPlugins (player) {\n const cgid = player._pluginInfoId\n return cgid && this.pluginGroup[cgid] ? this.pluginGroup[cgid]._plugins : {}\n },\n\n findPlugin (player, name) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return null\n }\n const cName = name.toLowerCase()\n return this.pluginGroup[cgid]._plugins[cName]\n },\n\n beforeInit (player) {\n function retPromise (fun) {\n if (!fun || !fun.then) {\n return new Promise((resolve) => {\n resolve()\n })\n } else {\n return fun\n }\n }\n return new Promise((resolve) => {\n if (!this.pluginGroup) {\n return\n }\n\n let prevTask\n if (player._loadingPlugins && player._loadingPlugins.length) {\n prevTask = Promise.all(player._loadingPlugins)\n } else {\n prevTask = Promise.resolve()\n }\n\n return prevTask.then(() => {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n resolve()\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const pluginsRet = []\n Object.keys(plugins).forEach(pName => {\n if (plugins[pName] && plugins[pName].beforePlayerInit) {\n try {\n const ret = plugins[pName].beforePlayerInit()\n pluginsRet.push(retPromise(ret))\n } catch (e) {\n pluginsRet.push(retPromise(null))\n throw e\n }\n }\n })\n\n Promise.all([...pluginsRet]).then(() => {\n resolve()\n }).catch((e) => {\n console.error(e)\n resolve()\n })\n })\n })\n },\n\n afterInit (player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(pName => {\n if (plugins[pName] && plugins[pName].afterPlayerInit) {\n plugins[pName].afterPlayerInit()\n }\n })\n },\n\n setLang (lang, player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(item => {\n if (plugins[item].updateLang) {\n plugins[item].updateLang(lang)\n } else {\n // 兼容旧版本通过set lang更新语言的问题\n try {\n plugins[item].lang = lang\n } catch (error) {\n console.warn(`${item} setLang`)\n }\n }\n })\n },\n\n reRender (player) {\n const cgid = player._pluginInfoId\n\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const _pList = []\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(pName => {\n if (pName !== 'controls' && plugins[pName]) {\n _pList.push({\n plugin: plugins[pName].func,\n options: plugins[pName].__args\n })\n this.unRegister(cgid, pName)\n }\n })\n _pList.forEach(item => {\n this.register(player, item.plugin, item.options)\n })\n },\n\n onPluginsReady (player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins || {}\n Object.keys(plugins).forEach(key => {\n if (plugins[key].onPluginsReady && typeof plugins[key].onPluginsReady === 'function') {\n plugins[key].onPluginsReady()\n }\n })\n },\n\n destroy (player) {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n return\n }\n unObserver(player.root)\n const plugins = this.pluginGroup[cgid]._plugins\n for (const item of Object.keys(plugins)) {\n this.unRegister(cgid, item)\n }\n delete this.pluginGroup[cgid]\n delete player._pluginInfoId\n }\n}\n\nexport default pluginsManager\n","export default {\n DEFAULT: 'xgplayer',\n DEFAULT_SKIN: 'xgplayer-skin-default',\n ENTER: 'xgplayer-is-enter',\n PAUSED: 'xgplayer-pause',\n PLAYING: 'xgplayer-playing',\n ENDED: 'xgplayer-ended',\n CANPLAY: 'xgplayer-canplay',\n LOADING: 'xgplayer-isloading',\n ERROR: 'xgplayer-is-error',\n REPLAY: 'xgplayer-replay',\n NO_START: 'xgplayer-nostart',\n ACTIVE: 'xgplayer-active',\n INACTIVE: 'xgplayer-inactive',\n FULLSCREEN: 'xgplayer-is-fullscreen',\n CSS_FULLSCREEN: 'xgplayer-is-cssfullscreen',\n ROTATE_FULLSCREEN: 'xgplayer-rotate-fullscreen',\n PARENT_ROTATE_FULLSCREEN: 'xgplayer-rotate-parent',\n PARENT_FULLSCREEN: 'xgplayer-fullscreen-parent',\n INNER_FULLSCREEN: 'xgplayer-fullscreen-inner',\n NO_CONTROLS: 'no-controls',\n FLEX_CONTROLS: 'flex-controls',\n CONTROLS_FOLLOW: 'controls-follow',\n CONTROLS_AUTOHIDE: 'controls-autohide',\n TOP_BAR_AUTOHIDE: 'top-bar-autohide',\n NOT_ALLOW_AUTOPLAY: 'not-allow-autoplay',\n SEEKING: 'seeking',\n PC: 'xgplayer-pc',\n MOBILE: 'xgplayer-mobile',\n MINI: 'xgplayer-mini' // mini screen play status\n}\n","import { getLang } from './utils/util'\n\n/**\n * @typedef { string | MediaStream | Array<{src: string, type?:string, [propName: string]: any}> } IUrl\n */\n\n/**\n * @typedef {{\n * url: IUrl,\n * definition: any,\n * bitrate?: number,\n * bandwidth?: number,\n * text?: string | { [propName: string]: any },\n * iconText?: string | { [propName: string]: any },\n * [propName: string]: any\n * }} IDefinition\n */\n\n/**\n * @typedef { {\n * id?: string,\n * el?: HTMLElement,\n * mediaEl?: HTMLMediaElement | (mediaConfig: { [propName: string]: any }) => HTMLMediaElement,\n * url?: IUrl,\n * domEventType?: 'default' | 'touch' | 'mouse',\n * nullUrlStart?: boolean,\n * width?: number | string,\n * height?: number | string,\n * fluid?: boolean,\n * fitVideoSize?: 'fixWidth'|'fixHeight'|'fixed',\n * videoFillMode?: 'auto'|'fillHeight'|'fillWidth'|'fill'|'cover'|'contain',\n * volume?: number | { [propName: string]: any },\n * autoplay?: boolean,\n * autoplayMuted?: boolean,\n * loop?: boolean,\n * isLive?: boolean,\n * zoom?: number,\n * videoInit?: boolean,\n * poster?: string | { [propName: string]: any },\n * isMobileSimulateMode?: 'mobile' | 'pc',\n * defaultPlaybackRate?: number,\n * execBeforePluginsCall?: () => any,\n * allowSeekAfterEnded?: boolean,\n * enableContextmenu?: boolean,\n * closeVideoClick?: boolean,\n * closeVideoDblclick?: boolean,\n * closePlayerBlur?: boolean,\n * closeDelayBlur?: boolean,\n * leavePlayerTime?: number,\n * closePlayVideoFocus?: boolean,\n * closePauseVideoFocus?: boolean,\n * closeFocusVideoFocus?: boolean,\n * closeControlsBlur?: boolean,\n * topBarAutoHide?: boolean,\n * videoAttributes?: { [propName: string]: any },\n * startTime?: number,\n * seekedStatus?: 'play' | 'pause' | 'auto',\n * miniprogress?: boolean,\n * disableSwipeHandler?: () => any,\n * enableSwipeHandler?: () => any,\n * preProcessUrl?: (url: IUrl, ext?: { [propName: string]: any }) => { url: IUrl, [propName: string]: any },\n * ignores?: Array<'cssfullscreen' | 'screenshot' | 'pip' | 'miniscreen' | 'keyboard' | 'download' | 'playbackrate' | 'time' | 'definition' | 'error' | 'fullscreen' | 'loading' | 'mobile' | 'pc' | 'play' | 'poster' | 'progress' | 'replay' | 'start' | 'volume' | string>,\n * inactive?: number,\n * lang?: string,\n * controls?: boolean | { [propName: string]: any },\n * marginControls?: boolean,\n * fullscreenTarget?: HTMLElement, // 全屏作用的dom元素\n * screenShot?: boolean | { [propName: string]: any },\n * rotate?: boolean | { [propName: string]: any },\n * pip?: boolean | { [propName: string]: any },\n * download?: boolean | { [propName: string]: any },\n * mini?: boolean | { [propName: string]: any },\n * cssFullscreen?: boolean | { [propName: string]: any },\n * keyShortcut?: boolean,\n * presets?: any[],\n * plugins?: any[]\n * playbackRate?: boolean | Array<number> | { [propName: string]: any },\n * definition?: { list: Array<IDefinition> , defaultDefinition?: IDefinition['definition'], [propName: string]: any},\n * playsinline?: boolean,\n * customDuration?: number,\n * timeOffset?: number,\n * icons?: { [propName: string]: string | HTMLElement | () => HTMLElement | string },\n * i18n?: Array<any>,\n * tabindex?: number,\n * thumbnail?: {\n * urls: Array<string>,\n * pic_num: number,\n * col: number,\n * row: number,\n * height?: number,\n * width?: number,\n * },\n * videoConfig?: { [propName: string]: any },\n * isHideTips?: boolean,\n * minWaitDelay?: number,\n * commonStyle?: {\n * progressColor?: string,\n * playedColor?: string,\n * cachedColor?: string,\n * sliderBtnStyle?: { [propName: string]: any },\n * volumeColor?: string\n * },\n * remainMediaAfterDestroy?: boolean,\n * [propName: string]: any;\n * } } IPlayerOptions\n */\n\n/**\n * @returns { IPlayerOptions }\n */\nexport default function getDefaultConfig () {\n return {\n id: '', // container DOM id\n el: null, // container domElement\n url: '', // the url need to play\n domEventType: 'default', // 事件类型,默认值default, touch | mouse\n nullUrlStart: false, // Whether to start broadcasting with empty url\n width: 600, // Width, unit px\n height: 337.5, // height, unit px\n fluid: false,\n fitVideoSize: 'fixed', // adaptation method of container width and height, fixWidth/fixHeight/fixed/auto\n videoFillMode: 'auto', // video screen fill mode, fillHeight/fillWidth/fill/auto/cover\n volume: 0.6, // default volume or config of plug-in volume\n autoplay: false,\n autoplayMuted: false, // whether to mute the start\n loop: false, // whether to loop\n isLive: false, // whether is live\n zoom: 1,\n videoInit: true, // whether to load the video/audio when initializing\n poster: '', // cover poster url or the configuration object for poster plugin\n isMobileSimulateMode: false, // simulation state, mobile/pc\n defaultPlaybackRate: 1, // default playback rate\n execBeforePluginsCall: null,\n allowSeekAfterEnded: true, // whether to allow seek after the playback ended\n enableContextmenu: true, // whether to allow the right-click function to be enabled\n closeVideoClick: false, // is to close the video’s click/touchend behavior to switch playback and pause\n closeVideoDblclick: false, // is to close the video`s double-click behavior to switch through full screen\n closePlayerBlur: false, // whether to close the behavior of calling player.blur() when the mouse moves out of the player area\n closeDelayBlur: false, // whether to close the automatic hide control bar behavior,only PC\n leavePlayerTime: 3000, // auto hide delay time when the mouse moves out of the player area\n closePlayVideoFocus: false, // whether to close the behavior of calling player.focus() in the play event callback\n closePauseVideoFocus: false, // whether to close the behavior of calling player.focus() in the pause event callback\n closeFocusVideoFocus: true, // whether to close the behavior of calling player.media.focus() when start play\n closeControlsBlur: true, // whether to close the behavior of calling player.focus() when the mouse moves out of the control bar area\n topBarAutoHide: true, // Whether to enable auto hide the top bar when player.blur()\n videoAttributes: {}, // video extended attributes\n startTime: 0, // auto play start time\n seekedStatus: 'play', // play state after seek ends play/pause/auto\n miniprogress: false, // whether to enable the mini progress bar\n disableSwipeHandler: () => {\n },\n enableSwipeHandler: () => {\n },\n preProcessUrl: null, // url preprocessing callback\n ignores: [], // list of plug-in names to be disabled\n whitelist: [],\n inactive: 3000, // delay time for the control bar to disappear automatically\n lang: getLang(),\n controls: true,\n marginControls: false, // Whether the control bar is located at the bottom of the video and does not overlap with the video\n fullscreenTarget: null,\n screenShot: false, // whether to enable the screenshot plug-in\n rotate: false, // whether to enable the rotate plug-in\n pip: false, // whether to enable the picture-in-picture plug-in\n download: false, // whether to enable the download plug-in\n mini: false, // whether to enable the mini-screen plug-in\n cssFullscreen: true, // whether to enable the web page full-screen plug-in\n keyShortcut: true, // whether to open the shortcut key\n presets: [],\n plugins: [],\n playbackRate: 1,\n definition: { list: [] },\n playsinline: true,\n customDuration: 0, // User-defined duration\n timeOffset: 0, // currentTime offset\n icons: {},\n i18n: [],\n tabindex: 0, // The order of mediaElement focus\n thumbnail: null, // Preview image configuration\n videoConfig: {}, // video attribute configuration\n isHideTips: false, // if hide the icon tips\n minWaitDelay: 200, // The min threshold of waiting delay time\n commonStyle: { // General style configuration\n progressColor: '', // Background color of progress bar\n playedColor: '', // The background color of played part in the progress bar\n cachedColor: '', // The background color of cached part in the progress bar\n sliderBtnStyle: {}, // progress bar slider style\n volumeColor: ''\n }\n }\n}\n","export const usePreset = (player, Preset) => {\n let presetInst\n if (Preset.preset && Preset.options) {\n // eslint-disable-next-line new-cap\n presetInst = new (Preset.preset)(Preset.options, player.config)\n } else {\n presetInst = new Preset({}, player.config)\n }\n const { plugins = [], ignores = [], icons = {}, i18n = [] } = presetInst\n if (!player.config.plugins) {\n player.config.plugins = []\n }\n\n if (!player.config.ignores) {\n player.config.ignores = []\n }\n\n player.config.plugins.push(...plugins)\n player.config.ignores.push(...ignores)\n Object.keys(icons).map(key => {\n if (!player.config.icons[key]) {\n player.config.icons[key] = icons[key]\n }\n })\n const _ci18n = player.config.i18n || []\n i18n.push(..._ci18n)\n player.config.i18n = i18n\n}\n","export const STATES = {\n INITIAL: 1,\n READY: 2,\n ATTACHING: 3,\n ATTACHED: 4,\n NOTALLOW: 5,\n RUNNING: 6,\n ENDED: 7,\n DESTROYED: 8\n}\n\nexport const STATE_ARRAY = [\n 'ERROR',\n 'INITIAL',\n 'READY',\n 'ATTACHING',\n 'ATTACHED',\n 'NOTALLOW',\n 'RUNNING',\n 'ENDED',\n 'DESTROYED'\n]\n","import Plugin, { Events, Util, POSITIONS, Sniffer, STATE_CLASS } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * disable?: boolean,\n * autoHide?: boolean,\n * mode?: \"flex\"|\"normal\"|\"bottom\",\n * initShow?: boolean,\n * [propName: string]: any\n * }} IControlsConfig\n */\n\nclass Controls extends Plugin {\n static get pluginName () {\n return 'controls'\n }\n\n /**\n * @type IControlsConfig\n */\n static get defaultConfig () {\n return {\n disable: false,\n autoHide: true, // Whether to hide automatically\n mode: '', // Display mode, flex/normal/bottom\n initShow: false // Display when player is initialized\n }\n }\n\n beforeCreate (args) {\n if (!args.config.mode && Sniffer.device === 'mobile') {\n args.config.mode = 'flex'\n }\n if (args.player.config.marginControls) {\n args.config.autoHide = false\n }\n }\n\n afterCreate () {\n const { disable, height, mode } = this.config\n if (disable) {\n return\n }\n\n mode === 'flex' && this.player.addClass(STATE_CLASS.FLEX_CONTROLS)\n const style = {\n height: `${height}px`\n }\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.left = this.find('xg-left-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.center = this.find('xg-center-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.right = this.find('xg-right-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.innerRoot = this.find('xg-inner-controls')\n\n // The progress bar is switched synchronously when switching to the small window state\n this.on(Events.MINI_STATE_CHANGE, (isMini) => {\n isMini ? Util.addClass(this.root, 'mini-controls') : Util.removeClass(this.root, 'mini-controls')\n })\n\n const { isMobileSimulateMode } = this.playerConfig\n if (Sniffer.device !== 'mobile' && isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseleave', this.onMouseLeave)\n }\n }\n\n onMouseEnter = (e) => {\n const { player, playerConfig } = this\n playerConfig.closeControlsBlur && player.focus({ autoHide: false })\n }\n\n onMouseLeave = (e) => {\n const { player } = this\n player.focus()\n }\n\n focus () {\n this.player.focus({ autoHide: false })\n }\n\n focusAwhile () {\n this.player.focus({ autoHide: true })\n }\n\n blur () {\n this.player.blur({ ignorePaused: true })\n }\n\n recoverAutoHide () {\n // this.config.autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n this.config.autoHide && Util.addClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n pauseAutoHide () {\n // Util.removeClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n Util.removeClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n this.root.style.display = ''\n this.player.focus()\n }\n\n hide () {\n this.root.style.display = 'none'\n }\n\n /**\n * @type {string}\n */\n get mode () {\n return this.config.mode\n }\n\n /**\n *\n * @param {} plugin\n * @param { {config?: {[propName: string]: any}, position?:string, root?: HTMLElement, pluginName?: string}} options\n * @param { string } name\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name) {\n if (!this.root) {\n return\n }\n const defaultConfig = plugin.defaultConfig || {}\n if (!options.root) {\n const position = options.position ? options.position : options.config && options.config.position ? options.config.position : defaultConfig.position\n switch (position) {\n case POSITIONS.CONTROLS_LEFT:\n options.root = this.left\n break\n case POSITIONS.CONTROLS_RIGHT:\n options.root = this.right\n break\n case POSITIONS.CONTROLS_CENTER:\n options.root = this.center\n break\n case POSITIONS.CONTROLS:\n options.root = this.root\n break\n default:\n options.root = this.left\n }\n return super.registerPlugin(plugin, options, name)\n }\n }\n\n destroy () {\n if (Sniffer.device !== 'mobile') {\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mouseleave', this.onMouseLeave)\n }\n this.left = null\n this.center = null\n this.right = null\n this.innerRoot = null\n }\n\n render () {\n const { mode, autoHide, initShow, disable } = this.config\n if (disable) {\n return\n }\n\n // autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n const className = Util.classNames(\n { 'xgplayer-controls': true },\n { 'flex-controls': mode === 'flex' },\n { 'bottom-controls': mode === 'bottom' },\n { [STATE_CLASS.CONTROLS_AUTOHIDE]: autoHide },\n { 'xgplayer-controls-initshow': initShow || !autoHide })\n return `<xg-controls class=\"${className}\" unselectable=\"on\">\n <xg-inner-controls class=\"xg-inner-controls xg-pos\">\n <xg-left-grid class=\"xg-left-grid\">\n </xg-left-grid>\n <xg-center-grid class=\"xg-center-grid\"></xg-center-grid>\n <xg-right-grid class=\"xg-right-grid\">\n </xg-right-grid>\n </xg-inner-controls>\n </xg-controls>`\n }\n}\n\nexport default Controls\n","import MediaProxy from './mediaProxy'\nimport Util, { checkIsCurrentVideo } from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Database from './utils/database'\nimport Errors from './error'\nimport * as Events from './events'\nimport { FULLSCREEN_EVENTS, GET_FULLSCREEN_API, EXIT_FULLSCREEN_API, PLATER_ID } from './constant'\nimport Plugin, { POSITIONS } from './plugin/plugin'\nimport BasePlugin from './plugin/basePlugin'\nimport pluginsManager from './plugin/pluginsManager'\nimport STATE_CLASS from './stateClassMap'\nimport getDefaultConfig from './defaultConfig'\nimport { usePreset } from './plugin/preset'\nimport hooksDescriptor, { runHooks, useHooks, removeHooks, delHooksDescriptor, usePluginHooks, removePluginHooks, hook } from './plugin/hooksDescriptor'\nimport Controls from './plugins/controls/index'\nimport XG_DEBUG, { bindDebug } from './utils/debug'\nimport I18N from './lang/i18n'\nimport version from './version'\nimport { STATES, STATE_ARRAY } from './state'\nimport { InstManager, checkPlayerRoot } from './instManager'\n\n/**\n * @typedef { import ('./defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef { import ('./defaultConfig').IDefinition } IDefinition\n * @typedef { import ('./defaultConfig').IUrl } IUrl\n */\n\n/**\n * @typedef {boolean | {\n * seamless?: boolean,\n * currentTime?: number,\n * bitrate?: number\n * }} SwitchUrlOptions\n */\n\n/* eslint-disable camelcase */\nconst PlAYER_HOOKS = ['play', 'pause', 'replay', 'retry']\nlet REAL_TIME_SPEED = 0 // 实时下载速率, kb/s\nlet AVG_SPEED = 0 // 平均下载速率, kb/s\n/** @type { InstManager } */\nlet instManager = null\n\nclass Player extends MediaProxy {\n /**\n * @type {number}\n * @description set debugger level\n * 1 - only print error logs\n * 2 - print warn logs and error logs\n * 3 - print all debug logs and error stack logs\n */\n static set debugger (value) {\n XG_DEBUG.config.debug = value\n }\n\n static get debugger () {\n return XG_DEBUG.config.debug\n }\n\n /**\n * @param {import('./instManager').InstManager} value\n */\n static set instManager (value) {\n instManager = value\n }\n\n /**\n * @param {import('./instManager').InstManager} value\n */\n static get instManager () {\n return instManager\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | string | null }\n * @deprecated 该方法转移到 InstManager 上去使用: player.instManager.getActiveId()\n */\n static getCurrentUserActivePlayerId () {\n return instManager?.getActiveId()\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n * @deprecated 该方法转移到 InstManager 上去使用: player.instManager.setActive()\n */\n static setCurrentUserActive (playerId, isActive) {\n instManager?.setActive(playerId, isActive)\n }\n\n /**\n * @param { IPlayerOptions } options\n */\n constructor (options) {\n const config = Util.deepMerge(getDefaultConfig(), options)\n super(config)\n hooksDescriptor(this, PlAYER_HOOKS)\n\n /**\n * @type { IPlayerOptions }\n * @description 当前播放器的配置信息\n */\n this.config = config\n\n /**\n * @type { string }\n * @private\n */\n this._pluginInfoId = Util.generateSessionId()\n\n bindDebug(this)\n // resolve default preset\n const defaultPreset = this.constructor.defaultPreset\n if (this.config.presets.length) {\n const defaultIdx = this.config.presets.indexOf('default')\n if (defaultIdx >= 0 && defaultPreset) {\n this.config.presets[defaultIdx] = defaultPreset\n }\n } else if (defaultPreset) {\n this.config.presets.push(defaultPreset)\n }\n\n // timer and flags\n this.userTimer = null\n /**\n * @private\n */\n this.waitTimer = null\n\n /**\n * @public\n * @description This switch provides the playback plugin with the ability\n * to handle media source by itself.\n */\n this.handleSource = true\n\n /**\n * @private\n */\n this._state = STATES.INITIAL\n\n /**\n * @public\n * @readonly\n * @type { boolean }\n */\n this.isAd = false\n\n /**\n * @public\n * @readonly\n * @type { boolean }\n */\n this.isError = false\n\n /**\n * @private\n */\n this._hasStart = false\n /**\n * Whether the player is in the seeking state\n * @type { boolean }\n * @readonly\n */\n this.isSeeking = false\n\n /**\n * @type { boolean }\n * @readonly\n */\n this.isCanplay = false\n /**\n * @private\n * @readonly\n */\n this._useAutoplay = false\n /**\n * @description 记录起播需要seek的时间点\n * @type { number }\n * @private\n * @readonly\n */\n this.__startTime = -1\n /**\n * @type { number }\n */\n this.rotateDeg = 0\n /**\n * Whether the player is focus\n * @type { boolean }\n * @readonly\n */\n this.isActive = false\n\n /**\n * Whether player is currently in fullscreen\n * @type { boolean }\n * @readonly\n */\n this.fullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.cssfullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.isRotateFullscreen = false\n\n /**\n * fullscreenElement\n * @type { HTMLElement | null }\n * @readonly\n */\n this._fullscreenEl = null\n\n this.timeSegments = []\n\n /**\n * cssfullscreen target Element\n * @type { HTMLElement | null }\n * @readonly\n */\n this._cssfullscreenEl = null\n\n /**\n * @type { ?IDefinition }\n * @public\n */\n this.curDefinition = null\n /**\n * @private\n * @type { string }\n */\n this._orgCss = ''\n /**\n * @readonly\n * @type { number }\n */\n this._fullScreenOffset = null\n /**\n * @private\n * @type { number }\n */\n this._videoHeight = 0\n /**\n * @private\n * @type { number }\n */\n this._videoWidth = 0\n\n this.videoPos = {\n pi: 1, // 宽高比\n scale: 0,\n rotate: -1,\n x: 0,\n y: 0,\n h: -1, // 高度占比\n w: -1, // 宽度占比\n vy: 0, // 画面在y方向的偏移\n vx: 0 // 画面在x方向的偏移\n }\n\n this.sizeInfo = {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n\n /**\n * @private\n * @type { { t: number, acc:number, acc: number, loopAcc: number, [propName: string]: any;} }\n */\n this._accPlayed = {\n t: 0,\n acc: 0,\n loopAcc: 0\n }\n\n /**\n * @description 播放器时长、播放时间偏移信息\n */\n this._offsetInfo = {\n currentTime: -1,\n duration: 0\n }\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 控制栏和video不同布局的时候内部容器\n */\n this.innerContainer = null\n\n /**\n * @type { ?Controls }\n * @readonly\n * @description 控制栏插件\n */\n this.controls = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n */\n this.topBar = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 当前播放器根节点\n */\n this.root = null\n\n this.__i18n = I18N.init(this._pluginInfoId)\n\n // android 6以下不支持自动播放\n if (\n Sniffer.os.isAndroid &&\n Sniffer.osVersion > 0 &&\n Sniffer.osVersion < 6\n ) {\n this.config.autoplay = false\n }\n\n /**\n * @readonly\n * @type {any}\n */\n this.database = new Database()\n\n /**\n * @readonly\n * @type { boolean }\n */\n this.isUserActive = false\n\n /**\n * @private\n * @description seek之后canplay回调函数定义\n * @type { Function | null }\n */\n this._onceSeekCanplay = null\n\n /**\n * @description 记录seek之前是否处于暂停状态\n * @type { number }\n * @private\n */\n this._isPauseBeforeSeek = 0\n\n /**\n * @description 内部状态记录\n * @type { {\n * isActiveLocked: boolean;\n * } }\n * @readonly\n */\n this.innerStates = {\n // 当前的active是否是锁定状态\n isActiveLocked: false\n }\n\n /**\n * @type {InstManager}\n */\n this.instManager = instManager\n const rootInit = this._initDOM()\n if (!rootInit) {\n console.error(\n new Error(\n `can't find the dom which id is ${this.config.id} or this.config.el does not exist`\n )\n )\n return\n }\n\n // url为空的情况下 根据definition或playnext.urlList设置播放地址\n // 若未配置definition.defaultDefinition,默认将配置为definition.list[0].definition\n const { definition = {}, url } = this.config\n\n if (!url && definition.list && definition.list.length > 0) {\n let defaultDefinitionObj = definition.list.find(\n (e) => e.definition && e.definition === definition.defaultDefinition\n )\n if (!defaultDefinitionObj) {\n definition.defaultDefinition = definition.list[0].definition\n defaultDefinitionObj = definition.list[0]\n }\n this.config.url = defaultDefinitionObj.url\n this.curDefinition = defaultDefinitionObj\n }\n\n this._bindEvents()\n this._registerPresets()\n this._registerPlugins()\n pluginsManager.onPluginsReady(this)\n\n // url为空的情况下 根据definition设置播放地址\n this.getInitDefinition()\n\n this.setState(STATES.READY)\n Util.setTimeout(this, () => {\n this.emit(Events.READY)\n }, 0)\n this.onReady && this.onReady()\n\n if (this.config.videoInit || this.config.autoplay) {\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n this.start()\n }\n }\n }\n\n /**\n * init control domElement\n * @private\n */\n _initDOM () {\n this.root = this.config.id ? document.getElementById(this.config.id) : null\n if (!this.root) {\n const el = this.config.el\n if (el && el.nodeType === 1) {\n this.root = el\n } else {\n this.emit(\n Events.ERROR,\n new Errors('use', this.config.vid, {\n line: 32,\n handle: 'Constructor',\n msg: 'container id can\\'t be empty'\n })\n )\n console.error('this.confg.id or this.config.el can\\'t be empty')\n return false\n }\n }\n const ret = checkPlayerRoot(this.root)\n if (ret) {\n XG_DEBUG.logWarn(\n 'The is an Player instance already exists in this.root, destroy it and reinitialize'\n )\n ret.destroy()\n }\n this.root.setAttribute(PLATER_ID, this.playerId)\n this.media.setAttribute(PLATER_ID, this.playerId)\n\n instManager?.add(this)\n pluginsManager.init(this)\n this._initBaseDoms()\n\n if (this.config.controls) {\n const _root = this.config.controls.root || null\n const controls = pluginsManager.register(this, Controls, { root: _root })\n this.controls = controls\n }\n const device =\n this.config.isMobileSimulateMode === 'mobile' ? 'mobile' : Sniffer.device\n this.addClass(\n `${STATE_CLASS.DEFAULT} ${STATE_CLASS.INACTIVE} xgplayer-${device} ${\n this.config.controls ? '' : STATE_CLASS.NO_CONTROLS\n }`\n )\n if (this.config.autoplay) {\n this.addClass(STATE_CLASS.ENTER)\n } else {\n this.addClass(STATE_CLASS.NO_START)\n }\n if (this.config.fluid) {\n let { width, height } = this.config\n if (typeof width !== 'number' || typeof height !== 'number') {\n width = 600\n height = 337.5\n }\n const style = {\n width: '100%',\n height: '0',\n 'max-width': '100%',\n 'padding-top': `${(height * 100) / width}%`\n // position: 'relative',\n // top: '0',\n // left: '0'\n }\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\n } else {\n ['width', 'height'].forEach((key) => {\n if (this.config[key]) {\n if (typeof this.config[key] !== 'number') {\n this.root.style[key] = this.config[key]\n } else {\n this.root.style[key] = `${this.config[key]}px`\n }\n }\n })\n }\n const { width, height, left, top } = this.root.getBoundingClientRect()\n this.sizeInfo.width = width\n this.sizeInfo.height = height\n this.sizeInfo.left = left\n this.sizeInfo.top = top\n return true\n }\n\n /**\n * @private\n */\n _initBaseDoms () {\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.topBar = null\n /**\n * @readonly\n * @type { HTMLElement |null }\n */\n this.leftBar = null\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.rightBar = null\n\n if (this.config.marginControls) {\n this.innerContainer = Util.createDom(\n 'xg-video-container',\n '',\n { 'data-index': -1 },\n 'xg-video-container'\n )\n this.root.appendChild(this.innerContainer)\n }\n }\n\n /**\n * @private\n */\n _bindEvents () {\n ['focus', 'blur'].forEach((item) => {\n this.on(item, this['on' + item.charAt(0).toUpperCase() + item.slice(1)])\n })\n\n FULLSCREEN_EVENTS.forEach((item) => {\n document && document.addEventListener(item, this.onFullscreenChange)\n })\n\n if (Sniffer.os.isIos) {\n this.media.addEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.addEventListener( 'webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n this.once(Events.LOADED_DATA, this.resize)\n\n this.playFunc = () => {\n if (!this.config.closeFocusVideoFocus) {\n this.media.focus()\n }\n }\n this.once(Events.PLAY, this.playFunc)\n }\n\n /**\n * @private\n */\n _unbindEvents () {\n this.root.removeEventListener('mousemove', this.mousemoveFunc)\n FULLSCREEN_EVENTS.forEach((item) => {\n document.removeEventListener(item, this.onFullscreenChange)\n })\n this.playFunc && this.off(Events.PLAY, this.playFunc)\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.media.removeEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.removeEventListener('webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n _clearUserTimer () {\n if (!this.userTimer) {\n return\n }\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n\n /**\n *\n * @param { any } [url]\n * @returns\n */\n _startInit (url) {\n if (!this.media) {\n return\n }\n if (\n !url ||\n url === '' ||\n (Util.typeOf(url) === 'Array' && url.length === 0)\n ) {\n url = ''\n this.emit(Events.URL_NULL)\n XG_DEBUG.logWarn(\n 'config.url is null, please get url and run player._startInit(url)'\n )\n if (this.config.nullUrlStart) {\n return\n }\n }\n\n if (this.handleSource) {\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array' && url.length > 0) {\n this._attachSourceEvents(this.media, url)\n } else if (!this.media.src || this.media.src !== url) {\n this.media.src = url\n } else if (!url) {\n this.media.removeAttribute('src')\n }\n }\n\n if (Util.typeOf(this.config.volume) === 'Number') {\n this.volume = this.config.volume\n }\n\n const _root = this.innerContainer ? this.innerContainer : this.root\n if (this.media instanceof window.Element && !_root.contains(this.media)) {\n _root.insertBefore(this.media, _root.firstChild)\n }\n\n const { readyState } = this.media\n XG_DEBUG.logInfo('_startInit readyState', readyState)\n if (this.config.autoplay) {\n !Util.isMSE(this.media) && this.load();\n // ios端无法自动播放的场景下,不调用play不会触发canplay loadeddata等事件\n (Sniffer.os.isIpad || Sniffer.os.isPhone) && this.mediaPlay()\n }\n\n const { startTime } = this.config\n this.__startTime = startTime > 0 ? startTime : -1\n this.config.startTime = 0\n if (readyState >= 2 && this.duration > 0) {\n this.canPlayFunc()\n } else {\n this.on(Events.CANPLAY, this.canPlayFunc)\n }\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n pluginsManager.afterInit(this)\n }\n this.hasStart = true\n this.setState(STATES.ATTACHED)\n Util.setTimeout(this, () => {\n this.emit(Events.COMPLETE)\n }, 0)\n }\n\n /**\n * @description 注册组件 组件列表config.plugins\n * @param { {boolean} } [isInit] 是否是首次初始化\n * @private\n */\n _registerPlugins (isInit = true) {\n /**\n * @private\n */\n this._loadingPlugins = []\n const ignores = this.config.ignores || []\n const plugins = this.config.plugins || []\n const i18n = this.config.i18n || []\n isInit && I18N.extend(i18n, this.__i18n)\n const ignoresStr = ignores.join('||').toLowerCase().split('||')\n const cuPlugins = this.plugins\n plugins.forEach((plugin) => {\n try {\n const pluginName = plugin.plugin\n ? plugin.plugin.pluginName\n : plugin.pluginName\n // 在ignores中的不做组装\n if (pluginName && ignoresStr.indexOf(pluginName.toLowerCase()) > -1) {\n return null\n }\n\n if (!isInit && cuPlugins[pluginName.toLowerCase()]) {\n return\n }\n\n if (plugin.lazy && plugin.loader) {\n const loadingPlugin = pluginsManager.lazyRegister(this, plugin)\n if (plugin.forceBeforeInit) {\n loadingPlugin\n .then(() => {\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n .catch((e) => {\n XG_DEBUG.logError('_registerPlugins:loadingPlugin', e)\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n this._loadingPlugins.push(loadingPlugin)\n }\n\n return\n }\n return this.registerPlugin(plugin)\n } catch (err) {\n XG_DEBUG.logError('_registerPlugins:', err)\n // return\n }\n })\n }\n\n /**\n * @private\n */\n _registerPresets () {\n this.config.presets.forEach((preset) => {\n usePreset(this, preset)\n })\n }\n\n /**\n * @private\n * @param { string } position ]\n */\n _getRootByPosition (position) {\n let _root = null\n switch (position) {\n case POSITIONS.ROOT_RIGHT:\n if (!this.rightBar) {\n this.rightBar = Util.createPositionBar('xg-right-bar', this.root)\n }\n _root = this.rightBar\n break\n case POSITIONS.ROOT_LEFT:\n if (!this.leftBar) {\n this.leftBar = Util.createPositionBar('xg-left-bar', this.root)\n }\n _root = this.leftBar\n break\n case POSITIONS.ROOT_TOP:\n if (!this.topBar) {\n this.topBar = Util.createPositionBar('xg-top-bar', this.root)\n if (this.config.topBarAutoHide) {\n Util.addClass(this.topBar, STATE_CLASS.TOP_BAR_AUTOHIDE)\n }\n }\n _root = this.topBar\n break\n default:\n _root = this.innerContainer || this.root\n break\n }\n return _root\n }\n\n /**\n *\n * @param { {plugin: function, options:object} | function } plugin\n * @param { {[propName: string]: any;} } [config]\n * @returns { any } plugin\n */\n registerPlugin (plugin, config) {\n const _retPlugin = pluginsManager.formatPluginInfo(plugin, config)\n const { PLUFGIN, options } = _retPlugin\n\n // 如果当前配置plugins中不存在该组件, 则将其push\n const { plugins } = this.config\n const exits = pluginsManager.checkPluginIfExits(PLUFGIN.pluginName, plugins)\n !exits && plugins.push(PLUFGIN)\n\n // 获取配置的position或者root\n const _pConfig = pluginsManager.getRootByConfig(PLUFGIN.pluginName, this.config)\n _pConfig.root && (options.root = _pConfig.root)\n _pConfig.position && (options.position = _pConfig.position)\n\n const position = options.position\n ? options.position\n : (options.config && options.config.position) ||\n (PLUFGIN.defaultConfig && PLUFGIN.defaultConfig.position)\n if (\n !options.root &&\n typeof position === 'string' &&\n position.indexOf('controls') > -1\n ) {\n return this.controls?.registerPlugin(PLUFGIN, options, PLUFGIN.pluginName)\n }\n if (!options.root) {\n options.root = this._getRootByPosition(position)\n }\n return pluginsManager.register(this, PLUFGIN, options)\n }\n\n /**\n *\n * @param { any } plugin\n */\n deregister (plugin) {\n if (typeof plugin === 'string') {\n pluginsManager.unRegister(this, plugin)\n } else if (plugin instanceof BasePlugin) {\n pluginsManager.unRegister(this, plugin.pluginName)\n }\n }\n\n /**\n *\n * @param { any } plugin\n * @param { boolean } removedFromConfig\n */\n unRegisterPlugin (plugin, removedFromConfig = false) {\n this.deregister(plugin)\n if (removedFromConfig) {\n this.removePluginFromConfig(plugin)\n }\n }\n\n removePluginFromConfig (plugin) {\n let pluginName\n if (typeof plugin === 'string') {\n pluginName = plugin\n } else if (plugin instanceof BasePlugin) {\n pluginName = plugin.pluginName\n }\n if (!pluginName) {\n return\n }\n for (let i = this.config.plugins.length - 1; i > -1; i--) {\n const plugin = this.config.plugins[i]\n if (plugin.pluginName.toLowerCase() === pluginName.toLowerCase()) {\n this.config.plugins.splice(i, 1)\n break\n }\n }\n }\n\n /**\n * 当前播放器挂载的插件实例列表\n * @type { {[propName: string]: any | null } }\n */\n get plugins () {\n return pluginsManager.getPlugins(this)\n }\n\n /**\n * get a plugin instance\n * @param { string } pluginName\n * @return { null | any } plugin\n */\n getPlugin (pluginName) {\n const plugin = pluginsManager.findPlugin(this, pluginName)\n return plugin && plugin.pluginName ? plugin : null\n }\n\n /**\n *\n * @param { string } className\n */\n addClass (className) {\n if (!this.root) {\n return\n }\n if (!Util.hasClass(this.root, className)) {\n Util.addClass(this.root, className)\n }\n }\n\n /**\n *\n * @param { string } className\n * @returns\n */\n removeClass (className) {\n if (!this.root) {\n return\n }\n Util.removeClass(this.root, className)\n }\n\n /**\n *\n * @param { string } className\n * @returns { boolean } has\n */\n hasClass (className) {\n if (!this.root) {\n return\n }\n return Util.hasClass(this.root, className)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n setAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.setAttribute(key, value)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n removeAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.removeAttribute(key, value)\n }\n\n /**\n *\n * @param { any } [url]\n * @returns { Promise<void> | void }\n * @description 启动播放器,start一般都是播放器内部隐式调用,主要功能是将video添加到DOM\n */\n start (url) {\n // 已经开始初始化播放了 则直接调用play\n if (this.state > STATES.ATTACHING) {\n return\n }\n if (!url && !this.config.url) {\n this.getInitDefinition()\n }\n this.hasStart = true\n this.setState(STATES.ATTACHING)\n\n this._registerPlugins(false)\n return pluginsManager\n .beforeInit(this)\n .then(() => {\n // this.config为空即已经销毁,不再执行后面的异步流程\n if (!this.config) {\n return\n }\n if (!url) {\n url = this.url || this.config.url\n }\n const _furl = this.preProcessUrl(url)\n const ret = this._startInit(_furl.url)\n return ret\n })\n .catch((e) => {\n e.fileName = 'player'\n e.lineNumber = '236'\n XG_DEBUG.logError('start:beforeInit:', e)\n throw e\n })\n }\n\n /**\n * @param { string | object } url\n * @param { SwitchUrlOptions } [options]\n * @returns { Promise | null } 执行结果\n */\n switchURL (url, options) {\n let _src = url\n if (Util.typeOf(url) === 'Object') {\n _src = url.url\n }\n _src = this.preProcessUrl(_src).url\n const curTime = this.currentTime\n this.__startTime = curTime\n const isPaused = this.paused && !this.isError\n this.src = _src\n return new Promise((resolve, reject) => {\n const _error = (e) => {\n this.off('timeupdate', _canplay)\n this.off('canplay', _canplay)\n reject(e)\n }\n const _canplay = () => {\n this._seekToStartTime()\n if (isPaused) {\n this.pause()\n }\n this.off('error', _error)\n resolve(true)\n }\n this.once('error', _error)\n if (!_src){\n this.errorHandler('error', {code: 6, message: 'empty_src'})\n return\n }\n if (Sniffer.os.isAndroid) {\n this.once('timeupdate', _canplay)\n } else {\n this.once('canplay', _canplay)\n }\n this.play()\n })\n }\n\n /**\n * @description call play without play hook\n * @deprecated this api renamed to mediaPlay, you can call it as player.mediaPlay()\n */\n videoPlay () {\n this.mediaPlay()\n }\n\n /**\n * @description call play without play hook\n */\n mediaPlay () {\n if (!this.hasStart && this.state < STATES.ATTACHED) {\n this.removeClass(STATE_CLASS.NO_START)\n this.addClass(STATE_CLASS.ENTER)\n this.start()\n this._useAutoplay = true\n return\n }\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n !this.isCanplay && this.addClass(STATE_CLASS.ENTER)\n }\n const playPromise = super.play()\n if (playPromise !== undefined && playPromise && playPromise.then) {\n playPromise\n .then(() => {\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.addClass(STATE_CLASS.PLAYING)\n if (this.state < STATES.RUNNING) {\n XG_DEBUG.logInfo('>>>>playPromise.then')\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n })\n .catch((e) => {\n XG_DEBUG.logWarn('>>>>playPromise.catch', e.name)\n if (this.media && this.media.error) {\n this.onError()\n // this.errorHandler('error')\n this.removeClass(STATE_CLASS.ENTER)\n // this.setState(STATES.ERROR)\n return\n }\n // 避免AUTOPLAY_PREVENTED先于playing和play触发\n if (e.name === 'NotAllowedError') {\n /**\n * @private\n */\n this._errorTimer = Util.setTimeout(\n this,\n () => {\n this._errorTimer = null\n this.emit(Events.AUTOPLAY_PREVENTED)\n this.addClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.ENTER)\n this.pause()\n this.setState(STATES.NOTALLOW)\n },\n 0\n )\n }\n })\n } else {\n XG_DEBUG.logWarn('video.play not return promise')\n if (this.state < STATES.RUNNING) {\n this.setState(STATES.RUNNING)\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.addClass(STATE_CLASS.PLAYING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n }\n return playPromise\n }\n\n /**\n * @description call play without pause hook\n */\n mediaPause () {\n super.pause()\n }\n\n /**\n * @description call play without pause hook\n * @deprecated this api renamed to mediaPause, you can call it as player.mediaPause()\n */\n videoPause () {\n super.pause()\n }\n\n play () {\n this.removeClass(STATE_CLASS.PAUSED)\n return runHooks(this, 'play', () => {\n return this.mediaPlay()\n })\n }\n\n pause () {\n runHooks(this, 'pause', () => {\n super.pause()\n })\n }\n\n /**\n *\n * @param { number } time\n * @param { 'play' | 'pause' | 'auto' } [status]\n * @returns\n */\n seek (time, status) {\n if (!this.media || Number.isNaN(Number(time)) || !this.hasStart) {\n return\n }\n const { isSeekedPlay, seekedStatus } = this.config\n const _status = status || (isSeekedPlay ? 'play' : seekedStatus)\n time = time < 0 ? 0 : time > this.duration ? parseInt(this.duration, 10) : time\n\n !this._isPauseBeforeSeek && (this._isPauseBeforeSeek = this.paused ? 2 : 1)\n\n this._onceSeekCanplay && this.off(Events.SEEKED, this._onceSeekCanplay)\n\n this._onceSeekCanplay = () => {\n // const { seekedStatus } = this.config\n this.removeClass(STATE_CLASS.ENTER)\n this.isSeeking = false\n switch (_status) {\n case 'play':\n this.play()\n break\n case 'pause':\n this.pause()\n break\n default:\n this._isPauseBeforeSeek > 1 || this.paused ? this.pause() : this.play()\n }\n this._isPauseBeforeSeek = 0\n this._onceSeekCanplay = null\n }\n\n this.once(Events.SEEKED, this._onceSeekCanplay)\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n this.currentTime = time\n // 未起播状态不论希望保持什么状态,都要触发一次play, 避免ios下起播异常问题\n this.play()\n } else {\n this.currentTime = time\n }\n }\n\n getInitDefinition () {\n // url为空的情况下 根据definition设置播放地址\n const { definition, url } = this.config\n if (\n !url &&\n definition &&\n definition.list &&\n definition.list.length > 0 &&\n definition.defaultDefinition\n ) {\n definition.list.map((item) => {\n if (item.definition === definition.defaultDefinition) {\n this.config.url = item.url\n this.curDefinition = item\n }\n })\n }\n }\n\n /**\n * @typedef { import('./defaultConfig').IDefinition } definition\n */\n /**\n * @description change the definition of the current playback\n * @param { definition } to\n * @param { definition } [from]\n */\n changeDefinition (to, from) {\n const { definition } = this.config\n\n if (Array.isArray(definition?.list)) {\n definition.list.forEach((item) => {\n if (to?.definition === item.definition) {\n this.curDefinition = item\n }\n })\n }\n\n if (to?.bitrate && typeof to.bitrate !== 'number') {\n to.bitrate = parseInt(to.bitrate, 10) || 0\n }\n\n this.emit(Events.DEFINITION_CHANGE, { from, to })\n if (!this.hasStart) {\n this.config.url = to.url\n return\n }\n const ret = this.switchURL(to.url, {\n seamless: definition.seamless !== false\n && typeof MediaSource !== 'undefined'\n && typeof MediaSource.isTypeSupported === 'function',\n ...to\n })\n if (ret && ret.then) {\n ret.then(() => {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n })\n } else {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n }\n }\n\n reload () {\n this.load()\n /**\n * @private\n */\n this.reloadFunc = function () {\n this.play()\n }\n this.once(Events.LOADED_DATA, this.reloadFunc)\n }\n\n resetState () {\n const {\n NOT_ALLOW_AUTOPLAY,\n PLAYING,\n NO_START,\n PAUSED,\n REPLAY,\n ENTER,\n ENDED,\n ERROR,\n LOADING\n } = STATE_CLASS\n const clsList = [\n NOT_ALLOW_AUTOPLAY,\n PLAYING,\n NO_START,\n PAUSED,\n REPLAY,\n ENTER,\n ENDED,\n ERROR,\n LOADING\n ]\n this.hasStart = false\n this.isError = false\n this._useAutoplay = false\n this.mediaPause()\n this._accPlayed.acc = 0\n this._accPlayed.t = 0\n this._accPlayed.loopAcc = 0\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n this.addClass(STATE_CLASS.NO_START)\n this.emit(Events.RESET)\n }\n\n /**\n * 重置播放实例\n * @param { Array<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 media.removeAttribute(PLATER_ID)\n this.updateAcc('destroy')\n this._unbindEvents()\n this._detachSourceEvents(this.media)\n Util.clearAllTimers(this)\n this.emit(Events.DESTROY)\n instManager?.remove(this)\n pluginsManager.destroy(this)\n delHooksDescriptor(this)\n super.destroy()\n // 退出全屏\n if (this.fullscreen && this._fullscreenEl === this.root) {\n this.exitFullscreen()\n }\n\n if (innerContainer) {\n const _c = innerContainer.children\n for (let i = 0; i < _c.length; i++) {\n innerContainer.removeChild(_c[i])\n }\n }\n !innerContainer &&\n media instanceof window.Node &&\n root.contains(media) && !this.config.remainMediaAfterDestroy &&\n root.removeChild(media);\n ['topBar', 'leftBar', 'rightBar', 'innerContainer'].map((item) => {\n this[item] && root.removeChild(this[item])\n this[item] = null\n })\n const cList = root.className.split(' ')\n if (cList.length > 0) {\n root.className = cList\n .filter((name) => name.indexOf('xgplayer') < 0)\n .join(' ')\n } else {\n root.className = ''\n }\n this.removeAttribute('data-xgfill');\n\n [\n 'isSeeking',\n 'isCanplay',\n 'isActive',\n 'cssfullscreen',\n 'fullscreen'\n ].forEach((key) => {\n this[key] = false\n })\n }\n\n replay () {\n this.removeClass(STATE_CLASS.ENDED)\n this.currentTime = 0\n this.isSeeking = false\n runHooks(this, 'replay', () => {\n this.once(Events.SEEKED, () => {\n const playPromise = this.mediaPlay()\n if (playPromise && playPromise.catch) {\n playPromise.catch(err => {\n console.log(err)\n })\n }\n })\n this.emit(Events.REPLAY)\n this.onPlay()\n })\n }\n\n retry () {\n this.removeClass(STATE_CLASS.ERROR)\n this.addClass(STATE_CLASS.LOADING)\n runHooks(this, 'retry', () => {\n const cur = this.currentTime\n const { url } = this.config\n const _srcRet = !Util.isMSE(this.media) ? this.preProcessUrl(url) : { url }\n this.src = _srcRet.url\n !this.config.isLive && (this.currentTime = cur)\n this.once(Events.CANPLAY, () => {\n this.mediaPlay()\n })\n })\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n changeFullStyle (root, el, rootClass, pClassName) {\n if (!root) {\n return\n }\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (!this._orgCss) {\n this._orgCss = Util.filterStyleFromText(root)\n }\n Util.addClass(root, rootClass)\n if (el && el !== root && !this._orgPCss) {\n /**\n * @private\n */\n this._orgPCss = Util.filterStyleFromText(el)\n Util.addClass(el, pClassName)\n el.setAttribute(PLATER_ID, this.playerId)\n }\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n recoverFullStyle (root, el, rootClass, pClassName) {\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (this._orgCss) {\n Util.setStyleFromCsstext(root, this._orgCss)\n this._orgCss = ''\n }\n Util.removeClass(root, rootClass)\n if (el && el !== root && this._orgPCss) {\n Util.setStyleFromCsstext(el, this._orgPCss)\n this._orgPCss = ''\n Util.removeClass(el, pClassName)\n el.removeAttribute(PLATER_ID)\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise<void> }\n */\n getFullscreen (el = this.config.fullscreenTarget) {\n const { root, media } = this\n if (el === 'video' || el === 'media') {\n el = this[el]\n }\n if (!el) {\n el = root\n }\n this._fullScreenOffset = {\n top: Util.scrollTop(),\n left: Util.scrollLeft()\n }\n\n this._fullscreenEl = el\n /**\n * @private\n */\n this._fullActionFrom = 'get'\n const fullEl = Util.getFullScreenEl()\n if (fullEl === this._fullscreenEl) {\n this.onFullscreenChange()\n return Promise.resolve()\n }\n try {\n for (let i = 0; i < GET_FULLSCREEN_API.length; i++) {\n const key = GET_FULLSCREEN_API[i]\n if (el[key]) {\n const ret =\n key === 'webkitRequestFullscreen'\n ? el.webkitRequestFullscreen(window.Element.ALLOW_KEYBOARD_INPUT)\n : el[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (media.fullscreenEnabled || media.webkitSupportsFullscreen) {\n media.webkitEnterFullscreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call getFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call getFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise<void> }\n */\n exitFullscreen (el) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n }\n if (!this._fullscreenEl && !Util.getFullScreenEl()) {\n return\n }\n const { root, media } = this\n if (!el) {\n el = root\n }\n this._fullActionFrom = 'exit'\n try {\n for (let i = 0; i < EXIT_FULLSCREEN_API.length; i++) {\n const key = EXIT_FULLSCREEN_API[i]\n if (document[key]) {\n const ret = document[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (media && media.webkitSupportsFullscreen) {\n media.webkitExitFullScreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call exitFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call exitFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n getCssFullscreen (el = this.config.fullscreenTarget) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n } else if (this.fullscreen) {\n this.exitFullscreen()\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n this.changeFullStyle(this.root, el, _class)\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.fullscreen = true\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n this._cssfullscreenEl = el\n this.cssfullscreen = true\n this.emit(Events.CSS_FULLSCREEN_CHANGE, true)\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n exitCssFullscreen () {\n const _class = this._cssfullscreenEl\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n if (!this.fullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n } else {\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n this.fullscreen = false\n this.emit(Events.FULLSCREEN_CHANGE, false)\n } else {\n this.removeClass(_class)\n }\n }\n this._cssfullscreenEl = null\n this.cssfullscreen = false\n this.emit(Events.CSS_FULLSCREEN_CHANGE, false)\n }\n\n /**\n * 进入旋转全屏\n * @param { HTMLElement } [el]\n */\n getRotateFullscreen (el = this.config.fullscreenTarget) {\n if (this.cssfullscreen) {\n this.exitCssFullscreen(el)\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this._fullscreenEl = el || this.root\n this.changeFullStyle(\n this.root,\n el,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = true\n this.fullscreen = true\n this.setRotateDeg(90)\n this._rootStyle = this.root.getAttribute('style')\n this.root.style.width = `${window.innerHeight}px`\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n\n /**\n * 退出旋转全屏\n * @param { HTMLElement } [el]\n */\n exitRotateFullscreen (el) {\n const _class =\n this._fullscreenEl !== this.root\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this.recoverFullStyle(\n this.root,\n this._fullscreenEl,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = false\n this.fullscreen = false\n this.setRotateDeg(0)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n if (this._rootStyle) {\n this.root.style.style = this._rootStyle\n this._rootStyle = false\n }\n }\n\n setRotateDeg (deg) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.rotateDeg = 0\n } else {\n this.rotateDeg = deg\n }\n }\n\n /**\n * @description 播放器焦点状态,控制栏显示\n * @param { {\n * autoHide?: boolean, // 是否可以自动隐藏\n * delay?: number // 自动隐藏的延迟时间, ms, 不传默认使用3000ms\n * isLock?: boolean // 是否锁定, 锁定之后自动呼出和blur调用都不生效, 默认值false\n * } } [data]\n */\n focus (\n data = {\n autoHide: !this.config.closeDelayBlur,\n delay: this.config.inactive\n }\n ) {\n if (this.isActive) {\n this.onFocus(data)\n return\n }\n this.emit(Events.PLAYER_FOCUS, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @description 取消播放器当前焦点状态\n * @param { { ignorePaused?: boolean } } [data]\n */\n blur (data = { ignorePaused: false }) {\n if (!this.isActive) {\n this.onBlur(data)\n return\n }\n this._clearUserTimer()\n this.emit(Events.PLAYER_BLUR, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @protected\n * @param { { autoHide?: boolean, delay?: number, isLock?: boolean } } [data]\n * @returns\n */\n onFocus (data = { autoHide: true, delay: 3000 }) {\n const { innerStates } = this\n this.isActive = true\n this.removeClass(STATE_CLASS.INACTIVE)\n this._clearUserTimer()\n if (data.isLock !== undefined) {\n innerStates.isActiveLocked = data.isLock\n }\n if (data.autoHide === false || data.isLock === true || innerStates.isActiveLocked) {\n this._clearUserTimer()\n return\n }\n const time = data && data.delay ? data.delay : this.config.inactive\n this.userTimer = Util.setTimeout(this, () => {\n this.userTimer = null\n this.blur()\n }, time)\n }\n\n /**\n * @protected\n * @param {{ ignorePaused?: boolean }} [data]\n * @returns\n */\n onBlur ({ ignorePaused = false } = {}) {\n if (this.innerStates.isActiveLocked) {\n return\n }\n const { closePauseVideoFocus } = this.config\n this.isActive = false\n if (ignorePaused || closePauseVideoFocus || (!this.paused && !this.ended)) {\n this.addClass(STATE_CLASS.INACTIVE)\n }\n }\n\n canPlayFunc = () => {\n if (!this.config) {\n return\n }\n const { autoplay, defaultPlaybackRate } = this.config\n\n XG_DEBUG.logInfo('player', 'canPlayFunc, startTime', this.__startTime)\n this._seekToStartTime()\n\n // 解决浏览器安装了一些倍速扩展插件的情况下,倍速设置失效问题\n this.playbackRate = defaultPlaybackRate;\n\n (autoplay || this._useAutoplay) && this.mediaPlay()\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.removeClass(STATE_CLASS.ENTER)\n }\n\n /**\n *\n */\n onFullscreenChange = (event, isFullScreen) => {\n const delayResize = () => {\n Util.setTimeout(this, () => {\n this.resize()\n }, 100)\n }\n const fullEl = Util.getFullScreenEl()\n if (this._fullActionFrom) {\n this._fullActionFrom = ''\n } else {\n // 快捷键触发\n this.emit(Events.USER_ACTION, {\n eventType: 'system',\n action: 'switch_fullscreen',\n pluginName: 'player',\n currentTime: this.currentTime,\n duration: this.duration,\n props: [{\n prop: 'fullscreen',\n from: true,\n to: false\n }]\n })\n }\n const isVideo = checkIsCurrentVideo(fullEl, this.playerId, PLATER_ID)\n if (isFullScreen || (fullEl && (fullEl === this._fullscreenEl || isVideo))) {\n delayResize()\n !this.config.closeFocusVideoFocus && this.media.focus()\n this.fullscreen = true\n // this.addClass(STATE_CLASS.FULLSCREEN)\n this.changeFullStyle(this.root, fullEl, STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, true, this._fullScreenOffset)\n if (this.cssfullscreen) {\n this.exitCssFullscreen()\n }\n } else if (this.fullscreen) {\n delayResize()\n const { _fullScreenOffset, config } = this\n if (config.needFullscreenScroll) {\n // 保证页面scroll的情况下退出全屏 页面回到原位置\n window.scrollTo(_fullScreenOffset.left, _fullScreenOffset.top)\n Util.setTimeout( this, () => {\n this.fullscreen = false\n this._fullScreenOffset = null\n }, 100)\n } else {\n // 保证页面scroll的情况下退出全屏 页面定位在播放器位置\n !this.config.closeFocusVideoFocus && this.media.focus()\n this.fullscreen = false\n this._fullScreenOffset = null\n }\n if (!this.cssfullscreen) {\n let el = this._fullscreenEl\n if (!el && (this.root.contains(event.target) || event.target === this.root)) {\n el = event.target\n }\n this.recoverFullStyle( this.root, el, STATE_CLASS.FULLSCREEN)\n } else {\n this.removeClass(STATE_CLASS.FULLSCREEN)\n }\n this._fullscreenEl = null\n // this.removeClass(STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n }\n }\n\n _onWebkitbeginfullscreen = (e) => {\n this._fullscreenEl = this.media\n this.onFullscreenChange(e, true)\n }\n\n _onWebkitendfullscreen = (e) => {\n this.onFullscreenChange(e, false)\n }\n\n onEmptied () {\n this.updateAcc('emptied')\n }\n\n /**\n * @protected\n */\n onCanplay () {\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.ERROR)\n this.removeClass(STATE_CLASS.LOADING)\n this.isCanplay = true\n this.waitTimer && Util.clearTimeout(this, this.waitTimer)\n }\n\n onLoadeddata () {\n this.isError = false\n this.isSeeking = false\n if (this.__startTime > 0) {\n if (this.duration > 0) {\n this._seekToStartTime()\n } else {\n // 在安卓原生video播放hls时,loadeddata触发时durationchange事件虽然已经触发过了但duration仍然为0,\n // 需要在下一次durationchange触发时再重新设置起播时间\n this.once(Events.DURATION_CHANGE, () => {\n this._seekToStartTime()\n })\n }\n }\n }\n\n onLoadstart () {\n this.removeClass(STATE_CLASS.ERROR)\n this.isCanplay = false\n }\n\n /**\n * @protected\n */\n onPlay () {\n if (this.state === STATES.ENDED) {\n this.setState(STATES.RUNNING)\n }\n this.removeClass(STATE_CLASS.PAUSED)\n this.ended && this.removeClass(STATE_CLASS.ENDED)\n !this.config.closePlayVideoFocus && this.focus()\n }\n\n /**\n * @protected\n */\n onPause () {\n this.addClass(STATE_CLASS.PAUSED)\n this.updateAcc('pause')\n if (!this.config.closePauseVideoFocus) {\n this._clearUserTimer()\n this.focus()\n }\n }\n\n /**\n * @protected\n */\n onEnded () {\n this.updateAcc('ended')\n this.addClass(STATE_CLASS.ENDED)\n this.setState(STATES.ENDED)\n // this.removeClass(STATE_CLASS.PLAYING)\n }\n\n /**\n * @protected\n */\n onError () {\n // this.setState(STATES.ERROR)\n this.isError = true\n this.updateAcc('error')\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.LOADING)\n this.addClass(STATE_CLASS.ERROR)\n }\n\n /**\n * @protected\n */\n onSeeking () {\n if (!this.isSeeking) {\n this.updateAcc('seeking')\n }\n this.isSeeking = true\n this.addClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onSeeked () {\n this.isSeeking = false\n // for ie,playing fired before waiting\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.removeClass(STATE_CLASS.LOADING)\n this.removeClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onWaiting () {\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.updateAcc('waiting')\n this.waitTimer = Util.setTimeout(this, () => {\n this.addClass(STATE_CLASS.LOADING)\n this.emit(Events.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }, this.config.minWaitDelay)\n }\n\n /**\n * @protected\n */\n onPlaying () {\n this.isError = false\n const { NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING } = STATE_CLASS\n const clsList = [NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING]\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n /**\n * @protected\n */\n onTimeupdate () {\n !this._videoHeight && this.media.videoHeight && this.resize()\n if ((this.waitTimer || this.hasClass(STATE_CLASS.LOADING)) &&\n this.media.readyState > 2\n ) {\n this.removeClass(STATE_CLASS.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }\n\n // 兼容safari在调整为静音之后未调用play自动起播问题\n if (!this.paused && this.state === STATES.NOTALLOW && this.duration) {\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n\n if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n onVolumechange () {\n Util.typeOf(this.config.volume) === 'Number' &&\n (this.config.volume = this.volume)\n }\n\n onRatechange () {\n this.config.defaultPlaybackRate = this.playbackRate\n }\n\n /**\n * 触发用户行为事件,第一个参数是Dom事件\n * @param { Event } event\n * @param { string } action\n * @param {[propName: string]: any; } [params]\n * @returns\n */\n emitUserAction (event, action, params) {\n if (!this.media || !action || !event) {\n return\n }\n const eventType =\n Util.typeOf(event) === 'String' ? event : event.type || ''\n\n // if (action === 'switch_play_pause') {\n // Util.typeOf(params.paused) === 'Undefined' && (params.paused = this.paused)\n // params.isFirstStart = !this.playing\n // }\n\n if (params.props && Util.typeOf(params.props) !== 'Array') {\n params.props = [params.props]\n }\n this.emit(Events.USER_ACTION, {\n eventType,\n action,\n // pluginName: this.pluginName,\n currentTime: this.currentTime,\n duration: this.duration,\n ended: this.ended,\n event,\n ...params\n })\n }\n\n updateAcc (endType) {\n if (this._accPlayed.t) {\n const _at = new Date().getTime() - this._accPlayed.t\n this._accPlayed.acc += _at\n this._accPlayed.t = 0\n if (endType === 'ended' || this.ended) {\n this._accPlayed.loopAcc = this._accPlayed.acc\n }\n }\n }\n\n /**\n * 目标时间点是否在buffer内\n * @param { number } time 时间点\n * @param options 判断阈值配置,可选的\n * @param options.startDiff 判断起始阈值,即该时间下距离buffer开始点超过阈值时才算作在buffer内,默认为0\n * @param options.endDiff 判断结束阈值,即该时间下距离buffer结束点超过阈值时才算作在buffer内,默认为0\n * @returns { boolean }\n */\n checkBuffer (\n time,\n options = {\n startDiff: 0,\n endDiff: 0\n }) {\n const { startDiff = 0, endDiff = 0 } = options || {}\n const buffered = this.media.buffered\n if (!buffered || buffered.length === 0 || !this.duration) {\n return true\n }\n const currentTime = time || this.media.currentTime || 0.2\n const len = buffered.length\n for (let i = 0; i < len; i++) {\n if (buffered.start(i) + startDiff <= currentTime && buffered.end(i) - endDiff > currentTime) {\n return true\n }\n }\n return false\n }\n\n resizePosition () {\n const { vy, vx, h, w } = this.videoPos\n let rotate = this.videoPos.rotate\n if (rotate < 0 && h < 0 && w < 0) {\n return\n }\n let _pi = this.videoPos._pi\n if (!_pi && this.media.videoHeight) {\n _pi = this.media.videoWidth / this.media.videoHeight * 100\n }\n if (!_pi) {\n return\n }\n this.videoPos.pi = _pi\n rotate = rotate < 0 ? 0 : rotate\n const _pos = {\n rotate\n }\n let offsetY = 0\n let offsetX = 0\n let scale = 1\n const _t = Math.abs(rotate / 90)\n const { root, innerContainer } = this\n const width = root.offsetWidth\n const height = innerContainer ? innerContainer.offsetHeight : root.offsetHeight\n const styles = {}\n let rHeight = height\n let rWidth = width\n\n if (_t % 2 === 0) {\n scale = h > 0 ? 100 / h : (w > 0 ? 100 / w : 1)\n _pos.scale = scale\n offsetY = vy > 0 ? (100 - h) / 2 - vy : 0\n _pos.y = _t === 2 ? 0 - offsetY : offsetY\n offsetX = vx > 0 ? (100 - w) / 2 - vx : 0\n _pos.x = _t === 2 ? 0 - offsetX : offsetX\n styles.width = `${rWidth}px`\n styles.height = `${rHeight}px`\n styles.maxWidth = ''\n styles.maxHeight = ''\n } else if (_t % 2 === 1) {\n rWidth = height\n rHeight = width\n const offset = height - width\n offsetX = -offset / 2 / rWidth * 100\n _pos.x = _t === 3 ? offsetX + vy / 2 : offsetX - vy / 2\n offsetY = offset / 2 / rHeight * 100\n _pos.y = _t === 3 ? offsetY + vx / 2 : offsetY - vx / 2\n _pos.scale = scale\n styles.width = `${rWidth}px`\n styles.maxWidth = `${rWidth}px`\n styles.height = `${rHeight}px`\n styles.maxHeight = `${rHeight}px`\n }\n const formStyle = Util.getTransformStyle(_pos, this.media.style.transform || this.media.style.webkitTransform)\n styles.transform = formStyle\n styles.webkitTransform = formStyle\n\n Object.keys(styles).map(key => {\n this.media.style[key] = styles[key]\n })\n }\n\n /**\n * @description position video/audio according to height ratio and y coordinate\n * @param { { h: number, y?: number, x?:number, w?:number} } pos\n * @returns\n */\n position (pos = { h: 0, y: 0, x: 0, w: 0 }) {\n if (!this.media || !pos || !pos.h) {\n return\n }\n const { videoPos } = this\n videoPos.h = pos.h * 100 || 0\n videoPos.w = pos.w * 100 || 0\n videoPos.vx = pos.x * 100 || 0\n videoPos.vy = pos.y * 100 || 0\n this.resizePosition()\n }\n\n /**\n * @description Update configuration parameters\n * @param { IPlayerOptions } config\n */\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map((key) => {\n if (key !== 'plugins') {\n this.config[key] = config[key]\n const plugin = this.plugins[key.toLowerCase()]\n if (plugin && Util.typeOf(plugin.setConfig) === 'Function') {\n plugin.setConfig(config[key])\n }\n }\n })\n }\n\n /**\n * @description play another video resource\n * @param { IPlayerOptions } config\n */\n playNext (config) {\n this.resetState()\n this.setConfig(config)\n this._currentTime = 0\n this._duration = 0\n runHooks(this, 'playnext', () => {\n this.start()\n this.emit(Events.PLAYNEXT, config)\n })\n }\n\n resize () {\n if (!this.media) {\n return\n }\n const containerSize = this.root.getBoundingClientRect()\n this.sizeInfo.width = containerSize.width\n this.sizeInfo.height = containerSize.height\n this.sizeInfo.left = containerSize.left\n this.sizeInfo.top = containerSize.top\n const { videoWidth, videoHeight } = this.media\n const { fitVideoSize, videoFillMode } = this.config\n\n if (videoFillMode === 'fill' || videoFillMode === 'cover' || videoFillMode === 'contain') {\n this.setAttribute('data-xgfill', videoFillMode)\n }\n\n if (!videoHeight || !videoWidth) {\n return\n }\n this._videoHeight = videoHeight\n this._videoWidth = videoWidth\n const controlsHeight =\n this.controls && this.innerContainer\n ? this.controls.root.getBoundingClientRect().height\n : 0\n const width = containerSize.width\n const height = containerSize.height - controlsHeight\n const videoFit = parseInt((videoWidth / videoHeight) * 1000, 10)\n const fit = parseInt((width / height) * 1000, 10)\n let rWidth = width\n let rHeight = height\n const _style = {}\n if (\n (fitVideoSize === 'auto' && fit > videoFit) ||\n fitVideoSize === 'fixWidth'\n ) {\n rHeight = (width / videoFit) * 1000\n if (this.config.fluid) {\n _style.paddingTop = `${(rHeight * 100) / rWidth}%`\n } else {\n _style.height = `${rHeight + controlsHeight}px`\n }\n } else if (\n (fitVideoSize === 'auto' && fit < videoFit) ||\n fitVideoSize === 'fixHeight'\n ) {\n rWidth = (videoFit * height) / 1000\n _style.width = `${rWidth}px`\n }\n // 全屏不做行间css设置\n if (!this.fullscreen && !this.cssfullscreen) {\n Object.keys(_style).forEach((key) => {\n this.root.style[key] = _style[key]\n })\n }\n // video填充模式\n if (\n (videoFillMode === 'fillHeight' && fit < videoFit) ||\n (videoFillMode === 'fillWidth' && fit > videoFit)\n ) {\n this.setAttribute('data-xgfill', 'cover')\n }\n const data = {\n videoScale: videoFit,\n vWidth: rWidth,\n vHeight: rHeight,\n cWidth: rWidth,\n cHeight: rHeight + controlsHeight\n }\n this.resizePosition()\n this.emit(Events.VIDEO_RESIZE, data)\n }\n\n /**\n *\n * @param { number } left\n * @param { number } top\n * @returns\n */\n updateObjectPosition (left = 0, top = 0) {\n if (this.media.updateObjectPosition) {\n this.media.updateObjectPosition(left, top)\n return\n }\n this.media.style.objectPosition = `${left * 100}% ${top * 100}%`\n }\n\n /**\n * @protected\n * @param { number } newState\n */\n setState (newState) {\n XG_DEBUG.logInfo(\n 'setState',\n `state from:${STATE_ARRAY[this.state]} to:${STATE_ARRAY[newState]}`\n )\n this._state = newState\n }\n\n /**\n * @description url preprocessing\n * @param { IUrl } url\n * @param { {[propName: string]: any} } [ext]\n * @returns { url: IUrl, [propName: string]: any }\n * @public\n */\n preProcessUrl (url, ext) {\n const { preProcessUrl, preProcessUrlOptions } = this.config\n const processUrlOptions = Object.assign({}, preProcessUrlOptions, ext)\n return !Util.isBlob(url) && typeof preProcessUrl === 'function' ? preProcessUrl(url, processUrlOptions) : { url }\n }\n\n\n /**\n * @description 跳转至配置的起播时间点\n */\n _seekToStartTime () {\n if (this.__startTime > 0 && this.duration > 0) {\n this.currentTime = this.__startTime > this.duration ? this.duration : this.__startTime\n this.__startTime = -1\n }\n }\n\n /**\n * @type { number }\n */\n get state () {\n return this._state\n }\n\n /**\n * @type { boolean }\n */\n get isFullscreen () {\n return this.fullscreen\n }\n\n /**\n * @type { boolean }\n */\n get isCssfullScreen () {\n return this.cssfullscreen\n }\n\n /**\n * @type { boolean }\n * @description 是否开始播放\n */\n get hasStart () {\n return this._hasStart\n }\n\n set hasStart (bool) {\n if (typeof bool === 'boolean') {\n this._hasStart = bool\n if (bool === false) {\n this.setState(STATES.READY)\n }\n this.emit('hasstart')\n }\n }\n\n /**\n * @type { boolean }\n * @description 是否已经进入起播状态\n */\n get isPlaying () {\n return this._state === STATES.RUNNING || this._state === STATES.ENDED\n }\n\n set isPlaying (value) {\n if (value) {\n this.setState(STATES.RUNNING)\n } else {\n this._state >= STATES.RUNNING && (this.setState(STATES.ATTACHED))\n }\n }\n\n /**\n * @type { Array.<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 { acc, t } = this._accPlayed\n return t ? new Date().getTime() - t + acc : acc\n }\n\n /**\n * @type { number }\n */\n get zoom () {\n return this.config.zoom\n }\n\n /**\n * @type { number }\n */\n set zoom (value) {\n this.config.zoom = value\n }\n\n /**\n * @type {number}\n * @description Media element rotation angle, Only multiples of 90 degrees are supported\n */\n set videoRotateDeg (val) {\n val = Util.convertDeg(val)\n if (val % 90 !== 0 || val === this.videoPos.rotate) {\n return\n }\n this.videoPos.rotate = val\n this.resizePosition()\n }\n\n get videoRotateDeg () {\n return this.videoPos.rotate\n }\n\n /**\n * @description 均衡下载速度,单位kb/s, 根据10条最新下载速度计算出来的加权值,如果没有测速能力则默认是0\n * @type { number }\n */\n set avgSpeed (val) {\n AVG_SPEED = val\n }\n\n get avgSpeed () {\n return AVG_SPEED\n }\n\n /**\n * @type { number }\n * 最新一次下载速度,单位kb/s, 如果没有测速能力则默认是0\n */\n set realTimeSpeed (val) {\n REAL_TIME_SPEED = val\n }\n\n get realTimeSpeed () {\n return REAL_TIME_SPEED\n }\n\n get offsetCurrentTime () {\n return this._offsetInfo.currentTime || 0\n }\n\n set offsetCurrentTime (val) {\n this._offsetInfo.currentTime = val\n }\n\n get offsetDuration () {\n return this._offsetInfo.duration || 0\n }\n\n set offsetDuration (val) {\n this._offsetInfo.duration = val || 0\n }\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param {...any} args\n */\n runHooks (...args) {\n return runHooks.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 if (Util.typeOf(isMuted) === Boolean) {\n /**\n * @type {boolean}\n */\n this.muted = isMuted\n }\n }\n instManager?.setActive(this.playerId, isActive)\n }\n\n /**\n * 当前浏览器是否支持hevc编码\n * @returns {boolean}\n */\n static isHevcSupported () {\n return Sniffer.isHevcSupported()\n }\n\n /**\n * 检测编码参数是否被当前浏览器支持\n * @doc https://developer.mozilla.org/en-US/docs/Web/API/MediaCapabilities/decodingInfo\n * @param {MediaDecodingConfiguration} info\n * @returns {MediaCapabilitiesDecodingInfo}\n */\n static probeConfigSupported (info) {\n return Sniffer.probeConfigSupported(info)\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static install (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n if (!Player.plugins[name]) {\n Player.plugins[name] = descriptor\n }\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static use (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n Player.plugins[name] = descriptor\n }\n\n static defaultPreset = null;\n\n /**\n * @description 自定义media构造函数\n */\n static XgVideoProxy = null;\n}\n\n// use the default instance manager.\nPlayer.instManager = InstManager.getInstance()\n\nexport {\n Player as default,\n Plugin,\n BasePlugin,\n Events,\n Errors,\n Sniffer,\n Util,\n STATE_CLASS,\n I18N\n}\n","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 from '../../plugin'\n\nexport default class Icon extends Plugin {\n afterCreate () {\n this.bind('mouseenter', this._onMouseenter)\n this.bind('mouseleave', this._onMouseLeave)\n if (this.config.disable) {\n this.disable()\n }\n }\n\n _onMouseenter = (e) => {\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n _onMouseLeave = (e) => {\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n destroy () {\n this.unbind('mouseenter', this._onMouseenter)\n this.unbind('mouseleave', this._onMouseLeave)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport 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, { 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 * useScreenOrientation?: boolean,\n * lockOrientationType?: OrientationType,\n * switchCallback?: () => any,\n * target?: null | HTMLElement,\n * disable?: boolean,\n * needBackIcon?: boolean,\n * [propName: string]: any\n * } } IFullscreenConfig\n */\nexport default class Fullscreen extends IconPlugin {\n static get pluginName () {\n return 'fullscreen'\n }\n\n /**\n * @type IFullscreenConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 0,\n useCssFullscreen: false, // Whether to use the page full screen\n rotateFullscreen: false, // Whether to enable rotating full screen\n useScreenOrientation: false, // Whether to use ScreenOrientation lock after requestFullScreen if ScreenOrientation available\n lockOrientationType: 'landscape', // Whether to lock screen if video width is greater than height\n switchCallback: null, // Custom switch function\n target: null, // Trigger Dom element\n disable: false,\n needBackIcon: false // Whether to enable the return button in the upper left corner of the full screen exit\n }\n }\n\n afterCreate () {\n super.afterCreate()\n const { config, playerConfig } = this\n if (config.disable) {\n return\n }\n\n if (config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n const fullEl = Util.getFullScreenEl()\n\n if (playerConfig.fullscreenTarget === fullEl) {\n this.player.getFullscreen().catch(e=>{})\n }\n\n this.initIcons()\n\n this.handleFullscreen = this.hook('fullscreenChange', this.toggleFullScreen, {\n pre: (e) => {\n const { fullscreen } = this.player\n this.emitUserAction(e, 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n }\n })\n\n this.bind('.xgplayer-fullscreen', ['touchend', 'click'], this.handleFullscreen)\n\n this.on(Events.FULLSCREEN_CHANGE, (isFullScreen) => {\n const tipsDom = this.find('.xg-tips')\n tipsDom && this.changeLangTextKey(tipsDom, isFullScreen ? this.i18nKeys.EXITFULLSCREEN_TIPS : this.i18nKeys.FULLSCREEN_TIPS)\n this.animate(isFullScreen)\n })\n if (this.config.needBackIcon) {\n this.topBackIcon = this.player.registerPlugin({\n plugin: TopBackIcon,\n options: {\n config: {\n onClick: (e) => {\n this.handleFullscreen(e)\n }\n }\n }\n })\n }\n if (Sniffer.device === 'mobile') {\n window.addEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n /**\n * @private\n */\n _onOrientationChange = (e) => {\n if (this.player.fullscreen && this.config.rotateFullscreen) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.player.setRotateDeg(0)\n } else {\n this.player.setRotateDeg(90)\n }\n }\n }\n\n registerIcons () {\n return {\n fullscreen: { icon: FullScreenSvg, class: 'xg-get-fullscreen' },\n exitFullscreen: { icon: ExitFullScreenSvg, class: 'xg-exit-fullscreen' }\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.handleFullscreen)\n if (Sniffer.device === 'mobile') {\n window.removeEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.fullscreen)\n this.appendChild('.xgplayer-icon', icons.exitFullscreen)\n }\n\n /**\n * 切换全屏\n * @param { Event } [e]\n */\n toggleFullScreen (e) {\n if (e instanceof Event) {\n e.preventDefault()\n e.stopPropagation()\n }\n const { player, config } = this\n const useCssFullscreen = config.useCssFullscreen === true || (typeof config.useCssFullscreen === 'function' && config.useCssFullscreen())\n if (useCssFullscreen) {\n if (player.fullscreen) {\n player.exitCssFullscreen()\n } else {\n player.getCssFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.rotateFullscreen) {\n if (player.fullscreen) {\n player.exitRotateFullscreen()\n } else {\n player.getRotateFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.switchCallback && typeof config.switchCallback === 'function') {\n config.switchCallback(player.fullscreen)\n } else {\n if (player.fullscreen) {\n player.exitFullscreen()\n\n if (config.useScreenOrientation) {\n this.unlockScreen()\n }\n } else {\n player.getFullscreen().catch(e => {})\n\n if (config.useScreenOrientation && player.aspectRatio > 1) {\n this.lockScreen(config.lockOrientationType)\n }\n }\n }\n }\n\n /**\n *\n * @param { boolean } isFullScreen\n */\n animate (isFullScreen) {\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n if (this.topBackIcon) {\n if (isFullScreen) {\n this.topBackIcon.show()\n this.hide()\n } else {\n this.topBackIcon.hide()\n this.show()\n }\n }\n }\n\n /**\n * @returns\n */\n render () {\n if (this.config.disable) {\n return\n }\n const langKey = 'FULLSCREEN_TIPS'\n return `<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 /**\n * 锁定屏幕方向,只有部分移动端浏览器支持\n * 兼容性参考:https://caniuse.com/mdn-api_screenorientation_lock\n * @param {OrientationType} orientation\n */\n lockScreen (orientation) {\n try {\n screen.orientation.lock(orientation).catch(e => {})\n } catch (e) {\n }\n }\n\n /**\n * 解锁屏幕方向锁定,只有部分移动端浏览器支持\n */\n unlockScreen () {\n try {\n screen.orientation.unlock().catch(e => {})\n } catch (e) {\n }\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\nclass Play extends IconPlugin {\n static get pluginName () {\n return 'play'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 0,\n disable: false\n }\n }\n\n afterCreate () {\n super.afterCreate()\n const { config } = this\n if (config.disable) {\n return\n }\n this.initIcons()\n this.bind(['touchend', 'click'], this.btnClick)\n\n this.listenEvents()\n this.animate(true)\n }\n\n listenEvents () {\n const { player } = this\n this.on([Events.PLAY, Events.PAUSE, Events.ERROR, Events.EMPTIED], () => {\n this.animate(player.paused)\n })\n }\n\n registerIcons () {\n return {\n play: { icon: PlaySvg, class: 'xg-icon-play' },\n pause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n btnClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { prop: 'paused', from: player.paused, to: !player.paused })\n if (player.ended) {\n player.replay()\n } else if (player.paused) {\n player.play()\n this.animate(false)\n } else {\n player.pause()\n this.animate(true)\n }\n return false\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.play)\n this.appendChild('.xgplayer-icon', icons.pause)\n }\n\n animate (paused) {\n if (!this.player) {return}\n const { i18nKeys } = this\n const tipDom = this.find('.xg-tips')\n if (paused) {\n this.setAttr('data-state', 'pause')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PLAY_TIPS)\n } else {\n this.setAttr('data-state', 'play')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PAUSE_TIPS)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['touchend', 'click'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<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 { Util } from '../../plugin'\n\nconst TPL = [\n { tag: 'xg-cache', className: 'xgplayer-progress-cache', styleKey: 'cachedColor' },\n { tag: 'xg-played', className: 'xgplayer-progress-played', styleKey: 'playedColor' }\n]\n\nexport default class InnerList {\n constructor (args) {\n this.fragments = args.fragments || []\n if (this.fragments.length === 0) {\n this.fragments.push({ percent: 1 })\n }\n this._callBack = args.actionCallback\n this.fragConfig = {\n fragFocusClass: args.fragFocusClass || 'inner-focus-point', // 'inner-focus',\n fragAutoFocus: !!args.fragAutoFocus,\n fragClass: args.fragClass || ''\n }\n this.style = args.style || {\n playedColor: '',\n cachedColor: '',\n progressColor: ''\n }\n this.duration = 0\n this.cachedIndex = 0\n this.playedIndex = 0\n this.focusIndex = -1\n }\n\n updateDuration (duration) {\n this.duration = duration\n let start = 0\n const { fragments } = this\n this.fragments = fragments.map(item => {\n item.start = parseInt(start, 10)\n item.end = parseInt(start + item.percent * this.duration, 10)\n item.duration = parseInt(item.percent * this.duration, 10)\n start += item.percent * this.duration\n return item\n })\n }\n\n updateProgress (type = 'played', data = { newIndex: 0, curIndex: 0, millisecond: 0 }) {\n const { progressList, fragments } = this\n if (progressList.length < 1) {\n return\n }\n const { newIndex, curIndex, millisecond } = data\n if (newIndex !== curIndex) {\n progressList.map((item, index) => {\n if (index < newIndex) {\n item[type].style.width = '100%'\n } else if (index > newIndex) {\n item[type].style.width = 0\n }\n })\n }\n const curPFrag = fragments[newIndex]\n const per = millisecond === 0 ? 0 : (millisecond - curPFrag.start) / curPFrag.duration\n progressList[newIndex][type].style.width = per < 0 ? 0 : `${per * 100}%`\n }\n\n updateFocus (data) {\n if (!this.fragConfig.fragAutoFocus || this.fragments.length < 2) {\n return\n }\n if (!data) {\n // 取消焦点\n if (this.focusIndex > -1) {\n this.unHightLight(this.focusIndex)\n const _data = {\n index: -1,\n preIndex: this.focusIndex,\n fragment: null\n }\n this._callBack && this._callBack(_data)\n this.focusIndex = -1\n }\n return\n }\n const newPIndex = this.findIndex(data.currentTime * 1000, this.focusIndex)\n if (newPIndex >= 0 && newPIndex !== this.focusIndex) {\n this.focusIndex > -1 && this.unHightLight(this.focusIndex)\n this.setHightLight(newPIndex)\n const _data = {\n index: newPIndex,\n preIndex: this.focusIndex,\n fragment: this.fragments[this.focusIndex]\n }\n this.focusIndex = newPIndex\n this._callBack && this._callBack(_data)\n }\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!this.duration || parseInt(duration * 1000, 10) !== this.duration) {\n if (!duration && duration !== 0) {\n return\n }\n this.updateDuration(parseInt(duration * 1000, 10))\n }\n const { playedIndex, cachedIndex } = this\n if (Util.typeOf(data.played) !== 'Undefined') {\n const newPIndex = this.findIndex(data.played * 1000, playedIndex)\n if (newPIndex < 0) {\n return\n }\n this.updateProgress('played', {\n newIndex: newPIndex,\n curIndex: playedIndex,\n millisecond: parseInt(data.played * 1000, 10)\n })\n this.playedIndex = newPIndex\n }\n\n if (Util.typeOf(data.cached) !== 'Undefined') {\n const newCIndex = this.findIndex(data.cached * 1000, cachedIndex)\n if (newCIndex < 0) {\n return\n }\n this.updateProgress('cached', {\n newIndex: newCIndex,\n curIndex: cachedIndex,\n millisecond: parseInt(data.cached * 1000, 10)\n })\n this.cachedIndex = newCIndex\n }\n }\n\n findIndex (time, curIndex) {\n const { fragments } = this\n if (!fragments || fragments.length === 0) {\n return -1\n }\n if (fragments.length === 1) {\n return 0\n }\n if (curIndex > -1 && curIndex < fragments.length && time > fragments[curIndex].start && time < fragments[curIndex].end) {\n return curIndex\n }\n if (time > fragments[fragments.length - 1].start) {\n return fragments.length - 1\n }\n\n for (let i = 0; i < fragments.length; i++) {\n if (time > fragments[i].start && time <= fragments[i].end) {\n curIndex = i\n break\n }\n }\n return curIndex\n }\n\n findHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n if (Util.hasClass(children[i], this.fragConfig.fragFocusClass)) {\n return {\n dom: children[i],\n pos: children[i].getBoundingClientRect()\n }\n }\n }\n }\n\n // 根据索引获取进度条片段\n findFragment (index) {\n const children = this.root.children\n if (index < 0 || index >= children.length) {\n return null\n }\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n\n unHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n Util.removeClass(children[i], this.fragConfig.fragFocusClass)\n }\n }\n\n setHightLight (index) {\n const children = this.root.children\n if (index < children.length) {\n Util.addClass(children[index], this.fragConfig.fragFocusClass)\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n }\n\n destroy () {\n this.progressList = null\n this.fragments = null\n this.root.innerHTML = ''\n }\n\n /**\n * 重置当前\n * @param {*} newOptions\n */\n reset (newOptions) {\n // 更新fragConfig\n Object.keys(this.fragConfig).forEach(key => {\n if (newOptions[key] !== undefined) {\n this.fragConfig[key] = newOptions[key]\n }\n })\n if (newOptions.fragments) {\n this.fragments = newOptions.fragments.length === 0 ? [{ percent: 1 }] : newOptions.fragments\n this.updateDuration(this.duration)\n this.playedIndex = 0\n this.cachedIndex = 0\n // 移除分段信息\n if (this.root) {\n const _c = this.root.children\n while (_c.length > 0) {\n this.root.removeChild(_c[0])\n }\n }\n // 重新渲染\n this.render()\n }\n }\n\n render () {\n const { progressColor } = this.style\n if (!this.root) {\n this.root = Util.createDom('xg-inners', '', {}, 'progress-list')\n }\n if (this.fragments) {\n const { fragClass, fragFocusClass } = this.fragConfig\n this.progressList = this.fragments.map((item) => {\n const inner = Util.createDom('xg-inner', '', {\n style: progressColor ? `background:${progressColor}; flex: ${item.percent}` : `flex: ${item.percent}`\n }, `${item.isFocus ? fragFocusClass : ''} xgplayer-progress-inner ${fragClass}`)\n\n this.root.appendChild(inner)\n\n TPL.forEach(item => {\n inner.appendChild(Util.createDom(item.tag, '', {\n style: item.styleKey ? `background: ${this.style[item.styleKey]}; width:0;` : 'width:0;'\n }, item.className))\n })\n\n return {\n cached: inner.children[0],\n played: inner.children[1]\n }\n })\n }\n return this.root\n }\n}\n","import Plugin, { Events, Util, POSITIONS, Sniffer } from '../../plugin'\nimport InnerList from './innerList'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?:string,\n * disable?: boolean,\n * isDraggingSeek?: boolean, // 是否在拖拽的过程中更新currentTime\n * closeMoveSeek?: boolean, // 是否关闭滑块seek能力\n * isPauseMoving?: boolean, // 是否在move的时候暂停视频内容\n * isCloseClickSeek?: boolean, // 是否关闭点击进度条的时候seek\n * fragments?: Array<{percent: number}>,\n * fragFocusClass?: string, // 进度条分段高亮类名\n * fragAutoFocus?: boolean, // 是否hover的时候自动高亮\n * miniMoveStep?: number,\n * miniStartStep?: number,\n * onMoveStart?: () => any, // 手势开始移动回调,\n * onMoveEnd?: () => any, // 手势移动结束回调\n * endedDiff?: number,\n * [propName: string]: any\n * }} IProgressConfig\n */\n/**\n * 进度条组件\n */\n\n// 分段获取焦点显示的时候的两种class类型\nconst FRAGMENT_FOCUS_CLASS = {\n POINT: 'inner-focus-point',\n HIGHLIGHT: 'inner-focus-highlight'\n}\nclass Progress extends Plugin {\n static get pluginName () {\n return 'progress'\n }\n\n /**\n * @type IProgressConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_CENTER,\n index: 0,\n disable: false,\n isDraggingSeek: true, // 是否在拖拽的过程中更新currentTime\n closeMoveSeek: false, // 是否关闭滑块seek能力\n isPauseMoving: false, // 是否在move的时候暂停视频内容\n isCloseClickSeek: false, // 是否关闭点击进度条的时候seek\n fragments: [{ percent: 1 }],\n fragFocusClass: FRAGMENT_FOCUS_CLASS.POINT,\n fragClass: '', // 内置进度条类名\n fragAutoFocus: false, // 是否hover的时候自动高亮\n miniMoveStep: 5,\n miniStartStep: 2,\n onMoveStart: () => {\n }, // 手势开始移动回调\n onMoveEnd: () => {}, // 手势移动结束回调\n endedDiff: 0.2\n }\n }\n\n static get FRAGMENT_FOCUS_CLASS () {\n return FRAGMENT_FOCUS_CLASS\n }\n\n constructor (args) {\n super(args)\n /**\n * @readonly\n */\n this.useable = false\n /**\n * @readonly\n */\n this.isProgressMoving = false\n\n /**\n * @private\n */\n this.__dragCallBacks = []\n /**\n * @private\n */\n this._state = {\n now: -1,\n direc: 0,\n time: 0,\n prePlayTime: -1\n }\n\n this._disableBlur = false\n\n // 兼容旧版本\n if (typeof this.config.isDragingSeek === 'boolean') {\n console.warn('[XGPLAYER] \\'isDragingSeek\\' is deprecated, please use \\'isDraggingSeek\\' instead')\n this.config.isDraggingSeek = this.config.isDragingSeek\n }\n }\n\n get offsetDuration () {\n return this.playerConfig.customDuration || this.player.offsetDuration || this.player.duration\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : (currentTime + this.timeOffset)\n }\n\n changeState (useable = true) {\n this.useable = useable\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n this.root && (this.root.style.display = 'flex')\n }\n /**\n * @description 创建内部进度条,并挂载到xg-outer上,\n * 并把一些对外API绑定在progress上供外部调用\n *\n */\n _initInner (fragments = [], config = {}) {\n if (!fragments || fragments.length === 0) {\n fragments = [{ percent: 1 }]\n }\n const _c = {\n fragments,\n ...config,\n actionCallback: (data) => {\n this.emitUserAction('fragment_focus', 'fragment_focus', data)\n }\n }\n if (!this.innerList) {\n this.innerList = new InnerList(_c)\n this.outer.insertBefore(this.innerList.render(), this.outer.children[0]);\n ['findHightLight', 'unHightLight', 'setHightLight', 'findFragment'].map(item => {\n this[item] = this.innerList[item].bind(this.innerList)\n })\n } else {\n this.innerList.reset(_c)\n }\n }\n\n _updateInnerFocus (data) {\n this.innerList && this.innerList.updateFocus(data)\n }\n\n afterCreate () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n this.pos = {\n x: 0, // 水平方向位移\n y: 0, // 垂直方向位移\n moving: false, // 是否正在移动\n isDown: false, // 是否mouseDown\n isEnter: false, // 是否触发了mouseEnter\n isLocked: false // 是否刚刚锁定回过进度条\n }\n this.outer = this.find('xg-outer')\n const { fragFocusClass, fragAutoFocus, fragClass } = this.config\n this._initInner(this.config.fragments, { fragFocusClass, fragAutoFocus, fragClass, style: this.playerConfig.commonStyle || {} })\n if (Sniffer.device === 'mobile') {\n this.config.isDraggingSeek = false\n this.isMobile = true\n }\n\n this.progressBtn = this.find('.xgplayer-progress-btn')\n\n this.listenEvents()\n this.bindDomEvents()\n this.initCustomStyle()\n }\n\n /**\n * This method can be overridden.\n * Eg. xgplayer-ads/ui/adProgress.js\n */\n listenEvents () {\n this.on(Events.DURATION_CHANGE, () => {\n this.onMouseLeave()\n })\n\n this.on(Events.TIME_UPDATE, () => {\n this.onTimeupdate()\n })\n\n this.on(Events.SEEKED, () => {\n this.onTimeupdate()\n this.onCacheUpdate()\n })\n\n this.on(Events.PROGRESS, () => {\n this.onCacheUpdate()\n })\n\n this.on(Events.ENDED, () => {\n this.onCacheUpdate(true)\n this.onTimeupdate(true)\n this._state.now = 0\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n\n this.on(Events.VIDEO_RESIZE, () => {\n this.onVideoResize()\n })\n }\n\n /**\n * @description 配置更新响应,插件内置调用api, 播放器整体配置更新的时候调用\n * @param {IProgressConfig} config\n */\n setConfig (config) {\n let frags = null\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n if (key === 'fragments') {\n frags = config[key]\n }\n })\n if (frags) {\n this._initInner(frags, config)\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { sliderBtnStyle } = commonStyle\n const { progressBtn } = this\n if (sliderBtnStyle) {\n if (typeof sliderBtnStyle === 'string') {\n progressBtn.style.boxShadow = sliderBtnStyle\n } else if (typeof sliderBtnStyle === 'object') {\n Object.keys(sliderBtnStyle).map(key => {\n progressBtn.style[key] = sliderBtnStyle[key]\n })\n }\n }\n }\n\n /**\n * 触发某一类回调监听\n * @param { string } type 类型 drag/dragend\n * @param { any} data 具体数据\n */\n triggerCallbacks (type, data, event) {\n if (this.__dragCallBacks.length > 0) {\n this.__dragCallBacks.map(item => {\n if (item && item.handler && item.type === type) {\n try {\n item.handler(data, event)\n } catch (error) {\n console.error(`[XGPLAYER][triggerCallbacks] ${item} error`, error)\n }\n }\n })\n }\n }\n\n /**\n * 供外部插件添加回调\n * @param {string} type 类型 drag/dragend\n * @param {function} handle 回调函数句柄\n */\n addCallBack (type, handle) {\n if (handle && typeof handle === 'function') {\n this.__dragCallBacks.push({ type: type, handler: handle })\n }\n }\n\n /**\n * 供外部插件移除回调\n * @param {string} type 类型 drag/dragend\n * @param {Function} event 回调函数句柄\n */\n removeCallBack (type, event) {\n const { __dragCallBacks } = this\n let _index = -1\n __dragCallBacks.map((item, index) => {\n if (item && item.type === type && item.handler === event) {\n _index = index\n }\n })\n if (_index > -1) {\n __dragCallBacks.splice(_index, 1)\n }\n }\n\n /**\n * @description 解除进度条的所动状态\n * @returns\n */\n unlock () {\n const { player, pos } = this\n pos.isEnter = false\n pos.isLocked = false\n if (player.isMini) {\n return\n }\n this.unbind('mousemove', this.onMoveOnly)\n if (pos.isDown) {\n this.unbind('mouseleave', this.onMouseLeave)\n return\n }\n this.blur()\n }\n\n bindDomEvents () {\n const { config } = this.player\n this._mouseDownHandlerHook = this.hook('dragstart', this._mouseDownHandler)\n this._mouseUpHandlerHook = this.hook('dragend', this._mouseUpHandler)\n this._mouseMoveHandlerHook = this.hook('drag', this._mouseMoveHandler)\n\n if (this.domEventType === 'touch' || this.domEventType === 'compatible') {\n this.root.addEventListener('touchstart', this.onMouseDown)\n }\n\n if (this.domEventType === 'mouse' || this.domEventType === 'compatible') {\n this.bind('mousedown', this.onMouseDown)\n config.isMobileSimulateMode !== 'mobile' && this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseover', this.onMouseOver)\n this.bind('mouseout', this.onMouseOut)\n // 避免触发videoClick 暂停/播放切换\n this.player.root.addEventListener('click', this.onBodyClick, true)\n }\n }\n\n focus () {\n this.player.controls.pauseAutoHide()\n Util.addClass(this.root, 'active')\n }\n\n blur () {\n if (this._disableBlur) {\n return\n }\n this.player.controls.recoverAutoHide()\n Util.removeClass(this.root, 'active')\n }\n\n disableBlur () {\n this._disableBlur = true\n }\n\n enableBlur () {\n this._disableBlur = false\n }\n\n onMoveOnly = (e, data) => {\n const { pos, config, player } = this\n let ret = data\n if (e) {\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (pos.moving && Math.abs(pos.x - x) < config.miniMoveStep) {\n return\n }\n pos.moving = true\n pos.x = x\n ret = this.computeTime(e, x)\n }\n this.triggerCallbacks('dragmove', ret, e)\n this._updateInnerFocus(ret)\n }\n\n /**\n * 避免mouseup的时候触发父辈节点的click事件,和单击视频区域切换暂停/播放互斥\n * @param {*} e\n * @returns\n */\n onBodyClick = (e) => {\n if (!this.pos.isLocked) {\n return\n }\n this.pos.isLocked = false\n e.preventDefault()\n e.stopPropagation()\n }\n\n _mouseDownHandler = (event, data) => {\n this._state.time = data.currentTime\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 0)\n this._updateInnerFocus(data)\n }\n\n _mouseUpHandler = (e, data) => {\n const { pos } = this\n pos.moving && this.updateWidth(data.currentTime, data.seekTime, data.percent, 2)\n }\n\n _mouseMoveHandler = (e, data) => {\n const { _state, pos, config, player } = this\n if (_state.time < data.currentTime) {\n data.forward = true\n } else {\n data.forward = false\n }\n _state.time = data.currentTime\n if (pos.isDown && !pos.moving) {\n pos.moving = true\n config.isPauseMoving && player.pause()\n this.triggerCallbacks('dragstart', data, e)\n this.emitUserAction('drag', 'dragstart', data)\n }\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 1)\n this.triggerCallbacks('dragmove', data, e)\n this._updateInnerFocus(data)\n }\n\n onMouseDown = (e) => {\n const { _state, player, pos, config, playerConfig } = this\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (player.isMini || config.closeMoveSeek || (!playerConfig.allowSeekAfterEnded && player.ended)) {\n return\n }\n\n if (!player.duration && !player.isPlaying) {\n player.play()\n return\n }\n e.stopPropagation()\n // e.preventDefault()\n this.focus()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n Util.checkIsFunction(config.onMoveStart) && config.onMoveStart()\n Util.event(e)\n pos.x = x\n pos.isDown = true\n pos.moving = false\n _state.prePlayTime = player.currentTime\n\n // 交互开始 禁止控制栏的自动隐藏功能\n player.focus({ autoHide: false })\n this.isProgressMoving = true\n Util.addClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseDownHandlerHook(e, ret)\n\n const eventType = e.type\n if (eventType === 'touchstart') {\n this.root.addEventListener('touchmove', this.onMouseMove)\n this.root.addEventListener('touchend', this.onMouseUp)\n this.root.addEventListener('touchcancel', this.onMouseUp)\n } else {\n this.unbind('mousemove', this.onMoveOnly)\n\n document.addEventListener('mousemove', this.onMouseMove, false)\n document.addEventListener('mouseup', this.onMouseUp, false)\n // this.bind('mouseup', this.onMouseUp, false)\n }\n return true\n }\n\n onMouseUp = (e) => {\n const { player, config, pos, playerConfig, _state } = this\n if (!pos) {\n return\n }\n e.stopPropagation()\n e.preventDefault()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n Util.checkIsFunction(config.onMoveEnd) && config.onMoveEnd()\n Util.event(e)\n Util.removeClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, pos.x)\n ret.prePlayTime = _state.prePlayTime\n if (pos.moving) {\n this.triggerCallbacks('dragend', ret, e)\n this.emitUserAction('drag', 'dragend', ret)\n } else {\n this.triggerCallbacks('click', ret, e)\n this.emitUserAction('click', 'click', ret)\n }\n this._mouseUpHandlerHook(e, ret)\n\n pos.moving = false\n pos.isDown = false\n pos.x = 0\n pos.y = 0\n pos.isLocked = true\n _state.prePlayTime = 0\n _state.time = 0\n const eventType = e.type\n if (eventType === 'touchend' || eventType === 'touchcancel') {\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n this.root.removeEventListener('touchcancel', this.onMouseUp)\n // 交互结束 恢复控制栏的隐藏流程\n this.blur()\n } else {\n document.removeEventListener('mousemove', this.onMouseMove, false)\n document.removeEventListener('mouseup', this.onMouseUp, false)\n if (!pos.isEnter) {\n this.onMouseLeave(e)\n } else {\n playerConfig.isMobileSimulateMode !== 'mobile' && this.bind('mousemove', this.onMoveOnly)\n }\n }\n // 延迟复位,状态复位要在dom相关时间回调执行之后\n Util.setTimeout(this, () => {\n this.resetSeekState()\n }, 1)\n // 交互结束 恢复控制栏的隐藏流程\n player.focus()\n }\n\n onMouseMove = (e) => {\n const { _state, pos, player, config } = this\n if (Util.checkTouchSupport()) {\n // e.stopPropagation()\n e.preventDefault()\n }\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const diff = Math.abs(pos.x - x)\n if ((pos.moving && diff < config.miniMoveStep) || (!pos.moving && diff < config.miniStartStep)) {\n return\n }\n pos.x = x\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseMoveHandlerHook(e, ret)\n }\n\n onMouseOut = (e) => {\n this.triggerCallbacks('mouseout', null, e)\n }\n\n onMouseOver = (e) => {\n this.triggerCallbacks('mouseover', null, e)\n }\n\n onMouseEnter = (e) => {\n const { player, pos } = this\n if (pos.isDown || pos.isEnter || player.isMini || (!player.config.allowSeekAfterEnded && player.ended)) {\n return\n }\n pos.isEnter = true\n this.bind('mousemove', this.onMoveOnly)\n this.bind('mouseleave', this.onMouseLeave)\n // 计算预览位置\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const ret = this.computeTime(e, x)\n this.triggerCallbacks('mouseenter', ret, e)\n this.focus()\n }\n\n onMouseLeave = (e) => {\n this.triggerCallbacks('mouseleave', null, e)\n this.unlock()\n this._updateInnerFocus(null)\n }\n\n onVideoResize = () => {\n const { x, isDown, isEnter } = this.pos\n if (isEnter && !isDown) {\n const ret = this.computeTime(null, x)\n this.onMoveOnly(null, ret)\n }\n }\n\n /**\n * @description 根据currenTime和占用百分比更新进度条\n * @param {number} currentTime 需要更新到的时间\n * @param {number} seekTime 实际seek的时间\n * @param {number} percent 更新时间占比\n * @param {number} type 触发类型 0-down 1-move 2-up\n */\n updateWidth (currentTime, seekTime, percent, type) {\n const { config, player } = this\n if (config.isCloseClickSeek && type === 0) {\n return\n }\n\n const realTime = seekTime = seekTime >= player.duration ? player.duration - config.endedDiff : Number(seekTime).toFixed(1)\n\n this.updatePercent(percent)\n this.updateTime(currentTime)\n if (type === 1 && (!config.isDraggingSeek || player.config.mediaType === 'audio')) {\n return\n }\n this._state.now = realTime\n this._state.direc = realTime > player.currentTime ? 0 : 1\n player.seek(realTime)\n }\n\n computeTime (e, x) {\n const { player } = this\n const { width, height, top, left } = this.root.getBoundingClientRect()\n let rWidth, rLeft\n const clientX = x\n if (player.rotateDeg === 90) {\n rWidth = height\n rLeft = top\n } else {\n rWidth = width\n rLeft = left\n }\n let offset = clientX - rLeft\n offset = offset > rWidth ? rWidth : (offset < 0 ? 0 : offset)\n let percent = offset / rWidth\n percent = percent < 0 ? 0 : (percent > 1 ? 1 : percent)\n if (Number.isNaN(percent)){\n percent = this.player.currentTime / this.offsetDuration\n }\n const currentTime = parseInt(percent * this.offsetDuration * 1000, 10) / 1000\n const seekTime = Util.getCurrentTimeByOffset(currentTime, player.timeSegments)\n return {\n percent,\n currentTime,\n seekTime,\n offset,\n width: rWidth,\n left: rLeft,\n e\n }\n }\n\n /**\n * @description 更新时间插件,在拖拽状态下要接管时间插件的更新状态\n * 本位置会和time插件交互\n * @param {number} time 根据拖拽距离计算出的时间\n */\n updateTime (time) {\n const { player, duration } = this\n if (time > duration) {\n time = duration\n } else if (time < 0) {\n time = 0\n }\n const timeIcon = player.plugins.time\n if (timeIcon) {\n timeIcon.updateTime(time)\n }\n }\n\n /**\n * @description 复位正在拖拽状态 ,拖拽的时候要避免timeupdate更新\n */\n resetSeekState () {\n this.isProgressMoving = false\n const timeIcon = this.player.plugins.time\n timeIcon && timeIcon.resetActive()\n }\n\n /**\n * @description 拖拽过程中更新UI\n * @param {number} percent 小于0的小数\n *\n */\n updatePercent (percent, notSeek) {\n this.isProgressMoving = true\n if (this.config.disable) {\n return\n }\n percent = percent > 1 ? 1 : (percent < 0 ? 0 : percent)\n this.progressBtn.style.left = `${percent * 100}%`\n this.innerList.update({ played: percent * this.offsetDuration }, this.offsetDuration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: percent * this.offsetDuration }, this.offsetDuration)\n }\n\n /**\n * @description 播放进度更新\n * @param { boolean } isEnded 是否是播放结束的时候调用\n * @returns\n */\n onTimeupdate (isEnded) {\n const { player, _state, offsetDuration } = this\n if ((player.isSeeking && player.media.seeking) || this.isProgressMoving || !player.hasStart) {\n return\n }\n if (_state.now > -1) {\n const abs = parseInt(_state.now * 1000, 10) - parseInt(player.currentTime * 1000, 10)\n if ((_state.direc === 0 && abs > 300) || (_state.direc === 1 && abs > -300)) {\n _state.now = -1\n return\n } else {\n _state.now = -1\n }\n }\n let time = this.currentTime // this.timeOffset + player.currentTime\n time = Util.adjustTimeByDuration(time, offsetDuration, isEnded)\n this.innerList.update({ played: time }, offsetDuration)\n this.progressBtn.style.left = `${time / offsetDuration * 100}%`\n }\n\n /**\n * @description 缓存进度更新\n * @param { boolean } isEnded 是否是结束时触发\n * @returns\n */\n onCacheUpdate (isEnded) {\n const { player, duration } = this\n if (!player) {\n return\n }\n // 兼容设置了customDuration, 实际时长和要显示的时不一致问题\n let _end = player.bufferedPoint.end\n _end = Util.adjustTimeByDuration(_end, duration, isEnded)\n this.innerList.update({ cached: _end }, duration)\n }\n\n onReset () {\n this.innerList.update({ played: 0, cached: 0 }, 0)\n this.progressBtn.style.left = '0%'\n }\n\n destroy () {\n const { player } = this\n this.thumbnailPlugin = null\n this.innerList.destroy()\n this.innerList = null\n const { domEventType } = this\n if (domEventType === 'touch' || domEventType === 'compatible') {\n this.root.removeEventListener('touchstart', this.onMouseDown)\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n this.root.removeEventListener('touchcancel', this.onMouseUp)\n }\n if (domEventType === 'mouse' || domEventType === 'compatible') {\n this.unbind('mousedown', this.onMouseDown)\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mousemove', this.onMoveOnly)\n this.unbind('mouseleave', this.onMouseLeave)\n document.removeEventListener('mousemove', this.onMouseMove, false)\n document.removeEventListener('mouseup', this.onMouseUp, false)\n player.root.removeEventListener('click', this.onBodyClick, true)\n }\n }\n\n render () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n const controlsMode = this.player.controls ? this.player.controls.config.mode : ''\n const className = controlsMode === 'bottom' ? 'xgplayer-progress-bottom' : ''\n return `\n <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, { Util, Events, POSITIONS } from '../../plugin'\nimport './index.scss'\n\nclass Time extends Plugin {\n static get pluginName () {\n return 'time'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 2,\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.isActiving = false\n }\n\n get duration () {\n const { offsetDuration, duration } = this.player\n return this.playerConfig.customDuration || offsetDuration || duration\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : currentTime\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n afterCreate () {\n const constrolsMode = this.player.controls.config.mode\n this.mode = constrolsMode === 'flex' ? 'flex' : 'normal'\n if (this.config.disable) {\n return\n }\n if (this.mode === 'flex') {\n this.createCenterTime()\n this.root.style.display = 'none'\n }\n this.durationDom = this.find('.time-duration')\n this.timeDom = this.find('.time-current')\n\n this.listenEvents()\n }\n\n /**\n * This method can be overridden.\n * Eg. xgplayer-ads/ui/adTime.js\n */\n listenEvents () {\n this.on([Events.DURATION_CHANGE, Events.SEEKED, Events.TIME_UPDATE], (e) => {\n if (e.eventName === 'durationchange') {\n this.isActiving = false\n }\n this.onTimeUpdate()\n })\n\n this.on(Events.ENDED, () => {\n // 因为customDuration存在,最终播放currentTime可能和显示的duration不统一,所以在ended的时候修正\n this.onTimeUpdate(true)\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'block')\n this.centerDurDom && (this.centerDurDom.style.display = 'block')\n return\n }\n this.root.style.display = 'block'\n }\n\n hide () {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'none')\n this.centerDurDom && (this.centerDurDom.style.display = 'none')\n return\n }\n this.root.style.display = 'none'\n }\n\n onTimeUpdate (isEnded) {\n const { player, config, duration } = this\n if (config.disable || this.isActiving || !player.hasStart) {\n return\n }\n let current = this.currentTime + this.timeOffset\n current = Util.adjustTimeByDuration(current, duration, isEnded)\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.centerDurDom.innerHTML = Util.format(duration)\n }\n } else {\n this.timeDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.durationDom.innerHTML = Util.format(duration)\n }\n }\n }\n\n onReset () {\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(0))\n this.centerDurDom.innerHTML = Util.format(0)\n } else {\n this.timeDom.innerHTML = this.minWidthTime(Util.format(0))\n this.durationDom.innerHTML = Util.format(0)\n }\n }\n\n createCenterTime () {\n const { player } = this\n if (!player.controls || !player.controls.center) {\n return\n }\n const center = player.controls.center\n this.centerCurDom = Util.createDom(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-left'\n )\n this.centerDurDom = Util.createDom(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-right'\n )\n center.children.length > 0\n ? center.insertBefore(this.centerCurDom, center.children[0])\n : center.appendChild(this.centerCurDom)\n center.appendChild(this.centerDurDom)\n }\n\n afterPlayerInit () {\n const { config } = this\n if (this.duration === Infinity || this.playerConfig.isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n }\n if (config.hide) {\n this.hide()\n return\n }\n this.show()\n }\n\n changeLiveState (isLive) {\n if (isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n Util.show(this.find('.time-separator'))\n Util.show(this.durationDom)\n Util.show(this.timeDom)\n }\n }\n\n updateTime (time) {\n this.isActiving = true\n if ((!time && time !== 0) || time > this.duration) {\n return\n }\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(time))\n return\n }\n this.timeDom.innerHTML = this.minWidthTime(Util.format(time))\n }\n\n minWidthTime (timeStr) {\n return timeStr\n .split(':')\n .map(value => `<span class=\"time-min-width\">${value}</span>`)\n .join(':')\n }\n\n resetActive () {\n const { player } = this\n const updateState = () => {\n this.isActiving = false\n }\n this.off(Events.SEEKED, updateState)\n if (player.isSeeking && player.media.seeking) {\n this.once(Events.SEEKED, updateState)\n } else {\n this.isActiving = false\n }\n }\n\n destroy () {\n const { center } = this.player.controls\n this.centerCurDom && center.removeChild(this.centerCurDom)\n this.centerCurDom = null\n this.centerDurDom && center.removeChild(this.centerDurDom)\n this.centerDurDom = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-time\">\n <span class=\"time-current\">00:00</span>\n <span class=\"time-separator\">/</span>\n <span class=\"time-duration\">00:00</span>\n <span class=\"time-live-tag\">${this.i18n.LIVE_TIP}</span>\n </xg-icon>`\n }\n}\nexport default Time\n","import Plugin, { Util, Events, Sniffer, POSITIONS } from '../../plugin'\nimport volumeLargeSvg from '../assets/volumeLarge.svg'\nimport volumeSmallSvg from '../assets/volumeSmall.svg'\nimport volumeMutedSvg from '../assets/volumeMuted.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string, // [可选]插件挂载的dom\n * index?: number // [可选]插件在播放器中挂载的位置\n * disable?: boolean, // [可选]是否禁用插件交互行为\n * showValueLabel?: boolean, // [可选]是否显示当前滑动的音量数值\n * default?: number // [可选]默认\n * [propName: string]: any\n * }} IVolumeConfig\n */\n\nclass Volume extends Plugin {\n static get pluginName () {\n return 'volume'\n }\n\n /**\n * @type IVolumeConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT, // [可选]插件挂载的dom\n index: 1, // [可选]插件在播放器中挂载的位置\n disable: false, // [可选]是否禁用插件交互行为\n showValueLabel: false, // [可选]是否显示当前滑动的音量数值\n default: 0.6, // [可选]默认音量\n miniVolume: 0.2 // 静音恢复的时候最小音量\n }\n }\n\n registerIcons () {\n return {\n volumeSmall: { icon: volumeSmallSvg, class: 'xg-volume-small' },\n volumeLarge: { icon: volumeLargeSvg, class: 'xg-volume' },\n volumeMuted: { icon: volumeMutedSvg, class: 'xg-volume-mute' }\n }\n }\n\n afterCreate () {\n this._timerId = null\n this._d = {\n isStart: false,\n isMoving: false,\n isActive: false\n }\n if (this.config.disable) {\n return\n }\n\n this.initIcons()\n\n const { commonStyle, volume } = this.playerConfig\n if (commonStyle.volumeColor) {\n this.find('.xgplayer-drag').style.backgroundColor = commonStyle.volumeColor\n }\n this.changeMutedHandler = this.hook('mutedChange', (e) => {\n this.changeMuted(e)\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this._onMouseenterHandler = this.hook('mouseenter', this.onMouseenter)\n this._onMouseleaveHandler = this.hook('mouseleave', this.onMouseleave)\n\n if (!(Sniffer.device === 'mobile') && this.playerConfig.isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this._onMouseenterHandler)\n\n this.bind(['blur', 'mouseleave'], this._onMouseleaveHandler)\n\n this.bind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.bind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.bind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n }\n\n this.bind('.xgplayer-icon', ['touchend', 'click'], this.changeMutedHandler)\n\n this.on(Events.VOLUME_CHANGE, this.onVolumeChange)\n this.once(Events.LOADED_DATA, this.onVolumeChange)\n\n if (Util.typeOf(volume) !== 'Number') {\n this.player.volume = this.config.default\n }\n\n this.onVolumeChange()\n }\n\n onBarMousedown = (e) => {\n const { player } = this\n const bar = this.find('.xgplayer-bar')\n Util.event(e)\n\n const barRect = bar.getBoundingClientRect()\n const pos = Util.getEventPos(e, player.zoom)\n const height = barRect.height - (pos.clientY - barRect.top)\n pos.h = height\n pos.barH = barRect.height\n this.pos = pos\n // 差值小于0,说明点击的不是音量滑块位置 不做响应\n if (height < -2) {\n return\n }\n this.updateVolumePos(height, e)\n document.addEventListener('mouseup', this.onBarMouseUp)\n this._d.isStart = true\n return false\n }\n\n onBarMouseMove = (e) => {\n const { _d } = this\n if (!_d.isStart) {\n return\n }\n const { pos, player } = this\n e.preventDefault()\n e.stopPropagation()\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n _d.isMoving = true\n const w = pos.h - _ePos.clientY + pos.clientY\n if (w > pos.barH) {\n return\n }\n this.updateVolumePos(w, e)\n }\n\n onBarMouseUp = (e) => {\n Util.event(e)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n const { _d } = this\n _d.isStart = false\n _d.isMoving = false\n }\n\n updateVolumePos (height, event) {\n const { player } = this\n const drag = this.find('.xgplayer-drag')\n const bar = this.find('.xgplayer-bar')\n if (!bar || !drag) {\n return\n }\n const now = parseInt(height / bar.getBoundingClientRect().height * 1000, 10)\n drag.style.height = `${height}px`\n const to = Math.max(Math.min(now / 1000, 1), 0)\n const props = {\n volume: {\n from: player.volume,\n to\n }\n }\n if (player.muted) {\n props.muted = {\n from: true,\n to: false\n }\n }\n this.emitUserAction(event, 'change_volume', { muted: player.muted, volume: player.volume, props })\n player.volume = Math.max(Math.min(now / 1000, 1), 0)\n player.muted && (player.muted = false)\n\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n\n /**\n * 修改音量数值标签\n *\n * @memberof Volume\n */\n updateVolumeValue () {\n const { volume, muted } = this.player\n const $labelValue = this.find('.xgplayer-value-label')\n const vol = Math.max(Math.min(volume, 1), 0)\n\n // Math.ceil有精度问题,比如Math.ceil(0.55 * 100) == 56,因此这里使用Math.round\n // 0.58 * 100 === 57.99999999999999\n // 0.55 * 100 === 55.00000000000001\n $labelValue.innerText = muted ? 0 : Math.round(vol * 100)\n }\n\n /**\n * @desc 聚焦\n */\n focus () {\n const { player } = this\n player.focus({ autoHide: false })\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n Util.addClass(this.root, 'slide-show')\n }\n\n /**\n * 失去焦点\n * @param { number } delay 延迟隐藏时长,ms\n * @param { boolean } isForce 是否立即隐藏控制栏\n * @param { Event} [e] 事件\n * @returns\n */\n unFocus (delay = 100, isForce = true, e) {\n const { _d, player } = this\n if (_d.isActive) {\n return\n }\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this._timerId = Util.setTimeout(this, () => {\n if (!_d.isActive) {\n isForce ? player.blur() : player.focus()\n Util.removeClass(this.root, 'slide-show')\n _d.isStart && this.onBarMouseUp(e)\n }\n this._timerId = null\n }, delay)\n }\n\n onMouseenter = (e) => {\n this._d.isActive = true\n this.focus()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n onMouseleave = (e) => {\n this._d.isActive = false\n this.unFocus(100, false, e)\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n changeMuted (e) {\n // e.preventDefault()\n e && e.stopPropagation()\n const { player, _d } = this\n // 取消bar的状态\n _d.isStart && this.onBarMouseUp(e)\n this.emitUserAction(e, 'change_muted', {\n muted: player.muted,\n volume: player.volume,\n props: {\n muted: {\n from: player.muted,\n to: !player.muted\n }\n }\n })\n if (player.volume > 0) {\n player.muted = !player.muted\n }\n if (player.volume < 0.01) {\n player.volume = this.config.miniVolume\n }\n }\n\n onVolumeChange = (e) => {\n if (!this.player) {\n return\n }\n const { muted, volume } = this.player\n if (!this._d.isMoving) {\n this.find('.xgplayer-drag').style.height = muted || volume === 0 ? '4px' : `${volume * 100}%`\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n this.animate(muted, volume)\n }\n\n animate (muted, volume) {\n if (muted || volume === 0) {\n this.setAttr('data-state', 'mute')\n } else if (volume < 0.5 && this.icons.volumeSmall) {\n this.setAttr('data-state', 'small')\n } else {\n this.setAttr('data-state', 'normal')\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.volumeSmall)\n this.appendChild('.xgplayer-icon', icons.volumeLarge)\n this.appendChild('.xgplayer-icon', icons.volumeMuted)\n }\n\n destroy () {\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this.unbind('mouseenter', this.onMouseenter)\n\n this.unbind(['blur', 'mouseleave'], this.onMouseleave)\n\n this.unbind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.unbind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.unbind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.changeMutedHandler)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const volume = this.config.default || this.player.volume\n const isShowVolumeValue = this.config.showValueLabel\n return `\n <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 BasePlugin, { Events, Util } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nfunction now () {\n return new Date().getTime()\n}\n\nconst LOG_TYPES = {\n LOAD_START: 'loadstart',\n LOADED_DATA: 'loadeddata',\n FIRST_FRAME: 'firstFrame',\n WAIT_START: 'waitingStart',\n WAIT_END: 'waitingEnd',\n SEEK_START: 'seekStart',\n SEEK_END: 'seekEnd'\n}\nclass XGLogger extends BasePlugin {\n static get pluginName () {\n return 'xgLogger'\n }\n\n static get defaultConfig () {\n return {\n waitTimeout: 10000\n }\n }\n\n afterCreate () {\n this._onReset()\n this._waitType = 'firstFrame'\n\n this._initOnceEvents()\n\n this.newPointTime = now()\n // 初始化到首帧耗时 new -> loadeddata\n this.loadedCostTime = 0\n // 初始化到开始请求耗时 new -> loadstart\n this.startCostTime = 0\n\n this.on(Events.LOAD_START, () => {\n const { _state } = this\n const { autoplayStart, isFFSend } = _state\n this.startCostTime = now() - this.newPointTime\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOAD_START`, `autoplayStart:${autoplayStart} isFFSend:${isFFSend} startCostTime:${this.startCostTime} newPointTime${this.newPointTime}`)\n if (isFFSend) {\n return\n }\n !_state.isLs && this.emitLog(LOG_TYPES.LOAD_START, {})\n _state.isLs = true\n _state.isTimeUpdate = false\n _state.isFFLoading = true\n this.pt = now()\n this.vt = 0\n this.fvt = 0 // 首帧耗时 loadstart -> loadeddata\n this._initOnceEvents()\n this._onWaitingLoadStart()\n })\n\n this.on(Events.LOADED_DATA, () => {\n this.vt = now()\n this.fvt = this.vt - this.pt\n this.loadedCostTime = this.vt - this.newPointTime\n const { isTimeUpdate, isFFSend, autoplayStart } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOADED_DATA`, `fvt:${this.fvt} isTimeUpdate:${this._state.isTimeUpdate} loadedCostTime:${this.loadedCostTime}`)\n if (isTimeUpdate || autoplayStart) {\n this._sendFF('loadedData')\n }\n if (!isFFSend) {\n this.emitLog(LOG_TYPES.LOADED_DATA, {})\n }\n this.suspendWaitingStatus('loadeddata')\n })\n\n this.on(Events.SEEKING, this._onSeeking)\n this.on(Events.SEEKED, this._onSeeked)\n\n this.on(Events.DESTROY, () => {\n this.endState('destroy')\n })\n\n this.on(Events.URL_CHANGE, () => {\n this.endState('urlChange')\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} URL_CHANGE`)\n this._state.isFFSend && this._onReset()\n })\n\n this.on([Events.PLAYING, Events.CANPLAY], this._onPlaying)\n\n this.on(Events.WAITING, this._onWaiting)\n this.on(Events.ERROR, this._onError)\n this.on(Events.RESET, () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} RESET`)\n this.endState('reset')\n this._initOnceEvents()\n this._onReset()\n })\n }\n\n _initOnceEvents () {\n this.off(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.off(Events.TIME_UPDATE, this._onTimeupdate)\n this.once(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.once(Events.TIME_UPDATE, this._onTimeupdate)\n }\n\n _sendFF (endType) {\n this.s = now()\n const { isFFLoading, isFFSend } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _sendFF`, `${endType} fvt:${this.fvt} isFFLoading:${isFFLoading} !isFFSend:${!isFFSend}`)\n if (this.vt > 0 && isFFLoading && !isFFSend) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} emitLog_firstFrame`, endType)\n this._state.isFFLoading = false\n this._state.isFFSend = true\n this.emitLog(LOG_TYPES.FIRST_FRAME, { fvt: this.fvt, costTime: this.fvt, vt: this.vt, startCostTime: this.startCostTime, loadedCostTime: this.loadedCostTime })\n }\n }\n\n _onTimeupdate = () => {\n this._state.isTimeUpdate = true\n if (this._state.autoplayStart) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onTimeupdate`)\n this._sendFF('onTimeupdate')\n }\n }\n\n _onAutoplayStart = () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onAutoplayStart`)\n this._state.autoplayStart = true\n this.vt && this._sendFF('onAutoplayStart')\n }\n\n _onReset = () => {\n this._state = {\n autoplayStart: false, // 是否已经自动起播\n isFFLoading: false, // LOAD_START是否已经触发\n isTimeUpdate: false, // 第一次timeupdate是否已经触发\n isFFSend: false, // 首帧事件是否已经触发\n isLs: false // loadstart是否已经发送\n }\n this.vt = 0\n this.pt = 0\n this.fvt = 0\n this.newPointTime = now()\n this.loadedCostTime = 0\n this.startCostTime = 0\n this._isSeeking = false\n this.seekingStart = 0\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this._isWaiting = false\n this._waitTimer && Util.clearTimeout(this, this._waitTimer)\n this._waittTimer && Util.clearTimeout(this, this._waittTimer)\n this._waitTimer = null\n this._waittTimer = null\n this._waitType = 0 // 0 - 普通卡顿 1-起播卡顿 2-seek卡顿\n }\n\n _onSeeking = () => {\n if (this.seekingStart) {\n return\n }\n this.suspendWaitingStatus('seek')\n this.seekingStart = now()\n this.emitLog(LOG_TYPES.SEEK_START, { start: now() })\n }\n\n _onSeeked = () => {\n this.suspendSeekingStatus('seeked')\n }\n\n _onWaitingLoadStart = () => {\n if (this._isWaiting || this.vt) {\n return\n }\n this._isWaiting = true\n this.waitingStart = now()\n this.fixedWaitingStart = now()\n this._waitType = 1\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, start: this.waitingStart, type: 1, endType: 'loadstart' })\n }\n\n _onWaiting = () => {\n // 普通卡顿起播之前不产生\n if (this._isWaiting || !this.vt) {\n return\n }\n // 卡顿标记开始\n this._isWaiting = true\n if (!this.vt) {\n this._waitType = 1\n } else if (this.seekingStart) {\n this._waitType = 2\n } else {\n this._waitType = 0\n }\n // 原始卡顿耗时起始时间\n this.fixedWaitingStart = now()\n this._waitTimer = Util.setTimeout(this, () => {\n if (this._isWaiting) {\n this.waitingStart = now()\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n this._startWaitTimeout()\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, start: this.waitingStart, type: this._waitType, endType: this._waitType === 2 ? 'seek' : 'playing' })\n }\n }, 200)\n }\n\n _onError = () => {\n this.suspendSeekingStatus('error')\n this.suspendWaitingStatus('error')\n }\n\n _startWaitTimeout () {\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n }\n this._waittTimer = Util.setTimeout(this, () => {\n this.suspendWaitingStatus('timeout')\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }, this.config.waitTimeout)\n }\n\n _onPlaying = () => {\n this._isWaiting && this.suspendWaitingStatus('playing')\n }\n\n endState (endType) {\n this.suspendWaitingStatus(endType)\n this.suspendSeekingStatus(endType)\n }\n\n suspendSeekingStatus (endType) {\n if (!this.seekingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.seekingStart\n this.seekingStart = 0\n this.emitLog(LOG_TYPES.SEEK_END, { end: _now, costTime: _cost, endType })\n }\n\n suspendWaitingStatus (endType) {\n if (this._waitTimer) {\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n }\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }\n this._isWaiting = false\n if (!this.waitingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.waitingStart\n const _fixedCost = _now - this.fixedWaitingStart\n const { waitTimeout } = this.config\n this._isWaiting = false\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this.emitLog(LOG_TYPES.WAIT_END, {\n fixedCostTime: _fixedCost > waitTimeout ? waitTimeout : _fixedCost,\n costTime: _cost > waitTimeout ? waitTimeout : _cost,\n type: endType === 'loadeddata' ? 1 : this._waitType,\n endType: this._waitType === 2 ? 'seek' : endType\n })\n }\n\n emitLog (eventType, data) {\n const { player } = this\n this.emit(Events.XGLOG, {\n t: now(),\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype,\n eventType,\n currentTime: this.player.currentTime,\n readyState: player.video.readyState,\n networkState: player.video.networkState,\n ...data\n })\n }\n}\nexport {\n LOG_TYPES,\n XGLogger as default\n}\n","import Plugin, { Events, Util } from '../../plugin'\nimport ReplaySvg from '../assets/replay.svg'\nimport './index.scss'\n\nclass Replay extends Plugin {\n static get pluginName () {\n return 'replay'\n }\n\n static get defaultConfig () {\n return {\n disable: false\n }\n }\n\n registerIcons () {\n return {\n replay: ReplaySvg\n }\n }\n\n afterCreate () {\n Plugin.insert(this.icons.replay, this.root, 0)\n this.__handleReplay = this.hook('replayClick', () => {\n this.player.replay()\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.bind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n // this.bind('svg', ['click', 'touchend'], this.__handleReplay)\n // this.bind('.xgplayer-replay-txt', ['click', 'touchend'], this.__handleReplay)\n\n this.on(Events.ENDED, () => {\n if (!this.playerConfig.loop) {\n Util.addClass(this.player.root, 'replay')\n }\n if (this.config.disable) {\n return\n }\n this.show()\n const path = this.root.querySelector('path')\n if (path) {\n const transform = window.getComputedStyle(path).getPropertyValue('transform')\n if (typeof transform === 'string' && transform.indexOf('none') > -1) {\n return null\n } else {\n path.setAttribute('transform', transform)\n }\n }\n })\n\n this.on(Events.PLAY, () => {\n this.hide()\n })\n }\n\n handleReplay (e) {\n e.preventDefault()\n e.stopPropagation()\n this.player.replay()\n Util.removeClass(this.player.root, 'replay')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (this.config.disable) {\n return\n }\n this.root.style.display = 'flex'\n }\n\n enable () {\n this.config.disable = false\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n this.unbind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n }\n\n render () {\n return `<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, // 设置为true时,播放后才隐藏,在视频地址更新后会重新显示poster。默认为false,即在play事件触发后隐藏poster\n * poster?: string // 封面图地址\n * }} IPosterConfig\n */\nclass Poster extends Plugin {\n static get pluginName () {\n return 'poster'\n }\n\n /**\n * @type IPosterConfig\n */\n static get defaultConfig () {\n return {\n isEndedShow: true, // 是否在播放结束之后显示\n hideCanplay: false, // 设置为true时,播放后才隐藏,在视频地址更新后会重新显示poster。默认为false,即在play事件触发后隐藏poster\n notHidden: false, // 是否一直显示\n poster: '', // 封面图地址\n fillMode: 'fixWidth' // 封面图填充方式,fixWidth / fixHeight / cover / contain\n }\n }\n\n set isEndedShow (value) {\n this.config.isEndedShow = value\n }\n\n get isEndedShow () {\n return this.config.isEndedShow\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n Util.removeClass(this.root, 'hide')\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.poster === 'string') {\n args.config.poster = args.player.config.poster\n }\n }\n\n afterCreate () {\n this.on(Events.ENDED, () => {\n if (this.isEndedShow) {\n Util.removeClass(this.root, 'hide')\n }\n })\n\n if (this.config.hideCanplay) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n this.on(Events.URL_CHANGE, () => {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'xg-showplay')\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n })\n } else {\n this.on(Events.PLAY, () => {\n Util.addClass(this.root, 'hide')\n })\n }\n }\n\n setConfig (config) {\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n })\n const { poster } = this.config\n this.update(poster)\n }\n\n onTimeUpdate () {\n if (!this.player.currentTime) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n } else {\n Util.removeClass(this.root, 'xg-showplay')\n }\n }\n\n update (poster) {\n if (!poster) {\n return\n }\n this.config.poster = poster\n this.root.style.backgroundImage = `url(${poster})`\n }\n\n getBgSize (mode) {\n let _bg = ''\n switch (mode) {\n case 'cover':\n _bg = 'cover'\n break\n case 'contain':\n _bg = 'contain'\n break\n case 'fixHeight':\n _bg = 'auto 100%'\n break\n default:\n _bg = ''\n }\n return _bg ? `background-size: ${_bg};` : ''\n }\n\n render () {\n const { poster, hideCanplay, fillMode, notHidden } = this.config\n const _bg = this.getBgSize(fillMode)\n const style = poster ? `background-image:url(${poster});${_bg}` : _bg\n const className = notHidden ? 'xg-not-hidden' : (hideCanplay ? 'xg-showplay' : '')\n return `<xg-poster class=\"xgplayer-poster ${className}\" style=\"${style}\">\n </xg-poster>`\n }\n}\n\nexport default Poster\n","import Plugin, { Util, Events, STATES } from '../../plugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * isShowPause?: boolean, // 暂停是否常驻\n * isShowEnd?: boolean, // 播放结束常驻\n * disableAnimate?: boolean, // 禁用点击动画\n * mode?: 'hide' | 'show' | 'auto' // 控制模式: hide 常驻: show 跟随:auto\n * [propName: string]: any\n * }} IStartConfig\n */\n\nconst AnimateMap = {}\nfunction addAnimate (key, seconds, callback = { start: null, end: null }) {\n if (AnimateMap[key]) {\n window.clearTimeout(AnimateMap[key].id)\n }\n AnimateMap[key] = {}\n callback.start && callback.start()\n AnimateMap[key].id = window.setTimeout(() => {\n callback.end && callback.end()\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n }, seconds)\n return AnimateMap[key].id\n}\n\nfunction clearAnimation (id) {\n if (id) {\n window.clearTimeout(id)\n return\n }\n Object.keys(AnimateMap).map(key => {\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n })\n}\n\n\nclass Start extends Plugin {\n static get pluginName () {\n return 'start'\n }\n\n /**\n * @type IStartConfig\n */\n static get defaultConfig () {\n return {\n isShowPause: false, // 暂停是否常驻\n isShowEnd: false, // 播放结束常驻\n disableAnimate: false, // 禁用点击动画\n mode: 'hide' // 控制模式: hide 常驻: show 跟随:auto\n }\n }\n\n constructor (args) {\n super(args)\n this.autoPlayStart = false\n }\n\n afterCreate () {\n const { playerConfig } = this\n\n this.initIcons()\n this.listenEvents()\n this.bindClickEvents()\n\n if (!playerConfig.autoplay) {\n this.show()\n }\n }\n\n /**\n * @public\n * This method can be overridden.\n */\n listenEvents () {\n const { player, playerConfig } = this\n\n this.once(Events.READY, () => {\n if (playerConfig) {\n if (playerConfig.lang && playerConfig.lang === 'en') {\n Util.addClass(player.root, 'lang-is-en')\n } else if (playerConfig.lang === 'jp') {\n Util.addClass(player.root, 'lang-is-jp')\n }\n }\n })\n\n this.on(Events.AUTOPLAY_STARTED, this.onAutoplayStart)\n\n this.on(Events.AUTOPLAY_PREVENTED, () => {\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n })\n\n this.on(Events.PLAY, () => {\n this.toggleTo('play')\n })\n\n this.on(Events.PAUSE, () => {\n this.toggleTo('pause')\n })\n\n this.on(Events.RESET, () => {\n this.onPlayerReset()\n })\n }\n\n /**\n * @public\n */\n bindClickEvents () {\n this.clickHandler = this.hook('startClick', this.switchPausePlay, {\n pre: (e) => {\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n const { paused } = this.player\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: paused, to: !paused })\n }\n })\n\n this.bind(['click', 'touchend'], this.clickHandler)\n }\n\n onPlayerReset = () => {\n this.autoPlayStart = false\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n }\n\n onAutoplayStart = () => {\n if (this.autoPlayStart) {\n return\n }\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n Util.addClass(this.root, className)\n this.autoPlayStart = true\n this.toggleTo('play')\n }\n\n registerIcons () {\n return {\n startPlay: { icon: PlaySvg, class: 'xg-icon-play' },\n startPause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('xg-start-inner', icons.startPlay)\n this.appendChild('xg-start-inner', icons.startPause)\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n Util.removeClass(this.root, 'hide')\n }\n\n focusHide () {\n Util.addClass(this.root, 'focus-hide')\n }\n\n recover () {\n Util.removeClass(this.root, 'focus-hide')\n }\n\n switchStatus (isAnimate) {\n if (isAnimate) {\n this.setAttr('data-state', !this.player.paused ? 'play' : 'pause')\n } else {\n this.setAttr('data-state', this.player.paused ? 'play' : 'pause')\n }\n }\n\n animate (endShow) {\n this._animateId = addAnimate('pauseplay', 400, {\n start: () => {\n Util.addClass(this.root, 'interact')\n this.show()\n this.switchStatus(true)\n },\n end: () => {\n Util.removeClass(this.root, 'interact')\n !endShow && this.hide()\n this._animateId = null\n }\n })\n }\n\n endAnimate () {\n Util.removeClass(this.root, 'interact')\n clearAnimation(this._animateId)\n this._animateId = null\n }\n\n /**\n * @public\n */\n switchPausePlay (e) {\n const { player } = this\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n if (player.state < STATES.READY) {\n return\n }\n const paused = this.player.paused\n if (!paused && player.state === STATES.RUNNING) {\n player.pause()\n } else {\n player.play()\n }\n }\n\n /**\n * @deprecated\n */\n onPlayPause (status) {\n this.toggleTo(status)\n }\n\n /**\n * @param {'play'|'pause'} status\n */\n toggleTo (status) {\n const { config, player } = this\n if (!player || player.state < STATES.RUNNING || !this.autoPlayStart) {\n return\n }\n // 一直显示\n if (config.mode === 'show') {\n this.switchStatus()\n this.show()\n return\n }\n\n // 跟随播放器的focus状态显示和隐藏\n if (config.mode === 'auto') {\n this.switchStatus()\n return\n }\n // 暂停/播放结束状态强制显示\n if ((config.isShowPause && player.paused && !player.ended) || (config.isShowEnd && player.ended)) {\n this.switchStatus()\n this.show()\n this.endAnimate()\n return\n }\n\n if (config.disableAnimate) {\n this.switchStatus()\n this.hide()\n return\n }\n\n if (status === 'play') {\n this.autoPlayStart ? this.animate() : this.hide()\n } else {\n if (!this.autoPlayStart || player.ended) {\n return\n }\n this.animate()\n }\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.clickHandler)\n clearAnimation(this._animateId)\n }\n\n render () {\n const className = this.playerConfig.autoplay ? (this.config.mode === 'auto' ? 'auto-hide' : 'hide') : ''\n return `\n <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","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\n updatePos (pos) {\n this.pos = Object.assign(this.pos, pos)\n if (this.isMini) {\n this.player.root.style.left = `${this.pos.left}px`\n this.player.root.style.top = `${this.pos.top}px`\n this.player.root.style.width = `${this.pos.width}px`\n this.player.root.style.height = `${this.pos.height}px`\n }\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 { LEAVE_PLAYER, ENTER_PLAYER } from '../../events'\nimport './index.scss'\n\nconst MOUSE_EVENTS = {\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousemove: 'onMouseMove'\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nexport default class PCPlugin extends BasePlugin {\n static get pluginName () {\n return 'pc'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n afterCreate () {\n this._clickCount = 0\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { isMobileSimulateMode } = this.playerConfig\n if (isMobileSimulateMode === 'mobile' || (Sniffer.device === 'mobile' && !Sniffer.os.isIpad)) {\n return\n }\n this.initEvents()\n }\n\n initEvents () {\n const { media, root } = this.player\n const { enableContextmenu } = this.playerConfig\n\n root && root.addEventListener('click', this.onVideoClick, false)\n root && root.addEventListener('dblclick', this.onVideoDblClick, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.addEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n !enableContextmenu && media && media.addEventListener('contextmenu', this.onContextmenu, false)\n }\n\n switchPlayPause (e) {\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: player.paused, to: !player.paused })\n if (!player.ended) {\n player.paused ? player.play() : player.pause()\n } else {\n player.duration !== Infinity && player.duration > 0 && player.replay()\n }\n }\n\n onMouseMove = (e) => {\n const { player, playerConfig } = this\n if (!player.isActive) {\n player.focus({ autoHide: !playerConfig.closeDelayBlur })\n !playerConfig.closeFocusVideoFocus && player.media.focus()\n }\n }\n\n onMouseEnter = (e) => {\n const { playerConfig, player } = this\n !playerConfig.closeFocusVideoFocus && player.media.focus()\n if (playerConfig.closeDelayBlur) {\n player.focus({ autoHide: false })\n } else {\n player.focus()\n }\n this.emit(ENTER_PLAYER)\n }\n\n onMouseLeave = (e) => {\n const { closePlayerBlur, leavePlayerTime, closeDelayBlur } = this.playerConfig\n if (!closePlayerBlur && !closeDelayBlur) {\n if (leavePlayerTime) {\n this.player.focus({ autoHide: true, delay: leavePlayerTime })\n } else {\n this.player.blur({ignorePaused: true})\n }\n }\n this.emit(LEAVE_PLAYER)\n }\n\n onContextmenu (e) {\n e = e || window.event\n if (e.preventDefault) {\n e.preventDefault()\n }\n if (e.stopPropagation) {\n e.stopPropagation()\n } else {\n e.returnValue = false // 解决IE8右键弹出\n e.cancelBubble = true\n }\n }\n\n onVideoClick = (e) => {\n const { player, playerConfig } = this\n if (e.target && playerConfig.closeVideoClick) {\n return\n }\n if (e.target === player.root || e.target === player.media || e.target === player.innerContainer || e.target === player.media.__canvas) {\n e.preventDefault()\n if (!playerConfig.closeVideoStopPropagation) {\n e.stopPropagation()\n }\n this._clickCount++\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n this.clickTimer = setTimeout(() => {\n if (!this._clickCount) {\n return\n }\n this._clickCount--\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.switchPlayPause(data.e)\n }, { e, paused: player.paused })\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }, 300)\n }\n }\n\n onVideoDblClick = (e) => {\n const { player, playerConfig } = this\n if (playerConfig.closeVideoDblclick || !e.target || (e.target !== player.media && e.target !== player.media.__canvas)) {\n return\n }\n if (!playerConfig.closeVideoClick && this._clickCount < 2) {\n this._clickCount = 0\n return\n }\n this._clickCount = 0\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n e.preventDefault()\n e.stopPropagation()\n\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.emitUserAction(data.e, 'switch_fullscreen', { props: 'fullscreen', from: player.fullscreen, to: !player.fullscreen })\n player.fullscreen ? player.exitFullscreen() : player.getFullscreen()\n }, { e, fullscreen: player.fullscreen })\n }\n\n destroy () {\n const { video, root } = this.player\n this.clickTimer && clearTimeout(this.clickTimer)\n root.removeEventListener('click', this.onVideoClick, false)\n root.removeEventListener('dblclick', this.onVideoDblClick, false)\n video.removeEventListener('contextmenu', this.onContextmenu, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.removeEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n }\n}\n","\nconst EVENTS = {\n PRESS: 'press',\n PRESS_END: 'pressend',\n DOUBlE_CLICK: 'doubleclick',\n CLICK: 'click',\n TOUCH_MOVE: 'touchmove',\n TOUCH_START: 'touchstart',\n TOUCH_END: 'touchend'\n}\n\nconst TOUCHS = {\n start: 'touchstart',\n end: 'touchend',\n move: 'touchmove',\n cancel: 'touchcancel'\n}\n\nconst MOUSES = {\n start: 'mousedown',\n end: 'mouseup',\n move: 'mousemove',\n cancel: 'mouseleave'\n}\n\nfunction getTouch (touches) {\n if (touches && touches.length > 0) {\n return touches[touches.length - 1]\n } else {\n return null\n }\n}\n\nfunction getDefaultConfig () {\n return {\n pressDelay: 600,\n dbClickDelay: 200,\n disablePress: false,\n disableDbClick: false,\n miniStep: 2,\n needPreventDefault: true\n }\n}\n\nclass Touche {\n constructor (dom, config = { eventType: 'touch' }) {\n this._pos = {\n moving: false,\n start: false,\n x: 0,\n y: 0\n }\n this.config = getDefaultConfig()\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n this.root = dom\n this.events = config.eventType === 'mouse' ? MOUSES : TOUCHS\n /**\n * @type { null | number}\n */\n this.pressIntrvalId = null\n /**\n * @type { null | number}\n */\n this.dbIntrvalId = null\n this.__handlers = {}\n this._initEvent()\n }\n\n _initEvent () {\n this.root.addEventListener(this.events.start, this.onTouchStart)\n }\n\n __setPress (e) {\n const { config } = this\n if (this.pressIntrvalId) {\n this.__clearPress()\n }\n this.pressIntrvalId = setTimeout(() => {\n this.trigger(EVENTS.PRESS, e)\n this._pos.press = true\n this.__clearPress()\n }, config.pressDelay)\n }\n\n __clearPress () {\n window.clearTimeout(this.pressIntrvalId)\n this.pressIntrvalId = null\n }\n\n __setDb (e) {\n const { config } = this\n if (this.dbIntrvalId) {\n this.__clearDb()\n this.trigger(EVENTS.DOUBlE_CLICK, e)\n return\n }\n this.dbIntrvalId = setTimeout(() => {\n this.__clearDb()\n if (!this._pos.start && !this._pos.press && !this._pos.moving) {\n this.trigger(EVENTS.CLICK, e)\n }\n }, config.dbClickDelay)\n }\n\n __clearDb () {\n clearTimeout(this.dbIntrvalId)\n this.dbIntrvalId = null\n }\n\n on (event, handler) {\n if (!this.__handlers[event]) {\n this.__handlers[event] = []\n }\n this.__handlers[event].push(handler)\n }\n\n off (event, handler) {\n if (!this.__handlers[event]) {\n return\n }\n const handlers = this.__handlers[event]\n let index = -1\n for (let i = 0; i < handlers.length; i++) {\n if (handlers[i] === handler) {\n index = i\n break\n }\n }\n if (index >= 0) {\n this.__handlers[event].splice(index, 1)\n }\n }\n\n trigger (event, e) {\n if (!this.__handlers[event]) {\n return\n }\n this.__handlers[event].map(handler => {\n try {\n handler(e)\n } catch (error) {\n console.error(`trigger>>:${event}`, error)\n }\n })\n }\n\n onTouchStart = (e) => {\n const { _pos, root } = this\n // config.needPreventDefault && preventToucheDefault(e)\n const touch = getTouch(e.touches)\n _pos.x = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.y = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.start = true\n this.__setPress(e)\n root.addEventListener(this.events.end, this.onTouchEnd)\n root.addEventListener(this.events.cancel, this.onTouchCancel)\n root.addEventListener(this.events.move, this.onTouchMove)\n this.trigger(EVENTS.TOUCH_START, e)\n }\n\n onTouchCancel = (e) => {\n this.onTouchEnd(e)\n }\n\n onTouchEnd = (e) => {\n const { _pos, root } = this\n this.__clearPress()\n root.removeEventListener(this.events.cancel, this.onTouchCancel)\n root.removeEventListener(this.events.end, this.onTouchEnd)\n root.removeEventListener(this.events.move, this.onTouchMove)\n e.moving = _pos.moving\n e.press = _pos.press\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n this.trigger(EVENTS.TOUCH_END, e)\n !_pos.press && !_pos.moving && this.__setDb(e)\n _pos.press = false\n _pos.start = false\n _pos.moving = false\n }\n\n onTouchMove = (e) => {\n const { _pos, config } = this\n const touch = getTouch(e.touches)\n const x = touch ? parseInt(touch.pageX, 10) : e.pageX\n const y = touch ? parseInt(touch.pageY, 10) : e.pageX\n const diffx = x - _pos.x\n const diffy = y - _pos.y\n if (Math.abs(diffy) < config.miniStep && Math.abs(diffx) < config.miniStep) {\n return\n }\n this.__clearPress()\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n _pos.press = false\n _pos.moving = true\n this.trigger(EVENTS.TOUCH_MOVE, e)\n }\n\n destroy () {\n const map = {\n touchend: 'onTouchEnd',\n touchmove: 'onTouchMove',\n touchstart: 'onTouchStart'\n }\n Object.keys(map).forEach(key => {\n this.root.removeEventListener(key, this[map[key]])\n })\n }\n}\n\nexport default Touche\n\n","import Plugin, { Events, Util, Sniffer, STATES } from '../../plugin'\nimport Touche from './touch'\nimport SeekTipIcon from '../assets/seekicon.svg'\nimport { runHooks } from '../../plugin/hooksDescriptor'\n// import BackSvg from './back.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disableGesture?: boolean,\n * gestureX?: boolean,\n * gestureY?: boolean,\n * gradient?: 'normal' | 'none' | 'top' | 'bottom',\n * isTouchingSeek?: boolean,\n * miniMoveStep?: number,\n * miniYPer?: number,\n * scopeL?: number,\n * scopeR?: number,\n * pressRate?: number,\n * darkness?: boolean,\n * maxDarkness?: number,\n * disableActive?: boolean,\n * disableTimeProgress?: boolean,\n * hideControlsActive?: boolean,\n * hideControlsEnd?: boolean,\n * moveDuration?: number,\n * closedbClick?: boolean,\n * disablePress?: boolean,\n * disableSeekIcon?: boolean,\n * focusVideoClick?: boolean,\n * [propName: string]: any\n * }} IMobileConfig\n */\n\nconst ACTIONS = {\n AUTO: 'auto',\n SEEKING: 'seeking',\n PLAYBACK: 'playbackrate',\n LIGHT: ''\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nclass MobilePlugin extends Plugin {\n static get pluginName () {\n return 'mobile'\n }\n\n /**\n * @type IMobileConfig & { [propName: string]: any}\n */\n static get defaultConfig () {\n return {\n index: 0,\n disableGesture: false, // Whether to disable gestures\n gestureX: true, // Whether to enable horizontal gestures\n gestureY: true, // Whether to enable vertical gestures\n gradient: 'normal', // Gradient shadow, 'none'/'top'/'bottom'\n isTouchingSeek: false, // Whether to update currentTime at the same time as touchMove\n miniMoveStep: 5, // Minimum moving distance, used for move throttling\n miniYPer: 5, // Percentage of minimum displacement in y direction\n scopeL: 0.25, // Gesture range on the left\n scopeR: 0.25, // Gesture range on the right\n scopeM: 0.9, // Middle gesture range\n pressRate: 2, // playbackRate when long press\n darkness: true, // Whether to enable the dimming function on the left\n maxDarkness: 0.8, // Maximum darkness,maximum transparency of the mask\n disableActive: false, // Whether to disable the time prompt\n disableTimeProgress: false, // Whether to disable the time progress bar\n hideControlsActive: false, // Whether to hide the control bar when dragging by gesture\n hideControlsEnd: false, // Whether to hide the control bar when the gesture ended\n moveDuration: 60 * 6 * 1000, // The duration corresponding to the dragging width of the player\n closedbClick: false, // Whether to turn off the double tap gesture\n disablePress: true, // Whether to turn off the long press gesture\n disableSeekIcon: false, // Disable seek prompt\n focusVideoClick: false // Click on force toggle to pause/play\n }\n }\n\n constructor (options) {\n super(options)\n /**\n * @readonly\n */\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n time: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1\n }\n /**\n * @private\n */\n this.timer = null\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n registerIcons () {\n return {\n seekTipIcon: { icon: SeekTipIcon, class: 'xg-seek-pre' }\n }\n }\n\n afterCreate () {\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { playerConfig, config, player } = this\n if (playerConfig.closeVideoDblclick === true) {\n config.closedbClick = true\n }\n this.resetPos()\n if (!Util.isUndefined(playerConfig.disableGesture)) {\n config.disableGesture = !!playerConfig.disableGesture\n }\n this.appendChild('.xg-seek-icon', this.icons.seekTipIcon)\n\n this.xgMask = Util.createDom('xg-mask', '', {}, 'xgmask')\n player.root.appendChild(this.xgMask)\n\n this.initCustomStyle()\n\n this.registerThumbnail()\n\n const eventType = this.domEventType === 'mouse' ? 'mouse' : 'touch'\n this.touch = new Touche(this.root, { eventType, needPreventDefault: !this.config.disableGesture })\n\n this.root.addEventListener('contextmenu', e => {\n e.preventDefault()\n })\n\n /**\n * 对根节点做touchmove和touchend绑定,解决控制栏手势无作用的问题\n */\n player.root.addEventListener('touchmove', this.onRootTouchMove, true)\n player.root.addEventListener('touchend', this.onRootTouchEnd, true)\n player.root.addEventListener('touchcancel', this.onRootTouchEnd, true)\n const { controls } = this.player\n if (controls && controls.center) {\n controls.center.addEventListener('touchmove', this.onRootTouchMove, true)\n controls.center.addEventListener('touchend', this.onRootTouchEnd, true)\n controls.center.addEventListener('touchcancel', this.onRootTouchEnd, true)\n }\n this.on(Events.DURATION_CHANGE, () => {\n const { player, config } = this\n if (player.duration > 0 && player.duration * 1000 < config.moveDuration) {\n config.moveDuration = player.duration * 1000\n }\n })\n\n this.on([Events.CANPLAY, Events.ENDED], () => {\n const { time, isStart } = this.pos\n if (!isStart && time > 0) {\n this.pos.time = 0\n }\n })\n\n const eventsMap = {\n touchstart: 'onTouchStart',\n touchmove: 'onTouchMove',\n touchend: 'onTouchEnd',\n press: 'onPress',\n pressend: 'onPressEnd',\n click: 'onClick',\n doubleclick: 'onDbClick'\n }\n\n Object.keys(eventsMap).map(key => {\n this.touch.on(key, (e) => {\n this[eventsMap[key]](e)\n })\n })\n\n if (!config.disableActive) {\n // Add progress bar drag event callback\n const progressPlugin = player.plugins.progress\n if (progressPlugin) {\n progressPlugin.addCallBack('dragmove', (data) => {\n this.activeSeekNote(data.currentTime, data.forward)\n });\n ['dragend', 'click'].forEach(key => {\n progressPlugin.addCallBack(key, () => {\n this.changeAction(ACTIONS.AUTO)\n })\n })\n }\n }\n }\n\n registerThumbnail () {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail = thumbnail.createThumbnail(null, 'mobile-thumbnail')\n const timePreview = this.find('.time-preview')\n timePreview.insertBefore(this.thumbnail, timePreview.children[0])\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { playedColor, progressColor, timePreviewStyle, curTimeColor, durationColor } = commonStyle\n if (playedColor) {\n this.find('.xg-curbar').style.backgroundColor = playedColor\n }\n if (progressColor) {\n this.find('.xg-bar').style.backgroundColor = progressColor\n }\n if (timePreviewStyle) {\n const previewDom = this.find('.time-preview')\n Object.keys(timePreviewStyle).forEach(key => {\n previewDom.style[key] = timePreviewStyle[key]\n })\n }\n const curColor = curTimeColor || playedColor\n const durColor = durationColor\n curColor && (this.find('.xg-cur').style.color = curColor)\n durColor && (this.find('.xg-dur').style.color = durColor)\n this.config.disableTimeProgress && Util.addClass(this.find('.xg-timebar'), 'hide')\n }\n\n resetPos (time = 0) {\n if (this.pos) {\n this.pos.isStart = false\n this.pos.scope = -1;\n ['x', 'y', 'width', 'height', 'scopeL', 'scopeR', 'scopeM1', 'scopeM2'].map(item => {\n this.pos[item] = 0\n })\n } else {\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1,\n time: 0\n }\n }\n }\n\n changeAction (action) {\n const { player, root } = this\n root.setAttribute('data-xg-action', action)\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.recover()\n }\n\n getTouche (e) {\n const rotateDeg = this.player.rotateDeg\n const touche = e.touches && e.touches.length > 0 ? e.touches[e.touches.length - 1] : e\n // if (touches && touches.length > 0) {\n // const touche = touches[touches.length - 1]\n // if (rotateDeg === 0) {\n // return {\n // pageX: touche.pageX,\n // pageY: touche.pageY\n // }\n // } else {\n // return {\n // pageX: touche.pageY,\n // pageY: touche.pageX\n // }\n // }\n // } else {\n // }\n return rotateDeg === 0\n ? {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n : {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n }\n\n /**\n * 校验具体的操作范围\n * @param { number } x 方向位移\n * @param { number } y 方向位移\n * @param { number } diffx 方向位移差\n * @param { number } diffy 方向位移差\n * @param { any } pos 当前操作区域位置信息 包含{width, height}\n * @return { number } scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n */\n checkScope (x, y, diffx, diffy, pos) {\n const { width } = pos\n let scope = -1\n if (x < 0 || x > width) {\n return scope\n }\n const mold = diffy === 0 ? Math.abs(diffx) : Math.abs(diffx / diffy)\n if (Math.abs(diffx) > 0 && mold >= 1.73 && x > pos.scopeM1 && x < pos.scopeM2) {\n scope = 0\n } else if (Math.abs(diffx) === 0 || mold <= 0.57) {\n scope = x < pos.scopeL ? 1 : (x > pos.scopeR ? 2 : 3)\n }\n return scope\n }\n\n /**\n * 根据位移和操作类型进行对应处理\n * @param {number} diffx x方向位移差\n * @param {number} diffy y方向位移差\n * @param {number} scope scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} width 总体宽度\n * @param {number} height 总高度\n */\n executeMove (diffx, diffy, scope, width, height) {\n switch (scope) {\n case 0:\n this.updateTime(diffx / width * this.config.scopeM)\n break\n case 1:\n this.updateBrightness(diffy / height)\n break\n case 2:\n // ios系统不支持音量调节\n if (!Sniffer.os.isIos) {\n this.updateVolume(diffy / height)\n }\n break\n default:\n }\n }\n\n /**\n * 结束手势操作\n * @param {number} scope 当前手势类型 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} lastScope 上一次手势类型\n */\n endLastMove (lastScope) {\n const { pos, player, config } = this\n\n const time = (pos.time - this.timeOffset) / 1000\n switch (lastScope) {\n case 0:\n player.seek(Number(time).toFixed(1))\n config.hideControlsEnd ? player.blur() : player.focus()\n this.timer = setTimeout(() => {\n this.pos.time = 0\n }, 500)\n break\n case 1:\n case 2:\n default:\n }\n this.changeAction(ACTIONS.AUTO)\n }\n\n onTouchStart = (e) => {\n const { player, config, pos, playerConfig } = this\n const touche = this.getTouche(e)\n if (touche && !config.disableGesture && this.duration > 0 && !player.ended) {\n pos.isStart = true\n this.timer && clearTimeout(this.timer)\n // e.cancelable && e.preventDefault()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n // pos.volume = player.volume * 100\n const rect = this.root.getBoundingClientRect()\n if (player.rotateDeg === 90) {\n pos.top = rect.left\n pos.left = rect.top\n pos.width = rect.height\n pos.height = rect.width\n } else {\n pos.top = rect.top\n pos.left = rect.left\n pos.width = rect.width\n pos.height = rect.height\n }\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n pos.x = player.rotateDeg === 90 ? _y : _x // parseInt(touche.pageX - pos.left, 10)\n pos.y = player.rotateDeg === 90 ? _x : _y // parseInt(touche.pageY - pos.top, 10)\n pos.scopeL = config.scopeL * pos.width\n pos.scopeR = (1 - config.scopeR) * pos.width\n pos.scopeM1 = pos.width * (1 - config.scopeM) / 2\n pos.scopeM2 = pos.width - pos.scopeM1\n }\n }\n\n onTouchMove = (e) => {\n const touche = this.getTouche(e)\n const { pos, config, player } = this\n if (!touche || config.disableGesture || !this.duration || !pos.isStart) {\n return\n }\n const { miniMoveStep, hideControlsActive } = config\n\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n const x = player.rotateDeg === 90 ? _y : _x\n const y = player.rotateDeg === 90 ? _x : _y\n\n if (Math.abs(x - pos.x) > miniMoveStep || Math.abs(y - pos.y) > miniMoveStep) {\n const diffx = x - pos.x\n const diffy = y - pos.y\n let scope = pos.scope\n if (scope === -1) {\n scope = this.checkScope(x, y, diffx, diffy, pos)\n // 手势为快进快退记录起始操作时间\n if (scope === 0) {\n !hideControlsActive ? player.focus({ autoHide: false }) : player.blur()\n !pos.time && (pos.time = parseInt(player.currentTime * 1000, 10) + this.timeOffset * 1000)\n }\n pos.scope = scope\n }\n if (scope === -1 || (scope > 0 && !config.gestureY) || (scope === 0 && !config.gestureX)) {\n return\n }\n // e.cancelable && e.preventDefault()\n this.executeMove(diffx, diffy, scope, pos.width, pos.height)\n pos.x = x\n pos.y = y\n } else {\n // console.log('touche.pageX - pos.x', touche.pageX - pos.x)\n }\n }\n\n onTouchEnd = (e) => {\n const { player, pos, playerConfig } = this\n setTimeout(() => {\n player.getPlugin('progress') && player.getPlugin('progress').resetSeekState()\n }, 10)\n if (!pos.isStart) {\n return\n }\n if (pos.scope > -1) {\n e.cancelable && e.preventDefault()\n }\n\n const { disableGesture, gestureX } = this.config\n if (!disableGesture && gestureX) {\n this.endLastMove(pos.scope)\n } else {\n pos.time = 0\n }\n pos.scope = -1\n this.resetPos()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n this.changeAction(ACTIONS.AUTO)\n }\n\n checkIsRootTarget (e) {\n const plugins = this.player.plugins || {}\n if (plugins.progress && plugins.progress.root.contains(e.target)) {\n return false\n }\n return (plugins.start && plugins.start.root.contains(e.target)) || (plugins.controls && plugins.controls.root.contains(e.target))\n }\n\n onRootTouchMove = (e) => {\n if (this.config.disableGesture || !this.config.gestureX) {\n return\n }\n if (this.checkIsRootTarget(e)) {\n e.stopPropagation()\n if (!this.pos.isStart) {\n this.onTouchStart(e)\n } else {\n this.onTouchMove(e)\n }\n }\n }\n\n onRootTouchEnd = (e) => {\n if (this.pos.scope > -1) {\n this.onTouchEnd(e)\n // const { controls } = this.player\n // controls && controls.recoverAutoHide()\n }\n }\n\n sendUseAction (event) {\n const { paused } = this.player\n this.emitUserAction(event, 'switch_play_pause', {\n prop: 'paused',\n from: paused,\n to: !paused\n })\n }\n\n clickHandler (e) {\n const { player, config, playerConfig } = this\n if (player.state < STATES.RUNNING) {\n if (!playerConfig.closeVideoClick) {\n this.sendUseAction(Util.createEvent('click'))\n player.play()\n }\n return\n }\n\n if (!config.closedbClick || playerConfig.closeVideoClick) {\n player.isActive ? player.blur() : player.focus()\n } else if (!playerConfig.closeVideoClick) {\n if (player.isActive || config.focusVideoClick) {\n this.sendUseAction(Util.createEvent('click'))\n this.switchPlayPause()\n }\n player.focus()\n }\n }\n\n dbClickHandler (e) {\n const { config, player } = this\n if (!config.closedbClick && player.state >= STATES.RUNNING) {\n this.sendUseAction(Util.createEvent('dblclick'))\n this.switchPlayPause()\n }\n }\n\n onClick (e) {\n const { player } = this\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.clickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onDbClick (e) {\n const { player } = this\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.dbClickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onPress (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n pos.rate = this.player.playbackRate\n this.emitUserAction('press', 'change_rate', {\n prop: 'playbackRate',\n from: player.playbackRate,\n to: config.pressRate\n })\n player.playbackRate = config.pressRate\n this.changeAction(ACTIONS.PLAYBACK)\n }\n\n onPressEnd (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n this.emitUserAction('pressend', 'change_rate', { prop: 'playbackRate', from: player.playbackRate, to: pos.rate })\n player.playbackRate = pos.rate\n pos.rate = 1\n this.changeAction(ACTIONS.AUTO)\n }\n\n updateTime (percent) {\n const { player, config } = this\n const { duration } = this.player\n percent = Number(percent.toFixed(4))\n let time = parseInt(percent * config.moveDuration, 10) + this.timeOffset\n time += this.pos.time\n time = time < 0 ? 0 : (time > duration * 1000 ? duration * 1000 - 200 : time)\n player.getPlugin('time') && player.getPlugin('time').updateTime(time / 1000)\n player.getPlugin('progress') && player.getPlugin('progress').updatePercent(time / 1000 / this.duration, true)\n this.activeSeekNote(time / 1000, percent > 0)\n // 在滑动的同时实时seek\n if (config.isTouchingSeek) {\n // player.currentTime = time / 1000\n player.seek(Number((time - this.timeOffset) / 1000).toFixed(1))\n }\n this.pos.time = time\n }\n\n updateVolume (percent) {\n if (this.player.rotateDeg) {\n percent = -percent\n }\n const { player, pos } = this\n percent = parseInt(percent * 100, 10)\n pos.volume += percent\n if (Math.abs(pos.volume) < 10) {\n return\n }\n let volume = parseInt(player.volume * 10, 10) - parseInt(pos.volume / 10, 10)\n volume = volume > 10 ? 10 : (volume < 1 ? 0 : volume)\n player.volume = volume / 10\n pos.volume = 0\n }\n\n updateBrightness (percent) {\n const { pos, config, xgMask } = this\n if (!config.darkness) {\n return\n }\n if (this.player.rotateDeg) {\n percent = -percent\n }\n let light = pos.light + (0.8 * percent)\n light = light > config.maxDarkness ? config.maxDarkness : (light < 0 ? 0 : light)\n if (xgMask) {\n xgMask.style.backgroundColor = `rgba(0,0,0,${light})`\n }\n pos.light = light\n }\n\n activeSeekNote (time, isForward = true) {\n const { player, config } = this\n const isLive = !(this.duration !== Infinity && this.duration > 0)\n if (!time || typeof time !== 'number' || isLive || config.disableActive) {\n return\n }\n if (time < 0) {\n time = 0\n } else if (time > player.duration) {\n time = player.duration - 0.2\n }\n this.changeAction(ACTIONS.SEEKING)\n\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.focusHide()\n\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n this.find('.xg-cur').innerHTML = Util.format(time)\n this.find('.xg-curbar').style.width = `${time / this.duration * 100}%`\n if (isForward) {\n Util.removeClass(this.find('.xg-seek-show'), 'xg-back')\n } else {\n Util.addClass(this.find('.xg-seek-show'), 'xg-back')\n }\n this.updateThumbnails(time)\n // const {thumbnail} = player.plugins\n // this.thumbnailPlugin && thumbnail.update(time)\n }\n\n updateThumbnails (time) {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, 160, 90)\n // this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n switchPlayPause () {\n const { player } = this\n if (player.state < STATES.ATTACHED) {\n return false\n } else if (!player.ended) {\n if (player.paused) {\n player.play()\n } else {\n player.pause()\n }\n }\n }\n\n // 动态禁用手势\n disableGesture () {\n this.config.disableGesture = true\n }\n\n // 动态启用手势\n enableGesture () {\n this.config.disableGesture = false\n }\n\n destroy () {\n const { player } = this\n this.timer && clearTimeout(this.timer)\n this.thumbnail = null\n player.root.removeChild(this.xgMask)\n this.xgMask = null\n this.touch && this.touch.destroy()\n this.touch = null\n player.root.removeEventListener('touchmove', this.onRootTouchMove, true)\n player.root.removeEventListener('touchend', this.onRootTouchEnd, true)\n player.root.removeEventListener('touchcancel', this.onRootTouchEnd, true)\n const { controls } = this.player\n if (controls && controls.center) {\n controls.center.removeEventListener('touchmove', this.onRootTouchMove, true)\n controls.center.removeEventListener('touchend', this.onRootTouchEnd, true)\n controls.center.removeEventListener('touchcancel', this.onRootTouchEnd, true)\n }\n }\n\n render () {\n const className = this.config.gradient !== 'normal' ? `gradient ${this.config.gradient}` : 'gradient'\n return `\n <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 class=\"xg-separator\">/</span>\n <span class=\"xg-dur\">00:00</span>\n </div>\n <div class=\"xg-bar xg-timebar\">\n <div class=\"xg-curbar\"></div>\n </div>\n </div>\n <div class=\"xg-playbackrate xg-top-note\">\n <span><i>${this.config.pressRate}X</i>${this.i18n.FORWARD}</span>\n </div>\n </xg-trigger>\n `\n }\n}\n\nexport default MobilePlugin\n","import { BasePlugin, Events, Util } from '../../plugin'\n\n/**\n * @typedef {{\n * seekStep?: number,\n * checkVisible?: boolean,\n * disableBodyTrigger?: boolean,\n * keyCodeMap?: { [propName: string]: any },\n * disable: boolean,\n * playbackRate: number,\n * isIgnoreUserActive: boolean,\n * [propName: string]: any\n * }} IKeyboardConfig\n */\n\nfunction preventDefault (e) {\n e.preventDefault()\n e.returnValue = false\n}\n\nfunction isDisableTag (el) {\n const tagName = el.tagName\n\n if (tagName === 'INPUT' || tagName === 'TEXTAREA' || el.isContentEditable) {\n return true\n }\n\n return false\n}\n\nclass Keyboard extends BasePlugin {\n static get pluginName () {\n return 'keyboard'\n }\n\n /**\n * @type IKeyboardConfig\n */\n static get defaultConfig () {\n return {\n seekStep: 10, // Left/right fast forward each operation time\n checkVisible: false, // Whether to check the visibility when the shortcut key takes effect\n disableBodyTrigger: false, // Whether to monitor the shortcut keys on the body\n disableRootTrigger: false, // 是否在player.root上做快捷键监听\n isGlobalTrigger: true, // Whether the shortcut key needs to be triggered globally\n keyCodeMap: {},\n disable: false,\n playbackRate: 2, // 长按倍速限制\n isIgnoreUserActive: true // 是否忽略用户激活状态\n }\n }\n\n mergekeyCodeMap () {\n const extendkeyCodeMap = this.config.keyCodeMap\n if (extendkeyCodeMap) {\n Object.keys(extendkeyCodeMap).map(key => {\n if (!this.keyCodeMap[key]) {\n this.keyCodeMap[key] = extendkeyCodeMap[key]\n } else {\n ['keyCode', 'action', 'disable', 'pressAction', 'disablePress', 'isBodyTarget'].map(key1 => {\n extendkeyCodeMap[key][key1] && (this.keyCodeMap[key][key1] = extendkeyCodeMap[key][key1])\n })\n }\n })\n }\n }\n\n afterCreate () {\n this.config.disable = !this.playerConfig.keyShortcut\n const seekStep = typeof this.config.seekStep === 'function' ? this.config.seekStep(this.player) : this.config.seekStep\n if (!(!seekStep || typeof seekStep !== 'number')) {\n this.seekStep = seekStep\n }\n this.keyCodeMap = {\n space: {\n keyCode: 32,\n action: 'playPause',\n disable: false,\n disablePress: false,\n noBodyTarget: false\n },\n up: {\n keyCode: 38,\n action: 'upVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n down: {\n keyCode: 40,\n action: 'downVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n left: {\n keyCode: 37,\n action: 'seekBack',\n disablePress: false,\n disable: false\n },\n right: {\n keyCode: 39,\n action: 'seek',\n pressAction: 'changePlaybackRate',\n disablePress: false,\n disable: false\n },\n esc: {\n keyCode: 27,\n action: 'exitFullscreen',\n disablePress: true,\n disable: false\n }\n }\n this.mergekeyCodeMap()\n this._keyState = {\n isKeyDown: false,\n isBodyKeyDown: false,\n isPress: false,\n tt: 0,\n playbackRate: 0\n }\n this.player.root.addEventListener('keydown', this.onKeydown)\n document.addEventListener('keydown', this.onBodyKeyDown)\n }\n\n setConfig (newConfig) {\n Object.keys(newConfig).forEach(key => {\n this.config[key] = newConfig[key]\n })\n }\n\n checkIsVisible () {\n if (!this.config.checkVisible) {\n return true\n }\n const rec = this.player.root.getBoundingClientRect()\n const { height, top, bottom } = rec\n const h = window.innerHeight\n if ((top < 0 && top < 0 - height * 0.9) || (bottom > 0 && bottom - h > height * 0.9)) {\n return false\n }\n return true\n }\n\n checkCode (code, isBodyTarget) {\n let flag = false\n Object.keys(this.keyCodeMap).map(key => {\n if (this.keyCodeMap[key] && code === this.keyCodeMap[key].keyCode && !this.keyCodeMap[key].disable) {\n flag = !isBodyTarget || (isBodyTarget && !this.keyCodeMap[key].noBodyTarget)\n }\n })\n return flag\n }\n\n downVolume (event) {\n const { player } = this\n if (player.volume <= 0) {\n return\n }\n const val = parseFloat((player.volume - 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val >= 0) {\n player.volume = val\n } else {\n player.volume = 0\n }\n }\n\n upVolume (event) {\n const { player } = this\n if (player.volume >= 1) {\n return\n }\n const val = parseFloat((player.volume + 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val <= 1) {\n player.volume = val\n } else {\n player.volume = 1\n }\n }\n\n seek (event) {\n const { currentTime, offsetCurrentTime, duration, offsetDuration, timeSegments } = this.player\n let _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n const _duration = offsetDuration || duration\n const _step = event.repeat && this.seekStep >= 4 ? parseInt(this.seekStep / 2, 10) : this.seekStep\n if (_time + _step <= _duration) {\n _time = _time + _step\n } else {\n _time = _duration\n }\n const _seekTime = Util.getCurrentTimeByOffset(_time, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n seekBack (event) {\n const { currentTime, offsetCurrentTime, timeSegments } = this.player\n const _step = event.repeat ? parseInt(this.seekStep / 2, 10) : this.seekStep\n const _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n let _seekTime = _time - _step\n if (_seekTime < 0) {\n _seekTime = 0\n }\n _seekTime = Util.getCurrentTimeByOffset(_seekTime, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n changePlaybackRate (event) {\n const { _keyState, config, player } = this\n if (_keyState.playbackRate === 0) {\n _keyState.playbackRate = player.playbackRate\n player.playbackRate = config.playbackRate\n }\n }\n\n playPause (event) {\n const { player } = this\n if (!player) {\n return\n }\n this.emitUserAction(event, 'switch_play_pause')\n if (player.paused) {\n // eslint-disable-next-line handle-callback-err\n player.play()\n } else {\n player.pause()\n }\n }\n\n exitFullscreen (event) {\n const { player } = this\n const { fullscreen, cssfullscreen } = player\n if (fullscreen) {\n this.emitUserAction('keyup', 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n player.exitFullscreen()\n }\n if (cssfullscreen) {\n this.emitUserAction('keyup', 'switch_css_fullscreen', {\n prop: 'cssfullscreen',\n from: cssfullscreen,\n to: !cssfullscreen\n })\n player.exitCssFullscreen()\n }\n }\n\n onBodyKeyDown = (event) => {\n if (!this.player) {\n return\n }\n const e = event || window.event\n const keyCode = e.keyCode\n const { _keyState, player } = this\n const { disable, disableBodyTrigger, isIgnoreUserActive } = this.config\n // 以下条件不响应\n if (disable || disableBodyTrigger || !(player.isUserActive || isIgnoreUserActive) || isDisableTag(e.target) || !this.checkIsVisible() || e.metaKey || e.altKey || e.ctrlKey) {\n _keyState.isBodyKeyDown = false\n return\n }\n // 首次进入进行是否生效校验\n if (!event.repeat && !_keyState.isKeyDown) {\n if ((e.target === document.body || (this.config.isGlobalTrigger && !isDisableTag(e.target))) && this.checkCode(keyCode, true)) {\n _keyState.isBodyKeyDown = true\n }\n document.addEventListener('keyup', this.onBodyKeyUp)\n }\n _keyState.isBodyKeyDown && this.handleKeyDown(e)\n }\n\n onBodyKeyUp = (event) => {\n if (!this.player) {\n return\n }\n document.removeEventListener('keyup', this.onBodyKeyUp)\n this.handleKeyUp(event)\n }\n\n onKeydown = (event) => {\n if (!this.player) {\n return\n }\n const e = event || window.event\n const { _keyState } = this\n // 首次按下检查是否满足触发他条件\n if (!e.repeat) {\n if (this.config.disable || this.config.disableRootTrigger || e.metaKey || e.altKey || e.ctrlKey) {\n return\n }\n if (e && (e.keyCode === 37 || this.checkCode(e.keyCode)) && (e.target === this.player.root || e.target === this.player.video || e.target === this.player.controls.el)) {\n _keyState.isKeyDown = true\n }\n this.player.root.addEventListener('keyup', this.onKeyup)\n }\n // 长按不满足触发条件直接返回\n if (!_keyState.isKeyDown) {\n return\n }\n this.handleKeyDown(e)\n }\n\n onKeyup = (event) => {\n if (!this.player) {\n return\n }\n this.player.root.removeEventListener('keyup', this.onKeyup)\n this.handleKeyUp(event)\n }\n\n handleKeyDown (e) {\n const { _keyState } = this\n if (e.repeat) {\n _keyState.isPress = true\n const _t = Date.now()\n if (_t - _keyState.tt < 200) {\n return\n }\n _keyState.tt = _t\n }\n this.handleKeyCode(e.keyCode, e, _keyState.isPress)\n }\n\n handleKeyUp (e) {\n const { _keyState } = this\n if (_keyState.playbackRate > 0) {\n this.player.playbackRate = _keyState.playbackRate\n _keyState.playbackRate = 0\n }\n _keyState.isKeyDown = false\n _keyState.isPress = false\n _keyState.tt = 0\n }\n\n handleKeyCode (curKeyCode, event, isPress) {\n const arr = Object.keys(this.keyCodeMap)\n for (let i = 0; i < arr.length; i++) {\n const { action, keyCode, disable, pressAction, disablePress } = this.keyCodeMap[arr[i]]\n if (keyCode === curKeyCode) {\n if (!disable && !(isPress && disablePress)) {\n const _action = !isPress ? action : (pressAction || action)\n if (typeof _action === 'function') {\n action(event, this.player, isPress)\n } else if (typeof _action === 'string') {\n if (typeof this[_action] === 'function') {\n this[_action](event, this.player, isPress)\n }\n }\n this.emit(Events.SHORTCUT, {\n key: arr[i],\n target: event.target,\n isPress: isPress,\n ...this.keyCodeMap[arr[i]]\n })\n }\n preventDefault(event)\n event.stopPropagation()\n break\n }\n }\n }\n\n destroy () {\n this.player.root.removeEventListener('keydown', this.onKeydown)\n document.removeEventListener('keydown', this.onBodyKeyDown)\n this.player.root.removeEventListener('keyup', this.onKeyup)\n document.removeEventListener('keyup', this.onBodyKeyUp)\n }\n\n disable () {\n this.config.disable = true\n }\n\n enable () {\n this.config.disable = false\n }\n}\n\nexport default Keyboard\n","import Plugin, { POSITIONS } from '../../plugin/plugin'\nimport loadingIcon from '../assets/loading.svg'\nimport './index.scss'\n\nclass Loading extends Plugin {\n static get pluginName () {\n return 'loading'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT\n }\n }\n\n registerIcons () {\n return {\n loadingIcon: loadingIcon\n }\n }\n\n afterCreate () {\n this.appendChild('xg-loading-inner', this.icons.loadingIcon)\n }\n\n render () {\n return `\n <xg-loading class=\"xgplayer-loading\">\n <xg-loading-inner></xg-loading-inner>\n </xg-loading>`\n }\n}\n\nexport default Loading\n","import { BasePlugin, Events, Util } from '../../plugin'\n/**\n * 进行事件分段控制\n */\nexport default class TimeSegmentsControls extends BasePlugin {\n static get pluginName () {\n return 'TimeSegmentsControls'\n }\n\n static get defaultConfig () {\n return {\n disable: true,\n segments: []\n }\n }\n\n afterCreate () {\n this.curIndex = -1\n this.curPos = null\n this.lastCurrentTime = 0\n\n this.updateSegments()\n\n this.on(Events.DURATION_CHANGE, this._onDurationChange)\n this.on(Events.LOADED_DATA, this._onLoadedData)\n\n this.on(Events.TIME_UPDATE, this._onTimeupdate)\n\n this.on(Events.SEEKING, this._onSeeking)\n\n this.on(Events.PLAY, this._onPlay)\n }\n\n setConfig (newConfig) {\n if (!newConfig) {\n return\n }\n const keys = Object.keys(newConfig)\n if (keys.length < 1) {\n return\n }\n keys.forEach(key => {\n this.config[key] = newConfig[key]\n })\n this.updateSegments()\n }\n\n updateSegments () {\n const { disable, segments } = this.config\n const { player } = this\n if (disable || !segments || segments.length === 0) {\n player.timeSegments = []\n player.offsetDuration = 0\n player.offsetCurrentTime = -1\n } else {\n const _segs = this.formatTimeSegments(segments, player.duration)\n player.timeSegments = _segs\n player.offsetDuration = _segs.length > 0 ? _segs[_segs.length - 1].duration : 0\n }\n }\n\n formatTimeSegments (timeSegments, duration) {\n const ret = []\n if (!timeSegments) {\n return []\n }\n // console.log('>>>formatTimeSegments', duration)\n timeSegments.sort((a,b) =>{ return a.start - b.start })\n timeSegments.forEach((item, index) => {\n const _item = {}\n _item.start = item.start < 0 ? 0 : item.start\n _item.end = duration > 0 && item.end > duration ? duration : item.end\n if (duration > 0 && _item.start > duration) {\n return\n }\n ret.push(_item)\n const _segDuration = _item.end - _item.start\n if (index === 0) {\n _item.offset = item.start // 偏移量\n _item.cTime = 0\n _item.segDuration = _segDuration\n _item.duration = _segDuration\n } else {\n const last = ret[index - 1]\n _item.offset = last.offset + (_item.start - last.end)\n _item.cTime = last.duration + last.cTime\n _item.segDuration = _segDuration\n _item.duration = last.duration + _segDuration\n }\n })\n return ret\n }\n\n _onDurationChange = () => {\n this.updateSegments()\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const index = Util.getIndexByTime(currentTime,timeSegments)\n const time = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n this.player.offsetCurrentTime = time\n this.changeIndex(index, timeSegments)\n }\n\n _onLoadedData = () => {\n const { timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const time = Util.getOffsetCurrentTime(0, timeSegments)\n this.player.offsetCurrentTime = time\n this.changeIndex(0, timeSegments)\n if (this.curPos.start > 0){\n this.player.currentTime = this.curPos.start\n }\n }\n\n _onTimeupdate = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const _len = timeSegments.length\n this.lastCurrentTime = currentTime\n const index = Util.getIndexByTime(currentTime, timeSegments)\n if (index !== this.curIndex) {\n this.changeIndex(index, timeSegments)\n }\n const curTime = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n\n this.player.offsetCurrentTime = curTime\n\n // 根据分段信息进行放时间点跳转\n if (!this.curPos) {\n return\n }\n const { start, end } = this.curPos\n if (currentTime < start) {\n this.player.currentTime = start\n } else if (currentTime > end && index >= _len - 1) {\n this.player.pause()\n }\n }\n\n _onSeeking = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n if (currentTime < timeSegments[0].start) {\n this.player.currentTime = timeSegments[0].start\n } else if (currentTime > timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[timeSegments.length - 1].end\n } else {\n const _index = Util.getIndexByTime(currentTime, timeSegments)\n if (_index >= 0) {\n const _seekTime = this.getSeekTime(currentTime, this.lastCurrentTime, _index, timeSegments)\n if (_seekTime >= 0 ) {\n this.player.currentTime = _seekTime\n }\n }\n }\n }\n\n _onPlay = () => {\n const { currentTime, timeSegments } = this.player\n if (this._checkIfEnabled(timeSegments) && currentTime >= timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[0].start\n }\n }\n\n getSeekTime (currentTime, lastCurrentTime, index, timeSegments) {\n let _time = -1\n const { start, end } = timeSegments[index]\n if (currentTime >= start && currentTime <= end) {\n // console.log('>>>>_onSeeking noSeek', currentTime, lastCurrentTime, start, end, _time)\n return _time\n }\n const diff = currentTime - lastCurrentTime\n if (diff < 0) {\n if (currentTime < start) {\n const diff2 = lastCurrentTime > start ? lastCurrentTime - start : 0\n _time = index - 1 >= 0 ? timeSegments[index - 1].end + diff + diff2 : 0\n // console.log('>>>>_onSeeking seek3', currentTime, lastCurrentTime, diff, start, end, _time)\n return _time\n }\n }\n return -1\n }\n\n _checkIfEnabled (segments) {\n return !(!segments || segments.length < 1)\n }\n\n changeIndex (index, timeSegments) {\n this.curIndex = index\n if (index >= 0 && timeSegments.length > 0) {\n this.curPos = timeSegments[index]\n } else {\n this.curPos = null\n }\n }\n}","import { POSITIONS, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport { Events } from '../../plugin/basePlugin'\nimport RotateSvg from '../assets/rotate.svg'\nimport './index.scss'\n\nexport default class Rotate extends IconPlugin {\n static get pluginName () {\n return 'rotate'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n innerRotate: true, // true为只有画面旋转,false为整个播放器旋转\n clockwise: false,\n rotateDeg: 0, // 初始旋转角度\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.rotateDeg = this.config.rotateDeg || 0\n }\n\n afterCreate () {\n if (this.config.disable) {\n return\n }\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.rotate)\n this.onBtnClick = this.onBtnClick.bind(this)\n this.bind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n // 全屏/css全屏/容器宽高发生变化 需要重新计算\n this.on(Events.VIDEO_RESIZE, () => {\n if (this.rotateDeg && this.config.innerRotate) {\n Util.setTimeout(this, () => {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }, 100)\n }\n })\n\n const root = this.player.root\n this.rootWidth = root.style.width || root.offsetWidth || root.clientWidth\n this.rootHeight = root.style.height || root.offsetHeight || root.clientHeight\n\n if (this.rotateDeg) {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n }\n\n onBtnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'rotate')\n this.rotate(this.config.clockwise, this.config.innerRotate, 1)\n }\n\n updateRotateDeg (rotateDeg, innerRotate) {\n if (!rotateDeg) {\n rotateDeg = 0\n }\n if (innerRotate) {\n this.player.videoRotateDeg = rotateDeg\n return\n }\n const { player, rootWidth, rootHeight } = this\n const { root, innerContainer } = player\n const video = player.media\n const width = root.offsetWidth\n const height = innerContainer && innerRotate ? innerContainer.offsetHeight : root.offsetHeight\n let rWidth = rootWidth\n let rHeight = rootHeight\n let x = 0\n let y = 0\n if (rotateDeg === 0.75 || rotateDeg === 0.25) {\n rWidth = `${height}px`\n rHeight = `${width}px`\n x = -(height - width) / 2\n y = -(width - height) / 2\n }\n const _transform = `translate(${x}px,${y}px) rotate(${rotateDeg}turn)`\n const _styles = {\n transformOrigin: 'center center',\n transform: _transform,\n webKitTransform: _transform,\n height: rHeight,\n width: rWidth\n }\n\n const _target = innerRotate ? video : root\n const poster = innerRotate ? player.getPlugin('poster') : null\n Object.keys(_styles).map(key => {\n _target.style[key] = _styles[key]\n poster && poster.root && (poster.root.style[key] = _styles[key])\n })\n }\n\n rotate (clockwise = false, innerRotate = true, times = 1) {\n const player = this.player\n if (!this.rotateDeg) {\n this.rotateDeg = 0\n }\n const factor = clockwise ? 1 : -1\n\n this.rotateDeg = (this.rotateDeg + 1 + factor * 0.25 * times) % 1\n this.updateRotateDeg(this.rotateDeg, innerRotate)\n player.emit(Events.ROTATE, this.rotateDeg * 360)\n }\n\n registerIcons () {\n return {\n rotate: RotateSvg\n }\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n <xg-icon class=\"xgplayer-rotate\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'ROTATE_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","/* global documentPictureInPicture */\nimport { Events, Util, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport PipIcon from '../assets/pipIcon.svg'\nimport PipIconExit from '../assets/pipIconExit.svg'\nimport './index.scss'\n\n/**\n * @description picture-in-picture plugin\n * @doc https://www.w3.org/TR/picture-in-picture/\n * @doc https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n * @doc https://wicg.github.io/document-picture-in-picture/\n */\n\nconst PresentationMode = {\n PIP: 'picture-in-picture',\n INLINE: 'inline',\n FULLSCREEN: 'fullscreen'\n}\n\nclass PIP extends IconPlugin {\n static get pluginName () {\n return 'pip'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n showIcon: false,\n preferDocument: false,\n width: undefined,\n height: undefined,\n docPiPNode: undefined,\n docPiPStyle: undefined\n }\n }\n\n static checkWebkitSetPresentationMode (video) {\n return typeof video.webkitSetPresentationMode === 'function'\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.pip === 'boolean') {\n args.config.showIcon = args.player.config.pip\n }\n }\n\n afterCreate () {\n // 非可用状态不做初始化\n if (!this.isPIPAvailable()) {\n return\n }\n super.afterCreate()\n this.pMode = PresentationMode.INLINE\n this.initPipEvents()\n // 确认开启按钮的情况下才初始化按钮\n if (this.config.showIcon) {\n this.initIcons()\n }\n // video初始化之后再做判断是否显示\n this.once(Events.COMPLETE, () => {\n if (this.config.showIcon) {\n Util.removeClass(this.find('.xgplayer-icon'), 'xg-icon-disable')\n this.bind('click', this.switchPIP)\n }\n })\n }\n\n registerIcons () {\n return {\n pipIcon: { icon: PipIcon, class: 'xg-get-pip' },\n pipIconExit: { icon: PipIconExit, class: 'xg-exit-pip' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.pipIcon)\n this.appendChild('.xgplayer-icon', icons.pipIconExit)\n }\n\n initPipEvents () {\n const { player } = this\n this.leavePIPCallback = () => {\n // 处理点击x关闭画中画的时候暂停问题\n const paused = player.paused\n Util.setTimeout(this, () => {\n // 使用mediaPlay避免多次触发 playhooks\n !paused && player.mediaPlay()\n }, 0)\n !paused && player.mediaPlay()\n this.setAttr('data-state', 'normal')\n this.pipWindow = null\n player.emit(Events.PIP_CHANGE, false)\n }\n\n this.enterPIPCallback = (e) => {\n player.emit(Events.PIP_CHANGE, true)\n if (e?.pictureInPictureWindow) {\n this.pipWindow = e.pictureInPictureWindow\n }\n this.setAttr('data-state', 'pip')\n }\n\n this.onWebkitpresentationmodechanged = (e) => {\n const mode = player.media.webkitPresentationMode\n // 如果在全屏下进入了该逻辑,调用退出全屏处理\n if (this.pMode === PresentationMode.FULLSCREEN && mode !== PresentationMode.FULLSCREEN) {\n player.onFullscreenChange(null, false)\n }\n this.pMode = mode\n if (mode === PresentationMode.PIP) {\n this.enterPIPCallback(e)\n } else if (mode === PresentationMode.INLINE) {\n this.leavePIPCallback(e)\n }\n }\n\n if (player.media) {\n player.media.addEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.addEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.addEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n }\n }\n\n switchPIP = (e) => {\n if (!this.isPIPAvailable()) {\n return false\n }\n e.stopPropagation && e.stopPropagation()\n if (this.isPip) {\n this.exitPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: true, to: false })\n this.setAttr('data-state', 'normal')\n } else if (this.player.media.readyState === 4) {\n this.requestPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: false, to: true })\n this.setAttr('data-state', 'pip')\n }\n }\n\n copyStyleIntoPiPWindow (pipWin) {\n const textContent = [...document.styleSheets]\n .map((style) => {\n try {\n return [...style.cssRules].map((rule) => rule.cssText).join('')\n } catch (e) {\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.type = style.type\n link.media = style.media\n link.href = style.href\n pipWin.document.head.appendChild(link)\n }\n return ''\n })\n .filter(Boolean)\n .join('\\n')\n const style = document.createElement('style')\n\n style.textContent = textContent\n pipWin.document.head.appendChild(style)\n }\n\n /*\n * 进入画中画\n */\n requestPIP () {\n const { player, playerConfig, config } = this\n if (!this.isPIPAvailable() || this.isPip) {\n return\n }\n try {\n const { poster } = playerConfig\n if (poster) {\n player.media.poster = Util.typeOf(poster) === 'String' ? poster : poster.poster\n }\n\n if (config.preferDocument && this.isDocPIPAvailable()) {\n const pipOptions = {}\n\n if (config.width && config.height) {\n pipOptions.width = config.width\n pipOptions.height = config.height\n } else {\n const playerRect = player.root.getBoundingClientRect()\n pipOptions.width = playerRect.width\n pipOptions.height = playerRect.height\n }\n\n documentPictureInPicture.requestWindow(pipOptions).then((pipWin) => {\n const { docPiPNode, docPiPStyle } = config\n\n this.enterPIPCallback()\n\n // record original position\n const pipRoot = docPiPNode || player.root\n const parentNode = pipRoot.parentElement\n const previousSibling = pipRoot.previousSibling\n const nextSibling = pipRoot.nextSibling\n\n this.copyStyleIntoPiPWindow(pipWin)\n\n // Make sure player fits in the Picture-in-Picture window.\n const styles = document.createElement('style')\n styles.append('body{padding:0; margin:0;}')\n if (docPiPStyle) {\n let cssContent = ''\n if (typeof docPiPStyle === 'string') {\n cssContent = docPiPStyle\n } else if (typeof docPiPStyle === 'function') {\n cssContent = docPiPStyle.call(config)\n }\n if (cssContent) {\n styles.append(cssContent)\n }\n } else if (pipRoot === player.root) {\n styles.append(`\n .xgplayer{width: 100%!important; height: 100%!important;}\n `)\n }\n pipWin.document.head.append(styles)\n\n // Add player to the PiP window.\n pipWin.document.body.append(pipRoot)\n\n // Listen for the PiP closing event to put the video back.\n pipWin.addEventListener('pagehide', (event) => {\n // Restore nodes to their original location\n if (parentNode) {\n if (nextSibling) {\n parentNode.insertBefore(pipRoot, nextSibling)\n } else if (previousSibling) {\n parentNode.insertBefore(pipRoot, previousSibling.nextSibling)\n } else {\n parentNode.appendChild(pipRoot)\n }\n } else {\n // console.log('无法找到原始父节点')\n }\n\n this.leavePIPCallback()\n }, { once: true })\n })\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('picture-in-picture')\n } else {\n player.media.requestPictureInPicture()\n }\n\n\n return true\n } catch (reason) {\n console.error('requestPiP', reason)\n return false\n }\n }\n\n /**\n * 退出画中画\n */\n exitPIP () {\n const { player } = this\n try {\n if (this.isPIPAvailable() && this.isPip) {\n if (this.isDocPIPAvailable() && documentPictureInPicture?.window) {\n documentPictureInPicture.window.close()\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('inline')\n } else {\n document.exitPictureInPicture()\n }\n }\n return true\n } catch (reason) {\n console.error('exitPIP', reason)\n return false\n }\n }\n\n /**\n * 处于画中画状态\n */\n get isPip () {\n const { player } = this\n return (\n !!(this.isDocPIPAvailable() && documentPictureInPicture?.window) ||\n (document.pictureInPictureElement &&\n document.pictureInPictureElement === player.media) ||\n player.media.webkitPresentationMode === PresentationMode.PIP\n )\n }\n\n isPIPAvailable () {\n const video = this.player.media\n const _isEnabled = Util.typeOf(document.pictureInPictureEnabled) === 'Boolean' ? document.pictureInPictureEnabled : false\n return _isEnabled &&\n ((Util.typeOf(video.disablePictureInPicture) === 'Boolean' && !video.disablePictureInPicture) ||\n (video.webkitSupportsPresentationMode && Util.typeOf(video.webkitSetPresentationMode) === 'Function')) ||\n this.isDocPIPAvailable()\n }\n\n isDocPIPAvailable () {\n return 'documentPictureInPicture' in window && /^(https|file)/.test(location.protocol)\n }\n\n destroy () {\n super.destroy()\n const { player } = this\n player.media.removeEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.removeEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.removeEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n this.exitPIP()\n this.unbind('click', this.btnClick)\n }\n\n render () {\n if (!this.config.showIcon || !this.isPIPAvailable()) {\n return\n }\n return `<xg-icon class=\"xgplayer-pip\">\n <div class=\"xgplayer-icon xg-icon-disable\">\n </div>\n ${xgIconTips(this, 'PIP', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\nexport default PIP\n","/**\n * 下一个按钮组件\n */\nimport Plugin, { POSITIONS, Sniffer, Events } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport Next from '../assets/playNext.svg'\nimport './index.scss'\n\nexport default class PlayNextIcon extends Plugin {\n static get pluginName () {\n return 'playNext'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 1,\n url: null,\n urlList: []\n }\n }\n\n constructor (options) {\n super(options)\n this.idx = -1\n }\n\n afterCreate () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.playNext)\n this.initEvents()\n }\n\n registerIcons () {\n return {\n playNext: Next\n }\n }\n\n initEvents () {\n this.nextHandler = this.hook('nextClick', this.changeSrc)\n const event = Sniffer.device === 'mobile' ? 'touchend' : 'click'\n this.bind(event, this.playNext)\n this.show()\n }\n\n playNext = (e) => {\n const { player } = this\n e.preventDefault()\n e.stopPropagation()\n if (this.idx + 1 < this.config.urlList.length) {\n this.idx++\n this.nextHandler(this.config.urlList[this.idx], this.idx)\n player.emit(Events.PLAYNEXT, this.idx + 1)\n } else {\n this.nextHandler()\n player.emit(Events.PLAYNEXT)\n }\n }\n\n changeSrc (url) {\n const { player } = this\n if (!url) {\n return\n }\n player.pause()\n player.currentTime = 0\n if (player.switchURL) {\n player.switchURL(url)\n } else {\n player.src = url\n }\n player.config.url = url\n player.play()\n }\n\n destroy () {\n this.unbind(['touchend', 'click'], this.playNext)\n }\n\n render () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n return `\n <xg-icon class=\"xgplayer-playnext\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'PLAYNEXT_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>\n `\n }\n}\n","//download.js v4.2, by dandavis; 2008-2016. [MIT] see http://danml.com/download.html for tests/usage\n// v1 landed a FF+Chrome compat way of downloading strings to local un-named files, upgraded to use a hidden frame and optional mime\n// v2 added named files via a[download], msSaveBlob, IE (10+) support, and window.URL support for larger+faster saves than dataURLs\n// v3 added dataURL and Blob Input, bind-toggle arity, and legacy dataURL fallback was improved with force-download mime and base64 support. 3.1 improved safari handling.\n// v4 adds AMD/UMD, commonJS, and plain browser support\n// v4.1 adds url download capability via solo URL argument (same domain/CORS only)\n// v4.2 adds semantic variable names, long (over 2MB) dataURL support, and hidden by default temp anchors\n// https://github.com/rndme/download\n\n(function (root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([], factory);\n\t} else if (typeof exports === 'object') {\n\t\t// Node. Does not work with strict CommonJS, but\n\t\t// only CommonJS-like environments that support module.exports,\n\t\t// like Node.\n\t\tmodule.exports = factory();\n\t} else {\n\t\t// Browser globals (root is window)\n\t\troot.download = factory();\n }\n}(this, function () {\n\n\treturn function download(data, strFileName, strMimeType) {\n\n\t\tvar self = window, // this script is only for browsers anyway...\n\t\t\tdefaultMime = \"application/octet-stream\", // this default mime also triggers iframe downloads\n\t\t\tmimeType = strMimeType || defaultMime,\n\t\t\tpayload = data,\n\t\t\turl = !strFileName && !strMimeType && payload,\n\t\t\tanchor = document.createElement(\"a\"),\n\t\t\ttoString = function(a){return String(a);},\n\t\t\tmyBlob = (self.Blob || self.MozBlob || self.WebKitBlob || toString),\n\t\t\tfileName = strFileName || \"download\",\n\t\t\tblob,\n\t\t\treader;\n\t\t\tmyBlob= myBlob.call ? myBlob.bind(self) : Blob ;\n\t \n\t\tif(String(this)===\"true\"){ //reverse arguments, allowing download.bind(true, \"text/xml\", \"export.xml\") to act as a callback\n\t\t\tpayload=[payload, mimeType];\n\t\t\tmimeType=payload[0];\n\t\t\tpayload=payload[1];\n\t\t}\n\n\n\t\tif(url && url.length< 2048){ // if no filename and no mime, assume a url was passed as the only argument\n\t\t\tfileName = url.split(\"/\").pop().split(\"?\")[0];\n\t\t\tanchor.href = url; // assign href prop to temp anchor\n\t\t \tif(anchor.href.indexOf(url) !== -1){ // if the browser determines that it's a potentially valid url path:\n \t\tvar ajax=new XMLHttpRequest();\n \t\tajax.open( \"GET\", url, true);\n \t\tajax.responseType = 'blob';\n \t\tajax.onload= function(e){ \n\t\t\t\t download(e.target.response, fileName, defaultMime);\n\t\t\t\t};\n \t\tsetTimeout(function(){ ajax.send();}, 0); // allows setting custom ajax headers using the return:\n\t\t\t return ajax;\n\t\t\t} // end if valid url?\n\t\t} // end if url?\n\n\n\t\t//go ahead and download dataURLs right away\n\t\tif(/^data:([\\w+-]+\\/[\\w+.-]+)?[,;]/.test(payload)){\n\t\t\n\t\t\tif(payload.length > (1024*1024*1.999) && myBlob !== toString ){\n\t\t\t\tpayload=dataUrlToBlob(payload);\n\t\t\t\tmimeType=payload.type || defaultMime;\n\t\t\t}else{\t\t\t\n\t\t\t\treturn navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs:\n\t\t\t\t\tnavigator.msSaveBlob(dataUrlToBlob(payload), fileName) :\n\t\t\t\t\tsaver(payload) ; // everyone else can save dataURLs un-processed\n\t\t\t}\n\t\t\t\n\t\t}else{//not data url, is it a string with special needs?\n\t\t\tif(/([\\x80-\\xff])/.test(payload)){\t\t\t \n\t\t\t\tvar i=0, tempUiArr= new Uint8Array(payload.length), mx=tempUiArr.length;\n\t\t\t\tfor(i;i<mx;++i) tempUiArr[i]= payload.charCodeAt(i);\n\t\t\t \tpayload=new myBlob([tempUiArr], {type: mimeType});\n\t\t\t}\t\t \n\t\t}\n\t\tblob = payload instanceof myBlob ?\n\t\t\tpayload :\n\t\t\tnew myBlob([payload], {type: mimeType}) ;\n\n\n\t\tfunction dataUrlToBlob(strUrl) {\n\t\t\tvar parts= strUrl.split(/[:;,]/),\n\t\t\ttype= parts[1],\n\t\t\tdecoder= parts[2] == \"base64\" ? atob : decodeURIComponent,\n\t\t\tbinData= decoder( parts.pop() ),\n\t\t\tmx= binData.length,\n\t\t\ti= 0,\n\t\t\tuiArr= new Uint8Array(mx);\n\n\t\t\tfor(i;i<mx;++i) uiArr[i]= binData.charCodeAt(i);\n\n\t\t\treturn new myBlob([uiArr], {type: type});\n\t\t }\n\n\t\tfunction saver(url, winMode){\n\n\t\t\tif ('download' in anchor) { //html5 A[download]\n\t\t\t\tanchor.href = url;\n\t\t\t\tanchor.setAttribute(\"download\", fileName);\n\t\t\t\tanchor.className = \"download-js-link\";\n\t\t\t\tanchor.innerHTML = \"downloading...\";\n\t\t\t\tanchor.style.display = \"none\";\n\t\t\t\tdocument.body.appendChild(anchor);\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tanchor.click();\n\t\t\t\t\tdocument.body.removeChild(anchor);\n\t\t\t\t\tif(winMode===true){setTimeout(function(){ self.URL.revokeObjectURL(anchor.href);}, 250 );}\n\t\t\t\t}, 66);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// handle non-a[download] safari as best we can:\n\t\t\tif(/(Version)\\/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*Safari\\//.test(navigator.userAgent)) {\n\t\t\t\tif(/^data:/.test(url))\turl=\"data:\"+url.replace(/^data:([\\w\\/\\-\\+]+)/, defaultMime);\n\t\t\t\tif(!window.open(url)){ // popup blocked, offer direct download:\n\t\t\t\t\tif(confirm(\"Displaying New Document\\n\\nUse Save As... to download, then click back to return to this page.\")){ location.href=url; }\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t//do iframe dataURL download (old ch+FF):\n\t\t\tvar f = document.createElement(\"iframe\");\n\t\t\tdocument.body.appendChild(f);\n\n\t\t\tif(!winMode && /^data:/.test(url)){ // force a mime that will download:\n\t\t\t\turl=\"data:\"+url.replace(/^data:([\\w\\/\\-\\+]+)/, defaultMime);\n\t\t\t}\n\t\t\tf.src=url;\n\t\t\tsetTimeout(function(){ document.body.removeChild(f); }, 333);\n\n\t\t}//end saver\n\n\n\n\n\t\tif (navigator.msSaveBlob) { // IE10+ : (has Blob, but not a[download] or URL)\n\t\t\treturn navigator.msSaveBlob(blob, fileName);\n\t\t}\n\n\t\tif(self.URL){ // simple fast and modern way using Blob and URL:\n\t\t\tsaver(self.URL.createObjectURL(blob), true);\n\t\t}else{\n\t\t\t// handle non-Blob()+non-URL browsers:\n\t\t\tif(typeof blob === \"string\" || blob.constructor===toString ){\n\t\t\t\ttry{\n\t\t\t\t\treturn saver( \"data:\" + mimeType + \";base64,\" + self.btoa(blob) );\n\t\t\t\t}catch(y){\n\t\t\t\t\treturn saver( \"data:\" + mimeType + \",\" + encodeURIComponent(blob) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Blob but not URL support:\n\t\t\treader=new FileReader();\n\t\t\treader.onload=function(e){\n\t\t\t\tsaver(this.result);\n\t\t\t};\n\t\t\treader.readAsDataURL(blob);\n\t\t}\n\t\treturn true;\n\t}; /* end download() */\n}));\n","import downloadUtil from 'downloadjs'\nimport { POSITIONS, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport DownloadSvg from '../assets/download.svg'\nimport './index.scss'\n/**\n * @typedef { {\n * position: string,\n * index: number,\n * disable: boolean,\n * [propName: string]: any\n * } } IDownloadConfig\n */\nexport default class Download extends IconPlugin {\n static get pluginName () {\n return 'download'\n }\n\n /**\n * @type IDownloadConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n disable: true\n }\n }\n\n constructor (args) {\n super(args)\n this.timer = null\n this.isLock = false\n }\n\n afterCreate () {\n super.afterCreate()\n if (this.config.disable) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.download)\n this._handler = this.hook('click', this.download, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this._handler)\n }\n\n registerIcons () {\n return {\n download: DownloadSvg\n }\n }\n download = (e) => {\n if (this.isLock) {\n return\n }\n this.emitUserAction(e, 'download')\n const { url } = this.playerConfig\n let dUrl = ''\n if (Util.typeOf(url) === 'String') {\n dUrl = url\n } else if (Util.typeOf(url) === 'Array' && url.length > 0) {\n dUrl = url[0].src\n }\n const newUrl = this.getAbsoluteURL(dUrl)\n downloadUtil(newUrl)\n this.isLock = true\n this.timer = window.setTimeout(() => {\n this.isLock = false\n window.clearTimeout(this.timer)\n this.timer = null\n }, 300)\n }\n\n getAbsoluteURL (url) {\n // Check if absolute URL\n if (!url.match(/^https?:\\/\\//)) {\n const div = document.createElement('div')\n div.innerHTML = `<a href=\"${url}\">x</a>`\n url = div.firstChild.href\n }\n return url\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.download)\n window.clearTimeout(this.timer)\n this.timer = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-download\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'DOWNLOAD_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import { POSITIONS, Events } from '../../plugin'\nimport IconPlugin from '../common/iconPlugin'\nimport './index.scss'\n\nexport default class ScreenShot extends IconPlugin {\n static get pluginName () {\n return 'screenShot'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 5,\n quality: 0.92,\n type: 'image/png',\n format: '.png',\n width: 600,\n height: 337,\n saveImg: true,\n fitVideo: true,\n disable: false,\n name: 'screenshot'\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.screenShot === 'boolean') {\n args.config.disable = !args.player.config.screenShot\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.screenshotIcon)\n const { config } = this\n this.initSize = (data) => {\n if (config.fitVideo) {\n config.width = data.vWidth\n config.height = data.vHeight\n }\n }\n this.once(Events.VIDEO_RESIZE, this.initSize)\n }\n\n onPluginsReady () {\n this.show()\n this.onClickBtn = this.onClickBtn.bind(this)\n this.bind(['click', 'touchend'], this.onClickBtn)\n }\n\n saveScreenShot (data, filename) {\n const saveLink = document.createElement('a')\n saveLink.href = data\n saveLink.download = filename\n\n let event\n try {\n if (typeof MouseEvent !== 'undefined') {\n event = new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window\n })\n } else {\n event = document.createEvent('MouseEvents')\n event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)\n }\n } catch (e) {\n console.error('MouseEvent unsupported', e)\n }\n\n if (event) {\n saveLink.dispatchEvent(event)\n }\n }\n\n createCanvas (width, height) {\n const canvas = document.createElement('canvas')\n const canvasCtx = canvas.getContext('2d')\n\n this.canvasCtx = canvasCtx\n this.canvas = canvas\n\n canvas.width = width || this.config.width\n canvas.height = height || this.config.height\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingQuality\n canvasCtx.imageSmoothingEnabled = true\n if (canvasCtx.imageSmoothingEnabled) {\n canvasCtx.imageSmoothingQuality = 'high'\n }\n }\n\n onClickBtn (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'shot')\n const { config } = this\n this.shot(config.width, config.height).then((data) => {\n this.emit(Events.SCREEN_SHOT, data)\n if (config.saveImg) {\n this.saveScreenShot(data, config.name + config.format)\n }\n })\n }\n\n shot (width, height, option = { quality: 0.92, type: 'image/png' }) {\n const { config, player } = this\n const quality = option.quality || config.quality\n const type = option.type || config.type\n return new Promise((resolve, reject) => {\n let canvas = null\n let canvasCtx\n\n if (player.media.canvas) {\n canvas = player.media.canvas\n } else {\n if (!this.canvas) {\n this.createCanvas(width, height)\n } else {\n this.canvas.width = width || config.width\n this.canvas.height = height || config.height\n }\n canvas = this.canvas\n canvasCtx = this.canvasCtx\n\n const mediaRatio = player.media.videoWidth / player.media.videoHeight\n const canvasRatio = canvas.width / canvas.height\n const sx = 0, sy = 0, sw = player.media.videoWidth, sh = player.media.videoHeight\n let dx, dy, dw, dh\n\n if (mediaRatio > canvasRatio) {\n dw = canvas.width\n dh = canvas.width / mediaRatio\n dx = 0\n dy = Math.round((canvas.height - dh) / 2)\n } else if (mediaRatio === canvasRatio) {\n dw = canvas.width\n dh = canvas.height\n dx = 0\n dy = 0\n } else if (mediaRatio < canvasRatio) {\n dw = canvas.height * mediaRatio\n dh = canvas.height\n dx = Math.round((canvas.width - dw) / 2)\n dy = 0\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage\n canvasCtx.drawImage(player.media, sx, sy, sw, sh, dx, dy, dw, dh)\n }\n let src = canvas.toDataURL(type, quality).replace(type, 'image/octet-stream')\n src = src.replace(/^data:image\\/[^;]+/, 'data:application/octet-stream')\n resolve(src)\n })\n }\n\n registerIcons () {\n return {\n screenshotIcon: null\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.onClickBtn)\n this.off(Events.VIDEO_RESIZE, this.initSize)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const className = this.icons.screenshotIcon ? 'xgplayer-icon' : 'xgplayer-icon btn-text'\n const langKey = 'SCREENSHOT'\n return `\n <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 } from '../../plugin'\n\nexport default class OptionList {\n constructor (args) {\n this.config = args.config\n this.parent = args.root\n this.root = Util.createDom('ul', '', {}, `xg-options-list xg-list-slide-scroll ${this.config.className}`)\n args.root.appendChild(this.root)\n const { maxHeight } = this.config\n if (maxHeight) {\n this.setStyle({ maxHeight })\n }\n this.onItemClick = this.onItemClick.bind(this)\n this.renderItemList()\n const eventName = this.config.domEventType === 'touch' ? 'touchend' : 'click'\n this._delegates = Plugin.delegate.call(this, this.root, 'li', eventName, this.onItemClick)\n }\n\n renderItemList (data) {\n const { config, root } = this\n if (data) {\n config.data = data\n } else {\n data = config.data\n }\n\n if (config.style) {\n Object.keys(config.style).map(key => {\n root.style[key] = config[key]\n })\n }\n\n if (data.length > 0) {\n this.attrKeys = Object.keys(data[0])\n }\n\n this.root.innerHTML = ''\n\n data.map((item, index) => {\n const className = item.selected ? 'option-item selected' : 'option-item'\n item['data-index'] = index\n this.root.appendChild(Util.createDom('li', `<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\n show () {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'active')\n }\n\n hide () {\n Util.removeClass(this.root, 'active')\n Util.addClass(this.root, 'hide')\n }\n\n setStyle (style) {\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\n }\n\n destroy () {\n if (this._delegates) {\n this._delegates.map(item => {\n item.destroy && item.destroy()\n })\n this._delegates = null\n }\n this.root.innerHTML = null\n this.parent.removeChild(this.root)\n this.root = null\n }\n}\n","\nimport Plugin, { Events, Util, Sniffer, POSITIONS } from '../../plugin'\nimport OptionList from './optionList'\n// import './optionsIcon.scss'\n\nconst LIST_TYPES = {\n SIDE: 'side',\n MIDDLE: 'middle',\n DEFAULT: 'default'\n}\n\nconst TOGGLE_MODES = {\n CLICK: 'click',\n HOVER: 'hover'\n}\n\nfunction getListClassName (listType, position) {\n if (listType === LIST_TYPES.SIDE) {\n return position === POSITIONS.CONTROLS_LEFT ? 'xg-side-list xg-left-side' : 'xg-side-list xg-right-side'\n } else {\n return ''\n }\n}\n\n/**\n * @typedef {{\n * isShow?: boolean,\n * index?: number,\n * list?: Array<any>,\n * listType?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IOptionsIconConfig\n */\n\nlet IS_MOBILE = Sniffer.device === 'mobile'\n\nexport default class OptionsIcon extends Plugin {\n static get pluginName () {\n return 'optionsIcon'\n }\n\n /**\n * @type { IOptionsIconConfig }\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 100,\n list: [],\n listType: 'default', // 模式 side-右侧边栏 middle-中间显示\n listStyle: {},\n hidePortrait: true,\n isShowIcon: false,\n isItemClickHide: true, // 列表点击之后是否隐藏列表\n toggleMode: TOGGLE_MODES.HOVER, // 激活状态切换模式\n heightLimit: true\n }\n }\n\n constructor (args) {\n super(args)\n this.isIcons = false\n this.isActive = false\n this.curValue = null // 当前值\n this.curIndex = 0\n }\n\n updateLang (value) {\n this.renderItemList(this.config.list, this.curIndex)\n }\n\n afterCreate () {\n const { config } = this\n this.initIcons()\n IS_MOBILE = IS_MOBILE || this.domEventType === 'touch'\n if (IS_MOBILE && Sniffer.device === 'mobile' && config.listType === LIST_TYPES.DEFAULT) {\n config.listType = LIST_TYPES.SIDE\n }\n\n config.hidePortrait && Util.addClass(this.root, 'portrait')\n\n this.on([Events.VIDEO_RESIZE, Events.FULLSCREEN_CHANGE], () => {\n this._resizeList()\n })\n\n this.once(Events.CANPLAY, () => {\n if (config.list && config.list.length > 0) {\n this.renderItemList(config.list)\n this.show()\n }\n })\n // 移动端控制栏和列表互斥\n IS_MOBILE && this.on(Events.PLAYER_FOCUS, () => {\n if (!this.isActive) {\n return\n }\n this.optionsList && this.optionsList.hide()\n this.isActive = false\n })\n\n if (IS_MOBILE) {\n config.toggleMode = TOGGLE_MODES.CLICK\n this.activeEvent = 'touchend'\n } else {\n this.activeEvent = config.toggleMode === TOGGLE_MODES.CLICK ? 'click' : 'mouseenter'\n }\n\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.bind(this.activeEvent, this.switchActiveState)\n } else {\n this.bind(this.activeEvent, this.onEnter)\n this.bind('mouseleave', this.onLeave)\n }\n this.isIcons && this.bind('click', this.onIconClick)\n }\n\n initIcons () {\n const { icons } = this\n const _c = Object.keys(icons)\n let _isIcons = false\n if (_c.length > 0) {\n _c.forEach(key => {\n this.appendChild('.xgplayer-icon', icons[key])\n !_isIcons && (_isIcons = icons[key])\n })\n this.isIcons = _isIcons\n }\n if (_isIcons) {\n return\n }\n this.appendChild('.xgplayer-icon', Util.createDom('span', '', {}, 'icon-text'))\n Util.addClass(this.find('.xgplayer-icon'), 'btn-text')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length < 2) {\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n getTextByLang (item, key, lang) {\n if (item === undefined) {\n return ''\n }\n const { list } = this.config\n !lang && (lang = this.player.lang)\n key = (!key || Util.isUndefined(item[key])) ? 'text' : key\n typeof item === 'number' && (item = list[item])\n try {\n if (typeof item[key] === 'object') {\n return item[key][lang] || item[key].en\n } else {\n return item[key]\n }\n } catch (err) {\n console.warn(err)\n return ''\n }\n }\n\n onEnter = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n this.switchActiveState(e)\n }\n\n switchActiveState = (e) => {\n e.stopPropagation()\n const { toggleMode } = this.config\n if (toggleMode === TOGGLE_MODES.CLICK) {\n this.toggle(!this.isActive)\n } else {\n this.toggle(true)\n }\n }\n\n onLeave = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n if (this.config.listType !== LIST_TYPES.SIDE) {\n this.isActive && this.toggle(false)\n }\n }\n\n onListEnter = (e) => {\n // console.log('onListEnter')\n this.enterType = 2\n }\n\n onListLeave = (e) => {\n // console.log('onListLeave', e.target)\n this.enterType = 0\n this.isActive && this.toggle(false)\n }\n\n // 状态切换\n toggle (isActive) {\n if (isActive === this.isActive || this.config.disable) return\n const { controls } = this.player\n const { listType } = this.config\n if (isActive) {\n listType === LIST_TYPES.SIDE ? controls.blur() : controls.focus()\n this.optionsList && this.optionsList.show()\n } else {\n listType === LIST_TYPES.SIDE ? controls.focus() : controls.focusAwhile()\n this.optionsList && this.optionsList.hide()\n }\n this.isActive = isActive\n }\n\n // 列表点击回调\n onItemClick (e, data) {\n e.stopPropagation()\n const { listType, list } = this.config\n this.curIndex = data.to.index\n this.curItem = list[this.curIndex]\n this.changeCurrentText()\n const { isItemClickHide } = this.config;\n (isItemClickHide || IS_MOBILE || listType === LIST_TYPES.SIDE) && this.toggle(false)\n }\n\n onIconClick (e) {\n //\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n if (!curItem) return\n this.find('.icon-text').innerHTML = this.getTextByLang(curItem, 'iconText')\n }\n\n renderItemList (itemList, curIndex) {\n const { config, optionsList, player } = this\n if (typeof curIndex === 'number') {\n this.curIndex = curIndex\n this.curItem = config.list[curIndex]\n }\n\n if (optionsList) {\n optionsList.renderItemList(itemList)\n this.changeCurrentText()\n return\n }\n\n const options = {\n config: {\n data: itemList || [],\n className: getListClassName(config.listType, config.position), // config.listType === LIST_TYPES.SIDE ? 'xg-right-side' : '',\n onItemClick: (e, data) => {\n this.onItemClick(e, data)\n },\n domEventType: IS_MOBILE ? 'touch' : 'mouse'\n },\n root: config.listType === LIST_TYPES.SIDE ? (player.innerContainer || player.root) : this.root\n }\n\n if (this.config.isShowIcon) {\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n if (_maxH && config.heightLimit) {\n options.config.maxHeight = `${_maxH}px`\n }\n this.optionsList = new OptionList(options)\n this.changeCurrentText()\n this.show()\n }\n this._resizeList()\n }\n\n _resizeList () {\n if (!this.config.heightLimit) {\n return\n }\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = this.config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n this.optionsList && this.optionsList.setStyle({ maxHeight: `${_maxH}px` })\n }\n\n destroy () {\n const { config } = this\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.unbind(this.activeEvent, this.switchActiveState)\n } else {\n this.unbind(this.activeEvent, this.onEnter)\n this.unbind('mouseleave', this.onLeave)\n }\n this.isIcons && this.unbind('click', this.onIconClick)\n if (this.optionsList) {\n this.optionsList.destroy()\n this.optionsList = null\n }\n }\n\n render () {\n if (!this.config.isShowIcon) {\n return\n }\n return `<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 /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length < 2){\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n initDefinition () {\n const { list, defaultDefinition } = this.config\n if (list.length > 0) {\n let to = null\n list.map(item => {\n if (item.definition === defaultDefinition) {\n to = item\n }\n })\n if (!to) {\n to = list[0]\n }\n this.changeDefinition(to)\n }\n }\n\n renderItemList (list = this.config.list || [], to) {\n const targetDef = to && to.definition ? to.definition : this.config.defaultDefinition\n if (to) {\n list.forEach((item) => {\n item.selected = false\n })\n }\n let curIndex = 0\n const items = list.map((item, index) => {\n const showItem = {\n ...item,\n showText: this.getTextByLang(item) || item.definition,\n selected: false\n }\n\n if (item.selected || (item.definition\n // eslint-disable-next-line eqeqeq\n && item.definition == targetDef)\n ) {\n showItem.selected = true\n curIndex = index\n }\n return showItem\n })\n super.renderItemList(items, curIndex)\n }\n\n // 对外暴露 切换清晰度\n changeDefinitionList (list) {\n if (!Array.isArray(list)) {\n return\n }\n this.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n this.renderItemList()\n this.config.list.length < 2 ? this.hide() : this.show()\n }\n\n changeDefinition (to, from) {\n this.player.changeDefinition(to, from)\n }\n\n onItemClick (e, data) {\n const { definitionList } = this.player\n super.onItemClick(...arguments)\n this.emitUserAction(e, 'change_definition', { from: data.from, to: data.to })\n for (let i = 0; i < definitionList.length; i++) {\n if (data.to && definitionList[i].definition === data.to.definition) {\n data.to.url = definitionList[i].url\n }\n\n if (data.from && (definitionList[i].definition === data.from.definition)) {\n data.from.url = definitionList[i].url\n }\n }\n this.player.changeDefinition(data.to, data.from)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array<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 /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length === 0) {\n return\n }\n super.show()\n }\n\n onItemClick (e, _data) {\n super.onItemClick(e, _data)\n const target = e.delegateTarget\n const rate = Number(target.getAttribute('rate'))\n if (!rate || rate === this.curValue) {\n return false\n }\n const props = {\n playbackRate: {\n from: this.player.playbackRate,\n to: rate\n }\n }\n this.emitUserAction(e, 'change_rate', { props })\n this.curValue = rate\n this.player.playbackRate = rate\n }\n\n renderItemList () {\n const playbackRate = this.player.playbackRate || 1\n this.curValue = playbackRate\n let curIndex = -1\n const items = this.config.list.map((item, index) => {\n const itemInfo = {\n rate: item.rate\n }\n if (itemInfo.rate === playbackRate) {\n itemInfo.selected = true\n curIndex = index\n }\n itemInfo.showText = this.getTextByLang(item)\n return itemInfo\n })\n super.renderItemList(items, curIndex)\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n let _text = ''\n // 在列表中没有匹配的选项的时候,默认展示`${playbackRate}x'\n if (!curItem || this.curIndex < 0) {\n _text = `${this.player.playbackRate}x`\n } else {\n _text = this.getTextByLang(curItem, 'iconText')\n }\n this.find('.icon-text').innerHTML = _text\n }\n\n destroy () {\n super.destroy()\n }\n}\n","import 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 /**\n * @type {number}\n */\n this.intervalId = 0\n this.customConfig = null\n this.bind('.highlight', ['click', 'touchend'], (e) => {\n if (this.config.onClick || this.customOnClick) {\n e.preventDefault()\n e.stopPropagation()\n this.customOnClick ? this.customOnClick(e) : this.config.onClick(e)\n }\n })\n\n this.player.showPrompt = (...args) => {\n this.showPrompt(...args)\n }\n\n this.player.hidePrompt = () => {\n this.hide()\n }\n }\n\n setStyle (style) {\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n }\n\n showPrompt (detail, config = {}, onClick = () => {}) {\n if (!detail) {\n return\n }\n this.customOnClick = onClick\n const { interval } = this.config\n if (this.intervalId) {\n clearTimeout(this.intervalId)\n this.intervalId = null\n }\n Util.addClass(this.root, 'show')\n config.mode === 'arrow' && Util.addClass(this.root, 'arrow')\n if (typeof detail === 'string') {\n this.find('.xgplayer-prompt-detail').innerHTML = detail\n } else {\n this.find('.xgplayer-prompt-detail').innerHTML = `${detail.text || ''}` + `${detail.highlight ? `<i class=\"highlight\">${detail.highlight}</i>` : ''}`\n }\n\n config.style && this.setStyle(config.style)\n\n const autoHide = typeof config.autoHide === 'boolean' ? config.autoHide : this.config.autoHide\n if (autoHide) {\n const hideinterval = config.interval || interval\n this.intervalId = setTimeout(() => {\n this.hide()\n }, hideinterval)\n }\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n Util.removeClass(this.root, 'arrow')\n this.root.removeAttribute('style')\n this.customOnClick = null\n }\n\n render () {\n return `<xg-prompt class=\"xgplayer-prompt ${STATE_CLASS.CONTROLS_FOLLOW}\">\n <span class=\"xgplayer-prompt-detail\"></span>\n </xg-prompt>`\n }\n}\n\nexport default Prompt\n","import { Util, Events } from '../../plugin'\n\nconst ISPOT = {\n time: 0, // 进度条在此时间戳打点 单位为s\n text: '', // 打点处的自定义文案\n id: 1, // 标记唯一标识,用于删除的时候索引\n duration: 1, // 进度条标识点的时长 默认1s【可选】单位为s\n color: '#fff', // 进度条标识点的显示颜色【可选】\n style: {}, // 指定样式\n width: 6,\n height: 6\n}\n\nfunction mergeISPOT (iSpot) {\n Object.keys(ISPOT).map(key => {\n if (iSpot[key] === undefined) {\n iSpot[key] = ISPOT[key]\n }\n })\n}\n\nconst APIS = {\n _updateDotDom (iSpot, dotDom) {\n if (!dotDom) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n dotDom.setAttribute('data-text', iSpot.text)\n dotDom.setAttribute('data-time', iSpot.time)\n if (ret.isMini) {\n Util.addClass(dotDom, 'mini')\n } else {\n Util.removeClass(dotDom, 'mini')\n }\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n },\n initDots () {\n this._ispots.map(item => {\n this.createDot(item, false)\n })\n this.ispotsInit = true\n },\n\n /**\n * 创建一个故事点\n * @param { object } iSpot\n * @param { boolean } isNew\n */\n createDot (iSpot, isNew = true) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (isNew) {\n mergeISPOT(iSpot)\n this._ispots.push(iSpot)\n }\n if (!this.ispotsInit && isNew) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n let className = `xgspot_${iSpot.id} xgplayer-spot`\n ret.isMini && (className += ' mini')\n const _t = iSpot.template ? `<div class=\"xgplayer-spot-pop\">${iSpot.template}</div>` : ''\n const dotDom = Util.createDom('xg-spot', _t, {\n 'data-text': iSpot.text,\n 'data-time': iSpot.time,\n 'data-id': iSpot.id\n }, className)\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n progress.outer && progress.outer.appendChild(dotDom)\n this.positionDot(dotDom, iSpot.id)\n },\n\n /**\n * 根据id查找节点\n * @param {string} id\n */\n findDot (id) {\n if (!this.player.plugins.progress) {\n return\n }\n const ret = this._ispots.filter((cur, index) => {\n return cur.id === id\n })\n return ret.length > 0 ? ret[0] : null\n },\n\n /**\n * 更新故事点\n * @param {any} iSpot\n * @param {boolean} needShow\n */\n updateDot (iSpot, needShow = false) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const dot = this.findDot(iSpot.id)\n if (dot) {\n Object.keys(iSpot).map(key => {\n dot[key] = iSpot[key]\n })\n }\n if (!this.ispotsInit) {\n return\n }\n const dotDom = progress.find(`xg-spot[data-id=\"${iSpot.id}\"]`)\n if (!dotDom) {\n return\n }\n this._updateDotDom(iSpot, dotDom)\n if (needShow) {\n this.showDot(iSpot.id)\n }\n },\n\n /**\n * 删除某个故事点\n * @param {string | number } id\n */\n deleteDot (id) {\n const { _ispots } = this\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const del = []\n for (let i = 0; i < _ispots.length; i++) {\n if (_ispots[i].id === id) {\n del.push(i)\n }\n }\n const len = del.length\n for (let i = len - 1; i >= 0; i--) {\n _ispots.splice(del[i], 1)\n if (this.ispotsInit) {\n const dotDom = progress.find(`xg-spot[data-id=\"${id}\"]`)\n if (dotDom) {\n dotDom.parentElement.removeChild(dotDom)\n }\n }\n }\n },\n\n /**\n * 移除所有的故事点\n */\n deleteAllDots () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this.ispotsInit) {\n this._ispots = []\n return\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n for (let i = dotDoms.length - 1; i >= 0; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n this._ispots = []\n },\n /**\n * 批量全部更新当前故事点\n * @param {Array} iSpots\n */\n updateAllDots (iSpots = []) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this.ispotsInit) {\n this._ispots = iSpots\n return\n }\n this._ispots = []\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n const len = dotDoms.length\n if (len > iSpots.length) {\n for (let i = len - 1; i > iSpots.length - 1; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n }\n iSpots.forEach((ispot, index) => {\n if (index < len) {\n dotDoms[index].setAttribute('data-id', `${ispot.id}`)\n this._ispots.push(ispot)\n this.updateDot(ispot)\n } else {\n this.createDot(ispot)\n }\n })\n },\n\n positionDots () {\n const { _ispots, playerSize } = this\n const { sizeInfo } = this.player\n const { progress } = this.player.plugins\n if (!progress || sizeInfo.width === playerSize.width) {\n return\n }\n playerSize.width = sizeInfo.width\n playerSize.left = sizeInfo.left\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n dotDom && this.positionDot(dotDom, item.id)\n })\n },\n\n positionDot (dotDom, id) {\n const _pop = Util.findDom(dotDom, '.xgplayer-spot-pop')\n if (!_pop) {\n return\n }\n const pRect = this.playerSize\n\n const rect1 = dotDom.getBoundingClientRect()\n const rect = _pop.getBoundingClientRect()\n const _left = rect1.left - pRect.left\n const _diff = pRect.width - _left - rect1.width / 2\n if (_left < rect.width / 2 || pRect.width < rect.width) {\n const t = rect.width / 2 - _left\n _pop.style.left = `${t}px`\n } else if (_diff < rect.width / 2) {\n const t = _diff - rect.width / 2 + rect1.width / 2\n _pop.style.left = `${t}px`\n } else {\n _pop.style.left = '50%'\n }\n },\n\n updateDuration () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const { _ispots } = this\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n this._updateDotDom(item, dotDom)\n })\n },\n\n getAllDotsDom () {\n const { progress } = this.player.plugins\n if (!progress) {\n return []\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n return dotDoms\n },\n\n getDotDom (id) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n return progress.find(`xg-spot[data-id=\"${id}\"]`)\n }\n}\n\nexport default function initDotsAPI (plugin) {\n const { config, player } = plugin\n Object.keys(APIS).map(item => {\n plugin[item] = APIS[item].bind(plugin)\n })\n const ispots = player.config.progressDot || config.ispots || []\n plugin._ispots = ispots.map(item => {\n mergeISPOT(item)\n return item\n })\n plugin.ispotsInit = false\n plugin.playerSize = {\n left: player.sizeInfo.left,\n width: player.sizeInfo.width\n }\n plugin.on(Events.DURATION_CHANGE, () => {\n if (!plugin.ispotsInit) {\n plugin.initDots()\n } else {\n // 更新节点\n plugin.updateDuration()\n }\n })\n plugin.on(Events.VIDEO_RESIZE, () => {\n plugin.positionDots()\n })\n}\n","import Plugin, { Util, Sniffer, Events } from '../../plugin'\nimport initDotsAPI from './dotsApi'\nimport './index.scss'\n/**\n * @typedef {{\n * miniWidth?: number, // 故事点显示最小宽度\n * ispots?: Array<{ //故事点列表\n * time?: number, // 进度条在此时间戳打点 单位为s\n * text?: string, // 打点处的自定义文案\n * id?: number | string, // 标记唯一标识,用于删除的时候索引\n * duration:? number, // 进度条标识点的时长 默认1s【可选】单位为s\n * color?: string, // 进度条标识点的显示颜色【可选】\n * style?: { [propName: string]: any }, // 指定样式\n * width?: number,\n * height?: number\n * }>,\n * defaultText?: '', // 故事点hover默认文案\n * isFocusDots?: true, //\n * isShowThumbnail?: true, // 是否显示预览图\n * isShowCoverPreview?: false, // 进度条拖动时是否显示播放区域预览图\n * mode?: 'short' | 'production', // short // production\n * [propName: string]: any\n * }} IProgressPreviewConfig\n */\n\nconst CALLBACK_MAP = {\n dragmove: 'onProgressMove',\n dragstart: 'onProgressDragStart',\n dragend: 'onProgressDragEnd',\n click: 'onProgressClick',\n mouseover: 'onProgressMouseOver',\n mouseenter: 'onProgressMouseOver'\n}\n\n/** */\nexport default class ProgressPreview extends Plugin {\n constructor (args) {\n super(args)\n this._ispots = []\n this.videoPreview = null\n this.videothumbnail = null\n this.thumbnail = null\n this.timeStr = ''\n this._state = {\n now: 0,\n f: false\n }\n }\n\n static get pluginName () {\n return 'progresspreview'\n }\n\n /**\n * @type IProgressPreviewConfig\n */\n static get defaultConfig () {\n return {\n index: 1,\n miniWidth: 6, // 故事点显示最小宽度\n ispots: [], // 故事点列表\n defaultText: '', // 故事点hover默认文案\n isFocusDots: true, //\n isHideThumbnailHover: true, // 是否在hover在预览图的时候隐藏\n isShowThumbnail: true, // 是否显示预览图\n isShowCoverPreview: false, // 进度条拖动时是否显示播放区域预览图\n mode: '', // short // production\n disable: false,\n width: 160, // 显示宽度\n height: 90 // 显示高度\n }\n }\n\n beforeCreate (args) {\n const progress = args.player.plugins.progress\n if (progress) {\n args.root = progress.root\n }\n }\n\n afterCreate () {\n this._curDot = null\n this.handlerSpotClick = this.hook('spotClick', (_event, data) => {\n if (data.seekTime) {\n this.player.seek(data.seekTime)\n }\n })\n this.transformTimeHook = this.hook('transformTime', (time) => {\n this.setTimeContent(Util.format(time))\n })\n initDotsAPI(this)\n\n this.on(Events.DURATION_CHANGE, () => {\n this.show()\n })\n if (this.config.disable) {\n this.disable()\n }\n // 用于进度条预览的扩展\n this.extTextRoot = this.find('.xg-spot-ext-text')\n }\n\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n }\n\n onPluginsReady () {\n const { player } = this\n if (!player.plugins.progress) {\n return\n }\n this.previewLine = this.find('.xg-spot-line')\n this.timePoint = this.find('.xgplayer-progress-point')\n this.timeText = this.find('.xg-spot-time')\n this.tipText = this.find('.spot-inner-text')\n\n this._hasThumnail = false\n\n this.registerThumbnail()\n\n this.bindEvents()\n }\n\n bindEvents () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n Object.keys(CALLBACK_MAP).map(key => {\n this[CALLBACK_MAP[key]] = this[CALLBACK_MAP[key]].bind(this)\n progress.addCallBack(key, this[CALLBACK_MAP[key]])\n })\n\n if (Sniffer.device === 'mobile') return\n\n this.bind('.xg-spot-info', 'mousemove', this.onMousemove)\n\n this.bind('.xg-spot-info', 'mousedown', this.onMousedown)\n\n this.bind('.xg-spot-info', 'mouseup', this.onMouseup)\n\n const fun = this.hook('previewClick', (...args) => {\n // console.log('args', args)\n })\n\n this.handlerPreviewClick = (e) => {\n e.stopPropagation()\n fun(parseInt(this._state.now * 1000, 10) / 1000, e)\n\n if (progress) {\n // Make sure the mouse event is unlocked, otherwise the progress bar will still slide\n progress.onMouseUp(e)\n }\n }\n\n this.bind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n onMousemove = (e) => {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xg-spot-content') && this.config.isHideThumbnailHover) {\n this.player.plugins.progress.onMouseLeave(e)\n return\n }\n if (this._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onMousedown = (e) => {\n if (this.config.disable) {\n return\n }\n if (this._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onMouseup = (e) => {\n if (!this.isDrag) {\n return\n }\n const { progress } = this.player.plugins\n if (progress && progress.pos) {\n progress.onMouseUp(e)\n !progress.pos.isEnter && progress.onMouseLeave(e)\n }\n }\n\n onDotMouseLeave = (e) => {\n if (this.config.disable) {\n return\n }\n this._curDot.removeEventListener('mouseleave', this.onDotMouseLeave)\n this.blurDot(e.target)\n this._curDot = null\n const { progress } = this.player.plugins\n progress && progress.enableBlur()\n this.show()\n }\n\n onProgressMouseOver = (data, e) => {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xgplayer-spot') && !this._curDot) {\n this._curDot = e.target\n this.focusDot(e.target)\n if (this._curDot.children.length > 0) {\n this.hide()\n }\n const { progress } = this.player.plugins\n progress && progress.disableBlur()\n this._curDot.addEventListener('mouseleave', this.onDotMouseLeave)\n }\n }\n\n onProgressMove (data, e) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.updatePosition(data.offset, data.width, data.currentTime, data.e)\n }\n\n onProgressDragStart (data) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.isDrag = true\n this.videoPreview && Util.addClass(this.videoPreview, 'show')\n }\n\n onProgressDragEnd (data) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.isDrag = false\n this.videoPreview && Util.removeClass(this.videoPreview, 'show')\n }\n\n onProgressClick (data, e) {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xgplayer-spot')) {\n e.stopPropagation()\n e.preventDefault();\n ['time', 'id', 'text'].map(key => {\n data[key] = e.target.getAttribute(`data-${key}`)\n })\n data.time && (data.time = Number(data.time))\n this.handlerSpotClick(e, data)\n }\n }\n\n updateLinePos (offset, cwidth) {\n const { root, previewLine, player, config } = this\n const { mode } = player.controls\n const isflex = mode === 'flex'\n let lwidth = root.getBoundingClientRect().width\n // 如果当前预览图宽度获取不到,无法计算位移,不做渲染\n if (!lwidth && this._hasThumnail) {\n return\n }\n lwidth = this._hasThumnail && lwidth < config.width ? config.width : lwidth\n let x = offset - lwidth / 2\n let _t\n if (x < 0 && !isflex) {\n x = 0\n _t = offset - lwidth / 2\n } else if (x > cwidth - lwidth && !isflex) {\n _t = x - (cwidth - lwidth)\n x = cwidth - lwidth\n } else {\n _t = 0\n }\n _t !== undefined && (previewLine.style.transform = `translateX(${_t.toFixed(2)}px)`)\n root.style.transform = `translateX(${x.toFixed(2)}px) translateZ(0)`\n }\n\n updateTimeText (timeStr) {\n const { timeText, timePoint } = this\n timeText.innerHTML = timeStr\n !this.thumbnail && (timePoint.innerHTML = timeStr)\n }\n\n updatePosition (offset, cwidth, time, e) {\n const { root, config, _state } = this\n if (!root) {\n return\n }\n\n // let now = offset / cwidth * player.duration\n // now = now < 0 ? 0 : (now > player.duration ? player.duration : now)\n _state.now = time\n this.transformTimeHook(time)\n const timeStr = this.timeStr\n if (e && e.target && Util.hasClass(e.target, 'xgplayer-spot')) {\n this.showTips(e.target.getAttribute('data-text'), false, timeStr)\n this.focusDot(e.target)\n _state.f = true\n config.isFocusDots && _state.f && (_state.now = parseInt(e.target.getAttribute('data-time'), 10))\n } else if (config.defaultText) {\n _state.f = false\n this.showTips(config.defaultText, true, timeStr)\n } else {\n _state.f = false\n this.hideTips('')\n // this.blurDot()\n }\n this.updateTimeText(timeStr)\n this.updateThumbnails(_state.now)\n this.updateLinePos(offset, cwidth)\n }\n\n /**\n * @description 设置自定义时间显示字符串\n * @param {string} str\n */\n setTimeContent (str) {\n this.timeStr = str\n }\n\n updateThumbnails (time) {\n const { player, videoPreview, config } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, config.width, config.height)\n const rect = videoPreview && videoPreview.getBoundingClientRect()\n this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n registerThumbnail (thumbnailConfig = {}) {\n if (Sniffer.device === 'mobile') {\n return\n }\n const { player, config } = this\n const thumbnail = player.getPlugin('thumbnail')\n if (thumbnail) {\n thumbnail.setConfig(thumbnailConfig)\n }\n if (!thumbnail || !thumbnail.usable || !config.isShowThumbnail) {\n Util.addClass(this.root, 'short-line no-thumbnail')\n return\n } else {\n Util.removeClass(this.root, 'short-line no-thumbnail')\n }\n if (config.mode === 'short') {\n Util.addClass(this.root, 'short-line')\n }\n this._hasThumnail = true\n const tRoot = this.find('.xg-spot-thumbnail')\n this.thumbnail = thumbnail.createThumbnail(tRoot, 'progress-thumbnail')\n if (config.isShowCoverPreview) {\n this.videoPreview = Util.createDom('xg-video-preview', '', {}, 'xgvideo-preview')\n player.root.appendChild(this.videoPreview)\n this.videothumbnail = thumbnail.createThumbnail(this.videoPreview, 'xgvideo-thumbnail')\n }\n this.updateThumbnails(0)\n }\n\n calcuPosition (time, duration) {\n const { progress } = this.player.plugins\n const { player } = this\n const totalWidth = progress.root.getBoundingClientRect().width\n const widthPerSeconds = player.duration / totalWidth * 6\n const ret = {}\n if (time + duration > player.duration) {\n duration = player.duration - time\n }\n ret.left = time / player.duration * 100\n ret.width = duration / player.duration\n ret.isMini = widthPerSeconds > duration\n return {\n left: time / player.duration * 100,\n width: duration / player.duration * 100,\n isMini: duration < widthPerSeconds\n }\n }\n\n showDot (id) {\n const dot = this.findDot(id)\n if (dot) {\n const rect = this.root.getBoundingClientRect()\n const { width } = rect\n const offset = dot.time / this.player.duration * width\n this.updatePosition(offset, width, dot.time)\n }\n }\n\n focusDot (target, id) {\n if (!target) {\n return\n }\n if (!id) {\n id = target.getAttribute('data-id')\n }\n Util.addClass(target, 'active')\n this._activeDotId = id\n }\n\n blurDot (target) {\n if (!target) {\n const id = this._activeDotId\n target = this.getDotDom(id)\n }\n if (!target) {\n return\n }\n Util.removeClass(target, 'active')\n this._activeDotId = null\n }\n\n showTips (text, isDefault, timeStr = '') {\n Util.addClass(this.root, 'no-timepoint')\n if (!text) {\n return\n }\n Util.addClass(this.find('.xg-spot-content'), 'show-text')\n if (isDefault && this.config.mode === 'production') {\n Util.addClass(this.root, 'product')\n this.tipText.textContent = text\n } else {\n Util.removeClass(this.root, 'product')\n this.tipText.textContent = this._hasThumnail ? text : `${timeStr} ${text}`\n }\n }\n\n hideTips () {\n Util.removeClass(this.root, 'no-timepoint')\n this.tipText.textContent = ''\n Util.removeClass(this.find('.xg-spot-content'), 'show-text')\n Util.removeClass(this.root, 'product')\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n Util.removeClass(this.root, 'hide')\n }\n\n enable () {\n const { config, playerConfig } = this\n this.config.disable = false\n this.show()\n if (!this.thumbnail && config.isShowThumbnail) {\n this.registerThumbnail(playerConfig.thumbnail || {})\n }\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n const { progress } = this.player.plugins\n progress && Object.keys(CALLBACK_MAP).map(key => {\n progress.removeCallBack(key, this[CALLBACK_MAP[key]])\n })\n this.videothumbnail = null\n this.thumbnail = null\n this.videoPreview && this.player.root.removeChild(this.videoPreview)\n this.unbind('.xg-spot-info', 'mousemove', this.onMousemove)\n this.unbind('.xg-spot-info', 'mousedown', this.onMousedown)\n this.unbind('.xg-spot-info', 'mouseup', this.onMouseup)\n this.unbind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n render () {\n if (Sniffer.device === 'mobile' || this.playerConfig.isMobileSimulateMode === 'mobile') {\n return ''\n }\n\n return `<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, { Events, Util } from '../../plugin'\n\nfunction getBgColor (color) {\n return color ? `background:${color};` : ''\n}\n\nclass MiniProgress extends Plugin {\n static get pluginName () {\n return 'MiniProgress'\n }\n\n static get defaultConfig () {\n return {\n mode: 'auto',\n height: 2\n }\n }\n\n get offsetDuration () {\n return this.playerConfig.customDuration || this.player.offsetDuration || this.player.duration\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : currentTime\n }\n\n afterCreate () {\n if (!this.root) {\n return\n }\n this.on(Events.TIME_UPDATE, this.onTimeupdate)\n this.on(Events.EMPTIED, () => {\n this.reset()\n })\n }\n\n onTimeupdate = () => {\n const { ended } = this.player\n const { offsetDuration } = this\n let time = this.currentTime\n time = Util.adjustTimeByDuration(time, offsetDuration, ended)\n this.update({ played: time }, offsetDuration)\n }\n\n reset () {\n this.update({ played: 0, cached: 0 }, 0)\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!duration || !this.root) {\n return\n }\n if (data.cached) {\n this.find('xg-mini-progress-cache').style.width = `${data.cached / duration * 100}%`\n }\n if (data.played) {\n this.find('xg-mini-progress-played').style.width = `${data.played / duration * 100}%`\n }\n }\n\n render () {\n const { commonStyle, miniprogress } = this.playerConfig\n if (!miniprogress) {\n return\n }\n const { mode, height } = this.config\n const _style = {\n cached: getBgColor(commonStyle.cachedColor),\n played: getBgColor(commonStyle.playedColor),\n progress: getBgColor(commonStyle.progressColor),\n height: height > 0 && height !== 2 ? `height: ${height}px;` : ''\n }\n const stateClass = mode === 'show' ? 'xg-mini-progress-show' : ''\n return `<xg-mini-progress class=\"xg-mini-progress ${stateClass}\" style=\"${_style.progress} ${_style.height}\">\n <xg-mini-progress-cache class=\"xg-mini-progress-cache\" style=\"${_style.cached}\"></xg-mini-progress-cache>\n <xg-mini-progress-played class=\"xg-mini-progress-played\" style=\"${_style.played}\"></xg-mini-progress-played>\n </xg-mini-progress>`\n }\n}\n\nexport default MiniProgress\n","import Plugin, { Events, Util, Sniffer } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nimport './index.scss'\n\nconst MODES = {\n REAL_TIME: 'realtime',\n FIRST_FRAME: 'firstframe',\n FRAME_RATE: 'framerate',\n POSTER: 'poster'\n}\n\nfunction nowTime () {\n try {\n return parseInt(window.performance.now(), 10)\n } catch (e) {\n return new Date().getTime()\n }\n}\n\n/**\n * Check whether the current environment supports canvas\n * @returns { boolean }\n */\nfunction checkIsSupportCanvas () {\n try {\n const ctx = document.createElement('canvas').getContext\n if (ctx) {\n return true\n }\n return false\n } catch (e) {\n return false\n }\n}\n\n/**\n * @typedef { {\n * disable?: boolean,\n * mode?: \"realtime\" | \"firstframe\" | \"framerate\",\n * frameRate?: number\n * filter?: string,\n * addMask?: boolean,\n * maskBg?: string,\n * multiple? : number,\n * [propName: string]: any\n * } } IDynamicBgConfig\n */\n\nlet isSupportCanvas = null\nclass DynamicBg extends Plugin {\n static get pluginName () {\n return 'dynamicBg'\n }\n\n /**\n * @type IDynamicBgConfig\n */\n static get defaultConfig () {\n return {\n isInnerRender: false,\n disable: true,\n index: -1,\n /**\n * Rendering method\n * realtime - Realtime rendering\n * firstframe - Render only the first frame\n * framerate - Render by frame\n * poster - Render by poster only\n */\n mode: 'framerate',\n frameRate: 10, // Frame rate when mode=framerate\n filter: 'blur(50px)', // Filter settings\n startFrameCount: 2, // 起始连续渲染次数\n startInterval: 0, // 初始渲染间隔\n addMask: true, // Whether need a mask\n multiple: 1.2, // 画面放大倍数\n maskBg: 'rgba(0,0,0,0.7)' // Mask background color\n }\n }\n\n /**\n * @type {boolean}\n * @description Does the current environment support Canvas\n */\n static get isSupport () {\n if (typeof isSupportCanvas === 'boolean') {\n return isSupportCanvas\n }\n isSupportCanvas = checkIsSupportCanvas()\n return isSupportCanvas\n }\n\n static supportCanvasFilter () {\n return !(Sniffer.browser === 'safari' || Sniffer.browser === 'firefox')\n }\n\n afterCreate () {\n if (this.playerConfig.dynamicBg === true) {\n this.config.disable = false\n }\n if (!DynamicBg.isSupport) {\n this.config.disable = true\n }\n const { disable, mode, frameRate } = this.config\n if (disable) {\n return\n }\n /**\n * @private\n */\n this._pos = {\n width: 0,\n height: 0,\n rwidth: 0,\n rheight: 0,\n x: 0,\n y: 0,\n pi: 0\n }\n /**\n * @readonly\n */\n this.isStart = false\n\n this._isLoaded = false\n /**\n * @readonly\n */\n this.videoPI = 0\n /**\n * @readonly\n */\n this.preTime = 0\n /**\n * @readonly\n */\n this.interval = parseInt(1000 / frameRate, 10)\n\n /**\n * @readonly\n */\n this.canvas = null\n /**\n * @readonly\n */\n this.canvasCtx = null\n\n this._frameCount = 0\n\n this._loopType = this.config.mode !== MODES.REAL_TIME && this.interval >= 1000 ? 'timer' : 'animation'\n\n this.once(Events.COMPLETE, () => {\n if (!this.player) {\n return\n }\n this.init()\n this.renderByPoster()\n if (!this.player.paused) {\n this.start()\n }\n })\n\n if (mode === MODES.POSTER) {\n return\n }\n\n if (mode !== MODES.FIRST_FRAME) {\n this.on(Events.EMPTIED, () => {\n this.stop()\n })\n this.on(Events.PLAY, () => {\n const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\n })\n this.on(Events.PAUSE, () => {\n this.stop()\n })\n }\n\n this.on(Events.LOADED_DATA, this.onLoadedData)\n this.on(Events.LOAD_START, () => {\n this._isLoaded = false\n this.stop()\n })\n document.addEventListener('visibilitychange', this.onVisibilitychange)\n }\n\n setConfig (config) {\n Object.keys(config).forEach(key => {\n if (key === 'root' && config[key] !== this.config[key]) {\n this.reRender(config[key])\n } else if (key === 'frameRate') {\n this.interval = parseInt(1000 / config[key], 10)\n } else if (key === 'disable' && config[key]) {\n this.stop()\n }\n this.config[key] = config[key]\n })\n }\n\n onLoadedData = (e) => {\n if (!this.player) { return }\n this._frameCount = this.config.startFrameCount\n this.stop()\n this.renderOnTimeupdate(e)\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n this.on(Events.TIME_UPDATE, this.renderOnTimeupdate)\n }\n\n onVisibilitychange = (e) => {\n if (document.visibilityState === 'visible') {\n this._checkIfCanStart() && this.start()\n } else if (document.visibilityState === 'hidden') {\n this.stop()\n }\n }\n\n /**\n * @private\n * 初始化 canvas对象并使用海报图先渲染首帧w11\n */\n init (_root) {\n const { player, config } = this\n this.canvasFilter = DynamicBg.supportCanvasFilter()\n try {\n // 保证节点插入到video之前\n let parent = _root || config.root\n if (!parent) {\n parent = !config.isInnerRender ? player.root : (player.innerContainer || player.root)\n }\n parent.insertAdjacentHTML('afterbegin',\n `<div class=\"xgplayer-dynamic-bg\" data-index=\"${config.index}\"><canvas>\n </canvas><xgmask></xgmask></div>`)\n this.root = parent.children[0]\n this.canvas = this.find('canvas')\n // safari中canvas filter不生效, 使用css滤镜\n if (!this.canvasFilter) {\n this.canvas.style.filter = config.filter\n this.canvas.style.webkitFilter = config.filter\n }\n this.mask = this.find('xgmask')\n\n config.addMask && (this.mask.style.background = config.maskBg)\n this.canvasCtx = this.canvas.getContext('2d')\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n reRender (root) {\n const { disable } = this.config\n if (!disable && !this.root) {\n return\n }\n this.stop()\n const _p = this.root ? this.root.parentElement : null\n if (_p !== root) {\n _p.removeChild(this.root)\n }\n if (!root) {\n this.root = null\n return\n }\n this.init(root)\n this.renderOnce()\n const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\n }\n\n /**\n * Check whether the current video object supports screenshots\n * @param { Object } video\n * @returns { DomElement | null }\n */\n checkVideoIsSupport (video) {\n if (!video) {\n return null\n }\n const _tVideo = video && video instanceof window.HTMLVideoElement ? video : (video.canvas ? video.canvas : (video.flyVideo ? video.flyVideo : null))\n if (_tVideo && !(Sniffer.browser === 'safari' && Util.isMSE(_tVideo))) {\n return _tVideo\n }\n\n const _tagName = _tVideo ? _tVideo.tagName.toLowerCase() : ''\n if (_tagName === 'canvas' || _tagName === 'img') {\n return _tVideo\n }\n\n return null\n }\n\n renderByPoster () {\n const { poster } = this.playerConfig\n if (poster) {\n const url = Util.typeOf(poster) === 'String' ? poster : (Util.typeOf(poster.poster) === 'String' ? poster.poster : null)\n this.updateImg(url)\n }\n }\n\n renderOnTimeupdate = (e) => {\n if (this._frameCount > 0) {\n this.renderOnce()\n this._frameCount--\n } else {\n this._isLoaded = true\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n const { startInterval } = this.config\n !this.player.paused && this._checkIfCanStart() && this.start(0, startInterval)\n }\n }\n\n _checkIfCanStart () {\n const { mode } = this.config\n return this._isLoaded && !this.player.paused && mode !== MODES.FIRST_FRAME && mode !== MODES.POSTER\n }\n\n /**\n * just render once\n * @returns\n */\n renderOnce () {\n const video = this.player.video\n if (!video.videoWidth || !video.videoHeight) {\n return\n }\n this.videoPI = parseInt(video.videoWidth / video.videoHeight * 100, 10)\n const _sVideo = this.checkVideoIsSupport(video)\n // console.log('>>>renderOnce, update', _sVideo, this.videoPI)\n _sVideo && this.update(_sVideo, this.videoPI)\n }\n\n start = (time, interval) => {\n const video = this.player.video\n const _now = nowTime()\n const _sVideo = this.checkVideoIsSupport(video)\n if (!_sVideo || !this.canvasCtx) {\n return\n }\n\n if (!interval) {\n interval = this.interval\n }\n this.stop()\n if (video.videoWidth && video.videoHeight) {\n this.videoPI = video.videoHeight > 0 ? parseInt(video.videoWidth / video.videoHeight * 100, 10) : 0\n if (this.config.mode === MODES.REAL_TIME) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n } else if (_now - this.preTime >= interval) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n }\n }\n this.frameId = this._loopType === 'timer' ? Util.setTimeout(this, this.start, interval) : Util.requestAnimationFrame(this.start)\n }\n\n stop = () => {\n if (this.frameId) {\n this._loopType === 'timer' ? Util.clearTimeout(this, this.frameId) : Util.cancelAnimationFrame(this.frameId)\n // window.clearTimeout(this.frameId)\n this.frameId = null\n }\n }\n\n updateImg (url) {\n // TODO: 需要改造,使用domcss样式渲染,不再使用canvas渲染\n if (!url) {\n return\n }\n // Render using the image\n const { width, height } = this.canvas.getBoundingClientRect()\n let image = new window.Image()\n image.onload = () => {\n if (!this.canvas || this.frameId || this.isStart) {\n return\n }\n this.canvas.height = height\n this.canvas.width = width\n const pi = parseInt(width / height * 100, 10)\n // console.log('>>>updateImg update', image, pi)\n this.update(image, pi)\n image = null\n }\n image.src = url\n }\n\n update (video, sourcePI) {\n if (!this.canvas || !this.canvasCtx || !sourcePI) {\n return\n }\n try {\n const { _pos, config } = this\n const { width, height } = this.canvas.getBoundingClientRect()\n if (width !== _pos.width || height !== _pos.height || _pos.pi !== sourcePI) {\n const pi = parseInt(width / height * 100, 10)\n _pos.pi = sourcePI\n _pos.width !== width && (_pos.width = this.canvas.width = width)\n _pos.height !== height && (_pos.height = this.canvas.height = height)\n let rheight = height\n let rwidth = width\n if (pi < sourcePI) {\n rwidth = parseInt(height * sourcePI / 100, 10)\n } else if (pi > sourcePI) {\n rheight = parseInt(width * 100 / sourcePI, 10)\n }\n _pos.rwidth = rwidth * config.multiple\n _pos.rheight = rheight * config.multiple\n _pos.x = (width - _pos.rwidth) / 2\n _pos.y = (height - _pos.rheight) / 2\n }\n // console.log(`x:${_pos.x} y:${_pos.y} rwidth:${_pos.rwidth} rheight:${_pos.rheight}`)\n this.canvasFilter && (this.canvasCtx.filter = config.filter)\n this.canvasCtx.drawImage(video, _pos.x, _pos.y, _pos.rwidth, _pos.rheight)\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n destroy () {\n this.stop()\n document.removeEventListener('visibilitychange', this.onVisibilitychange)\n this.canvasCtx = null\n this.canvas = null\n }\n\n render () {\n return ''\n }\n}\n\nexport default DynamicBg\n","import { BasePlugin, Events } from '../../plugin'\nconst INFO = 'info'\n\nconst { STATS_EVENTS } = Events\nexport default class Stats extends BasePlugin {\n static get pluginName () {\n return 'stats'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n _recordUserActions = (actionData) => {\n const time = this._getTime()\n const payload = Object.assign({}, actionData, { msg: actionData.msg || actionData.action })\n this._stats[INFO].push({\n type: 'userAction',\n ...time,\n payload\n })\n }\n\n _getTime () {\n return {\n timestamp: Date.now(),\n timeFormat: new Date().toISOString()\n }\n }\n\n afterCreate () {\n this.reset()\n this.on(Events.USER_ACTION, this._recordUserActions)\n this.on(STATS_EVENTS.STATS_INFO, this._recordInfo)\n this.on(STATS_EVENTS.STATS_DOWNLOAD, this._downloadStats)\n this.on(STATS_EVENTS.STATS_RESET, this._onReset)\n }\n\n destroy () {\n this.offAll()\n }\n\n _onReset = () => {\n this.reset()\n }\n\n _recordInfo = (data) => {\n this.info(data)\n }\n\n _downloadStats = () => {\n const stats = this.getStats()\n const blob = new Blob([JSON.stringify(stats)], { type: 'application/json' })\n const downloadUrl = window.URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.style.display = 'none'\n link.href = downloadUrl\n link.download = 'player.txt'\n link.disabled = false\n link.click()\n }\n\n downloadStats () {\n this._downloadStats()\n }\n\n /**\n * @params type\n */\n info (data) {\n if (data.profile) {\n this._infoProfile(data)\n } else {\n this._info(data)\n }\n }\n\n _info (data) {\n const time = this._getTime()\n this._stats[INFO].push({\n ...time,\n payload: data\n })\n }\n\n _infoProfile (data) {\n if (data && data.startMs) {\n const endMs = Date.now()\n const dur = endMs - data.startMs\n const profile = {\n cat: 'function',\n dur: dur,\n name: data.name || data.msg,\n ph: 'X',\n pid: 0,\n tid: 0,\n ts: data.startMs,\n profile: true,\n ...data\n }\n this._info(profile)\n } else {\n console.warn('infoProfile need object data, include startMs')\n }\n }\n\n reset () {\n this._stats = {\n [INFO]: [],\n media: {}\n }\n }\n\n getStats () {\n const { player } = this\n const mediaElem = player.media\n const buffered = []\n for (let i = 0; i < mediaElem.buffered.length; i++) {\n buffered.push({\n start: mediaElem.buffered.start(i),\n end: mediaElem.buffered.end(i)\n })\n }\n const mediaInfo = {\n currentTime: mediaElem.currentTime,\n readyState: mediaElem.readyState,\n buffered,\n paused: mediaElem.paused,\n ended: mediaElem.ended\n }\n\n this._stats.media = mediaInfo\n return {\n raw: this._stats,\n timestat: this._getTimeStats(),\n profile: this._getProfile()\n }\n }\n\n _getTimeStats () {\n const allStat = this._stats[INFO]\n const msgs = allStat.map(stat => {\n const data = stat.payload.data\n let msg = ''\n try {\n if (data instanceof Error) {\n msg = data.msg\n } else if (data !== undefined) {\n msg = JSON.stringify(data)\n }\n } catch (error) {\n console.log('err', error)\n }\n\n return `[${stat.timeFormat}] : ${stat.payload.msg} ${msg} `\n })\n return msgs\n }\n\n _getProfile () {\n const profile = {\n traceEvents: []\n }\n const allStat = this._stats[INFO]\n allStat.forEach(stat => {\n if (stat.payload.profile) {\n profile.traceEvents.push(stat.payload)\n }\n })\n return profile\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class GapJump extends BasePlugin {\n static get pluginName () {\n return 'gapJump'\n }\n\n static get defaultConfig () {\n return {\n useGapJump: false,\n smallGapLimit: 0.5,\n gapDetectionThreshold: 0.3\n }\n }\n\n afterCreate () {\n const { useGapJump } = this.config\n if (useGapJump === false) {\n return\n }\n this.hasPlayed = false\n this.seekingEventReceived = false\n this.isSafari = /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform)\n this.on(Events.WAITING, this.onGapJump)\n\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n\n this.on(Events.SEEKING, () => {\n this.seekingEventReceived = true\n })\n }\n\n onGapJump = () => {\n const { player, config } = this\n if (player.media.readyState === HTMLMediaElement.HAVE_NOTHING) {\n return\n }\n if (player.media.seeking) {\n if (!this.seekingEventReceived) { return }\n } else {\n this.seekingEventReceived = false\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n\n const buffered = player.media.buffered\n const smallGapLimit = config.smallGapLimit || 0.5\n const gapDetectionThreshold = config.gapDetectionThreshold || 0.3\n const currentTime = player.media.currentTime\n const idx = this._getIndex(buffered, currentTime, gapDetectionThreshold)\n if (idx === null || idx === 0) {\n return\n }\n console.log('GapJump bufferRange ', buffered.start(idx), buffered.end(idx))\n const jumpTo = buffered.start(idx) + 0.1\n const seekEnd = player.media.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n const jumpSize = jumpTo - currentTime\n const isGapSmall = jumpSize <= smallGapLimit\n if (jumpSize < GapJump.BROWSER_GAP_TOLERANCE) {\n return\n }\n\n if (isGapSmall) {\n if (config.useGapJump !== false) {\n player.media.currentTime = this.isSafari ? jumpTo + 0.1 : jumpTo\n }\n this.player && this.player.emit('detectGap')\n console.log('gapJump gapIndex', idx, ' isGapSamll:', isGapSmall, ' currentTime:', player.media.currentTime, ' jumpSize:', (currentTime - player.media.currentTime))\n // 目前转码视频首个分片cts存在,在Safari下为0.08,先忽略\n if (jumpTo !== 0.08) {\n player && player.emit('log', {\n type: 'oneevent', // 事件类型\n end_type: 'gap',\n vid: player.config.vid,\n ext: {\n video_postion: Math.floor(jumpTo * 1000) // ms\n }\n })\n }\n }\n }\n\n _getIndex (buffered, time, threshold) {\n if (!buffered || !buffered.length) {\n return null\n }\n if (buffered.length === 1 && buffered.end(0) - buffered.start(0) < 1e-6) {\n return null\n }\n const bufferedInfo = this._getBuffered(buffered)\n let idx = null\n for (let i = 0; i < bufferedInfo.length; i++) {\n const item = bufferedInfo[i]\n if (item.start > time && (i === 0 || bufferedInfo[i - 1].end - time <= threshold)) {\n idx = i\n break\n }\n }\n return idx\n }\n\n _getBuffered (b) {\n if (!b) {\n return []\n }\n const ret = []\n for (let i = 0; i < b.length; i++) {\n ret.push({\n start: b.start(i),\n end: b.end(i)\n })\n }\n return ret\n }\n}\nGapJump.BROWSER_GAP_TOLERANCE = 0.001\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class WaitingTimeoutJump extends BasePlugin {\n static get pluginName () {\n return 'waitingTimeoutJump'\n }\n\n static get defaultConfig () {\n return {\n useWaitingTimeoutJump: false,\n waitingTime: 15, // wait超过此时间没恢复,则向前跳jumpSize,单位s\n jumpSize: 2, // 单位s,\n jumpCntMax: 4 // 一次播放最大向前跳几次\n }\n }\n\n afterCreate () {\n const { useWaitingTimeoutJump, jumpSize } = this.config\n if (useWaitingTimeoutJump === false) {\n return\n }\n this.hasPlayed = false\n this.jumpCnt = 0\n /**\n * @type {null | number}\n */\n this.timer = null\n this.jumpSize = jumpSize\n this.on(Events.WAITING, this.onWaiting)\n this.on([Events.PLAYING, Events.CANPLAY], () => {\n clearTimeout(this.timer)\n this.timer = null\n this.jumpSize = this.config.jumpSize\n })\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n }\n\n onWaiting = () => {\n const { config } = this\n if (this.jumpCnt > config.jumpCntMax || this.timer || config.useWaitingTimeoutJump === false) {\n return\n }\n this.timer = setTimeout(this.onJump, config.waitingTime * 1000)\n }\n\n onJump = () => {\n const { player, config } = this\n clearTimeout(this.timer)\n this.timer = null\n if (this.jumpCnt > config.jumpCntMax || config.useWaitingTimeoutJump === false) {\n return\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n this.jumpSize = config.jumpSize * (this.jumpCnt + 1)\n if (this.jumpCnt === config.jumpSize && this.jumpSize < 6) {\n this.jumpSize = 6\n }\n const jumpTo = player.currentTime + this.jumpSize\n const seekEnd = player.media.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n this.jumpCnt++\n player.currentTime = jumpTo\n }\n}\n","import BasePlugin, { Events, Util } from '../../plugin'\nconst DEFAULT_SPEED_TYPE = 'cdn'\nconst SPEED_TYPE = ['cdn'] // 默认的速度的种类,可以通过addSpeedTypeList再继续增加\nexport default class TestSpeed extends BasePlugin {\n static get pluginName () {\n return 'testspeed'\n }\n\n static get defaultConfig () {\n return {\n openSpeed: false, // 测速开关,默认关\n testCnt: 3, // 一次播放的测速次数,默认1次\n loadSize: 200 * 1024, // 一次播放的测速请求的数据量大小,单位字节,默认200k\n testTimeStep: 3000, // 每次测速的时间间隔,第一次在开播后的testTimeStep 秒,默认是3s\n url: '', // 每次测速的url,一般传播放的备用地址测速\n saveSpeedMax: 5, // 保留最近多少次测速记录,最后的速度求这个记录列表平均值,默认5条\n addSpeedTypeList:[] // 需要增加的speed的类型\n }\n }\n\n getSpeed = (type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return 0\n if (this.speedListCache[type].length <= 0) return 0\n let total = 0\n this.speedListCache[type].map(item => {\n total += item\n })\n return Math.floor(total / this.speedListCache[type].length)\n }\n\n afterCreate () {\n const { openSpeed, addSpeedTypeList } = this.config\n if (addSpeedTypeList?.length > 0) {\n SPEED_TYPE.push(...addSpeedTypeList)\n }\n this.initSpeedList()\n this.on('real_time_speed', this._onRealSpeedChange)\n /**\n * @type {null || number }\n */\n this.timer = null\n this.cnt = 0\n this.xhr = null\n if (!openSpeed) {\n return\n }\n this.on([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n }\n startTimer = () => {\n if (Util.isMSE(this.player.video)) {\n return\n }\n this.initSpeedList()\n this.cnt = 0\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n\n initSpeedList = () => {\n this.speedListCache = {}\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache[type] = []\n })\n }\n\n _onRealSpeedChange = (data) => {\n data.speed && this.appendList(data.speed, data.type || DEFAULT_SPEED_TYPE)\n }\n\n testSpeed = () => {\n clearTimeout(this.timer)\n this.timer = null\n if (!this.player || !this.config.openSpeed) return\n const { url, loadSize, testCnt, testTimeStep } = this.config\n const testSpeedUrl = url + (url.indexOf('?') < 0 ? '?testst=' : '&testst=') + Date.now()\n if (this.cnt >= testCnt) {\n return\n }\n this.cnt++\n try {\n const start = new Date().getTime()\n let end = null\n const xhr = new XMLHttpRequest()\n this.xhr = xhr\n xhr.open('GET', testSpeedUrl)\n const headers = {}\n const random = Math.floor(Math.random() * 10)\n headers.Range = 'bytes=' + random + '-' + (loadSize + random)\n if (headers) {\n Object.keys(headers).forEach(k => {\n xhr.setRequestHeader(k, headers[k])\n })\n }\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4) {\n this.xhr = null\n end = new Date().getTime()\n const size = xhr.getResponseHeader('Content-Length') / 1024 * 8\n const speed = Math.round(size * 1000 / (end - start))\n this.appendList(speed)\n this.timer = setTimeout(this.testSpeed, testTimeStep)\n }\n }\n xhr.send()\n } catch (e) {\n console.error(e)\n }\n }\n\n appendList = (speed, type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return\n const { saveSpeedMax } = this.config\n if (this.speedListCache[type].length >= saveSpeedMax) {\n this.speedListCache[type].shift()\n }\n this.speedListCache[type].push(speed)\n const { player } = this\n if (player) {\n type === DEFAULT_SPEED_TYPE ? (player.realTimeSpeed = speed) : (player[this.getSpeedName('realTime', type)] = speed)\n }\n this.updateSpeed(type)\n }\n\n getSpeedName (namePrefix, type){\n return namePrefix + 'Speed' + type.toUpperCase()\n }\n\n updateSpeed = (type = DEFAULT_SPEED_TYPE) => {\n const speed = this.getSpeed(type)\n const { player } = this\n if (player) {\n if (type === DEFAULT_SPEED_TYPE) {\n if ((!player.avgSpeed || speed !== player.avgSpeed)) {\n player.avgSpeed = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n } else {\n const speedName = this.getSpeedName('avg', type)\n if (!player[speedName] || speed !== player[speedName]) {\n player[speedName] = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n }\n }\n }\n\n set openSpeed (value) {\n this.config.openSpeed = value\n if (!value && this.timer) {\n clearTimeout(this.timer)\n this.timer = null\n return\n }\n if (this.config.openSpeed) {\n if (this.timer) return\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n }\n\n get openSpeed () {\n return this.config.openSpeed\n }\n\n destroy () {\n this.off('real_time_speed', this._onRealSpeedChange)\n this.off([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache && this.speedListCache[type] && (this.speedListCache[type] = [])\n })\n this.speedListCache && (this.speedListCache = {})\n clearTimeout(this.timer)\n this.timer = null\n if (this.xhr && this.xhr.readyState !== 4) {\n this.xhr.cancel && this.xhr.cancel()\n this.xhr = null\n }\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\n/**\n * @typedef { {\n * tick?: number,\n * stuckCount?: number,\n * disable?: boolean,\n * reportFrame?: number\n * } } IFullscreenConfig\n */\nexport default class FpsDetect extends BasePlugin {\n static get pluginName () {\n return 'FpsDetect'\n }\n\n static get defaultConfig () {\n return {\n disabled: false,\n tick: 1000, // tick时间,默认1000 ms\n stuckCount: 3, // 卡住次数\n reportFrame: 0 // 每次解码帧率小于多少时统计\n }\n }\n\n afterCreate () {\n const { player, config } = this\n const media = player.media || player.video\n this.timer = null\n this._lastDecodedFrames = 0\n this._currentStuckCount = 0\n this._lastCheckPoint = null\n this._payload = []\n if (config.disabled) return\n const getVideoPlaybackQuality = media.getVideoPlaybackQuality\n if (!getVideoPlaybackQuality) return\n this.on(Events.PLAY, () => {\n this._startTick()\n })\n\n this.on(Events.PAUSE, () => {\n this._stopTick()\n })\n\n this.on(Events.ENDED, () => {\n this._stopTick()\n })\n\n this.on(Events.EMPTIED, () => {\n this._stopTick()\n })\n }\n\n _startTick () {\n this._stopTick()\n this._timer = setTimeout(() => {\n this._checkDecodeFPS()\n this._startTick()\n }, this.config.tick)\n }\n\n _stopTick () {\n clearTimeout(this._timer)\n this._timer = null\n }\n\n _checkBuffer (curTime, buffered) {\n let enoughBuffer = false\n const buffers = []\n for (let i = 0; i < buffered.length; i++) {\n const start = buffered.start(i)\n const end = buffered.end(i)\n buffers.push({ start, end })\n if (start <= curTime && curTime <= end - 1) {\n enoughBuffer = true\n break\n }\n }\n return {\n enoughBuffer,\n buffers\n }\n }\n\n _checkStuck (curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval) {\n const media = this.player.media || this.player.video\n const hidden = document.hidden\n const { paused, readyState, currentTime, buffered } = media\n\n if (hidden || paused || readyState < 4) {\n return\n }\n const { enoughBuffer, buffers } = this._checkBuffer(currentTime, buffered)\n if (!enoughBuffer) {\n return\n }\n\n if (curDecodedFrames <= this.config.reportFrame) {\n this._currentStuckCount++\n this._payload.push({ currentTime, buffers, curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval })\n\n if (this._currentStuckCount >= this.config.stuckCount) {\n this.emit(Events.FPS_STUCK, this._payload)\n this._reset()\n }\n } else {\n this._reset()\n }\n }\n\n _reset () {\n this._payload = []\n this._currentStuckCount = 0\n }\n\n _checkDecodeFPS () {\n const media = this.player.media || this.player.video\n if (!media) {\n return\n }\n const { totalVideoFrames, droppedVideoFrames } = media.getVideoPlaybackQuality()\n\n const currTime = performance.now()\n if (totalVideoFrames) {\n if (this._lastCheckPoint) {\n const curDecoded = totalVideoFrames - this._lastDecodedFrames\n const checkInterval = currTime - this._lastCheckPoint\n this._checkStuck(curDecoded, totalVideoFrames, droppedVideoFrames, checkInterval)\n }\n }\n this._lastDecodedFrames = totalVideoFrames\n this._lastCheckPoint = currTime\n }\n\n destroy () {\n this._stopTick()\n }\n}\n","import sniffer from '../utils/sniffer'\n// import Danmu from '../plugins/danmu'\nimport Xglogger from '../plugins/logger'\nimport Replay from '../plugins/replay'\nimport Poster from '../plugins/poster'\nimport Start from '../plugins/start'\nimport Enter from '../plugins/enter'\nimport Miniscreen from '../plugins/miniScreen'\nimport PC from '../plugins/pc'\nimport Mobile from '../plugins/mobile'\nimport Keyboard from '../plugins/keyboard'\nimport Loading from '../plugins/loading'\nimport Progress from '../plugins/progress'\nimport PlayIcon from '../plugins/play'\nimport FullScreen from '../plugins/fullscreen'\nimport TimeIcon from '../plugins/time'\nimport TimeSegments from '../plugins/time/timesegments'\nimport Volume from '../plugins/volume'\nimport RotateIcon from '../plugins/rotate'\nimport PIPIcon from '../plugins/pip'\nimport PlayNextIcon from '../plugins/playNext'\nimport DownLoadIcon from '../plugins/download'\nimport ScreenShotIcon from '../plugins/screenShot'\nimport DefinitionIcon from '../plugins/definition'\nimport PlaybackRateIcon from '../plugins/playbackRate'\nimport CssFullScreen from '../plugins/cssFullScreen'\nimport Error from '../plugins/error'\nimport Prompt from '../plugins/prompt'\nimport ProgressPreview from '../plugins/progressPreview'\nimport Thumbnail from '../plugins/common/thumbnail'\nimport MiniProgress from '../plugins/progress/miniProgress'\nimport DynamicBg from '../plugins/dynamicBg'\nimport ZH from '../lang/zh-cn'\nimport Stats from '../plugins/stats'\nimport GapJump from '../plugins/gapJump'\nimport WaitingTimeoutJump from '../plugins/waitingTimeoutJump'\nimport TestSpeed from '../plugins/testspeed'\nimport I18N from '../lang/i18n'\nimport FpsDetect from '../plugins/fpsDetect'\n// import Heatmap from '../plugins/heatmap'\n\nI18N.use(ZH)\n\nexport default class DefaultPreset {\n constructor (options, playerConfig) {\n const simulateMode = playerConfig && playerConfig.isMobileSimulateMode === 'mobile'\n const { isLive } = playerConfig\n const vodPlugins = isLive ? [] : [TimeSegments, Progress, MiniProgress, ProgressPreview, TimeIcon]\n\n const contolsIcons = [...vodPlugins, PlayIcon, FullScreen,\n RotateIcon, PlayNextIcon, DefinitionIcon, PlaybackRateIcon, DownLoadIcon, ScreenShotIcon, Volume, PIPIcon]\n\n const layers = [Replay, Poster, Start, Loading, Enter, Error, Prompt, Thumbnail, Miniscreen]\n\n this.plugins = [Stats, Xglogger, ...contolsIcons, ...layers, GapJump, WaitingTimeoutJump]\n const mode = simulateMode ? 'mobile' : sniffer.device\n switch (mode) {\n case 'pc':\n this.plugins.push(...[Keyboard, PC, CssFullScreen, TestSpeed, FpsDetect])\n break\n case 'mobile':\n this.plugins.push(...[Mobile])\n break\n default:\n this.plugins.push(...[Keyboard, PC, CssFullScreen])\n }\n if (sniffer.os.isIpad || mode === 'pc') {\n this.plugins.push(DynamicBg)\n }\n if (sniffer.os.isIpad) {\n this.plugins.push(PC)\n }\n this.ignores = []\n this.i18n = []\n }\n}\n","export default {\n LANG: 'zh-cn',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: '视频下载错误'\n },\n mse: {\n code: 2,\n msg: '流追加错误'\n },\n parse: {\n code: 3,\n msg: '解析错误'\n },\n format: {\n code: 4,\n msg: '格式错误'\n },\n decoder: {\n code: 5,\n msg: '解码错误'\n },\n runtime: {\n code: 6,\n msg: '语法错误'\n },\n timeout: {\n code: 7,\n msg: '播放超时'\n },\n other: {\n code: 8,\n msg: '其他错误'\n }\n },\n HAVE_NOTHING: '没有关于音频/视频是否就绪的信息',\n HAVE_METADATA: '音频/视频的元数据已就绪',\n HAVE_CURRENT_DATA: '关于当前播放位置的数据是可用的,但没有足够的数据来播放下一帧/毫秒',\n HAVE_FUTURE_DATA: '当前及至少下一帧的数据是可用的',\n HAVE_ENOUGH_DATA: '可用数据足以开始播放',\n NETWORK_EMPTY: '音频/视频尚未初始化',\n NETWORK_IDLE: '音频/视频是活动的且已选取资源,但并未使用网络',\n NETWORK_LOADING: '浏览器正在下载数据',\n NETWORK_NO_SOURCE: '未找到音频/视频来源',\n MEDIA_ERR_ABORTED: '取回过程被用户中止',\n MEDIA_ERR_NETWORK: '网络错误',\n MEDIA_ERR_DECODE: '解码错误',\n MEDIA_ERR_SRC_NOT_SUPPORTED: '不支持的音频/视频格式',\n REPLAY: '重播',\n ERROR: '网络连接似乎出现了问题',\n PLAY_TIPS: '播放',\n PAUSE_TIPS: '暂停',\n PLAYNEXT_TIPS: '下一集',\n DOWNLOAD_TIPS: '下载',\n ROTATE_TIPS: '旋转',\n RELOAD_TIPS: '重新载入',\n FULLSCREEN_TIPS: '进入全屏',\n EXITFULLSCREEN_TIPS: '退出全屏',\n CSSFULLSCREEN_TIPS: '进入样式全屏',\n EXITCSSFULLSCREEN_TIPS: '退出样式全屏',\n TEXTTRACK: '字幕',\n PIP: '画中画',\n SCREENSHOT: '截图',\n LIVE: '正在直播',\n OFF: '关闭',\n OPEN: '开启',\n MINI_DRAG: '点击按住可拖动视频',\n MINISCREEN: '小屏幕',\n REFRESH_TIPS: '请试试',\n REFRESH: '刷新',\n FORWARD: '快进中',\n LIVE_TIP: '直播'\n }\n}\n","import Errors from './error'\nimport * as Events from './events'\nimport './index.scss'\nimport { InstManager } from './instManager'\nimport I18N from './lang/i18n'\nimport Player from './player'\nimport BasePlugin from './plugin/basePlugin'\nimport Plugin from './plugin/plugin'\nimport { default as CssFullscreenIcon } from './plugins/cssFullScreen'\nimport { default as FullscreenIcon } from './plugins/fullscreen'\nimport { default as PlayIcon } from './plugins/play'\nimport { default as Progress } from './plugins/progress'\nimport { default as TimeIcon } from './plugins/time'\nimport { default as VolumeIcon } from './plugins/volume'\nimport defaultPreset from './presets/default'\nimport STATE_CLASS from './stateClassMap'\nimport Sniffer from './utils/sniffer'\nimport Util from './utils/util'\n\nclass PresetPlayer extends Player {\n static defaultPreset = defaultPreset;\n static Util = Util;\n static Sniffer = Sniffer\n static Errors = Errors\n static Events = Events\n static Plugin = Plugin\n static BasePlugin = BasePlugin\n static I18N = I18N\n static STATE_CLASS = STATE_CLASS\n static InstManager = InstManager\n\n // UI Exports\n static PlayIcon = PlayIcon // For Ads Plugin\n static TimeIcon = TimeIcon // For Ads Plugin\n static Progress = Progress // For Ads Plugin\n static FullscreenIcon = FullscreenIcon // For Ads Plugin\n static CssFullscreenIcon = CssFullscreenIcon // For Ads Plugin\n static VolumeIcon = VolumeIcon // For Ads Plugin\n}\n\nexport default PresetPlayer\n"],"names":["version","XG_DEBUG_OPEN","window","location","href","indexOf","STYLE","info","error","warn","XGTAG","XG_DEBUG","config","debug","logInfo","message","_console","_len","arguments","length","optionalParams","Array","_key","this","console","log","apply","concat","logWarn","_console2","_len2","_key2","logError","_console3","_fun","_len3","_key3","XgplayerTimeRange","bufferedList","_classCallCheck","_createClass","key","value","index","start","end","get","util","checkIsIn","list","i","len","isObject","type","_typeof","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","useRAF","requestAnimationFrame","TypeError","invokeFunc","time","args","thisArg","undefined","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","Object","keys","forEach","item","setAttribute","createDomFromHtml","html","classname","doc","children","addClass","err","hasClass","prototype","some","call","classList","e","orgClassName","getAttribute","match","RegExp","replace","split","add","removeClass","remove","reg","toggleClass","classNames","_arguments","_loop","typeOf","push","map","join","findDom","sel","querySelector","getElementById","slice","getCss","currentStyle","defaultView","getComputedStyle","padStart","str","pad","charstr","String","maxlen","ceil","chars","r","substring","format","isNaN","round","hour","floor","minute","second","event","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","name","setInterval","context","eventName","intervalFunc","frequency","_interval","bind","clearInterval","fun","_timers","splice","clearAllTimers","_timerIds","createImgBtn","imgUrl","width","height","w","h","unit","btn","style","every","parseFloat","trim","backgroundSize","margin","Hex2RGBA","hex","alpha","rgb","test","sixHex","kw","parseInt","getFullScreenEl","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","checkIsFunction","checkIsObject","hide","display","show","isUndefined","val","isNotNull","setStyleFromCsstext","text","arr","filterStyleFromText","_cssText","cssText","styleArr","ret","remain","getStyleFromCsstext","preloadImg","onload","onerror","img","Image","stopPropagation","scrollTop","pageYOffset","documentElement","body","scrollLeft","pageXOffset","checkTouchSupport","getBuffered2","vbuffered","maxHoleDuration","buffered","sort","b","diff","buffered2","buf2len","buf2end","getEventPos","zoom","x","y","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","getHostFromUrl","results","domain","frameId","mozCancelAnimationFrame","cancelRequestAnimationFrame","isMSE","video","media","HTMLMediaElement","currentSrc","isBlob","generateSessionId","did","d","getTime","performance","uuid","c","random","createEvent","Event","initEvent","adjustTimeByDuration","duration","isEnded","createPositionBar","root","appendChild","getTransformStyle","pos","scale","rotate","transformValue","styles","translate","stylesKeys","fn","lastIndex","convertDeg","abs","getIndexByTime","segments","_index","getOffsetCurrentTime","currentTime","_segments$_index","cTime","offset","getCurrentTimeByOffset","offsetTime","ERROR_TYPE_MAP","ERROR_MAP","Errors","player","errorInfo","errorType","errorCode","errorMessage","originError","ext","mediaError","ERROR_TYPES","i18n","ended","_player$media","readyState","networkState","_errc","code","playerVersion","stack","host","Util","ex","msg","PLAY","PLAYING","ENDED","PAUSE","ERROR","SEEKING","SEEKED","TIME_UPDATE","WAITING","CANPLAY","DURATION_CHANGE","VOLUME_CHANGE","LOADED_DATA","RATE_CHANGE","PROGRESS","LOAD_START","EMPTIED","PLAYER_FOCUS","PLAYER_BLUR","READY","URL_NULL","AUTOPLAY_STARTED","AUTOPLAY_PREVENTED","COMPLETE","REPLAY","DESTROY","URL_CHANGE","DOWNLOAD_SPEED_CHANGE","LEAVE_PLAYER","ENTER_PLAYER","LOADING","FULLSCREEN_CHANGE","CSS_FULLSCREEN_CHANGE","MINI_STATE_CHANGE","DEFINITION_CHANGE","AFTER_DEFINITION_CHANGE","VIDEO_RESIZE","PIP_CHANGE","ROTATE","SCREEN_SHOT","PLAYNEXT","SHORTCUT","XGLOG","USER_ACTION","RESET","SOURCE_ERROR","SOURCE_SUCCESS","VIDEO_EVENTS","STATS_EVENTS","STATS_INFO","STATS_DOWNLOAD","STATS_RESET","FPS_STUCK","has","hasOwnProperty","prefix","Events","EE","once","addListener","emitter","listener","evt","_events","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","names","events","getOwnPropertySymbols","listeners","handlers","l","ee","listenerCount","emit","a1","a2","a3","a4","a5","removeListener","j","on","removeAllListeners","off","prefixed","module","exports","store","instance","InstManager","_EventEmitter","_inherits","_super","_createSuper","playerId","setActive","isUserActive","endEarly","_iterate","flag","isActive","inst","isInstNext","isNext","XGI18nLang","lang","langKeys","textKeys","_s","_t","updateKeys","en","use","langData","i18nLangs","_clang","LANG","texts","TEXT","network","mse","parse","decoder","runtime","timeout","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","init","_ret$langKeys","pId","VERSION_REG","H264_MIMETYPES","sniffer","device","os","isPc","browser","navigator","ua","userAgent","toLowerCase","ie","firefox","chrome","opera","safari","filter","isWindowsPhone","isSymbian","isTizen","isWebOS","isAndroid","isFireFox","isIpad","platform","maxTouchPoints","isTablet","isPhone","isIos","osVersion","_match","exec","isWeixin","toLocaleLowerCase","isSupportMP4","isSupport","mime","supportResult","canPlayType","isMSESupport","MediaSource","isTypeSupported","_logger","isHevcSupported","probeConfigSupported","defaults","supported","smooth","powerEfficient","Promise","resolve","mediaCapabilities","decodingInfo","videoConfig","audioConfig","audio","videoSupported","contentType","audioSupported","emitVideoEvent","eventKey","errorHandler","getVideoEventHandler","_err","eData","originalEvent","detail","timeStamp","paused","isInternalOp","_internalOp","muted","volume","vtype","removeInnerOP","_currentTime","_rate","playbackRate","_duration","isMutedChange","_lastMuted","mediaEventMiddleware","MediaProxy","_this","_hasStart","mediaConfig","assign","controls","autoplay","playsinline","x5VideoPlayerFullscreen","x5VideoOrientation","airplay","tabindex","mediaType","videoAttributes","playerType","x5VideoPlayerType","Sniffer","loop","autoplayMuted","mediaEl","defaultPlaybackRate","attachVideoEvents","middlewares","_this2","_this3","_this4","_evHandlers","funName","charAt","toUpperCase","_defineProperty","addEventListener","_this5","removeEventListener","urls","_this6","removeAttribute","load","_c","_videoSourceCount","_videoSourceIndex","_vLoadeddata","_eHandler","_sourceError","_dIndex","removeChild","_e","srcObject","k","pause","detachVideoEvents","set","play","range","isTrue","_buffered","crossOrigin","defaultMuted","rate","Infinity","played","preload","seekable","seeking","onWaiting","_detachSourceEvents","_attachSourceEvents","vol","videoWidth","videoHeight","data","_get2","_get","_getPrototypeOf","_get3","_get4","_get5","_len4","_key4","INDEXDB","mydb","db","ojstore","keypath","indexedDB","webkitindexedDB","IDBKeyRange","webkitIDBKeyRange","myDB","self","request","open","onsuccess","onupgradeneeded","transaction","objectStoreNames","contains","createObjectStore","keyPath","deleteDatabase","close","storename","objectStore","put","delete","clear","FULLSCREEN_EVENTS","GET_FULLSCREEN_API","EXIT_FULLSCREEN_API","PLATER_ID","callHandler","handler","next","then","hook","hookName","preset","pre","__hooks","_preset$pre","pluginName","preRet","runHooks","isContinue","catch","findHookIndex","isArray","hookHandlers","useHooks","removeHooks","hooks","usePluginHooks","plugins","plugin","removePluginHooks","hooksDescriptor","presetHooks","defineProperty","delHooksDescriptor","_len5","_key5","runHooksRecursive","_len6","_key6","showErrorMsg","BasePlugin","beforeCreate","__args","__events","__onceEvents","playerConfig","__init","constructor","logger","i18nKeys","domEventType","_this$player","res","action","params","nParams","_objectSpread","emitUserAction","registerPlugin","getPlugin","offAll","destroy","unRegisterPlugin","Obj","configurable","Element","matches","proto","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","closest","element","selector","parentNode","_delegate","useCapture","listenerFn","delegateTarget","delegate_1","elements","querySelectorAll","ROOT_TYPES","CONTROLS","ROOT","POSITIONS","ROOT_LEFT","ROOT_RIGHT","ROOT_TOP","CONTROLS_LEFT","CONTROLS_RIGTH","CONTROLS_RIGHT","CONTROLS_CENTER","PLUGIN_STATE_CLASS","isUrl","createIcon","icon","attr","newIcon","tag","registerIconsObj","iconsConfig","_icons","icons","orgIcon","class","mergeIconClass","mergeIconAttr","Plugin","_BasePlugin","__delegates","_parent","_el","parent","registerIcons","langText","textConfig","defaultTexConfig","registerLanguageTexts","renderStr","render","Error","insert","setAttr","setStyle","__registerChildren","_children","_plugin","checkChildren","langKey","langTextShow","disable","find","qs","eventType","bindEL","delegate","unbindEL","htmlStr","eventHandle","isBubble","getPropertyValue","pdom","child","_this7","insertIdx","Number","isDomElement","coordinate","mode","curIdx","insertBefore","insertAdjacentHTML","capture","dels","ResizeObserver","entries","t","__runHandler","__handlers","observer","throttle","__trigger","observe","_pid","_this$observer","unobserve","_this$observer2","disconnect","resizeObserver","pluginsManager","pluginGroup","cgid","_pluginInfoId","closeResizeObserver","resize","addObserver","_originalOptions","_plugins","formatPluginInfo","PLUFGIN","checkPluginIfExits","getRootByConfig","_pConfig","position","lazyRegister","lazyPlugin","race","loader","__esModule","default","register","reject","originalOptions","isSupported","codecType","defaultConfig","unRegister","_instance","afterCreate","__destroy","deletePlugin","getPlugins","findPlugin","cName","beforeInit","retPromise","prevTask","_loadingPlugins","all","pluginsRet","pName","beforePlayerInit","afterInit","afterPlayerInit","setLang","updateLang","reRender","_pList","onPluginsReady","unObserver","_resizeObserver","_i","_Object$keys","STATE_CLASS","DEFAULT","DEFAULT_SKIN","ENTER","PAUSED","NO_START","ACTIVE","INACTIVE","FULLSCREEN","CSS_FULLSCREEN","ROTATE_FULLSCREEN","PARENT_ROTATE_FULLSCREEN","PARENT_FULLSCREEN","INNER_FULLSCREEN","NO_CONTROLS","FLEX_CONTROLS","CONTROLS_FOLLOW","CONTROLS_AUTOHIDE","TOP_BAR_AUTOHIDE","NOT_ALLOW_AUTOPLAY","PC","MOBILE","MINI","getDefaultConfig","nullUrlStart","fluid","fitVideoSize","videoFillMode","isLive","videoInit","poster","isMobileSimulateMode","execBeforePluginsCall","allowSeekAfterEnded","enableContextmenu","closeVideoClick","closeVideoDblclick","closePlayerBlur","closeDelayBlur","leavePlayerTime","closePlayVideoFocus","closePauseVideoFocus","closeFocusVideoFocus","closeControlsBlur","topBarAutoHide","startTime","seekedStatus","miniprogress","disableSwipeHandler","enableSwipeHandler","preProcessUrl","ignores","whitelist","inactive","language","marginControls","fullscreenTarget","screenShot","pip","download","mini","cssFullscreen","keyShortcut","presets","definition","customDuration","timeOffset","thumbnail","isHideTips","minWaitDelay","commonStyle","progressColor","playedColor","cachedColor","sliderBtnStyle","volumeColor","STATES","STATE_ARRAY","Controls","_Plugin","_assertThisInitialized","_assertThisInitialize","focus","autoHide","_this$config","left","center","right","innerRoot","isMini","onMouseEnter","onMouseLeave","blur","ignorePaused","unbind","_this$config2","initShow","PlAYER_HOOKS","REAL_TIME_SPEED","AVG_SPEED","instManager","Player","_MediaProxy","__startTime","_seekToStartTime","_useAutoplay","mediaPlay","canPlayFunc","isFullScreen","delayResize","fullEl","_fullActionFrom","props","prop","from","to","isVideo","checkIsCurrentVideo","pid","_fullscreenEl","fullscreen","changeFullStyle","_fullScreenOffset","cssfullscreen","exitCssFullscreen","needFullscreenScroll","scrollTo","top","recoverFullStyle","onFullscreenChange","defaultPreset","defaultIdx","userTimer","waitTimer","handleSource","_state","isAd","isError","isSeeking","isCanplay","rotateDeg","isRotateFullscreen","timeSegments","_cssfullscreenEl","curDefinition","_orgCss","_videoHeight","_videoWidth","videoPos","pi","vy","vx","sizeInfo","_accPlayed","acc","loopAcc","_offsetInfo","innerContainer","topBar","__i18n","database","Database","_onceSeekCanplay","_isPauseBeforeSeek","innerStates","isActiveLocked","_initDOM","_possibleConstructorReturn","_this$config2$definit","defaultDefinitionObj","defaultDefinition","_bindEvents","_registerPresets","_registerPlugins","getInitDefinition","setState","onReady","hasStart","state","_instManager","vid","line","handle","p","checkPlayerRoot","_initBaseDoms","_root","_this$config3","_width","_height","_this$root$getBoundin","getBoundingClientRect","leftBar","rightBar","_onWebkitbeginfullscreen","_onWebkitendfullscreen","playFunc","mousemoveFunc","firstChild","isInit","ignoresStr","cuPlugins","lazy","loadingPlugin","forceBeforeInit","Preset","_player$config$plugin","_player$config$ignore","_presetInst","_presetInst$plugins","_presetInst$ignores","_presetInst$icons","_presetInst$i18n","_ci18n","usePreset","_retPlugin","_this$controls","_getRootByPosition","removedFromConfig","deregister","removePluginFromConfig","_this8","_furl","_startInit","fileName","lineNumber","_this9","_src","curTime","isPaused","_error","_canplay","_this10","playPromise","onError","_errorTimer","_this11","_this12","status","_this13","_this$config4","isSeekedPlay","_status","_this14","_this$config5","_this15","bitrate","switchURL","seamless","reloadFunc","_this16","clsList","mediaPause","cls","_this17","unregisterPlugins","isResetConfig","resetState","pn","de","_instManager2","_this18","updateAcc","_unbindEvents","exitFullscreen","remainMediaAfterDestroy","cList","_this19","onPlay","_this20","cur","_srcRet","rootClass","pClassName","_orgPCss","webkitRequestFullscreen","ALLOW_KEYBOARD_INPUT","fullscreenEnabled","webkitSupportsFullscreen","webkitEnterFullscreen","exitRotateFullscreen","webkitExitFullScreen","_class","_this$config$fullscre","useCssFullscreen","_this$config$fullscre2","setRotateDeg","_rootStyle","innerHeight","deg","orientation","delay","onFocus","_clearUserTimer","onBlur","_this21","isLock","_ref","_ref$ignorePaused","_this22","_this23","_this24","endType","_at","startDiff","endDiff","_ref2","_ref2$startDiff","_ref2$endDiff","_this25","_this$videoPos","_pi","_pos","offsetWidth","offsetHeight","rHeight","rWidth","maxWidth","maxHeight","formStyle","transform","webkitTransform","resizePosition","_this26","setConfig","_this27","_this28","containerSize","_this$media","_this$config6","controlsHeight","videoFit","fit","_style","paddingTop","videoScale","vWidth","vHeight","cWidth","cHeight","updateObjectPosition","objectPosition","newState","_this$config7","preProcessUrlOptions","processUrlOptions","bool","_this29","curDef","targetDef","_this29$curDefinition","changeDefinition","total","dropped","corrupted","droppedRate","droppedDuration","getVideoPlaybackQuality","_quality","droppedVideoFrames","totalVideoFrames","corruptedVideoFrames","cumulateTime","_l","__url","posterUrl","update","_this$_accPlayed","isMuted","_instManager3","addInnerOP","Boolean","_instManager4","getActiveId","_instManager5","descriptor","xgIconTips","textKey","isShow","getInstance","Icon","_onMouseenter","_onMouseLeave","CssFullScreen","_IconPlugin","initIcons","isCssfullScreen","animate","btnClick","handleCssFullscreen","preventDefault","contentIcon","getCssFullscreen","switchTips","tipDom","changeLangTextKey","CssFullSceenSvg","ExitCssFullSceenSvg","IconPlugin","TopBackIcon","onClick","screenBack","BackSVG","Fullscreen","rotateFullscreen","getFullscreen","handleFullscreen","toggleFullScreen","tipsDom","needBackIcon","topBackIcon","_onOrientationChange","FullScreenSvg","ExitFullScreenSvg","getRotateFullscreen","switchCallback","useScreenOrientation","unlockScreen","aspectRatio","lockScreen","lockOrientationType","screen","lock","unlock","Play","replay","listenEvents","PlaySvg","PauseSvg","TPL","styleKey","InnerList","fragments","percent","_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","moving","miniMoveStep","computeTime","triggerCallbacks","_updateInnerFocus","isLocked","updateWidth","seekTime","_assertThisInitialize3","forward","isDown","isPauseMoving","_assertThisInitialize4","closeMoveSeek","isPlaying","onMoveStart","prePlayTime","isProgressMoving","progressBtn","_mouseDownHandlerHook","onMouseMove","onMouseUp","onMoveOnly","_assertThisInitialize5","onMoveEnd","_mouseUpHandlerHook","isEnter","resetSeekState","_assertThisInitialize6","miniStartStep","_mouseMoveHandlerHook","_assertThisInitialize7","_this$pos","useable","__dragCallBacks","direc","_disableBlur","isDragingSeek","isDraggingSeek","offsetDuration","offsetCurrentTime","innerList","reset","outer","updateFocus","_initInner","isMobile","bindDomEvents","initCustomStyle","onTimeupdate","onCacheUpdate","onReset","onVideoResize","frags","boxShadow","_mouseDownHandler","_mouseUpHandler","_mouseMoveHandler","onMouseDown","onMouseOver","onMouseOut","onBodyClick","pauseAutoHide","recoverAutoHide","isCloseClickSeek","realTime","endedDiff","toFixed","updatePercent","updateTime","seek","rLeft","timeIcon","resetActive","notSeek","_end","bufferedPoint","thumbnailPlugin","controlsMode","Time","isActiving","_this$player2","constrolsMode","createCenterTime","durationDom","timeDom","onTimeUpdate","centerCurDom","centerDurDom","current","minWidthTime","timeStr","updateState","Volume","bar","barRect","barH","updateVolumePos","onBarMouseUp","_d","isStart","isMoving","unFocus","showValueLabel","updateVolumeValue","volumeSmall","volumeSmallSvg","volumeLarge","volumeLargeSvg","volumeMuted","volumeMutedSvg","_timerId","_this$playerConfig","backgroundColor","changeMutedHandler","changeMuted","_onMouseenterHandler","onMouseenter","_onMouseleaveHandler","onMouseleave","onBarMousedown","onBarMouseMove","onVolumeChange","drag","$labelValue","innerText","isForce","miniVolume","isShowVolumeValue","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","ReplaySvg","__handleReplay","path","Poster","isEndedShow","hideCanplay","_bg","fillMode","notHidden","getBgSize","AnimateMap","clearAnimation","Start","autoPlayStart","toggleTo","bindClickEvents","onAutoplayStart","onPlayerReset","clickHandler","switchPausePlay","cancelable","startPlay","startPause","isAnimate","endShow","_animateId","addAnimate","seconds","switchStatus","isShowPause","isShowEnd","endAnimate","disableAnimate","Enter","innerHtml","HTMLElement","barStr","logo","MiniScreenIcon","getMini","exitMini","getStyleSize","num","measurements","measurementsLength","getSize","elem","getStyle","size","innerWidth","outerWidth","outerHeight","getZeroSize","isBorderBox","boxSizing","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderWidth","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","getTouch","dentifier","identifier","EVENTS","POST_START_EVENTS","mousedown","touchstart","pointerdown","Draggabilly","isEnabled","isDragging","downPoint","dragPoint","startPos","_handlerDom","_bindStartEvent","_startKey","_boundPointerEvents","onUp","positionDrag","webKitTransform","dragStart","dragMove","dragEnd","touchIdentifier","pointerId","dragCancel","pointer","_getPosition","maxY","maxX","setLeftTop","_bindPostStartEvents","_unbindPostStartEvents","presetInfo","moveVector","hasDragStarted","dragRealStart","_this$startPos","_dragPointerMove","dragX","dragY","checkContain","_unbindStartEvent","axis","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","__canvas","closeVideoStopPropagation","_clickCount","clickTimer","switchPlayPause","initEvents","onVideoClick","onVideoDblClick","onContextmenu","returnValue","cancelBubble","TOUCHS","move","MOUSES","Touche","__setPress","onTouchEnd","onTouchCancel","onTouchMove","trigger","__clearPress","press","__setDb","diffx","diffy","miniStep","pressDelay","dbClickDelay","disablePress","disableDbClick","needPreventDefault","pressIntrvalId","dbIntrvalId","_initEvent","onTouchStart","__clearDb","touchend","touchmove","ACTIONS","MobilePlugin","touche","getTouche","disableGesture","timer","rect","_x","_y","scopeL","scopeR","scopeM1","scopeM","scopeM2","hideControlsActive","scope","checkScope","gestureY","gestureX","executeMove","endLastMove","resetPos","changeAction","checkIsRootTarget","light","seekTipIcon","SeekTipIcon","closedbClick","xgMask","registerThumbnail","onRootTouchMove","onRootTouchEnd","moveDuration","_this2$pos","eventsMap","pressend","click","doubleclick","disableActive","progressPlugin","progress","addCallBack","activeSeekNote","usable","createThumbnail","timePreview","timePreviewStyle","curTimeColor","durationColor","previewDom","curColor","durColor","color","disableTimeProgress","startPlugin","recover","mold","updateBrightness","updateVolume","lastScope","hideControlsEnd","sendUseAction","focusVideoClick","dbClickHandler","pressRate","isTouchingSeek","darkness","maxDarkness","isForward","focusHide","updateThumbnails","gradient","disableSeekIcon","miniYPer","isDisableTag","isContentEditable","Keyboard","keyCode","_keyState","disableBodyTrigger","isIgnoreUserActive","checkIsVisible","metaKey","altKey","ctrlKey","isBodyKeyDown","repeat","isKeyDown","isGlobalTrigger","checkCode","onBodyKeyUp","handleKeyDown","handleKeyUp","disableRootTrigger","onKeyup","extendkeyCodeMap","keyCodeMap","key1","seekStep","space","noBodyTarget","up","down","pressAction","esc","mergekeyCodeMap","isPress","tt","onKeydown","onBodyKeyDown","newConfig","checkVisible","rec","bottom","isBodyTarget","_time","_step","_seekTime","handleKeyCode","curKeyCode","_this$keyCodeMap$arr$","_action","Loading","loadingIcon","TimeSegmentsControls","updateSegments","_checkIfEnabled","changeIndex","curPos","lastCurrentTime","_this$curPos","_this$player3","getSeekTime","_this$player4","_onDurationChange","_onLoadedData","_onPlay","_segs","formatTimeSegments","_item","_segDuration","segDuration","last","_timeSegments$index","diff2","Rotate","onBtnClick","innerRotate","updateRotateDeg","rootWidth","clientWidth","rootHeight","clientHeight","clockwise","videoRotateDeg","_transform","_styles","transformOrigin","times","factor","RotateSvg","PresentationMode","isPIPAvailable","isPip","exitPIP","requestPIP","showIcon","pMode","initPipEvents","switchPIP","pipIcon","PipIcon","pipIconExit","PipIconExit","leavePIPCallback","pipWindow","enterPIPCallback","pictureInPictureWindow","onWebkitpresentationmodechanged","webkitPresentationMode","checkWebkitSetPresentationMode","pipWin","textContent","styleSheets","cssRules","rule","link","rel","head","preferDocument","isDocPIPAvailable","pipOptions","playerRect","documentPictureInPicture","requestWindow","docPiPNode","docPiPStyle","pipRoot","parentElement","previousSibling","nextSibling","copyStyleIntoPiPWindow","append","cssContent","webkitSetPresentationMode","requestPictureInPicture","reason","_documentPictureInPic","exitPictureInPicture","_documentPictureInPic2","pictureInPictureElement","pictureInPictureEnabled","disablePictureInPicture","webkitSupportsPresentationMode","protocol","PlayNextIcon","idx","urlList","nextHandler","playNext","Next","changeSrc","strFileName","strMimeType","blob","reader","defaultMime","mimeType","payload","anchor","myBlob","Blob","MozBlob","WebKitBlob","pop","ajax","XMLHttpRequest","responseType","response","send","msSaveBlob","dataUrlToBlob","saver","tempUiArr","Uint8Array","mx","charCodeAt","strUrl","parts","binData","atob","decodeURIComponent","uiArr","winMode","URL","revokeObjectURL","confirm","f","createObjectURL","btoa","encodeURIComponent","FileReader","readAsDataURL","Download","dUrl","newUrl","getAbsoluteURL","downloadUtil","_handler","DownloadSvg","div","ScreenShot","screenshotIcon","initSize","fitVideo","onClickBtn","filename","saveLink","MouseEvent","bubbles","view","initMouseEvent","dispatchEvent","canvas","canvasCtx","getContext","imageSmoothingEnabled","imageSmoothingQuality","shot","saveImg","saveScreenShot","option","quality","createCanvas","dx","dy","dw","dh","mediaRatio","canvasRatio","sw","sh","drawImage","toDataURL","OptionList","onItemClick","renderItemList","_delegates","attrKeys","selected","showText","changeCallback","curSelected","getAttrObj","LIST_TYPES","TOGGLE_MODES","IS_MOBILE","OptionsIcon","switchActiveState","toggleMode","toggle","listType","enterType","isIcons","curValue","hidePortrait","_resizeList","optionsList","activeEvent","onEnter","onLeave","onIconClick","_isIcons","focusAwhile","curItem","changeCurrentText","isItemClickHide","getTextByLang","itemList","_maxH","heightLimit","listStyle","DefinitionIcon","_OptionsIcon","changeDefinitionList","definitionList","items","showItem","PlaybackRate","curRate","itemInfo","_text","ErrorPlugin","errorRetry","handleError","retry","errorNote","Prompt","intervalId","customConfig","customOnClick","showPrompt","hidePrompt","interval","highlight","hideinterval","ISPOT","mergeISPOT","iSpot","APIS","_updateDotDom","dotDom","calcuPosition","initDots","_ispots","createDot","ispotsInit","isNew","template","positionDot","findDot","updateDot","needShow","dot","showDot","deleteDot","del","deleteAllDots","dotDoms","getElementsByTagName","updateAllDots","iSpots","ispot","positionDots","playerSize","_pop","pRect","rect1","_left","_diff","getAllDotsDom","getDotDom","CALLBACK_MAP","dragmove","dragstart","dragend","mouseover","ProgressPreview","isHideThumbnailHover","isDrag","_curDot","onDotMouseLeave","blurDot","enableBlur","focusDot","disableBlur","videoPreview","videothumbnail","handlerSpotClick","_event","transformTimeHook","setTimeContent","ispots","progressDot","initDotsAPI","extTextRoot","previewLine","timePoint","timeText","tipText","_hasThumnail","bindEvents","onMousemove","onMousedown","onMouseup","handlerPreviewClick","updatePosition","cwidth","isflex","lwidth","showTips","isFocusDots","defaultText","hideTips","updateTimeText","updateLinePos","thumbnailConfig","isShowThumbnail","tRoot","isShowCoverPreview","totalWidth","widthPerSeconds","_activeDotId","isDefault","removeCallBack","miniWidth","Thumbnail","ratio","_preloadMark","initThumbnail","_this2$config","pic_num","containerWidth","containerHeight","row","col","urlIndex","indexInPage","rowIndex","colIndex","swidth","sHeight","getUrlByIndex","backgroundPosition","customStyle","getPosition","getBgColor","MiniProgress","MODES","nowTime","isSupportCanvas","DynamicBg","_frameCount","startFrameCount","stop","renderOnTimeupdate","visibilityState","_checkIfCanStart","renderOnce","_isLoaded","startInterval","_sVideo","checkVideoIsSupport","videoPI","preTime","_loopType","dynamicBg","frameRate","rwidth","rheight","renderByPoster","onLoadedData","onVisibilitychange","canvasFilter","supportCanvasFilter","isInnerRender","webkitFilter","mask","addMask","background","maskBg","_p","_tVideo","HTMLVideoElement","flyVideo","_tagName","updateImg","_this$canvas$getBound","image","sourcePI","_this$canvas$getBound2","multiple","checkIsSupportCanvas","INFO","Stats","actionData","_getTime","_stats","stats","getStats","JSON","stringify","downloadUrl","disabled","timestamp","timeFormat","toISOString","_recordUserActions","_recordInfo","_downloadStats","profile","_infoProfile","_info","startMs","endMs","cat","dur","ph","tid","ts","_this$_stats","mediaElem","mediaInfo","raw","timestat","_getTimeStats","_getProfile","msgs","stat","traceEvents","GapJump","seekingEventReceived","hasPlayed","smallGapLimit","gapDetectionThreshold","_getIndex","jumpTo","jumpSize","isGapSmall","BROWSER_GAP_TOLERANCE","useGapJump","isSafari","end_type","video_postion","onGapJump","threshold","bufferedInfo","_getBuffered","WaitingTimeoutJump","jumpCnt","jumpCntMax","useWaitingTimeoutJump","onJump","waitingTime","DEFAULT_SPEED_TYPE","SPEED_TYPE","TestSpeed","speedListCache","initSpeedList","cnt","testSpeed","testTimeStep","speed","appendList","openSpeed","loadSize","testCnt","testSpeedUrl","xhr","headers","Range","setRequestHeader","onreadystatechange","getResponseHeader","saveSpeedMax","shift","realTimeSpeed","getSpeedName","updateSpeed","getSpeed","avgSpeed","speedName","addSpeedTypeList","_onRealSpeedChange","namePrefix","FpsDetect","_lastDecodedFrames","_currentStuckCount","_lastCheckPoint","_payload","_startTick","_stopTick","_timer","_checkDecodeFPS","tick","enoughBuffer","buffers","curDecodedFrames","checkInterval","hidden","_this$_checkBuffer","_checkBuffer","reportFrame","stuckCount","_reset","_media$getVideoPlayba","currTime","curDecoded","_checkStuck","DefaultPreset","_this$plugins","_this$plugins2","_this$plugins3","simulateMode","contolsIcons","TimeSegments","TimeIcon","FullScreen","RotateIcon","PlaybackRateIcon","DownLoadIcon","ScreenShotIcon","PIPIcon","layers","Miniscreen","Xglogger","Mobile","PresetPlayer","_Player","FullscreenIcon","CssFullscreenIcon","VolumeIcon"],"mappings":"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"}
|