You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.3 KiB
88 lines
2.3 KiB
import { RunOutput } from "@movie-web/providers"; |
|
import DOMPurify from "dompurify"; |
|
import { convert, detect, parse } from "subsrt-ts"; |
|
import { ContentCaption } from "subsrt-ts/dist/types/handler"; |
|
|
|
import { CaptionListItem } from "@/stores/player/slices/source"; |
|
|
|
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", |
|
}), |
|
); |
|
} |
|
|
|
export function convertProviderCaption( |
|
captions: RunOutput["stream"]["captions"], |
|
): CaptionListItem[] { |
|
return captions.map((v) => ({ |
|
id: v.id, |
|
language: v.language, |
|
url: v.url, |
|
needsProxy: v.hasCorsRestrictions, |
|
})); |
|
}
|
|
|