From 5f4e8023b156c146eb3fb7744e93891805779ca7 Mon Sep 17 00:00:00 2001 From: Steven Vandevelde Date: Sat, 7 Jun 2025 00:07:35 +0200 Subject: [PATCH] feat: initial work for artwork fetcher + applet loading fixes --- deno.lock | 1 + src/pages/configurator/input/_applet.astro | 42 +++++----- src/pages/configurator/input/_manifest.json | 1 + src/pages/configurator/output/_applet.astro | 7 +- src/pages/index.astro | 2 +- .../orchestrator/input-cache/_applet.astro | 52 ++++++------- .../orchestrator/single-queue/_applet.astro | 14 +++- src/pages/processor/artwork/_applet.astro | 76 +++++++++++++++++++ src/pages/processor/artwork/_manifest.json | 38 ++++++++++ .../{metadata-fetcher => artwork}/index.astro | 0 src/pages/processor/artwork/types.d.ts | 14 ++++ .../_applet.astro | 22 +++--- .../_manifest.json | 8 +- src/pages/processor/metadata/index.astro | 9 +++ src/pages/processor/metadata/types.d.ts | 5 ++ src/scripts/applets/common.ts | 68 ++++++++++++----- src/scripts/themes/desktop/index.ts | 73 +++++++++++++++++- src/scripts/themes/webamp/index.ts | 2 +- 18 files changed, 338 insertions(+), 96 deletions(-) create mode 100644 src/pages/processor/artwork/_applet.astro create mode 100644 src/pages/processor/artwork/_manifest.json rename src/pages/processor/{metadata-fetcher => artwork}/index.astro (100%) create mode 100644 src/pages/processor/artwork/types.d.ts rename src/pages/processor/{metadata-fetcher => metadata}/_applet.astro (86%) rename src/pages/processor/{metadata-fetcher => metadata}/_manifest.json (82%) create mode 100644 src/pages/processor/metadata/index.astro create mode 100644 src/pages/processor/metadata/types.d.ts diff --git a/deno.lock b/deno.lock index 894e6a1..699ced6 100644 --- a/deno.lock +++ b/deno.lock @@ -37,6 +37,7 @@ "npm:idb-keyval@^6.2.1", "npm:music-metadata@^11.2.3", "npm:native-file-system-adapter@^3.0.1", + "npm:netlify@^22.1.0", "npm:purgecss@^7.0.2", "npm:query-string@^9.1.2", "npm:sass@^1.87.0", diff --git a/src/pages/configurator/input/_applet.astro b/src/pages/configurator/input/_applet.astro index 1397ebb..c372d52 100644 --- a/src/pages/configurator/input/_applet.astro +++ b/src/pages/configurator/input/_applet.astro @@ -36,48 +36,46 @@ //////////////////////////////////////////// // SETUP //////////////////////////////////////////// - const context = register<{ ready: boolean }>(); - - // Initial state - context.data = { - ready: false, - }; + const context = register(); // Applet connections const input = { - nativeFs: await applet("../../input/native-fs"), - s3: await applet("../../input/s3"), + nativeFs: applet("../../input/native-fs"), + s3: applet("../../input/s3"), }; //////////////////////////////////////////// // ACTIONS //////////////////////////////////////////// const contextualize = async (tracks: Track[]) => { - await input.s3.sendAction("contextualize", tracks); + const s3 = await input.s3; + await s3.sendAction("contextualize", tracks, { timeoutDuration: 60000 * 5 }); }; const list = async (cachedTracks: Track[] = []) => { + const [nativeFs, s3] = [await input.nativeFs, await input.s3]; + const groups = cachedTracks.reduce( (acc: Record, track: Track) => { const scheme = track.uri.split(":", 1)[0]; return { ...acc, [scheme]: [...(acc[scheme] || []), track] }; }, { - [input.nativeFs.manifest.input_properties.scheme]: [], - [input.s3.manifest.input_properties.scheme]: [], + [nativeFs.manifest.input_properties.scheme]: [], + [s3.manifest.input_properties.scheme]: [], }, ); const promises = Object.entries(groups).map( async ([scheme, cachedTracksGroup]: [string, Track[]]) => { switch (scheme) { - case input.nativeFs.manifest.input_properties.scheme: - return await input.nativeFs.sendAction("list", cachedTracksGroup, { + case nativeFs.manifest.input_properties.scheme: + return await nativeFs.sendAction("list", cachedTracksGroup, { timeoutDuration: 60000 * 60 * 24, }); - case input.s3.manifest.input_properties.scheme: - return await input.s3.sendAction("list", cachedTracksGroup, { + case s3.manifest.input_properties.scheme: + return await s3.sendAction("list", cachedTracksGroup, { timeoutDuration: 60000 * 60 * 24, }); @@ -94,14 +92,15 @@ }; const resolve = async (args: { method: string; uri: string }) => { + const [nativeFs, s3] = [await input.nativeFs, await input.s3]; const scheme = args.uri.split(":", 1)[0]; switch (scheme) { - case input.nativeFs.manifest.input_properties.scheme: - return await input.nativeFs.sendAction("resolve", args); + case nativeFs.manifest.input_properties.scheme: + return await nativeFs.sendAction("resolve", args); - case input.s3.manifest.input_properties.scheme: - return await input.s3.sendAction("resolve", args); + case s3.manifest.input_properties.scheme: + return await s3.sendAction("resolve", args); default: return undefined; @@ -111,9 +110,4 @@ context.setActionHandler("contextualize", contextualize); context.setActionHandler("list", list); context.setActionHandler("resolve", resolve); - - //////////////////////////////////////////// - // 🚦 - //////////////////////////////////////////// - context.data = { ready: true }; diff --git a/src/pages/configurator/input/_manifest.json b/src/pages/configurator/input/_manifest.json index 35d5a85..e0101bf 100644 --- a/src/pages/configurator/input/_manifest.json +++ b/src/pages/configurator/input/_manifest.json @@ -5,6 +5,7 @@ "actions": { "contextualize": { "title": "Contextualize", + "description": "Provide context to all inputs.", "params_schema": { "type": "array", "description": "Array of tracks", diff --git a/src/pages/configurator/output/_applet.astro b/src/pages/configurator/output/_applet.astro index 2ece121..250022b 100644 --- a/src/pages/configurator/output/_applet.astro +++ b/src/pages/configurator/output/_applet.astro @@ -81,6 +81,10 @@ // Applet connections const connections: Record> = {}; + // Initial state + context.data = INITIAL_MANAGED_OUTPUT; + + // Applet connections async function connection(method: Method) { if (connections[method]) return connections[method]; @@ -98,9 +102,6 @@ return connections[method]; } - // Initial state - context.data = INITIAL_MANAGED_OUTPUT; - // Signals const stored = localStorage.getItem(LOCALSTORAGE_KEY); const [active, setActive] = signal( diff --git a/src/pages/index.astro b/src/pages/index.astro index 6bd54cc..ad4bab1 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -60,7 +60,7 @@ const output = [ const processors = [ { url: "processor/artwork/", title: "(TODO) Artwork fetcher" }, - { url: "processor/metadata-fetcher/", title: "Metadata fetcher" }, + { url: "processor/metadata/", title: "Metadata fetcher" }, ]; --- diff --git a/src/pages/orchestrator/input-cache/_applet.astro b/src/pages/orchestrator/input-cache/_applet.astro index e324788..a986ec0 100644 --- a/src/pages/orchestrator/input-cache/_applet.astro +++ b/src/pages/orchestrator/input-cache/_applet.astro @@ -1,38 +1,33 @@ diff --git a/src/pages/orchestrator/single-queue/_applet.astro b/src/pages/orchestrator/single-queue/_applet.astro index 2616e6e..e613a37 100644 --- a/src/pages/orchestrator/single-queue/_applet.astro +++ b/src/pages/orchestrator/single-queue/_applet.astro @@ -31,10 +31,16 @@ const queueItems = await tracks.reduce( async (promise: Promise, track: Track) => { const acc = await promise; - const res = await configurator.input.sendAction("resolve", { - method: "GET", - uri: track.uri, - }); + const res = await configurator.input.sendAction( + "resolve", + { + method: "GET", + uri: track.uri, + }, + { + timeoutDuration: 60000 * 5, + }, + ); if (!res) return acc; diff --git a/src/pages/processor/artwork/_applet.astro b/src/pages/processor/artwork/_applet.astro new file mode 100644 index 0000000..3094b09 --- /dev/null +++ b/src/pages/processor/artwork/_applet.astro @@ -0,0 +1,76 @@ + diff --git a/src/pages/processor/artwork/_manifest.json b/src/pages/processor/artwork/_manifest.json new file mode 100644 index 0000000..95a62a2 --- /dev/null +++ b/src/pages/processor/artwork/_manifest.json @@ -0,0 +1,38 @@ +{ + "name": "diffuse/processor/artwork", + "title": "Diffuse Processor | Artwork fetcher", + "description": "Tries to get artwork for a given URL or stream.", + "entrypoint": "index.html", + "actions": { + "supply": { + "title": "Supply", + "description": "Get the artwork for a given URL.", + "params_schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "cacheId": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "stream": { + "type": "object" + }, + "urls": { + "type": "object", + "properties": { + "get": { "type": "string" }, + "head": { "type": "string" } + }, + "required": ["get", "head"] + } + }, + "required": ["cacheId"] + } + } + } + } +} diff --git a/src/pages/processor/metadata-fetcher/index.astro b/src/pages/processor/artwork/index.astro similarity index 100% rename from src/pages/processor/metadata-fetcher/index.astro rename to src/pages/processor/artwork/index.astro diff --git a/src/pages/processor/artwork/types.d.ts b/src/pages/processor/artwork/types.d.ts new file mode 100644 index 0000000..666bfbe --- /dev/null +++ b/src/pages/processor/artwork/types.d.ts @@ -0,0 +1,14 @@ +export type Artwork = {}; + +export type ArtworkRequest = { + cacheId: string; + mimeType?: string; + stream?: ReadableStream; + urls?: Urls; +}; + +export type State = { + artwork: Artwork[]; +}; + +export type Urls = { get: string; head: string }; diff --git a/src/pages/processor/metadata-fetcher/_applet.astro b/src/pages/processor/metadata/_applet.astro similarity index 86% rename from src/pages/processor/metadata-fetcher/_applet.astro rename to src/pages/processor/metadata/_applet.astro index abb286c..c0b21f9 100644 --- a/src/pages/processor/metadata-fetcher/_applet.astro +++ b/src/pages/processor/metadata/_applet.astro @@ -1,11 +1,12 @@