From bd812bb601aca2692ceb5bd817b5bef5b4260a13 Mon Sep 17 00:00:00 2001 From: JakeBreath Date: Thu, 17 Sep 2026 20:58:26 -0500 Subject: [PATCH] Write video output to a real OPFS file instead of assembling chunks The hand-rolled chunk assembly was verified correct in Node but still produced a broken MP4 in the browser, so stop relying on it: the muxer now streams into an Origin Private File System file (random access is exactly what MP4 needs), the worker returns the OPFS File directly, and the entry is deleted after a successful apply (stale ones are purged hourly). The chunk collector remains only as a fallback for browsers without OPFS. The result is validated before it reaches the UI: MP4s must contain a moov box and WebM files must start with the EBML magic, so a broken muxer output surfaces as an error instead of a 0x0 preview. --- .../src/features/optimize/OptimizeModal.tsx | 10 ++- frontend/src/features/optimize/opfs.ts | 69 +++++++++++++++++++ .../src/features/optimize/optimize.worker.ts | 1 + frontend/src/features/optimize/stream.ts | 53 +++++++++++--- frontend/src/features/optimize/types.ts | 3 + .../src/features/optimize/useOptimizer.ts | 1 + frontend/src/features/optimize/video.ts | 60 ++++++++++++++-- 7 files changed, 181 insertions(+), 16 deletions(-) create mode 100644 frontend/src/features/optimize/opfs.ts diff --git a/frontend/src/features/optimize/OptimizeModal.tsx b/frontend/src/features/optimize/OptimizeModal.tsx index 86e1088..ec70786 100644 --- a/frontend/src/features/optimize/OptimizeModal.tsx +++ b/frontend/src/features/optimize/OptimizeModal.tsx @@ -9,6 +9,7 @@ import { formatBytes } from "@/lib/format"; import type { MediaItem } from "@/lib/types"; import { detectVideoCodecs } from "./detect"; +import { deleteStoredFile } from "./opfs"; import { DEFAULT_OPTIONS, kindForExtension, @@ -220,6 +221,7 @@ export function OptimizeModal({ } }, onSuccess: () => { + if (result?.storageKey) void deleteStoredFile(result.storageKey); setApplied(true); setApplyError(null); void queryClient.invalidateQueries({ queryKey: ["file", item.j_id] }); @@ -250,6 +252,7 @@ export function OptimizeModal({ function process() { setApplied(false); setApplyError(null); + if (result?.storageKey) void deleteStoredFile(result.storageKey); setResultInfo(null); run({ url: item.raw_url, @@ -259,6 +262,11 @@ export function OptimizeModal({ }); } + function resetRun() { + if (result?.storageKey) void deleteStoredFile(result.storageKey); + reset(); + } + return (