From a067ac8e5d89f1a2c0ba7b92ea4251ddc6566af4 Mon Sep 17 00:00:00 2001 From: Snazzah Date: Thu, 25 Dec 2025 22:02:40 +0000 Subject: [PATCH 1/6] feat(ferret): implement in-browser processing --- apps/ferret/package.json | 7 + apps/ferret/src/components/Checkbox.svelte | 8 +- .../ferret/src/components/FormatButton.svelte | 9 +- apps/ferret/src/components/Modal.svelte | 10 +- apps/ferret/src/lib/device.ts | 10 + apps/ferret/src/lib/minizel/bitstream.ts | 78 +++ apps/ferret/src/lib/minizel/index.ts | 7 + .../src/lib/minizel/libav-flac-encoder.ts | 154 +++++ .../ferret/src/lib/minizel/mixed-processor.ts | 485 ++++++++++++++ apps/ferret/src/lib/minizel/ogg.ts | 83 +++ .../src/lib/minizel/oggParser.worker.ts | 152 +++++ apps/ferret/src/lib/minizel/opus.ts | 52 ++ apps/ferret/src/lib/minizel/processor.ts | 626 ++++++++++++++++++ apps/ferret/src/lib/minizel/resilientFetch.ts | 163 +++++ apps/ferret/src/lib/minizel/util.ts | 97 +++ apps/ferret/src/lib/recording/sections.ts | 26 +- apps/ferret/src/lib/server/util.ts | 2 + apps/ferret/src/lib/types.ts | 1 + .../[id=recording]/raw.dat/+server.ts | 145 ++-- .../rec/[id=recording]/DownloadSection.svelte | 57 +- .../rec/[id=recording]/MinizelModal.svelte | 577 ++++++++++++++++ apps/ferret/vite.config.ts | 55 +- locale | 2 +- nginx.conf | 16 + pnpm-lock.yaml | 109 ++- 25 files changed, 2864 insertions(+), 67 deletions(-) create mode 100644 apps/ferret/src/lib/minizel/bitstream.ts create mode 100644 apps/ferret/src/lib/minizel/index.ts create mode 100644 apps/ferret/src/lib/minizel/libav-flac-encoder.ts create mode 100644 apps/ferret/src/lib/minizel/mixed-processor.ts create mode 100644 apps/ferret/src/lib/minizel/ogg.ts create mode 100644 apps/ferret/src/lib/minizel/oggParser.worker.ts create mode 100644 apps/ferret/src/lib/minizel/opus.ts create mode 100644 apps/ferret/src/lib/minizel/processor.ts create mode 100644 apps/ferret/src/lib/minizel/resilientFetch.ts create mode 100644 apps/ferret/src/lib/minizel/util.ts create mode 100644 apps/ferret/src/routes/rec/[id=recording]/MinizelModal.svelte diff --git a/apps/ferret/package.json b/apps/ferret/package.json index 237f85fe..c61c9cf9 100644 --- a/apps/ferret/package.json +++ b/apps/ferret/package.json @@ -19,12 +19,17 @@ "dependencies": { "@craig/db": "workspace:*", "@craig/logger": "workspace:*", + "@henrygd/queue": "^1.0.7", + "@libav.js/variant-webcodecs": "^6.8.8", + "@wasm-audio-decoders/flac": "^0.2.8", "destr": "^2.0.5", "emittery": "^1.2.0", "eventemitter3": "^5.0.1", "ioredis": "^5.8.0", "just-clone": "^6.2.0", + "mediabunny": "^1.21.1", "nanoid": "^5.1.6", + "opus-decoder": "^0.7.10", "zod": "^4.1.11" }, "devDependencies": { @@ -44,12 +49,14 @@ "@sveltejs/enhanced-img": "^0.8.2", "@sveltejs/kit": "^2.21.1", "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@types/wicg-file-system-access": "^2023.10.6", "autoprefixer": "^10.4.21", "clsx": "^2.1.1", "cookie-es": "^2.0.0", "discord-api-types": "^0.38.26", "fflate": "^0.8.2", "just-range": "^4.2.0", + "mime": "^4.1.0", "postcss": "^8.5.6", "postcss-load-config": "^6.0.1", "sass": "^1.93.2", diff --git a/apps/ferret/src/components/Checkbox.svelte b/apps/ferret/src/components/Checkbox.svelte index 70f16ccc..69dfb03f 100644 --- a/apps/ferret/src/components/Checkbox.svelte +++ b/apps/ferret/src/components/Checkbox.svelte @@ -1,14 +1,16 @@ - +