From 1ad7c778e58cfc728a05402ae8426f4ac027ba9a Mon Sep 17 00:00:00 2001 From: wukko Date: Sat, 29 Mar 2025 17:25:59 +0600 Subject: [PATCH] web: use metadata when processing media locally --- web/src/lib/queen-bee/queue.ts | 4 +++- web/src/lib/types/api.ts | 22 ++++++++++++++-------- web/src/lib/util.ts | 14 ++++++++++++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/web/src/lib/queen-bee/queue.ts b/web/src/lib/queen-bee/queue.ts index 9e0af950..9f1e9db1 100644 --- a/web/src/lib/queen-bee/queue.ts +++ b/web/src/lib/queen-bee/queue.ts @@ -1,5 +1,6 @@ import { addItem } from "$lib/state/queen-bee/queue"; import { openQueuePopover } from "$lib/state/queue-visibility"; +import { ffmpegMetadataArgs } from "$lib/util"; import type { CobaltPipelineItem } from "$lib/types/workers"; import type { CobaltLocalProcessingResponse, CobaltSaveRequestBody } from "$lib/types/api"; @@ -80,7 +81,8 @@ export const createSavePipeline = (info: CobaltLocalProcessingResponse, request: workerArgs: { ffargs: [ "-c:v", "copy", - "-c:a", "copy" + "-c:a", "copy", + ...(info.output.metadata ? ffmpegMetadataArgs(info.output.metadata) : []) ], output: { type: info.output.type, diff --git a/web/src/lib/types/api.ts b/web/src/lib/types/api.ts index 22e4a672..dbe9fa96 100644 --- a/web/src/lib/types/api.ts +++ b/web/src/lib/types/api.ts @@ -43,6 +43,19 @@ type CobaltTunnelResponse = { status: CobaltResponseType.Tunnel, } & CobaltPartialURLResponse; +export const CobaltFileMetadataKeys = [ + 'album', + 'copyright', + 'title', + 'artist', + 'track', + 'date' +]; + +export type CobaltFileMetadata = Record< + typeof CobaltFileMetadataKeys[number], string | undefined +>; + export type CobaltLocalProcessingResponse = { status: CobaltResponseType.LocalProcessing, @@ -54,14 +67,7 @@ export type CobaltLocalProcessingResponse = { output: { type: string, // mimetype filename: string, - metadata?: { - album?: string, - copyright?: string, - title?: string, - artist?: string, - track?: string, - date?: string - }, + metadata?: CobaltFileMetadata, }, audio?: { diff --git a/web/src/lib/util.ts b/web/src/lib/util.ts index 772f35e2..609f651e 100644 --- a/web/src/lib/util.ts +++ b/web/src/lib/util.ts @@ -1,3 +1,5 @@ +import { CobaltFileMetadataKeys, type CobaltFileMetadata } from "$lib/types/api"; + export const formatFileSize = (size: number | undefined) => { size ||= 0; @@ -12,3 +14,15 @@ export const formatFileSize = (size: number | undefined) => { const unit = units[units.length - 1] + "B"; return `${roundedSize} ${unit}`; } + +export const ffmpegMetadataArgs = (metadata: CobaltFileMetadata) => + Object.entries(metadata).flatMap(([name, value]) => { + if (CobaltFileMetadataKeys.includes(name) && typeof value === "string") { + return [ + '-metadata', + // eslint-disable-next-line no-control-regex + `${name}=${value.replace(/[\u0000-\u0009]/g, "")}` + ] + } + return []; + });