UNPKG

ultrastar2ass

Version:

Convert Ultrastar karaoke files to ASS files

107 lines 4.25 kB
#!/usr/bin/env node "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.convertToASS = convertToASS; const utils_1 = require("./utils"); const ultrastar_1 = __importDefault(require("./ultrastar")); const ass_stringify_1 = __importDefault(require("ass-stringify")); const ass = require("./assTemplate"); function generateASSLine(line, styles, duet) { const ASSLine = []; let startMs = line.start; const stopMs = line.end + 100; line.syllables.forEach((syl) => ASSLine.push((syl.text.startsWith(' ') && ASSLine.length > 0 ? ' ' : '') + '{\\k' + Math.floor(syl.duration / 10) + '}' + syl.text.trim() + (syl.text.endsWith(' ') ? ' ' : ''))); const dialogue = (0, utils_1.clone)(ass.dialogue); const comment = (0, utils_1.clone)(ass.dialogue); dialogue.value.Start = (0, utils_1.msToAss)(startMs - 900 < 0 ? 0 : startMs - 900); comment.value.Start = (0, utils_1.msToAss)(startMs); dialogue.value.End = (0, utils_1.msToAss)(stopMs); comment.value.End = (0, utils_1.msToAss)(stopMs); dialogue.value.Text = '{\\k' + (startMs - 900 < 0 ? (900 - startMs) / 10 : 100) + ass.dialogueScript + ASSLine.join(''); dialogue.value.Effect = 'fx'; dialogue.value.Style = duet ? styles.body[2].value.Name : styles.body[1].value.Name; comment.value.Text = ASSLine.join(''); comment.value.Effect = 'karaoke'; comment.key = 'Comment'; comment.value.Style = duet ? styles.body[2].value.Name : styles.body[1].value.Name; return { dialogue, comment }; } function sortStartTime(a, b) { if (a.value.Start < b.value.Start) return -1; if (a.value.Start > b.value.Start) return 1; return 0; } function convertToASS(time, options) { const ultrastar = new ultrastar_1.default(options); const kara = ultrastar.parse(time); const dialogues = []; const comments = []; const styles = (0, utils_1.clone)(ass.styles); if (kara.meta.duet) { styles.body[1].value.Name = kara.meta.duetsingerp1 || 'Default'; styles.body.push((0, utils_1.clone)(styles.body[1])); styles.body[2].value.Name = kara.meta.duetsingerp2 || 'Default2'; styles.body[2].value.SecondaryColour = '&H000F4BE1'; } const script = (0, utils_1.clone)(ass.dialogue); script.value.Effect = ass.scriptFX; script.value.Text = ass.script; script.key = 'Comment'; comments.push(script); for (const line of kara.track) { const ASSLines = generateASSLine(line, styles, false); comments.push((0, utils_1.clone)(ASSLines.comment)); dialogues.push((0, utils_1.clone)(ASSLines.dialogue)); } if (kara.meta.duet) { for (const line of kara.track_duet) { const ASSLines = generateASSLine(line, styles, true); comments.push((0, utils_1.clone)(ASSLines.comment)); dialogues.push((0, utils_1.clone)(ASSLines.dialogue)); } } comments.sort(sortStartTime); dialogues.sort(sortStartTime); const events = (0, utils_1.clone)(ass.events); events.body = events.body.concat(comments, dialogues); return (0, ass_stringify_1.default)([ass.scriptInfo, styles, events]); } async function mainCLI() { if (!process.argv[2]) { throw `Ultrastar2ass - Convert Ultrastar karaoke to ASS file Usage: ultrastar2ass myfile.txt Options: --encoding=input-file-encoding (default: utf8) Output goes to stdout `; } const txtFile = process.argv[2]; let encoding = 'utf8'; if (process.argv[3] && process.argv[3].startsWith('--encoding=')) { encoding = process.argv[3].replace('--encoding=', ''); } if (!await (0, utils_1.asyncExists)(txtFile)) throw `File ${txtFile} does not exist`; const txt = await (0, utils_1.asyncReadFile)(txtFile, encoding); return convertToASS(txt, { syllable_precision: true }); } if (require.main === module) mainCLI() .then(data => console.log(data)) .catch(err => console.log(err)); //# sourceMappingURL=index.js.map