diff --git a/docs/assets/example/danmuku.js b/docs/assets/example/danmuku.js
index c6c9ed5eb..c97a8cce3 100644
--- a/docs/assets/example/danmuku.js
+++ b/docs/assets/example/danmuku.js
@@ -26,6 +26,7 @@ var art = new Artplayer({
minWidth: 200, // 输入框最小宽度,范围在[0 ~ 500],填 0 则为无限制
maxWidth: 400, // 输入框最大宽度,范围在[0 ~ Infinity],填 0 则为 100% 宽度
theme: 'dark', // 输入框自定义挂载时的主题色,默认为 dark,可以选填亮色 light
+ heatmap: true, // 是否开启弹幕热度图
beforeEmit: (danmu) => !!danmu.text.trim(), // 发送弹幕前的自定义校验,返回 true 则可以发送
// 通过 mount 选项可以自定义输入框挂载的位置,默认挂载于播放器底部,仅在当宽度小于最小值时生效
diff --git a/docs/uncompiled/artplayer-plugin-danmuku/index.js b/docs/uncompiled/artplayer-plugin-danmuku/index.js
index 0672ac4a0..13c31d019 100644
--- a/docs/uncompiled/artplayer-plugin-danmuku/index.js
+++ b/docs/uncompiled/artplayer-plugin-danmuku/index.js
@@ -149,18 +149,21 @@ var _danmuku = require("./danmuku");
var _danmukuDefault = parcelHelpers.interopDefault(_danmuku);
var _setting = require("./setting");
var _settingDefault = parcelHelpers.interopDefault(_setting);
+var _heatmap = require("./heatmap");
+var _heatmapDefault = parcelHelpers.interopDefault(_heatmap);
function checkVersion(art) {
const { version , utils: { errorHandle } } = art.constructor;
const arr = version.split(".").map(Number);
const major = arr[0];
const minor = arr[1] / 100;
- errorHandle(major + minor >= 5, `Artplayer.js@${version} 不兼容该弹幕库,请更新到 5 版本以上`);
+ errorHandle(major + minor >= 5, `Artplayer.js@${version} 不兼容该弹幕库,请更新到 Artplayer.js@5.x.x 版本以上`);
}
function artplayerPluginDanmuku(option) {
return (art)=>{
checkVersion(art);
const danmuku = new (0, _danmukuDefault.default)(art, option);
(0, _settingDefault.default)(art, danmuku);
+ if (option.heatmap) (0, _heatmapDefault.default)(art, danmuku);
return {
name: "artplayerPluginDanmuku",
emit: danmuku.emit.bind(danmuku),
@@ -184,10 +187,10 @@ function artplayerPluginDanmuku(option) {
exports.default = artplayerPluginDanmuku;
artplayerPluginDanmuku.env = "development";
artplayerPluginDanmuku.version = "5.0.0";
-artplayerPluginDanmuku.build = "2023-04-23 15:35:01";
+artplayerPluginDanmuku.build = "2023-05-02 13:14:10";
if (typeof window !== "undefined") window["artplayerPluginDanmuku"] = artplayerPluginDanmuku;
-},{"./danmuku":"cv7fe","./setting":"cI0ih","@parcel/transformer-js/src/esmodule-helpers.js":"5dUr6"}],"cv7fe":[function(require,module,exports) {
+},{"./danmuku":"cv7fe","./setting":"cI0ih","./heatmap":"bZziT","@parcel/transformer-js/src/esmodule-helpers.js":"5dUr6"}],"cv7fe":[function(require,module,exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _bilibili = require("./bilibili");
@@ -201,6 +204,7 @@ class Danmuku {
this.$danmuku = template.$danmuku;
this.$player = template.$player;
this.art = art;
+ this.danmus = [];
this.queue = [];
this.option = {};
this.$refs = [];
@@ -209,7 +213,7 @@ class Danmuku {
this.timer = null;
this.config(option);
if (this.option.useWorker) try {
- this.worker = new Worker(require("85d40535eae5f839"));
+ this.worker = new Worker(require("12ceab24749100d0"));
} catch (error) {
//
}
@@ -247,6 +251,7 @@ class Danmuku {
maxWidth: 400,
mount: undefined,
theme: "dark",
+ heatmap: false,
beforeEmit: ()=>true
};
}
@@ -269,6 +274,7 @@ class Danmuku {
maxWidth: "number",
mount: "undefined|htmldivelement",
theme: "string",
+ heatmap: "boolean",
beforeEmit: "function"
};
}
@@ -385,16 +391,15 @@ class Danmuku {
}
async load() {
try {
- let danmus = [];
- if (typeof this.option.danmuku === "function") danmus = await this.option.danmuku();
- else if (typeof this.option.danmuku.then === "function") danmus = await this.option.danmuku;
- else if (typeof this.option.danmuku === "string") danmus = await (0, _bilibili.bilibiliDanmuParseFromUrl)(this.option.danmuku);
- else danmus = this.option.danmuku;
- this.utils.errorHandle(Array.isArray(danmus), "Danmuku need return an array as result");
- this.art.emit("artplayerPluginDanmuku:loaded", danmus);
+ if (typeof this.option.danmuku === "function") this.danmus = await this.option.danmuku();
+ else if (typeof this.option.danmuku.then === "function") this.danmus = await this.option.danmuku;
+ else if (typeof this.option.danmuku === "string") this.danmus = await (0, _bilibili.bilibiliDanmuParseFromUrl)(this.option.danmuku);
+ else this.danmus = this.option.danmuku;
+ this.utils.errorHandle(Array.isArray(this.danmus), "Danmuku need return an array as result");
+ this.art.emit("artplayerPluginDanmuku:loaded", this.danmus);
this.queue = [];
this.$danmuku.innerText = "";
- danmus.forEach((danmu)=>this.emit(danmu));
+ this.danmus.forEach((danmu)=>this.emit(danmu));
} catch (error) {
this.art.emit("artplayerPluginDanmuku:error", error);
throw error;
@@ -609,7 +614,7 @@ class Danmuku {
}
exports.default = Danmuku;
-},{"./bilibili":"95SuC","./getDanmuTop":"2ouQq","85d40535eae5f839":"jYsHS","@parcel/transformer-js/src/esmodule-helpers.js":"5dUr6"}],"95SuC":[function(require,module,exports) {
+},{"./bilibili":"95SuC","./getDanmuTop":"2ouQq","12ceab24749100d0":"jYsHS","@parcel/transformer-js/src/esmodule-helpers.js":"5dUr6"}],"95SuC":[function(require,module,exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
parcelHelpers.export(exports, "getMode", ()=>getMode);
@@ -1145,17 +1150,130 @@ if (typeof document !== "undefined") {
module.exports = ".art-danmuku-emitter {\n height: var(--art-control-icon-size, 32px);\n width: 100%;\n max-width: 100%;\n background-color: #ffffff4d;\n border-radius: 3px;\n font-size: 12px;\n line-height: 1;\n display: flex;\n position: relative;\n}\n\n.art-danmuku-emitter .art-backdrop-filter {\n -webkit-backdrop-filter: saturate(180%) blur(20px);\n backdrop-filter: saturate(180%) blur(20px);\n background-color: #000000b3 !important;\n}\n\n.art-danmuku-emitter .art-danmuku-left {\n border-radius: 3px 0 0 3px;\n flex: 1;\n display: flex;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style {\n width: 32px;\n justify-content: center;\n align-items: center;\n display: flex;\n position: relative;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style .art-danmuku-style-panel {\n z-index: 999;\n width: 200px;\n padding-bottom: 10px;\n display: none;\n position: absolute;\n bottom: 30px;\n left: -85px;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style .art-danmuku-style-panel .art-danmuku-style-panel-inner {\n background-color: #000000e6;\n border-radius: 3px;\n flex-direction: column;\n padding: 10px 10px 0;\n display: flex;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style .art-danmuku-style-panel .art-danmuku-style-panel-inner .art-danmuku-style-panel-title {\n margin-bottom: 10px;\n font-size: 13px;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style .art-danmuku-style-panel .art-danmuku-style-panel-inner .art-danmuku-style-panel-modes {\n justify-content: space-between;\n margin-bottom: 15px;\n display: flex;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style .art-danmuku-style-panel .art-danmuku-style-panel-inner .art-danmuku-style-panel-modes .art-danmuku-style-panel-mode {\n width: 47%;\n cursor: pointer;\n color: #fff;\n border: 1px solid #fff;\n justify-content: center;\n padding: 5px 0;\n display: flex;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style .art-danmuku-style-panel .art-danmuku-style-panel-inner .art-danmuku-style-panel-modes .art-danmuku-style-panel-mode.art-current {\n background-color: #00a1d6;\n border: 1px solid #00a1d6;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style .art-danmuku-style-panel .art-danmuku-style-panel-inner .art-danmuku-style-panel-colors {\n flex-wrap: wrap;\n justify-content: space-between;\n gap: 5px;\n margin-bottom: 10px;\n display: flex;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style .art-danmuku-style-panel .art-danmuku-style-panel-inner .art-danmuku-style-panel-colors .art-danmuku-style-panel-color {\n cursor: pointer;\n width: 20px;\n height: 20px;\n border: 1px solid #fff;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style .art-danmuku-style-panel .art-danmuku-style-panel-inner .art-danmuku-style-panel-colors .art-danmuku-style-panel-color.art-current {\n position: relative;\n box-shadow: 0 0 2px #fff;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style .art-danmuku-style-panel .art-danmuku-style-panel-inner .art-danmuku-style-panel-colors .art-danmuku-style-panel-color.art-current:before {\n content: \"\";\n width: 100%;\n height: 100%;\n border: 2px solid #000;\n position: absolute;\n inset: 0;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style:hover .art-danmuku-style-panel {\n display: flex;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style .art-icon {\n opacity: .75;\n cursor: pointer;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-style .art-icon:hover {\n opacity: 1;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-input {\n width: 100%;\n color: #fff;\n background-color: #0000;\n border: none;\n outline: none;\n flex: 1;\n padding: 0 10px 0 0;\n display: flex;\n}\n\n.art-danmuku-emitter .art-danmuku-left .art-danmuku-input::placeholder, .art-danmuku-emitter .art-danmuku-left .art-danmuku-input::-webkit-input-placeholder {\n color: #ffffff80;\n}\n\n.art-danmuku-emitter .art-danmuku-send {\n width: 50px;\n cursor: pointer;\n background-color: #00a1d6;\n border-radius: 0 3px 3px 0;\n justify-content: center;\n align-items: center;\n display: flex;\n}\n\n.art-danmuku-emitter .art-danmuku-send:hover {\n background-color: #00b5e5;\n}\n\n.art-danmuku-emitter .art-danmuku-send.art-disabled {\n opacity: .5;\n pointer-events: none;\n}\n\n.art-danmuku-emitter.art-danmuku-mount {\n max-width: 100% !important;\n}\n\n.art-danmuku-emitter.art-danmuku-mount .art-danmuku-left .art-danmuku-style .art-danmuku-style-panel {\n left: 0;\n}\n\n.art-danmuku-emitter.art-danmuku-mount .art-danmuku-send {\n width: 60px;\n}\n\n.art-danmuku-emitter.art-danmuku-mount.art-danmuku-theme-light .art-danmuku-left {\n background: #f4f4f4;\n border: 1px solid #dadada;\n}\n\n.art-danmuku-emitter.art-danmuku-mount.art-danmuku-theme-light .art-danmuku-left .art-danmuku-style .art-icon svg {\n fill: #666;\n}\n\n.art-danmuku-emitter.art-danmuku-mount.art-danmuku-theme-light .art-danmuku-left .art-danmuku-input {\n color: #000;\n}\n\n.art-danmuku-emitter.art-danmuku-mount.art-danmuku-theme-light .art-danmuku-left .art-danmuku-input::placeholder, .art-danmuku-emitter.art-danmuku-mount.art-danmuku-theme-light .art-danmuku-left .art-danmuku-input::-webkit-input-placeholder {\n color: #00000080;\n}\n\n.art-layer-danmuku-emitter {\n z-index: 99;\n width: 100%;\n position: absolute;\n bottom: -40px;\n left: 0;\n right: 0;\n}\n\n";
},{}],"qeJXh":[function(require,module,exports) {
-module.exports = "\n\n";
+module.exports = "\r\n\r\n";
},{}],"7RwEf":[function(require,module,exports) {
-module.exports = "\n\n";
+module.exports = "\r\n\r\n";
},{}],"3yRfx":[function(require,module,exports) {
-module.exports = "";
+module.exports = "";
},{}],"hoOta":[function(require,module,exports) {
-module.exports = "";
+module.exports = "";
-},{}]},["lIf7X"], "lIf7X", "parcelRequire4dc0")
+},{}],"bZziT":[function(require,module,exports) {
+var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
+parcelHelpers.defineInteropFlag(exports);
+const lib = {
+ map (value, inMin, inMax, outMin, outMax) {
+ return (value - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;
+ },
+ range (start, end, tick) {
+ const s = Math.round(start / tick) * tick;
+ return Array.from({
+ length: Math.floor((end - start) / tick)
+ }, (v, k)=>{
+ return k * tick + s;
+ });
+ }
+};
+const line = (pointA, pointB)=>{
+ const lengthX = pointB[0] - pointA[0];
+ const lengthY = pointB[1] - pointA[1];
+ return {
+ length: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),
+ angle: Math.atan2(lengthY, lengthX)
+ };
+};
+function heatmap(art, danmuku) {
+ art.controls.add({
+ name: "heatmap",
+ position: "top",
+ html: "",
+ style: {
+ height: "50px",
+ width: "100%",
+ pointerEvents: "none"
+ },
+ mounted ($heatmap) {
+ function update() {
+ const svg = {
+ w: $heatmap.offsetWidth,
+ h: $heatmap.offsetHeight
+ };
+ const options = {
+ xMin: 0,
+ xMax: svg.w,
+ yMin: 0,
+ yMax: 128,
+ scale: 0.2,
+ minHeight: Math.floor(svg.h * 0.1),
+ sampling: Math.floor(svg.w / 100),
+ fill: "rgba(255, 255, 255, 0.5)",
+ smoothing: 0.2,
+ flattening: 0
+ };
+ const points = [];
+ const gap = art.duration / svg.w;
+ for(let x = 0; x <= svg.w; x += options.sampling){
+ const y = danmuku.danmus.filter(({ time })=>time > x * gap && time <= (x + options.sampling) * gap).length;
+ points.push([
+ x,
+ y + options.minHeight
+ ]);
+ }
+ const yPoints = points.map((point)=>point[1]);
+ const yMin = Math.min(...yPoints);
+ const yMax = Math.max(...yPoints);
+ const yMid = (yMin + yMax) / 2;
+ for(let i = 0; i < points.length; i++){
+ const point = points[i];
+ const y = point[1];
+ point[1] = y * (y > yMid ? 1 + options.scale : 1 - options.scale);
+ }
+ const controlPoint = (current, previous, next, reverse)=>{
+ const p = previous || current;
+ const n = next || current;
+ const o = line(p, n);
+ const flat = lib.map(Math.cos(o.angle) * options.flattening, 0, 1, 1, 0);
+ const angle = o.angle * flat + (reverse ? Math.PI : 0);
+ const length = o.length * options.smoothing;
+ const x = current[0] + Math.cos(angle) * length;
+ const y = current[1] + Math.sin(angle) * length;
+ return [
+ x,
+ y
+ ];
+ };
+ const bezierCommand = (point, i, a)=>{
+ const cps = controlPoint(a[i - 1], a[i - 2], point);
+ const cpe = controlPoint(point, a[i - 1], a[i + 1], true);
+ const close = i === a.length - 1 ? " z" : "";
+ return `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}${close}`;
+ };
+ const pointsPositions = points.map((e)=>{
+ const x = lib.map(e[0], options.xMin, options.xMax, 0, svg.w);
+ const y = lib.map(e[1], options.yMin, options.yMax, svg.h, 0);
+ return [
+ x,
+ y
+ ];
+ });
+ 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)}`, "");
+ $heatmap.innerHTML = `
+
+ `;
+ }
+ art.on("ready", update);
+ art.on("resize", update);
+ art.emit("artplayerPluginDanmuku:loaded", update);
+ }
+ });
+}
+exports.default = heatmap;
+
+},{"@parcel/transformer-js/src/esmodule-helpers.js":"5dUr6"}]},["lIf7X"], "lIf7X", "parcelRequire4dc0")
//# sourceMappingURL=index.js.map
diff --git a/docs/uncompiled/artplayer-plugin-danmuku/index.js.map b/docs/uncompiled/artplayer-plugin-danmuku/index.js.map
index 534a8992b..0ca15a984 100644
--- a/docs/uncompiled/artplayer-plugin-danmuku/index.js.map
+++ b/docs/uncompiled/artplayer-plugin-danmuku/index.js.map
@@ -1 +1 @@
-{"mappings":"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","sources":["packages/artplayer-plugin-danmuku/src/index.js","packages/artplayer-plugin-danmuku/src/danmuku.js","packages/artplayer-plugin-danmuku/src/bilibili.js","node_modules/@parcel/transformer-js/src/esmodule-helpers.js","packages/artplayer-plugin-danmuku/src/getDanmuTop.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-b61db27680d5896e.js","packages/artplayer-plugin-danmuku/src/setting.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-e633bd0642c0f6d8.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-6b6314fb95d0f9c4.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-63e2f0a59f61ce30.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-8c344af6de265517.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-5db94c18a44eaa0a.js"],"sourcesContent":["import Danmuku from './danmuku';\nimport setting from './setting';\n\nfunction checkVersion(art) {\n const {\n version,\n utils: { errorHandle },\n } = art.constructor;\n const arr = version.split('.').map(Number);\n const major = arr[0];\n const minor = arr[1] / 100;\n errorHandle(major + minor >= 5, `Artplayer.js@${version} 不兼容该弹幕库,请更新到 5 版本以上`);\n}\n\nexport default function artplayerPluginDanmuku(option) {\n return (art) => {\n checkVersion(art);\n const danmuku = new Danmuku(art, option);\n setting(art, danmuku);\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 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.env = process.env.NODE_ENV;\nartplayerPluginDanmuku.version = process.env.APP_VER;\nartplayerPluginDanmuku.build = process.env.BUILD_DATE;\n\nif (typeof window !== 'undefined') {\n window['artplayerPluginDanmuku'] = artplayerPluginDanmuku;\n}\n","import { bilibiliDanmuParseFromUrl } from './bilibili';\nimport getDanmuTop from './getDanmuTop';\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.option = {};\n this.$refs = [];\n this.isStop = false;\n this.isHide = false;\n this.timer = null;\n this.config(option);\n\n if (this.option.useWorker) {\n try {\n this.worker = new Worker(new URL('data-url:./worker.js', import.meta.url));\n } catch (error) {\n //\n }\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.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('resize', this.reset);\n art.on('destroy', this.destroy);\n\n this.load();\n }\n\n static get option() {\n return {\n danmuku: [],\n speed: 5,\n margin: ['2%', '25%'],\n opacity: 1,\n color: '#FFFFFF',\n mode: 0,\n fontSize: 25,\n filter: () => true,\n antiOverlap: true,\n useWorker: true,\n synchronousPlayback: false,\n lockTime: 5,\n maxLength: 100,\n minWidth: 200,\n maxWidth: 400,\n mount: undefined,\n theme: 'dark',\n beforeEmit: () => true,\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 fontSize: 'number|string',\n filter: 'function',\n antiOverlap: 'boolean',\n useWorker: 'boolean',\n synchronousPlayback: 'boolean',\n lockTime: 'number',\n maxLength: 'number',\n minWidth: 'number',\n maxWidth: 'number',\n mount: 'undefined|htmldivelement',\n theme: 'string',\n beforeEmit: 'function',\n };\n }\n\n get isRotate() {\n return this.art.plugins.autoOrientation && 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\n if (typeof value === 'number') {\n return clamp(value, 0, clientHeight);\n }\n\n if (typeof value === 'string' && value.endsWith('%')) {\n const ratio = parseFloat(value) / 100;\n return clamp(clientHeight * ratio, 0, clientHeight);\n }\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\n if (typeof value === 'number') {\n return clamp(value, 0, clientHeight);\n }\n\n if (typeof value === 'string' && value.endsWith('%')) {\n const ratio = parseFloat(value) / 100;\n return clamp(clientHeight * ratio, 0, clientHeight);\n }\n\n return Danmuku.option.margin[1];\n }\n\n filter(state, callback) {\n return this.queue.filter((danmu) => danmu.$state === state).map(callback);\n }\n\n getLeft($ref) {\n const rect = $ref.getBoundingClientRect();\n return this.isRotate ? rect.top : rect.left;\n }\n\n getRef() {\n const $refCache = this.$refs.pop();\n if ($refCache) return $refCache;\n\n const $ref = document.createElement('div');\n\n $ref.style.cssText = `\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 return $ref;\n }\n\n getReady() {\n const { currentTime } = this.art;\n return this.queue.filter((danmu) => {\n return (\n danmu.$state === 'ready' ||\n (danmu.$state === 'wait' && currentTime + 0.1 >= danmu.time && danmu.time >= currentTime - 0.1)\n );\n });\n }\n\n getEmits() {\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 getFontSize(fontSize) {\n const { clamp } = this.utils;\n const { clientHeight } = this.$player;\n\n if (typeof fontSize === 'number') {\n return clamp(fontSize, 12, clientHeight);\n }\n\n if (typeof fontSize === 'string' && fontSize.endsWith('%')) {\n const ratio = parseFloat(fontSize) / 100;\n return clamp(clientHeight * ratio, 12, clientHeight);\n }\n\n return Danmuku.option.fontSize;\n }\n\n postMessage(message = {}) {\n return new Promise((resolve) => {\n if (this.option.useWorker && this.worker && this.worker.postMessage) {\n message.id = Date.now();\n this.worker.postMessage(message);\n this.worker.onmessage = (event) => {\n const { data } = event;\n if (data.id === message.id) {\n resolve(data);\n }\n };\n } else {\n const top = getDanmuTop(message);\n resolve({ top });\n }\n });\n }\n\n async load() {\n try {\n let danmus = [];\n if (typeof this.option.danmuku === 'function') {\n danmus = await this.option.danmuku();\n } else if (typeof this.option.danmuku.then === 'function') {\n danmus = await this.option.danmuku;\n } else if (typeof this.option.danmuku === 'string') {\n danmus = await bilibiliDanmuParseFromUrl(this.option.danmuku);\n } else {\n danmus = this.option.danmuku;\n }\n\n this.utils.errorHandle(Array.isArray(danmus), 'Danmuku need return an array as result');\n this.art.emit('artplayerPluginDanmuku:loaded', danmus);\n\n this.queue = [];\n this.$danmuku.innerText = '';\n danmus.forEach((danmu) => this.emit(danmu));\n } catch (error) {\n this.art.emit('artplayerPluginDanmuku:error', error);\n throw error;\n }\n\n return this;\n }\n\n config(option) {\n const { clamp } = this.utils;\n\n this.option = Object.assign({}, Danmuku.option, this.option, option);\n this.validator(this.option, Danmuku.scheme);\n\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(Math.floor(this.option.lockTime), 0, 60);\n this.option.maxLength = clamp(this.option.maxLength, 0, 500);\n this.option.minWidth = clamp(this.option.minWidth, 0, 500);\n this.option.maxWidth = clamp(this.option.maxWidth, 0, Infinity);\n\n if (option.fontSize) {\n this.option.fontSize = this.getFontSize(this.option.fontSize);\n this.reset();\n }\n\n this.art.emit('artplayerPluginDanmuku:config', this.option);\n\n return this;\n }\n\n makeWait(danmu) {\n danmu.$state = 'wait';\n if (danmu.$ref) {\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 continue() {\n const { clientWidth } = this.$player;\n this.filter('stop', (danmu) => {\n danmu.$state = 'emit';\n danmu.$lastStartTime = Date.now();\n switch (danmu.mode) {\n case 0: {\n const translateX = clientWidth + danmu.$ref.clientWidth;\n danmu.$ref.style.transform = `translateX(${-translateX}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 suspend() {\n const { clientWidth } = this.$player;\n this.filter('emit', (danmu) => {\n danmu.$state = 'stop';\n switch (danmu.mode) {\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 reset() {\n this.queue.forEach((danmu) => this.makeWait(danmu));\n return this;\n }\n\n update() {\n this.timer = window.requestAnimationFrame(async () => {\n if (this.art.playing && !this.isHide) {\n this.filter('emit', (danmu) => {\n const emitTime = (Date.now() - danmu.$lastStartTime) / 1000;\n danmu.$restTime -= emitTime;\n danmu.$lastStartTime = Date.now();\n if (danmu.$restTime <= 0) {\n this.makeWait(danmu);\n }\n });\n\n const readys = this.getReady();\n const { clientWidth, clientHeight } = this.$player;\n for (let index = 0; index < readys.length; index++) {\n const danmu = readys[index];\n danmu.$ref = this.getRef();\n danmu.$ref.innerText = danmu.text;\n this.$danmuku.appendChild(danmu.$ref);\n\n danmu.$ref.style.left = `${clientWidth}px`;\n danmu.$ref.style.opacity = this.option.opacity;\n danmu.$ref.style.fontSize = `${this.option.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 danmu.$ref.style.marginLeft = '0px';\n\n danmu.$lastStartTime = Date.now();\n danmu.$restTime =\n this.option.synchronousPlayback && this.art.playbackRate\n ? this.option.speed / Number(this.art.playbackRate)\n : this.option.speed;\n\n const target = {\n mode: danmu.mode,\n height: danmu.$ref.clientHeight,\n speed: (clientWidth + danmu.$ref.clientWidth) / danmu.$restTime,\n };\n\n const { top } = await this.postMessage({\n target,\n emits: this.getEmits(),\n antiOverlap: this.option.antiOverlap,\n clientWidth: clientWidth,\n clientHeight: clientHeight,\n marginBottom: this.marginBottom,\n marginTop: this.marginTop,\n });\n\n if (danmu.$ref) {\n if (!this.isStop && top !== undefined) {\n danmu.$state = 'emit';\n danmu.$ref.style.visibility = 'visible';\n\n switch (danmu.mode) {\n case 0: {\n danmu.$ref.style.top = `${top}px`;\n const translateX = clientWidth + danmu.$ref.clientWidth;\n danmu.$ref.style.transform = `translateX(${-translateX}px)`;\n danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`;\n break;\n }\n case 1:\n danmu.$ref.style.left = '50%';\n danmu.$ref.style.top = `${top}px`;\n danmu.$ref.style.marginLeft = `-${danmu.$ref.clientWidth / 2}px`;\n break;\n default:\n break;\n }\n } else {\n danmu.$state = 'ready';\n this.$refs.push(danmu.$ref);\n danmu.$ref = null;\n }\n }\n }\n }\n\n if (!this.isStop) {\n this.update();\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 show() {\n this.isHide = false;\n this.start();\n this.$danmuku.style.display = 'block';\n this.art.emit('artplayerPluginDanmuku:show');\n return this;\n }\n\n hide() {\n this.isHide = true;\n this.stop();\n this.queue.forEach((item) => this.makeWait(item));\n this.$danmuku.style.display = 'none';\n this.art.emit('artplayerPluginDanmuku:hide');\n return this;\n }\n\n emit(danmu) {\n this.validator(danmu, {\n text: 'string',\n mode: 'number|undefined',\n color: 'string|undefined',\n time: 'number|undefined',\n border: 'boolean|undefined',\n });\n\n if (!danmu.text.trim()) return this;\n if (!this.option.filter(danmu)) return this;\n\n if (danmu.time) {\n danmu.time = this.utils.clamp(danmu.time, 0, Infinity);\n } else {\n danmu.time = this.art.currentTime + 0.5;\n }\n\n if (danmu.mode === undefined) {\n danmu.mode = this.option.mode;\n }\n\n if (danmu.color === undefined) {\n danmu.color = this.option.color;\n }\n\n this.queue.push({\n ...danmu,\n $state: 'wait',\n $ref: null,\n $restTime: 0,\n $lastStartTime: 0,\n });\n\n return this;\n }\n\n destroy() {\n this.stop();\n if (this.worker && this.worker.terminate) 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('fullscreen', this.reset);\n this.art.off('fullscreenWeb', this.reset);\n this.art.off('destroy', this.destroy);\n this.art.emit('artplayerPluginDanmuku:destroy');\n }\n}\n","export function getMode(key) {\n switch (key) {\n case 1:\n case 2:\n case 3:\n return 0;\n case 4:\n case 5:\n return 1;\n default:\n return 0;\n }\n}\n\nexport function bilibiliDanmuParseFromXml(xmlString) {\n if (typeof xmlString !== 'string') return [];\n const matches = xmlString.matchAll(/.+?)\"(?: .*?)?>(?.+?)<\\/d>/gs);\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 } else {\n return null;\n }\n })\n .filter(Boolean);\n}\n\nexport function bilibiliDanmuParseFromUrl(url) {\n return fetch(url)\n .then((res) => res.text())\n .then((xmlString) => bilibiliDanmuParseFromXml(xmlString));\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 (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) {\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","export default function getDanmuTop({\n target,\n emits,\n clientWidth,\n clientHeight,\n marginBottom,\n marginTop,\n antiOverlap,\n}) {\n const danmus = emits\n .filter((item) => item.mode === target.mode && item.top <= clientHeight - marginBottom)\n .sort((prev, next) => prev.top - next.top);\n\n if (danmus.length === 0) {\n return marginTop;\n }\n\n danmus.unshift({\n top: 0,\n left: 0,\n right: 0,\n height: marginTop,\n width: clientWidth,\n speed: 0,\n distance: clientWidth,\n });\n\n danmus.push({\n top: clientHeight - marginBottom,\n left: 0,\n right: 0,\n height: marginBottom,\n width: clientWidth,\n speed: 0,\n distance: clientWidth,\n });\n\n for (let index = 1; index < danmus.length; index += 1) {\n const item = danmus[index];\n const prev = danmus[index - 1];\n const prevBottom = prev.top + prev.height;\n const diff = item.top - prevBottom;\n if (diff >= target.height) {\n return prevBottom;\n }\n }\n\n const topMap = [];\n for (let index = 1; index < danmus.length - 1; index += 1) {\n const item = danmus[index];\n if (topMap.length) {\n const last = topMap[topMap.length - 1];\n if (last[0].top === item.top) {\n last.push(item);\n } else {\n topMap.push([item]);\n }\n } else {\n topMap.push([item]);\n }\n }\n\n if (antiOverlap) {\n switch (target.mode) {\n case 0: {\n const result = topMap.find((list) => {\n return list.every((danmu) => {\n if (clientWidth < danmu.distance) return false;\n if (target.speed < danmu.speed) return true;\n const overlapTime = danmu.right / (target.speed - danmu.speed);\n if (overlapTime > danmu.time) return true;\n return false;\n });\n });\n\n return result && result[0] ? result[0].top : undefined;\n }\n case 1:\n return undefined;\n default:\n break;\n }\n } else {\n switch (target.mode) {\n case 0:\n topMap.sort((prev, next) => {\n const nextMinRight = Math.min(...next.map((item) => item.right));\n const prevMinRight = Math.min(...prev.map((item) => item.right));\n return nextMinRight * next.length - prevMinRight * prev.length;\n });\n break;\n case 1:\n topMap.sort((prev, next) => {\n const nextMaxWidth = Math.max(...next.map((item) => item.width));\n const prevMaxWidth = Math.max(...prev.map((item) => item.width));\n return prevMaxWidth * prev.length - nextMaxWidth * next.length;\n });\n break;\n default:\n break;\n }\n\n return topMap[0][0].top;\n }\n}\n","module.exports = \"f89064c706e65d5d\";","import style from 'bundle-text:./style.less';\nimport danmuOn from 'bundle-text:./img/danmu-on.svg';\nimport danmuOff from 'bundle-text:./img/danmu-off.svg';\nimport danmuConfig from 'bundle-text:./img/danmu-config.svg';\nimport danmuStyle from 'bundle-text:./img/danmu-style.svg';\n\nexport default function setting(art, danmuku) {\n const { option } = danmuku;\n const {\n template: { $controlsCenter, $player },\n constructor: {\n utils: { removeClass, addClass, append, setStyle, tooltip, query, inverseClass, getIcon },\n },\n } = art;\n\n setStyle($controlsCenter, 'display', 'flex');\n\n const $danmuOn = getIcon('danmu-on', danmuOn);\n const $danmuOff = getIcon('danmu-off', danmuOff);\n const $danmuConfig = getIcon('danmu-config', danmuConfig);\n const $danmuStyle = getIcon('danmu-style', danmuStyle);\n\n function addEmitter() {\n const colors = [\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 ].map((item) => {\n const isCurrent = option.color === item ? ' art-current' : '';\n return ``;\n });\n\n const $emitter = append(\n $controlsCenter,\n `\n \n
\n
\n
\n
\n
模式
\n
\n
颜色
\n
\n ${colors.join('')}\n
\n
\n
\n
\n
\n
\n
发送
\n
\n `,\n );\n\n const $style = query('.art-danmuku-style', $emitter);\n const $input = query('.art-danmuku-input', $emitter);\n const $send = query('.art-danmuku-send', $emitter);\n const $panel = query('.art-danmuku-style-panel-inner', $emitter);\n const $modes = query('.art-danmuku-style-panel-modes', $emitter);\n const $colors = query('.art-danmuku-style-panel-colors', $emitter);\n const $layer = option.mount || append($player, '');\n\n if (art.option.backdrop) {\n addClass($panel, 'art-backdrop-filter');\n }\n\n if (option.theme) {\n addClass($emitter, `art-danmuku-theme-${option.theme}`);\n }\n\n let timer = null;\n let mode = option.mode;\n let color = option.color;\n append($style, $danmuStyle);\n\n function countdown(time) {\n if (time <= 0) {\n timer = null;\n $send.innerText = '发送';\n removeClass($send, 'art-disabled');\n } else {\n $send.innerText = time;\n timer = setTimeout(() => countdown(time - 1), 1000);\n }\n }\n\n function onSend() {\n const danmu = {\n mode,\n color,\n border: true,\n text: $input.value.trim(),\n };\n\n if (timer === null && option.beforeEmit(danmu)) {\n $input.value = '';\n danmuku.emit(danmu);\n addClass($send, 'art-disabled');\n countdown(option.lockTime);\n art.emit('artplayerPluginDanmuku:emit', danmu);\n }\n }\n\n function onResize() {\n if ($controlsCenter.clientWidth < option.minWidth) {\n append($layer, $emitter);\n setStyle($layer, 'display', 'flex');\n addClass($emitter, 'art-danmuku-mount');\n\n if (!option.mount) {\n setStyle($player, 'marginBottom', '40px');\n }\n } else {\n append($controlsCenter, $emitter);\n setStyle($layer, 'display', 'none');\n removeClass($emitter, 'art-danmuku-mount');\n\n if (!option.mount) {\n setStyle($player, 'marginBottom', null);\n }\n }\n }\n\n art.proxy($send, 'click', onSend);\n\n art.proxy($input, 'keypress', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n onSend();\n }\n });\n\n art.proxy($modes, 'click', (event) => {\n const { dataset } = event.target;\n if (dataset.mode) {\n mode = Number(dataset.mode);\n inverseClass(event.target, 'art-current');\n }\n });\n\n art.proxy($colors, 'click', (event) => {\n const { dataset } = event.target;\n if (dataset.color) {\n color = dataset.color;\n inverseClass(event.target, 'art-current');\n }\n });\n\n onResize();\n art.on('resize', () => {\n if (!art.isInput) {\n onResize();\n }\n });\n\n art.on('destroy', () => {\n if (option.mount && $emitter.parentElement === option.mount) {\n option.mount.removeChild($emitter);\n }\n });\n }\n\n function addControl() {\n art.controls.add({\n position: 'right',\n name: 'danmuku',\n click: function () {\n if (danmuku.isHide) {\n danmuku.show();\n art.notice.show = '弹幕显示';\n setStyle($danmuOn, 'display', null);\n setStyle($danmuOff, 'display', 'none');\n } else {\n danmuku.hide();\n art.notice.show = '弹幕隐藏';\n setStyle($danmuOn, 'display', 'none');\n setStyle($danmuOff, 'display', null);\n }\n },\n mounted($ref) {\n append($ref, $danmuOn);\n append($ref, $danmuOff);\n tooltip($ref, '弹幕开关');\n setStyle($danmuOff, 'display', 'none');\n },\n });\n }\n\n function addSetting() {\n art.setting.add({\n width: 270,\n name: 'danmuku',\n html: '弹幕设置',\n tooltip: '更多',\n icon: $danmuConfig,\n selector: [\n {\n width: 200,\n html: '播放速度',\n icon: '',\n tooltip: '适中',\n selector: [\n {\n html: '极慢',\n time: 10,\n },\n {\n html: '较慢',\n time: 7.5,\n },\n {\n default: true,\n html: '适中',\n time: 5,\n },\n {\n html: '较快',\n time: 2.5,\n },\n {\n html: '极快',\n time: 1,\n },\n ],\n onSelect: function (item) {\n danmuku.config({\n speed: item.time,\n });\n return item.html;\n },\n },\n {\n width: 200,\n html: '字体大小',\n icon: '',\n tooltip: '适中',\n selector: [\n {\n html: '极小',\n fontSize: '4%',\n },\n {\n html: '较小',\n fontSize: '5%',\n },\n {\n default: true,\n html: '适中',\n fontSize: '6%',\n },\n {\n html: '较大',\n fontSize: '7%',\n },\n {\n html: '极大',\n fontSize: '8%',\n },\n ],\n onSelect: function (item) {\n danmuku.config({\n fontSize: item.fontSize,\n });\n return item.html;\n },\n },\n {\n width: 200,\n html: '不透明度',\n icon: '',\n tooltip: '100%',\n selector: [\n {\n default: true,\n opacity: 1,\n html: '100%',\n },\n {\n opacity: 0.75,\n html: '75%',\n },\n {\n opacity: 0.5,\n html: '50%',\n },\n {\n opacity: 0.25,\n html: '25%',\n },\n {\n opacity: 0,\n html: '0%',\n },\n ],\n onSelect: function (item) {\n danmuku.config({\n opacity: item.opacity,\n });\n return item.html;\n },\n },\n {\n width: 200,\n html: '显示范围',\n icon: '',\n tooltip: '3/4',\n selector: [\n {\n html: '1/4',\n margin: [10, '75%'],\n },\n {\n html: '半屏',\n margin: [10, '50%'],\n },\n {\n default: true,\n html: '3/4',\n margin: [10, '25%'],\n },\n {\n html: '满屏',\n margin: [10, 10],\n },\n ],\n onSelect: function (item) {\n danmuku.config({\n margin: item.margin,\n });\n return item.html;\n },\n },\n {\n html: '弹幕防重叠',\n icon: '',\n tooltip: option.antiOverlap ? '开启' : '关闭',\n switch: option.antiOverlap,\n onSwitch(item) {\n danmuku.config({\n antiOverlap: !item.switch,\n });\n item.tooltip = item.switch ? '关闭' : '开启';\n return !item.switch;\n },\n },\n {\n html: '同步视频速度',\n icon: '',\n tooltip: option.synchronousPlayback ? '开启' : '关闭',\n switch: option.synchronousPlayback,\n onSwitch(item) {\n danmuku.config({\n synchronousPlayback: !item.switch,\n });\n item.tooltip = item.switch ? '关闭' : '开启';\n return !item.switch;\n },\n },\n ],\n });\n }\n\n addEmitter();\n addControl();\n addSetting();\n}\n\nif (typeof document !== 'undefined') {\n if (!document.getElementById('artplayer-plugin-danmuku')) {\n const $style = document.createElement('style');\n $style.id = 'artplayer-plugin-danmuku';\n $style.textContent = style;\n document.head.appendChild($style);\n }\n}\n","module.exports = \"c09c1588fb4faeee\";","module.exports = \"ed96d9cba019193e\";","module.exports = \"50e63783768a51c7\";","module.exports = \"6d994b91570c2465\";","module.exports = \"5e37f7b89903ad61\";"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"}
\ No newline at end of file
+{"mappings":"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","sources":["packages/artplayer-plugin-danmuku/src/index.js","packages/artplayer-plugin-danmuku/src/danmuku.js","packages/artplayer-plugin-danmuku/src/bilibili.js","node_modules/@parcel/transformer-js/src/esmodule-helpers.js","packages/artplayer-plugin-danmuku/src/getDanmuTop.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-b61db27680d5896e.js","packages/artplayer-plugin-danmuku/src/setting.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-e633bd0642c0f6d8.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-6b6314fb95d0f9c4.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-63e2f0a59f61ce30.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-8c344af6de265517.js","node_modules/@parcel/runtime-js/lib/bundles/runtime-5db94c18a44eaa0a.js","packages/artplayer-plugin-danmuku/src/heatmap.js"],"sourcesContent":["import Danmuku from './danmuku';\nimport setting from './setting';\nimport heatmap from './heatmap';\n\nfunction checkVersion(art) {\n const {\n version,\n utils: { errorHandle },\n } = art.constructor;\n const arr = version.split('.').map(Number);\n const major = arr[0];\n const minor = arr[1] / 100;\n errorHandle(major + minor >= 5, `Artplayer.js@${version} 不兼容该弹幕库,请更新到 Artplayer.js@5.x.x 版本以上`);\n}\n\nexport default function artplayerPluginDanmuku(option) {\n return (art) => {\n checkVersion(art);\n const danmuku = new Danmuku(art, option);\n setting(art, danmuku);\n if (option.heatmap) heatmap(art, danmuku);\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 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.env = process.env.NODE_ENV;\nartplayerPluginDanmuku.version = process.env.APP_VER;\nartplayerPluginDanmuku.build = process.env.BUILD_DATE;\n\nif (typeof window !== 'undefined') {\n window['artplayerPluginDanmuku'] = artplayerPluginDanmuku;\n}\n","import { bilibiliDanmuParseFromUrl } from './bilibili';\nimport getDanmuTop from './getDanmuTop';\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.danmus = [];\n this.queue = [];\n this.option = {};\n this.$refs = [];\n this.isStop = false;\n this.isHide = false;\n this.timer = null;\n this.config(option);\n\n if (this.option.useWorker) {\n try {\n this.worker = new Worker(new URL('data-url:./worker.js', import.meta.url));\n } catch (error) {\n //\n }\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.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('resize', this.reset);\n art.on('destroy', this.destroy);\n\n this.load();\n }\n\n static get option() {\n return {\n danmuku: [],\n speed: 5,\n margin: ['2%', '25%'],\n opacity: 1,\n color: '#FFFFFF',\n mode: 0,\n fontSize: 25,\n filter: () => true,\n antiOverlap: true,\n useWorker: true,\n synchronousPlayback: false,\n lockTime: 5,\n maxLength: 100,\n minWidth: 200,\n maxWidth: 400,\n mount: undefined,\n theme: 'dark',\n heatmap: false,\n beforeEmit: () => true,\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 fontSize: 'number|string',\n filter: 'function',\n antiOverlap: 'boolean',\n useWorker: 'boolean',\n synchronousPlayback: 'boolean',\n lockTime: 'number',\n maxLength: 'number',\n minWidth: 'number',\n maxWidth: 'number',\n mount: 'undefined|htmldivelement',\n theme: 'string',\n heatmap: 'boolean',\n beforeEmit: 'function',\n };\n }\n\n get isRotate() {\n return this.art.plugins.autoOrientation && 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\n if (typeof value === 'number') {\n return clamp(value, 0, clientHeight);\n }\n\n if (typeof value === 'string' && value.endsWith('%')) {\n const ratio = parseFloat(value) / 100;\n return clamp(clientHeight * ratio, 0, clientHeight);\n }\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\n if (typeof value === 'number') {\n return clamp(value, 0, clientHeight);\n }\n\n if (typeof value === 'string' && value.endsWith('%')) {\n const ratio = parseFloat(value) / 100;\n return clamp(clientHeight * ratio, 0, clientHeight);\n }\n\n return Danmuku.option.margin[1];\n }\n\n filter(state, callback) {\n return this.queue.filter((danmu) => danmu.$state === state).map(callback);\n }\n\n getLeft($ref) {\n const rect = $ref.getBoundingClientRect();\n return this.isRotate ? rect.top : rect.left;\n }\n\n getRef() {\n const $refCache = this.$refs.pop();\n if ($refCache) return $refCache;\n\n const $ref = document.createElement('div');\n\n $ref.style.cssText = `\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 return $ref;\n }\n\n getReady() {\n const { currentTime } = this.art;\n return this.queue.filter((danmu) => {\n return (\n danmu.$state === 'ready' ||\n (danmu.$state === 'wait' && currentTime + 0.1 >= danmu.time && danmu.time >= currentTime - 0.1)\n );\n });\n }\n\n getEmits() {\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 getFontSize(fontSize) {\n const { clamp } = this.utils;\n const { clientHeight } = this.$player;\n\n if (typeof fontSize === 'number') {\n return clamp(fontSize, 12, clientHeight);\n }\n\n if (typeof fontSize === 'string' && fontSize.endsWith('%')) {\n const ratio = parseFloat(fontSize) / 100;\n return clamp(clientHeight * ratio, 12, clientHeight);\n }\n\n return Danmuku.option.fontSize;\n }\n\n postMessage(message = {}) {\n return new Promise((resolve) => {\n if (this.option.useWorker && this.worker && this.worker.postMessage) {\n message.id = Date.now();\n this.worker.postMessage(message);\n this.worker.onmessage = (event) => {\n const { data } = event;\n if (data.id === message.id) {\n resolve(data);\n }\n };\n } else {\n const top = getDanmuTop(message);\n resolve({ top });\n }\n });\n }\n\n async load() {\n try {\n if (typeof this.option.danmuku === 'function') {\n this.danmus = await this.option.danmuku();\n } else if (typeof this.option.danmuku.then === 'function') {\n this.danmus = await this.option.danmuku;\n } else if (typeof this.option.danmuku === 'string') {\n this.danmus = await bilibiliDanmuParseFromUrl(this.option.danmuku);\n } else {\n this.danmus = this.option.danmuku;\n }\n\n this.utils.errorHandle(Array.isArray(this.danmus), 'Danmuku need return an array as result');\n this.art.emit('artplayerPluginDanmuku:loaded', this.danmus);\n\n this.queue = [];\n this.$danmuku.innerText = '';\n this.danmus.forEach((danmu) => this.emit(danmu));\n } catch (error) {\n this.art.emit('artplayerPluginDanmuku:error', error);\n throw error;\n }\n\n return this;\n }\n\n config(option) {\n const { clamp } = this.utils;\n\n this.option = Object.assign({}, Danmuku.option, this.option, option);\n this.validator(this.option, Danmuku.scheme);\n\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(Math.floor(this.option.lockTime), 0, 60);\n this.option.maxLength = clamp(this.option.maxLength, 0, 500);\n this.option.minWidth = clamp(this.option.minWidth, 0, 500);\n this.option.maxWidth = clamp(this.option.maxWidth, 0, Infinity);\n\n if (option.fontSize) {\n this.option.fontSize = this.getFontSize(this.option.fontSize);\n this.reset();\n }\n\n this.art.emit('artplayerPluginDanmuku:config', this.option);\n\n return this;\n }\n\n makeWait(danmu) {\n danmu.$state = 'wait';\n if (danmu.$ref) {\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 continue() {\n const { clientWidth } = this.$player;\n this.filter('stop', (danmu) => {\n danmu.$state = 'emit';\n danmu.$lastStartTime = Date.now();\n switch (danmu.mode) {\n case 0: {\n const translateX = clientWidth + danmu.$ref.clientWidth;\n danmu.$ref.style.transform = `translateX(${-translateX}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 suspend() {\n const { clientWidth } = this.$player;\n this.filter('emit', (danmu) => {\n danmu.$state = 'stop';\n switch (danmu.mode) {\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 reset() {\n this.queue.forEach((danmu) => this.makeWait(danmu));\n return this;\n }\n\n update() {\n this.timer = window.requestAnimationFrame(async () => {\n if (this.art.playing && !this.isHide) {\n this.filter('emit', (danmu) => {\n const emitTime = (Date.now() - danmu.$lastStartTime) / 1000;\n danmu.$restTime -= emitTime;\n danmu.$lastStartTime = Date.now();\n if (danmu.$restTime <= 0) {\n this.makeWait(danmu);\n }\n });\n\n const readys = this.getReady();\n const { clientWidth, clientHeight } = this.$player;\n for (let index = 0; index < readys.length; index++) {\n const danmu = readys[index];\n danmu.$ref = this.getRef();\n danmu.$ref.innerText = danmu.text;\n this.$danmuku.appendChild(danmu.$ref);\n\n danmu.$ref.style.left = `${clientWidth}px`;\n danmu.$ref.style.opacity = this.option.opacity;\n danmu.$ref.style.fontSize = `${this.option.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 danmu.$ref.style.marginLeft = '0px';\n\n danmu.$lastStartTime = Date.now();\n danmu.$restTime =\n this.option.synchronousPlayback && this.art.playbackRate\n ? this.option.speed / Number(this.art.playbackRate)\n : this.option.speed;\n\n const target = {\n mode: danmu.mode,\n height: danmu.$ref.clientHeight,\n speed: (clientWidth + danmu.$ref.clientWidth) / danmu.$restTime,\n };\n\n const { top } = await this.postMessage({\n target,\n emits: this.getEmits(),\n antiOverlap: this.option.antiOverlap,\n clientWidth: clientWidth,\n clientHeight: clientHeight,\n marginBottom: this.marginBottom,\n marginTop: this.marginTop,\n });\n\n if (danmu.$ref) {\n if (!this.isStop && top !== undefined) {\n danmu.$state = 'emit';\n danmu.$ref.style.visibility = 'visible';\n\n switch (danmu.mode) {\n case 0: {\n danmu.$ref.style.top = `${top}px`;\n const translateX = clientWidth + danmu.$ref.clientWidth;\n danmu.$ref.style.transform = `translateX(${-translateX}px)`;\n danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`;\n break;\n }\n case 1:\n danmu.$ref.style.left = '50%';\n danmu.$ref.style.top = `${top}px`;\n danmu.$ref.style.marginLeft = `-${danmu.$ref.clientWidth / 2}px`;\n break;\n default:\n break;\n }\n } else {\n danmu.$state = 'ready';\n this.$refs.push(danmu.$ref);\n danmu.$ref = null;\n }\n }\n }\n }\n\n if (!this.isStop) {\n this.update();\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 show() {\n this.isHide = false;\n this.start();\n this.$danmuku.style.display = 'block';\n this.art.emit('artplayerPluginDanmuku:show');\n return this;\n }\n\n hide() {\n this.isHide = true;\n this.stop();\n this.queue.forEach((item) => this.makeWait(item));\n this.$danmuku.style.display = 'none';\n this.art.emit('artplayerPluginDanmuku:hide');\n return this;\n }\n\n emit(danmu) {\n this.validator(danmu, {\n text: 'string',\n mode: 'number|undefined',\n color: 'string|undefined',\n time: 'number|undefined',\n border: 'boolean|undefined',\n });\n\n if (!danmu.text.trim()) return this;\n if (!this.option.filter(danmu)) return this;\n\n if (danmu.time) {\n danmu.time = this.utils.clamp(danmu.time, 0, Infinity);\n } else {\n danmu.time = this.art.currentTime + 0.5;\n }\n\n if (danmu.mode === undefined) {\n danmu.mode = this.option.mode;\n }\n\n if (danmu.color === undefined) {\n danmu.color = this.option.color;\n }\n\n this.queue.push({\n ...danmu,\n $state: 'wait',\n $ref: null,\n $restTime: 0,\n $lastStartTime: 0,\n });\n\n return this;\n }\n\n destroy() {\n this.stop();\n if (this.worker && this.worker.terminate) 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('fullscreen', this.reset);\n this.art.off('fullscreenWeb', this.reset);\n this.art.off('destroy', this.destroy);\n this.art.emit('artplayerPluginDanmuku:destroy');\n }\n}\n","export function getMode(key) {\n switch (key) {\n case 1:\n case 2:\n case 3:\n return 0;\n case 4:\n case 5:\n return 1;\n default:\n return 0;\n }\n}\n\nexport function bilibiliDanmuParseFromXml(xmlString) {\n if (typeof xmlString !== 'string') return [];\n const matches = xmlString.matchAll(/.+?)\"(?: .*?)?>(?.+?)<\\/d>/gs);\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 } else {\n return null;\n }\n })\n .filter(Boolean);\n}\n\nexport function bilibiliDanmuParseFromUrl(url) {\n return fetch(url)\n .then((res) => res.text())\n .then((xmlString) => bilibiliDanmuParseFromXml(xmlString));\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 (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) {\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","export default function getDanmuTop({\n target,\n emits,\n clientWidth,\n clientHeight,\n marginBottom,\n marginTop,\n antiOverlap,\n}) {\n const danmus = emits\n .filter((item) => item.mode === target.mode && item.top <= clientHeight - marginBottom)\n .sort((prev, next) => prev.top - next.top);\n\n if (danmus.length === 0) {\n return marginTop;\n }\n\n danmus.unshift({\n top: 0,\n left: 0,\n right: 0,\n height: marginTop,\n width: clientWidth,\n speed: 0,\n distance: clientWidth,\n });\n\n danmus.push({\n top: clientHeight - marginBottom,\n left: 0,\n right: 0,\n height: marginBottom,\n width: clientWidth,\n speed: 0,\n distance: clientWidth,\n });\n\n for (let index = 1; index < danmus.length; index += 1) {\n const item = danmus[index];\n const prev = danmus[index - 1];\n const prevBottom = prev.top + prev.height;\n const diff = item.top - prevBottom;\n if (diff >= target.height) {\n return prevBottom;\n }\n }\n\n const topMap = [];\n for (let index = 1; index < danmus.length - 1; index += 1) {\n const item = danmus[index];\n if (topMap.length) {\n const last = topMap[topMap.length - 1];\n if (last[0].top === item.top) {\n last.push(item);\n } else {\n topMap.push([item]);\n }\n } else {\n topMap.push([item]);\n }\n }\n\n if (antiOverlap) {\n switch (target.mode) {\n case 0: {\n const result = topMap.find((list) => {\n return list.every((danmu) => {\n if (clientWidth < danmu.distance) return false;\n if (target.speed < danmu.speed) return true;\n const overlapTime = danmu.right / (target.speed - danmu.speed);\n if (overlapTime > danmu.time) return true;\n return false;\n });\n });\n\n return result && result[0] ? result[0].top : undefined;\n }\n case 1:\n return undefined;\n default:\n break;\n }\n } else {\n switch (target.mode) {\n case 0:\n topMap.sort((prev, next) => {\n const nextMinRight = Math.min(...next.map((item) => item.right));\n const prevMinRight = Math.min(...prev.map((item) => item.right));\n return nextMinRight * next.length - prevMinRight * prev.length;\n });\n break;\n case 1:\n topMap.sort((prev, next) => {\n const nextMaxWidth = Math.max(...next.map((item) => item.width));\n const prevMaxWidth = Math.max(...prev.map((item) => item.width));\n return prevMaxWidth * prev.length - nextMaxWidth * next.length;\n });\n break;\n default:\n break;\n }\n\n return topMap[0][0].top;\n }\n}\n","module.exports = \"f89064c706e65d5d\";","import style from 'bundle-text:./style.less';\nimport danmuOn from 'bundle-text:./img/danmu-on.svg';\nimport danmuOff from 'bundle-text:./img/danmu-off.svg';\nimport danmuConfig from 'bundle-text:./img/danmu-config.svg';\nimport danmuStyle from 'bundle-text:./img/danmu-style.svg';\n\nexport default function setting(art, danmuku) {\n const { option } = danmuku;\n const {\n template: { $controlsCenter, $player },\n constructor: {\n utils: { removeClass, addClass, append, setStyle, tooltip, query, inverseClass, getIcon },\n },\n } = art;\n\n setStyle($controlsCenter, 'display', 'flex');\n\n const $danmuOn = getIcon('danmu-on', danmuOn);\n const $danmuOff = getIcon('danmu-off', danmuOff);\n const $danmuConfig = getIcon('danmu-config', danmuConfig);\n const $danmuStyle = getIcon('danmu-style', danmuStyle);\n\n function addEmitter() {\n const colors = [\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 ].map((item) => {\n const isCurrent = option.color === item ? ' art-current' : '';\n return ``;\n });\n\n const $emitter = append(\n $controlsCenter,\n `\n \n
\n
\n
\n
\n
模式
\n
\n
颜色
\n
\n ${colors.join('')}\n
\n
\n
\n
\n
\n
\n
发送
\n
\n `,\n );\n\n const $style = query('.art-danmuku-style', $emitter);\n const $input = query('.art-danmuku-input', $emitter);\n const $send = query('.art-danmuku-send', $emitter);\n const $panel = query('.art-danmuku-style-panel-inner', $emitter);\n const $modes = query('.art-danmuku-style-panel-modes', $emitter);\n const $colors = query('.art-danmuku-style-panel-colors', $emitter);\n const $layer = option.mount || append($player, '');\n\n if (art.option.backdrop) {\n addClass($panel, 'art-backdrop-filter');\n }\n\n if (option.theme) {\n addClass($emitter, `art-danmuku-theme-${option.theme}`);\n }\n\n let timer = null;\n let mode = option.mode;\n let color = option.color;\n append($style, $danmuStyle);\n\n function countdown(time) {\n if (time <= 0) {\n timer = null;\n $send.innerText = '发送';\n removeClass($send, 'art-disabled');\n } else {\n $send.innerText = time;\n timer = setTimeout(() => countdown(time - 1), 1000);\n }\n }\n\n function onSend() {\n const danmu = {\n mode,\n color,\n border: true,\n text: $input.value.trim(),\n };\n\n if (timer === null && option.beforeEmit(danmu)) {\n $input.value = '';\n danmuku.emit(danmu);\n addClass($send, 'art-disabled');\n countdown(option.lockTime);\n art.emit('artplayerPluginDanmuku:emit', danmu);\n }\n }\n\n function onResize() {\n if ($controlsCenter.clientWidth < option.minWidth) {\n append($layer, $emitter);\n setStyle($layer, 'display', 'flex');\n addClass($emitter, 'art-danmuku-mount');\n\n if (!option.mount) {\n setStyle($player, 'marginBottom', '40px');\n }\n } else {\n append($controlsCenter, $emitter);\n setStyle($layer, 'display', 'none');\n removeClass($emitter, 'art-danmuku-mount');\n\n if (!option.mount) {\n setStyle($player, 'marginBottom', null);\n }\n }\n }\n\n art.proxy($send, 'click', onSend);\n\n art.proxy($input, 'keypress', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n onSend();\n }\n });\n\n art.proxy($modes, 'click', (event) => {\n const { dataset } = event.target;\n if (dataset.mode) {\n mode = Number(dataset.mode);\n inverseClass(event.target, 'art-current');\n }\n });\n\n art.proxy($colors, 'click', (event) => {\n const { dataset } = event.target;\n if (dataset.color) {\n color = dataset.color;\n inverseClass(event.target, 'art-current');\n }\n });\n\n onResize();\n art.on('resize', () => {\n if (!art.isInput) {\n onResize();\n }\n });\n\n art.on('destroy', () => {\n if (option.mount && $emitter.parentElement === option.mount) {\n option.mount.removeChild($emitter);\n }\n });\n }\n\n function addControl() {\n art.controls.add({\n position: 'right',\n name: 'danmuku',\n click: function () {\n if (danmuku.isHide) {\n danmuku.show();\n art.notice.show = '弹幕显示';\n setStyle($danmuOn, 'display', null);\n setStyle($danmuOff, 'display', 'none');\n } else {\n danmuku.hide();\n art.notice.show = '弹幕隐藏';\n setStyle($danmuOn, 'display', 'none');\n setStyle($danmuOff, 'display', null);\n }\n },\n mounted($ref) {\n append($ref, $danmuOn);\n append($ref, $danmuOff);\n tooltip($ref, '弹幕开关');\n setStyle($danmuOff, 'display', 'none');\n },\n });\n }\n\n function addSetting() {\n art.setting.add({\n width: 270,\n name: 'danmuku',\n html: '弹幕设置',\n tooltip: '更多',\n icon: $danmuConfig,\n selector: [\n {\n width: 200,\n html: '播放速度',\n icon: '',\n tooltip: '适中',\n selector: [\n {\n html: '极慢',\n time: 10,\n },\n {\n html: '较慢',\n time: 7.5,\n },\n {\n default: true,\n html: '适中',\n time: 5,\n },\n {\n html: '较快',\n time: 2.5,\n },\n {\n html: '极快',\n time: 1,\n },\n ],\n onSelect: function (item) {\n danmuku.config({\n speed: item.time,\n });\n return item.html;\n },\n },\n {\n width: 200,\n html: '字体大小',\n icon: '',\n tooltip: '适中',\n selector: [\n {\n html: '极小',\n fontSize: '4%',\n },\n {\n html: '较小',\n fontSize: '5%',\n },\n {\n default: true,\n html: '适中',\n fontSize: '6%',\n },\n {\n html: '较大',\n fontSize: '7%',\n },\n {\n html: '极大',\n fontSize: '8%',\n },\n ],\n onSelect: function (item) {\n danmuku.config({\n fontSize: item.fontSize,\n });\n return item.html;\n },\n },\n {\n width: 200,\n html: '不透明度',\n icon: '',\n tooltip: '100%',\n selector: [\n {\n default: true,\n opacity: 1,\n html: '100%',\n },\n {\n opacity: 0.75,\n html: '75%',\n },\n {\n opacity: 0.5,\n html: '50%',\n },\n {\n opacity: 0.25,\n html: '25%',\n },\n {\n opacity: 0,\n html: '0%',\n },\n ],\n onSelect: function (item) {\n danmuku.config({\n opacity: item.opacity,\n });\n return item.html;\n },\n },\n {\n width: 200,\n html: '显示范围',\n icon: '',\n tooltip: '3/4',\n selector: [\n {\n html: '1/4',\n margin: [10, '75%'],\n },\n {\n html: '半屏',\n margin: [10, '50%'],\n },\n {\n default: true,\n html: '3/4',\n margin: [10, '25%'],\n },\n {\n html: '满屏',\n margin: [10, 10],\n },\n ],\n onSelect: function (item) {\n danmuku.config({\n margin: item.margin,\n });\n return item.html;\n },\n },\n {\n html: '弹幕防重叠',\n icon: '',\n tooltip: option.antiOverlap ? '开启' : '关闭',\n switch: option.antiOverlap,\n onSwitch(item) {\n danmuku.config({\n antiOverlap: !item.switch,\n });\n item.tooltip = item.switch ? '关闭' : '开启';\n return !item.switch;\n },\n },\n {\n html: '同步视频速度',\n icon: '',\n tooltip: option.synchronousPlayback ? '开启' : '关闭',\n switch: option.synchronousPlayback,\n onSwitch(item) {\n danmuku.config({\n synchronousPlayback: !item.switch,\n });\n item.tooltip = item.switch ? '关闭' : '开启';\n return !item.switch;\n },\n },\n ],\n });\n }\n\n addEmitter();\n addControl();\n addSetting();\n}\n\nif (typeof document !== 'undefined') {\n if (!document.getElementById('artplayer-plugin-danmuku')) {\n const $style = document.createElement('style');\n $style.id = 'artplayer-plugin-danmuku';\n $style.textContent = style;\n document.head.appendChild($style);\n }\n}\n","module.exports = \"c09c1588fb4faeee\";","module.exports = \"ed96d9cba019193e\";","module.exports = \"50e63783768a51c7\";","module.exports = \"6d994b91570c2465\";","module.exports = \"5e37f7b89903ad61\";","const lib = {\r\n map(value, inMin, inMax, outMin, outMax) {\r\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin;\r\n },\r\n range(start, end, tick) {\r\n const s = Math.round(start / tick) * tick;\r\n return Array.from(\r\n {\r\n length: Math.floor((end - start) / tick),\r\n },\r\n (v, k) => {\r\n return k * tick + s;\r\n },\r\n );\r\n },\r\n};\r\n\r\nconst line = (pointA, pointB) => {\r\n const lengthX = pointB[0] - pointA[0];\r\n const lengthY = pointB[1] - pointA[1];\r\n return {\r\n length: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\r\n angle: Math.atan2(lengthY, lengthX),\r\n };\r\n};\r\n\r\nexport default function heatmap(art, danmuku) {\r\n art.controls.add({\r\n name: 'heatmap',\r\n position: 'top',\r\n html: '',\r\n style: {\r\n height: '50px',\r\n width: '100%',\r\n pointerEvents: 'none',\r\n },\r\n mounted($heatmap) {\r\n function update() {\r\n const svg = {\r\n w: $heatmap.offsetWidth,\r\n h: $heatmap.offsetHeight,\r\n };\r\n\r\n const options = {\r\n xMin: 0,\r\n xMax: svg.w,\r\n yMin: 0,\r\n yMax: 128,\r\n scale: 0.2,\r\n minHeight: Math.floor(svg.h * 0.1),\r\n sampling: Math.floor(svg.w / 100),\r\n fill: 'rgba(255, 255, 255, 0.5)',\r\n smoothing: 0.2,\r\n flattening: 0,\r\n };\r\n\r\n const points = [];\r\n const gap = art.duration / svg.w;\r\n for (let x = 0; x <= svg.w; x += options.sampling) {\r\n const y = danmuku.danmus.filter(\r\n ({ time }) => time > x * gap && time <= (x + options.sampling) * gap,\r\n ).length;\r\n points.push([x, y + options.minHeight]);\r\n }\r\n\r\n const yPoints = points.map((point) => point[1]);\r\n const yMin = Math.min(...yPoints);\r\n const yMax = Math.max(...yPoints);\r\n const yMid = (yMin + yMax) / 2;\r\n\r\n for (let i = 0; i < points.length; i++) {\r\n const point = points[i];\r\n const y = point[1];\r\n point[1] = y * (y > yMid ? 1 + options.scale : 1 - options.scale);\r\n }\r\n\r\n const controlPoint = (current, previous, next, reverse) => {\r\n const p = previous || current;\r\n const n = next || current;\r\n const o = line(p, n);\r\n const flat = lib.map(Math.cos(o.angle) * options.flattening, 0, 1, 1, 0);\r\n const angle = o.angle * flat + (reverse ? Math.PI : 0);\r\n const length = o.length * options.smoothing;\r\n const x = current[0] + Math.cos(angle) * length;\r\n const y = current[1] + Math.sin(angle) * length;\r\n return [x, y];\r\n };\r\n\r\n const bezierCommand = (point, i, a) => {\r\n const cps = controlPoint(a[i - 1], a[i - 2], point);\r\n const cpe = controlPoint(point, a[i - 1], a[i + 1], true);\r\n const close = i === a.length - 1 ? ' z' : '';\r\n return `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}${close}`;\r\n };\r\n\r\n const pointsPositions = points.map((e) => {\r\n const x = lib.map(e[0], options.xMin, options.xMax, 0, svg.w);\r\n const y = lib.map(e[1], options.yMin, options.yMax, svg.h, 0);\r\n return [x, y];\r\n });\r\n\r\n const pathD = pointsPositions.reduce(\r\n (acc, e, i, a) =>\r\n i === 0\r\n ? `M ${a[a.length - 1][0]},${svg.h} L ${e[0]},${svg.h} L ${e[0]},${e[1]}`\r\n : `${acc} ${bezierCommand(e, i, a)}`,\r\n '',\r\n );\r\n\r\n $heatmap.innerHTML = `\r\n \r\n `;\r\n }\r\n\r\n art.on('ready', update);\r\n art.on('resize', update);\r\n art.emit('artplayerPluginDanmuku:loaded', update);\r\n },\r\n });\r\n}\r\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"}
\ No newline at end of file
diff --git a/packages/artplayer-plugin-danmuku/src/danmuku.js b/packages/artplayer-plugin-danmuku/src/danmuku.js
index 50f4e185f..cad5def91 100644
--- a/packages/artplayer-plugin-danmuku/src/danmuku.js
+++ b/packages/artplayer-plugin-danmuku/src/danmuku.js
@@ -11,6 +11,7 @@ export default class Danmuku {
this.$player = template.$player;
this.art = art;
+ this.danmus = [];
this.queue = [];
this.option = {};
this.$refs = [];
@@ -61,6 +62,7 @@ export default class Danmuku {
maxWidth: 400,
mount: undefined,
theme: 'dark',
+ heatmap: false,
beforeEmit: () => true,
};
}
@@ -84,6 +86,7 @@ export default class Danmuku {
maxWidth: 'number',
mount: 'undefined|htmldivelement',
theme: 'string',
+ heatmap: 'boolean',
beforeEmit: 'function',
};
}
@@ -236,23 +239,22 @@ export default class Danmuku {
async load() {
try {
- let danmus = [];
if (typeof this.option.danmuku === 'function') {
- danmus = await this.option.danmuku();
+ this.danmus = await this.option.danmuku();
} else if (typeof this.option.danmuku.then === 'function') {
- danmus = await this.option.danmuku;
+ this.danmus = await this.option.danmuku;
} else if (typeof this.option.danmuku === 'string') {
- danmus = await bilibiliDanmuParseFromUrl(this.option.danmuku);
+ this.danmus = await bilibiliDanmuParseFromUrl(this.option.danmuku);
} else {
- danmus = this.option.danmuku;
+ this.danmus = this.option.danmuku;
}
- this.utils.errorHandle(Array.isArray(danmus), 'Danmuku need return an array as result');
- this.art.emit('artplayerPluginDanmuku:loaded', danmus);
+ this.utils.errorHandle(Array.isArray(this.danmus), 'Danmuku need return an array as result');
+ this.art.emit('artplayerPluginDanmuku:loaded', this.danmus);
this.queue = [];
this.$danmuku.innerText = '';
- danmus.forEach((danmu) => this.emit(danmu));
+ this.danmus.forEach((danmu) => this.emit(danmu));
} catch (error) {
this.art.emit('artplayerPluginDanmuku:error', error);
throw error;
diff --git a/packages/artplayer-plugin-danmuku/src/heatmap.js b/packages/artplayer-plugin-danmuku/src/heatmap.js
new file mode 100644
index 000000000..a905a4ee8
--- /dev/null
+++ b/packages/artplayer-plugin-danmuku/src/heatmap.js
@@ -0,0 +1,122 @@
+const lib = {
+ map(value, inMin, inMax, outMin, outMax) {
+ return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin;
+ },
+ range(start, end, tick) {
+ const s = Math.round(start / tick) * tick;
+ return Array.from(
+ {
+ length: Math.floor((end - start) / tick),
+ },
+ (v, k) => {
+ return k * tick + s;
+ },
+ );
+ },
+};
+
+const line = (pointA, pointB) => {
+ const lengthX = pointB[0] - pointA[0];
+ const lengthY = pointB[1] - pointA[1];
+ return {
+ length: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),
+ angle: Math.atan2(lengthY, lengthX),
+ };
+};
+
+export default function heatmap(art, danmuku) {
+ art.controls.add({
+ name: 'heatmap',
+ position: 'top',
+ html: '',
+ style: {
+ height: '50px',
+ width: '100%',
+ pointerEvents: 'none',
+ },
+ mounted($heatmap) {
+ function update() {
+ const svg = {
+ w: $heatmap.offsetWidth,
+ h: $heatmap.offsetHeight,
+ };
+
+ const options = {
+ xMin: 0,
+ xMax: svg.w,
+ yMin: 0,
+ yMax: 128,
+ scale: 0.2,
+ minHeight: Math.floor(svg.h * 0.1),
+ sampling: Math.floor(svg.w / 100),
+ fill: 'rgba(255, 255, 255, 0.5)',
+ smoothing: 0.2,
+ flattening: 0,
+ };
+
+ const points = [];
+ const gap = art.duration / svg.w;
+ for (let x = 0; x <= svg.w; x += options.sampling) {
+ const y = danmuku.danmus.filter(
+ ({ time }) => time > x * gap && time <= (x + options.sampling) * gap,
+ ).length;
+ points.push([x, y + options.minHeight]);
+ }
+
+ const yPoints = points.map((point) => point[1]);
+ const yMin = Math.min(...yPoints);
+ const yMax = Math.max(...yPoints);
+ const yMid = (yMin + yMax) / 2;
+
+ for (let i = 0; i < points.length; i++) {
+ const point = points[i];
+ const y = point[1];
+ point[1] = y * (y > yMid ? 1 + options.scale : 1 - options.scale);
+ }
+
+ const controlPoint = (current, previous, next, reverse) => {
+ const p = previous || current;
+ const n = next || current;
+ const o = line(p, n);
+ const flat = lib.map(Math.cos(o.angle) * options.flattening, 0, 1, 1, 0);
+ const angle = o.angle * flat + (reverse ? Math.PI : 0);
+ const length = o.length * options.smoothing;
+ const x = current[0] + Math.cos(angle) * length;
+ const y = current[1] + Math.sin(angle) * length;
+ return [x, y];
+ };
+
+ const bezierCommand = (point, i, a) => {
+ const cps = controlPoint(a[i - 1], a[i - 2], point);
+ const cpe = controlPoint(point, a[i - 1], a[i + 1], true);
+ const close = i === a.length - 1 ? ' z' : '';
+ return `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}${close}`;
+ };
+
+ const pointsPositions = points.map((e) => {
+ const x = lib.map(e[0], options.xMin, options.xMax, 0, svg.w);
+ const y = lib.map(e[1], options.yMin, options.yMax, svg.h, 0);
+ return [x, y];
+ });
+
+ 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)}`,
+ '',
+ );
+
+ $heatmap.innerHTML = `
+
+ `;
+ }
+
+ art.on('ready', update);
+ art.on('resize', update);
+ art.emit('artplayerPluginDanmuku:loaded', update);
+ },
+ });
+}
diff --git a/packages/artplayer-plugin-danmuku/src/index.js b/packages/artplayer-plugin-danmuku/src/index.js
index 04fc46d62..5361651c2 100644
--- a/packages/artplayer-plugin-danmuku/src/index.js
+++ b/packages/artplayer-plugin-danmuku/src/index.js
@@ -1,5 +1,6 @@
import Danmuku from './danmuku';
import setting from './setting';
+import heatmap from './heatmap';
function checkVersion(art) {
const {
@@ -17,6 +18,7 @@ export default function artplayerPluginDanmuku(option) {
checkVersion(art);
const danmuku = new Danmuku(art, option);
setting(art, danmuku);
+ if (option.heatmap) heatmap(art, danmuku);
return {
name: 'artplayerPluginDanmuku',
emit: danmuku.emit.bind(danmuku),