From 9d730146c0ade86f89afd6de4ecbee567e98997a Mon Sep 17 00:00:00 2001 From: Harvey Zack Date: Fri, 26 Apr 2019 12:05:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=B9=E5=B9=95=E6=B1=A0=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/assets/example/danmu.js | 10 ++- docs/uncompiled/artplayer-plugin-danmu.js | 67 +++++++++---------- docs/uncompiled/artplayer-plugin-danmu.js.map | 2 +- .../src/bilibiliDanmuParse.js | 23 +++---- .../artplayer-plugin-danmu/src/danmuku.js | 26 ++++--- 5 files changed, 64 insertions(+), 64 deletions(-) diff --git a/docs/assets/example/danmu.js b/docs/assets/example/danmu.js index b6ab2dd2b..4b8affbe4 100644 --- a/docs/assets/example/danmu.js +++ b/docs/assets/example/danmu.js @@ -3,5 +3,11 @@ var art = new Artplayer({ container: '.artplayer-app', url: url + '/video/you-name.mp4', autoSize: true, - plugins: [artplayerPluginDanmu()], -}); + plugins: [artplayerPluginDanmu({ + danmus: () => artplayerPluginDanmu.bilibiliDanmuParseFromAv(7185185), + speed: 5, + opacity: 1, + color: '#fff', + size: 14, + })], +}); \ No newline at end of file diff --git a/docs/uncompiled/artplayer-plugin-danmu.js b/docs/uncompiled/artplayer-plugin-danmu.js index 68bf15305..2b73eae04 100644 --- a/docs/uncompiled/artplayer-plugin-danmu.js +++ b/docs/uncompiled/artplayer-plugin-danmu.js @@ -52,27 +52,24 @@ function bilibiliDanmuParseFromXml(xmlString) { if (typeof xmlString !== 'string') return []; - var regSrt = '(.+)'; - var listReg = new RegExp(regSrt, 'gi'); - var itemReg = new RegExp(regSrt, 'i'); - var srtList = xmlString.match(listReg); + var srtList = xmlString.match(/[\S ]*?)<\/d>/gi); return srtList.length ? srtList.map(function (item) { - var _item$match = item.match(itemReg), + var _item$match = item.match(/(.+)<\/d>/), _item$match2 = slicedToArray(_item$match, 3), attrStr = _item$match2[1], text = _item$match2[2]; - var attr = attrStr.split(',').map(Number); + var attr = attrStr.split(','); return attr.length === 8 && text.trim() ? { text: text, - time: attr[0], - mode: attr[1], - size: attr[2], - color: "#".concat(attr[3].toString(16)), - timestamp: attr[4], - pool: attr[5], + time: Number(attr[0]), + mode: Number(attr[1]), + size: Number(attr[2]), + color: "#".concat(Number(attr[3]).toString(16)), + timestamp: Number(attr[4]), + pool: Number(attr[5]), userID: attr[6], - rowID: attr[7] + rowID: Number(attr[7]) } : null; }) : []; } @@ -123,20 +120,31 @@ /*#__PURE__*/ function () { function Danmuku(art) { + var _this = this; + var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; classCallCheck(this, Danmuku); this.art = art; this.queue = {}; - this.option = Object.assign({}, Danmuku.option, option); - art.constructor.validator(this.option, Danmuku.scheme); - this.option.danmus.forEach(this.emit); this.current = []; this.layer = {}; this.isStop = false; this.timer = null; - this.init(); + this.option = Object.assign({}, Danmuku.option, option); + art.constructor.validator(this.option, Danmuku.scheme); + + if (typeof this.option.danmus === 'function') { + this.option.danmus().then(function (danmus) { + danmus.forEach(_this.emit); + + _this.init(); + }); + } else { + this.option.danmus.forEach(this.emit); + this.init(); + } } createClass(Danmuku, [{ @@ -237,28 +245,28 @@ }, { key: "update", value: function update() { - var _this = this; + var _this2 = this; var _this$art = this.art, $player = _this$art.template.$player, player = _this$art.player; this.timer = window.requestAnimationFrame(function () { - _this.current.forEach(function (item) { - if (Date.now() - item.time >= _this.option.speed) { + _this2.current.forEach(function (item) { + if (Date.now() - item.time >= _this2.option.speed) { item.state = 'inactive'; } }); - Object.keys(_this.queue).filter(function (time) { + Object.keys(_this2.queue).filter(function (time) { return player.currentTime + 0.5 >= time && time >= player.currentTime - 0.5; }).reduce(function (result, key) { - return result.concat(_this.queue[key]); + return result.concat(_this2.queue[key]); }, []).forEach(function (item) { console.log(item); }); - if (!_this.isStop && player.playing) { - _this.update(); + if (!_this2.isStop && player.playing) { + _this2.update(); } }); } @@ -302,16 +310,7 @@ key: "scheme", get: function get() { return { - danmus: { - type: 'array', - child: { - text: 'string', - size: 'number', - time: 'number', - color: 'string', - mode: 'number' - } - }, + danmus: 'array|function', speed: 'number', opacity: 'number', color: 'string', diff --git a/docs/uncompiled/artplayer-plugin-danmu.js.map b/docs/uncompiled/artplayer-plugin-danmu.js.map index 7e859cbd0..e5e6c1ae8 100644 --- a/docs/uncompiled/artplayer-plugin-danmu.js.map +++ b/docs/uncompiled/artplayer-plugin-danmu.js.map @@ -1 +1 @@ -{"version":3,"file":"artplayer-plugin-danmu.js","sources":["../../node_modules/@babel/runtime/helpers/arrayWithHoles.js","../../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","../../node_modules/@babel/runtime/helpers/nonIterableRest.js","../../node_modules/@babel/runtime/helpers/slicedToArray.js","../../packages/artplayer-plugin-danmu/src/bilibiliDanmuParse.js","../../node_modules/@babel/runtime/helpers/classCallCheck.js","../../node_modules/@babel/runtime/helpers/createClass.js","../../packages/artplayer-plugin-danmu/src/danmuku.js","../../packages/artplayer-plugin-danmu/src/index.js"],"sourcesContent":["function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;","function _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nmodule.exports = _nonIterableRest;","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","export function bilibiliDanmuParseFromXml(xmlString) {\n if (typeof xmlString !== 'string') return [];\n const regSrt = '(.+)';\n const listReg = new RegExp(regSrt, 'gi');\n const itemReg = new RegExp(regSrt, 'i');\n const srtList = xmlString.match(listReg);\n return srtList.length\n ? srtList.map(item => {\n const [, attrStr, text] = item.match(itemReg);\n const attr = attrStr.split(',').map(Number);\n return attr.length === 8 && text.trim()\n ? {\n text,\n time: attr[0],\n mode: attr[1],\n size: attr[2],\n color: `#${attr[3].toString(16)}`,\n timestamp: attr[4],\n pool: attr[5],\n userID: attr[6],\n rowID: attr[7],\n }\n : null;\n })\n : [];\n}\n\nexport function bilibiliDanmuParseFromAv(av) {\n const corsUrl = 'https://cors-anywhere.herokuapp.com/';\n return fetch(`${corsUrl}https://api.bilibili.com/x/web-interface/view?aid=${av}`)\n .then(res => res.json())\n .then(res => {\n if (res.code === 0 && res.data && res.data.cid) {\n return fetch(`${corsUrl}https://api.bilibili.com/x/v1/dm/list.so?oid=${res.data.cid}`)\n .then(res => res.text())\n .then(xmlString => {\n return bilibiliDanmuParseFromXml(xmlString);\n });\n }\n throw new Error(`Unable to get data: ${JSON.stringify(res)}`);\n });\n}","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","export default class Danmuku {\n constructor(art, option = {}) {\n this.art = art;\n this.queue = {};\n this.option = Object.assign({}, Danmuku.option, option);\n art.constructor.validator(this.option, Danmuku.scheme);\n this.option.danmus.forEach(this.emit);\n this.current = [];\n this.layer = {};\n this.isStop = false;\n this.timer = null;\n this.init();\n }\n\n static get option() {\n return {\n danmus: [],\n speed: 5,\n opacity: 1,\n color: '#fff',\n size: 14,\n };\n }\n\n static get scheme() {\n return {\n danmus: {\n type: 'array',\n child: {\n text: 'string',\n size: 'number',\n time: 'number',\n color: 'string',\n mode: 'number',\n },\n },\n speed: 'number',\n opacity: 'number',\n color: 'string',\n size: 'number',\n };\n }\n\n init() {\n const { layers } = this.art;\n this.layer = layers.add({\n name: 'danmu',\n style: {\n position: 'absolute',\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n },\n });\n\n this.update();\n this.art.on('video:play', this.start.bind(this));\n this.art.on('video:pause', this.stop.bind(this));\n this.art.on('video:ended', this.stop.bind(this));\n this.art.on('destroy', this.stop.bind(this));\n }\n\n emit(danmu = {}) {\n const { errorHandle } = this.art.constructor.utils;\n errorHandle(danmu.text, 'Danmu text cannot be empty');\n errorHandle(danmu.time, 'Danmu time cannot be empty');\n if (this.queue[danmu.time]) {\n this.queue[danmu.time].push(danmu);\n } else {\n this.queue[danmu.time] = [danmu];\n }\n // this.art.emit('artplayerPluginDanmu:emit', danmu);\n // if (!this.isStop) {\n // const { clientWidth: playerWidth, clientHeight: playerHeight } = this.art.template.$player;\n // const danmuItem = this.getDanmuItem();\n // danmuItem.$ref.innerText = danmu.text;\n // danmuItem.$ref.style.fontSize = danmu.size || this.option.size;\n // const { clientWidth: danmuWidth, clientHeight: danmuHeight } = danmuItem.$ref;\n // danmuItem.$ref.style.opacity = danmu.opacity || this.option.opacity;\n // danmuItem.$ref.style.color = danmu.color || this.option.color;\n // danmuItem.$ref.style.top = this.getDanmuTop(playerHeight, danmuHeight);\n // danmuItem.$ref.style.left = `${playerWidth}px`;\n // danmuItem.$ref.style.transform = `translateX(${-playerWidth -\n // danmuWidth}px) translateY(0px) translateZ(0px)`;\n // danmuItem.$ref.style.transition = `-webkit-transform ${danmu.speed || this.option.speed}s linear 0s`;\n // this.art.emit('artplayerPluginDanmu:emit', danmu);\n // }\n }\n\n getDanmuItem() {\n const { setStyles, append } = this.art.constructor.utils;\n const inactiveItem = this.current.find(item => item.state === 'inactive');\n if (inactiveItem) {\n inactiveItem.time = Date.now();\n inactiveItem.$ref.style.transform = 'translateX(0px) translateY(0px) translateZ(0px)';\n inactiveItem.$ref.style.transition = '-webkit-transform 0s linear 0s';\n return inactiveItem;\n }\n const $ref = document.createElement('div');\n setStyles($ref, {\n userSelect: 'none',\n position: 'absolute',\n whiteSpace: 'pre',\n pointerEvents: 'none',\n perspective: '500px',\n display: 'inline-block',\n willChange: 'transform',\n fontFamily: 'SimHei, \"Microsoft JhengHei\", Arial, Helvetica, sans-serif',\n fontWeight: 'normal',\n lineHeight: '1.125',\n textShadow:\n '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 return this.current.push({\n state: 'active',\n time: Date.now(),\n $ref: append(this.layer.$ref, $ref),\n });\n }\n\n getDanmuTop(playerHeight, danmuHeight) {\n return 0;\n }\n\n update() {\n const {\n template: { $player },\n player,\n } = this.art;\n this.timer = window.requestAnimationFrame(() => {\n this.current.forEach(item => {\n if (Date.now() - item.time >= this.option.speed) {\n item.state = 'inactive';\n }\n });\n\n Object.keys(this.queue).filter(time => {\n return player.currentTime + 0.5 >= time && time >= player.currentTime - 0.5;\n }).reduce((result, key) => {\n return result.concat(this.queue[key]);\n }, []).forEach(item => {\n console.log(item);\n });\n\n if (!this.isStop && player.playing) {\n this.update();\n }\n });\n }\n\n stop() {\n this.isStop = true;\n window.cancelAnimationFrame(this.timer);\n this.art.emit('artplayerPluginDanmu:stop');\n }\n\n start() {\n this.isStop = false;\n this.art.emit('artplayerPluginDanmu:start');\n }\n\n show() {\n this.layer.$ref.style = 'none';\n this.art.emit('artplayerPluginDanmu:show');\n }\n\n hide() {\n this.layer.$ref.style = 'block';\n this.art.emit('artplayerPluginDanmu:hide');\n }\n}\n","import { bilibiliDanmuParseFromXml, bilibiliDanmuParseFromAv } from './bilibiliDanmuParse';\nimport Danmuku from './danmuku';\n\nfunction artplayerPluginDanmu(option) {\n return art => {\n const danmuku = new Danmuku(art, option);\n return {\n name: 'artplayerPluginDanmu',\n emit: danmuku.emit.bind(danmuku),\n start: danmuku.start.bind(danmuku),\n stop: danmuku.stop.bind(danmuku),\n hide: danmuku.hide.bind(danmuku),\n show: danmuku.show.bind(danmuku),\n };\n };\n}\n\nartplayerPluginDanmu.bilibiliDanmuParseFromXml = bilibiliDanmuParseFromXml;\nartplayerPluginDanmu.bilibiliDanmuParseFromAv = bilibiliDanmuParseFromAv;\nwindow.artplayerPluginDanmu = artplayerPluginDanmu;\nexport default artplayerPluginDanmu;\n"],"names":["bilibiliDanmuParseFromXml","xmlString","regSrt","listReg","RegExp","itemReg","srtList","match","length","map","item","attrStr","text","attr","split","Number","trim","time","mode","size","color","toString","timestamp","pool","userID","rowID","bilibiliDanmuParseFromAv","av","corsUrl","fetch","then","res","json","code","data","cid","Error","JSON","stringify","Danmuku","art","option","queue","Object","assign","constructor","validator","scheme","danmus","forEach","emit","current","layer","isStop","timer","init","layers","add","name","style","position","left","top","right","bottom","width","height","overflow","update","on","start","bind","stop","danmu","errorHandle","utils","push","setStyles","append","inactiveItem","find","state","Date","now","$ref","transform","transition","document","createElement","userSelect","whiteSpace","pointerEvents","perspective","display","willChange","fontFamily","fontWeight","lineHeight","textShadow","playerHeight","danmuHeight","$player","template","player","window","requestAnimationFrame","speed","keys","filter","currentTime","reduce","result","key","concat","console","log","playing","cancelAnimationFrame","opacity","type","child","artplayerPluginDanmu","danmuku","hide","show"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"artplayer-plugin-danmu.js","sources":["../../node_modules/@babel/runtime/helpers/arrayWithHoles.js","../../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","../../node_modules/@babel/runtime/helpers/nonIterableRest.js","../../node_modules/@babel/runtime/helpers/slicedToArray.js","../../packages/artplayer-plugin-danmu/src/bilibiliDanmuParse.js","../../node_modules/@babel/runtime/helpers/classCallCheck.js","../../node_modules/@babel/runtime/helpers/createClass.js","../../packages/artplayer-plugin-danmu/src/danmuku.js","../../packages/artplayer-plugin-danmu/src/index.js"],"sourcesContent":["function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;","function _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nmodule.exports = _nonIterableRest;","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","export function bilibiliDanmuParseFromXml(xmlString) {\n if (typeof xmlString !== 'string') return [];\n const srtList = xmlString.match(/[\\S ]*?)<\\/d>/gi);\n return srtList.length\n ? srtList.map(item => {\n const [, attrStr, text] = item.match(/(.+)<\\/d>/);\n const attr = attrStr.split(',');\n return attr.length === 8 && text.trim()\n ? {\n text,\n time: Number(attr[0]),\n mode: Number(attr[1]),\n size: 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 : null;\n })\n : [];\n}\n\nexport function bilibiliDanmuParseFromAv(av) {\n const corsUrl = 'https://cors-anywhere.herokuapp.com/';\n return fetch(`${corsUrl}https://api.bilibili.com/x/web-interface/view?aid=${av}`)\n .then(res => res.json())\n .then(res => {\n if (res.code === 0 && res.data && res.data.cid) {\n return fetch(`${corsUrl}https://api.bilibili.com/x/v1/dm/list.so?oid=${res.data.cid}`)\n .then(res => res.text())\n .then(xmlString => {\n return bilibiliDanmuParseFromXml(xmlString);\n });\n }\n throw new Error(`Unable to get data: ${JSON.stringify(res)}`);\n });\n}","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","export default class Danmuku {\n constructor(art, option = {}) {\n this.art = art;\n this.queue = {};\n this.current = [];\n this.layer = {};\n this.isStop = false;\n this.timer = null;\n this.option = Object.assign({}, Danmuku.option, option);\n art.constructor.validator(this.option, Danmuku.scheme);\n if (typeof this.option.danmus === 'function') {\n this.option.danmus().then(danmus => {\n danmus.forEach(this.emit);\n this.init();\n });\n } else {\n this.option.danmus.forEach(this.emit);\n this.init();\n }\n }\n\n static get option() {\n return {\n danmus: [],\n speed: 5,\n opacity: 1,\n color: '#fff',\n size: 14,\n };\n }\n\n static get scheme() {\n return {\n danmus: 'array|function',\n speed: 'number',\n opacity: 'number',\n color: 'string',\n size: 'number',\n };\n }\n\n init() {\n const { layers } = this.art;\n this.layer = layers.add({\n name: 'danmu',\n style: {\n position: 'absolute',\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n },\n });\n\n this.update();\n this.art.on('video:play', this.start.bind(this));\n this.art.on('video:pause', this.stop.bind(this));\n this.art.on('video:ended', this.stop.bind(this));\n this.art.on('destroy', this.stop.bind(this));\n }\n\n emit(danmu = {}) {\n const { errorHandle } = this.art.constructor.utils;\n errorHandle(danmu.text, 'Danmu text cannot be empty');\n errorHandle(danmu.time, 'Danmu time cannot be empty');\n if (this.queue[danmu.time]) {\n this.queue[danmu.time].push(danmu);\n } else {\n this.queue[danmu.time] = [danmu];\n }\n // this.art.emit('artplayerPluginDanmu:emit', danmu);\n // if (!this.isStop) {\n // const { clientWidth: playerWidth, clientHeight: playerHeight } = this.art.template.$player;\n // const danmuItem = this.getDanmuItem();\n // danmuItem.$ref.innerText = danmu.text;\n // danmuItem.$ref.style.fontSize = danmu.size || this.option.size;\n // const { clientWidth: danmuWidth, clientHeight: danmuHeight } = danmuItem.$ref;\n // danmuItem.$ref.style.opacity = danmu.opacity || this.option.opacity;\n // danmuItem.$ref.style.color = danmu.color || this.option.color;\n // danmuItem.$ref.style.top = this.getDanmuTop(playerHeight, danmuHeight);\n // danmuItem.$ref.style.left = `${playerWidth}px`;\n // danmuItem.$ref.style.transform = `translateX(${-playerWidth -\n // danmuWidth}px) translateY(0px) translateZ(0px)`;\n // danmuItem.$ref.style.transition = `-webkit-transform ${danmu.speed || this.option.speed}s linear 0s`;\n // this.art.emit('artplayerPluginDanmu:emit', danmu);\n // }\n }\n\n getDanmuItem() {\n const { setStyles, append } = this.art.constructor.utils;\n const inactiveItem = this.current.find(item => item.state === 'inactive');\n if (inactiveItem) {\n inactiveItem.time = Date.now();\n inactiveItem.$ref.style.transform = 'translateX(0px) translateY(0px) translateZ(0px)';\n inactiveItem.$ref.style.transition = '-webkit-transform 0s linear 0s';\n return inactiveItem;\n }\n const $ref = document.createElement('div');\n setStyles($ref, {\n userSelect: 'none',\n position: 'absolute',\n whiteSpace: 'pre',\n pointerEvents: 'none',\n perspective: '500px',\n display: 'inline-block',\n willChange: 'transform',\n fontFamily: 'SimHei, \"Microsoft JhengHei\", Arial, Helvetica, sans-serif',\n fontWeight: 'normal',\n lineHeight: '1.125',\n textShadow:\n '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 return this.current.push({\n state: 'active',\n time: Date.now(),\n $ref: append(this.layer.$ref, $ref),\n });\n }\n\n getDanmuTop(playerHeight, danmuHeight) {\n return 0;\n }\n\n update() {\n const {\n template: { $player },\n player,\n } = this.art;\n this.timer = window.requestAnimationFrame(() => {\n this.current.forEach(item => {\n if (Date.now() - item.time >= this.option.speed) {\n item.state = 'inactive';\n }\n });\n\n Object.keys(this.queue).filter(time => {\n return player.currentTime + 0.5 >= time && time >= player.currentTime - 0.5;\n }).reduce((result, key) => {\n return result.concat(this.queue[key]);\n }, []).forEach(item => {\n console.log(item);\n });\n\n if (!this.isStop && player.playing) {\n this.update();\n }\n });\n }\n\n stop() {\n this.isStop = true;\n window.cancelAnimationFrame(this.timer);\n this.art.emit('artplayerPluginDanmu:stop');\n }\n\n start() {\n this.isStop = false;\n this.art.emit('artplayerPluginDanmu:start');\n }\n\n show() {\n this.layer.$ref.style = 'none';\n this.art.emit('artplayerPluginDanmu:show');\n }\n\n hide() {\n this.layer.$ref.style = 'block';\n this.art.emit('artplayerPluginDanmu:hide');\n }\n}\n","import { bilibiliDanmuParseFromXml, bilibiliDanmuParseFromAv } from './bilibiliDanmuParse';\nimport Danmuku from './danmuku';\n\nfunction artplayerPluginDanmu(option) {\n return art => {\n const danmuku = new Danmuku(art, option);\n return {\n name: 'artplayerPluginDanmu',\n emit: danmuku.emit.bind(danmuku),\n start: danmuku.start.bind(danmuku),\n stop: danmuku.stop.bind(danmuku),\n hide: danmuku.hide.bind(danmuku),\n show: danmuku.show.bind(danmuku),\n };\n };\n}\n\nartplayerPluginDanmu.bilibiliDanmuParseFromXml = bilibiliDanmuParseFromXml;\nartplayerPluginDanmu.bilibiliDanmuParseFromAv = bilibiliDanmuParseFromAv;\nwindow.artplayerPluginDanmu = artplayerPluginDanmu;\nexport default artplayerPluginDanmu;\n"],"names":["bilibiliDanmuParseFromXml","xmlString","srtList","match","length","map","item","attrStr","text","attr","split","trim","time","Number","mode","size","color","toString","timestamp","pool","userID","rowID","bilibiliDanmuParseFromAv","av","corsUrl","fetch","then","res","json","code","data","cid","Error","JSON","stringify","Danmuku","art","option","queue","current","layer","isStop","timer","Object","assign","constructor","validator","scheme","danmus","forEach","emit","init","layers","add","name","style","position","left","top","right","bottom","width","height","overflow","update","on","start","bind","stop","danmu","errorHandle","utils","push","setStyles","append","inactiveItem","find","state","Date","now","$ref","transform","transition","document","createElement","userSelect","whiteSpace","pointerEvents","perspective","display","willChange","fontFamily","fontWeight","lineHeight","textShadow","playerHeight","danmuHeight","$player","template","player","window","requestAnimationFrame","speed","keys","filter","currentTime","reduce","result","key","concat","console","log","playing","cancelAnimationFrame","opacity","artplayerPluginDanmu","danmuku","hide","show"],"mappings":"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"} \ No newline at end of file diff --git a/packages/artplayer-plugin-danmu/src/bilibiliDanmuParse.js b/packages/artplayer-plugin-danmu/src/bilibiliDanmuParse.js index 12b5f7dde..baac0332b 100644 --- a/packages/artplayer-plugin-danmu/src/bilibiliDanmuParse.js +++ b/packages/artplayer-plugin-danmu/src/bilibiliDanmuParse.js @@ -1,24 +1,21 @@ export function bilibiliDanmuParseFromXml(xmlString) { if (typeof xmlString !== 'string') return []; - const regSrt = '(.+)'; - const listReg = new RegExp(regSrt, 'gi'); - const itemReg = new RegExp(regSrt, 'i'); - const srtList = xmlString.match(listReg); + const srtList = xmlString.match(/[\S ]*?)<\/d>/gi); return srtList.length ? srtList.map(item => { - const [, attrStr, text] = item.match(itemReg); - const attr = attrStr.split(',').map(Number); + const [, attrStr, text] = item.match(/(.+)<\/d>/); + const attr = attrStr.split(','); return attr.length === 8 && text.trim() ? { text, - time: attr[0], - mode: attr[1], - size: attr[2], - color: `#${attr[3].toString(16)}`, - timestamp: attr[4], - pool: attr[5], + time: Number(attr[0]), + mode: Number(attr[1]), + size: Number(attr[2]), + color: `#${Number(attr[3]).toString(16)}`, + timestamp: Number(attr[4]), + pool: Number(attr[5]), userID: attr[6], - rowID: attr[7], + rowID: Number(attr[7]), } : null; }) diff --git a/packages/artplayer-plugin-danmu/src/danmuku.js b/packages/artplayer-plugin-danmu/src/danmuku.js index 358d6836d..f8997b7d6 100644 --- a/packages/artplayer-plugin-danmu/src/danmuku.js +++ b/packages/artplayer-plugin-danmu/src/danmuku.js @@ -2,14 +2,21 @@ export default class Danmuku { constructor(art, option = {}) { this.art = art; this.queue = {}; - this.option = Object.assign({}, Danmuku.option, option); - art.constructor.validator(this.option, Danmuku.scheme); - this.option.danmus.forEach(this.emit); this.current = []; this.layer = {}; this.isStop = false; this.timer = null; - this.init(); + this.option = Object.assign({}, Danmuku.option, option); + art.constructor.validator(this.option, Danmuku.scheme); + if (typeof this.option.danmus === 'function') { + this.option.danmus().then(danmus => { + danmus.forEach(this.emit); + this.init(); + }); + } else { + this.option.danmus.forEach(this.emit); + this.init(); + } } static get option() { @@ -24,16 +31,7 @@ export default class Danmuku { static get scheme() { return { - danmus: { - type: 'array', - child: { - text: 'string', - size: 'number', - time: 'number', - color: 'string', - mode: 'number', - }, - }, + danmus: 'array|function', speed: 'number', opacity: 'number', color: 'string',