diff --git a/utils/danmaku.ts b/utils/danmaku.ts new file mode 100644 index 0000000..f61f847 --- /dev/null +++ b/utils/danmaku.ts @@ -0,0 +1,24 @@ +import type { DanmakuItem } from '../services/types'; + +export function parseDanmakuXml(xml: string): DanmakuItem[] { + const re = /([^<]*)<\/d>/g; + const items: DanmakuItem[] = []; + let m: RegExpExecArray | null; + while ((m = re.exec(xml)) !== null) { + const p = m[1].split(','); + if (p.length < 4) continue; + const time = parseFloat(p[0]); + const mode = parseInt(p[1], 10); + const text = m[2] + .replace(/&/g, '&').replace(/</g, '<') + .replace(/>/g, '>').replace(/"/g, '"').trim(); + if (!text || isNaN(time)) continue; + if (mode !== 1 && mode !== 4 && mode !== 5) continue; + items.push({ time, mode: mode as 1|4|5, fontSize: parseInt(p[2],10), color: parseInt(p[3],10), text }); + } + return items.sort((a, b) => a.time - b.time); +} + +export function danmakuColorToCss(color: number): string { + return '#' + (color >>> 0 & 0xFFFFFF).toString(16).padStart(6, '0'); +}