more changes from review

This commit is contained in:
Georges-Antoine Assi
2026-04-05 23:15:42 -04:00
parent 2057c147d9
commit 1501f45220
9 changed files with 83 additions and 27 deletions

View File

@@ -297,9 +297,6 @@ class ConfigManager:
FIRMWARE_FOLDER_NAME=pydash.get(
self._raw_config, "filesystem.firmware_folder", "bios"
),
GAMELIST_AUTO_EXPORT_ON_SCAN=pydash.get(
self._raw_config, "scan.gamelist.export", False
),
SKIP_HASH_CALCULATION=pydash.get(
self._raw_config, "filesystem.skip_hash_calculation", False
),
@@ -372,15 +369,18 @@ class ConfigManager:
"manual",
],
),
GAMELIST_AUTO_EXPORT_ON_SCAN=pydash.get(
self._raw_config, "scan.gamelist.export", False
),
GAMELIST_MEDIA_THUMBNAIL=pydash.get(
self._raw_config,
"scan.gamelist.media.thumbnail",
"cover",
MetadataMediaType.BOX2D,
),
GAMELIST_MEDIA_IMAGE=pydash.get(
self._raw_config,
"scan.gamelist.media.image",
"screenshot",
MetadataMediaType.SCREENSHOT,
),
)
@@ -598,6 +598,42 @@ class ConfigManager:
)
sys.exit(3)
valid_thumbnail_options = {
MetadataMediaType.BOX2D,
MetadataMediaType.BOX3D,
MetadataMediaType.MIXIMAGE,
MetadataMediaType.PHYSICAL,
}
if not isinstance(self.config.GAMELIST_MEDIA_THUMBNAIL, str):
log.critical(
"Invalid config.yml: scan.gamelist.media.thumbnail must be a string"
)
sys.exit(3)
if self.config.GAMELIST_MEDIA_THUMBNAIL not in valid_thumbnail_options:
log.critical(
f"Invalid config.yml: scan.gamelist.media.thumbnail must be one of {valid_thumbnail_options}"
)
sys.exit(3)
valid_image_options = {
MetadataMediaType.TITLE_SCREEN,
MetadataMediaType.MIXIMAGE,
MetadataMediaType.BOX2D,
MetadataMediaType.SCREENSHOT,
}
if not isinstance(self.config.GAMELIST_MEDIA_IMAGE, str):
log.critical(
"Invalid config.yml: scan.gamelist.media.image must be a string"
)
sys.exit(3)
if self.config.GAMELIST_MEDIA_IMAGE not in valid_image_options:
log.critical(
f"Invalid config.yml: scan.gamelist.media.image must be one of {valid_image_options}"
)
sys.exit(3)
def get_config(self) -> Config:
try:
with open(self.config_file, "r") as config_file:

View File

@@ -1,6 +1,6 @@
from typing import TypedDict
from config.config_manager import EjsControls, NetplayICEServer
from config.config_manager import EjsControls, MetadataMediaType, NetplayICEServer
class ConfigResponse(TypedDict):
@@ -31,5 +31,5 @@ class ConfigResponse(TypedDict):
SCAN_REGION_PRIORITY: list[str]
SCAN_LANGUAGE_PRIORITY: list[str]
SCAN_MEDIA: list[str]
GAMELIST_MEDIA_THUMBNAIL: str
GAMELIST_MEDIA_IMAGE: str
GAMELIST_MEDIA_THUMBNAIL: MetadataMediaType
GAMELIST_MEDIA_IMAGE: MetadataMediaType

View File

@@ -68,8 +68,8 @@ class GamelistExporter:
thumbnail_path = (
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata['box3d_path']}"
)
elif rom.gamelist_metadata and rom.gamelist_metadata.get("box3d"):
thumbnail_path = rom.gamelist_metadata["box3d"]
elif rom.gamelist_metadata and rom.gamelist_metadata.get("box3d_path"):
thumbnail_path = f"{FRONTEND_RESOURCES_PATH}/{rom.gamelist_metadata['box3d_path']}"
case "miximage":
if rom.ss_metadata and rom.ss_metadata.get("miximage_path"):
thumbnail_path = (
@@ -89,7 +89,7 @@ class GamelistExporter:
):
thumbnail_path = f"{FRONTEND_RESOURCES_PATH}/{rom.gamelist_metadata['physical_path']}"
# "cover" and "box2d" both map to path_cover_l (box2d IS the front cover)
# "cover" and "box2d" both map to path_cover_l
if thumbnail_path is None and rom.path_cover_l:
thumbnail_path = f"{FRONTEND_RESOURCES_PATH}/{rom.path_cover_l}"
if thumbnail_path:
@@ -180,27 +180,27 @@ class GamelistExporter:
if rom.ss_metadata:
if rom.ss_metadata.get("box3d_path"):
SubElement(game, "box3d").text = (
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata["box3d_path"]}"
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata['box3d_path']}"
)
if rom.ss_metadata.get("box2d_back_path"):
SubElement(game, "boxback").text = (
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata["box2d_back_path"]}"
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata['box2d_back_path']}"
)
if rom.ss_metadata.get("fanart_path"):
SubElement(game, "fanart").text = (
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata["fanart_path"]}"
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata['fanart_path']}"
)
if rom.ss_metadata.get("logo_path"):
SubElement(game, "marquee").text = (
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata["logo_path"]}"
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata['logo_path']}"
)
if rom.ss_metadata.get("miximage_path"):
SubElement(game, "miximage").text = (
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata["miximage_path"]}"
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata['miximage_path']}"
)
if rom.ss_metadata.get("physical_path"):
SubElement(game, "physicalmedia").text = (
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata["physical_path"]}"
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata['physical_path']}"
)
if rom.ss_metadata.get("title_screen_path"):
SubElement(game, "title_screen").text = (
@@ -208,18 +208,26 @@ class GamelistExporter:
)
if rom.ss_metadata.get("bezel_path"):
SubElement(game, "bezel").text = (
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata["bezel_path"]}"
f"{FRONTEND_RESOURCES_PATH}/{rom.ss_metadata['bezel_path']}"
)
if rom.gamelist_metadata:
if rom.gamelist_metadata.get("box3d"):
SubElement(game, "box3d").text = rom.gamelist_metadata["box3d"]
if rom.gamelist_metadata.get("box2d_back"):
SubElement(game, "boxback").text = rom.gamelist_metadata["box2d_back"]
if rom.gamelist_metadata.get("fanart"):
SubElement(game, "fanart").text = rom.gamelist_metadata["fanart"]
if rom.gamelist_metadata.get("marquee"):
SubElement(game, "marquee").text = rom.gamelist_metadata["marquee"]
if rom.gamelist_metadata.get("box3d_path"):
SubElement(game, "box3d").text = (
f"{FRONTEND_RESOURCES_PATH}/{rom.gamelist_metadata['box3d_path']}"
)
if rom.gamelist_metadata.get("box2d_back_path"):
SubElement(game, "boxback").text = (
f"{FRONTEND_RESOURCES_PATH}/{rom.gamelist_metadata['box2d_back_path']}"
)
if rom.gamelist_metadata.get("fanart_path"):
SubElement(game, "fanart").text = (
f"{FRONTEND_RESOURCES_PATH}/{rom.gamelist_metadata['fanart_path']}"
)
if rom.gamelist_metadata.get("marquee_path"):
SubElement(game, "marquee").text = (
f"{FRONTEND_RESOURCES_PATH}/{rom.gamelist_metadata['marquee_path']}"
)
if rom.gamelist_metadata.get("miximage_path"):
SubElement(game, "miximage").text = (
f"{FRONTEND_RESOURCES_PATH}/{rom.gamelist_metadata['miximage_path']}"

View File

@@ -138,7 +138,7 @@
# export: false # Whether to export gamelist.xml for ES-DE/Batocera/RetroBAT
# media:
# # Select a media type from the list above (eg. box2d, screenshot, etc.)
# thumbnail: cover # Use as the <thumbnail> tag in the exported gamelist.xml
# thumbnail: box2d # Use as the <thumbnail> tag in the exported gamelist.xml
# image: screenshot # Use as the <image> tag in the exported gamelist.xml
# EmulatorJS per-core options

View File

@@ -72,6 +72,7 @@ export type { JobStatus } from './models/JobStatus';
export type { LaunchboxImage } from './models/LaunchboxImage';
export type { ManualMetadata } from './models/ManualMetadata';
export type { MetadataCoverageItem } from './models/MetadataCoverageItem';
export type { MetadataMediaType } from './models/MetadataMediaType';
export type { MetadataSourcesDict } from './models/MetadataSourcesDict';
export type { MissingRomsCleanupStats } from './models/MissingRomsCleanupStats';
export type { MobyMetadataPlatform } from './models/MobyMetadataPlatform';

View File

@@ -3,6 +3,7 @@
/* tslint:disable */
/* eslint-disable */
import type { EjsControls } from './EjsControls';
import type { MetadataMediaType } from './MetadataMediaType';
import type { NetplayICEServer } from './NetplayICEServer';
export type ConfigResponse = {
CONFIG_FILE_MOUNTED: boolean;
@@ -32,5 +33,7 @@ export type ConfigResponse = {
SCAN_REGION_PRIORITY: Array<string>;
SCAN_LANGUAGE_PRIORITY: Array<string>;
SCAN_MEDIA: Array<string>;
GAMELIST_MEDIA_THUMBNAIL: MetadataMediaType;
GAMELIST_MEDIA_IMAGE: MetadataMediaType;
};

View File

@@ -0,0 +1,5 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type MetadataMediaType = 'bezel' | 'box2d' | 'box2d_back' | 'box3d' | 'miximage' | 'physical' | 'screenshot' | 'title_screen' | 'marquee' | 'logo' | 'fanart' | 'video' | 'video_normalized' | 'manual';

View File

@@ -29,6 +29,7 @@ export type RomSSMetadata = {
physical_path?: (string | null);
marquee_path?: (string | null);
logo_path?: (string | null);
title_screen_path?: (string | null);
video_path?: (string | null);
video_normalized_path?: (string | null);
ss_score?: (string | null);

View File

@@ -39,6 +39,8 @@ const defaultConfig = {
SCAN_REGION_PRIORITY: [],
SCAN_LANGUAGE_PRIORITY: [],
SCAN_MEDIA: [],
GAMELIST_MEDIA_THUMBNAIL: "box2d",
GAMELIST_MEDIA_IMAGE: "screenshot",
} as ConfigResponse;
export default defineStore("config", {