From 529cb8a915a28891b59b1d725bfa163d491e0674 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 30 Mar 2026 17:35:39 +0200 Subject: [PATCH] fix: recalbox paths from scrape, batocera md5 fallback from scrape --- scripts/exporter/batocera_exporter.py | 13 +++++++++++++ scripts/exporter/recalbox_exporter.py | 25 ++++++++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/scripts/exporter/batocera_exporter.py b/scripts/exporter/batocera_exporter.py index b0ab90a4..11d97078 100644 --- a/scripts/exporter/batocera_exporter.py +++ b/scripts/exporter/batocera_exporter.py @@ -47,7 +47,18 @@ class Exporter(BaseExporter): scraped_sys = scraped_data.get("systems", {}).get(sys_id) if scraped_data else None display_name = self._display_name(sys_id, scraped_sys) + # Build md5 lookup from scraped data for this system + scraped_md5: dict[str, str] = {} + if scraped_data: + s_sys = scraped_data.get("systems", {}).get(sys_id, {}) + for sf in s_sys.get("files", []): + sname = sf.get("name", "").lower() + smd5 = sf.get("md5", "") + if sname and smd5: + scraped_md5[sname] = smd5 + # Build biosFiles entries as compact single-line dicts + # Original format ALWAYS has md5 — use scraped md5 as fallback bios_parts: list[str] = [] for fe in files: name = fe.get("name", "") @@ -57,6 +68,8 @@ class Exporter(BaseExporter): md5 = fe.get("md5", "") if isinstance(md5, list): md5 = md5[0] if md5 else "" + if not md5: + md5 = scraped_md5.get(name.lower(), "") entry_parts = [] if md5: diff --git a/scripts/exporter/recalbox_exporter.py b/scripts/exporter/recalbox_exporter.py index cfc94c00..843471a3 100644 --- a/scripts/exporter/recalbox_exporter.py +++ b/scripts/exporter/recalbox_exporter.py @@ -56,14 +56,26 @@ class Exporter(BaseExporter): lines.append(f' ') + # Build path lookup from scraped data for this system + scraped_paths: dict[str, str] = {} + if scraped_data: + s_sys = scraped_data.get("systems", {}).get(sys_id, {}) + for sf in s_sys.get("files", []): + sname = sf.get("name", "").lower() + spath = sf.get("destination", sf.get("name", "")) + if sname and spath: + scraped_paths[sname] = spath + for fe in files: name = fe.get("name", "") if name.startswith("_") or self._is_pattern(name): continue - dest = self._dest(fe) - # Recalbox paths include system prefix - path = f"{native_id}/{dest}" if "/" not in dest else dest + # Use scraped path when available (preserves original format) + path = scraped_paths.get(name.lower()) + if not path: + dest = self._dest(fe) + path = f"{native_id}/{dest}" if "/" not in dest else dest md5 = fe.get("md5", "") if isinstance(md5, list): @@ -103,9 +115,8 @@ class Exporter(BaseExporter): for bios_el in root.iter("bios"): path = bios_el.get("path", "") if path: - exported_paths.add(path) - # Also index basename - exported_paths.add(path.split("/")[-1]) + exported_paths.add(path.lower()) + exported_paths.add(path.split("/")[-1].lower()) issues: list[str] = [] for sys_data in truth_data.get("systems", {}).values(): @@ -114,6 +125,6 @@ class Exporter(BaseExporter): if name.startswith("_") or self._is_pattern(name): continue dest = self._dest(fe) - if name not in exported_paths and dest not in exported_paths: + if name.lower() not in exported_paths and dest.lower() not in exported_paths: issues.append(f"missing: {name}") return issues