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.
52 lines
1.4 KiB
52 lines
1.4 KiB
import { mwFetch, proxiedFetch } from "@/backend/helpers/fetch"; |
|
import { MWCaption, MWCaptionType } from "@/backend/helpers/streams"; |
|
import toWebVTT from "srt-webvtt"; |
|
import DOMPurify from "dompurify"; |
|
|
|
export const sanitize = DOMPurify.sanitize; |
|
export const CUSTOM_CAPTION_ID = "customCaption"; |
|
export async function getCaptionUrl(caption: MWCaption): Promise<string> { |
|
if (caption.type === MWCaptionType.SRT) { |
|
let captionBlob: Blob; |
|
|
|
if (caption.needsProxy) { |
|
captionBlob = await proxiedFetch<Blob>(caption.url, { |
|
responseType: "blob" as any, |
|
}); |
|
} else { |
|
captionBlob = await mwFetch<Blob>(caption.url, { |
|
responseType: "blob" as any, |
|
}); |
|
} |
|
|
|
return toWebVTT(captionBlob); |
|
} |
|
|
|
if (caption.type === MWCaptionType.VTT) { |
|
if (caption.needsProxy) { |
|
const blob = await proxiedFetch<Blob>(caption.url, { |
|
responseType: "blob" as any, |
|
}); |
|
return URL.createObjectURL(blob); |
|
} |
|
|
|
return caption.url; |
|
} |
|
|
|
throw new Error("invalid type"); |
|
} |
|
|
|
export async function convertCustomCaptionFileToWebVTT(file: File) { |
|
const header = await file.slice(0, 6).text(); |
|
const isWebVTT = header === "WEBVTT"; |
|
if (!isWebVTT) { |
|
return toWebVTT(file); |
|
} |
|
return URL.createObjectURL(file); |
|
} |
|
|
|
export function revokeCaptionBlob(url: string | undefined) { |
|
if (url && url.startsWith("blob:")) { |
|
URL.revokeObjectURL(url); |
|
} |
|
}
|
|
|