From e2c055f7e5299e13e826a7e2acd41235f356af79 Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi Date: Thu, 30 Oct 2025 15:33:35 -0400 Subject: [PATCH] add logo and marquee paths --- backend/config/config_manager.py | 1 + backend/handler/metadata/gamelist_handler.py | 7 +++++++ backend/handler/metadata/ss_handler.py | 13 +++++++++++++ examples/config.example.yml | 3 ++- .../src/__generated__/models/RomGamelistMetadata.ts | 1 + frontend/src/__generated__/models/RomSSMetadata.ts | 2 ++ .../components/Settings/UserInterface/Interface.vue | 4 +++- frontend/src/components/common/Game/Card/Base.vue | 6 +----- frontend/src/composables/useGameAnimation.ts | 1 + 9 files changed, 31 insertions(+), 7 deletions(-) diff --git a/backend/config/config_manager.py b/backend/config/config_manager.py index d6bb17f84..c6c302a5f 100644 --- a/backend/config/config_manager.py +++ b/backend/config/config_manager.py @@ -44,6 +44,7 @@ class MetadataMediaType(enum.StrEnum): SCREENSHOT = "screenshot" TITLE_SCREEN = "title_screen" MARQUEE = "marquee" + LOGO = "logo" FANART = "fanart" VIDEO = "video" MANUAL = "manual" diff --git a/backend/handler/metadata/gamelist_handler.py b/backend/handler/metadata/gamelist_handler.py index a9d5c55ab..283db1a84 100644 --- a/backend/handler/metadata/gamelist_handler.py +++ b/backend/handler/metadata/gamelist_handler.py @@ -44,6 +44,7 @@ class GamelistMetadataMedia(TypedDict): box3d_path: str | None miximage_path: str | None physical_path: str | None + marquee_path: str | None video_path: str | None @@ -85,6 +86,7 @@ def extract_media_from_gamelist_rom(rom: Rom, game: Element) -> GamelistMetadata box3d_path=None, miximage_path=None, physical_path=None, + marquee_path=None, video_path=None, ) @@ -142,6 +144,11 @@ def extract_media_from_gamelist_rom(rom: Rom, game: Element) -> GamelistMetadata f"{platform_dir}/{marquee_elem.text.replace("./", "")}" ) gamelist_media["marquee_url"] = f"file://{str(marquee_path_path)}" + + if MetadataMediaType.MARQUEE in preferred_media_types: + gamelist_media["marquee_path"] = ( + f"{fs_resource_handler.get_media_resources_path(rom.platform_id, rom.id, MetadataMediaType.MARQUEE)}/marquee.png" + ) if miximage_elem is not None and miximage_elem.text: miximage_path_path = fs_platform_handler.validate_path( f"{platform_dir}/{miximage_elem.text.replace("./", "")}" diff --git a/backend/handler/metadata/ss_handler.py b/backend/handler/metadata/ss_handler.py index c42ea4a45..a373f3361 100644 --- a/backend/handler/metadata/ss_handler.py +++ b/backend/handler/metadata/ss_handler.py @@ -165,6 +165,8 @@ class SSMetadataMedia(TypedDict): box3d_path: str | None miximage_path: str | None physical_path: str | None + marquee_path: str | None + logo_path: str | None video_path: str | None @@ -208,6 +210,8 @@ def extract_media_from_ss_game(rom: Rom, game: SSGame) -> SSMetadataMedia: box3d_path=None, miximage_path=None, physical_path=None, + marquee_path=None, + logo_path=None, video_path=None, ) @@ -232,10 +236,19 @@ def extract_media_from_ss_game(rom: Rom, game: SSGame) -> SSMetadataMedia: ss_media["fullbox_url"] = media["url"] elif media.get("type") == "wheel-hd" and not ss_media["logo_url"]: ss_media["logo_url"] = media["url"] + + if MetadataMediaType.LOGO in preferred_media_types: + ss_media["logo_path"] = ( + f"{fs_resource_handler.get_media_resources_path(rom.platform_id, rom.id, MetadataMediaType.LOGO)}/logo.png" + ) elif media.get("type") == "manual" and not ss_media["manual_url"]: ss_media["manual_url"] = media["url"] elif media.get("type") == "screenmarquee" and not ss_media["marquee_url"]: ss_media["marquee_url"] = media["url"] + if MetadataMediaType.MARQUEE in preferred_media_types: + ss_media["marquee_path"] = ( + f"{fs_resource_handler.get_media_resources_path(rom.platform_id, rom.id, MetadataMediaType.MARQUEE)}/marquee.png" + ) elif ( media.get("type") == "miximage1" or media.get("type") == "miximage2" diff --git a/examples/config.example.yml b/examples/config.example.yml index 884de57c4..a45a1d485 100644 --- a/examples/config.example.yml +++ b/examples/config.example.yml @@ -88,10 +88,11 @@ filesystem: {} # { roms_folder: 'roms' } For example if your folder structure is # - box3d # 3D box art # - miximage # Mixed image of multiple media # - physical # Disc, cartridge, etc. +# - marquee # Custom marquee +# - logo # Transparent logo # # Added to the screenshots carousel # - screenshot # Screenshot (enabled by default) # - title_screen # Title screen -# - marquee # Transparent logo # - fanart # User uploaded artwork # # Bezel displayed around the emulatorjs window # - bezel diff --git a/frontend/src/__generated__/models/RomGamelistMetadata.ts b/frontend/src/__generated__/models/RomGamelistMetadata.ts index 6a4be2d60..e7702cdbd 100644 --- a/frontend/src/__generated__/models/RomGamelistMetadata.ts +++ b/frontend/src/__generated__/models/RomGamelistMetadata.ts @@ -19,6 +19,7 @@ export type RomGamelistMetadata = { box3d_path?: (string | null); miximage_path?: (string | null); physical_path?: (string | null); + marquee_path?: (string | null); video_path?: (string | null); rating?: (number | null); first_release_date?: (string | null); diff --git a/frontend/src/__generated__/models/RomSSMetadata.ts b/frontend/src/__generated__/models/RomSSMetadata.ts index 069b3aa70..c966dd5e0 100644 --- a/frontend/src/__generated__/models/RomSSMetadata.ts +++ b/frontend/src/__generated__/models/RomSSMetadata.ts @@ -24,6 +24,8 @@ export type RomSSMetadata = { box3d_path?: (string | null); miximage_path?: (string | null); physical_path?: (string | null); + marquee_path?: (string | null); + logo_path?: (string | null); video_path?: (string | null); ss_score?: string; first_release_date?: (number | null); diff --git a/frontend/src/components/Settings/UserInterface/Interface.vue b/frontend/src/components/Settings/UserInterface/Interface.vue index 2ceb189bf..6be2069bd 100644 --- a/frontend/src/components/Settings/UserInterface/Interface.vue +++ b/frontend/src/components/Settings/UserInterface/Interface.vue @@ -56,7 +56,8 @@ export type BoxartStyleOption = | "cover_path" | "box3d_path" | "physical_path" - | "miximage_path"; + | "miximage_path" + | "marquee_path"; const boxartStyleRef = useLocalStorage( "settings.boxartStyle", "cover_path", @@ -197,6 +198,7 @@ const boxartStyleOptions = computed(() => [ { title: t("settings.boxart-box3d"), value: "box3d_path" }, { title: t("settings.boxart-physical"), value: "physical_path" }, { title: t("settings.boxart-miximage"), value: "miximage_path" }, + { title: t("settings.boxart-marquee"), value: "marquee_path" }, ]); const setPlatformDrawerGroupBy = (value: string) => { diff --git a/frontend/src/components/common/Game/Card/Base.vue b/frontend/src/components/common/Game/Card/Base.vue index 4d03966ff..ff12242c7 100644 --- a/frontend/src/components/common/Game/Card/Base.vue +++ b/frontend/src/components/common/Game/Card/Base.vue @@ -157,6 +157,7 @@ const videoRef = useTemplateRef("hover-video-ref"); const gameIsHovering = ref(false); const { + boxartStyle, boxartStyleCover, animateCD, animateCartridge, @@ -175,11 +176,6 @@ const { videoRef: videoRef, }); -const boxartStyle = useLocalStorage( - "settings.boxartStyle", - "cover_path", -); - const isWebpEnabled = computed( () => heartbeatStore.value.TASKS?.ENABLE_SCHEDULED_CONVERT_IMAGES_TO_WEBP, ); diff --git a/frontend/src/composables/useGameAnimation.ts b/frontend/src/composables/useGameAnimation.ts index 916599b46..61f43369d 100644 --- a/frontend/src/composables/useGameAnimation.ts +++ b/frontend/src/composables/useGameAnimation.ts @@ -239,6 +239,7 @@ export function useGameAnimation({ ); return { + boxartStyle, boxartStyleCover, animateCD, animateCartridge,