From 19061122b26487d6e4a455d62d6470967dae9982 Mon Sep 17 00:00:00 2001 From: Genteure Date: Wed, 8 Jun 2022 15:21:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8C=B9=E9=85=8D=20XML=20?= =?UTF-8?q?=E5=BC=B9=E5=B9=95=E7=9A=84=E6=AD=A3=E5=88=99=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../artplayer-plugin-danmuku/src/bilibili.js | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/packages/artplayer-plugin-danmuku/src/bilibili.js b/packages/artplayer-plugin-danmuku/src/bilibili.js index af6a6ce87..37d317a2c 100644 --- a/packages/artplayer-plugin-danmuku/src/bilibili.js +++ b/packages/artplayer-plugin-danmuku/src/bilibili.js @@ -14,26 +14,31 @@ export function getMode(key) { export function bilibiliDanmuParseFromXml(xmlString) { if (typeof xmlString !== 'string') return []; - const srtList = xmlString.match(/[\S ]*?)<\/d>/gi); - return srtList && srtList.length - ? srtList.map((item) => { - const [, attrStr, text] = item.match(/(.+)<\/d>/); - const attr = attrStr.split(','); - return attr.length === 8 && text.trim() - ? { - text, - time: Number(attr[0]), - mode: getMode(Number(attr[1])), - fontSize: Number(attr[2]), - color: `#${Number(attr[3]).toString(16)}`, - timestamp: Number(attr[4]), - pool: Number(attr[5]), - userID: attr[6], - rowID: Number(attr[7]), - } - : null; - }) - : []; + const matches = xmlString.matchAll(/(?.+?)<\/d>/gs); + return Array.from(matches).map(match => { + const attr = match.groups.p.split(','); + if (attr.length === 8) { + const text = match.groups.text.trim() + .replaceAll('"', '\"') + .replaceAll(''', '\'') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('&', '&'); + return { + text, + time: Number(attr[0]), + mode: getMode(Number(attr[1])), + fontSize: Number(attr[2]), + color: `#${Number(attr[3]).toString(16)}`, + timestamp: Number(attr[4]), + pool: Number(attr[5]), + userID: attr[6], + rowID: Number(attr[7]), + } + } else { + return null; + } + }).filter(d => d); } export function bilibiliDanmuParseFromUrl(url) {