From 9ac4d4f57b4e2a7826364a617f107f0a41d6166b Mon Sep 17 00:00:00 2001 From: Steven Vandevelde Date: Sat, 21 Jun 2025 17:31:14 +0200 Subject: [PATCH] refactor: queue --- src/pages/engine/audio/_applet.astro | 8 ++-- src/pages/engine/queue/_applet.astro | 47 +++++++-------------- src/pages/engine/queue/types.d.ts | 8 +--- src/pages/input/opensubsonic/_applet.astro | 5 +-- src/scripts/engine/queue/types.d.ts | 7 ++++ src/scripts/engine/queue/worker.ts | 49 ++++++++++++++++++++++ 6 files changed, 78 insertions(+), 46 deletions(-) create mode 100644 src/scripts/engine/queue/types.d.ts create mode 100644 src/scripts/engine/queue/worker.ts diff --git a/src/pages/engine/audio/_applet.astro b/src/pages/engine/audio/_applet.astro index 588dd33..ce49e5f 100644 --- a/src/pages/engine/audio/_applet.astro +++ b/src/pages/engine/audio/_applet.astro @@ -53,9 +53,11 @@ context.scope.ondata = (event: any) => setDefaultVolume(event.data.volume.default); effect(() => { - const volume = defaultVolume(); - if (volume === undefined) return; - localStorage.setItem(VOLUME_KEY, volume.toString()); + if (context.isMainInstance()) { + const volume = defaultVolume(); + if (volume === undefined) return; + localStorage.setItem(VOLUME_KEY, volume.toString()); + } }); //////////////////////////////////////////// diff --git a/src/pages/engine/queue/_applet.astro b/src/pages/engine/queue/_applet.astro index 54fda9d..0dc43da 100644 --- a/src/pages/engine/queue/_applet.astro +++ b/src/pages/engine/queue/_applet.astro @@ -1,12 +1,19 @@ diff --git a/src/pages/engine/queue/types.d.ts b/src/pages/engine/queue/types.d.ts index 4795771..fddaddd 100644 --- a/src/pages/engine/queue/types.d.ts +++ b/src/pages/engine/queue/types.d.ts @@ -1,7 +1 @@ -import type { Track } from "@applets/core/types"; - -export interface State { - past: Track[]; - now: Track | null; - future: Track[]; -} +export * from "@scripts/engine/queue/types.d.ts"; diff --git a/src/pages/input/opensubsonic/_applet.astro b/src/pages/input/opensubsonic/_applet.astro index 3f2ccea..53b2c41 100644 --- a/src/pages/input/opensubsonic/_applet.astro +++ b/src/pages/input/opensubsonic/_applet.astro @@ -27,10 +27,7 @@ // SETUP //////////////////////////////////////////// const worker = endpoint( - new Worker("../../../scripts/input/opensubsonic/worker", { - type: "module", - }), - self as any, + new Worker("../../../scripts/input/opensubsonic/worker", { type: "module" }), ); // Register applet diff --git a/src/scripts/engine/queue/types.d.ts b/src/scripts/engine/queue/types.d.ts new file mode 100644 index 0000000..4795771 --- /dev/null +++ b/src/scripts/engine/queue/types.d.ts @@ -0,0 +1,7 @@ +import type { Track } from "@applets/core/types"; + +export interface State { + past: Track[]; + now: Track | null; + future: Track[]; +} diff --git a/src/scripts/engine/queue/worker.ts b/src/scripts/engine/queue/worker.ts new file mode 100644 index 0000000..517b409 --- /dev/null +++ b/src/scripts/engine/queue/worker.ts @@ -0,0 +1,49 @@ +import type { Track } from "@applets/core/types.js"; +import { expose } from "../../../scripts/common.ts"; +import type { State } from "./types"; + +//////////////////////////////////////////// +// ACTIONS +//////////////////////////////////////////// +const actions = expose({ + add, + fill, + shift, + unshift, +}); + +export type Actions = typeof actions; + +// Actions + +function add(state: State, items: Track[]): State { + return { ...state, future: [...state.future, ...items] }; +} + +// TODO: Shuffle, limit track amount, etc. +function fill(state: State, availableItems: Track[]): State { + state = add(state, availableItems); + + // Automatically insert track if there isn't any + if (!state.now) return shift(state); + return state; +} + +function shift(state: State): State { + const now = state.future[0] || null; + const future = state.future.slice(1); + const past = state.now ? [...state.past, state.now] : state.past; + + return { past, now, future }; +} + +function unshift(state: State): State { + if (state.past.length === 0) return state; + + const past = [...state.past]; + const [last] = past.splice(past.length - 1, 1); + const now = last ?? null; + const future = state.now ? [state.now, ...state.future] : state.future; + + return { past, now, future }; +} -- knotmirror 0.0.1