cobalt/web/src/lib/workers/remux.ts
wukko 44a99bdb3a
web/queue: add remuxing progress & general improvements
and a bunch of other stuff:
- size and percentage in queue
- indeterminate progress bar
- if libav wasm freezes, the worker kill itself
- cleaner states
- cleaner props
2025-01-25 01:25:53 +06:00

102 lines
2.4 KiB
TypeScript

import mime from "mime";
import LibAVWrapper from "$lib/libav";
const error = (code: string) => {
self.postMessage({
cobaltRemuxWorker: {
error: `error.${code}`,
}
})
}
const ff = new LibAVWrapper((progress) => {
self.postMessage({
cobaltRemuxWorker: {
progress: {
durationProcessed: progress.out_time_sec,
speed: progress.speed,
size: progress.total_size,
currentFrame: progress.frame,
fps: progress.fps,
}
}
})
});
ff.init();
const remux = async (file: File) => {
if (!file) return;
await ff.init();
try {
const file_info = await ff.probe(file).catch((e) => {
if (e?.message?.toLowerCase().includes("out of memory")) {
console.error("uh oh! out of memory");
console.error(e);
error("remux.out_of_resources");
self.close();
}
});
if (!file_info?.format) {
error("remux.corrupted");
return;
}
self.postMessage({
cobaltRemuxWorker: {
progress: {
duration: Number(file_info.format.duration),
}
}
});
if (file instanceof File && !file.type) {
file = new File([file], file.name, {
type: mime.getType(file.name) ?? undefined,
});
}
const render = await ff
.render({
blob: file,
args: ["-c", "copy", "-map", "0"],
})
.catch((e) => {
console.error("uh-oh! render error");
console.error(e);
error("remux.out_of_resources");
});
if (!render) {
return console.log("not a valid file");
}
const filenameParts = file.name.split(".");
const filenameExt = filenameParts.pop();
const filename = `${filenameParts.join(".")} (remux).${filenameExt}`;
self.postMessage({
cobaltRemuxWorker: {
render,
filename
}
});
} catch (e) {
console.log(e);
}
}
self.onmessage = async (event: MessageEvent) => {
console.log(event.data);
if (event.data.file) {
await remux(event.data.file);
}
}