diff --git a/web/src/lib/task-manager/workers/ffmpeg.ts b/web/src/lib/task-manager/workers/ffmpeg.ts index de586dc3..7568fb8a 100644 --- a/web/src/lib/task-manager/workers/ffmpeg.ts +++ b/web/src/lib/task-manager/workers/ffmpeg.ts @@ -1,17 +1,15 @@ import LibAVWrapper from "$lib/libav"; - import type { FileInfo } from "$lib/types/libav"; -const error = (code: string) => { - self.postMessage({ - cobaltFFmpegWorker: { - error: `error.${code}`, - } - }) -} - const ffmpeg = async (variant: string, files: File[], args: string[], output: FileInfo) => { - if (!(files && output && args)) return; + if (!(files && output && args)) { + self.postMessage({ + cobaltFFmpegWorker: { + error: "queue.ffmpeg.no_args", + } + }); + return; + } const ff = new LibAVWrapper((progress) => { self.postMessage({ @@ -29,23 +27,41 @@ const ffmpeg = async (variant: string, files: File[], args: string[], output: Fi ff.init({ variant }); + const error = (code: string) => { + self.postMessage({ + cobaltFFmpegWorker: { + error: code, + } + }); + ff.terminate(); + } + try { // probing just the first file in files array (usually audio) for duration progress const probeFile = files[0]; - if (!probeFile) return error("couldn't probe one of files"); + if (!probeFile) { + return error("queue.ffmpeg.probe_failed"); + } - const file_info = await ff.probe(probeFile).catch((e) => { - if (e?.message?.toLowerCase().includes("out of memory")) { - console.error("uh oh! out of memory"); + let file_info; + + try { + file_info = await ff.probe(probeFile); + } catch (e) { + console.error("error from ffmpeg worker @ file_info:"); + if (e instanceof Error && e?.message?.toLowerCase().includes("out of memory")) { console.error(e); - error("remux.out_of_resources"); - self.close(); + error("queue.ffmpeg.out_of_memory"); + return self.close(); + } else { + console.error(e); + return error("queue.ffmpeg.probe_failed"); } - }); + } if (!file_info?.format) { - return error("remux.corrupted"); + return error("queue.ffmpeg.no_input_format"); } self.postMessage({ @@ -58,27 +74,27 @@ const ffmpeg = async (variant: string, files: File[], args: string[], output: Fi for (const file of files) { if (!file.type) { - // TODO: better & more appropriate error code - return error("remux.corrupted"); + return error("queue.ffmpeg.no_input_type"); } } - const render = await ff - .render({ + let render; + + try { + render = await ff.render({ files, output, args, - }) - .catch((e) => { - console.error("uh-oh! render error"); - console.error(e); - // TODO: better error codes, there are more reasons for a crash - error("remux.out_of_resources"); }); + } catch (e) { + console.error("error from the ffmpeg worker @ render:"); + console.error(e); + // TODO: more granular error codes + return error("queue.ffmpeg.crashed"); + } if (!render) { - console.log("not a valid file"); - return error("incorrect input or output"); + return error("queue.ffmpeg.no_render"); } await ff.terminate(); @@ -89,8 +105,9 @@ const ffmpeg = async (variant: string, files: File[], args: string[], output: Fi } }); } catch (e) { - console.log(e); - return error("remux.crashed"); + console.error("error from the ffmpeg worker:") + console.error(e); + return error("queue.ffmpeg.crashed"); } }