Files
romm/backend/endpoints/responses/search.py
Georges-Antoine Assi 522df9d31a feat: add libretro thumbnails as an artwork source
Adds the libretro thumbnail repository as a first-class artwork source so
region-correct box art (PAL/Europe, Japan, etc.) can be matched directly
to ROM filenames, addressing rommapp/romm#3239.

Implementation follows the SGDB handler pattern (artwork-only, no game
metadata): MetadataSource enum entry, scan-time fetch wired into the
SCAN_ARTWORK_PRIORITY loop, /search/roms integration, MatchRom dialog
chip + cover selection, and a heartbeat flag.

Matching is exact case-insensitive against the directory listing first
(so a ROM named "(Europe)" lands on the (Europe) artwork), with a
JaroWinkler fuzzy fallback at 0.8 that strips parenthetical tags from
both sides. Listings are cached in Redis with a 24h TTL.

`libretro_id` is persisted on the Rom model as the SHA1 hex of the
matched libretro filename — stable across scans, distinct per region,
indexed for lookup. Migration 0077 adds the column.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:57:20 -04:00

33 lines
804 B
Python

from handler.metadata.sgdb_handler import SGDBResource
from .base import BaseModel
class SearchRomSchema(BaseModel):
id: int | None = None
igdb_id: int | None = None
moby_id: int | None = None
ss_id: int | None = None
sgdb_id: int | None = None
flashpoint_id: str | None = None
launchbox_id: int | None = None
libretro_id: str | None = None
platform_id: int
name: str
slug: str = ""
summary: str = ""
igdb_url_cover: str = ""
moby_url_cover: str = ""
ss_url_cover: str = ""
sgdb_url_cover: str = ""
flashpoint_url_cover: str = ""
launchbox_url_cover: str = ""
libretro_url_cover: str = ""
is_unidentified: bool
is_identified: bool
class SearchCoverSchema(BaseModel):
name: str
resources: list[SGDBResource]