ultrastar2ass
Version:
Convert Ultrastar karaoke files to ASS files
107 lines • 4.25 kB
JavaScript
;
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