| import { v4 as uuidv4 } from "uuid"; |
| import type { Caption } from "@/types"; |
|
|
| function parseTimestamp(value: string): number { |
| const match = value.trim().match(/(\d{2}):(\d{2}):(\d{2})[,.](\d{3})/); |
| if (!match) return 0; |
| const [, hours, minutes, seconds, millis] = match; |
| return ( |
| Number(hours) * 3600000 + |
| Number(minutes) * 60000 + |
| Number(seconds) * 1000 + |
| Number(millis) |
| ); |
| } |
|
|
| export function parseWordSrt(content: string): Caption[] { |
| const blocks = content.trim().split(/\n\s*\n/); |
| const captions: Caption[] = []; |
|
|
| for (const block of blocks) { |
| const lines = block.split("\n").map((l) => l.trim()).filter(Boolean); |
| if (lines.length < 2) continue; |
|
|
| const timingLine = lines.find((l) => l.includes("-->")); |
| if (!timingLine) continue; |
|
|
| const [startRaw, endRaw] = timingLine.split("-->").map((s) => s.trim()); |
| const textLines = lines.slice(lines.indexOf(timingLine) + 1); |
| const text = textLines.join(" ").trim(); |
| if (!text) continue; |
|
|
| captions.push({ |
| id: uuidv4(), |
| text, |
| startMs: parseTimestamp(startRaw), |
| endMs: parseTimestamp(endRaw), |
| }); |
| } |
|
|
| return captions; |
| } |
|
|
| export function parseSrt(content: string): Caption[] { |
| const blocks = content.trim().split(/\n\s*\n/); |
| const captions: Caption[] = []; |
|
|
| for (const block of blocks) { |
| const lines = block.split("\n").map((l) => l.trim()).filter(Boolean); |
| if (lines.length < 2) continue; |
|
|
| const timingLine = lines.find((l) => l.includes("-->")); |
| if (!timingLine) continue; |
|
|
| const [startRaw, endRaw] = timingLine.split("-->").map((s) => s.trim()); |
| const textLines = lines.slice(lines.indexOf(timingLine) + 1); |
| const text = textLines.join(" ").trim(); |
| if (!text) continue; |
|
|
| const words = text.split(/\s+/).filter(Boolean); |
| const startMs = parseTimestamp(startRaw); |
| const endMs = parseTimestamp(endRaw); |
| const totalDuration = Math.max(endMs - startMs, 1); |
| const perWord = totalDuration / words.length; |
|
|
| words.forEach((word, index) => { |
| captions.push({ |
| id: uuidv4(), |
| text: word, |
| startMs: startMs + index * perWord, |
| endMs: startMs + (index + 1) * perWord, |
| }); |
| }); |
| } |
|
|
| return captions; |
| } |
|
|