UNPKG

native-lyrics-tools

Version:

A JavaScript library for parsing and generating various lyric formats.

42 lines (31 loc) 1.49 kB
function writeTimestamp(time) { const ms = time % 1000; const sec = Math.floor(time / 1000); const min = Math.floor(sec / 60); const hour = Math.floor(min / 60); return `${hour}:${String(min % 60).padStart(2, '0')}:${String(sec % 60).padStart(2, '0')}.${String(Math.floor(ms / 10)).padStart(2, '0')}`; } export function stringifyAss(lines) { let result = `[Script Info] [Events] Formats: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text `; for (const line of lines) { if (!line.words?.length) continue; const startTime = Math.min(...line.words.map(w => w.start_time)); const endTime = Math.max(...line.words.map(w => w.end_time)); const name = `${line.is_duet ? "v2" : "v1"}${line.is_bg ? "-bg" : ""}`; const kText = line.words.map(word => { const duration = Math.floor((word.end_time - word.start_time) / 10); return `{\\k${duration}}${word.word}`; }).join(''); result += `Dialogue: 0,${writeTimestamp(startTime)}, ${writeTimestamp(endTime)}, Default, ${name},0,0,0,,${kText}\n`; if (line.translated_lyric) { result += `Dialogue: 0,${writeTimestamp(startTime)}, ${writeTimestamp(endTime)}, Default, ${name}-trans,0,0,0,,${line.translated_lyric}\n`; } if (line.roman_lyric) { result += `Dialogue: 0,${writeTimestamp(startTime)}, ${writeTimestamp(endTime)}, Default, ${name}-roman,0,0,0,,${line.roman_lyric}\n`; } } return result; }