UNPKG

merge-vtt

Version:

A simple tool to merge multiple WebVTT (.vtt) files into a single file.

84 lines (66 loc) 2.24 kB
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 };