From 75ebcd564fb3274ec3bbeed32d685bdaa362d1c6 Mon Sep 17 00:00:00 2001 From: wadie Date: Sun, 9 Aug 2026 21:04:00 +0200 Subject: [PATCH 1/4] Improve soundtrack player artwork --- frontend/src/stores/soundtrackPlayer.ts | 17 ++++++++ .../GameDetails/SoundtrackPanel.vue | 42 +++++++++++++------ .../v2/components/Soundtrack/MiniPlayer.vue | 35 ++++++++++------ 3 files changed, 69 insertions(+), 25 deletions(-) diff --git a/frontend/src/stores/soundtrackPlayer.ts b/frontend/src/stores/soundtrackPlayer.ts index 16ada5f5cd..5f2c3f1f5e 100644 --- a/frontend/src/stores/soundtrackPlayer.ts +++ b/frontend/src/stores/soundtrackPlayer.ts @@ -3,6 +3,8 @@ import { throttle } from "lodash"; import { defineStore } from "pinia"; import { computed, ref, shallowRef } from "vue"; import type { TrackMetaSchema } from "@/__generated__"; +import type { DetailedRom } from "@/stores/roms"; +import { FRONTEND_RESOURCES_PATH } from "@/utils"; const volumeStorage = useLocalStorage("soundtrack.volume", 1); const mutedStorage = useLocalStorage("soundtrack.muted", false); @@ -25,8 +27,23 @@ export type PlayerMeta = { duration?: number; coverUrl?: string; folderCoverUrl?: string; + gameArtworkUrl?: string; }; +export function resolveSoundtrackGameArtwork( + rom: DetailedRom, +): string | undefined { + const logoPath = rom.ss_metadata?.logo_path; + if (logoPath) return `${FRONTEND_RESOURCES_PATH}/${logoPath}`; + + return ( + rom.path_cover_large ?? + rom.path_cover_small ?? + rom.url_cover ?? + undefined + ); +} + const useSoundtrackPlayer = defineStore("soundtrackPlayer", () => { const track = ref(null); const meta = ref({}); diff --git a/frontend/src/v2/components/GameDetails/SoundtrackPanel.vue b/frontend/src/v2/components/GameDetails/SoundtrackPanel.vue index 64eb7774d5..8db4763ce3 100644 --- a/frontend/src/v2/components/GameDetails/SoundtrackPanel.vue +++ b/frontend/src/v2/components/GameDetails/SoundtrackPanel.vue @@ -30,6 +30,7 @@ import type { DetailedRom } from "@/stores/roms"; import useSoundtrackPlayer, { type PlayerMeta, type PlayerTrack, + resolveSoundtrackGameArtwork, } from "@/stores/soundtrackPlayer"; import { FRONTEND_RESOURCES_PATH, formatBytes } from "@/utils"; import { useSnackbar } from "@/v2/composables/useSnackbar"; @@ -105,6 +106,10 @@ const folderCoverUrl = computed(() => { return cover ? fileUrl(cover.id, cover.file_name) : null; }); +const gameArtworkUrl = computed(() => + resolveSoundtrackGameArtwork(props.rom), +); + // ---------- Metadata fetch ---------- const tracksMeta = ref>(new Map()); const isLoadingMeta = ref(false); @@ -127,6 +132,7 @@ function toPlayerMeta(m: TrackMetaSchema | undefined): PlayerMeta { duration: m?.duration_seconds ?? undefined, coverUrl: coverUrlForMeta(m) ?? undefined, folderCoverUrl: folderCoverUrl.value ?? undefined, + gameArtworkUrl: gameArtworkUrl.value, }; } @@ -207,6 +213,7 @@ const activeArtUrl = computed( () => coverUrlForMeta(activeMeta.value) ?? folderCoverUrl.value ?? + gameArtworkUrl.value ?? "/assets/default/album_cover.jpg", ); @@ -355,16 +362,16 @@ function seekValueText(v: number): string {
-
- +
+ class="r-v2-stp__cover-rotor" + :class="{ + 'r-v2-stp__cover-rotor--spinning': activeTrack && isPlaying, + }" + > + +
meta.value.coverUrl ?? meta.value.folderCoverUrl ?? + meta.value.gameArtworkUrl ?? "/assets/default/album_cover.jpg", ); @@ -196,12 +197,13 @@ function openRom() { >
-