mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-11 05:26:15 -08:00
- Created a new documentation file for the danmuku plugin with interactive code execution. - Added comprehensive i18n setup instructions, including default language settings, language imports, and examples for adding and modifying languages. - Introduced a test file to verify the integration of the danmuku plugin.
1 line
193 KiB
Plaintext
1 line
193 KiB
Plaintext
{"mappings":"C,A,S,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,E,I,E,A,a,O,W,W,A,a,O,K,K,A,a,O,O,O,A,a,O,O,O,C,E,E,A,Y,O,C,C,E,E,C,C,E,C,E,E,C,E,C,E,E,E,K,E,C,E,E,A,a,O,Q,A,Y,O,O,O,E,O,O,C,I,C,Q,S,E,C,C,C,E,G,C,C,C,E,C,C,G,C,C,C,E,C,C,G,C,C,E,C,O,C,C,E,C,I,E,A,Y,O,C,C,E,E,C,C,E,C,G,C,G,E,O,E,E,C,G,G,E,O,E,E,C,G,G,G,A,U,O,E,O,E,G,I,E,A,M,uB,E,I,O,E,I,C,mB,C,C,E,O,C,S,C,E,I,E,C,C,E,C,E,C,E,C,O,A,M,E,E,C,E,E,K,C,C,E,I,E,C,C,E,C,I,E,M,C,G,C,C,E,C,E,C,I,C,E,O,C,E,E,E,O,C,E,C,O,C,C,E,C,O,C,S,E,C,E,I,E,E,O,C,G,M,A,C,I,E,C,E,E,E,C,C,E,e,C,C,E,E,M,C,S,C,E,I,C,E,C,E,I,C,M,C,E,I,C,O,C,E,I,C,O,C,C,C,E,E,O,C,E,E,K,C,E,E,M,C,E,E,O,C,K,E,E,S,C,K,E,E,S,C,K,E,E,C,C,E,E,Q,C,S,C,C,C,E,C,C,E,C,C,S,C,C,C,E,E,O,C,C,E,C,E,A,E,O,c,C,E,O,C,I,W,O,C,C,E,A,C,G,C,C,E,C,E,I,I,E,E,E,E,M,C,I,E,C,C,E,E,G,E,C,I,E,E,E,A,C,U,O,S,A,a,O,O,O,O,C,E,A,Y,O,Q,O,G,E,O,W,O,C,E,C,E,C,Q,C,S,C,C,C,C,C,C,C,E,I,E,E,kD,E,iB,C,GCIwB,EAAA,MAAA,CAAA,EAAA,UAAA,IAAA,GAJxB,IAAA,EAAA,EAAA,a,E,E,c,C,GACA,EAAA,EAAA,a,E,E,c,C,GACA,EAAA,EAAA,a,E,E,c,C,GAEe,SAAS,EAAuB,CAAM,EACnD,OAAO,AAAC,IACN,IAAM,EAAU,GAAI,CAAA,EAAA,EAAA,OAAM,AAAN,EAAQ,EAAK,GAC3B,EAAU,GAAI,CAAA,EAAA,EAAA,OAAM,AAAN,EAAQ,EAAK,GAMjC,OAJI,EAAQ,MAAM,CAAC,OAAO,EACxB,AAAA,CAAA,EAAA,EAAA,OAAO,AAAP,EAAQ,EAAK,E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GAAU,EAC1E,EAAY,EAAK,CAAC,8BAA8B,EAAE,EAAA,CAAQ,EAC1D,IAAI,CAAC,MAAM,CAAC,EAAK,IAAI,CAAC,QAAQ,CAAC,QAAQ,EACvC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAG,EACvB,IAAI,CAAC,KAAK,EACZ,CACF,EAEI,AAAoB,aAApB,OAAO,SAA0B,CACnC,IAAM,EAAK,2BACP,EAAS,SAAS,cAAc,CAAC,GAChC,IAEH,AADA,CAAA,EAAS,SAAS,aAAa,CAAC,QAAhC,EACO,EAAE,CAAG,EACR,AAAwB,YAAxB,SAAS,UAAU,CACrB,SAAS,gBAAgB,CAAC,mBAAoB,KAC5C,SAAS,IAAI,CAAC,WAAW,CAAC,EAC5B,GAGC,AAAA,CAAA,SAAS,IAAI,EAAI,SAAS,eAAc,AAAd,EAAiB,WAAW,CAAC,IAG5D,EAAO,WAAW,CAAG,EAAA,OAAK,AAC5B,C,E,C,kC,Q,iC,Q,+B,Q,mC,Q,kC,Q,mC,Q,kC,Q,mC,Q,kC,Q,4B,Q,2B,Q,8B,Q,2B,Q,iD,O,E,C,Q,C,S,C,C,C,C,C,C,C,EC5vBA,EAAO,OAAO,CAAG,kU,E,C,E,C,M,C,S,C,C,C,C,C,C,C,ECAjB,EAAO,OAAO,CAAG,+Z,E,C,E,C,M,C,S,C,C,C,C,C,C,C,ECAjB,EAAO,OAAO,CAAG,omE,E,C,E,C,M,C,S,C,C,C,C,C,C,C,ECAjB,EAAO,OAAO,CAAG,onB,E,C,E,C,M,C,S,C,C,C,C,C,C,C,ECAjB,EAAO,OAAO,CAAG,sW,E,C,E,C,M,C,S,C,C,C,C,C,C,C,ECAjB,EAAO,OAAO,CAAG,kjB,E,C,E,C,Q,C,S,C,C,C,C,C,C,C,ECAjB,EAAO,OAAO,CAAG,iT,E,C,E,C,Q,C,S,C,C,C,C,C,C,C,ECAjB,EAAO,OAAO,CAAG,4hB,E,C,E,C,Q,C,S,C,C,C,C,C,C,C,ECAjB,EAAO,OAAO,CAAG,sT,E,C,E,C,Q,C,S,C,C,C,C,C,C,C,ECAjB,EAAO,OAAO,CAAG,+rD,E,C,E,C,Q,C,S,C,C,C,C,C,C,C,ECAjB,EAAO,OAAO,CAAG,y0D,E,C,E,C,M,C,S,C,C,C,C,C,C,C,ECAjB,EAAO,OAAO,CAAG,ib,E,C,E,C,M,C,S,C,C,C,C,C,C,C,ECAjB,EAAO,OAAO,CAAG,grQ,E,C,E,E,C,Q,C,Q,oB,C,G,G,C,Q,C,C,C,kB,gB,K,O","sources":["<anon>","packages/artplayer-plugin-danmuku/src/index.js","packages/artplayer-plugin-danmuku/src/danmuku.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-d75e4ef33e90ad74.js","packages/artplayer-plugin-danmuku/src/bilibili.js","node_modules/@parcel/transformer-js/src/esmodule-helpers.js","packages/artplayer-plugin-danmuku/src/heatmap.js","packages/artplayer-plugin-danmuku/src/setting.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-b1f4705e590c7693.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-75df9b67e4ad9f34.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-966493d38fa25693.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-e438774eb5592ca2.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-f628b445d36caf1f.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-df73f5e9e2ab004b.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-1de8ba84e2efbede.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-9ccdc626e87ba3ee.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-9a7360dad8cdbe5b.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-2eccf06bbefc75d0.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-3f382cbac81656d4.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-17da0f3cb542825d.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-d4507e9bfc00ded0.js"],"sourcesContent":["// modules are defined as an array\n// [ module function, map of requires ]\n//\n// map of requires is short require name -> numeric require\n//\n// anything defined in a previous bundle is accessed via the\n// orig method which is the require for previous bundles\n\n(function (\n modules,\n entry,\n mainEntry,\n parcelRequireName,\n externals,\n distDir,\n publicUrl,\n devServer\n) {\n /* eslint-disable no-undef */\n var globalObject =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n /* eslint-enable no-undef */\n\n // Save the require from previous bundle to this closure if any\n var previousRequire =\n typeof globalObject[parcelRequireName] === 'function' &&\n globalObject[parcelRequireName];\n\n var importMap = previousRequire.i || {};\n var cache = previousRequire.cache || {};\n // Do not use `require` to prevent Webpack from trying to bundle this call\n var nodeRequire =\n typeof module !== 'undefined' &&\n typeof module.require === 'function' &&\n module.require.bind(module);\n\n function newRequire(name, jumped) {\n if (!cache[name]) {\n if (!modules[name]) {\n if (externals[name]) {\n return externals[name];\n }\n // if we cannot find the module within our internal map or\n // cache jump to the current global require ie. the last bundle\n // that was added to the page.\n var currentRequire =\n typeof globalObject[parcelRequireName] === 'function' &&\n globalObject[parcelRequireName];\n if (!jumped && currentRequire) {\n return currentRequire(name, true);\n }\n\n // If there are other bundles on this page the require from the\n // previous one is saved to 'previousRequire'. Repeat this as\n // many times as there are bundles until the module is found or\n // we exhaust the require chain.\n if (previousRequire) {\n return previousRequire(name, true);\n }\n\n // Try the node require function if it exists.\n if (nodeRequire && typeof name === 'string') {\n return nodeRequire(name);\n }\n\n var err = new Error(\"Cannot find module '\" + name + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n }\n\n localRequire.resolve = resolve;\n localRequire.cache = {};\n\n var module = (cache[name] = new newRequire.Module(name));\n\n modules[name][0].call(\n module.exports,\n localRequire,\n module,\n module.exports,\n globalObject\n );\n }\n\n return cache[name].exports;\n\n function localRequire(x) {\n var res = localRequire.resolve(x);\n return res === false ? {} : newRequire(res);\n }\n\n function resolve(x) {\n var id = modules[name][1][x];\n return id != null ? id : x;\n }\n }\n\n function Module(moduleName) {\n this.id = moduleName;\n this.bundle = newRequire;\n this.require = nodeRequire;\n this.exports = {};\n }\n\n newRequire.isParcelRequire = true;\n newRequire.Module = Module;\n newRequire.modules = modules;\n newRequire.cache = cache;\n newRequire.parent = previousRequire;\n newRequire.distDir = distDir;\n newRequire.publicUrl = publicUrl;\n newRequire.devServer = devServer;\n newRequire.i = importMap;\n newRequire.register = function (id, exports) {\n modules[id] = [\n function (require, module) {\n module.exports = exports;\n },\n {},\n ];\n };\n\n // Only insert newRequire.load when it is actually used.\n // The code in this file is linted against ES5, so dynamic import is not allowed.\n // INSERT_LOAD_HERE\n\n Object.defineProperty(newRequire, 'root', {\n get: function () {\n return globalObject[parcelRequireName];\n },\n });\n\n globalObject[parcelRequireName] = newRequire;\n\n for (var i = 0; i < entry.length; i++) {\n newRequire(entry[i]);\n }\n\n if (mainEntry) {\n // Expose entry point to Node, AMD or browser globals\n // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js\n var mainExports = newRequire(mainEntry);\n\n // CommonJS\n if (typeof exports === 'object' && typeof module !== 'undefined') {\n module.exports = mainExports;\n\n // RequireJS\n } else if (typeof define === 'function' && define.amd) {\n define(function () {\n return mainExports;\n });\n }\n }\n})({\"6ZbtA\":[function(require,module,exports,__globalThis) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>artplayerPluginDanmuku);\nvar _danmuku = require(\"./danmuku\");\nvar _danmukuDefault = parcelHelpers.interopDefault(_danmuku);\nvar _heatmap = require(\"./heatmap\");\nvar _heatmapDefault = parcelHelpers.interopDefault(_heatmap);\nvar _setting = require(\"./setting\");\nvar _settingDefault = parcelHelpers.interopDefault(_setting);\nfunction artplayerPluginDanmuku(option) {\n return (art)=>{\n const danmuku = new (0, _danmukuDefault.default)(art, option);\n const setting = new (0, _settingDefault.default)(art, danmuku);\n if (danmuku.option.heatmap) (0, _heatmapDefault.default)(art, danmuku, danmuku.option.heatmap);\n return {\n name: 'artplayerPluginDanmuku',\n emit: danmuku.emit.bind(danmuku),\n load: danmuku.load.bind(danmuku),\n config: danmuku.config.bind(danmuku),\n hide: danmuku.hide.bind(danmuku),\n show: danmuku.show.bind(danmuku),\n reset: danmuku.reset.bind(danmuku),\n mount: setting.mount.bind(setting),\n get option () {\n return danmuku.option;\n },\n get isHide () {\n return danmuku.isHide;\n },\n get isStop () {\n return danmuku.isStop;\n }\n };\n };\n}\nartplayerPluginDanmuku.icons = (0, _settingDefault.default).icons;\nif (typeof window !== 'undefined') window.artplayerPluginDanmuku = artplayerPluginDanmuku;\n\n},{\"./danmuku\":\"6C7g0\",\"./heatmap\":\"h2ayY\",\"./setting\":\"90QKZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"5lQoW\"}],\"6C7g0\":[function(require,module,exports,__globalThis) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _worker = require(\"bundle-text:./worker\");\nvar _workerDefault = parcelHelpers.interopDefault(_worker);\nvar _bilibili = require(\"./bilibili\");\nclass Danmuku {\n constructor(art, option){\n const { constructor, template } = art;\n this.utils = constructor.utils // 工具库\n ;\n this.validator = constructor.validator // 配置校验器\n ;\n this.$danmuku = template.$danmuku // 弹幕层容器\n ;\n this.$player = template.$player // 播放器容器\n ;\n this.art = art;\n this.queue = [] // 实际弹幕队列\n ;\n this.$refs = [] // 弹幕DOM节点池\n ;\n this.isStop = false // 是否停止\n ;\n this.isHide = false // 是否隐藏\n ;\n this.timer = null // 定时器\n ;\n this.index = 0 // 弹幕索引\n ;\n // 格式化后的配置项\n this.option = Danmuku.option;\n // 弹幕状态池\n this.states = {\n wait: [],\n ready: [],\n emit: [],\n stop: []\n };\n // 初始化配置\n this.config(option, true);\n // 创建 Web Worker, 用于计算弹幕的 top 值\n const workerText2 = (0, _workerDefault.default).replace('export{e as default};', '');\n const blob = new Blob([\n workerText2\n ], {\n type: 'application/javascript'\n });\n this.worker = new Worker(URL.createObjectURL(blob));\n // 绑定公用事件\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n this.reset = this.reset.bind(this);\n this.resize = this.resize.bind(this);\n this.destroy = this.destroy.bind(this);\n // 监听事件\n art.on('video:play', this.start);\n art.on('video:playing', this.start);\n art.on('video:pause', this.stop);\n art.on('video:waiting', this.stop);\n art.on('destroy', this.destroy);\n art.on('resize', this.resize);\n // 开始加载弹幕\n this.load();\n }\n // 默认配置\n static get option() {\n return {\n danmuku: [],\n speed: 5,\n margin: [\n 10,\n '25%'\n ],\n opacity: 1,\n color: '#FFFFFF',\n mode: 0,\n modes: [\n 0,\n 1,\n 2\n ],\n fontSize: 25,\n antiOverlap: true,\n synchronousPlayback: false,\n mount: undefined,\n heatmap: false,\n width: 512,\n points: [],\n filter: ()=>true,\n beforeEmit: ()=>true,\n beforeVisible: ()=>true,\n visible: true,\n emitter: true,\n maxLength: 200,\n lockTime: 5,\n theme: 'dark',\n OPACITY: {},\n FONT_SIZE: {},\n MARGIN: {},\n SPEED: {},\n COLOR: []\n };\n }\n // 配置校验\n static get scheme() {\n return {\n danmuku: 'array|function|string',\n speed: 'number',\n margin: 'array',\n opacity: 'number',\n color: 'string',\n mode: 'number',\n modes: 'array',\n fontSize: 'number|string',\n antiOverlap: 'boolean',\n synchronousPlayback: 'boolean',\n mount: '?htmldivelement|string',\n heatmap: 'object|boolean',\n width: 'number',\n points: 'array',\n filter: 'function',\n beforeEmit: 'function',\n beforeVisible: 'function',\n visible: 'boolean',\n emitter: 'boolean',\n maxLength: 'number',\n lockTime: 'number',\n theme: 'string',\n OPACITY: 'object',\n FONT_SIZE: 'object',\n MARGIN: 'object',\n SPEED: 'object',\n COLOR: 'array'\n };\n }\n // 初始弹幕样式\n static get cssText() {\n return `\n user-select: none;\n position: absolute;\n white-space: pre;\n pointer-events: none;\n perspective: 500px;\n display: inline-block;\n will-change: transform;\n font-weight: normal;\n line-height: 1.125;\n visibility: hidden;\n font-family: SimHei, \"Microsoft JhengHei\", Arial, Helvetica, sans-serif;\n text-shadow: rgb(0, 0, 0) 1px 0px 1px, rgb(0, 0, 0) 0px 1px 1px, rgb(0, 0, 0) 0px -1px 1px, rgb(0, 0, 0) -1px 0px 1px;\n `;\n }\n // 是否在移动端使用了自动旋屏,会影响弹幕的left和top值\n get isRotate() {\n return this.art.plugins?.autoOrientation?.state;\n }\n // 计算上空白边距\n get marginTop() {\n const { clamp } = this.utils;\n const value = this.option.margin[0];\n const { clientHeight } = this.$player;\n if (typeof value === 'number') return clamp(value, 0, clientHeight);\n if (typeof value === 'string' && value.endsWith('%')) {\n const ratio = Number.parseFloat(value) / 100;\n return clamp(clientHeight * ratio, 0, clientHeight);\n }\n return Danmuku.option.margin[0];\n }\n // 计算下空白边距\n get marginBottom() {\n const { clamp } = this.utils;\n const value = this.option.margin[1];\n const { clientHeight } = this.$player;\n if (typeof value === 'number') return clamp(value, 0, clientHeight);\n if (typeof value === 'string' && value.endsWith('%')) {\n const ratio = Number.parseFloat(value) / 100;\n return clamp(clientHeight * ratio, 0, clientHeight);\n }\n return Danmuku.option.margin[1];\n }\n // 计算弹幕字体大小\n get fontSize() {\n const { clamp } = this.utils;\n const { clientHeight } = this.$player;\n const fontSize = this.option.fontSize;\n if (typeof fontSize === 'number') return Math.round(clamp(fontSize, 12, clientHeight));\n if (typeof fontSize === 'string' && fontSize.endsWith('%')) {\n const ratio = Number.parseFloat(fontSize) / 100;\n return Math.round(clamp(clientHeight * ratio, 12, clientHeight));\n }\n return Danmuku.option.fontSize;\n }\n // 获取弹幕DOM节点\n get $ref() {\n const $ref = this.$refs.pop() || document.createElement('div');\n $ref.style.cssText = Danmuku.cssText;\n $ref.dataset.mode = '';\n $ref.dataset.id = '';\n $ref.className = '';\n return $ref;\n }\n // 获取准备好发送的弹幕\n get readys() {\n const { currentTime } = this.art;\n const result = [];\n // 有的是ready状态:之前因为弹幕太多而暂停发送的弹幕\n this.filter('ready', (danmu)=>result.push(danmu));\n // 有的是wait状态:符合时间范围的弹幕\n this.filter('wait', (danmu)=>{\n if (currentTime + 0.1 >= danmu.time && danmu.time >= currentTime - 0.1) result.push(danmu);\n });\n return result;\n }\n // 可见的弹幕的数据,用于计算下一个弹幕的top值\n get visibles() {\n const result = [];\n const { clientWidth } = this.$player;\n const clientLeft = this.getLeft(this.$player);\n this.filter('emit', (danmu)=>{\n const top = danmu.$ref.offsetTop;\n const left = this.getLeft(danmu.$ref) - clientLeft;\n const height = danmu.$ref.clientHeight;\n const width = danmu.$ref.clientWidth;\n const distance = left + width;\n const right = clientWidth - distance;\n const speed = distance / danmu.$restTime;\n const emit = {};\n emit.top = top;\n emit.left = left;\n emit.height = height;\n emit.width = width;\n emit.right = right;\n emit.speed = speed;\n emit.distance = distance;\n emit.time = danmu.$restTime;\n emit.mode = danmu.mode;\n result.push(emit);\n });\n return result;\n }\n // 计算弹幕速度\n get speed() {\n return this.option.synchronousPlayback && this.art.playbackRate ? this.option.speed / Number(this.art.playbackRate) : this.option.speed;\n }\n // 加载弹幕\n async load(danmuku) {\n const { errorHandle } = this.utils;\n let danmus = [];\n const target = danmuku || this.option.danmuku;\n try {\n if (typeof target === 'function') danmus = await target() // 异步函数获取\n ;\n else if (target instanceof Promise) danmus = await target // 从 Promise 对象获取\n ;\n else if (typeof target === 'string') danmus = await (0, _bilibili.bilibiliDanmuParseFromUrl)(target) // 从B站xml链接解析\n ;\n else if (Array.isArray(target)) danmus = target // 直接传入数组\n ;\n errorHandle(Array.isArray(danmus), 'Danmuku need return an array as result');\n // 假如没有传入弹幕参数,则清空弹幕,否则追加弹幕\n if (danmuku === undefined) {\n this.reset() // 重置弹幕\n ;\n this.queue = [] // 清空弹幕队列\n ;\n this.states = {\n wait: [],\n ready: [],\n emit: [],\n stop: []\n } // 清空弹幕状态池\n ;\n this.$refs = [] // 清空弹幕DOM节点池\n ;\n this.$danmuku.textContent = '' // 清空弹幕层\n ;\n }\n // 逐个验证原始弹幕并转换到弹幕队列\n for(let index = 0; index < danmus.length; index++){\n const danmu = danmus[index];\n await this.emit(danmu);\n }\n this.art.emit('artplayerPluginDanmuku:loaded', this.queue);\n } catch (error) {\n this.art.emit('artplayerPluginDanmuku:error', error);\n throw error;\n }\n return this;\n }\n // 把原始弹幕转换到弹幕队列\n async emit(danmu) {\n const { clamp } = this.utils;\n this.validator(danmu, {\n id: '?string',\n text: 'string',\n mode: '?number',\n color: '?string',\n time: '?number',\n border: '?boolean',\n style: '?object'\n });\n // 弹幕文本为空则直接忽略\n if (!danmu.text.trim()) return this;\n // 设置弹幕时间,如果没有则默认为当前时间加 0.5 秒\n if (danmu.time) danmu.time = clamp(danmu.time, 0, Infinity);\n else danmu.time = this.art.currentTime + 0.5;\n // 设置弹幕模式,如果没有则默认为全局配置\n if (danmu.mode === undefined) danmu.mode = this.option.mode;\n // 设置弹幕单独样式,如果没有则默认为空对象\n if (danmu.style === undefined) danmu.style = {};\n // 设置弹幕颜色,如果没有则默认为全局配置\n if (danmu.color === undefined) danmu.color = this.option.color;\n // 弹幕模式只能是 0, 1, 2\n if (![\n 0,\n 1,\n 2\n ].includes(danmu.mode)) return this;\n // 自定义弹幕过滤函数\n if (!this.option.filter(danmu)) return this;\n // 添加自定义属性\n const item = {\n ...danmu,\n $state: 'wait',\n $index: this.index++,\n $ref: null,\n $restTime: 0,\n $lastStartTime: 0\n };\n // 转换为wait状态\n this.setState(item, 'wait');\n // 添加到实际弹幕队列\n this.queue.push(item);\n // 弹幕有四个状态:\n // - wait: 弹幕还未开始显示,没有被添加到 DOM 中\n // - ready: 弹幕准备好显示,没有被添加到 DOM 中\n // - emit: 弹幕正在显示,已经被添加到 DOM 中\n // - stop: 弹幕正在停止显示,已经被添加到 DOM 中\n return this;\n }\n // 动态配置\n config(option, isInit = false) {\n const { clamp } = this.utils;\n const { $controlsCenter } = this.art.template;\n // 判断配置项是否有变化\n const changed = Object.keys(option).some((key)=>JSON.stringify(this.option[key]) !== JSON.stringify(option[key]));\n // 没有变化则直接返回\n if (!changed && !isInit) return this;\n // 更新配置项\n this.option = Object.assign({}, Danmuku.option, this.option, option);\n this.validator(this.option, Danmuku.scheme);\n this.option.mode = clamp(this.option.mode, 0, 2);\n this.option.speed = clamp(this.option.speed, 1, 10);\n this.option.opacity = clamp(this.option.opacity, 0, 1);\n this.option.lockTime = clamp(this.option.lockTime, 1, 60);\n this.option.maxLength = clamp(this.option.maxLength, 1, 1000);\n this.option.mount = this.option.mount || $controlsCenter;\n // 动态配置有字体大小,需要重新渲染\n if (option.fontSize) this.reset();\n // 通过配置项控制弹幕的显示和隐藏\n if (this.option.visible) this.show();\n else this.hide();\n this.art.emit('artplayerPluginDanmuku:config', this.option);\n return this;\n }\n // 计算DOM的left值,受到旋屏影响\n getLeft($ref) {\n const rect = $ref.getBoundingClientRect();\n return this.isRotate ? rect.top : rect.left;\n }\n // 复杂运算交给 Web Worker 处理\n postMessage(message = {}) {\n return new Promise((resolve)=>{\n message.id = Date.now() // 生成唯一标识\n ;\n this.worker.postMessage(message);\n this.worker.onmessage = (event)=>{\n const { data } = event;\n // 判断是否是当前的消息\n if (data.id === message.id) resolve(data);\n };\n });\n }\n // 根据状态获取弹幕\n filter(state, callback) {\n const danmus = this.states[state] || [];\n for(let index = 0; index < danmus.length; index++)callback(danmus[index]);\n return danmus;\n }\n // 设置弹幕状态\n setState(danmu, state) {\n // 从原状态池中删除\n this.states[danmu.$state] = this.states[danmu.$state].filter((item)=>item !== danmu);\n // 设置新状态\n danmu.$state = state;\n // 设置DOM节点状态\n if (danmu.$ref) danmu.$ref.dataset.state = state;\n // 添加到新状态池中\n this.states[state].push(danmu);\n }\n // 重置弹幕到wait状态,回收弹幕DOM节点\n makeWait(danmu) {\n this.setState(danmu, 'wait');\n if (danmu.$ref) {\n danmu.$ref.style.cssText = Danmuku.cssText;\n danmu.$ref.style.visibility = 'hidden';\n danmu.$ref.style.marginLeft = '0px';\n danmu.$ref.style.transform = 'translateX(0px)';\n danmu.$ref.style.transition = 'transform 0s linear 0s';\n this.$refs.push(danmu.$ref);\n danmu.$ref = null;\n }\n }\n // 实时更新弹幕\n update() {\n const { setStyles } = this.utils;\n this.timer = window.requestAnimationFrame(async ()=>{\n if (this.art.playing && !this.isHide) {\n // 实时计算弹幕的剩余显示时间\n this.filter('emit', (danmu)=>{\n const emitTime = (Date.now() - danmu.$lastStartTime) / 1000;\n danmu.$restTime -= emitTime;\n danmu.$lastStartTime = Date.now();\n // 超过时间即重置弹幕\n if (danmu.$restTime <= 0) this.makeWait(danmu);\n });\n // 获取准备好发送的弹幕,可能包含ready和wait状态的弹幕\n const readys = this.readys;\n for(let index = 0; index < readys.length; index++){\n const danmu = readys[index];\n // 弹幕发送前的过滤器\n const state = await this.option.beforeVisible(danmu);\n if (state) {\n const { clientWidth, clientHeight } = this.$player;\n danmu.$ref = this.$ref // 获取弹幕DOM节点\n ;\n danmu.$ref.textContent = danmu.text // 设置弹幕文本\n ;\n // 提前添加到弹幕层中,用于计算top值\n this.$danmuku.appendChild(danmu.$ref);\n // 设置初始弹幕样式\n danmu.$ref.style.opacity = this.option.opacity;\n danmu.$ref.style.fontSize = `${this.fontSize}px`;\n danmu.$ref.style.color = danmu.color;\n danmu.$ref.style.border = danmu.border ? `1px solid ${danmu.color}` : null;\n danmu.$ref.style.backgroundColor = danmu.border ? 'rgb(0 0 0 / 50%)' : null;\n // 设置单独弹幕样式\n setStyles(danmu.$ref, danmu.style);\n // 记录弹幕时间戳\n danmu.$lastStartTime = Date.now();\n // 计算弹幕剩余时间\n danmu.$restTime = this.speed;\n // 计算弹幕滚动的距离\n const distance = clientWidth + danmu.$ref.clientWidth;\n // 计算弹幕的top值\n const { result: top } = await this.postMessage({\n type: 'getDanmuTop',\n target: {\n mode: danmu.mode,\n height: danmu.$ref.clientHeight,\n speed: distance / danmu.$restTime\n },\n visibles: this.visibles,\n antiOverlap: this.option.antiOverlap,\n clientWidth,\n clientHeight,\n marginBottom: this.marginBottom,\n marginTop: this.marginTop\n });\n if (danmu.$ref) {\n if (!this.isStop && top !== undefined) {\n this.setState(danmu, 'emit') // 转换为emit状态\n ;\n danmu.$ref.style.top = `${top}px`;\n danmu.$ref.style.visibility = 'visible';\n danmu.$ref.dataset.mode = danmu.mode // CSS控制模式的显示和隐藏\n ;\n danmu.$ref.dataset.id = danmu.id || '' // 用于悬停的唯一标识\n ;\n switch(danmu.mode){\n // 滚动的弹幕\n case 0:\n danmu.$ref.style.left = `${clientWidth}px`;\n danmu.$ref.style.marginLeft = '0px';\n danmu.$ref.style.transform = `translateX(${-distance}px)`;\n danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`;\n break;\n case 1:\n // falls through\n case 2:\n danmu.$ref.style.left = '50%';\n danmu.$ref.style.marginLeft = `-${danmu.$ref.clientWidth / 2}px`;\n break;\n default:\n break;\n }\n this.art.emit('artplayerPluginDanmuku:visible', danmu);\n } else {\n // 假如弹幕已经停止或者没有 top 值,则重置弹幕为ready状态,回收弹幕DOM节点,等待下次发送\n this.setState(danmu, 'ready');\n this.$refs.push(danmu.$ref);\n danmu.$ref = null;\n }\n }\n }\n }\n }\n // 递归调用\n if (!this.isStop) this.update();\n });\n return this;\n }\n // 重置正在显示的弹幕: stop/emit 状态的弹幕\n resize() {\n const { clientWidth } = this.$player;\n this.filter('stop', (danmu)=>{\n switch(danmu.mode){\n // 滚动的弹幕\n case 0:\n danmu.$ref.style.left = `${clientWidth}px`;\n break;\n default:\n break;\n }\n });\n this.filter('emit', (danmu)=>{\n danmu.$lastStartTime = Date.now();\n switch(danmu.mode){\n // 滚动的弹幕\n case 0:\n {\n const distance = clientWidth + danmu.$ref.clientWidth;\n danmu.$ref.style.left = `${clientWidth}px`;\n danmu.$ref.style.transform = `translateX(${-distance}px)`;\n danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`;\n break;\n }\n default:\n break;\n }\n });\n }\n // 继续弹幕\n continue() {\n const { clientWidth } = this.$player;\n this.filter('stop', (danmu)=>{\n this.setState(danmu, 'emit') // 转换为emit状态\n ;\n danmu.$lastStartTime = Date.now();\n switch(danmu.mode){\n // 继续滚动的弹幕\n case 0:\n {\n const distance = clientWidth + danmu.$ref.clientWidth;\n danmu.$ref.style.transform = `translateX(${-distance}px)`;\n danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`;\n break;\n }\n default:\n break;\n }\n });\n return this;\n }\n // 暂停弹幕\n suspend() {\n const { clientWidth } = this.$player;\n this.filter('emit', (danmu)=>{\n this.setState(danmu, 'stop') // 转换为stop状态\n ;\n switch(danmu.mode){\n // 停止滚动的弹幕\n case 0:\n {\n const translateX = clientWidth - (this.getLeft(danmu.$ref) - this.getLeft(this.$player));\n danmu.$ref.style.transform = `translateX(${-translateX}px)`;\n danmu.$ref.style.transition = 'transform 0s linear 0s';\n break;\n }\n default:\n break;\n }\n });\n return this;\n }\n stop() {\n this.isStop = true;\n this.suspend();\n window.cancelAnimationFrame(this.timer);\n this.art.emit('artplayerPluginDanmuku:stop');\n return this;\n }\n start() {\n this.isStop = false;\n this.continue();\n this.update();\n this.art.emit('artplayerPluginDanmuku:start');\n return this;\n }\n reset() {\n this.queue.forEach((danmu)=>this.makeWait(danmu));\n this.art.emit('artplayerPluginDanmuku:reset');\n return this;\n }\n show() {\n this.isHide = false;\n this.$danmuku.style.opacity = 1;\n this.option.visible = true;\n this.art.emit('artplayerPluginDanmuku:show');\n return this;\n }\n hide() {\n this.isHide = true;\n this.$danmuku.style.opacity = 0;\n this.option.visible = false;\n this.art.emit('artplayerPluginDanmuku:hide');\n return this;\n }\n destroy() {\n this.stop();\n this.worker.terminate();\n this.art.off('video:play', this.start);\n this.art.off('video:playing', this.start);\n this.art.off('video:pause', this.stop);\n this.art.off('video:waiting', this.stop);\n this.art.off('resize', this.reset);\n this.art.off('destroy', this.destroy);\n this.art.emit('artplayerPluginDanmuku:destroy');\n }\n}\nexports.default = Danmuku;\n\n},{\"bundle-text:./worker\":\"8UAYg\",\"./bilibili\":\"8WBpY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"5lQoW\"}],\"8UAYg\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"!function(e,t,i,o,r,n,l,d){var u=\\\"undefined\\\"!=typeof globalThis?globalThis:\\\"undefined\\\"!=typeof self?self:\\\"undefined\\\"!=typeof window?window:\\\"undefined\\\"!=typeof global?global:{},f=\\\"function\\\"==typeof u[o]&&u[o],p=f.i||{},s=f.cache||{},h=\\\"undefined\\\"!=typeof module&&\\\"function\\\"==typeof module.require&&module.require.bind(module);function a(t,i){if(!s[t]){if(!e[t]){if(r[t])return r[t];var n=\\\"function\\\"==typeof u[o]&&u[o];if(!i&&n)return n(t,!0);if(f)return f(t,!0);if(h&&\\\"string\\\"==typeof t)return h(t);var l=Error(\\\"Cannot find module '\\\"+t+\\\"'\\\");throw l.code=\\\"MODULE_NOT_FOUND\\\",l}p.resolve=function(i){var o=e[t][1][i];return null!=o?o:i},p.cache={};var d=s[t]=new a.Module(t);e[t][0].call(d.exports,p,d,d.exports,u)}return s[t].exports;function p(e){var t=p.resolve(e);return!1===t?{}:a(t)}}a.isParcelRequire=!0,a.Module=function(e){this.id=e,this.bundle=a,this.require=h,this.exports={}},a.modules=e,a.cache=s,a.parent=f,a.distDir=void 0,a.publicUrl=void 0,a.devServer=void 0,a.i=p,a.register=function(t,i){e[t]=[function(e,t){t.exports=i},{}]},Object.defineProperty(a,\\\"root\\\",{get:function(){return u[o]}}),u[o]=a;for(var c=0;c<t.length;c++)a(t[c]);if(i){var g=a(i);\\\"object\\\"==typeof exports&&\\\"undefined\\\"!=typeof module?module.exports=g:\\\"function\\\"==typeof define&&define.amd&&define(function(){return g})}}({\\\"4KwZ6\\\":[function(e,t,i,o){function r({target:e,visibles:t,clientWidth:i,clientHeight:o,marginBottom:r,marginTop:n,antiOverlap:l}){let d=o-r,u=t.filter(t=>t.mode===e.mode&&t.top<=d).sort((e,t)=>e.top-t.top);if(0===u.length)if(2===e.mode)return d-e.height;else return n;if(u.unshift({type:\\\"top\\\",top:0,left:0,right:0,height:n,width:i,speed:0,distance:i}),u.push({type:\\\"bottom\\\",top:d,left:0,right:0,height:r,width:i,speed:0,distance:i}),2===e.mode)for(let t=u.length-2;t>=0;t-=1){let i=u[t],o=u[t+1],r=i.top+i.height;if(o.top-r>=e.height)return o.top-e.height}else for(let t=1;t<u.length;t+=1){let i=u[t],o=u[t-1],r=o.top+o.height;if(i.top-r>=e.height)return r}let f=[];for(let e=1;e<u.length-1;e+=1){let t=u[e];if(f.length){let e=f[f.length-1];e[0].top===t.top?e.push(t):f.push([t])}else f.push([t])}if(l)switch(e.mode){case 0:{let t=f.find(t=>t.every(t=>!(i<t.distance)&&(!!(e.speed<t.speed)||!!(t.right/(e.speed-t.speed)>t.time))));return t&&t[0]?t[0].top:void 0}case 1:case 2:return}else{switch(e.mode){case 0:f.sort((e,t)=>{let i=Math.min(...t.map(e=>e.right)),o=Math.min(...e.map(e=>e.right));return i*t.length-o*e.length});break;case 1:case 2:f.sort((e,t)=>{let i=Math.max(...t.map(e=>e.width));return Math.max(...e.map(e=>e.width))*e.length-i*t.length})}return f[0][0].top}}onmessage=e=>{let{data:t}=e;t.id&&t.type&&globalThis.postMessage({result:(0,({getDanmuTop:r})[t.type])(t),id:t.id})}},{}]},[\\\"4KwZ6\\\"],\\\"4KwZ6\\\",\\\"parcelRequire4dc0\\\",{});let{\\\"*\\\":e}=parcelRequire4dc0(\\\"4KwZ6\\\");export{e as default};\";\n\n},{}],\"8WBpY\":[function(require,module,exports,__globalThis) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bilibiliDanmuParseFromUrl\", ()=>bilibiliDanmuParseFromUrl);\nfunction getMode(key) {\n switch(key){\n case 1:\n case 2:\n case 3:\n return 0;\n case 4:\n return 2;\n case 5:\n return 1;\n default:\n return 0;\n }\n}\nfunction bilibiliDanmuParseFromXml(xmlString) {\n if (typeof xmlString !== 'string') return [];\n const reg = /<d[^>]*?p=\"(?<p>[^\"]+)\"[^>]*>(?<text>.*?)<\\/d>/gs;\n const matches = xmlString.matchAll(reg);\n return Array.from(matches).map((match)=>{\n const attr = match.groups.p.split(',');\n if (attr.length >= 8) {\n const text = match.groups.text.trim().replaceAll('"', '\"').replaceAll(''', '\\'').replaceAll('<', '<').replaceAll('>', '>').replaceAll('&', '&');\n return {\n text,\n time: Number(attr[0]),\n mode: getMode(Number(attr[1])),\n fontSize: Number(attr[2]),\n color: `#${Number(attr[3]).toString(16)}`,\n timestamp: Number(attr[4]),\n pool: Number(attr[5]),\n userID: attr[6],\n rowID: Number(attr[7])\n };\n } else return null;\n }).filter(Boolean);\n}\nfunction onmessage({ data }) {\n const { xml, id } = data;\n if (!id || !xml) return;\n const danmus = bilibiliDanmuParseFromXml(xml);\n globalThis.postMessage({\n danmus,\n id\n });\n}\nfunction createWorker() {\n const workerText = `\n ${getMode.toString()}\n ${bilibiliDanmuParseFromXml.toString()}\n onmessage = ${onmessage.toString()}\n `;\n const blob = new Blob([\n workerText\n ], {\n type: 'application/javascript'\n });\n return new Worker(URL.createObjectURL(blob));\n}\nfunction bilibiliDanmuParseFromUrl(url) {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve)=>{\n const res = await fetch(url);\n const xml = await res.text();\n try {\n const worker = createWorker();\n worker.onmessage = (event)=>{\n const { danmus, id } = event.data;\n if (!id || !danmus) return;\n resolve(danmus);\n worker.terminate();\n };\n worker.postMessage({\n xml,\n id: Date.now()\n });\n } catch (error) {\n console.error('Error parsing Bilibili Danmu:', error);\n const danmus = bilibiliDanmuParseFromXml(xml);\n resolve(danmus);\n }\n });\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"5lQoW\"}],\"5lQoW\":[function(require,module,exports,__globalThis) {\nexports.interopDefault = function(a) {\n return a && a.__esModule ? a : {\n default: a\n };\n};\nexports.defineInteropFlag = function(a) {\n Object.defineProperty(a, '__esModule', {\n value: true\n });\n};\nexports.exportAll = function(source, dest) {\n Object.keys(source).forEach(function(key) {\n if (key === 'default' || key === '__esModule' || Object.prototype.hasOwnProperty.call(dest, key)) return;\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function() {\n return source[key];\n }\n });\n });\n return dest;\n};\nexports.export = function(dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get\n });\n};\n\n},{}],\"h2ayY\":[function(require,module,exports,__globalThis) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>heatmap);\nconst lib = {\n map (value, inMin, inMax, outMin, outMax) {\n return (value - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n },\n range (start, end, tick) {\n const s = Math.round(start / tick) * tick;\n return Array.from({\n length: Math.floor((end - start) / tick)\n }, (v, k)=>{\n return k * tick + s;\n });\n }\n};\nfunction line(pointA, pointB) {\n const lengthX = pointB[0] - pointA[0];\n const lengthY = pointB[1] - pointA[1];\n return {\n length: Math.sqrt(lengthX ** 2 + lengthY ** 2),\n angle: Math.atan2(lengthY, lengthX)\n };\n}\nfunction heatmap(art, danmuku, option) {\n const { query } = art.constructor.utils;\n art.controls.add({\n name: 'heatmap',\n position: 'top',\n html: '',\n style: {\n position: 'absolute',\n top: '-100px',\n left: '0px',\n right: '0px',\n height: '100px',\n width: '100%',\n pointerEvents: 'none'\n },\n mounted ($heatmap) {\n let $start = null;\n let $stop = null;\n function update(arg = []) {\n $start = null;\n $stop = null;\n $heatmap.innerHTML = '';\n if (!art.duration || art.option.isLive) return;\n const svg = {\n w: $heatmap.offsetWidth,\n h: $heatmap.offsetHeight\n };\n const options = {\n xMin: 0,\n xMax: svg.w,\n yMin: 0,\n yMax: 128,\n scale: 0.25,\n opacity: 0.2,\n minHeight: Math.floor(svg.h * 0.05),\n sampling: Math.floor(svg.w / 100),\n smoothing: 0.2,\n flattening: 0.2\n };\n if (typeof option === 'object') Object.assign(options, option);\n let points = [];\n if (Array.isArray(arg) && arg.length) points = [\n ...arg\n ];\n else {\n const gap = art.duration / svg.w;\n for(let x = 0; x <= svg.w; x += options.sampling){\n const y = danmuku.queue.filter(({ time })=>time > x * gap && time <= (x + options.sampling) * gap).length;\n points.push([\n x,\n y\n ]);\n }\n }\n if (points.length === 0) return;\n const lastPoint = points[points.length - 1];\n const lastX = lastPoint[0];\n const lastY = lastPoint[1];\n if (lastX !== svg.w) points.push([\n svg.w,\n lastY\n ]);\n const yPoints = points.map((point)=>point[1]);\n const yMin = Math.min(...yPoints);\n const yMax = Math.max(...yPoints);\n const yMid = (yMin + yMax) / 2;\n for(let i = 0; i < points.length; i++){\n const point = points[i];\n const y = point[1];\n point[1] = y * (y > yMid ? 1 + options.scale : 1 - options.scale) + options.minHeight;\n }\n const controlPoint = (current, previous, next, reverse)=>{\n const p = previous || current;\n const n = next || current;\n const o = line(p, n);\n const flat = lib.map(Math.cos(o.angle) * options.flattening, 0, 1, 1, 0);\n const angle = o.angle * flat + (reverse ? Math.PI : 0);\n const length = o.length * options.smoothing;\n const x = current[0] + Math.cos(angle) * length;\n const y = current[1] + Math.sin(angle) * length;\n return [\n x,\n y\n ];\n };\n const bezierCommand = (point, i, a)=>{\n const cps = controlPoint(a[i - 1], a[i - 2], point);\n const cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n const close = i === a.length - 1 ? ' z' : '';\n return `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}${close}`;\n };\n const pointsPositions = points.map((e)=>{\n const x = lib.map(e[0], options.xMin, options.xMax, 0, svg.w);\n const y = lib.map(e[1], options.yMin, options.yMax, svg.h, 0);\n return [\n x,\n y\n ];\n });\n const pathD = pointsPositions.reduce((acc, e, i, a)=>i === 0 ? `M ${a[a.length - 1][0]},${svg.h} L ${e[0]},${svg.h} L ${e[0]},${e[1]}` : `${acc} ${bezierCommand(e, i, a)}`, '');\n $heatmap.innerHTML = `\n <svg viewBox=\"0 0 ${svg.w} ${svg.h}\">\n <defs>\n <linearGradient id=\"heatmap-solids\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" style=\"stop-color:var(--art-theme);stop-opacity:${options.opacity}\" />\n <stop offset=\"0%\" style=\"stop-color:var(--art-theme);stop-opacity:${options.opacity}\" id=\"heatmap-start\" />\n <stop offset=\"0%\" style=\"stop-color:var(--art-progress-color);stop-opacity:1\" id=\"heatmap-stop\" />\n <stop offset=\"100%\" style=\"stop-color:var(--art-progress-color);stop-opacity:1\" />\n </linearGradient>\n </defs>\n <path fill=\"url(#heatmap-solids)\" d=\"${pathD}\"></path>\n </svg>\n `;\n $start = query('#heatmap-start', $heatmap);\n $stop = query('#heatmap-stop', $heatmap);\n $start.setAttribute('offset', `${art.played * 100}%`);\n $stop.setAttribute('offset', `${art.played * 100}%`);\n }\n art.on('video:timeupdate', ()=>{\n if ($start && $stop) {\n $start.setAttribute('offset', `${art.played * 100}%`);\n $stop.setAttribute('offset', `${art.played * 100}%`);\n }\n });\n art.on('setBar', (type, percentage)=>{\n if ($start && $stop && type === 'played') {\n $start.setAttribute('offset', `${percentage * 100}%`);\n $stop.setAttribute('offset', `${percentage * 100}%`);\n }\n });\n art.on('ready', ()=>update());\n art.on('resize', ()=>update());\n art.on('artplayerPluginDanmuku:loaded', ()=>update());\n art.on('artplayerPluginDanmuku:points', (points)=>update(points));\n }\n });\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"5lQoW\"}],\"90QKZ\":[function(require,module,exports,__globalThis) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _checkOffSvg = require(\"bundle-text:./img/check_off.svg\");\nvar _checkOffSvgDefault = parcelHelpers.interopDefault(_checkOffSvg);\nvar _checkOnSvg = require(\"bundle-text:./img/check_on.svg\");\nvar _checkOnSvgDefault = parcelHelpers.interopDefault(_checkOnSvg);\nvar _configSvg = require(\"bundle-text:./img/config.svg\");\nvar _configSvgDefault = parcelHelpers.interopDefault(_configSvg);\nvar _mode0OffSvg = require(\"bundle-text:./img/mode_0_off.svg\");\nvar _mode0OffSvgDefault = parcelHelpers.interopDefault(_mode0OffSvg);\nvar _mode0OnSvg = require(\"bundle-text:./img/mode_0_on.svg\");\nvar _mode0OnSvgDefault = parcelHelpers.interopDefault(_mode0OnSvg);\nvar _mode1OffSvg = require(\"bundle-text:./img/mode_1_off.svg\");\nvar _mode1OffSvgDefault = parcelHelpers.interopDefault(_mode1OffSvg);\nvar _mode1OnSvg = require(\"bundle-text:./img/mode_1_on.svg\");\nvar _mode1OnSvgDefault = parcelHelpers.interopDefault(_mode1OnSvg);\nvar _mode2OffSvg = require(\"bundle-text:./img/mode_2_off.svg\");\nvar _mode2OffSvgDefault = parcelHelpers.interopDefault(_mode2OffSvg);\nvar _mode2OnSvg = require(\"bundle-text:./img/mode_2_on.svg\");\nvar _mode2OnSvgDefault = parcelHelpers.interopDefault(_mode2OnSvg);\nvar _offSvg = require(\"bundle-text:./img/off.svg\");\nvar _offSvgDefault = parcelHelpers.interopDefault(_offSvg);\nvar _onSvg = require(\"bundle-text:./img/on.svg\");\nvar _onSvgDefault = parcelHelpers.interopDefault(_onSvg);\nvar _styleSvg = require(\"bundle-text:./img/style.svg\");\nvar _styleSvgDefault = parcelHelpers.interopDefault(_styleSvg);\nvar _styleLess = require(\"bundle-text:./style.less\");\nvar _styleLessDefault = parcelHelpers.interopDefault(_styleLess);\nclass Setting {\n constructor(art, danmuku){\n this.art = art;\n this.danmuku = danmuku;\n this.utils = art.constructor.utils;\n const { setStyle } = this.utils;\n const { $controlsCenter } = art.template;\n setStyle($controlsCenter, 'display', 'flex');\n this.template = {\n $controlsCenter,\n $mount: $controlsCenter,\n $danmuku: null,\n $toggle: null,\n $config: null,\n $configPanel: null,\n $configModes: null,\n $style: null,\n $stylePanel: null,\n $styleModes: null,\n $colors: null,\n $opacitySlider: null,\n $opacityValue: null,\n $marginSlider: null,\n $marginValue: null,\n $fontSizeSlider: null,\n $fontSizeValue: null,\n $speedSlider: null,\n $speedValue: null,\n $input: null,\n $send: null\n };\n this.slider = {\n opacity: null,\n margin: null,\n fontSize: null,\n speed: null\n };\n this.emitting = false;\n this.isLock = false;\n this.timer = null;\n this.createTemplate();\n this.createSliders();\n this.createEvents();\n this.mount(this.option.mount);\n art.on('resize', ()=>this.resize());\n art.on('fullscreen', (state)=>this.onFullscreen(state));\n art.on('fullscreenWeb', (state)=>this.onFullscreen(state));\n art.proxy(this.template.$config, 'mouseenter', ()=>{\n this.onMouseEnter({\n $control: this.template.$config,\n $panel: this.template.$configPanel\n });\n });\n art.proxy(this.template.$style, 'mouseenter', ()=>{\n this.onMouseEnter({\n $control: this.template.$style,\n $panel: this.template.$stylePanel\n });\n });\n }\n static get icons() {\n return {\n $on: (0, _onSvgDefault.default),\n $off: (0, _offSvgDefault.default),\n $config: (0, _configSvgDefault.default),\n $style: (0, _styleSvgDefault.default),\n $mode_0_off: (0, _mode0OffSvgDefault.default),\n $mode_0_on: (0, _mode0OnSvgDefault.default),\n $mode_1_off: (0, _mode1OffSvgDefault.default),\n $mode_1_on: (0, _mode1OnSvgDefault.default),\n $mode_2_off: (0, _mode2OffSvgDefault.default),\n $mode_2_on: (0, _mode2OnSvgDefault.default),\n $check_on: (0, _checkOnSvgDefault.default),\n $check_off: (0, _checkOffSvgDefault.default)\n };\n }\n get option() {\n return this.danmuku.option;\n }\n get outside() {\n return this.template.$mount !== this.template.$controlsCenter;\n }\n get TEMPLATE() {\n const { option } = this;\n return `\n <div class=\"apd-toggle\">\n ${0, _onSvgDefault.default}${0, _offSvgDefault.default}\n </div>\n <div class=\"apd-config\">\n ${0, _configSvgDefault.default}\n <div class=\"apd-config-panel\">\n <div class=\"apd-config-panel-inner\">\n <div class=\"apd-config-mode\">\n \\u{6309}\\u{7C7B}\\u{578B}\\u{5C4F}\\u{853D}\n <div class=\"apd-modes\">\n <div data-mode=\"0\" class=\"apd-mode\">\n ${0, _mode0OffSvgDefault.default}${0, _mode0OnSvgDefault.default}\n <div>\\u{6EDA}\\u{52A8}</div>\n </div>\n <div data-mode=\"1\" class=\"apd-mode\">\n ${0, _mode1OffSvgDefault.default}${0, _mode1OnSvgDefault.default}\n <div>\\u{9876}\\u{90E8}</div>\n </div>\n <div data-mode=\"2\" class=\"apd-mode\">\n ${0, _mode2OffSvgDefault.default}${0, _mode2OnSvgDefault.default}\n <div>\\u{5E95}\\u{90E8}</div>\n </div>\n </div>\n </div>\n <div class=\"apd-config-other\">\n <div class=\"apd-other apd-anti-overlap\">\n ${0, _checkOnSvgDefault.default}${0, _checkOffSvgDefault.default}\n \\u{9632}\\u{6B62}\\u{5F39}\\u{5E55}\\u{91CD}\\u{53E0}\n </div>\n <div class=\"apd-other apd-sync-video\">\n ${0, _checkOnSvgDefault.default}${0, _checkOffSvgDefault.default}\n \\u{540C}\\u{6B65}\\u{89C6}\\u{9891}\\u{901F}\\u{5EA6}\n </div>\n </div>\n <div class=\"apd-config-slider apd-config-opacity\">\n \\u{4E0D}\\u{900F}\\u{660E}\\u{5EA6}\n <div class=\"apd-slider\"></div>\n <div class=\"apd-value\">\\u{672A}\\u{77E5}</div>\n </div>\n <div class=\"apd-config-slider apd-config-margin\">\n \\u{663E}\\u{793A}\\u{533A}\\u{57DF}\n <div class=\"apd-slider\"></div>\n <div class=\"apd-value\">\\u{672A}\\u{77E5}</div>\n </div>\n <div class=\"apd-config-slider apd-config-fontSize\">\n \\u{5F39}\\u{5E55}\\u{5B57}\\u{53F7}\n <div class=\"apd-slider\"></div>\n <div class=\"apd-value\">\\u{672A}\\u{77E5}</div>\n </div>\n <div class=\"apd-config-slider apd-config-speed\">\n \\u{5F39}\\u{5E55}\\u{901F}\\u{5EA6}\n <div class=\"apd-slider\"></div>\n <div class=\"apd-value\">\\u{672A}\\u{77E5}</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"apd-emitter\">\n <div class=\"apd-style\">\n ${0, _styleSvgDefault.default}\n <div class=\"apd-style-panel\">\n <div class=\"apd-style-panel-inner\">\n <div class=\"apd-style-mode\">\n \\u{6A21}\\u{5F0F}\n <div class=\"apd-modes\">\n <div data-mode=\"0\" class=\"apd-mode\">\n ${0, _mode0OnSvgDefault.default}\n <div>\\u{6EDA}\\u{52A8}</div>\n </div>\n <div data-mode=\"1\" class=\"apd-mode\">\n ${0, _mode1OnSvgDefault.default}\n <div>\\u{9876}\\u{90E8}</div>\n </div>\n <div data-mode=\"2\" class=\"apd-mode\">\n ${0, _mode2OnSvgDefault.default}\n <div>\\u{5E95}\\u{90E8}</div>\n </div>\n </div>\n </div>\n <div class=\"apd-style-color\">\n \\u{989C}\\u{8272}\n <div class=\"apd-colors\">\n ${this.COLOR.map((color)=>`<div data-color=\"${color}\" class=\"apd-color\" style=\"background-color: ${color}\"></div>`).join('')}\n </div>\n </div>\n </div>\n </div>\n </div>\n <input class=\"apd-input\" placeholder=\"\\u{53D1}\\u{4E2A}\\u{53CB}\\u{5584}\\u{7684}\\u{5F39}\\u{5E55}\\u{89C1}\\u{8BC1}\\u{5F53}\\u{4E0B}\" autocomplete=\"off\" maxLength=\"${option.maxLength}\" />\n <div class=\"apd-send\">\\u{53D1}\\u{9001}</div>\n </div>\n `;\n }\n get OPACITY() {\n return {\n min: 0,\n max: 100,\n steps: [],\n ...this.option.OPACITY\n };\n }\n get FONT_SIZE() {\n return {\n min: 12,\n max: 120,\n steps: [],\n ...this.option.FONT_SIZE\n };\n }\n get MARGIN() {\n return {\n min: 0,\n max: 3,\n steps: [\n {\n name: '1/4',\n value: [\n 10,\n '75%'\n ]\n },\n {\n name: \"\\u534A\\u5C4F\",\n value: [\n 10,\n '50%'\n ]\n },\n {\n name: '3/4',\n value: [\n 10,\n '25%'\n ]\n },\n {\n name: \"\\u6EE1\\u5C4F\",\n value: [\n 10,\n 10\n ]\n }\n ],\n ...this.option.MARGIN\n };\n }\n get SPEED() {\n return {\n min: 0,\n max: 4,\n steps: [\n {\n name: \"\\u6781\\u6162\",\n value: 10\n },\n {\n name: \"\\u8F83\\u6162\",\n value: 7.5,\n hide: true\n },\n {\n name: \"\\u9002\\u4E2D\",\n value: 5\n },\n {\n name: \"\\u8F83\\u5FEB\",\n value: 2.5,\n hide: true\n },\n {\n name: \"\\u6781\\u5FEB\",\n value: 1\n }\n ],\n ...this.option.SPEED\n };\n }\n get COLOR() {\n return this.option.COLOR.length ? this.option.COLOR : [\n '#FE0302',\n '#FF7204',\n '#FFAA02',\n '#FFD302',\n '#FFFF00',\n '#A0EE00',\n '#00CD00',\n '#019899',\n '#4266BE',\n '#89D5FF',\n '#CC0273',\n '#222222',\n '#9B9B9B',\n '#FFFFFF'\n ];\n }\n query(selector) {\n const { query } = this.utils;\n const { $danmuku } = this.template;\n return query(selector, $danmuku);\n }\n append(el, target) {\n const { append } = this.utils;\n const children = [\n ...el.children\n ];\n if (children.includes(target)) return;\n append(el, target);\n }\n setData(key, value) {\n const { $player } = this.art.template;\n const { $mount } = this.template;\n $player.dataset[key] = value;\n if (this.outside) $mount.dataset[key] = value;\n }\n createTemplate() {\n const { createElement, tooltip } = this.utils;\n const $danmuku = createElement('div');\n $danmuku.className = 'artplayer-plugin-danmuku';\n $danmuku.innerHTML = this.TEMPLATE;\n this.template.$danmuku = $danmuku;\n this.template.$toggle = this.query('.apd-toggle');\n this.template.$config = this.query('.apd-config');\n this.template.$configPanel = this.query('.apd-config-panel');\n this.template.$configModes = this.query('.apd-config-mode .apd-modes');\n this.template.$style = this.query('.apd-style');\n this.template.$stylePanel = this.query('.apd-style-panel');\n this.template.$styleModes = this.query('.apd-style-mode .apd-modes');\n this.template.$colors = this.query('.apd-colors');\n this.template.$antiOverlap = this.query('.apd-anti-overlap');\n this.template.$syncVideo = this.query('.apd-sync-video');\n this.template.$opacitySlider = this.query('.apd-config-opacity .apd-slider');\n this.template.$opacityValue = this.query('.apd-config-opacity .apd-value');\n this.template.$marginSlider = this.query('.apd-config-margin .apd-slider');\n this.template.$marginValue = this.query('.apd-config-margin .apd-value');\n this.template.$fontSizeSlider = this.query('.apd-config-fontSize .apd-slider');\n this.template.$fontSizeValue = this.query('.apd-config-fontSize .apd-value');\n this.template.$speedSlider = this.query('.apd-config-speed .apd-slider');\n this.template.$speedValue = this.query('.apd-config-speed .apd-value');\n this.template.$input = this.query('.apd-input');\n this.template.$send = this.query('.apd-send');\n const { $toggle } = this.template;\n this.art.on('artplayerPluginDanmuku:show', ()=>{\n tooltip($toggle, \"\\u5173\\u95ED\\u5F39\\u5E55\");\n });\n this.art.on('artplayerPluginDanmuku:hide', ()=>{\n tooltip($toggle, \"\\u6253\\u5F00\\u5F39\\u5E55\");\n });\n }\n createEvents() {\n const { $toggle, $configModes, $styleModes, $colors, $antiOverlap, $syncVideo, $send, $input } = this.template;\n this.art.proxy($toggle, 'click', ()=>{\n this.danmuku.config({\n visible: !this.option.visible\n });\n this.reset();\n });\n this.art.proxy($configModes, 'click', (event)=>{\n const $mode = event.target.closest('.apd-mode');\n if (!$mode) return;\n const mode = Number($mode.dataset.mode);\n if (this.option.modes.includes(mode)) this.danmuku.config({\n modes: this.option.modes.filter((m)=>m !== mode)\n });\n else this.danmuku.config({\n modes: [\n ...this.option.modes,\n mode\n ]\n });\n this.reset();\n });\n this.art.proxy($antiOverlap, 'click', ()=>{\n this.danmuku.config({\n antiOverlap: !this.option.antiOverlap\n });\n this.reset();\n });\n this.art.proxy($syncVideo, 'click', ()=>{\n this.danmuku.config({\n synchronousPlayback: !this.option.synchronousPlayback\n });\n this.reset();\n });\n this.art.proxy($styleModes, 'click', (event)=>{\n const $mode = event.target.closest('.apd-mode');\n if (!$mode) return;\n const mode = Number($mode.dataset.mode);\n this.danmuku.config({\n mode\n });\n this.reset();\n });\n this.art.proxy($colors, 'click', (event)=>{\n const $color = event.target.closest('.apd-color');\n if (!$color) return;\n this.danmuku.config({\n color: $color.dataset.color\n });\n this.reset();\n });\n this.art.proxy($send, 'click', ()=>this.emit());\n this.art.proxy($input, 'keypress', (event)=>{\n if (event.key === 'Enter') {\n event.preventDefault();\n this.emit();\n }\n });\n }\n createSliders() {\n this.slider.opacity = this.createSlider({\n ...this.OPACITY,\n container: this.template.$opacitySlider,\n findIndex: ()=>{\n return Math.round(this.option.opacity * 100);\n },\n onChange: (index)=>{\n const { $opacityValue } = this.template;\n $opacityValue.textContent = `${index}%`;\n this.danmuku.config({\n opacity: index / 100\n });\n }\n });\n this.slider.margin = this.createSlider({\n ...this.MARGIN,\n container: this.template.$marginSlider,\n findIndex: ()=>{\n return this.MARGIN.steps.findIndex((item)=>item.value[0] === this.option.margin[0] && item.value[1] === this.option.margin[1]);\n },\n onChange: (index)=>{\n const margin = this.MARGIN.steps[index];\n if (!margin) return;\n const { $marginValue } = this.template;\n $marginValue.textContent = margin.name;\n this.danmuku.config({\n margin: margin.value\n });\n }\n });\n this.slider.fontSize = this.createSlider({\n ...this.FONT_SIZE,\n container: this.template.$fontSizeSlider,\n findIndex: ()=>{\n return this.danmuku.fontSize;\n },\n onChange: (index)=>{\n const { $fontSizeValue } = this.template;\n $fontSizeValue.textContent = `${index}px`;\n if (index === this.danmuku.fontSize) return;\n this.danmuku.config({\n fontSize: index\n });\n }\n });\n this.slider.speed = this.createSlider({\n ...this.SPEED,\n container: this.template.$speedSlider,\n findIndex: ()=>{\n return this.SPEED.steps.findIndex((item)=>item.value === this.option.speed);\n },\n onChange: (index)=>{\n const speed = this.SPEED.steps[index];\n if (!speed) return;\n const { $speedValue } = this.template;\n $speedValue.textContent = speed.name;\n this.danmuku.config({\n speed: speed.value\n });\n }\n });\n }\n createSlider({ min, max, container, findIndex, onChange, steps = [] }) {\n const { query, clamp, setStyle } = this.utils;\n setStyle(container, 'touch-action', 'none');\n container.innerHTML = `\n <div class=\"apd-slider-line\">\n <div class=\"apd-slider-points\">\n ${steps.map(()=>`<div class=\"apd-slider-point\"></div>`).join('')}\n </div>\n <div class=\"apd-slider-progress\"></div>\n </div>\n <div class=\"apd-slider-dot\"></div>\n <div class=\"apd-slider-steps\">\n ${steps.map((step)=>step.hide ? '' : `<div class=\"apd-slider-step\">${step.name}</div>`).join('')}\n </div>\n `;\n const $dot = query('.apd-slider-dot', container);\n const $progress = query('.apd-slider-progress', container);\n let isDroging = false;\n function reset(index = findIndex()) {\n if (index < min || index > max) return;\n const percentage = (index - min) / (max - min);\n $dot.style.left = `${percentage * 100}%`;\n if (steps.length === 0) $progress.style.width = $dot.style.left;\n onChange(index);\n }\n function updateLeft(event) {\n const { top, height, left, width } = container.getBoundingClientRect();\n if (this.art.isRotate) {\n const value = clamp(event.clientY - top, 0, height);\n const index = Math.round(value / height * (max - min) + min);\n reset(index);\n } else {\n const value = clamp(event.clientX - left, 0, width);\n const index = Math.round(value / width * (max - min) + min);\n reset(index);\n }\n }\n this.art.proxy(container, 'click', (event)=>{\n updateLeft.call(this, event);\n });\n this.art.proxy(container, 'pointerdown', (event)=>{\n isDroging = event.button === 0;\n });\n this.art.on('document:pointermove', (event)=>{\n if (isDroging) updateLeft.call(this, event);\n });\n this.art.on('document:pointerup', (event)=>{\n if (isDroging) {\n isDroging = false;\n updateLeft.call(this, event);\n }\n });\n return {\n reset\n };\n }\n onFullscreen(state) {\n const { $danmuku, $controlsCenter, $mount } = this.template;\n if (this.outside) {\n if (state) this.append($controlsCenter, $danmuku);\n else this.append($mount, $danmuku);\n } else this.append($controlsCenter, $danmuku);\n }\n onMouseEnter({ $control, $panel }) {\n const { $player } = this.art.template;\n const controlRect = $control.getBoundingClientRect();\n const panelRect = $panel.getBoundingClientRect();\n const playerRect = $player.getBoundingClientRect();\n const half = panelRect.width / 2 - controlRect.width / 2;\n const left = playerRect.left - (controlRect.left - half);\n const right = controlRect.right + half - playerRect.right;\n if (left > 0) $panel.style.left = `${-half + left}px`;\n else if (right > 0) $panel.style.left = `${-half - right}px`;\n else $panel.style.left = `${-half}px`;\n }\n async emit() {\n const { $input } = this.template;\n const text = $input.value.trim();\n if (!text.length) return;\n if (this.isLock) return;\n if (this.emitting) return;\n const danmu = {\n text,\n mode: this.option.mode,\n color: this.option.color,\n time: this.art.currentTime\n };\n try {\n this.emitting = true;\n const state = await this.option.beforeEmit(danmu);\n this.emitting = false;\n if (state !== true) return;\n danmu.border = true;\n delete danmu.time;\n this.danmuku.emit(danmu);\n $input.value = '';\n this.lock();\n } catch (error) {\n console.error('Error emitting danmuku:', error);\n this.emitting = false;\n }\n }\n lock() {\n const { addClass } = this.utils;\n const { $send } = this.template;\n this.isLock = true;\n let time = this.option.lockTime;\n $send.textContent = time;\n addClass($send, 'apd-lock');\n const loop = ()=>{\n this.timer = setTimeout(()=>{\n if (time === 0) this.unlock();\n else {\n time -= 1;\n $send.textContent = time;\n loop();\n }\n }, 1000);\n };\n loop();\n }\n unlock() {\n const { removeClass } = this.utils;\n const { $send } = this.template;\n clearTimeout(this.timer);\n this.isLock = false;\n $send.textContent = \"\\u53D1\\u9001\";\n removeClass($send, 'apd-lock');\n }\n resize() {\n if (this.outside) return;\n if (this.art.fullscreen) return;\n if (this.art.fullscreenWeb) return;\n const { $player, $controlsCenter } = this.art.template;\n const { $danmuku } = this.template;\n if (this.art.width < this.option.width) this.append($player, $danmuku);\n else this.append($controlsCenter, $danmuku);\n }\n reset() {\n const { inverseClass, tooltip } = this.utils;\n const { $toggle, $colors } = this.template;\n this.slider.opacity.reset();\n this.slider.margin.reset();\n this.slider.fontSize.reset();\n this.slider.speed.reset();\n this.setData('danmukuVisible', this.option.visible);\n this.setData('danmukuMode', this.option.mode);\n this.setData('danmukuColor', this.option.color);\n this.setData('danmukuMode0', this.option.modes.includes(0));\n this.setData('danmukuMode1', this.option.modes.includes(1));\n this.setData('danmukuMode2', this.option.modes.includes(2));\n this.setData('danmukuAntiOverlap', this.option.antiOverlap);\n this.setData('danmukuSyncVideo', this.option.synchronousPlayback);\n this.setData('danmukuTheme', this.option.theme);\n this.setData('danmukuEmitter', this.option.emitter);\n const colors = $colors.children;\n const $color = Array.from(colors).find((item)=>item.dataset.color === this.option.color.toUpperCase());\n $color && inverseClass($color, 'apd-active');\n tooltip($toggle, this.option.visible ? \"\\u5173\\u95ED\\u5F39\\u5E55\" : \"\\u6253\\u5F00\\u5F39\\u5E55\");\n this.resize();\n }\n mount(target) {\n const { errorHandle } = this.utils;\n const $el = typeof target === 'string' ? document.querySelector(target) : target;\n errorHandle($el, `Can not find the mount point: ${target}`);\n this.append($el, this.template.$danmuku);\n this.template.$mount = $el;\n this.reset();\n }\n}\nexports.default = Setting;\nif (typeof document !== 'undefined') {\n const id = 'artplayer-plugin-danmuku';\n let $style = document.getElementById(id);\n if (!$style) {\n $style = document.createElement('style');\n $style.id = id;\n if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', ()=>{\n document.head.appendChild($style);\n });\n else (document.head || document.documentElement).appendChild($style);\n }\n $style.textContent = (0, _styleLessDefault.default);\n}\n\n},{\"bundle-text:./img/check_off.svg\":\"4tC1X\",\"bundle-text:./img/check_on.svg\":\"iQql8\",\"bundle-text:./img/config.svg\":\"DK7bp\",\"bundle-text:./img/mode_0_off.svg\":\"fp5qd\",\"bundle-text:./img/mode_0_on.svg\":\"fYNQe\",\"bundle-text:./img/mode_1_off.svg\":\"gQMgY\",\"bundle-text:./img/mode_1_on.svg\":\"5E8Hg\",\"bundle-text:./img/mode_2_off.svg\":\"89iSb\",\"bundle-text:./img/mode_2_on.svg\":\"2YEb0\",\"bundle-text:./img/off.svg\":\"3WiJz\",\"bundle-text:./img/on.svg\":\"5XkVj\",\"bundle-text:./img/style.svg\":\"h2xX3\",\"bundle-text:./style.less\":\"dHTK8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"5lQoW\"}],\"4tC1X\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" class=\\\"apd-icon apd-check-off\\\" data-pointer=\\\"none\\\" viewBox=\\\"0 0 32 32\\\"><path fill=\\\"#fff\\\" d=\\\"M8 6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2Zm0-2h16c2.21 0 4 1.79 4 4v16c0 2.21-1.79 4-4 4H8c-2.21 0-4-1.79-4-4V8c0-2.21 1.79-4 4-4\\\"/></svg>\";\n\n},{}],\"iQql8\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" class=\\\"apd-icon apd-check-on\\\" data-pointer=\\\"none\\\" viewBox=\\\"0 0 32 32\\\"><path fill=\\\"#00aeec\\\" d=\\\"m13 18.25-1.8-1.8c-.6-.6-1.65-.6-2.25 0s-.6 1.5 0 2.25l2.85 2.85c.318.318.762.468 1.2.448.438.02.882-.13 1.2-.448l8.85-8.85c.6-.6.6-1.65 0-2.25s-1.65-.6-2.25 0ZM8 4h16c2.21 0 4 1.79 4 4v16c0 2.21-1.79 4-4 4H8c-2.21 0-4-1.79-4-4V8c0-2.21 1.79-4 4-4\\\"/></svg>\";\n\n},{}],\"DK7bp\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" class=\\\"apd-icon apd-config-icon\\\" data-pointer=\\\"none\\\" viewBox=\\\"0 0 24 24\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"m15.645 4.881 1.06-1.473a.998.998 0 1 0-1.622-1.166L13.22 4.835a111 111 0 0 0-1.1-.007h-.131q-.705 0-1.515.012L8.783 2.3A.998.998 0 0 0 7.12 3.408l.988 1.484q-1.033.028-2.188.069a4.01 4.01 0 0 0-3.83 3.44q-.246 1.725-.245 4.185-.001 2.947.35 5.116a4.01 4.01 0 0 0 3.763 3.363 100 100 0 0 0 5.513.141.988.988 0 0 0 0-1.975 98 98 0 0 1-5.416-.139 2.04 2.04 0 0 1-1.91-1.708q-.325-1.986-.325-4.798 0-2.344.225-3.904c.14-.977.96-1.713 1.945-1.747q3.666-.13 6.063-.131 2.398 0 6.064.13c.96.034 1.71.81 1.855 1.814.075.524.113 1.962.141 3.065v.002c.005.183.01.07.014-.038.004-.096.008-.189.011-.081a.987.987 0 1 0 1.974-.069c-.004-.105-.007-.009-.011.09a2 2 0 0 1-.007.135l-.002.01a1 1 0 0 1-.005-.091v-.027c-.03-1.118-.073-2.663-.16-3.276-.273-1.906-1.783-3.438-3.74-3.507q-1.357-.048-2.543-.079Zm-3.113 4.703h-1.307v4.643h2.2v.04l.651-1.234c.113-.215.281-.389.482-.509v-.11h.235q.207-.074.433-.074h1.553V9.584h-1.264a8.5 8.5 0 0 0 .741-1.405l-1.078-.381c-.24.631-.501 1.23-.806 1.786h-1.503l.686-.305a8.6 8.6 0 0 0-.806-1.394l-1.034.348c.294.392.566.839.817 1.35Zm-1.7 5.502h2.16l-.564 1.068h-1.595Zm-2.498-1.863.152-1.561h1.96V8.289H7.277v.969h2.048v1.435h-1.84l-.306 3.51h2.254c0 1.155-.043 1.906-.12 2.255-.076.348-.38.523-.925.523-.305 0-.61-.022-.893-.055l.294 1.056.061.005c.282.02.546.039.81.039.991-.065 1.547-.414 1.677-1.046.11-.631.175-1.883.175-3.757Zm5.09-.8v.85h-1.188v-.85h1.187Zm-1.188-.955h1.187v-.893h-1.187Zm2.322.007v-.893h1.241v.893Zm.528 2.757a1.26 1.26 0 0 1 1.087-.627l4.003-.009a1.26 1.26 0 0 1 1.094.63l1.721 2.982c.226.39.225.872-.001 1.263l-1.743 3a1.26 1.26 0 0 1-1.086.628l-4.003.009a1.26 1.26 0 0 1-1.094-.63l-1.722-2.982a1.26 1.26 0 0 1 .002-1.263Zm1.967.858a1.26 1.26 0 0 0-1.08.614l-.903 1.513a1.26 1.26 0 0 0-.002 1.289l.885 1.492c.227.384.64.62 1.086.618l2.192-.005a1.26 1.26 0 0 0 1.08-.615l.904-1.518a1.26 1.26 0 0 0 .001-1.288l-.884-1.489a1.26 1.26 0 0 0-1.086-.616Zm2.517 2.76a1.4 1.4 0 1 1-2.8 0 1.4 1.4 0 0 1 2.8 0\\\" clip-rule=\\\"evenodd\\\"/></svg>\";\n\n},{}],\"fp5qd\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xml:space=\\\"preserve\\\" width=\\\"28\\\" height=\\\"28\\\" class=\\\"apd-icon apd-mode-0-off\\\" data-pointer=\\\"none\\\" viewBox=\\\"0 0 28 28\\\"><path fill=\\\"#00aeec\\\" d=\\\"M23 15c1.487 0 2.866.464 4 1.255V7a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v14a4 4 0 0 0 4 4h11.674A7 7 0 0 1 23 15M11 9h6a1 1 0 0 1 0 2h-6a1 1 0 0 1 0-2m-3 2H6V9h2Zm4 4h-2v-2h2Zm2-1a1 1 0 0 1 1-1h1a1 1 0 0 1 0 2h-1a1 1 0 0 1-1-1\\\"/><path fill=\\\"#00aeec\\\" d=\\\"M26.536 18.464a5 5 0 0 0-7.071 0 5 5 0 0 0 0 7.071 5 5 0 1 0 7.071-7.071m-5.657 5.657a3 3 0 0 1-.586-3.415l4.001 4.001a3 3 0 0 1-3.415-.586m4.829-.827-4.001-4.001a3.002 3.002 0 0 1 4.001 4.001\\\"/></svg>\";\n\n},{}],\"fYNQe\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xml:space=\\\"preserve\\\" width=\\\"28\\\" height=\\\"28\\\" class=\\\"apd-icon apd-mode-0-on\\\" data-pointer=\\\"none\\\" viewBox=\\\"0 0 28 28\\\"><path fill=\\\"#fff\\\" d=\\\"M23 3H5a4 4 0 0 0-4 4v14a4 4 0 0 0 4 4h18a4 4 0 0 0 4-4V7a4 4 0 0 0-4-4M11 9h6a1 1 0 0 1 0 2h-6a1 1 0 0 1 0-2m-3 2H6V9h2Zm4 4h-2v-2h2Zm9 0h-6a1 1 0 0 1 0-2h6a1 1 0 0 1 0 2\\\"/></svg>\";\n\n},{}],\"gQMgY\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xml:space=\\\"preserve\\\" width=\\\"28\\\" height=\\\"28\\\" class=\\\"apd-icon apd-mode-1-off\\\" data-pointer=\\\"none\\\" viewBox=\\\"0 0 28 28\\\"><path fill=\\\"#00aeec\\\" d=\\\"M23 15c1.487 0 2.866.464 4 1.255V7a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v14a4 4 0 0 0 4 4h11.674A7 7 0 0 1 23 15m-4-8h2v2h-2ZM9 9H7V7h2Zm4 0h-2V7h2Zm2-2h2v2h-2Z\\\"/><path fill=\\\"#00aeec\\\" d=\\\"M26.536 18.464a5 5 0 0 0-7.071 0 5 5 0 0 0 0 7.071 5 5 0 1 0 7.071-7.071m-5.657 5.657a3 3 0 0 1-.586-3.415l4.001 4.001a3 3 0 0 1-3.415-.586m4.829-.827-4.001-4.001a3.002 3.002 0 0 1 4.001 4.001\\\"/></svg>\";\n\n},{}],\"5E8Hg\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xml:space=\\\"preserve\\\" width=\\\"28\\\" height=\\\"28\\\" class=\\\"apd-icon apd-mode-1-on\\\" data-pointer=\\\"none\\\" viewBox=\\\"0 0 28 28\\\"><path fill=\\\"#fff\\\" d=\\\"M23 3H5a4 4 0 0 0-4 4v14a4 4 0 0 0 4 4h18a4 4 0 0 0 4-4V7a4 4 0 0 0-4-4M9 9H7V7h2Zm4 0h-2V7h2Zm4 0h-2V7h2Zm4 0h-2V7h2Z\\\"/></svg>\";\n\n},{}],\"89iSb\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xml:space=\\\"preserve\\\" width=\\\"28\\\" height=\\\"28\\\" class=\\\"apd-icon apd-mode-2-off\\\" data-pointer=\\\"none\\\" viewBox=\\\"0 0 28 28\\\"><path fill=\\\"#00aeec\\\" d=\\\"M23 15c1.487 0 2.866.464 4 1.255V7a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v14a4 4 0 0 0 4 4h11.674A7 7 0 0 1 23 15M9 21H7v-2h2Zm4 0h-2v-2h2Z\\\"/><path fill=\\\"#00aeec\\\" d=\\\"M26.536 18.464a5 5 0 0 0-7.071 0 5 5 0 0 0 0 7.071 5 5 0 1 0 7.071-7.071m-5.657 5.657a3 3 0 0 1-.586-3.415l4.001 4.001a3 3 0 0 1-3.415-.586m4.829-.827-4.001-4.001a3.002 3.002 0 0 1 4.001 4.001\\\"/></svg>\";\n\n},{}],\"2YEb0\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xml:space=\\\"preserve\\\" width=\\\"28\\\" height=\\\"28\\\" class=\\\"apd-icon apd-mode-2-on\\\" data-pointer=\\\"none\\\" viewBox=\\\"0 0 28 28\\\"><path fill=\\\"#fff\\\" d=\\\"M23 3H5a4 4 0 0 0-4 4v14a4 4 0 0 0 4 4h18a4 4 0 0 0 4-4V7a4 4 0 0 0-4-4M9 21H7v-2h2Zm4 0h-2v-2h2Zm4 0h-2v-2h2Zm4 0h-2v-2h2Z\\\"/></svg>\";\n\n},{}],\"3WiJz\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" class=\\\"apd-icon apd-toggle-off\\\" data-pointer=\\\"none\\\" viewBox=\\\"0 0 24 24\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"m8.085 4.891-.999-1.499a1.008 1.008 0 0 1 1.679-1.118l1.709 2.566q.81-.012 1.515-.012h.13q.517 0 1.088.007l1.862-2.59a1.008 1.008 0 0 1 1.637 1.177l-1.049 1.46q1.182.03 2.53.078c1.958.069 3.468 1.6 3.74 3.507.088.613.13 2.158.16 3.276l.001.027c.01.333.017.63.025.856a.987.987 0 0 1-1.974.069c-.008-.23-.016-.539-.025-.881v-.002c-.028-1.103-.066-2.541-.142-3.065-.143-1.004-.895-1.78-1.854-1.813a179 179 0 0 0-6.064-.131q-2.397 0-6.063.13a2.04 2.04 0 0 0-1.945 1.748q-.225 1.56-.225 3.904.001 2.811.325 4.798c.154.949.95 1.66 1.91 1.708a98 98 0 0 0 5.416.139.988.988 0 0 1 0 1.975 100 100 0 0 1-5.513-.141A4.01 4.01 0 0 1 2.197 17.7q-.353-2.169-.351-5.116-.001-2.46.245-4.184A4.01 4.01 0 0 1 5.92 4.96q1.142-.04 2.164-.069Zm4.436 4.707h-1.32v4.63h2.222v.848h-2.618v1.078h2.431a5.01 5.01 0 0 1 3.575-3.115V9.598h-1.276a8.6 8.6 0 0 0 .748-1.42l-1.089-.384a14 14 0 0 1-.814 1.804h-1.518l.693-.308a9 9 0 0 0-.814-1.408l-1.045.352c.297.396.572.847.825 1.364m-4.18 3.564.154-1.485h1.98V8.289h-3.2v.979h2.067v1.43H7.483l-.308 3.454h2.277c0 1.166-.044 1.925-.12 2.277-.078.352-.386.528-.936.528-.308 0-.616-.022-.902-.055l.297 1.067.062.004c.285.02.551.04.818.04 1.001-.066 1.562-.418 1.694-1.056.11-.638.176-1.903.176-3.795Zm7.458.11v-.858h-1.254v.858H15.8Zm-2.376-.858v.858h-1.199v-.858h1.2Zm-1.199-.946h1.2v-.902h-1.2Zm2.321 0v-.902H15.8v.902h-1.254Zm3.517 10.594a4 4 0 1 0 0-8 4 4 0 0 0 0 8m-.002-1.502a2.5 2.5 0 0 1-2.217-3.657l3.326 3.398a2.5 2.5 0 0 1-1.109.259m2.5-2.5c0 .42-.103.815-.286 1.162l-3.328-3.401a2.5 2.5 0 0 1 3.614 2.239\\\" clip-rule=\\\"evenodd\\\"/></svg>\";\n\n},{}],\"5XkVj\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" class=\\\"apd-icon apd-toggle-on\\\" data-pointer=\\\"none\\\" viewBox=\\\"0 0 24 24\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M11.989 4.828q-.705 0-1.515.012l-1.71-2.566a1.008 1.008 0 0 0-1.678 1.118l.999 1.5q-1.022.027-2.164.068a4.01 4.01 0 0 0-3.83 3.44q-.246 1.725-.245 4.185-.001 2.947.35 5.116a4.01 4.01 0 0 0 3.763 3.363l.906.046c1.205.063 1.808.095 3.607.095a.988.988 0 0 0 0-1.975c-1.758 0-2.339-.03-3.501-.092l-.915-.047a2.04 2.04 0 0 1-1.91-1.708q-.325-1.987-.325-4.798 0-2.344.225-3.904c.14-.977.96-1.713 1.945-1.747q3.666-.13 6.063-.131 2.398 0 6.064.13c.96.034 1.71.81 1.855 1.814.075.524.113 1.962.141 3.065v.002c.01.342.017.65.025.88a.987.987 0 1 0 1.974-.068c-.008-.226-.016-.523-.025-.856v-.027c-.03-1.118-.073-2.663-.16-3.276-.273-1.906-1.783-3.438-3.74-3.507q-1.35-.048-2.531-.078l1.05-1.46a1.008 1.008 0 0 0-1.638-1.177l-1.862 2.59q-.571-.006-1.088-.007Zm.521 4.775h-1.32v4.631h2.222v.847h-2.618v1.078h2.618l.003.678c.36.026.714.163 1.01.407h.11v-1.085h2.694v-1.078h-2.695v-.847H16.8v-4.63h-1.276a8.6 8.6 0 0 0 .748-1.42L15.183 7.8a14 14 0 0 1-.814 1.804h-1.518l.693-.308a9 9 0 0 0-.814-1.408l-1.045.352c.297.396.572.847.825 1.364Zm-4.18 3.564.154-1.485h1.98V8.294h-3.2v.98H9.33v1.43H7.472l-.308 3.453h2.277c0 1.166-.044 1.925-.12 2.277-.078.352-.386.528-.936.528-.308 0-.616-.022-.902-.055l.297 1.067.062.005c.285.02.551.04.818.04 1.001-.067 1.562-.419 1.694-1.057.11-.638.176-1.903.176-3.795Zm7.458.11v-.858h-1.254v.858Zm-2.376-.858v.858h-1.199v-.858h1.2Zm-1.199-.946h1.2v-.902h-1.2Zm2.321 0v-.902h1.254v.902Z\\\" clip-rule=\\\"evenodd\\\"/><path fill=\\\"#00aeec\\\" fill-rule=\\\"evenodd\\\" d=\\\"M22.846 14.627a1 1 0 0 0-1.412.075l-5.091 5.703-2.216-2.275-.097-.086-.008-.005a1 1 0 0 0-1.322 1.493l2.963 3.041.093.083.007.005a1 1 0 0 0 1.354-.124l5.81-6.505.08-.102.005-.008a1 1 0 0 0-.166-1.295\\\" clip-rule=\\\"evenodd\\\"/></svg>\";\n\n},{}],\"h2xX3\":[function(require,module,exports,__globalThis) {\nmodule.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xml:space=\\\"preserve\\\" width=\\\"36\\\" height=\\\"24\\\" class=\\\"apd-icon apd-style-icon\\\" data-pointer=\\\"none\\\" viewBox=\\\"0 0 22 22\\\"><path d=\\\"M17 16H5c-.55 0-1 .45-1 1s.45 1 1 1h12c.55 0 1-.45 1-1s-.45-1-1-1M6.96 15c.39 0 .74-.24.89-.6l.65-1.6h5l.66 1.6c.15.36.5.6.89.6.69 0 1.15-.71.88-1.34l-3.88-8.97C11.87 4.27 11.46 4 11 4s-.87.27-1.05.69l-3.88 8.97c-.27.63.2 1.34.89 1.34M11 5.98 12.87 11H9.13Z\\\"/></svg>\";\n\n},{}],\"dHTK8\":[function(require,module,exports,__globalThis) {\nmodule.exports = \".artplayer-plugin-danmuku{z-index:99;color:#fff;flex-shrink:0;justify-content:center;align-items:center;gap:10px;width:100%;height:32px;font-size:12px;font-weight:300;display:flex;position:relative}.artplayer-plugin-danmuku .apd-icon{cursor:pointer;opacity:.75;fill:#fff;transition:all .2s}.artplayer-plugin-danmuku .apd-icon:hover{opacity:1}.artplayer-plugin-danmuku .apd-config{display:flex;position:relative}.artplayer-plugin-danmuku .apd-config .apd-config-panel{opacity:0;pointer-events:none;width:320px;padding:10px;position:absolute;bottom:24px;left:0}.artplayer-plugin-danmuku .apd-config .apd-config-panel .apd-config-panel-inner{background-color:#000000d9;border-radius:3px;width:100%;padding:10px}.artplayer-plugin-danmuku .apd-config:hover .apd-config-panel{opacity:100;pointer-events:all}.artplayer-plugin-danmuku .apd-config-mode,.artplayer-plugin-danmuku .apd-config-slider,.artplayer-plugin-danmuku .apd-config-other,.artplayer-plugin-danmuku .apd-style-mode{margin-bottom:15px}.artplayer-plugin-danmuku .apd-modes{align-items:center;gap:20px;margin-top:5px;display:flex}.artplayer-plugin-danmuku .apd-modes .apd-mode{cursor:pointer;text-align:center}.artplayer-plugin-danmuku .apd-modes .apd-mode:hover{color:#00a1d6}.artplayer-plugin-danmuku .apd-config-slider{align-items:center;gap:12px;display:flex}.artplayer-plugin-danmuku .apd-config-slider .apd-value{text-align:right;width:32px}.artplayer-plugin-danmuku .apd-slider{cursor:pointer;flex:1;justify-content:center;align-items:center;height:20px;display:flex;position:relative}.artplayer-plugin-danmuku .apd-slider .apd-slider-line{background-color:#ffffff40;border-radius:3px;width:100%;height:2px;position:relative;overflow:hidden}.artplayer-plugin-danmuku .apd-slider .apd-slider-points{justify-content:space-between;align-items:center;display:flex;position:absolute;inset:0}.artplayer-plugin-danmuku .apd-slider .apd-slider-points .apd-slider-point{background-color:#ffffff80;border-radius:50%;width:2px;height:2px}.artplayer-plugin-danmuku .apd-slider .apd-slider-progress{background-color:#00a1d6;width:0%;height:100%}.artplayer-plugin-danmuku .apd-slider .apd-slider-dot{background-color:#00a1d6;border-radius:50%;width:12px;height:12px;position:absolute;left:0%;transform:translate(-6px)}.artplayer-plugin-danmuku .apd-slider .apd-slider-steps{color:#777;justify-content:space-between;align-items:center;width:calc(100% + 32px);display:flex;position:absolute;bottom:-12px}.artplayer-plugin-danmuku .apd-slider .apd-slider-steps .apd-slider-step{text-align:center;flex-shrink:0;width:36px;scale:.95}.artplayer-plugin-danmuku .apd-config-other{align-items:center;gap:20px;display:flex}.artplayer-plugin-danmuku .apd-config-other .apd-check-off,.artplayer-plugin-danmuku .apd-config-other .apd-check-on{width:16px;height:16px}.artplayer-plugin-danmuku .apd-config-other .apd-other{cursor:pointer;align-items:center;gap:2px;display:flex}.artplayer-plugin-danmuku .apd-config-other .apd-other:hover{color:#00a1d6}.artplayer-plugin-danmuku .apd-emitter{background-color:#ffffff40;border-radius:5px;flex:1;align-items:center;height:100%;display:flex}.artplayer-plugin-danmuku .apd-style{justify-content:center;align-items:center;display:flex;position:relative}.artplayer-plugin-danmuku .apd-style .apd-style-panel{opacity:0;pointer-events:none;width:200px;padding:10px;position:absolute;bottom:24px;left:0}.artplayer-plugin-danmuku .apd-style .apd-style-panel .apd-style-panel-inner{background-color:#000000d9;border-radius:3px;width:100%;padding:10px}.artplayer-plugin-danmuku .apd-style:hover .apd-style-panel{opacity:100;pointer-events:all}.artplayer-plugin-danmuku .apd-colors{flex-wrap:wrap;gap:8px;margin-top:5px;display:flex}.artplayer-plugin-danmuku .apd-colors .apd-color{cursor:pointer;border-radius:2px;width:16px;height:16px}.artplayer-plugin-danmuku .apd-colors .apd-color.apd-active{border:1px solid #000;box-shadow:0 0 0 1px #fff}.artplayer-plugin-danmuku .apd-input{color:#fff;background-color:#0000;border:none;outline:none;flex:1;width:auto;min-width:0;height:100%;line-height:1}.artplayer-plugin-danmuku .apd-input::placeholder{color:#ffffff80}.artplayer-plugin-danmuku .apd-send{cursor:pointer;width:60px;height:100%;text-shadow:none;background-color:#00a1d6;border-top-right-radius:5px;border-bottom-right-radius:5px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.artplayer-plugin-danmuku .apd-send.apd-lock{cursor:not-allowed;color:#666;background-color:#e7e7e7}.art-controls-center .apd-emitter{flex:none;width:260px}.art-fullscreen .artplayer-plugin-danmuku,.art-fullscreen-web .artplayer-plugin-danmuku{gap:16px;height:38px}.art-fullscreen .artplayer-plugin-danmuku .apd-config-icon,.art-fullscreen-web .artplayer-plugin-danmuku .apd-config-icon,.art-fullscreen .artplayer-plugin-danmuku .apd-toggle-off,.art-fullscreen-web .artplayer-plugin-danmuku .apd-toggle-off,.art-fullscreen .artplayer-plugin-danmuku .apd-toggle-on,.art-fullscreen-web .artplayer-plugin-danmuku .apd-toggle-on{width:28px;height:28px}.art-fullscreen .artplayer-plugin-danmuku .apd-emitter,.art-fullscreen-web .artplayer-plugin-danmuku .apd-emitter{flex:none;width:400px}.art-video-player>.artplayer-plugin-danmuku{padding:0 10px;position:absolute;bottom:-40px;left:0;right:0}.art-video-player:has(>.artplayer-plugin-danmuku){margin-bottom:40px}[data-danmuku-emitter=false] .apd-emitter{display:none!important}[data-danmuku-emitter=false] .art-controls-center .artplayer-plugin-danmuku{justify-content:flex-end;gap:18px}[data-danmuku-emitter=false].art-fullscreen .art-controls-center .artplayer-plugin-danmuku,[data-danmuku-emitter=false].art-fullscreen-web .art-controls-center .artplayer-plugin-danmuku{gap:24px}[data-danmuku-theme=light]>.artplayer-plugin-danmuku .apd-icon{fill:#333}[data-danmuku-theme=light]>.artplayer-plugin-danmuku .apd-emitter{background-color:#f1f2f3}[data-danmuku-theme=light]>.artplayer-plugin-danmuku .apd-input{color:#000}[data-danmuku-theme=light]>.artplayer-plugin-danmuku .apd-input::placeholder{color:#0000004d}[data-danmuku-visible=false] .apd-toggle-off{display:block}[data-danmuku-visible=false] .apd-toggle-on,[data-danmuku-visible=true] .apd-toggle-off{display:none}[data-danmuku-visible=true] .apd-toggle-on{display:block}[data-danmuku-anti-overlap=false] .apd-anti-overlap .apd-check-on{display:none}[data-danmuku-anti-overlap=false] .apd-anti-overlap .apd-check-off,[data-danmuku-anti-overlap=true] .apd-anti-overlap .apd-check-on{display:block}[data-danmuku-anti-overlap=true] .apd-anti-overlap .apd-check-off,[data-danmuku-sync-video=false] .apd-sync-video .apd-check-on{display:none}[data-danmuku-sync-video=false] .apd-sync-video .apd-check-off,[data-danmuku-sync-video=true] .apd-sync-video .apd-check-on{display:block}[data-danmuku-sync-video=true] .apd-sync-video .apd-check-off{display:none}[data-danmuku-mode0=false] .apd-config-mode .apd-mode-0-off{display:block}[data-danmuku-mode0=false] .apd-config-mode .apd-mode-0-on{display:none}[data-danmuku-mode0=false] .art-danmuku [data-mode=\\\"0\\\"]{opacity:0!important}[data-danmuku-mode0=true] .apd-config-mode .apd-mode-0-off{display:none}[data-danmuku-mode0=true] .apd-config-mode .apd-mode-0-on{display:block}[data-danmuku-mode=\\\"0\\\"] .apd-style-mode [data-mode=\\\"0\\\"]{color:#00a1d6}[data-danmuku-mode=\\\"0\\\"] .apd-style-mode [data-mode=\\\"0\\\"] path{fill:#00a1d6}[data-danmuku-mode1=false] .apd-config-mode .apd-mode-1-off{display:block}[data-danmuku-mode1=false] .apd-config-mode .apd-mode-1-on{display:none}[data-danmuku-mode1=false] .art-danmuku [data-mode=\\\"1\\\"]{opacity:0!important}[data-danmuku-mode1=true] .apd-config-mode .apd-mode-1-off{display:none}[data-danmuku-mode1=true] .apd-config-mode .apd-mode-1-on{display:block}[data-danmuku-mode=\\\"1\\\"] .apd-style-mode [data-mode=\\\"1\\\"]{color:#00a1d6}[data-danmuku-mode=\\\"1\\\"] .apd-style-mode [data-mode=\\\"1\\\"] path{fill:#00a1d6}[data-danmuku-mode2=false] .apd-config-mode .apd-mode-2-off{display:block}[data-danmuku-mode2=false] .apd-config-mode .apd-mode-2-on{display:none}[data-danmuku-mode2=false] .art-danmuku [data-mode=\\\"2\\\"]{opacity:0!important}[data-danmuku-mode2=true] .apd-config-mode .apd-mode-2-off{display:none}[data-danmuku-mode2=true] .apd-config-mode .apd-mode-2-on{display:block}[data-danmuku-mode=\\\"2\\\"] .apd-style-mode [data-mode=\\\"2\\\"]{color:#00a1d6}[data-danmuku-mode=\\\"2\\\"] .apd-style-mode [data-mode=\\\"2\\\"] path{fill:#00a1d6}\";\n\n},{}]},[\"6ZbtA\"], \"6ZbtA\", \"parcelRequire4dc0\", {})\nlet {default: _default, } = parcelRequire4dc0(\"6ZbtA\");\nexport {_default as default, };\n\n//# sourceMappingURL=index.js.map\n","import Danmuku from './danmuku'\nimport heatmap from './heatmap'\nimport Setting from './setting'\n\nexport default function artplayerPluginDanmuku(option) {\n return (art) => {\n const danmuku = new Danmuku(art, option)\n const setting = new Setting(art, danmuku)\n\n if (danmuku.option.heatmap) {\n heatmap(art, danmuku, danmuku.option.heatmap)\n }\n\n return {\n name: 'artplayerPluginDanmuku',\n emit: danmuku.emit.bind(danmuku),\n load: danmuku.load.bind(danmuku),\n config: danmuku.config.bind(danmuku),\n hide: danmuku.hide.bind(danmuku),\n show: danmuku.show.bind(danmuku),\n reset: danmuku.reset.bind(danmuku),\n mount: setting.mount.bind(setting),\n get option() {\n return danmuku.option\n },\n get isHide() {\n return danmuku.isHide\n },\n get isStop() {\n return danmuku.isStop\n },\n }\n }\n}\n\nartplayerPluginDanmuku.icons = Setting.icons\n\nif (typeof window !== 'undefined') {\n window.artplayerPluginDanmuku = artplayerPluginDanmuku\n}\n","import workerText from 'bundle-text:./worker'\nimport { bilibiliDanmuParseFromUrl } from './bilibili'\n\nexport default class Danmuku {\n constructor(art, option) {\n const { constructor, template } = art\n\n this.utils = constructor.utils // 工具库\n this.validator = constructor.validator // 配置校验器\n this.$danmuku = template.$danmuku // 弹幕层容器\n this.$player = template.$player // 播放器容器\n\n this.art = art\n this.queue = [] // 实际弹幕队列\n this.$refs = [] // 弹幕DOM节点池\n this.isStop = false // 是否停止\n this.isHide = false // 是否隐藏\n this.timer = null // 定时器\n this.index = 0 // 弹幕索引\n\n // 格式化后的配置项\n this.option = Danmuku.option\n\n // 弹幕状态池\n this.states = { wait: [], ready: [], emit: [], stop: [] }\n\n // 初始化配置\n this.config(option, true)\n\n // 创建 Web Worker, 用于计算弹幕的 top 值\n const workerText2 = workerText.replace('export{e as default};', '')\n const blob = new Blob([workerText2], { type: 'application/javascript' })\n this.worker = new Worker(URL.createObjectURL(blob))\n\n // 绑定公用事件\n this.start = this.start.bind(this)\n this.stop = this.stop.bind(this)\n this.reset = this.reset.bind(this)\n this.resize = this.resize.bind(this)\n this.destroy = this.destroy.bind(this)\n\n // 监听事件\n art.on('video:play', this.start)\n art.on('video:playing', this.start)\n art.on('video:pause', this.stop)\n art.on('video:waiting', this.stop)\n art.on('destroy', this.destroy)\n art.on('resize', this.resize)\n\n // 开始加载弹幕\n this.load()\n }\n\n // 默认配置\n static get option() {\n return {\n danmuku: [], // 弹幕数据\n speed: 5, // 弹幕持续时间,范围在[1 ~ 10]\n margin: [10, '25%'], // 弹幕上下边距,支持像素数字和百分比\n opacity: 1, // 弹幕透明度,范围在[0 ~ 1]\n color: '#FFFFFF', // 默认弹幕颜色,可以被单独弹幕项覆盖\n mode: 0, // 默认弹幕模式: 0: 滚动,1: 顶部,2: 底部\n modes: [0, 1, 2], // 弹幕可见的模式\n fontSize: 25, // 弹幕字体大小,支持像素数字和百分比\n antiOverlap: true, // 弹幕是否防重叠\n synchronousPlayback: false, // 是否同步播放速度\n mount: undefined, // 弹幕发射器挂载点, 默认为播放器控制栏中部\n heatmap: false, // 是否开启热力图\n width: 512, // 当播放器宽度小于此值时,弹幕发射器置于播放器底部\n points: [], // 热力图数据\n filter: () => true, // 弹幕载入前的过滤器,只支持返回布尔值\n beforeEmit: () => true, // 弹幕发送前的过滤器,支持返回 Promise\n beforeVisible: () => true, // 弹幕显示前的过滤器,支持返回 Promise\n visible: true, // 弹幕层是否可见\n emitter: true, // 是否开启弹幕发射器\n maxLength: 200, // 弹幕输入框最大长度, 范围在[1 ~ 1000]\n lockTime: 5, // 输入框锁定时间,范围在[1 ~ 60]\n theme: 'dark', // 弹幕主题,支持 dark 和 light,只在自定义挂载时生效\n OPACITY: {}, // 不透明度配置项\n FONT_SIZE: {}, // 弹幕字号配置项\n MARGIN: {}, // 显示区域配置项\n SPEED: {}, // 弹幕速度配置项\n COLOR: [], // 颜色列表配置项\n }\n }\n\n // 配置校验\n static get scheme() {\n return {\n danmuku: 'array|function|string',\n speed: 'number',\n margin: 'array',\n opacity: 'number',\n color: 'string',\n mode: 'number',\n modes: 'array',\n fontSize: 'number|string',\n antiOverlap: 'boolean',\n synchronousPlayback: 'boolean',\n mount: '?htmldivelement|string',\n heatmap: 'object|boolean',\n width: 'number',\n points: 'array',\n filter: 'function',\n beforeEmit: 'function',\n beforeVisible: 'function',\n visible: 'boolean',\n emitter: 'boolean',\n maxLength: 'number',\n lockTime: 'number',\n theme: 'string',\n OPACITY: 'object',\n FONT_SIZE: 'object',\n MARGIN: 'object',\n SPEED: 'object',\n COLOR: 'array',\n }\n }\n\n // 初始弹幕样式\n static get cssText() {\n return `\n user-select: none;\n position: absolute;\n white-space: pre;\n pointer-events: none;\n perspective: 500px;\n display: inline-block;\n will-change: transform;\n font-weight: normal;\n line-height: 1.125;\n visibility: hidden;\n font-family: SimHei, \"Microsoft JhengHei\", Arial, Helvetica, sans-serif;\n text-shadow: rgb(0, 0, 0) 1px 0px 1px, rgb(0, 0, 0) 0px 1px 1px, rgb(0, 0, 0) 0px -1px 1px, rgb(0, 0, 0) -1px 0px 1px;\n `\n }\n\n // 是否在移动端使用了自动旋屏,会影响弹幕的left和top值\n get isRotate() {\n return this.art.plugins?.autoOrientation?.state\n }\n\n // 计算上空白边距\n get marginTop() {\n const { clamp } = this.utils\n const value = this.option.margin[0]\n const { clientHeight } = this.$player\n\n if (typeof value === 'number') {\n return clamp(value, 0, clientHeight)\n }\n\n if (typeof value === 'string' && value.endsWith('%')) {\n const ratio = Number.parseFloat(value) / 100\n return clamp(clientHeight * ratio, 0, clientHeight)\n }\n\n return Danmuku.option.margin[0]\n }\n\n // 计算下空白边距\n get marginBottom() {\n const { clamp } = this.utils\n const value = this.option.margin[1]\n const { clientHeight } = this.$player\n\n if (typeof value === 'number') {\n return clamp(value, 0, clientHeight)\n }\n\n if (typeof value === 'string' && value.endsWith('%')) {\n const ratio = Number.parseFloat(value) / 100\n return clamp(clientHeight * ratio, 0, clientHeight)\n }\n\n return Danmuku.option.margin[1]\n }\n\n // 计算弹幕字体大小\n get fontSize() {\n const { clamp } = this.utils\n const { clientHeight } = this.$player\n\n const fontSize = this.option.fontSize\n\n if (typeof fontSize === 'number') {\n return Math.round(clamp(fontSize, 12, clientHeight))\n }\n\n if (typeof fontSize === 'string' && fontSize.endsWith('%')) {\n const ratio = Number.parseFloat(fontSize) / 100\n return Math.round(clamp(clientHeight * ratio, 12, clientHeight))\n }\n\n return Danmuku.option.fontSize\n }\n\n // 获取弹幕DOM节点\n get $ref() {\n const $ref = this.$refs.pop() || document.createElement('div')\n $ref.style.cssText = Danmuku.cssText\n $ref.dataset.mode = ''\n $ref.dataset.id = ''\n $ref.className = ''\n return $ref\n }\n\n // 获取准备好发送的弹幕\n get readys() {\n const { currentTime } = this.art\n\n const result = []\n\n // 有的是ready状态:之前因为弹幕太多而暂停发送的弹幕\n this.filter('ready', danmu => result.push(danmu))\n\n // 有的是wait状态:符合时间范围的弹幕\n this.filter('wait', (danmu) => {\n if (currentTime + 0.1 >= danmu.time && danmu.time >= currentTime - 0.1) {\n result.push(danmu)\n }\n })\n\n return result\n }\n\n // 可见的弹幕的数据,用于计算下一个弹幕的top值\n get visibles() {\n const result = []\n const { clientWidth } = this.$player\n const clientLeft = this.getLeft(this.$player)\n\n this.filter('emit', (danmu) => {\n const top = danmu.$ref.offsetTop\n const left = this.getLeft(danmu.$ref) - clientLeft\n const height = danmu.$ref.clientHeight\n const width = danmu.$ref.clientWidth\n const distance = left + width\n const right = clientWidth - distance\n const speed = distance / danmu.$restTime\n\n const emit = {}\n emit.top = top\n emit.left = left\n emit.height = height\n emit.width = width\n emit.right = right\n emit.speed = speed\n emit.distance = distance\n emit.time = danmu.$restTime\n emit.mode = danmu.mode\n\n result.push(emit)\n })\n\n return result\n }\n\n // 计算弹幕速度\n get speed() {\n return this.option.synchronousPlayback && this.art.playbackRate\n ? this.option.speed / Number(this.art.playbackRate)\n : this.option.speed\n }\n\n // 加载弹幕\n async load(danmuku) {\n const { errorHandle } = this.utils\n\n let danmus = []\n const target = danmuku || this.option.danmuku\n\n try {\n if (typeof target === 'function') {\n danmus = await target() // 异步函数获取\n }\n else if (target instanceof Promise) {\n danmus = await target // 从 Promise 对象获取\n }\n else if (typeof target === 'string') {\n danmus = await bilibiliDanmuParseFromUrl(target) // 从B站xml链接解析\n }\n else if (Array.isArray(target)) {\n danmus = target // 直接传入数组\n }\n\n errorHandle(Array.isArray(danmus), 'Danmuku need return an array as result')\n\n // 假如没有传入弹幕参数,则清空弹幕,否则追加弹幕\n if (danmuku === undefined) {\n this.reset() // 重置弹幕\n this.queue = [] // 清空弹幕队列\n this.states = { wait: [], ready: [], emit: [], stop: [] } // 清空弹幕状态池\n this.$refs = [] // 清空弹幕DOM节点池\n this.$danmuku.textContent = '' // 清空弹幕层\n }\n\n // 逐个验证原始弹幕并转换到弹幕队列\n for (let index = 0; index < danmus.length; index++) {\n const danmu = danmus[index]\n await this.emit(danmu)\n }\n\n this.art.emit('artplayerPluginDanmuku:loaded', this.queue)\n }\n catch (error) {\n this.art.emit('artplayerPluginDanmuku:error', error)\n throw error\n }\n\n return this\n }\n\n // 把原始弹幕转换到弹幕队列\n async emit(danmu) {\n const { clamp } = this.utils\n\n this.validator(danmu, {\n id: '?string', // 弹幕唯一标识\n text: 'string', // 弹幕文本\n mode: '?number', // 弹幕模式: 0: 滚动,1: 顶部,2: 底部\n color: '?string', // 弹幕颜色\n time: '?number', // 弹幕时间\n border: '?boolean', // 弹幕是否有边框\n style: '?object', // 弹幕额外样式\n })\n\n // 弹幕文本为空则直接忽略\n if (!danmu.text.trim())\n return this\n\n // 设置弹幕时间,如果没有则默认为当前时间加 0.5 秒\n if (danmu.time) {\n danmu.time = clamp(danmu.time, 0, Infinity)\n }\n else {\n danmu.time = this.art.currentTime + 0.5\n }\n\n // 设置弹幕模式,如果没有则默认为全局配置\n if (danmu.mode === undefined) {\n danmu.mode = this.option.mode\n }\n\n // 设置弹幕单独样式,如果没有则默认为空对象\n if (danmu.style === undefined) {\n danmu.style = {}\n }\n\n // 设置弹幕颜色,如果没有则默认为全局配置\n if (danmu.color === undefined) {\n danmu.color = this.option.color\n }\n\n // 弹幕模式只能是 0, 1, 2\n if (![0, 1, 2].includes(danmu.mode))\n return this\n\n // 自定义弹幕过滤函数\n if (!this.option.filter(danmu))\n return this\n\n // 添加自定义属性\n const item = {\n ...danmu,\n $state: 'wait', // 弹幕初始状态\n $index: this.index++, // 弹幕索引\n $ref: null, // 弹幕 DOM 节点\n $restTime: 0, // 弹幕剩余时间\n $lastStartTime: 0, // 弹幕上次开始时间\n }\n\n // 转换为wait状态\n this.setState(item, 'wait')\n\n // 添加到实际弹幕队列\n this.queue.push(item)\n\n // 弹幕有四个状态:\n // - wait: 弹幕还未开始显示,没有被添加到 DOM 中\n // - ready: 弹幕准备好显示,没有被添加到 DOM 中\n // - emit: 弹幕正在显示,已经被添加到 DOM 中\n // - stop: 弹幕正在停止显示,已经被添加到 DOM 中\n\n return this\n }\n\n // 动态配置\n config(option, isInit = false) {\n const { clamp } = this.utils\n const { $controlsCenter } = this.art.template\n\n // 判断配置项是否有变化\n const changed = Object.keys(option).some(\n key => JSON.stringify(this.option[key]) !== JSON.stringify(option[key]),\n )\n\n // 没有变化则直接返回\n if (!changed && !isInit)\n return this\n\n // 更新配置项\n this.option = Object.assign({}, Danmuku.option, this.option, option)\n this.validator(this.option, Danmuku.scheme)\n\n this.option.mode = clamp(this.option.mode, 0, 2)\n this.option.speed = clamp(this.option.speed, 1, 10)\n this.option.opacity = clamp(this.option.opacity, 0, 1)\n this.option.lockTime = clamp(this.option.lockTime, 1, 60)\n this.option.maxLength = clamp(this.option.maxLength, 1, 1000)\n this.option.mount = this.option.mount || $controlsCenter\n\n // 动态配置有字体大小,需要重新渲染\n if (option.fontSize) {\n this.reset()\n }\n\n // 通过配置项控制弹幕的显示和隐藏\n if (this.option.visible) {\n this.show()\n }\n else {\n this.hide()\n }\n\n this.art.emit('artplayerPluginDanmuku:config', this.option)\n\n return this\n }\n\n // 计算DOM的left值,受到旋屏影响\n getLeft($ref) {\n const rect = $ref.getBoundingClientRect()\n return this.isRotate ? rect.top : rect.left\n }\n\n // 复杂运算交给 Web Worker 处理\n postMessage(message = {}) {\n return new Promise((resolve) => {\n message.id = Date.now() // 生成唯一标识\n this.worker.postMessage(message)\n this.worker.onmessage = (event) => {\n const { data } = event\n // 判断是否是当前的消息\n if (data.id === message.id) {\n resolve(data)\n }\n }\n })\n }\n\n // 根据状态获取弹幕\n filter(state, callback) {\n const danmus = this.states[state] || []\n for (let index = 0; index < danmus.length; index++) {\n callback(danmus[index])\n }\n return danmus\n }\n\n // 设置弹幕状态\n setState(danmu, state) {\n // 从原状态池中删除\n this.states[danmu.$state] = this.states[danmu.$state].filter(item => item !== danmu)\n\n // 设置新状态\n danmu.$state = state\n\n // 设置DOM节点状态\n if (danmu.$ref) {\n danmu.$ref.dataset.state = state\n }\n\n // 添加到新状态池中\n this.states[state].push(danmu)\n }\n\n // 重置弹幕到wait状态,回收弹幕DOM节点\n makeWait(danmu) {\n this.setState(danmu, 'wait')\n if (danmu.$ref) {\n danmu.$ref.style.cssText = Danmuku.cssText\n danmu.$ref.style.visibility = 'hidden'\n danmu.$ref.style.marginLeft = '0px'\n danmu.$ref.style.transform = 'translateX(0px)'\n danmu.$ref.style.transition = 'transform 0s linear 0s'\n this.$refs.push(danmu.$ref)\n danmu.$ref = null\n }\n }\n\n // 实时更新弹幕\n update() {\n const { setStyles } = this.utils\n\n this.timer = window.requestAnimationFrame(async () => {\n if (this.art.playing && !this.isHide) {\n // 实时计算弹幕的剩余显示时间\n this.filter('emit', (danmu) => {\n const emitTime = (Date.now() - danmu.$lastStartTime) / 1000\n danmu.$restTime -= emitTime\n danmu.$lastStartTime = Date.now()\n // 超过时间即重置弹幕\n if (danmu.$restTime <= 0) {\n this.makeWait(danmu)\n }\n })\n\n // 获取准备好发送的弹幕,可能包含ready和wait状态的弹幕\n const readys = this.readys\n\n for (let index = 0; index < readys.length; index++) {\n const danmu = readys[index]\n\n // 弹幕发送前的过滤器\n const state = await this.option.beforeVisible(danmu)\n\n if (state) {\n const { clientWidth, clientHeight } = this.$player\n danmu.$ref = this.$ref // 获取弹幕DOM节点\n danmu.$ref.textContent = danmu.text // 设置弹幕文本\n\n // 提前添加到弹幕层中,用于计算top值\n this.$danmuku.appendChild(danmu.$ref)\n\n // 设置初始弹幕样式\n danmu.$ref.style.opacity = this.option.opacity\n danmu.$ref.style.fontSize = `${this.fontSize}px`\n danmu.$ref.style.color = danmu.color\n danmu.$ref.style.border = danmu.border ? `1px solid ${danmu.color}` : null\n danmu.$ref.style.backgroundColor = danmu.border ? 'rgb(0 0 0 / 50%)' : null\n\n // 设置单独弹幕样式\n setStyles(danmu.$ref, danmu.style)\n\n // 记录弹幕时间戳\n danmu.$lastStartTime = Date.now()\n\n // 计算弹幕剩余时间\n danmu.$restTime = this.speed\n\n // 计算弹幕滚动的距离\n const distance = clientWidth + danmu.$ref.clientWidth\n\n // 计算弹幕的top值\n const { result: top } = await this.postMessage({\n type: 'getDanmuTop',\n target: {\n mode: danmu.mode,\n height: danmu.$ref.clientHeight,\n speed: distance / danmu.$restTime,\n }, // 当前弹幕信息\n visibles: this.visibles, // 可见的弹幕的数据\n antiOverlap: this.option.antiOverlap,\n clientWidth,\n clientHeight,\n marginBottom: this.marginBottom,\n marginTop: this.marginTop,\n })\n\n if (danmu.$ref) {\n if (!this.isStop && top !== undefined) {\n this.setState(danmu, 'emit') // 转换为emit状态\n danmu.$ref.style.top = `${top}px`\n danmu.$ref.style.visibility = 'visible'\n danmu.$ref.dataset.mode = danmu.mode // CSS控制模式的显示和隐藏\n danmu.$ref.dataset.id = danmu.id || '' // 用于悬停的唯一标识\n\n switch (danmu.mode) {\n // 滚动的弹幕\n case 0: {\n danmu.$ref.style.left = `${clientWidth}px`\n danmu.$ref.style.marginLeft = '0px'\n danmu.$ref.style.transform = `translateX(${-distance}px)`\n danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`\n break\n }\n case 1:\n // falls through\n case 2:\n danmu.$ref.style.left = '50%'\n danmu.$ref.style.marginLeft = `-${danmu.$ref.clientWidth / 2}px`\n break\n default:\n break\n }\n\n this.art.emit('artplayerPluginDanmuku:visible', danmu)\n }\n else {\n // 假如弹幕已经停止或者没有 top 值,则重置弹幕为ready状态,回收弹幕DOM节点,等待下次发送\n this.setState(danmu, 'ready')\n this.$refs.push(danmu.$ref)\n danmu.$ref = null\n }\n }\n }\n }\n }\n\n // 递归调用\n if (!this.isStop) {\n this.update()\n }\n })\n return this\n }\n\n // 重置正在显示的弹幕: stop/emit 状态的弹幕\n resize() {\n const { clientWidth } = this.$player\n\n this.filter('stop', (danmu) => {\n switch (danmu.mode) {\n // 滚动的弹幕\n case 0:\n danmu.$ref.style.left = `${clientWidth}px`\n break\n default:\n break\n }\n })\n\n this.filter('emit', (danmu) => {\n danmu.$lastStartTime = Date.now()\n switch (danmu.mode) {\n // 滚动的弹幕\n case 0: {\n const distance = clientWidth + danmu.$ref.clientWidth\n danmu.$ref.style.left = `${clientWidth}px`\n danmu.$ref.style.transform = `translateX(${-distance}px)`\n danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`\n break\n }\n default:\n break\n }\n })\n }\n\n // 继续弹幕\n continue() {\n const { clientWidth } = this.$player\n this.filter('stop', (danmu) => {\n this.setState(danmu, 'emit') // 转换为emit状态\n danmu.$lastStartTime = Date.now()\n switch (danmu.mode) {\n // 继续滚动的弹幕\n case 0: {\n const distance = clientWidth + danmu.$ref.clientWidth\n danmu.$ref.style.transform = `translateX(${-distance}px)`\n danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`\n break\n }\n default:\n break\n }\n })\n\n return this\n }\n\n // 暂停弹幕\n suspend() {\n const { clientWidth } = this.$player\n this.filter('emit', (danmu) => {\n this.setState(danmu, 'stop') // 转换为stop状态\n switch (danmu.mode) {\n // 停止滚动的弹幕\n case 0: {\n const translateX = clientWidth - (this.getLeft(danmu.$ref) - this.getLeft(this.$player))\n danmu.$ref.style.transform = `translateX(${-translateX}px)`\n danmu.$ref.style.transition = 'transform 0s linear 0s'\n break\n }\n default:\n break\n }\n })\n\n return this\n }\n\n stop() {\n this.isStop = true\n this.suspend()\n window.cancelAnimationFrame(this.timer)\n this.art.emit('artplayerPluginDanmuku:stop')\n return this\n }\n\n start() {\n this.isStop = false\n this.continue()\n this.update()\n this.art.emit('artplayerPluginDanmuku:start')\n return this\n }\n\n reset() {\n this.queue.forEach(danmu => this.makeWait(danmu))\n this.art.emit('artplayerPluginDanmuku:reset')\n return this\n }\n\n show() {\n this.isHide = false\n this.$danmuku.style.opacity = 1\n this.option.visible = true\n this.art.emit('artplayerPluginDanmuku:show')\n return this\n }\n\n hide() {\n this.isHide = true\n this.$danmuku.style.opacity = 0\n this.option.visible = false\n this.art.emit('artplayerPluginDanmuku:hide')\n return this\n }\n\n destroy() {\n this.stop()\n this.worker.terminate()\n this.art.off('video:play', this.start)\n this.art.off('video:playing', this.start)\n this.art.off('video:pause', this.stop)\n this.art.off('video:waiting', this.stop)\n this.art.off('resize', this.reset)\n this.art.off('destroy', this.destroy)\n this.art.emit('artplayerPluginDanmuku:destroy')\n }\n}\n","module.exports = \"dd7efcb5fd87c1c0\";","function getMode(key) {\n switch (key) {\n case 1:\n case 2:\n case 3:\n return 0\n case 4:\n return 2\n case 5:\n return 1\n default:\n return 0\n }\n}\n\nfunction bilibiliDanmuParseFromXml(xmlString) {\n if (typeof xmlString !== 'string')\n return []\n const reg = /<d[^>]*?p=\"(?<p>[^\"]+)\"[^>]*>(?<text>.*?)<\\/d>/gs\n const matches = xmlString.matchAll(reg)\n return Array.from(matches)\n .map((match) => {\n const attr = match.groups.p.split(',')\n if (attr.length >= 8) {\n const text = match.groups.text\n .trim()\n .replaceAll('"', '\"')\n .replaceAll(''', '\\'')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('&', '&')\n\n return {\n text,\n time: Number(attr[0]),\n mode: getMode(Number(attr[1])),\n fontSize: Number(attr[2]),\n color: `#${Number(attr[3]).toString(16)}`,\n timestamp: Number(attr[4]),\n pool: Number(attr[5]),\n userID: attr[6],\n rowID: Number(attr[7]),\n }\n }\n else {\n return null\n }\n })\n .filter(Boolean)\n}\n\nfunction onmessage({ data }) {\n const { xml, id } = data\n if (!id || !xml)\n return\n const danmus = bilibiliDanmuParseFromXml(xml)\n globalThis.postMessage({ danmus, id })\n}\n\nfunction createWorker() {\n const workerText = `\n ${getMode.toString()}\n ${bilibiliDanmuParseFromXml.toString()}\n onmessage = ${onmessage.toString()}\n `\n const blob = new Blob([workerText], { type: 'application/javascript' })\n return new Worker(URL.createObjectURL(blob))\n}\n\nexport function bilibiliDanmuParseFromUrl(url) {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve) => {\n const res = await fetch(url)\n const xml = await res.text()\n\n try {\n const worker = createWorker()\n worker.onmessage = (event) => {\n const { danmus, id } = event.data\n if (!id || !danmus)\n return\n resolve(danmus)\n worker.terminate()\n }\n worker.postMessage({ xml, id: Date.now() })\n }\n catch (error) {\n console.error('Error parsing Bilibili Danmu:', error)\n const danmus = bilibiliDanmuParseFromXml(xml)\n resolve(danmus)\n }\n })\n}\n","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","const lib = {\n map(value, inMin, inMax, outMin, outMax) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n },\n range(start, end, tick) {\n const s = Math.round(start / tick) * tick\n return Array.from(\n {\n length: Math.floor((end - start) / tick),\n },\n (v, k) => {\n return k * tick + s\n },\n )\n },\n}\n\nfunction line(pointA, pointB) {\n const lengthX = pointB[0] - pointA[0]\n const lengthY = pointB[1] - pointA[1]\n return {\n length: Math.sqrt(lengthX ** 2 + lengthY ** 2),\n angle: Math.atan2(lengthY, lengthX),\n }\n}\n\nexport default function heatmap(art, danmuku, option) {\n const { query } = art.constructor.utils\n\n art.controls.add({\n name: 'heatmap',\n position: 'top',\n html: '',\n style: {\n position: 'absolute',\n top: '-100px',\n left: '0px',\n right: '0px',\n height: '100px',\n width: '100%',\n pointerEvents: 'none',\n },\n mounted($heatmap) {\n let $start = null\n let $stop = null\n\n function update(arg = []) {\n $start = null\n $stop = null\n $heatmap.innerHTML = ''\n\n if (!art.duration || art.option.isLive)\n return\n\n const svg = {\n w: $heatmap.offsetWidth,\n h: $heatmap.offsetHeight,\n }\n\n const options = {\n xMin: 0,\n xMax: svg.w,\n yMin: 0,\n yMax: 128,\n scale: 0.25,\n opacity: 0.2,\n minHeight: Math.floor(svg.h * 0.05),\n sampling: Math.floor(svg.w / 100),\n smoothing: 0.2,\n flattening: 0.2,\n }\n\n if (typeof option === 'object') {\n Object.assign(options, option)\n }\n\n let points = []\n\n if (Array.isArray(arg) && arg.length) {\n points = [...arg]\n }\n else {\n const gap = art.duration / svg.w\n for (let x = 0; x <= svg.w; x += options.sampling) {\n const y = danmuku.queue.filter(\n ({ time }) => time > x * gap && time <= (x + options.sampling) * gap,\n ).length\n points.push([x, y])\n }\n }\n\n if (points.length === 0)\n return\n\n const lastPoint = points[points.length - 1]\n const lastX = lastPoint[0]\n const lastY = lastPoint[1]\n if (lastX !== svg.w) {\n points.push([svg.w, lastY])\n }\n\n const yPoints = points.map(point => point[1])\n const yMin = Math.min(...yPoints)\n const yMax = Math.max(...yPoints)\n const yMid = (yMin + yMax) / 2\n\n for (let i = 0; i < points.length; i++) {\n const point = points[i]\n const y = point[1]\n point[1] = y * (y > yMid ? 1 + options.scale : 1 - options.scale) + options.minHeight\n }\n\n const controlPoint = (current, previous, next, reverse) => {\n const p = previous || current\n const n = next || current\n const o = line(p, n)\n const flat = lib.map(Math.cos(o.angle) * options.flattening, 0, 1, 1, 0)\n const angle = o.angle * flat + (reverse ? Math.PI : 0)\n const length = o.length * options.smoothing\n const x = current[0] + Math.cos(angle) * length\n const y = current[1] + Math.sin(angle) * length\n return [x, y]\n }\n\n const bezierCommand = (point, i, a) => {\n const cps = controlPoint(a[i - 1], a[i - 2], point)\n const cpe = controlPoint(point, a[i - 1], a[i + 1], true)\n const close = i === a.length - 1 ? ' z' : ''\n return `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}${close}`\n }\n\n const pointsPositions = points.map((e) => {\n const x = lib.map(e[0], options.xMin, options.xMax, 0, svg.w)\n const y = lib.map(e[1], options.yMin, options.yMax, svg.h, 0)\n return [x, y]\n })\n\n const pathD = pointsPositions.reduce(\n (acc, e, i, a) =>\n i === 0\n ? `M ${a[a.length - 1][0]},${svg.h} L ${e[0]},${svg.h} L ${e[0]},${e[1]}`\n : `${acc} ${bezierCommand(e, i, a)}`,\n '',\n )\n\n $heatmap.innerHTML = `\n <svg viewBox=\"0 0 ${svg.w} ${svg.h}\">\n <defs>\n <linearGradient id=\"heatmap-solids\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" style=\"stop-color:var(--art-theme);stop-opacity:${options.opacity}\" />\n <stop offset=\"0%\" style=\"stop-color:var(--art-theme);stop-opacity:${options.opacity}\" id=\"heatmap-start\" />\n <stop offset=\"0%\" style=\"stop-color:var(--art-progress-color);stop-opacity:1\" id=\"heatmap-stop\" />\n <stop offset=\"100%\" style=\"stop-color:var(--art-progress-color);stop-opacity:1\" />\n </linearGradient>\n </defs>\n <path fill=\"url(#heatmap-solids)\" d=\"${pathD}\"></path>\n </svg>\n `\n\n $start = query('#heatmap-start', $heatmap)\n $stop = query('#heatmap-stop', $heatmap)\n $start.setAttribute('offset', `${art.played * 100}%`)\n $stop.setAttribute('offset', `${art.played * 100}%`)\n }\n\n art.on('video:timeupdate', () => {\n if ($start && $stop) {\n $start.setAttribute('offset', `${art.played * 100}%`)\n $stop.setAttribute('offset', `${art.played * 100}%`)\n }\n })\n\n art.on('setBar', (type, percentage) => {\n if ($start && $stop && type === 'played') {\n $start.setAttribute('offset', `${percentage * 100}%`)\n $stop.setAttribute('offset', `${percentage * 100}%`)\n }\n })\n\n art.on('ready', () => update())\n art.on('resize', () => update())\n art.on('artplayerPluginDanmuku:loaded', () => update())\n art.on('artplayerPluginDanmuku:points', points => update(points))\n },\n })\n}\n","import $check_off from 'bundle-text:./img/check_off.svg'\nimport $check_on from 'bundle-text:./img/check_on.svg'\nimport $config from 'bundle-text:./img/config.svg'\nimport $mode_0_off from 'bundle-text:./img/mode_0_off.svg'\nimport $mode_0_on from 'bundle-text:./img/mode_0_on.svg'\nimport $mode_1_off from 'bundle-text:./img/mode_1_off.svg'\nimport $mode_1_on from 'bundle-text:./img/mode_1_on.svg'\nimport $mode_2_off from 'bundle-text:./img/mode_2_off.svg'\nimport $mode_2_on from 'bundle-text:./img/mode_2_on.svg'\nimport $off from 'bundle-text:./img/off.svg'\nimport $on from 'bundle-text:./img/on.svg'\nimport $style from 'bundle-text:./img/style.svg'\nimport style from 'bundle-text:./style.less'\n\nexport default class Setting {\n constructor(art, danmuku) {\n this.art = art\n this.danmuku = danmuku\n this.utils = art.constructor.utils\n\n const { setStyle } = this.utils\n const { $controlsCenter } = art.template\n setStyle($controlsCenter, 'display', 'flex')\n\n this.template = {\n $controlsCenter,\n $mount: $controlsCenter,\n $danmuku: null,\n $toggle: null,\n $config: null,\n $configPanel: null,\n $configModes: null,\n $style: null,\n $stylePanel: null,\n $styleModes: null,\n $colors: null,\n $opacitySlider: null,\n $opacityValue: null,\n $marginSlider: null,\n $marginValue: null,\n $fontSizeSlider: null,\n $fontSizeValue: null,\n $speedSlider: null,\n $speedValue: null,\n $input: null,\n $send: null,\n }\n\n this.slider = {\n opacity: null,\n margin: null,\n fontSize: null,\n speed: null,\n }\n\n this.emitting = false\n this.isLock = false\n this.timer = null\n\n this.createTemplate()\n this.createSliders()\n this.createEvents()\n\n this.mount(this.option.mount)\n\n art.on('resize', () => this.resize())\n art.on('fullscreen', state => this.onFullscreen(state))\n art.on('fullscreenWeb', state => this.onFullscreen(state))\n\n art.proxy(this.template.$config, 'mouseenter', () => {\n this.onMouseEnter({\n $control: this.template.$config,\n $panel: this.template.$configPanel,\n })\n })\n\n art.proxy(this.template.$style, 'mouseenter', () => {\n this.onMouseEnter({\n $control: this.template.$style,\n $panel: this.template.$stylePanel,\n })\n })\n }\n\n static get icons() {\n return {\n $on,\n $off,\n $config,\n $style,\n $mode_0_off,\n $mode_0_on,\n $mode_1_off,\n $mode_1_on,\n $mode_2_off,\n $mode_2_on,\n $check_on,\n $check_off,\n }\n }\n\n get option() {\n return this.danmuku.option\n }\n\n get outside() {\n return this.template.$mount !== this.template.$controlsCenter\n }\n\n get TEMPLATE() {\n const { option } = this\n return `\n <div class=\"apd-toggle\">\n ${$on}${$off}\n </div>\n <div class=\"apd-config\">\n ${$config}\n <div class=\"apd-config-panel\">\n <div class=\"apd-config-panel-inner\">\n <div class=\"apd-config-mode\">\n 按类型屏蔽\n <div class=\"apd-modes\">\n <div data-mode=\"0\" class=\"apd-mode\">\n ${$mode_0_off}${$mode_0_on}\n <div>滚动</div>\n </div>\n <div data-mode=\"1\" class=\"apd-mode\">\n ${$mode_1_off}${$mode_1_on}\n <div>顶部</div>\n </div>\n <div data-mode=\"2\" class=\"apd-mode\">\n ${$mode_2_off}${$mode_2_on}\n <div>底部</div>\n </div>\n </div>\n </div>\n <div class=\"apd-config-other\">\n <div class=\"apd-other apd-anti-overlap\">\n ${$check_on}${$check_off}\n 防止弹幕重叠\n </div>\n <div class=\"apd-other apd-sync-video\">\n ${$check_on}${$check_off}\n 同步视频速度\n </div>\n </div>\n <div class=\"apd-config-slider apd-config-opacity\">\n 不透明度\n <div class=\"apd-slider\"></div>\n <div class=\"apd-value\">未知</div>\n </div>\n <div class=\"apd-config-slider apd-config-margin\">\n 显示区域\n <div class=\"apd-slider\"></div>\n <div class=\"apd-value\">未知</div>\n </div>\n <div class=\"apd-config-slider apd-config-fontSize\">\n 弹幕字号\n <div class=\"apd-slider\"></div>\n <div class=\"apd-value\">未知</div>\n </div>\n <div class=\"apd-config-slider apd-config-speed\">\n 弹幕速度\n <div class=\"apd-slider\"></div>\n <div class=\"apd-value\">未知</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"apd-emitter\">\n <div class=\"apd-style\">\n ${$style}\n <div class=\"apd-style-panel\">\n <div class=\"apd-style-panel-inner\">\n <div class=\"apd-style-mode\">\n 模式\n <div class=\"apd-modes\">\n <div data-mode=\"0\" class=\"apd-mode\">\n ${$mode_0_on}\n <div>滚动</div>\n </div>\n <div data-mode=\"1\" class=\"apd-mode\">\n ${$mode_1_on}\n <div>顶部</div>\n </div>\n <div data-mode=\"2\" class=\"apd-mode\">\n ${$mode_2_on}\n <div>底部</div>\n </div>\n </div>\n </div>\n <div class=\"apd-style-color\">\n 颜色\n <div class=\"apd-colors\">\n ${this.COLOR.map(color => `<div data-color=\"${color}\" class=\"apd-color\" style=\"background-color: ${color}\"></div>`).join('')}\n </div>\n </div>\n </div>\n </div>\n </div>\n <input class=\"apd-input\" placeholder=\"发个友善的弹幕见证当下\" autocomplete=\"off\" maxLength=\"${option.maxLength}\" />\n <div class=\"apd-send\">发送</div>\n </div>\n `\n }\n\n get OPACITY() {\n return {\n min: 0,\n max: 100,\n steps: [],\n ...this.option.OPACITY,\n }\n }\n\n get FONT_SIZE() {\n return {\n min: 12,\n max: 120,\n steps: [],\n ...this.option.FONT_SIZE,\n }\n }\n\n get MARGIN() {\n return {\n min: 0,\n max: 3,\n steps: [\n {\n name: '1/4',\n value: [10, '75%'],\n },\n {\n name: '半屏',\n value: [10, '50%'],\n },\n {\n name: '3/4',\n value: [10, '25%'],\n },\n {\n name: '满屏',\n value: [10, 10],\n },\n ],\n ...this.option.MARGIN,\n }\n }\n\n get SPEED() {\n return {\n min: 0,\n max: 4,\n steps: [\n {\n name: '极慢',\n value: 10,\n },\n {\n name: '较慢',\n value: 7.5,\n hide: true,\n },\n {\n name: '适中',\n value: 5,\n },\n {\n name: '较快',\n value: 2.5,\n hide: true,\n },\n {\n name: '极快',\n value: 1,\n },\n ],\n ...this.option.SPEED,\n }\n }\n\n get COLOR() {\n return this.option.COLOR.length\n ? this.option.COLOR\n : [\n '#FE0302',\n '#FF7204',\n '#FFAA02',\n '#FFD302',\n '#FFFF00',\n '#A0EE00',\n '#00CD00',\n '#019899',\n '#4266BE',\n '#89D5FF',\n '#CC0273',\n '#222222',\n '#9B9B9B',\n '#FFFFFF',\n ]\n }\n\n query(selector) {\n const { query } = this.utils\n const { $danmuku } = this.template\n return query(selector, $danmuku)\n }\n\n append(el, target) {\n const { append } = this.utils\n const children = [...el.children]\n if (children.includes(target))\n return\n append(el, target)\n }\n\n setData(key, value) {\n const { $player } = this.art.template\n const { $mount } = this.template\n $player.dataset[key] = value\n if (this.outside) {\n $mount.dataset[key] = value\n }\n }\n\n createTemplate() {\n const { createElement, tooltip } = this.utils\n\n const $danmuku = createElement('div')\n $danmuku.className = 'artplayer-plugin-danmuku'\n $danmuku.innerHTML = this.TEMPLATE\n\n this.template.$danmuku = $danmuku\n this.template.$toggle = this.query('.apd-toggle')\n this.template.$config = this.query('.apd-config')\n this.template.$configPanel = this.query('.apd-config-panel')\n this.template.$configModes = this.query('.apd-config-mode .apd-modes')\n this.template.$style = this.query('.apd-style')\n this.template.$stylePanel = this.query('.apd-style-panel')\n this.template.$styleModes = this.query('.apd-style-mode .apd-modes')\n this.template.$colors = this.query('.apd-colors')\n this.template.$antiOverlap = this.query('.apd-anti-overlap')\n this.template.$syncVideo = this.query('.apd-sync-video')\n this.template.$opacitySlider = this.query('.apd-config-opacity .apd-slider')\n this.template.$opacityValue = this.query('.apd-config-opacity .apd-value')\n this.template.$marginSlider = this.query('.apd-config-margin .apd-slider')\n this.template.$marginValue = this.query('.apd-config-margin .apd-value')\n this.template.$fontSizeSlider = this.query('.apd-config-fontSize .apd-slider')\n this.template.$fontSizeValue = this.query('.apd-config-fontSize .apd-value')\n this.template.$speedSlider = this.query('.apd-config-speed .apd-slider')\n this.template.$speedValue = this.query('.apd-config-speed .apd-value')\n this.template.$input = this.query('.apd-input')\n this.template.$send = this.query('.apd-send')\n\n const { $toggle } = this.template\n\n this.art.on('artplayerPluginDanmuku:show', () => {\n tooltip($toggle, '关闭弹幕')\n })\n\n this.art.on('artplayerPluginDanmuku:hide', () => {\n tooltip($toggle, '打开弹幕')\n })\n }\n\n createEvents() {\n const { $toggle, $configModes, $styleModes, $colors, $antiOverlap, $syncVideo, $send, $input } = this.template\n\n this.art.proxy($toggle, 'click', () => {\n this.danmuku.config({\n visible: !this.option.visible,\n })\n this.reset()\n })\n\n this.art.proxy($configModes, 'click', (event) => {\n const $mode = event.target.closest('.apd-mode')\n if (!$mode)\n return\n const mode = Number($mode.dataset.mode)\n if (this.option.modes.includes(mode)) {\n this.danmuku.config({\n modes: this.option.modes.filter(m => m !== mode),\n })\n }\n else {\n this.danmuku.config({\n modes: [...this.option.modes, mode],\n })\n }\n this.reset()\n })\n\n this.art.proxy($antiOverlap, 'click', () => {\n this.danmuku.config({\n antiOverlap: !this.option.antiOverlap,\n })\n this.reset()\n })\n\n this.art.proxy($syncVideo, 'click', () => {\n this.danmuku.config({\n synchronousPlayback: !this.option.synchronousPlayback,\n })\n this.reset()\n })\n\n this.art.proxy($styleModes, 'click', (event) => {\n const $mode = event.target.closest('.apd-mode')\n if (!$mode)\n return\n const mode = Number($mode.dataset.mode)\n this.danmuku.config({\n mode,\n })\n this.reset()\n })\n\n this.art.proxy($colors, 'click', (event) => {\n const $color = event.target.closest('.apd-color')\n if (!$color)\n return\n this.danmuku.config({\n color: $color.dataset.color,\n })\n this.reset()\n })\n\n this.art.proxy($send, 'click', () => this.emit())\n\n this.art.proxy($input, 'keypress', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n this.emit()\n }\n })\n }\n\n createSliders() {\n this.slider.opacity = this.createSlider({\n ...this.OPACITY,\n container: this.template.$opacitySlider,\n findIndex: () => {\n return Math.round(this.option.opacity * 100)\n },\n onChange: (index) => {\n const { $opacityValue } = this.template\n $opacityValue.textContent = `${index}%`\n this.danmuku.config({\n opacity: index / 100,\n })\n },\n })\n\n this.slider.margin = this.createSlider({\n ...this.MARGIN,\n container: this.template.$marginSlider,\n findIndex: () => {\n return this.MARGIN.steps.findIndex(\n item => item.value[0] === this.option.margin[0] && item.value[1] === this.option.margin[1],\n )\n },\n onChange: (index) => {\n const margin = this.MARGIN.steps[index]\n if (!margin)\n return\n const { $marginValue } = this.template\n $marginValue.textContent = margin.name\n this.danmuku.config({\n margin: margin.value,\n })\n },\n })\n\n this.slider.fontSize = this.createSlider({\n ...this.FONT_SIZE,\n container: this.template.$fontSizeSlider,\n findIndex: () => {\n return this.danmuku.fontSize\n },\n onChange: (index) => {\n const { $fontSizeValue } = this.template\n $fontSizeValue.textContent = `${index}px`\n if (index === this.danmuku.fontSize)\n return\n this.danmuku.config({\n fontSize: index,\n })\n },\n })\n\n this.slider.speed = this.createSlider({\n ...this.SPEED,\n container: this.template.$speedSlider,\n findIndex: () => {\n return this.SPEED.steps.findIndex(item => item.value === this.option.speed)\n },\n onChange: (index) => {\n const speed = this.SPEED.steps[index]\n if (!speed)\n return\n const { $speedValue } = this.template\n $speedValue.textContent = speed.name\n this.danmuku.config({\n speed: speed.value,\n })\n },\n })\n }\n\n createSlider({ min, max, container, findIndex, onChange, steps = [] }) {\n const { query, clamp, setStyle } = this.utils\n\n setStyle(container, 'touch-action', 'none')\n\n container.innerHTML = `\n <div class=\"apd-slider-line\">\n <div class=\"apd-slider-points\">\n ${steps.map(() => `<div class=\"apd-slider-point\"></div>`).join('')}\n </div>\n <div class=\"apd-slider-progress\"></div>\n </div>\n <div class=\"apd-slider-dot\"></div>\n <div class=\"apd-slider-steps\">\n ${steps.map(step => (step.hide ? '' : `<div class=\"apd-slider-step\">${step.name}</div>`)).join('')}\n </div>\n `\n\n const $dot = query('.apd-slider-dot', container)\n const $progress = query('.apd-slider-progress', container)\n\n let isDroging = false\n\n function reset(index = findIndex()) {\n if (index < min || index > max)\n return\n const percentage = (index - min) / (max - min)\n $dot.style.left = `${percentage * 100}%`\n if (steps.length === 0) {\n $progress.style.width = $dot.style.left\n }\n onChange(index)\n }\n\n function updateLeft(event) {\n const { top, height, left, width } = container.getBoundingClientRect()\n if (this.art.isRotate) {\n const value = clamp(event.clientY - top, 0, height)\n const index = Math.round((value / height) * (max - min) + min)\n reset(index)\n }\n else {\n const value = clamp(event.clientX - left, 0, width)\n const index = Math.round((value / width) * (max - min) + min)\n reset(index)\n }\n }\n\n this.art.proxy(container, 'click', (event) => {\n updateLeft.call(this, event)\n })\n\n this.art.proxy(container, 'pointerdown', (event) => {\n isDroging = event.button === 0\n })\n\n this.art.on('document:pointermove', (event) => {\n if (isDroging) {\n updateLeft.call(this, event)\n }\n })\n\n this.art.on('document:pointerup', (event) => {\n if (isDroging) {\n isDroging = false\n updateLeft.call(this, event)\n }\n })\n\n return { reset }\n }\n\n onFullscreen(state) {\n const { $danmuku, $controlsCenter, $mount } = this.template\n if (this.outside) {\n if (state) {\n this.append($controlsCenter, $danmuku)\n }\n else {\n this.append($mount, $danmuku)\n }\n }\n else {\n this.append($controlsCenter, $danmuku)\n }\n }\n\n onMouseEnter({ $control, $panel }) {\n const { $player } = this.art.template\n const controlRect = $control.getBoundingClientRect()\n const panelRect = $panel.getBoundingClientRect()\n const playerRect = $player.getBoundingClientRect()\n\n const half = panelRect.width / 2 - controlRect.width / 2\n const left = playerRect.left - (controlRect.left - half)\n const right = controlRect.right + half - playerRect.right\n\n if (left > 0) {\n $panel.style.left = `${-half + left}px`\n }\n else if (right > 0) {\n $panel.style.left = `${-half - right}px`\n }\n else {\n $panel.style.left = `${-half}px`\n }\n }\n\n async emit() {\n const { $input } = this.template\n\n const text = $input.value.trim()\n if (!text.length)\n return\n if (this.isLock)\n return\n if (this.emitting)\n return\n\n const danmu = {\n text,\n mode: this.option.mode,\n color: this.option.color,\n time: this.art.currentTime,\n }\n\n try {\n this.emitting = true\n const state = await this.option.beforeEmit(danmu)\n this.emitting = false\n\n if (state !== true)\n return\n\n danmu.border = true\n delete danmu.time\n this.danmuku.emit(danmu)\n $input.value = ''\n\n this.lock()\n }\n catch (error) {\n console.error('Error emitting danmuku:', error)\n this.emitting = false\n }\n }\n\n lock() {\n const { addClass } = this.utils\n const { $send } = this.template\n\n this.isLock = true\n let time = this.option.lockTime\n $send.textContent = time\n addClass($send, 'apd-lock')\n\n const loop = () => {\n this.timer = setTimeout(() => {\n if (time === 0) {\n this.unlock()\n }\n else {\n time -= 1\n $send.textContent = time\n loop()\n }\n }, 1000)\n }\n\n loop()\n }\n\n unlock() {\n const { removeClass } = this.utils\n const { $send } = this.template\n clearTimeout(this.timer)\n this.isLock = false\n $send.textContent = '发送'\n removeClass($send, 'apd-lock')\n }\n\n resize() {\n if (this.outside)\n return\n if (this.art.fullscreen)\n return\n if (this.art.fullscreenWeb)\n return\n const { $player, $controlsCenter } = this.art.template\n const { $danmuku } = this.template\n if (this.art.width < this.option.width) {\n this.append($player, $danmuku)\n }\n else {\n this.append($controlsCenter, $danmuku)\n }\n }\n\n reset() {\n const { inverseClass, tooltip } = this.utils\n const { $toggle, $colors } = this.template\n\n this.slider.opacity.reset()\n this.slider.margin.reset()\n this.slider.fontSize.reset()\n this.slider.speed.reset()\n\n this.setData('danmukuVisible', this.option.visible)\n this.setData('danmukuMode', this.option.mode)\n this.setData('danmukuColor', this.option.color)\n this.setData('danmukuMode0', this.option.modes.includes(0))\n this.setData('danmukuMode1', this.option.modes.includes(1))\n this.setData('danmukuMode2', this.option.modes.includes(2))\n this.setData('danmukuAntiOverlap', this.option.antiOverlap)\n this.setData('danmukuSyncVideo', this.option.synchronousPlayback)\n this.setData('danmukuTheme', this.option.theme)\n this.setData('danmukuEmitter', this.option.emitter)\n\n const colors = $colors.children\n const $color = Array.from(colors).find(item => item.dataset.color === this.option.color.toUpperCase())\n $color && inverseClass($color, 'apd-active')\n\n tooltip($toggle, this.option.visible ? '关闭弹幕' : '打开弹幕')\n\n this.resize()\n }\n\n mount(target) {\n const { errorHandle } = this.utils\n const $el = typeof target === 'string' ? document.querySelector(target) : target\n errorHandle($el, `Can not find the mount point: ${target}`)\n this.append($el, this.template.$danmuku)\n this.template.$mount = $el\n this.reset()\n }\n}\n\nif (typeof document !== 'undefined') {\n const id = 'artplayer-plugin-danmuku'\n let $style = document.getElementById(id)\n if (!$style) {\n $style = document.createElement('style')\n $style.id = id\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n document.head.appendChild($style)\n })\n }\n else {\n (document.head || document.documentElement).appendChild($style)\n }\n }\n $style.textContent = style\n}\n","module.exports = \"0616b3f5e6434b38\";","module.exports = \"8e2849d281974e34\";","module.exports = \"49c14b4dbf213408\";","module.exports = \"a0f690bca27acdee\";","module.exports = \"70b07d4e4796c39f\";","module.exports = \"bffb346eb331a03f\";","module.exports = \"ade441db0e7be833\";","module.exports = \"8acc265c0fe9e947\";","module.exports = \"d374f135d6d7b8db\";","module.exports = \"4e92064d88d9e604\";","module.exports = \"c6881a3522f2fe2a\";","module.exports = \"5050154cc04e750f\";","module.exports = \"95fd45dd2fe5c5a5\";"],"names":["modules","entry","mainEntry","parcelRequireName","externals","distDir","publicUrl","devServer","globalObject","globalThis","self","window","global","previousRequire","importMap","i","cache","nodeRequire","module","require","bind","newRequire","name","jumped","currentRequire","err","Error","code","localRequire","resolve","x","id","Module","call","exports","res","isParcelRequire","moduleName","bundle","parent","register","Object","defineProperty","get","length","mainExports","define","amd","__globalThis","parcelHelpers","defineInteropFlag","export","artplayerPluginDanmuku","_danmuku","_danmukuDefault","interopDefault","_heatmap","_heatmapDefault","_setting","_settingDefault","option","art","danmuku","default","setting","heatmap","emit","load","config","hide","show","reset","mount","isHide","isStop","icons","_worker","_workerDefault","_bilibili","Danmuku","constructor","template","utils","validator","$danmuku","$player","queue","$refs","timer","index","states","wait","ready","stop","blob","Blob","replace","type","worker","Worker","URL","createObjectURL","start","resize","destroy","on","speed","margin","opacity","color","mode","modes","fontSize","antiOverlap","synchronousPlayback","undefined","width","points","filter","beforeEmit","beforeVisible","visible","emitter","maxLength","lockTime","theme","OPACITY","FONT_SIZE","MARGIN","SPEED","COLOR","scheme","cssText","isRotate","plugins","autoOrientation","state","marginTop","clamp","value","clientHeight","endsWith","Number","parseFloat","marginBottom","Math","round","$ref","pop","document","createElement","style","dataset","className","readys","currentTime","result","danmu","push","time","visibles","clientWidth","clientLeft","getLeft","top","offsetTop","left","height","distance","$restTime","right","playbackRate","errorHandle","danmus","target","Promise","bilibiliDanmuParseFromUrl","Array","isArray","textContent","error","text","border","trim","Infinity","includes","item","$state","$index","$lastStartTime","setState","isInit","$controlsCenter","keys","some","key","JSON","stringify","assign","rect","getBoundingClientRect","postMessage","message","Date","now","onmessage","event","data","callback","makeWait","visibility","marginLeft","transform","transition","update","setStyles","requestAnimationFrame","playing","emitTime","appendChild","backgroundColor","continue","suspend","translateX","cancelAnimationFrame","forEach","terminate","off","getMode","bilibiliDanmuParseFromXml","xmlString","from","matchAll","map","match","attr","groups","p","split","replaceAll","toString","timestamp","pool","userID","rowID","Boolean","xml","url","fetch","createWorker","console","a","__esModule","exportAll","source","dest","prototype","hasOwnProperty","enumerable","destName","lib","inMin","inMax","outMin","outMax","range","end","tick","s","floor","v","k","query","controls","add","position","html","pointerEvents","mounted","$heatmap","$start","$stop","arg","innerHTML","duration","isLive","svg","w","offsetWidth","h","offsetHeight","options","xMin","xMax","yMin","yMax","scale","minHeight","sampling","smoothing","flattening","gap","y","lastPoint","lastX","lastY","yPoints","point","yMid","min","max","controlPoint","current","previous","next","reverse","o","line","pointA","pointB","lengthX","lengthY","sqrt","angle","atan2","flat","cos","PI","sin","pathD","pointsPositions","e","reduce","acc","bezierCommand","cps","cpe","close","setAttribute","played","percentage","_checkOffSvg","_checkOffSvgDefault","_checkOnSvg","_checkOnSvgDefault","_configSvg","_configSvgDefault","_mode0OffSvg","_mode0OffSvgDefault","_mode0OnSvg","_mode0OnSvgDefault","_mode1OffSvg","_mode1OffSvgDefault","_mode1OnSvg","_mode1OnSvgDefault","_mode2OffSvg","_mode2OffSvgDefault","_mode2OnSvg","_mode2OnSvgDefault","_offSvg","_offSvgDefault","_onSvg","_onSvgDefault","_styleSvg","_styleSvgDefault","_styleLess","_styleLessDefault","setStyle","$mount","$toggle","$config","$configPanel","$configModes","$style","$stylePanel","$styleModes","$colors","$opacitySlider","$opacityValue","$marginSlider","$marginValue","$fontSizeSlider","$fontSizeValue","$speedSlider","$speedValue","$input","$send","slider","emitting","isLock","createTemplate","createSliders","createEvents","onFullscreen","proxy","onMouseEnter","$control","$panel","$on","$off","$mode_0_off","$mode_0_on","$mode_1_off","$mode_1_on","$mode_2_off","$mode_2_on","$check_on","$check_off","outside","TEMPLATE","join","steps","selector","append","el","children","setData","tooltip","$antiOverlap","$syncVideo","$mode","closest","m","$color","preventDefault","createSlider","container","findIndex","onChange","step","$dot","$progress","isDroging","updateLeft","clientY","clientX","button","controlRect","panelRect","playerRect","half","lock","addClass","loop","setTimeout","unlock","removeClass","clearTimeout","fullscreen","fullscreenWeb","inverseClass","find","toUpperCase","$el","querySelector","getElementById","readyState","addEventListener","head","documentElement","_default","parcelRequire4dc0"],"version":3,"file":"index.js.map"} |