From 56af4ca4a4b36a2b0c212b7b65b6e421cc3bbc85 Mon Sep 17 00:00:00 2001 From: Harvey Zack Date: Tue, 2 May 2023 19:14:14 +0800 Subject: [PATCH] update heatmap --- docs/assets/example/danmuku.js | 2 +- .../artplayer-plugin-danmuku/index.js | 69 ++++++++++++++---- .../artplayer-plugin-danmuku/index.js.map | 2 +- docs/uncompiled/artplayer/index.js | 2 +- .../artplayer-plugin-danmuku/src/danmuku.js | 2 +- .../artplayer-plugin-danmuku/src/heatmap.js | 73 ++++++++++++++++--- .../artplayer-plugin-danmuku/src/index.js | 2 +- .../types/artplayer-plugin-danmuku.d.ts | 15 +++- 8 files changed, 134 insertions(+), 33 deletions(-) diff --git a/docs/assets/example/danmuku.js b/docs/assets/example/danmuku.js index 9192a6af5..200baf1d5 100644 --- a/docs/assets/example/danmuku.js +++ b/docs/assets/example/danmuku.js @@ -10,7 +10,7 @@ var art = new Artplayer({ setting: true, plugins: [ artplayerPluginDanmuku({ - danmuku: '/assets/sample/danmuku-v2.xml', + danmuku: 'http://d.artplayer.org?id=BV1ks411W7r5', speed: 5, // 弹幕持续时间,单位秒,范围在[1 ~ 10] opacity: 1, // 弹幕透明度,范围在[0 ~ 1] fontSize: 25, // 字体大小,支持数字和百分比 diff --git a/docs/uncompiled/artplayer-plugin-danmuku/index.js b/docs/uncompiled/artplayer-plugin-danmuku/index.js index 19d7c9c43..1e86c866b 100644 --- a/docs/uncompiled/artplayer-plugin-danmuku/index.js +++ b/docs/uncompiled/artplayer-plugin-danmuku/index.js @@ -163,7 +163,7 @@ function artplayerPluginDanmuku(option) { checkVersion(art); const danmuku = new (0, _danmukuDefault.default)(art, option); (0, _settingDefault.default)(art, danmuku); - if (option.heatmap) (0, _heatmapDefault.default)(art, danmuku); + if (option.heatmap) (0, _heatmapDefault.default)(art, danmuku, option.heatmap); return { name: "artplayerPluginDanmuku", emit: danmuku.emit.bind(danmuku), @@ -187,7 +187,7 @@ function artplayerPluginDanmuku(option) { exports.default = artplayerPluginDanmuku; artplayerPluginDanmuku.env = "development"; artplayerPluginDanmuku.version = "5.0.1"; -artplayerPluginDanmuku.build = "2023-05-02 15:25:00"; +artplayerPluginDanmuku.build = "2023-05-02 18:01:36"; if (typeof window !== "undefined") window["artplayerPluginDanmuku"] = artplayerPluginDanmuku; },{"./danmuku":"cv7fe","./setting":"cI0ih","./heatmap":"bZziT","@parcel/transformer-js/src/esmodule-helpers.js":"5dUr6"}],"cv7fe":[function(require,module,exports) { @@ -274,7 +274,7 @@ class Danmuku { maxWidth: "number", mount: "undefined|htmldivelement", theme: "string", - heatmap: "boolean", + heatmap: "object|boolean", beforeEmit: "function" }; } @@ -1192,18 +1192,25 @@ const line = (pointA, pointB)=>{ angle: Math.atan2(lengthY, lengthX) }; }; -function heatmap(art, danmuku) { +function heatmap(art, danmuku, option) { + const { query } = art.constructor.utils; art.controls.add({ name: "heatmap", position: "top", html: "", style: { - height: "50px", + height: "100px", width: "100%", pointerEvents: "none" }, mounted ($heatmap) { + let $start = null; + let $stop = null; function update() { + $start = null; + $stop = null; + $heatmap.innerHTML = ""; + if (danmuku.danmus.length === 0) return; const svg = { w: $heatmap.offsetWidth, h: $heatmap.offsetHeight @@ -1213,22 +1220,30 @@ function heatmap(art, danmuku) { xMax: svg.w, yMin: 0, yMax: 128, - scale: 0.2, - minHeight: Math.floor(svg.h * 0.1), + scale: 0.25, + opacity: 0.2, + minHeight: Math.floor(svg.h * 0.05), sampling: Math.floor(svg.w / 100), - fill: "rgba(255, 255, 255, 0.5)", smoothing: 0.2, - flattening: 0 + flattening: 0.2 }; + if (typeof option === "object") Object.assign(options, option); 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 + y ]); } + const lastPoint = points[points.length - 1]; + const lastX = lastPoint[0]; + const lastY = lastPoint[1]; + if (lastX !== svg.w) points.push([ + svg.w, + lastY + ]); const yPoints = points.map((point)=>point[1]); const yMin = Math.min(...yPoints); const yMax = Math.max(...yPoints); @@ -1236,7 +1251,7 @@ function heatmap(art, danmuku) { 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); + point[1] = y * (y > yMid ? 1 + options.scale : 1 - options.scale) + options.minHeight; } const controlPoint = (current, previous, next, reverse)=>{ const p = previous || current; @@ -1268,14 +1283,38 @@ function heatmap(art, danmuku) { }); 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 = ` - - - + + + + + + + + + + + `; + $start = query("#heatmap-start", $heatmap); + $stop = query("#heatmap-stop", $heatmap); + $start.setAttribute("offset", `${art.played * 100}%`); + $stop.setAttribute("offset", `${art.played * 100}%`); } + art.on("video:timeupdate", ()=>{ + if ($start && $stop) { + $start.setAttribute("offset", `${art.played * 100}%`); + $stop.setAttribute("offset", `${art.played * 100}%`); + } + }); + art.on("setBar", (type, percentage)=>{ + if ($start && $stop && type === "played") { + $start.setAttribute("offset", `${percentage * 100}%`); + $stop.setAttribute("offset", `${percentage * 100}%`); + } + }); art.on("ready", update); art.on("resize", update); - art.emit("artplayerPluginDanmuku:loaded", update); + art.on("artplayerPluginDanmuku:loaded", update); } }); } diff --git a/docs/uncompiled/artplayer-plugin-danmuku/index.js.map b/docs/uncompiled/artplayer-plugin-danmuku/index.js.map index 099270fa2..24a284537 100644 --- a/docs/uncompiled/artplayer-plugin-danmuku/index.js.map +++ b/docs/uncompiled/artplayer-plugin-danmuku/index.js.map @@ -1 +1 @@ -{"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAAA;;AACA;;AACA;;AAEA,SAAS,aAAa,GAAG,EAAE;IACvB,MAAM,EACF,QAAO,EACP,OAAO,EAAE,YAAW,EAAE,CAAA,EACzB,GAAG,IAAI,WAAW;IACnB,MAAM,MAAM,QAAQ,KAAK,CAAC,KAAK,GAAG,CAAC;IACnC,MAAM,QAAQ,GAAG,CAAC,EAAE;IACpB,MAAM,QAAQ,GAAG,CAAC,EAAE,GAAG;IACvB,YAAY,QAAQ,SAAS,GAAG,CAAC,aAAa,EAAE,QAAQ,qCAAqC,CAAC;AAClG;AAEe,SAAS,uBAAuB,MAAM,EAAE;IACnD,OAAO,CAAC,MAAQ;QACZ,aAAa;QACb,MAAM,UAAU,IAAI,CAAA,GAAA,uBAAO,AAAD,EAAE,KAAK;QACjC,CAAA,GAAA,uBAAO,AAAD,EAAE,KAAK;QACb,IAAI,OAAO,OAAO,EAAE,CAAA,GAAA,uBAAO,AAAD,EAAE,KAAK;QACjC,OAAO;YACH,MAAM;YACN,MAAM,QAAQ,IAAI,CAAC,IAAI,CAAC;YACxB,MAAM,QAAQ,IAAI,CAAC,IAAI,CAAC;YACxB,QAAQ,QAAQ,MAAM,CAAC,IAAI,CAAC;YAC5B,MAAM,QAAQ,IAAI,CAAC,IAAI,CAAC;YACxB,MAAM,QAAQ,IAAI,CAAC,IAAI,CAAC;YACxB,OAAO,QAAQ,KAAK,CAAC,IAAI,CAAC;YAC1B,IAAI,UAAS;gBACT,OAAO,QAAQ,MAAM;YACzB;YACA,IAAI,UAAS;gBACT,OAAO,QAAQ,MAAM;YACzB;YACA,IAAI,UAAS;gBACT,OAAO,QAAQ,MAAM;YACzB;QACJ;IACJ;AACJ;kBAzBwB;AA2BxB,uBAAuB,GAAG;AAC1B,uBAAuB,OAAO;AAC9B,uBAAuB,KAAK;AAE5B,IAAI,OAAO,WAAW,aAClB,MAAM,CAAC,yBAAyB,GAAG;;;AC/CvC;;AAAA;AACA;;AAEe,MAAM;IACjB,YAAY,GAAG,EAAE,MAAM,CAAE;QACrB,MAAM,EAAE,YAAW,EAAE,SAAQ,EAAE,GAAG;QAElC,IAAI,CAAC,KAAK,GAAG,YAAY,KAAK;QAC9B,IAAI,CAAC,SAAS,GAAG,YAAY,SAAS;QACtC,IAAI,CAAC,QAAQ,GAAG,SAAS,QAAQ;QACjC,IAAI,CAAC,OAAO,GAAG,SAAS,OAAO;QAE/B,IAAI,CAAC,GAAG,GAAG;QACX,IAAI,CAAC,MAAM,GAAG,EAAE;QAChB,IAAI,CAAC,KAAK,GAAG,EAAE;QACf,IAAI,CAAC,MAAM,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,EAAE;QACf,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,IAAI,CAAC,KAAK,GAAG,IAAI;QACjB,IAAI,CAAC,MAAM,CAAC;QAEZ,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,IAAI;YACA,IAAI,CAAC,MAAM,GAAG,IAAI;QACtB,EAAE,OAAO,OAAO;QACZ,EAAE;QACN;QAGJ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI;QACjC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;QAErC,IAAI,EAAE,CAAC,cAAc,IAAI,CAAC,KAAK;QAC/B,IAAI,EAAE,CAAC,iBAAiB,IAAI,CAAC,KAAK;QAClC,IAAI,EAAE,CAAC,eAAe,IAAI,CAAC,IAAI;QAC/B,IAAI,EAAE,CAAC,iBAAiB,IAAI,CAAC,IAAI;QACjC,IAAI,EAAE,CAAC,UAAU,IAAI,CAAC,KAAK;QAC3B,IAAI,EAAE,CAAC,WAAW,IAAI,CAAC,OAAO;QAE9B,IAAI,CAAC,IAAI;IACb;IAEA,WAAW,SAAS;QAChB,OAAO;YACH,SAAS,EAAE;YACX,OAAO;YACP,QAAQ;gBAAC;gBAAM;aAAM;YACrB,SAAS;YACT,OAAO;YACP,MAAM;YACN,UAAU;YACV,QAAQ,IAAM,IAAI;YAClB,aAAa,IAAI;YACjB,WAAW,IAAI;YACf,qBAAqB,KAAK;YAC1B,UAAU;YACV,WAAW;YACX,UAAU;YACV,UAAU;YACV,OAAO;YACP,OAAO;YACP,SAAS,KAAK;YACd,YAAY,IAAM,IAAI;QAC1B;IACJ;IAEA,WAAW,SAAS;QAChB,OAAO;YACH,SAAS;YACT,OAAO;YACP,QAAQ;YACR,SAAS;YACT,OAAO;YACP,MAAM;YACN,UAAU;YACV,QAAQ;YACR,aAAa;YACb,WAAW;YACX,qBAAqB;YACrB,UAAU;YACV,WAAW;YACX,UAAU;YACV,UAAU;YACV,OAAO;YACP,OAAO;YACP,SAAS;YACT,YAAY;QAChB;IACJ;IAEA,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK;IACrF;IAEA,IAAI,YAAY;QACZ,MAAM,EAAE,MAAK,EAAE,GAAG,IAAI,CAAC,KAAK;QAC5B,MAAM,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;QACnC,MAAM,EAAE,aAAY,EAAE,GAAG,IAAI,CAAC,OAAO;QAErC,IAAI,OAAO,UAAU,UACjB,OAAO,MAAM,OAAO,GAAG;QAG3B,IAAI,OAAO,UAAU,YAAY,MAAM,QAAQ,CAAC,MAAM;YAClD,MAAM,QAAQ,WAAW,SAAS;YAClC,OAAO,MAAM,eAAe,OAAO,GAAG;QAC1C,CAAC;QAED,OAAO,QAAQ,MAAM,CAAC,MAAM,CAAC,EAAE;IACnC;IAEA,IAAI,eAAe;QACf,MAAM,EAAE,MAAK,EAAE,GAAG,IAAI,CAAC,KAAK;QAC5B,MAAM,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;QACnC,MAAM,EAAE,aAAY,EAAE,GAAG,IAAI,CAAC,OAAO;QAErC,IAAI,OAAO,UAAU,UACjB,OAAO,MAAM,OAAO,GAAG;QAG3B,IAAI,OAAO,UAAU,YAAY,MAAM,QAAQ,CAAC,MAAM;YAClD,MAAM,QAAQ,WAAW,SAAS;YAClC,OAAO,MAAM,eAAe,OAAO,GAAG;QAC1C,CAAC;QAED,OAAO,QAAQ,MAAM,CAAC,MAAM,CAAC,EAAE;IACnC;IAEA,OAAO,KAAK,EAAE,QAAQ,EAAE;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAU,MAAM,MAAM,KAAK,OAAO,GAAG,CAAC;IACpE;IAEA,QAAQ,IAAI,EAAE;QACV,MAAM,OAAO,KAAK,qBAAqB;QACvC,OAAO,IAAI,CAAC,QAAQ,GAAG,KAAK,GAAG,GAAG,KAAK,IAAI;IAC/C;IAEA,SAAS;QACL,MAAM,YAAY,IAAI,CAAC,KAAK,CAAC,GAAG;QAChC,IAAI,WAAW,OAAO;QAEtB,MAAM,OAAO,SAAS,aAAa,CAAC;QAEpC,KAAK,KAAK,CAAC,OAAO,GAAG,CAAC;;;;;;;;;;;;;QAatB,CAAC;QAED,OAAO;IACX;IAEA,WAAW;QACP,MAAM,EAAE,YAAW,EAAE,GAAG,IAAI,CAAC,GAAG;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAU;YAChC,OACI,MAAM,MAAM,KAAK,WAChB,MAAM,MAAM,KAAK,UAAU,cAAc,OAAO,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,cAAc;QAEnG;IACJ;IAEA,WAAW;QACP,MAAM,SAAS,EAAE;QACjB,MAAM,EAAE,YAAW,EAAE,GAAG,IAAI,CAAC,OAAO;QACpC,MAAM,aAAa,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO;QAE5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAU;YAC3B,MAAM,MAAM,MAAM,IAAI,CAAC,SAAS;YAChC,MAAM,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI;YACxC,MAAM,SAAS,MAAM,IAAI,CAAC,YAAY;YACtC,MAAM,QAAQ,MAAM,IAAI,CAAC,WAAW;YACpC,MAAM,WAAW,OAAO;YACxB,MAAM,QAAQ,cAAc;YAC5B,MAAM,QAAQ,WAAW,MAAM,SAAS;YAExC,MAAM,OAAO,CAAC;YACd,KAAK,GAAG,GAAG;YACX,KAAK,IAAI,GAAG;YACZ,KAAK,MAAM,GAAG;YACd,KAAK,KAAK,GAAG;YACb,KAAK,KAAK,GAAG;YACb,KAAK,KAAK,GAAG;YACb,KAAK,QAAQ,GAAG;YAChB,KAAK,IAAI,GAAG,MAAM,SAAS;YAC3B,KAAK,IAAI,GAAG,MAAM,IAAI;YAEtB,OAAO,IAAI,CAAC;QAChB;QAEA,OAAO;IACX;IAEA,YAAY,QAAQ,EAAE;QAClB,MAAM,EAAE,MAAK,EAAE,GAAG,IAAI,CAAC,KAAK;QAC5B,MAAM,EAAE,aAAY,EAAE,GAAG,IAAI,CAAC,OAAO;QAErC,IAAI,OAAO,aAAa,UACpB,OAAO,MAAM,UAAU,IAAI;QAG/B,IAAI,OAAO,aAAa,YAAY,SAAS,QAAQ,CAAC,MAAM;YACxD,MAAM,QAAQ,WAAW,YAAY;YACrC,OAAO,MAAM,eAAe,OAAO,IAAI;QAC3C,CAAC;QAED,OAAO,QAAQ,MAAM,CAAC,QAAQ;IAClC;IAEA,YAAY,UAAU,CAAC,CAAC,EAAE;QACtB,OAAO,IAAI,QAAQ,CAAC,UAAY;YAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBACjE,QAAQ,EAAE,GAAG,KAAK,GAAG;gBACrB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,QAAU;oBAC/B,MAAM,EAAE,KAAI,EAAE,GAAG;oBACjB,IAAI,KAAK,EAAE,KAAK,QAAQ,EAAE,EACtB,QAAQ;gBAEhB;YACJ,OAAO;gBACH,MAAM,MAAM,CAAA,GAAA,2BAAW,AAAD,EAAE;gBACxB,QAAQ;oBAAE;gBAAI;YAClB,CAAC;QACL;IACJ;IAEA,MAAM,OAAO;QACT,IAAI;YACA,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,YAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO;iBACpC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,YAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO;iBACpC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,UACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA,GAAA,mCAAyB,AAAD,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;iBAEjE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;YAGrC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG;YACnD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iCAAiC,IAAI,CAAC,MAAM;YAE1D,IAAI,CAAC,KAAK,GAAG,EAAE;YACf,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG;YAC1B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAU,IAAI,CAAC,IAAI,CAAC;QAC7C,EAAE,OAAO,OAAO;YACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gCAAgC;YAC9C,MAAM,MAAM;QAChB;QAEA,OAAO,IAAI;IACf;IAEA,OAAO,MAAM,EAAE;QACX,MAAM,EAAE,MAAK,EAAE,GAAG,IAAI,CAAC,KAAK;QAE5B,IAAI,CAAC,MAAM,GAAG,OAAO,MAAM,CAAC,CAAC,GAAG,QAAQ,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;QAC7D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,MAAM;QAE1C,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG;QAChD,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG;QACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,GAAG;QAClE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG;QACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG;QACtD,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG;QAEtD,IAAI,OAAO,QAAQ,EAAE;YACjB,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC5D,IAAI,CAAC,KAAK;QACd,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iCAAiC,IAAI,CAAC,MAAM;QAE1D,OAAO,IAAI;IACf;IAEA,SAAS,KAAK,EAAE;QACZ,MAAM,MAAM,GAAG;QACf,IAAI,MAAM,IAAI,EAAE;YACZ,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG;YAC9B,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG;YAC9B,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG;YAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI;YAC1B,MAAM,IAAI,GAAG,IAAI;QACrB,CAAC;IACL;IAEA,WAAW;QACP,MAAM,EAAE,YAAW,EAAE,GAAG,IAAI,CAAC,OAAO;QACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAU;YAC3B,MAAM,MAAM,GAAG;YACf,MAAM,cAAc,GAAG,KAAK,GAAG;YAC/B,OAAQ,MAAM,IAAI;gBACd,KAAK;oBAAG;wBACJ,MAAM,aAAa,cAAc,MAAM,IAAI,CAAC,WAAW;wBACvD,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,WAAW,EAAE,CAAC,WAAW,GAAG,CAAC;wBAC3D,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,UAAU,EAAE,MAAM,SAAS,CAAC,WAAW,CAAC;wBACvE,KAAM;oBACV;gBACA;oBACI,KAAM;YACd;QACJ;QAEA,OAAO,IAAI;IACf;IAEA,UAAU;QACN,MAAM,EAAE,YAAW,EAAE,GAAG,IAAI,CAAC,OAAO;QACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAU;YAC3B,MAAM,MAAM,GAAG;YACf,OAAQ,MAAM,IAAI;gBACd,KAAK;oBAAG;wBACJ,MAAM,aAAa,cAAe,CAAA,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAA;wBACtF,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,WAAW,EAAE,CAAC,WAAW,GAAG,CAAC;wBAC3D,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG;wBAC9B,KAAM;oBACV;gBACA;oBACI,KAAM;YACd;QACJ;QAEA,OAAO,IAAI;IACf;IAEA,QAAQ;QACJ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAU,IAAI,CAAC,QAAQ,CAAC;QAC5C,OAAO,IAAI;IACf;IAEA,SAAS;QACL,IAAI,CAAC,KAAK,GAAG,OAAO,qBAAqB,CAAC,UAAY;YAClD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAU;oBAC3B,MAAM,WAAW,AAAC,CAAA,KAAK,GAAG,KAAK,MAAM,cAAc,AAAD,IAAK;oBACvD,MAAM,SAAS,IAAI;oBACnB,MAAM,cAAc,GAAG,KAAK,GAAG;oBAC/B,IAAI,MAAM,SAAS,IAAI,GACnB,IAAI,CAAC,QAAQ,CAAC;gBAEtB;gBAEA,MAAM,SAAS,IAAI,CAAC,QAAQ;gBAC5B,MAAM,EAAE,YAAW,EAAE,aAAY,EAAE,GAAG,IAAI,CAAC,OAAO;gBAClD,IAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,MAAM,EAAE,QAAS;oBAChD,MAAM,QAAQ,MAAM,CAAC,MAAM;oBAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM;oBACxB,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI;oBACjC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,IAAI;oBAEpC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;oBAC1C,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;oBAC9C,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACvD,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,KAAK;oBACpC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,CAAC,CAAC,GAAG,IAAI;oBAC1E,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,MAAM,MAAM,GAAG,qBAAqB,IAAI;oBAC3E,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG;oBAE9B,MAAM,cAAc,GAAG,KAAK,GAAG;oBAC/B,MAAM,SAAS,GACX,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,GAClD,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,IAChD,IAAI,CAAC,MAAM,CAAC,KAAK;oBAE3B,MAAM,SAAS;wBACX,MAAM,MAAM,IAAI;wBAChB,QAAQ,MAAM,IAAI,CAAC,YAAY;wBAC/B,OAAO,AAAC,CAAA,cAAc,MAAM,IAAI,CAAC,WAAW,AAAD,IAAK,MAAM,SAAS;oBACnE;oBAEA,MAAM,EAAE,IAAG,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC;wBACnC;wBACA,OAAO,IAAI,CAAC,QAAQ;wBACpB,aAAa,IAAI,CAAC,MAAM,CAAC,WAAW;wBACpC,aAAa;wBACb,cAAc;wBACd,cAAc,IAAI,CAAC,YAAY;wBAC/B,WAAW,IAAI,CAAC,SAAS;oBAC7B;oBAEA,IAAI,MAAM,IAAI;wBACV,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,WAAW;4BACnC,MAAM,MAAM,GAAG;4BACf,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG;4BAE9B,OAAQ,MAAM,IAAI;gCACd,KAAK;oCAAG;wCACJ,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;wCACjC,MAAM,aAAa,cAAc,MAAM,IAAI,CAAC,WAAW;wCACvD,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,WAAW,EAAE,CAAC,WAAW,GAAG,CAAC;wCAC3D,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,UAAU,EAAE,MAAM,SAAS,CAAC,WAAW,CAAC;wCACvE,KAAM;oCACV;gCACA,KAAK;oCACD,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG;oCACxB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;oCACjC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;oCAChE,KAAM;gCACV;oCACI,KAAM;4BACd;wBACJ,OAAO;4BACH,MAAM,MAAM,GAAG;4BACf,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI;4BAC1B,MAAM,IAAI,GAAG,IAAI;wBACrB,CAAC;qBACJ;gBACL;YACJ,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,MAAM,EACZ,IAAI,CAAC,MAAM;QAEnB;QACA,OAAO,IAAI;IACf;IAEA,OAAO;QACH,IAAI,CAAC,MAAM,GAAG,IAAI;QAClB,IAAI,CAAC,OAAO;QACZ,OAAO,oBAAoB,CAAC,IAAI,CAAC,KAAK;QACtC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QACd,OAAO,IAAI;IACf;IAEA,QAAQ;QACJ,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,IAAI,CAAC,QAAQ;QACb,IAAI,CAAC,MAAM;QACX,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QACd,OAAO,IAAI;IACf;IAEA,OAAO;QACH,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,IAAI,CAAC,KAAK;QACV,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG;QAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QACd,OAAO,IAAI;IACf;IAEA,OAAO;QACH,IAAI,CAAC,MAAM,GAAG,IAAI;QAClB,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAS,IAAI,CAAC,QAAQ,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG;QAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QACd,OAAO,IAAI;IACf;IAEA,KAAK,KAAK,EAAE;QACR,IAAI,CAAC,SAAS,CAAC,OAAO;YAClB,MAAM;YACN,MAAM;YACN,OAAO;YACP,MAAM;YACN,QAAQ;QACZ;QAEA,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,OAAO,IAAI;QAE3C,IAAI,MAAM,IAAI,EACV,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,GAAG;aAE7C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG;QAGxC,IAAI,MAAM,IAAI,KAAK,WACf,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI;QAGjC,IAAI,MAAM,KAAK,KAAK,WAChB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK;QAGnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACZ,GAAG,KAAK;YACR,QAAQ;YACR,MAAM,IAAI;YACV,WAAW;YACX,gBAAgB;QACpB;QAEA,OAAO,IAAI;IACf;IAEA,UAAU;QACN,IAAI,CAAC,IAAI;QACT,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;QAC/D,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,KAAK;QACrC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,KAAK;QACxC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,IAAI;QACrC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,IAAI;QACvC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,KAAK;QACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,OAAO;QACpC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IAClB;AACJ;kBA7fqB;;;ACHrB;;AAAA,6CAAgB;AAchB,+DAAgB;AAiChB,+DAAgB;AA/CT,SAAS,QAAQ,GAAG,EAAE;IACzB,OAAQ;QACJ,KAAK;QACL,KAAK;QACL,KAAK;YACD,OAAO;QACX,KAAK;QACL,KAAK;YACD,OAAO;QACX;YACI,OAAO;IACf;AACJ;AAEO,SAAS,0BAA0B,SAAS,EAAE;IACjD,IAAI,OAAO,cAAc,UAAU,OAAO,EAAE;IAC5C,MAAM,UAAU,UAAU,QAAQ,CAAC;IACnC,OAAO,MAAM,IAAI,CAAC,SACb,GAAG,CAAC,CAAC,QAAU;QACZ,MAAM,OAAO,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAClC,IAAI,KAAK,MAAM,IAAI,GAAG;YAClB,MAAM,OAAO,MAAM,MAAM,CAAC,IAAI,CACzB,IAAI,GACJ,UAAU,CAAC,UAAU,KACrB,UAAU,CAAC,UAAU,KACrB,UAAU,CAAC,QAAQ,KACnB,UAAU,CAAC,QAAQ,KACnB,UAAU,CAAC,SAAS;YAEzB,OAAO;gBACH;gBACA,MAAM,OAAO,IAAI,CAAC,EAAE;gBACpB,MAAM,QAAQ,OAAO,IAAI,CAAC,EAAE;gBAC5B,UAAU,OAAO,IAAI,CAAC,EAAE;gBACxB,OAAO,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC;gBACzC,WAAW,OAAO,IAAI,CAAC,EAAE;gBACzB,MAAM,OAAO,IAAI,CAAC,EAAE;gBACpB,QAAQ,IAAI,CAAC,EAAE;gBACf,OAAO,OAAO,IAAI,CAAC,EAAE;YACzB;QACJ,OACI,OAAO,IAAI;IAEnB,GACC,MAAM,CAAC;AAChB;AAEO,SAAS,0BAA0B,GAAG,EAAE;IAC3C,OAAO,MAAM,KACR,IAAI,CAAC,CAAC,MAAQ,IAAI,IAAI,IACtB,IAAI,CAAC,CAAC,YAAc,0BAA0B;AACvD;;;ACnDA,QAAQ,cAAc,GAAG,SAAU,CAAC,EAAE;IACpC,OAAO,KAAK,EAAE,UAAU,GAAG,IAAI;QAAC,SAAS;IAAC,CAAC;AAC7C;AAEA,QAAQ,iBAAiB,GAAG,SAAU,CAAC,EAAE;IACvC,OAAO,cAAc,CAAC,GAAG,cAAc;QAAC,OAAO,IAAI;IAAA;AACrD;AAEA,QAAQ,SAAS,GAAG,SAAU,MAAM,EAAE,IAAI,EAAE;IAC1C,OAAO,IAAI,CAAC,QAAQ,OAAO,CAAC,SAAU,GAAG,EAAE;QACzC,IAAI,QAAQ,aAAa,QAAQ,gBAAgB,KAAK,cAAc,CAAC,MACnE;QAGF,OAAO,cAAc,CAAC,MAAM,KAAK;YAC/B,YAAY,IAAI;YAChB,KAAK,WAAY;gBACf,OAAO,MAAM,CAAC,IAAI;YACpB;QACF;IACF;IAEA,OAAO;AACT;AAEA,QAAQ,MAAM,GAAG,SAAU,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE;IAC9C,OAAO,cAAc,CAAC,MAAM,UAAU;QACpC,YAAY,IAAI;QAChB,KAAK;IACP;AACF;;;AC9BA;;AAAe,SAAS,YAAY,EAChC,OAAM,EACN,MAAK,EACL,YAAW,EACX,aAAY,EACZ,aAAY,EACZ,UAAS,EACT,YAAW,EACd,EAAE;IACC,MAAM,SAAS,MACV,MAAM,CAAC,CAAC,OAAS,KAAK,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,GAAG,IAAI,eAAe,cACzE,IAAI,CAAC,CAAC,MAAM,OAAS,KAAK,GAAG,GAAG,KAAK,GAAG;IAE7C,IAAI,OAAO,MAAM,KAAK,GAClB,OAAO;IAGX,OAAO,OAAO,CAAC;QACX,KAAK;QACL,MAAM;QACN,OAAO;QACP,QAAQ;QACR,OAAO;QACP,OAAO;QACP,UAAU;IACd;IAEA,OAAO,IAAI,CAAC;QACR,KAAK,eAAe;QACpB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,OAAO;QACP,OAAO;QACP,UAAU;IACd;IAEA,IAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,MAAM,EAAE,SAAS,EAAG;QACnD,MAAM,OAAO,MAAM,CAAC,MAAM;QAC1B,MAAM,OAAO,MAAM,CAAC,QAAQ,EAAE;QAC9B,MAAM,aAAa,KAAK,GAAG,GAAG,KAAK,MAAM;QACzC,MAAM,OAAO,KAAK,GAAG,GAAG;QACxB,IAAI,QAAQ,OAAO,MAAM,EACrB,OAAO;IAEf;IAEA,MAAM,SAAS,EAAE;IACjB,IAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,MAAM,GAAG,GAAG,SAAS,EAAG;QACvD,MAAM,OAAO,MAAM,CAAC,MAAM;QAC1B,IAAI,OAAO,MAAM,EAAE;YACf,MAAM,OAAO,MAAM,CAAC,OAAO,MAAM,GAAG,EAAE;YACtC,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,KAAK,GAAG,EACxB,KAAK,IAAI,CAAC;iBAEV,OAAO,IAAI,CAAC;gBAAC;aAAK;QAE1B,OACI,OAAO,IAAI,CAAC;YAAC;SAAK;IAE1B;IAEA,IAAI,aACA,OAAQ,OAAO,IAAI;QACf,KAAK;YAAG;gBACJ,MAAM,SAAS,OAAO,IAAI,CAAC,CAAC,OAAS;oBACjC,OAAO,KAAK,KAAK,CAAC,CAAC,QAAU;wBACzB,IAAI,cAAc,MAAM,QAAQ,EAAE,OAAO,KAAK;wBAC9C,IAAI,OAAO,KAAK,GAAG,MAAM,KAAK,EAAE,OAAO,IAAI;wBAC3C,MAAM,cAAc,MAAM,KAAK,GAAI,CAAA,OAAO,KAAK,GAAG,MAAM,KAAK,AAAD;wBAC5D,IAAI,cAAc,MAAM,IAAI,EAAE,OAAO,IAAI;wBACzC,OAAO,KAAK;oBAChB;gBACJ;gBAEA,OAAO,UAAU,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,SAAS;YAC1D;QACA,KAAK;YACD,OAAO;QACX;YACI,KAAM;IACd;SACG;QACH,OAAQ,OAAO,IAAI;YACf,KAAK;gBACD,OAAO,IAAI,CAAC,CAAC,MAAM,OAAS;oBACxB,MAAM,eAAe,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,OAAS,KAAK,KAAK;oBAC9D,MAAM,eAAe,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,OAAS,KAAK,KAAK;oBAC9D,OAAO,eAAe,KAAK,MAAM,GAAG,eAAe,KAAK,MAAM;gBAClE;gBACA,KAAM;YACV,KAAK;gBACD,OAAO,IAAI,CAAC,CAAC,MAAM,OAAS;oBACxB,MAAM,eAAe,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,OAAS,KAAK,KAAK;oBAC9D,MAAM,eAAe,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,OAAS,KAAK,KAAK;oBAC9D,OAAO,eAAe,KAAK,MAAM,GAAG,eAAe,KAAK,MAAM;gBAClE;gBACA,KAAM;YACV;gBACI,KAAM;QACd;QAEA,OAAO,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;IAC3B,CAAC;AACL;kBAxGwB;;;ACAxB,OAAO,OAAO,GAAG;;;ACAjB;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAEe,SAAS,QAAQ,GAAG,EAAE,OAAO,EAAE;IAC1C,MAAM,EAAE,OAAM,EAAE,GAAG;IACnB,MAAM,EACF,UAAU,EAAE,gBAAe,EAAE,QAAO,EAAE,CAAA,EACtC,aAAa,EACT,mBAAkB,EAClB,OAAO,EAAE,YAAW,EAAE,SAAQ,EAAE,OAAM,EAAE,SAAQ,EAAE,QAAO,EAAE,MAAK,EAAE,aAAY,EAAE,QAAO,EAAE,CAAA,EAC5F,CAAA,EACJ,GAAG;IAEJ,SAAS,iBAAiB,WAAW;IAErC,MAAM,WAAW,QAAQ,YAAY,CAAA,GAAA,0BAAO,AAAD;IAC3C,MAAM,YAAY,QAAQ,aAAa,CAAA,GAAA,2BAAQ,AAAD;IAC9C,MAAM,eAAe,QAAQ,gBAAgB,CAAA,GAAA,8BAAW,AAAD;IACvD,MAAM,cAAc,QAAQ,eAAe,CAAA,GAAA,6BAAU,AAAD;IAEpD,SAAS,aAAa;QAClB,MAAM,SAAS;YACX;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACH,CAAC,GAAG,CAAC,CAAC,OAAS;YACZ,MAAM,YAAY,OAAO,KAAK,KAAK,OAAO,iBAAiB,EAAE;YAC7D,OAAO,CAAC,yCAAyC,EAAE,UAAU,cAAc,EAAE,KAAK,0BAA0B,EAAE,KAAK,QAAQ,CAAC;QAChI;QAEA,MAAM,WAAW,OACb,iBACA,CAAC;+DACkD,EAAE,OAAO,QAAQ,GAAG,CAAC,EAAE,OAAO,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;;;;;;;;;;;;oCAY/E,EAAE,OAAO,IAAI,CAAC,IAAI;;;;;gEAKU,EAAE,OAAO,SAAS,CAAC;;;;YAIvE,CAAC;QAGL,MAAM,SAAS,MAAM,sBAAsB;QAC3C,MAAM,SAAS,MAAM,sBAAsB;QAC3C,MAAM,QAAQ,MAAM,qBAAqB;QACzC,MAAM,SAAS,MAAM,kCAAkC;QACvD,MAAM,SAAS,MAAM,kCAAkC;QACvD,MAAM,UAAU,MAAM,mCAAmC;QACzD,MAAM,SAAS,OAAO,KAAK,IAAI,OAAO,SAAS;QAE/C,IAAI,IAAI,MAAM,CAAC,QAAQ,EACnB,SAAS,QAAQ;QAGrB,IAAI,OAAO,KAAK,EACZ,SAAS,UAAU,CAAC,kBAAkB,EAAE,OAAO,KAAK,CAAC,CAAC;QAG1D,IAAI,QAAQ,IAAI;QAChB,IAAI,OAAO,OAAO,IAAI;QACtB,IAAI,QAAQ,OAAO,KAAK;QACxB,OAAO,QAAQ;QAEf,SAAS,UAAU,IAAI,EAAE;YACrB,IAAI,QAAQ,GAAG;gBACX,QAAQ,IAAI;gBACZ,MAAM,SAAS,GAAG;gBAClB,YAAY,OAAO;YACvB,OAAO;gBACH,MAAM,SAAS,GAAG;gBAClB,QAAQ,WAAW,IAAM,UAAU,OAAO,IAAI;YAClD,CAAC;QACL;QAEA,SAAS,SAAS;YACd,MAAM,QAAQ;gBACV;gBACA;gBACA,QAAQ,IAAI;gBACZ,MAAM,OAAO,KAAK,CAAC,IAAI;YAC3B;YAEA,IAAI,UAAU,IAAI,IAAI,OAAO,UAAU,CAAC,QAAQ;gBAC5C,OAAO,KAAK,GAAG;gBACf,QAAQ,IAAI,CAAC;gBACb,SAAS,OAAO;gBAChB,UAAU,OAAO,QAAQ;gBACzB,IAAI,IAAI,CAAC,+BAA+B;YAC5C,CAAC;QACL;QAEA,SAAS,WAAW;YAChB,IAAI,gBAAgB,WAAW,GAAG,OAAO,QAAQ,EAAE;gBAC/C,OAAO,QAAQ;gBACf,SAAS,QAAQ,WAAW;gBAC5B,SAAS,UAAU;gBAEnB,IAAI,CAAC,OAAO,KAAK,EACb,SAAS,SAAS,gBAAgB;YAE1C,OAAO;gBACH,OAAO,iBAAiB;gBACxB,SAAS,QAAQ,WAAW;gBAC5B,YAAY,UAAU;gBAEtB,IAAI,CAAC,OAAO,KAAK,EACb,SAAS,SAAS,gBAAgB,IAAI;YAE9C,CAAC;QACL;QAEA,IAAI,KAAK,CAAC,OAAO,SAAS;QAE1B,IAAI,KAAK,CAAC,QAAQ,YAAY,CAAC,QAAU;YACrC,IAAI,MAAM,GAAG,KAAK,SAAS;gBACvB,MAAM,cAAc;gBACpB;YACJ,CAAC;QACL;QAEA,IAAI,KAAK,CAAC,QAAQ,SAAS,CAAC,QAAU;YAClC,MAAM,EAAE,QAAO,EAAE,GAAG,MAAM,MAAM;YAChC,IAAI,QAAQ,IAAI,EAAE;gBACd,OAAO,OAAO,QAAQ,IAAI;gBAC1B,aAAa,MAAM,MAAM,EAAE;YAC/B,CAAC;QACL;QAEA,IAAI,KAAK,CAAC,SAAS,SAAS,CAAC,QAAU;YACnC,MAAM,EAAE,QAAO,EAAE,GAAG,MAAM,MAAM;YAChC,IAAI,QAAQ,KAAK,EAAE;gBACf,QAAQ,QAAQ,KAAK;gBACrB,aAAa,MAAM,MAAM,EAAE;YAC/B,CAAC;QACL;QAEA;QACA,IAAI,EAAE,CAAC,UAAU,IAAM;YACnB,IAAI,CAAC,IAAI,OAAO,EACZ;QAER;QAEA,IAAI,EAAE,CAAC,WAAW,IAAM;YACpB,IAAI,OAAO,KAAK,IAAI,SAAS,aAAa,KAAK,OAAO,KAAK,EACvD,OAAO,KAAK,CAAC,WAAW,CAAC;QAEjC;IACJ;IAEA,SAAS,aAAa;QAClB,IAAI,QAAQ,CAAC,GAAG,CAAC;YACb,UAAU;YACV,MAAM;YACN,OAAO,WAAY;gBACf,IAAI,QAAQ,MAAM,EAAE;oBAChB,QAAQ,IAAI;oBACZ,IAAI,MAAM,CAAC,IAAI,GAAG;oBAClB,SAAS,UAAU,WAAW,IAAI;oBAClC,SAAS,WAAW,WAAW;gBACnC,OAAO;oBACH,QAAQ,IAAI;oBACZ,IAAI,MAAM,CAAC,IAAI,GAAG;oBAClB,SAAS,UAAU,WAAW;oBAC9B,SAAS,WAAW,WAAW,IAAI;gBACvC,CAAC;YACL;YACA,SAAQ,IAAI,EAAE;gBACV,OAAO,MAAM;gBACb,OAAO,MAAM;gBACb,QAAQ,MAAM;gBACd,SAAS,WAAW,WAAW;gBAE/B,IAAI,EAAE,CAAC,+BAA+B,IAAM;oBACxC,SAAS,UAAU,WAAW;oBAC9B,SAAS,WAAW,WAAW,IAAI;gBACvC;gBAEA,IAAI,EAAE,CAAC,+BAA+B,IAAM;oBACxC,SAAS,UAAU,WAAW,IAAI;oBAClC,SAAS,WAAW,WAAW;gBACnC;YACJ;QACJ;IACJ;IAEA,SAAS,aAAa;QAClB,IAAI,OAAO,CAAC,GAAG,CAAC;YACZ,OAAO;YACP,MAAM;YACN,MAAM;YACN,SAAS;YACT,MAAM;YACN,UAAU;gBACN;oBACI,OAAO;oBACP,MAAM;oBACN,MAAM;oBACN,SAAS;oBACT,UAAU;wBACN;4BACI,MAAM;4BACN,MAAM;wBACV;wBACA;4BACI,MAAM;4BACN,MAAM;wBACV;wBACA;4BACI,SAAS,IAAI;4BACb,MAAM;4BACN,MAAM;wBACV;wBACA;4BACI,MAAM;4BACN,MAAM;wBACV;wBACA;4BACI,MAAM;4BACN,MAAM;wBACV;qBACH;oBACD,UAAU,SAAU,IAAI,EAAE;wBACtB,QAAQ,MAAM,CAAC;4BACX,OAAO,KAAK,IAAI;wBACpB;wBACA,OAAO,KAAK,IAAI;oBACpB;gBACJ;gBACA;oBACI,OAAO;oBACP,MAAM;oBACN,MAAM;oBACN,SAAS;oBACT,UAAU;wBACN;4BACI,MAAM;4BACN,UAAU;wBACd;wBACA;4BACI,MAAM;4BACN,UAAU;wBACd;wBACA;4BACI,SAAS,IAAI;4BACb,MAAM;4BACN,UAAU;wBACd;wBACA;4BACI,MAAM;4BACN,UAAU;wBACd;wBACA;4BACI,MAAM;4BACN,UAAU;wBACd;qBACH;oBACD,UAAU,SAAU,IAAI,EAAE;wBACtB,QAAQ,MAAM,CAAC;4BACX,UAAU,KAAK,QAAQ;wBAC3B;wBACA,OAAO,KAAK,IAAI;oBACpB;gBACJ;gBACA;oBACI,OAAO;oBACP,MAAM;oBACN,MAAM;oBACN,SAAS;oBACT,UAAU;wBACN;4BACI,SAAS,IAAI;4BACb,SAAS;4BACT,MAAM;wBACV;wBACA;4BACI,SAAS;4BACT,MAAM;wBACV;wBACA;4BACI,SAAS;4BACT,MAAM;wBACV;wBACA;4BACI,SAAS;4BACT,MAAM;wBACV;wBACA;4BACI,SAAS;4BACT,MAAM;wBACV;qBACH;oBACD,UAAU,SAAU,IAAI,EAAE;wBACtB,QAAQ,MAAM,CAAC;4BACX,SAAS,KAAK,OAAO;wBACzB;wBACA,OAAO,KAAK,IAAI;oBACpB;gBACJ;gBACA;oBACI,OAAO;oBACP,MAAM;oBACN,MAAM;oBACN,SAAS;oBACT,UAAU;wBACN;4BACI,MAAM;4BACN,QAAQ;gCAAC;gCAAI;6BAAM;wBACvB;wBACA;4BACI,MAAM;4BACN,QAAQ;gCAAC;gCAAI;6BAAM;wBACvB;wBACA;4BACI,SAAS,IAAI;4BACb,MAAM;4BACN,QAAQ;gCAAC;gCAAI;6BAAM;wBACvB;wBACA;4BACI,MAAM;4BACN,QAAQ;gCAAC;gCAAI;6BAAG;wBACpB;qBACH;oBACD,UAAU,SAAU,IAAI,EAAE;wBACtB,QAAQ,MAAM,CAAC;4BACX,QAAQ,KAAK,MAAM;wBACvB;wBACA,OAAO,KAAK,IAAI;oBACpB;gBACJ;gBACA;oBACI,MAAM;oBACN,MAAM;oBACN,SAAS,OAAO,WAAW,GAAG,OAAO,IAAI;oBACzC,QAAQ,OAAO,WAAW;oBAC1B,UAAS,IAAI,EAAE;wBACX,QAAQ,MAAM,CAAC;4BACX,aAAa,CAAC,KAAK,MAAM;wBAC7B;wBACA,KAAK,OAAO,GAAG,KAAK,MAAM,GAAG,OAAO,IAAI;wBACxC,OAAO,CAAC,KAAK,MAAM;oBACvB;gBACJ;gBACA;oBACI,MAAM;oBACN,MAAM;oBACN,SAAS,OAAO,mBAAmB,GAAG,OAAO,IAAI;oBACjD,QAAQ,OAAO,mBAAmB;oBAClC,UAAS,IAAI,EAAE;wBACX,QAAQ,MAAM,CAAC;4BACX,qBAAqB,CAAC,KAAK,MAAM;wBACrC;wBACA,KAAK,OAAO,GAAG,KAAK,MAAM,GAAG,OAAO,IAAI;wBACxC,OAAO,CAAC,KAAK,MAAM;oBACvB;gBACJ;aACH;QACL;IACJ;IAEA;IACA;IACA;AACJ;kBAlYwB;AAoYxB,IAAI,OAAO,aAAa,aACpB;IAAA,IAAI,CAAC,SAAS,cAAc,CAAC,6BAA6B;QACtD,MAAM,SAAS,SAAS,aAAa,CAAC;QACtC,OAAO,EAAE,GAAG;QACZ,OAAO,WAAW,GAAG,CAAA,GAAA,yBAAK,AAAD;QACzB,SAAS,IAAI,CAAC,WAAW,CAAC;IAC9B,CAAC;AAAD,CACH;;;ACjZD,OAAO,OAAO,GAAG;;;ACAjB,OAAO,OAAO,GAAG;;;ACAjB,OAAO,OAAO,GAAG;;;ACAjB,OAAO,OAAO,GAAG;;;ACAjB,OAAO,OAAO,GAAG;;;ACAjB;;AAAA,MAAM,MAAM;IACR,KAAI,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;QACrC,OAAO,AAAE,CAAA,QAAQ,KAAI,IAAM,CAAA,SAAS,MAAK,IAAO,CAAA,QAAQ,KAAI,IAAK;IACrE;IACA,OAAM,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE;QACpB,MAAM,IAAI,KAAK,KAAK,CAAC,QAAQ,QAAQ;QACrC,OAAO,MAAM,IAAI,CACb;YACI,QAAQ,KAAK,KAAK,CAAC,AAAC,CAAA,MAAM,KAAI,IAAK;QACvC,GACA,CAAC,GAAG,IAAM;YACN,OAAO,IAAI,OAAO;QACtB;IAER;AACJ;AAEA,MAAM,OAAO,CAAC,QAAQ,SAAW;IAC7B,MAAM,UAAU,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE;IACrC,MAAM,UAAU,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE;IACrC,OAAO;QACH,QAAQ,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,SAAS,KAAK,KAAK,GAAG,CAAC,SAAS;QAC3D,OAAO,KAAK,KAAK,CAAC,SAAS;IAC/B;AACJ;AAEe,SAAS,QAAQ,GAAG,EAAE,OAAO,EAAE;IAC1C,IAAI,QAAQ,CAAC,GAAG,CAAC;QACb,MAAM;QACN,UAAU;QACV,MAAM;QACN,OAAO;YACH,QAAQ;YACR,OAAO;YACP,eAAe;QACnB;QACA,SAAQ,QAAQ,EAAE;YACd,SAAS,SAAS;gBACd,MAAM,MAAM;oBACR,GAAG,SAAS,WAAW;oBACvB,GAAG,SAAS,YAAY;gBAC5B;gBAEA,MAAM,UAAU;oBACZ,MAAM;oBACN,MAAM,IAAI,CAAC;oBACX,MAAM;oBACN,MAAM;oBACN,OAAO;oBACP,WAAW,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG;oBAC9B,UAAU,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG;oBAC7B,MAAM;oBACN,WAAW;oBACX,YAAY;gBAChB;gBAEA,MAAM,SAAS,EAAE;gBACjB,MAAM,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC;gBAChC,IAAK,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,EAAE,KAAK,QAAQ,QAAQ,CAAE;oBAC/C,MAAM,IAAI,QAAQ,MAAM,CAAC,MAAM,CAC3B,CAAC,EAAE,KAAI,EAAE,GAAK,OAAO,IAAI,OAAO,QAAQ,AAAC,CAAA,IAAI,QAAQ,QAAQ,AAAD,IAAK,KACnE,MAAM;oBACR,OAAO,IAAI,CAAC;wBAAC;wBAAG,IAAI,QAAQ,SAAS;qBAAC;gBAC1C;gBAEA,MAAM,UAAU,OAAO,GAAG,CAAC,CAAC,QAAU,KAAK,CAAC,EAAE;gBAC9C,MAAM,OAAO,KAAK,GAAG,IAAI;gBACzB,MAAM,OAAO,KAAK,GAAG,IAAI;gBACzB,MAAM,OAAO,AAAC,CAAA,OAAO,IAAG,IAAK;gBAE7B,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,MAAM,EAAE,IAAK;oBACpC,MAAM,QAAQ,MAAM,CAAC,EAAE;oBACvB,MAAM,IAAI,KAAK,CAAC,EAAE;oBAClB,KAAK,CAAC,EAAE,GAAG,IAAK,CAAA,IAAI,OAAO,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,AAAD;gBACnE;gBAEA,MAAM,eAAe,CAAC,SAAS,UAAU,MAAM,UAAY;oBACvD,MAAM,IAAI,YAAY;oBACtB,MAAM,IAAI,QAAQ;oBAClB,MAAM,IAAI,KAAK,GAAG;oBAClB,MAAM,OAAO,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,QAAQ,UAAU,EAAE,GAAG,GAAG,GAAG;oBACtE,MAAM,QAAQ,EAAE,KAAK,GAAG,OAAQ,CAAA,UAAU,KAAK,EAAE,GAAG,CAAC,AAAD;oBACpD,MAAM,SAAS,EAAE,MAAM,GAAG,QAAQ,SAAS;oBAC3C,MAAM,IAAI,OAAO,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,SAAS;oBACzC,MAAM,IAAI,OAAO,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,SAAS;oBACzC,OAAO;wBAAC;wBAAG;qBAAE;gBACjB;gBAEA,MAAM,gBAAgB,CAAC,OAAO,GAAG,IAAM;oBACnC,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC7C,MAAM,MAAM,aAAa,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI;oBACxD,MAAM,QAAQ,MAAM,EAAE,MAAM,GAAG,IAAI,OAAO,EAAE;oBAC5C,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;gBACtF;gBAEA,MAAM,kBAAkB,OAAO,GAAG,CAAC,CAAC,IAAM;oBACtC,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,IAAI,EAAE,QAAQ,IAAI,EAAE,GAAG,IAAI,CAAC;oBAC5D,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,IAAI,EAAE,QAAQ,IAAI,EAAE,IAAI,CAAC,EAAE;oBAC3D,OAAO;wBAAC;wBAAG;qBAAE;gBACjB;gBAEA,MAAM,QAAQ,gBAAgB,MAAM,CAChC,CAAC,KAAK,GAAG,GAAG,IACR,MAAM,IACA,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GACvE,CAAC,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,GAAG,GAAG,CAAC,EAC5C;gBAGJ,SAAS,SAAS,GAAG,CAAC;oCACF,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;mEACc,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM;;gBAEhF,CAAC;YACL;YAEA,IAAI,EAAE,CAAC,SAAS;YAChB,IAAI,EAAE,CAAC,UAAU;YACjB,IAAI,IAAI,CAAC,iCAAiC;QAC9C;IACJ;AACJ;kBA/FwB","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('resize', 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 SETTING_ITEM_WIDTH,\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
\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 art.on('artplayerPluginDanmuku:hide', () => {\n setStyle($danmuOn, 'display', 'none');\n setStyle($danmuOff, 'display', null);\n });\n\n art.on('artplayerPluginDanmuku:show', () => {\n setStyle($danmuOn, 'display', null);\n setStyle($danmuOff, 'display', 'none');\n });\n },\n });\n }\n\n function addSetting() {\n art.setting.add({\n width: 260,\n name: 'danmuku',\n html: '弹幕设置',\n tooltip: '更多',\n icon: $danmuConfig,\n selector: [\n {\n width: SETTING_ITEM_WIDTH,\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: SETTING_ITEM_WIDTH,\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: SETTING_ITEM_WIDTH,\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: SETTING_ITEM_WIDTH,\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 = {\n map(value, inMin, inMax, outMin, outMax) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin;\n },\n range(start, end, tick) {\n const s = Math.round(start / tick) * tick;\n return Array.from(\n {\n length: Math.floor((end - start) / tick),\n },\n (v, k) => {\n return k * tick + s;\n },\n );\n },\n};\n\nconst line = (pointA, pointB) => {\n const lengthX = pointB[0] - pointA[0];\n const lengthY = pointB[1] - pointA[1];\n return {\n length: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n angle: Math.atan2(lengthY, lengthX),\n };\n};\n\nexport default function heatmap(art, danmuku) {\n art.controls.add({\n name: 'heatmap',\n position: 'top',\n html: '',\n style: {\n height: '50px',\n width: '100%',\n pointerEvents: 'none',\n },\n mounted($heatmap) {\n function update() {\n const svg = {\n w: $heatmap.offsetWidth,\n h: $heatmap.offsetHeight,\n };\n\n const options = {\n xMin: 0,\n xMax: svg.w,\n yMin: 0,\n yMax: 128,\n scale: 0.2,\n minHeight: Math.floor(svg.h * 0.1),\n sampling: Math.floor(svg.w / 100),\n fill: 'rgba(255, 255, 255, 0.5)',\n smoothing: 0.2,\n flattening: 0,\n };\n\n const points = [];\n const gap = art.duration / svg.w;\n for (let x = 0; x <= svg.w; x += options.sampling) {\n const y = danmuku.danmus.filter(\n ({ time }) => time > x * gap && time <= (x + options.sampling) * gap,\n ).length;\n points.push([x, y + options.minHeight]);\n }\n\n const yPoints = points.map((point) => point[1]);\n const yMin = Math.min(...yPoints);\n const yMax = Math.max(...yPoints);\n const yMid = (yMin + yMax) / 2;\n\n for (let i = 0; i < points.length; i++) {\n const point = points[i];\n const y = point[1];\n point[1] = y * (y > yMid ? 1 + options.scale : 1 - options.scale);\n }\n\n const controlPoint = (current, previous, next, reverse) => {\n const p = previous || current;\n const n = next || current;\n const o = line(p, n);\n const flat = lib.map(Math.cos(o.angle) * options.flattening, 0, 1, 1, 0);\n const angle = o.angle * flat + (reverse ? Math.PI : 0);\n const length = o.length * options.smoothing;\n const x = current[0] + Math.cos(angle) * length;\n const y = current[1] + Math.sin(angle) * length;\n return [x, y];\n };\n\n const bezierCommand = (point, i, a) => {\n const cps = controlPoint(a[i - 1], a[i - 2], point);\n const cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n const close = i === a.length - 1 ? ' z' : '';\n return `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}${close}`;\n };\n\n const pointsPositions = points.map((e) => {\n const x = lib.map(e[0], options.xMin, options.xMax, 0, svg.w);\n const y = lib.map(e[1], options.yMin, options.yMax, svg.h, 0);\n return [x, y];\n });\n\n const pathD = pointsPositions.reduce(\n (acc, e, i, a) =>\n i === 0\n ? `M ${a[a.length - 1][0]},${svg.h} L ${e[0]},${svg.h} L ${e[0]},${e[1]}`\n : `${acc} ${bezierCommand(e, i, a)}`,\n '',\n );\n\n $heatmap.innerHTML = `\n \n \n \n `;\n }\n\n art.on('ready', update);\n art.on('resize', update);\n art.emit('artplayerPluginDanmuku:loaded', update);\n },\n });\n}\n"],"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, option.heatmap);\n return {\n name: 'artplayerPluginDanmuku',\n emit: danmuku.emit.bind(danmuku),\n load: danmuku.load.bind(danmuku),\n config: danmuku.config.bind(danmuku),\n hide: danmuku.hide.bind(danmuku),\n show: danmuku.show.bind(danmuku),\n reset: danmuku.reset.bind(danmuku),\n 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: 'object|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('resize', 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 SETTING_ITEM_WIDTH,\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
\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 art.on('artplayerPluginDanmuku:hide', () => {\n setStyle($danmuOn, 'display', 'none');\n setStyle($danmuOff, 'display', null);\n });\n\n art.on('artplayerPluginDanmuku:show', () => {\n setStyle($danmuOn, 'display', null);\n setStyle($danmuOff, 'display', 'none');\n });\n },\n });\n }\n\n function addSetting() {\n art.setting.add({\n width: 260,\n name: 'danmuku',\n html: '弹幕设置',\n tooltip: '更多',\n icon: $danmuConfig,\n selector: [\n {\n width: SETTING_ITEM_WIDTH,\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: SETTING_ITEM_WIDTH,\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: SETTING_ITEM_WIDTH,\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: SETTING_ITEM_WIDTH,\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 = {\n map(value, inMin, inMax, outMin, outMax) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin;\n },\n range(start, end, tick) {\n const s = Math.round(start / tick) * tick;\n return Array.from(\n {\n length: Math.floor((end - start) / tick),\n },\n (v, k) => {\n return k * tick + s;\n },\n );\n },\n};\n\nconst line = (pointA, pointB) => {\n const lengthX = pointB[0] - pointA[0];\n const lengthY = pointB[1] - pointA[1];\n return {\n length: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n angle: Math.atan2(lengthY, lengthX),\n };\n};\n\nexport default function heatmap(art, danmuku, option) {\n const { query } = art.constructor.utils;\n\n art.controls.add({\n name: 'heatmap',\n position: 'top',\n html: '',\n style: {\n height: '100px',\n width: '100%',\n pointerEvents: 'none',\n },\n mounted($heatmap) {\n let $start = null;\n let $stop = null;\n\n function update() {\n $start = null;\n $stop = null;\n $heatmap.innerHTML = '';\n\n if (danmuku.danmus.length === 0) return;\n\n const svg = {\n w: $heatmap.offsetWidth,\n h: $heatmap.offsetHeight,\n };\n\n const options = {\n xMin: 0,\n xMax: svg.w,\n yMin: 0,\n yMax: 128,\n scale: 0.25,\n opacity: 0.2,\n minHeight: Math.floor(svg.h * 0.05),\n sampling: Math.floor(svg.w / 100),\n smoothing: 0.2,\n flattening: 0.2,\n };\n\n if (typeof option === 'object') {\n Object.assign(options, option);\n }\n\n const points = [];\n const gap = art.duration / svg.w;\n for (let x = 0; x <= svg.w; x += options.sampling) {\n const y = danmuku.danmus.filter(\n ({ time }) => time > x * gap && time <= (x + options.sampling) * gap,\n ).length;\n points.push([x, y]);\n }\n\n const lastPoint = points[points.length - 1];\n const lastX = lastPoint[0];\n const lastY = lastPoint[1];\n if (lastX !== svg.w) {\n points.push([svg.w, lastY]);\n }\n\n const yPoints = points.map((point) => point[1]);\n const yMin = Math.min(...yPoints);\n const yMax = Math.max(...yPoints);\n const yMid = (yMin + yMax) / 2;\n\n for (let i = 0; i < points.length; i++) {\n const point = points[i];\n const y = point[1];\n point[1] = y * (y > yMid ? 1 + options.scale : 1 - options.scale) + options.minHeight;\n }\n\n const controlPoint = (current, previous, next, reverse) => {\n const p = previous || current;\n const n = next || current;\n const o = line(p, n);\n const flat = lib.map(Math.cos(o.angle) * options.flattening, 0, 1, 1, 0);\n const angle = o.angle * flat + (reverse ? Math.PI : 0);\n const length = o.length * options.smoothing;\n const x = current[0] + Math.cos(angle) * length;\n const y = current[1] + Math.sin(angle) * length;\n return [x, y];\n };\n\n const bezierCommand = (point, i, a) => {\n const cps = controlPoint(a[i - 1], a[i - 2], point);\n const cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n const close = i === a.length - 1 ? ' z' : '';\n return `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}${close}`;\n };\n\n const pointsPositions = points.map((e) => {\n const x = lib.map(e[0], options.xMin, options.xMax, 0, svg.w);\n const y = lib.map(e[1], options.yMin, options.yMax, svg.h, 0);\n return [x, y];\n });\n\n const pathD = pointsPositions.reduce(\n (acc, e, i, a) =>\n i === 0\n ? `M ${a[a.length - 1][0]},${svg.h} L ${e[0]},${svg.h} L ${e[0]},${e[1]}`\n : `${acc} ${bezierCommand(e, i, a)}`,\n '',\n );\n\n $heatmap.innerHTML = `\n \n \n \n \n \n \n \n \n \n \n \n `;\n\n $start = query('#heatmap-start', $heatmap);\n $stop = query('#heatmap-stop', $heatmap);\n $start.setAttribute('offset', `${art.played * 100}%`);\n $stop.setAttribute('offset', `${art.played * 100}%`);\n }\n\n art.on('video:timeupdate', () => {\n if ($start && $stop) {\n $start.setAttribute('offset', `${art.played * 100}%`);\n $stop.setAttribute('offset', `${art.played * 100}%`);\n }\n });\n\n art.on('setBar', (type, percentage) => {\n if ($start && $stop && type === 'played') {\n $start.setAttribute('offset', `${percentage * 100}%`);\n $stop.setAttribute('offset', `${percentage * 100}%`);\n }\n });\n\n art.on('ready', update);\n art.on('resize', update);\n art.on('artplayerPluginDanmuku:loaded', update);\n },\n });\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"} \ No newline at end of file diff --git a/docs/uncompiled/artplayer/index.js b/docs/uncompiled/artplayer/index.js index 60bf2344b..34da03adc 100644 --- a/docs/uncompiled/artplayer/index.js +++ b/docs/uncompiled/artplayer/index.js @@ -249,7 +249,7 @@ class Artplayer extends (0, _emitterDefault.default) { return "development"; } static get build() { - return "2023-05-02 15:48:47"; + return "2023-05-02 17:01:04"; } static get config() { return 0, _configDefault.default; diff --git a/packages/artplayer-plugin-danmuku/src/danmuku.js b/packages/artplayer-plugin-danmuku/src/danmuku.js index b31d93a48..d7b5f825c 100644 --- a/packages/artplayer-plugin-danmuku/src/danmuku.js +++ b/packages/artplayer-plugin-danmuku/src/danmuku.js @@ -86,7 +86,7 @@ export default class Danmuku { maxWidth: 'number', mount: 'undefined|htmldivelement', theme: 'string', - heatmap: 'boolean', + heatmap: 'object|boolean', beforeEmit: 'function', }; } diff --git a/packages/artplayer-plugin-danmuku/src/heatmap.js b/packages/artplayer-plugin-danmuku/src/heatmap.js index a905a4ee8..2d407dcbb 100644 --- a/packages/artplayer-plugin-danmuku/src/heatmap.js +++ b/packages/artplayer-plugin-danmuku/src/heatmap.js @@ -24,18 +24,29 @@ const line = (pointA, pointB) => { }; }; -export default function heatmap(art, danmuku) { +export default function heatmap(art, danmuku, option) { + const { query } = art.constructor.utils; + art.controls.add({ name: 'heatmap', position: 'top', html: '', style: { - height: '50px', + height: '100px', width: '100%', pointerEvents: 'none', }, mounted($heatmap) { + let $start = null; + let $stop = null; + function update() { + $start = null; + $stop = null; + $heatmap.innerHTML = ''; + + if (danmuku.danmus.length === 0) return; + const svg = { w: $heatmap.offsetWidth, h: $heatmap.offsetHeight, @@ -46,21 +57,32 @@ export default function heatmap(art, danmuku) { xMax: svg.w, yMin: 0, yMax: 128, - scale: 0.2, - minHeight: Math.floor(svg.h * 0.1), + scale: 0.25, + opacity: 0.2, + minHeight: Math.floor(svg.h * 0.05), sampling: Math.floor(svg.w / 100), - fill: 'rgba(255, 255, 255, 0.5)', smoothing: 0.2, - flattening: 0, + flattening: 0.2, }; + if (typeof option === 'object') { + Object.assign(options, option); + } + 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]); + points.push([x, y]); + } + + const lastPoint = points[points.length - 1]; + const lastX = lastPoint[0]; + const lastY = lastPoint[1]; + if (lastX !== svg.w) { + points.push([svg.w, lastY]); } const yPoints = points.map((point) => point[1]); @@ -71,7 +93,7 @@ export default function heatmap(art, danmuku) { 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); + point[1] = y * (y > yMid ? 1 + options.scale : 1 - options.scale) + options.minHeight; } const controlPoint = (current, previous, next, reverse) => { @@ -108,15 +130,42 @@ export default function heatmap(art, danmuku) { ); $heatmap.innerHTML = ` - - - + + + + + + + + + + + `; + + $start = query('#heatmap-start', $heatmap); + $stop = query('#heatmap-stop', $heatmap); + $start.setAttribute('offset', `${art.played * 100}%`); + $stop.setAttribute('offset', `${art.played * 100}%`); } + art.on('video:timeupdate', () => { + if ($start && $stop) { + $start.setAttribute('offset', `${art.played * 100}%`); + $stop.setAttribute('offset', `${art.played * 100}%`); + } + }); + + art.on('setBar', (type, percentage) => { + if ($start && $stop && type === 'played') { + $start.setAttribute('offset', `${percentage * 100}%`); + $stop.setAttribute('offset', `${percentage * 100}%`); + } + }); + art.on('ready', update); art.on('resize', update); - art.emit('artplayerPluginDanmuku:loaded', update); + art.on('artplayerPluginDanmuku:loaded', update); }, }); } diff --git a/packages/artplayer-plugin-danmuku/src/index.js b/packages/artplayer-plugin-danmuku/src/index.js index 5361651c2..c0186c6ed 100644 --- a/packages/artplayer-plugin-danmuku/src/index.js +++ b/packages/artplayer-plugin-danmuku/src/index.js @@ -18,7 +18,7 @@ export default function artplayerPluginDanmuku(option) { checkVersion(art); const danmuku = new Danmuku(art, option); setting(art, danmuku); - if (option.heatmap) heatmap(art, danmuku); + if (option.heatmap) heatmap(art, danmuku, option.heatmap); return { name: 'artplayerPluginDanmuku', emit: danmuku.emit.bind(danmuku), diff --git a/packages/artplayer-plugin-danmuku/types/artplayer-plugin-danmuku.d.ts b/packages/artplayer-plugin-danmuku/types/artplayer-plugin-danmuku.d.ts index c9296de25..dd3451021 100644 --- a/packages/artplayer-plugin-danmuku/types/artplayer-plugin-danmuku.d.ts +++ b/packages/artplayer-plugin-danmuku/types/artplayer-plugin-danmuku.d.ts @@ -119,7 +119,20 @@ type Option = { /** * 是否开启弹幕热度图 */ - heatmap?: boolean; + heatmap?: + | boolean + | { + xMin?: number; + xMax?: number; + yMin?: number; + yMax?: number; + scale?: number; + opacity?: number; + minHeight?: number; + sampling?: number; + smoothing?: number; + flattening?: number; + }; /** * 发送弹幕前的自定义校验,返回 true 则可以发送