native-lyrics-tools
Version:
A JavaScript library for parsing and generating various lyric formats.
42 lines (31 loc) • 1.49 kB
JavaScript
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;
}