Merge pull request #2267 from rommapp/search-normalize-name

Normalize result names for better merging in search
This commit is contained in:
Georges-Antoine Assi
2025-08-16 08:31:36 -05:00
committed by GitHub
5 changed files with 62 additions and 32 deletions

View File

@@ -6,13 +6,15 @@ class SearchRomSchema(BaseModel):
igdb_id: int | None = None
moby_id: int | None = None
ss_id: int | None = None
slug: str
sgdb_id: int | None = None
platform_id: int
name: str
summary: str
slug: str = ""
summary: str = ""
igdb_url_cover: str = ""
moby_url_cover: str = ""
ss_url_cover: str = ""
platform_id: int
sgdb_url_cover: str = ""
class SearchCoverSchema(BaseModel):

View File

@@ -14,7 +14,7 @@ from handler.metadata import (
)
from handler.metadata.igdb_handler import IGDB_API_ENABLED, IGDBRom
from handler.metadata.moby_handler import MOBY_API_ENABLED, MobyGamesRom
from handler.metadata.sgdb_handler import STEAMGRIDDB_API_ENABLED
from handler.metadata.sgdb_handler import STEAMGRIDDB_API_ENABLED, SGDBRom
from handler.metadata.ss_handler import SS_API_ENABLED, SSRom
from handler.scan_handler import get_main_platform_igdb_id
from logger.formatter import BLUE, CYAN
@@ -97,7 +97,11 @@ async def search_rom(
moby_matched_roms = [moby_rom] if moby_rom else []
ss_matched_roms = [ss_rom] if ss_rom else []
elif search_by.lower() == "name":
igdb_matched_roms, moby_matched_roms, ss_matched_roms = await asyncio.gather(
(
igdb_matched_roms,
moby_matched_roms,
ss_matched_roms,
) = await asyncio.gather(
meta_igdb_handler.get_matched_roms_by_name(
search_term, get_main_platform_igdb_id(rom.platform)
),
@@ -110,47 +114,60 @@ async def search_rom(
merged_dict: dict[str, dict] = {}
for igdb_rom in igdb_matched_roms:
igdb_name = igdb_rom.get("name", "")
if igdb_name:
if igdb_rom["igdb_id"]:
igdb_name = meta_igdb_handler.normalize_search_term(
igdb_rom.get("name", ""),
remove_articles=False,
)
merged_dict[igdb_name] = {
**igdb_rom,
"platform_id": rom.platform_id,
"igdb_url_cover": igdb_rom.pop("url_cover", ""),
**merged_dict.get(igdb_name, {}),
}
for moby_rom in moby_matched_roms:
moby_name = moby_rom.get("name", "")
if moby_name:
merged_dict[moby_name] = { # type: ignore
if moby_rom["moby_id"]:
moby_name = meta_moby_handler.normalize_search_term(
moby_rom.get("name", ""),
remove_articles=False,
)
merged_dict[moby_name] = {
**moby_rom,
"platform_id": rom.platform_id,
"moby_url_cover": moby_rom.pop("url_cover", ""),
**merged_dict.get(moby_name, {}),
}
for ss_rom in ss_matched_roms:
ss_name = ss_rom.get("name", "")
if ss_name:
if ss_rom["ss_id"]:
ss_name = meta_ss_handler.normalize_search_term(
ss_rom.get("name", ""),
remove_articles=False,
)
merged_dict[ss_name] = {
**ss_rom,
"platform_id": rom.platform_id,
"ss_url_cover": ss_rom.pop("url_cover", ""),
**merged_dict.get(ss_name, {}),
}
matched_roms = [
{
**{
"slug": "",
"name": "",
"summary": "",
"igdb_url_cover": "",
"moby_url_cover": "",
"ss_url_cover": "",
"platform_id": rom.platform_id,
},
**item,
}
for item in list(merged_dict.values())
]
async def get_sgdb_rom(name: str) -> tuple[str, SGDBRom]:
return name, await meta_sgdb_handler.get_details_by_names([name])
sgdb_roms = await asyncio.gather(
*[get_sgdb_rom(name) for name in list(merged_dict.keys())]
)
for name, sgdb_rom in sgdb_roms:
if sgdb_rom["sgdb_id"]:
merged_dict[name] = {
**merged_dict[name],
"sgdb_id": sgdb_rom.get("sgdb_id", ""),
"sgdb_url_cover": sgdb_rom.get("url_cover", ""),
}
matched_roms = list(merged_dict.values())
log.info("Results:")
for m_rom in matched_roms:

View File

@@ -7,12 +7,14 @@ export type SearchRomSchema = {
igdb_id?: (number | null);
moby_id?: (number | null);
ss_id?: (number | null);
sgdb_id?: (number | null);
slug: string;
name: string;
summary: string;
igdb_url_cover?: string;
moby_url_cover?: string;
ss_url_cover?: string;
sgdb_url_cover?: string;
platform_id: number;
};

View File

@@ -215,6 +215,7 @@ onBeforeUnmount(() => {
: rom.igdb_url_cover ||
rom.moby_url_cover ||
rom.ss_url_cover ||
rom.sgdb_url_cover ||
fallbackCoverImage)
"
:aspect-ratio="computedAspectRatio"
@@ -228,7 +229,8 @@ onBeforeUnmount(() => {
(!romsStore.isSimpleRom(rom) &&
!rom.igdb_url_cover &&
!rom.moby_url_cover &&
!rom.ss_url_cover)
!rom.ss_url_cover &&
!rom.sgdb_url_cover)
"
class="translucent-dark text-white"
:class="

View File

@@ -18,7 +18,7 @@ import { getMissingCoverImage } from "@/utils/covers";
type MatchedSource = {
url_cover: string | undefined;
name: "IGDB" | "Mobygames" | "Screenscraper";
name: "IGDB" | "Mobygames" | "Screenscraper" | "SteamGridDB";
logo_path: string;
};
@@ -146,27 +146,34 @@ function showSources(matchedRom: SearchRomSchema) {
showSelectSource.value = true;
selectedMatchRom.value = matchedRom;
sources.value = [];
if (matchedRom.igdb_url_cover || matchedRom.igdb_id) {
if (matchedRom.igdb_url_cover) {
sources.value.push({
url_cover: matchedRom.igdb_url_cover,
name: "IGDB",
logo_path: "/assets/scrappers/igdb.png",
});
}
if (matchedRom.moby_url_cover || matchedRom.moby_id) {
if (matchedRom.moby_url_cover) {
sources.value.push({
url_cover: matchedRom.moby_url_cover,
name: "Mobygames",
logo_path: "/assets/scrappers/moby.png",
});
}
if (matchedRom.ss_url_cover || matchedRom.ss_id) {
if (matchedRom.ss_url_cover) {
sources.value.push({
url_cover: matchedRom.ss_url_cover,
name: "Screenscraper",
logo_path: "/assets/scrappers/ss.png",
});
}
if (matchedRom.sgdb_url_cover) {
sources.value.push({
url_cover: matchedRom.sgdb_url_cover,
name: "SteamGridDB",
logo_path: "/assets/scrappers/sgdb.png",
});
}
if (sources.value.length == 1) {
selectedCover.value = sources.value[0];
}