diff --git a/scripts/scraper/base_scraper.py b/scripts/scraper/base_scraper.py index b106f44e..0f5497ef 100644 --- a/scripts/scraper/base_scraper.py +++ b/scripts/scraper/base_scraper.py @@ -22,6 +22,7 @@ class BiosRequirement: destination: str = "" required: bool = True zipped_file: str | None = None # If set, md5 is for this ROM inside the ZIP + native_id: str | None = None # Original system name before normalization @dataclass @@ -199,7 +200,11 @@ def scraper_cli(scraper_class: type, description: str = "Scrape BIOS requirement config = {"systems": {}} for req in reqs: sys_id = req.system - config["systems"].setdefault(sys_id, {"files": []}) + if sys_id not in config["systems"]: + sys_entry: dict = {"files": []} + if req.native_id: + sys_entry["native_id"] = req.native_id + config["systems"][sys_id] = sys_entry entry = {"name": req.name, "destination": req.destination or req.name, "required": req.required} if req.sha1: entry["sha1"] = req.sha1 diff --git a/scripts/scraper/batocera_scraper.py b/scripts/scraper/batocera_scraper.py index 935283c4..63608e31 100644 --- a/scripts/scraper/batocera_scraper.py +++ b/scripts/scraper/batocera_scraper.py @@ -265,6 +265,7 @@ class Scraper(BaseScraper): destination=file_path, required=True, zipped_file=zipped_file or None, + native_id=sys_key, )) return requirements @@ -284,7 +285,10 @@ class Scraper(BaseScraper): systems = {} for req in requirements: if req.system not in systems: - systems[req.system] = {"files": []} + sys_entry: dict = {"files": []} + if req.native_id: + sys_entry["native_id"] = req.native_id + systems[req.system] = sys_entry entry = { "name": req.name, diff --git a/scripts/scraper/libretro_scraper.py b/scripts/scraper/libretro_scraper.py index 89f2ed41..0be69eef 100644 --- a/scripts/scraper/libretro_scraper.py +++ b/scripts/scraper/libretro_scraper.py @@ -112,7 +112,8 @@ class Scraper(BaseScraper): requirements = [] for rom in roms: - system_slug = SYSTEM_SLUG_MAP.get(rom.system, rom.system.lower().replace(" ", "-")) + native_system = rom.system + system_slug = SYSTEM_SLUG_MAP.get(native_system, native_system.lower().replace(" ", "-")) destination = rom.name name = rom.name.split("/")[-1] if "/" in rom.name else rom.name @@ -130,6 +131,7 @@ class Scraper(BaseScraper): size=rom.size or None, destination=destination, required=True, + native_id=native_system, )) return requirements @@ -223,7 +225,9 @@ class Scraper(BaseScraper): systems = {} for req in requirements: if req.system not in systems: - system_entry = {"files": []} + system_entry: dict = {"files": []} + if req.native_id: + system_entry["native_id"] = req.native_id if req.system in core_meta: cm = core_meta[req.system] if cm.get("core"): diff --git a/scripts/scraper/recalbox_scraper.py b/scripts/scraper/recalbox_scraper.py index e551ac0a..49267e89 100644 --- a/scripts/scraper/recalbox_scraper.py +++ b/scripts/scraper/recalbox_scraper.py @@ -147,6 +147,7 @@ class Scraper(BaseScraper): md5=all_md5, destination=primary_path, required=mandatory, + native_id=platform, )) return requirements @@ -203,7 +204,10 @@ class Scraper(BaseScraper): systems = {} for req in requirements: if req.system not in systems: - systems[req.system] = {"files": []} + sys_entry: dict = {"files": []} + if req.native_id: + sys_entry["native_id"] = req.native_id + systems[req.system] = sys_entry entry = { "name": req.name, diff --git a/tests/test_e2e.py b/tests/test_e2e.py index 6d862807..07210f93 100644 --- a/tests/test_e2e.py +++ b/tests/test_e2e.py @@ -3013,5 +3013,40 @@ class TestE2E(unittest.TestCase): self.assertEqual(hm["scraped_md5"], "scraped_hash") + # --------------------------------------------------------------- + # native_id preservation + # --------------------------------------------------------------- + + def test_native_id_preserved_in_platform_config(self): + """load_platform_config preserves native_id at the system level.""" + config = { + "platform": "TestNativeId", + "verification_mode": "existence", + "base_destination": "system", + "systems": { + "sony-playstation": { + "native_id": "Sony - PlayStation", + "files": [ + {"name": "scph5501.bin", "destination": "scph5501.bin", "required": True}, + ], + }, + "nintendo-snes": { + "native_id": "snes", + "files": [ + {"name": "bs-x.bin", "destination": "bs-x.bin", "required": False}, + ], + }, + }, + } + with open(os.path.join(self.platforms_dir, "test_native_id.yml"), "w") as fh: + yaml.dump(config, fh) + + loaded = load_platform_config("test_native_id", self.platforms_dir) + psx = loaded["systems"]["sony-playstation"] + self.assertEqual(psx["native_id"], "Sony - PlayStation") + snes = loaded["systems"]["nintendo-snes"] + self.assertEqual(snes["native_id"], "snes") + + if __name__ == "__main__": unittest.main()