From f26cd7e615782e0acde5f016c08bba23e34ddc32 Mon Sep 17 00:00:00 2001 From: Maya Date: Wed, 11 Mar 2026 16:33:40 +0300 Subject: [PATCH] fix: better mediabunny init status --- messages/en.json | 3 +- src/lib/converters/ffmpeg.svelte.ts | 2 +- src/lib/converters/mediabunny.svelte.ts | 50 +++++++++++++++++++++---- 3 files changed, 45 insertions(+), 10 deletions(-) diff --git a/messages/en.json b/messages/en.json index 791a50b..76cbf46 100644 --- a/messages/en.json +++ b/messages/en.json @@ -341,7 +341,8 @@ "magick": "Error in Magick worker, image conversion may not work as expected.", "ffmpeg": "Error loading FFmpeg, some features may not work as expected.", "pandoc": "Error loading Pandoc worker, document conversion may not work as expected.", - "mediabunny": "Error loading Mediabunny worker, video conversion may not work as expected.", + "mediabunny_init": "Error loading Mediabunny, video conversion may not work as expected.", + "mediabunny_webcodecs": "Some WebCodecs APIs are not supported in this browser, video conversion may not work as expected.", "no_audio": "No audio stream found.", "invalid_rate": "Invalid sample rate specified: {rate}Hz", "file_too_large": "This file exceeds the {limit}GB browser / device limit. Try Firefox or Safari to convert this large file, which typically have higher limits." diff --git a/src/lib/converters/ffmpeg.svelte.ts b/src/lib/converters/ffmpeg.svelte.ts index ca9c260..e0a9829 100644 --- a/src/lib/converters/ffmpeg.svelte.ts +++ b/src/lib/converters/ffmpeg.svelte.ts @@ -107,7 +107,7 @@ export class FFmpegConverter extends Converter { this.status = "ready"; })(); } catch (err) { - error(["converters", this.name], `Error loading ffmpeg: ${err}`); + this.error(`Error loading ffmpeg: ${err}`); this.status = "error"; ToastManager.add({ type: "error", diff --git a/src/lib/converters/mediabunny.svelte.ts b/src/lib/converters/mediabunny.svelte.ts index b6744a9..0400104 100644 --- a/src/lib/converters/mediabunny.svelte.ts +++ b/src/lib/converters/mediabunny.svelte.ts @@ -225,14 +225,50 @@ export class MediabunnyConverter extends Converter { // additional mediabunny coders // currently the official ones -- maybe add our own in the future this.initializeCodecs(); + + // checks if mediabunny and webcodecs are initialized and supported + this.checkStatus(); + } - // TODO: don't know how to check if mediabunny is ready/actually supported rn, maybe test smol conversion or run some other method? shrug - if (typeof Conversion === "undefined") { - this.status = "not-ready"; - this.error("Mediabunny failed to load"); + private checkStatus() { + const mediabunnyInitialized = canEncodeAudio("pcm-s16"); + + const webCodecsVideoDecode = "VideoDecoder" in globalThis; + const webCodecsVideoEncode = "VideoEncoder" in globalThis; + const webCodecsAudioDecode = "AudioDecoder" in globalThis; + const webCodecsAudioEncode = "AudioEncoder" in globalThis; + + this.log( + `Supported WebCodecs APIs: VideoDecoder: ${webCodecsVideoDecode}, VideoEncoder: ${webCodecsVideoEncode}, AudioDecoder: ${webCodecsAudioDecode}, AudioEncoder: ${webCodecsAudioEncode}`, + ); + + if (!mediabunnyInitialized) { + this.error("Mediabunny failed to initialize"); + ToastManager.add({ + type: "error", + message: m["workers.errors.mediabunny"](), + durations: { + stay: 10000, + }, + }); + this.status = "error"; + } else if ( + !webCodecsVideoDecode || + !webCodecsVideoEncode || + !webCodecsAudioDecode || + !webCodecsAudioEncode + ) { + this.error("WebCodecs API support incomplete"); + ToastManager.add({ + type: "error", + message: m["workers.errors.mediabunny_webcodecs"](), + durations: { + stay: 10000, + }, + }); + this.status = "partially-ready"; } else { this.status = "ready"; - this.log("Mediabunny loaded successfully"); } } @@ -527,9 +563,7 @@ export class MediabunnyConverter extends Converter { public async cancel(input: VertFile): Promise { const conversion = this.activeConversions.get(input.id); if (!conversion) { - this.error( - `no active conversion found for file ${input.name}`, - ); + this.error(`no active conversion found for file ${input.name}`); return; }