merge-vtt
Version:
A simple tool to merge multiple WebVTT (.vtt) files into a single file.
84 lines (66 loc) • 2.24 kB
JavaScript
const fs = require("fs");
const path = require("path");
function mergeVTT(transcriptions) {
let headerFound = false;
let mergedTranscription = [];
let timeOffset = 0;
let cueCounter = 1;
transcriptions.forEach((transcription) => {
const lines = transcription.trim().split("\n");
lines.forEach((line) => {
if (line.trim() === "") {
return;
}
if (line.trim() === "WEBVTT") {
if (!headerFound) {
mergedTranscription.push(line);
headerFound = true;
}
return;
}
if (!isNaN(line)) {
line = String(cueCounter++);
}
if (line.includes("-->")) {
line = adjustTimestamps(line, timeOffset);
mergedTranscription.push(line);
} else {
mergedTranscription.push(line);
}
});
timeOffset = updateTimeOffset(lines, timeOffset);
});
return formatMergedTranscription(mergedTranscription);
}
function adjustTimestamps(line, offset) {
const timestamps = line.split("-->");
const start = convertTimestampToSeconds(timestamps[0].trim()) + offset;
const end = convertTimestampToSeconds(timestamps[1].trim()) + offset;
const newStart = convertSecondsToTimestamp(start);
const newEnd = convertSecondsToTimestamp(end);
return `${newStart} --> ${newEnd}`;
}
function convertTimestampToSeconds(timestamp) {
const [hours, minutes, seconds] = timestamp.split(":").map(parseFloat);
return hours * 3600 + minutes * 60 + seconds;
}
function convertSecondsToTimestamp(seconds) {
const date = new Date(seconds * 1000).toISOString();
return date.substr(11, 12);
}
function updateTimeOffset(lines, offset) {
const lastTimestampLine = lines[lines.length - 2];
const timestamps = lastTimestampLine.split("-->");
const end = convertTimestampToSeconds(timestamps[1].trim());
return offset + end;
}
function formatMergedTranscription(mergedTranscription) {
return mergedTranscription
.join("\n")
.replace(
/\n(\d{2}:\d{2}:\d{2}\.\d{3} --> \d{2}:\d{2}:\d{2}\.\d {3})\n/g,
"\n\n$1\n"
);
}
// Export the function for use in other files
module.exports = { mergeVTT };