movie-web/src/components/player/utils/captions.ts

75 lines
1.9 KiB
TypeScript

import DOMPurify from "dompurify";
import { convert, detect, parse } from "subsrt-ts";
import { ContentCaption } from "subsrt-ts/dist/types/handler";
export type CaptionCueType = ContentCaption;
export const sanitize = DOMPurify.sanitize;
export function captionIsVisible(
start: number,
end: number,
delay: number,
currentTime: number
) {
const delayedStart = start / 1000 + delay;
const delayedEnd = end / 1000 + delay;
return (
Math.max(0, delayedStart) <= currentTime &&
Math.max(0, delayedEnd) >= currentTime
);
}
export function makeQueId(index: number, start: number, end: number): string {
return `${index}-${start}-${end}`;
}
export function convertSubtitlesToVtt(text: string): string {
const textTrimmed = text.trim();
if (textTrimmed === "") {
throw new Error("Given text is empty");
}
const vtt = convert(textTrimmed, "vtt");
if (detect(vtt) === "") {
throw new Error("Invalid subtitle format");
}
return vtt;
}
export function convertSubtitlesToSrt(text: string): string {
const textTrimmed = text.trim();
if (textTrimmed === "") {
throw new Error("Given text is empty");
}
const srt = convert(textTrimmed, "srt");
if (detect(srt) === "") {
throw new Error("Invalid subtitle format");
}
return srt;
}
export function parseSubtitles(
text: string,
_language?: string
): CaptionCueType[] {
const vtt = convertSubtitlesToVtt(text);
return parse(vtt).filter((cue) => cue.type === "caption") as CaptionCueType[];
}
function stringToBase64(input: string): string {
return btoa(String.fromCodePoint(...new TextEncoder().encode(input)));
}
export function convertSubtitlesToSrtDataurl(text: string): string {
return `data:application/x-subrip;base64,${stringToBase64(
convertSubtitlesToSrt(text)
)}`;
}
export function convertSubtitlesToObjectUrl(text: string): string {
return URL.createObjectURL(
new Blob([convertSubtitlesToVtt(text)], {
type: "text/vtt",
})
);
}