From 1ef8391639d243ba15085f097f65ac51e8947854 Mon Sep 17 00:00:00 2001 From: jj Date: Sat, 3 May 2025 13:23:05 +0000 Subject: [PATCH] web: simplify CobaltFileReference type --- .../components/queue/ProcessingQueueItem.svelte | 4 ++-- web/src/lib/libav.ts | 15 ++++++++------- web/src/lib/state/task-manager/queue.ts | 11 +++++------ web/src/lib/task-manager/queue.ts | 5 +---- web/src/lib/task-manager/run-worker.ts | 3 +-- web/src/lib/task-manager/runners/ffmpeg.ts | 3 +-- web/src/lib/task-manager/workers/fetch.ts | 9 ++++----- web/src/lib/task-manager/workers/ffmpeg.ts | 5 ++--- web/src/lib/types/libav.ts | 4 +--- web/src/lib/types/queue.ts | 5 ++--- web/src/lib/types/storage.ts | 4 ---- web/src/lib/types/workers.ts | 3 +-- 12 files changed, 28 insertions(+), 43 deletions(-) delete mode 100644 web/src/lib/types/storage.ts diff --git a/web/src/components/queue/ProcessingQueueItem.svelte b/web/src/components/queue/ProcessingQueueItem.svelte index ba97f49a..85d67fa5 100644 --- a/web/src/components/queue/ProcessingQueueItem.svelte +++ b/web/src/components/queue/ProcessingQueueItem.svelte @@ -90,7 +90,7 @@ return $t("queue.state.starting"); case "done": - return formatFileSize(info.resultFile?.file?.size); + return formatFileSize(info.resultFile?.size); case "error": return !retrying ? info.errorCode : $t("queue.state.retrying"); @@ -162,7 +162,7 @@ {#if info.state === "done" && info.resultFile} diff --git a/web/src/lib/libav.ts b/web/src/lib/libav.ts index 111e1e0b..0d09c38f 100644 --- a/web/src/lib/libav.ts +++ b/web/src/lib/libav.ts @@ -86,7 +86,7 @@ export default class LibAVWrapper { try { for (let i = 0; i < files.length; i++) { - const file = files[i].file; + const file = files[i]; await libav.mkreadaheadfile(`input${i}`, file); ffInputs.push('-i', `input${i}`); @@ -95,7 +95,7 @@ export default class LibAVWrapper { await libav.mkwriterdev(outputName); await libav.mkwriterdev('progress.txt'); - const totalInputSize = files.reduce((a, b) => a + b.file.size, 0); + const totalInputSize = files.reduce((a, b) => a + b.size, 0); const storage = await Storage.init(totalInputSize); libav.onwrite = async (name, pos, data) => { @@ -120,14 +120,15 @@ export default class LibAVWrapper { outputName ]); - const file = await storage.res(); + const file = new File( + [ await storage.res() ], + outputName, + { type: output.type } + ); if (file.size === 0) return; - return { - file, - type: output.type, - } + return file; } finally { try { await libav.unlink(outputName); diff --git a/web/src/lib/state/task-manager/queue.ts b/web/src/lib/state/task-manager/queue.ts index 2aa8aabd..81015b00 100644 --- a/web/src/lib/state/task-manager/queue.ts +++ b/web/src/lib/state/task-manager/queue.ts @@ -4,17 +4,16 @@ import { schedule } from "$lib/task-manager/scheduler"; import { clearFileStorage, removeFromFileStorage } from "$lib/storage/opfs"; import { clearCurrentTasks, removeWorkerFromQueue } from "$lib/state/task-manager/current-tasks"; -import type { CobaltFileReference } from "$lib/types/storage"; import type { CobaltQueue, CobaltQueueItem, CobaltQueueItemRunning } from "$lib/types/queue"; const clearPipelineCache = (queueItem: CobaltQueueItem) => { if (queueItem.state === "running") { - let item: CobaltFileReference | undefined; + let item: File | undefined; while ((item = queueItem.pipelineResults.pop())) { - removeFromFileStorage(item.file.name); + removeFromFileStorage(item.name); } } else if (queueItem.state === "done") { - removeFromFileStorage(queueItem.resultFile.file.name); + removeFromFileStorage(queueItem.resultFile.name); } return queueItem; @@ -54,7 +53,7 @@ export function itemError(id: string, workerId: string, error: string) { schedule(); } -export function itemDone(id: string, file: CobaltFileReference) { +export function itemDone(id: string, file: File) { update(queueData => { if (queueData[id]) { queueData[id] = clearPipelineCache(queueData[id]); @@ -71,7 +70,7 @@ export function itemDone(id: string, file: CobaltFileReference) { schedule(); } -export function pipelineTaskDone(id: string, workerId: string, file: CobaltFileReference) { +export function pipelineTaskDone(id: string, workerId: string, file: File) { update(queueData => { const item = queueData[id]; diff --git a/web/src/lib/task-manager/queue.ts b/web/src/lib/task-manager/queue.ts index b6b3e4c6..215ada6d 100644 --- a/web/src/lib/task-manager/queue.ts +++ b/web/src/lib/task-manager/queue.ts @@ -24,10 +24,7 @@ export const createRemuxPipeline = (file: File) => { workerId: crypto.randomUUID(), parentId, workerArgs: { - files: [{ - file, - type: file.type, - }], + files: [file], ffargs: [ "-c", "copy", "-map", "0" diff --git a/web/src/lib/task-manager/run-worker.ts b/web/src/lib/task-manager/run-worker.ts index 0c25d8ec..69c547a6 100644 --- a/web/src/lib/task-manager/run-worker.ts +++ b/web/src/lib/task-manager/run-worker.ts @@ -5,7 +5,6 @@ import { runFFmpegWorker } from "$lib/task-manager/runners/ffmpeg"; import { runFetchWorker } from "$lib/task-manager/runners/fetch"; import type { CobaltPipelineItem } from "$lib/types/workers"; -import type { CobaltFileReference } from "$lib/types/storage"; export const killWorker = (worker: Worker, unsubscribe: () => void, interval?: NodeJS.Timeout) => { unsubscribe(); @@ -14,7 +13,7 @@ export const killWorker = (worker: Worker, unsubscribe: () => void, interval?: N } export const startWorker = async ({ worker, workerId, parentId, workerArgs }: CobaltPipelineItem) => { - let files: CobaltFileReference[] = []; + let files: File[] = []; switch (worker) { case "remux": diff --git a/web/src/lib/task-manager/runners/ffmpeg.ts b/web/src/lib/task-manager/runners/ffmpeg.ts index 6ade990c..657793f8 100644 --- a/web/src/lib/task-manager/runners/ffmpeg.ts +++ b/web/src/lib/task-manager/runners/ffmpeg.ts @@ -6,14 +6,13 @@ import { pipelineTaskDone, itemError, queue } from "$lib/state/task-manager/queu import type { FileInfo } from "$lib/types/libav"; import type { CobaltQueue } from "$lib/types/queue"; -import type { CobaltFileReference } from "$lib/types/storage"; let startAttempts = 0; export const runFFmpegWorker = async ( workerId: string, parentId: string, - files: CobaltFileReference[], + files: File[], args: string[], output: FileInfo, variant: 'remux' | 'encode', diff --git a/web/src/lib/task-manager/workers/fetch.ts b/web/src/lib/task-manager/workers/fetch.ts index 253286c8..5b84ee1e 100644 --- a/web/src/lib/task-manager/workers/fetch.ts +++ b/web/src/lib/task-manager/workers/fetch.ts @@ -76,7 +76,9 @@ const fetchFile = async (url: string) => { return error("tunnel is broken"); } - const file = await storage.res(); + const file = new File( + [ await storage.res() ], '', { type: contentType } + ); if (contentLength && Number(contentLength) !== file.size) { return error("file was not downloaded fully"); @@ -84,10 +86,7 @@ const fetchFile = async (url: string) => { self.postMessage({ cobaltFetchWorker: { - result: { - file, - type: contentType, - } + result: file } }); } catch (e) { diff --git a/web/src/lib/task-manager/workers/ffmpeg.ts b/web/src/lib/task-manager/workers/ffmpeg.ts index 33099ba7..de586dc3 100644 --- a/web/src/lib/task-manager/workers/ffmpeg.ts +++ b/web/src/lib/task-manager/workers/ffmpeg.ts @@ -1,7 +1,6 @@ import LibAVWrapper from "$lib/libav"; import type { FileInfo } from "$lib/types/libav"; -import type { CobaltFileReference } from "$lib/types/storage"; const error = (code: string) => { self.postMessage({ @@ -11,7 +10,7 @@ const error = (code: string) => { }) } -const ffmpeg = async (variant: string, files: CobaltFileReference[], args: string[], output: FileInfo) => { +const ffmpeg = async (variant: string, files: File[], args: string[], output: FileInfo) => { if (!(files && output && args)) return; const ff = new LibAVWrapper((progress) => { @@ -32,7 +31,7 @@ const ffmpeg = async (variant: string, files: CobaltFileReference[], args: strin try { // probing just the first file in files array (usually audio) for duration progress - const probeFile = files[0]?.file; + const probeFile = files[0]; if (!probeFile) return error("couldn't probe one of files"); const file_info = await ff.probe(probeFile).catch((e) => { diff --git a/web/src/lib/types/libav.ts b/web/src/lib/types/libav.ts index 673637f2..ef7ac9a6 100644 --- a/web/src/lib/types/libav.ts +++ b/web/src/lib/types/libav.ts @@ -1,12 +1,10 @@ -import type { CobaltFileReference } from "$lib/types/storage"; - export type FileInfo = { type?: string, format?: string, } export type RenderParams = { - files: CobaltFileReference[], + files: File[], output: FileInfo, args: string[], } diff --git a/web/src/lib/types/queue.ts b/web/src/lib/types/queue.ts index 312f3ec7..cb249e99 100644 --- a/web/src/lib/types/queue.ts +++ b/web/src/lib/types/queue.ts @@ -1,5 +1,4 @@ import type { CobaltSaveRequestBody } from "$lib/types/api"; -import type { CobaltFileReference } from "$lib/types/storage"; import type { CobaltPipelineItem, CobaltPipelineResultFileType } from "$lib/types/workers"; export type CobaltQueueItemState = "waiting" | "running" | "done" | "error"; @@ -24,12 +23,12 @@ export type CobaltQueueItemRunning = CobaltQueueBaseItem & { state: "running", runningWorker: string, completedWorkers: Set, - pipelineResults: CobaltFileReference[], + pipelineResults: File[], }; export type CobaltQueueItemDone = CobaltQueueBaseItem & { state: "done", - resultFile: CobaltFileReference, + resultFile: File, }; export type CobaltQueueItemError = CobaltQueueBaseItem & { diff --git a/web/src/lib/types/storage.ts b/web/src/lib/types/storage.ts deleted file mode 100644 index a9bb13a7..00000000 --- a/web/src/lib/types/storage.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type CobaltFileReference = { - file: File, - type: string, -} diff --git a/web/src/lib/types/workers.ts b/web/src/lib/types/workers.ts index 8a2cbb5d..c6647f2f 100644 --- a/web/src/lib/types/workers.ts +++ b/web/src/lib/types/workers.ts @@ -1,5 +1,4 @@ import type { FileInfo } from "$lib/types/libav"; -import type { CobaltFileReference } from "$lib/types/storage"; export const resultFileTypes = ["video", "audio", "image"] as const; @@ -12,7 +11,7 @@ export type CobaltWorkerProgress = { } type CobaltFFmpegWorkerArgs = { - files: CobaltFileReference[], + files: File[], ffargs: string[], output: FileInfo, }