From d644d322c388887cf412b985f62758ee4aa1bbbc Mon Sep 17 00:00:00 2001 From: Genteure Date: Wed, 8 Jun 2022 02:07:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20DOMParser=20=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E5=BC=B9=E5=B9=95=20XML=20=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 这样的实现更标准,主要有两个优点: 1. 能正确处理转义过的字符,如 `<<<<` 2. 能支持其他“兼容”B站弹幕XML格式的弹幕文件 --- .../artplayer-plugin-danmuku/src/bilibili.js | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/artplayer-plugin-danmuku/src/bilibili.js b/packages/artplayer-plugin-danmuku/src/bilibili.js index af6a6ce87..794d9fd14 100644 --- a/packages/artplayer-plugin-danmuku/src/bilibili.js +++ b/packages/artplayer-plugin-danmuku/src/bilibili.js @@ -14,26 +14,26 @@ 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; - }) - : []; + try { + let parsedXml = (new DOMParser()).parseFromString(xmlString, 'text/xml'); + return Array.from(parsedXml.querySelectorAll('d')).map((d) => { + let attr = d.attributes.p.value.split(','); + return { + text: d.textContent, + 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]) + } + } + ) + } catch (error) { + return []; + } } export function bilibiliDanmuParseFromUrl(url) {