diff --git a/bun.lock b/bun.lock index fbdab17..75b8e91 100644 --- a/bun.lock +++ b/bun.lock @@ -12,6 +12,8 @@ "@fontsource/lexend": "^5.2.11", "@fontsource/radio-canada-big": "^5.2.7", "@imagemagick/magick-wasm": "^0.0.37", + "@mediabunny/ac3": "^1.35.1", + "@mediabunny/mp3-encoder": "^1.35.1", "@stripe/stripe-js": "^8.5.2", "byte-data": "^19.0.1", "client-zip": "^2.5.0", @@ -176,6 +178,10 @@ "@lix-js/server-protocol-schema": ["@lix-js/server-protocol-schema@0.1.1", "", {}, "sha512-jBeALB6prAbtr5q4vTuxnRZZv1M2rKe8iNqRQhFJ4Tv7150unEa0vKyz0hs8Gl3fUGsWaNJBh3J8++fpbrpRBQ=="], + "@mediabunny/ac3": ["@mediabunny/ac3@1.35.1", "", { "peerDependencies": { "mediabunny": "^1.0.0" } }, "sha512-gLx3mFfs58/cdz2/f5Fp+6ZOrX5Jli3AZMXw/5EJcgm2VpnC/2oxtJyP1x/00PIS4UCE770slwIdz7U+2CQ31g=="], + + "@mediabunny/mp3-encoder": ["@mediabunny/mp3-encoder@1.35.1", "", { "peerDependencies": { "mediabunny": "^1.0.0" } }, "sha512-iY6FcPs7GbHMs/ASPmdzwojKcBN4AfMa+zFh4KNZNaLToyR7aEZILj9FsPVJA11bshaoo80dTaBcn69i33JHVA=="], + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], diff --git a/package.json b/package.json index 46e573e..3999768 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,8 @@ "@fontsource/lexend": "^5.2.11", "@fontsource/radio-canada-big": "^5.2.7", "@imagemagick/magick-wasm": "^0.0.37", + "@mediabunny/ac3": "^1.35.1", + "@mediabunny/mp3-encoder": "^1.35.1", "@stripe/stripe-js": "^8.5.2", "byte-data": "^19.0.1", "client-zip": "^2.5.0", diff --git a/src/lib/converters/mediabunny.svelte.ts b/src/lib/converters/mediabunny.svelte.ts index a6fffb0..fb2680d 100644 --- a/src/lib/converters/mediabunny.svelte.ts +++ b/src/lib/converters/mediabunny.svelte.ts @@ -2,6 +2,7 @@ import { VertFile } from "$lib/types"; import { BlobSource, BufferTarget, + canEncodeAudio, Conversion, Input, MATROSKA, @@ -16,6 +17,8 @@ import { WEBM, WebMOutputFormat, } from "mediabunny"; +import { registerMp3Encoder } from "@mediabunny/mp3-encoder"; +import { registerAc3Decoder, registerAc3Encoder } from "@mediabunny/ac3"; import { Converter, FormatInfo, type WorkerStatus } from "./converter.svelte"; import { ToastManager } from "$lib/util/toast.svelte"; import { error, log } from "$lib/util/logger"; @@ -43,6 +46,19 @@ export class MediabunnyConverter extends Converter { constructor() { super(); + + // additional mediabunny coders + // currently both official ones -- maybe add our own in the future + this.initializeCodecs(); + } + + private async initializeCodecs(): Promise { + if (!(await canEncodeAudio("mp3"))) { + // Only register the custom encoder if there's no native support + registerMp3Encoder(); + } + registerAc3Decoder(); + registerAc3Encoder(); } public async convert(file: VertFile, to: string): Promise { @@ -114,7 +130,7 @@ export class MediabunnyConverter extends Converter { case ".mov": return new MovOutputFormat(); case ".ts": - return new MpegTsOutputFormat(); + return new MpegTsOutputFormat(); // FIXME: audio tracks discarded - prob needs another audio codec default: throw new Error(`Unsupported format: ${ext}`); }