45 lines
1.2 KiB
JavaScript
45 lines
1.2 KiB
JavaScript
function millisecondsStringToNumber(msString) {
|
|
const cleanString = msString.trim();
|
|
const milliseconds = parseInt(cleanString, 10);
|
|
|
|
if (isNaN(milliseconds)) {
|
|
return 0;
|
|
}
|
|
|
|
return milliseconds;
|
|
}
|
|
|
|
export function parseBilingualVtt(vttText) {
|
|
const cleanText = vttText.replace(/^\uFEFF/, "").trim();
|
|
const cues = cleanText.split(/\n\n+/);
|
|
|
|
const result = [];
|
|
|
|
for (const cue of cues) {
|
|
if (!cue.includes("-->")) continue;
|
|
|
|
const lines = cue.split("\n");
|
|
|
|
const timestampLineIndex = lines.findIndex((line) => line.includes("-->"));
|
|
if (timestampLineIndex === -1) continue;
|
|
|
|
const [startTimeString, endTimeString] =
|
|
lines[timestampLineIndex].split(" --> ");
|
|
const textLines = lines.slice(timestampLineIndex + 1);
|
|
|
|
if (startTimeString && endTimeString && textLines.length > 0) {
|
|
const originalText = textLines[0].trim();
|
|
const translatedText = (textLines[1] || "").trim();
|
|
|
|
result.push({
|
|
start: millisecondsStringToNumber(startTimeString),
|
|
end: millisecondsStringToNumber(endTimeString),
|
|
text: originalText,
|
|
translation: translatedText,
|
|
});
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|