From 851a14e49aad8ba98c437293401a57d4369fb682 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Tue, 17 Mar 2026 11:38:52 +0100 Subject: [PATCH] add retrobat platform support (scraper, config, verify) --- README.md | 73 +- database.json | 23 +- platforms/_registry.yml | 9 + platforms/retrobat.yml | 1401 +++++++++++++++++++++++++++ scripts/generate_pack.py | 3 +- scripts/scraper/retrobat_scraper.py | 216 +++++ 6 files changed, 1689 insertions(+), 36 deletions(-) create mode 100644 platforms/retrobat.yml create mode 100644 scripts/scraper/retrobat_scraper.py diff --git a/README.md b/README.md index 0cae85ed..be8276b8 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Complete, verified collection of BIOS, firmware, and system files for retrogaming emulators - RetroArch, Batocera, Recalbox, Lakka, RetroPie, and more. Every file checked against official checksums from [libretro System.dat](https://github.com/libretro/libretro-database), [batocera-systems](https://github.com/batocera-linux/batocera.linux), and [Recalbox es_bios.xml](https://gitlab.com/recalbox/recalbox). -> **6285** files | **2715.9 MB** | Last updated: 2026-03-17T08:46:20Z +> **6285** files | **2715.9 MB** | Last updated: 2026-03-17T10:36:15Z > > PlayStation, PS2, Nintendo DS, Game Boy, GBA, Dreamcast, Saturn, Neo Geo, Mega CD, PC Engine, MSX, Amiga, Atari ST, ZX Spectrum, Arcade (MAME/FBNeo), and 50+ systems. @@ -49,6 +49,7 @@ python scripts/generate_pack.py --all --include-archived --output-dir ~/Download | Lakka | 398/398 (100.0%) | ![Lakka 100%](https://img.shields.io/badge/Lakka-100%25-brightgreen) 🟢 | existence | 398 present | | Recalbox | 346/346 (100.0%) | ![Recalbox 100%](https://img.shields.io/badge/Recalbox-100%25-brightgreen) 🟢 | md5 | 337 verified, 9 untested | | RetroArch | 398/398 (100.0%) | ![RetroArch 100%](https://img.shields.io/badge/RetroArch-100%25-brightgreen) 🟢 | existence | 398 present | +| RetroBat | 223/343 (65.0%) | ![RetroBat 65%](https://img.shields.io/badge/RetroBat-65%25-red) 🔴 | md5 | 218 verified, 5 untested, 120 missing | | RetroPie | 398/398 (100.0%) | ![RetroPie](https://img.shields.io/badge/RetroPie-archived-lightgrey) 📦 | existence | 398 present *(archived - generate manually)* | ## Systems @@ -1435,7 +1436,7 @@ These are large asset packs required by specific cores. They are included in the - MD5: `2c66f5911e5b42b8ebe113403548eee7` - CRC32: `3aa93ef3` - Also known as: `boot.rom`, `coleco.rom`, `colecovision.rom` - - Platform names: Batocera: `adam.zip`, Batocera: `colecovision.rom`, Lakka: `colecovision.rom`, Recalbox: `coleco.rom`, Recalbox: `boot.rom`, RetroArch: `colecovision.rom`, RetroPie: `colecovision.rom` + - Platform names: Batocera: `adam.zip`, Batocera: `colecovision.rom`, Lakka: `colecovision.rom`, Recalbox: `coleco.rom`, Recalbox: `boot.rom`, RetroArch: `colecovision.rom`, RetroBat: `colecovision.rom`, RetroBat: `coleco.rom`, RetroPie: `colecovision.rom` ### Commodore/Amiga @@ -1631,8 +1632,8 @@ These are large asset packs required by specific cores. They are included in the - SHA1: `e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e` - MD5: `fd91edce7be5e7c2d88e46b76956a8aa` - CRC32: `17893a42` - - Also known as: `d64rom2.rom`, `d64tano2.rom` - - Platform names: Recalbox: `d64rom2.rom`, Recalbox: `d64tano2.rom` + - Also known as: `d64_2.rom`, `d64rom2.rom`, `d64tano2.rom` + - Platform names: Recalbox: `d64rom2.rom`, Recalbox: `d64tano2.rom`, RetroBat: `d64_2.rom` - **[d32.rom](bios/Dragon/Dragon/d32.rom)** (16,384 bytes) - SHA1: `f2dab125673e653995a83bf6b793e3390ec7f65a` - MD5: `3420b96031078a4ef408cad7bf21a33f` @@ -1647,6 +1648,8 @@ These are large asset packs required by specific cores. They are included in the - SHA1: `f119506eaa3b4b70b9aa0dd83761e8cbe043d042` - MD5: `5f0bee59710e55f5880e74890912ed78` - CRC32: `60a4634c` + - Also known as: `d64_1.rom` + - Platform names: RetroBat: `d64_1.rom` - **[ddos10.rom](bios/Dragon/Dragon/ddos10.rom)** (8,192 bytes) - SHA1: `a8918c71d319237c1e3155bb38620acb114a80bc` - MD5: `1c965da49b6c5459b8353630aa1482e7` @@ -2081,8 +2084,8 @@ These are large asset packs required by specific cores. They are included in the - SHA1: `9d789166e3caf28e4742fe933d962e99618c633d` - MD5: `6f69cc8b5ed761b03afd78000dfb0e19` - CRC32: `0e84505d` - - Also known as: `FMPAC.rom` - - Platform names: Recalbox: `FMPAC.rom` + - Also known as: `FMPAC.rom`, `fmpac.rom` + - Platform names: Recalbox: `FMPAC.rom`, RetroBat: `fmpac.rom` - **[FMPAC16.ROM](bios/Microsoft/MSX/FMPAC16.ROM)** (16,384 bytes) - SHA1: `2dc4517ebd5a061f9b5aa6b449cc4d4a2073540c` - MD5: `af8537262df8df267072f359399a7635` @@ -2116,7 +2119,7 @@ These are large asset packs required by specific cores. They are included in the - MD5: `acf53887c2d2783dc059a9b442c86b90` - CRC32: `1f6406fb` - Also known as: `fs-a1gt_kanjifont.rom`, `fs-a1wsx_kanjifont.rom` - - Platform names: Batocera: `fs-a1gt_kanjifont.rom`, Batocera: `fs-a1wsx_kanjifont.rom` + - Platform names: Batocera: `fs-a1gt_kanjifont.rom`, Batocera: `fs-a1wsx_kanjifont.rom`, RetroBat: `fs-a1wsx_kanjifont.rom`, RetroBat: `fs-a1gt_kanjifont.rom` - **[KOREAN.FNT](bios/Microsoft/MSX/KOREAN.FNT)** (2,048 bytes) - SHA1: `0ef27e3599370e179b6fceaa22431fb97f5e7e61` - MD5: `73291e76638a2f5aa2eceb843df468f4` @@ -2130,7 +2133,7 @@ These are large asset packs required by specific cores. They are included in the - MD5: `42af93619160ef2116416f74a6cb12f2` - CRC32: `2a9d8d43` - Also known as: `yrw801.rom` - - Platform names: Batocera: `yrw801.rom` + - Platform names: Batocera: `yrw801.rom`, RetroBat: `yrw801.rom` - **[MSX.ROM](bios/Microsoft/MSX/MSX.ROM)** (32,768 bytes) - SHA1: `409e82adac40f6bdd18eb6c84e8b2fbdc7fb5498` - MD5: `aa95aea2563cd5ec0a0919b44cc17d47` @@ -2143,13 +2146,13 @@ These are large asset packs required by specific cores. They are included in the - MD5: `364a1a579fe5cb8dba54519bcfcdac0d` - CRC32: `a317e6b4` - Also known as: `MSX.rom` - - Platform names: Batocera: `MSX.ROM`, Recalbox: `MSX.rom` + - Platform names: Batocera: `MSX.ROM`, Recalbox: `MSX.rom`, RetroBat: `MSX.ROM` - **[MSX2.ROM](bios/Microsoft/MSX/MSX2.ROM)** (32,768 bytes) - SHA1: `6103b39f1e38d1aa2d84b1c3219c44f1abb5436e` - MD5: `ec3a01c91f24fbddcbcab0ad301bc9ef` - CRC32: `6cdaf3a5` - - Also known as: `MSX2.rom` - - Platform names: Recalbox: `MSX2.rom` + - Also known as: `MSX2.rom`, `nms8245_basic-bios2.rom` + - Platform names: Recalbox: `MSX2.rom`, RetroBat: `nms8245_basic-bios2.rom` - **[MSX2AR.ROM](bios/Microsoft/MSX/MSX2AR.ROM)** (32,768 bytes) - SHA1: `35195ab67c289a0b470883464df66bc6ea5b00d3` - MD5: `91764e84f977671ac7caa50b36273fd2` @@ -2219,13 +2222,13 @@ These are large asset packs required by specific cores. They are included in the - MD5: `847cc025ffae665487940ff2639540e5` - CRC32: `19771608` - Also known as: `MSX2P.rom` - - Platform names: Recalbox: `MSX2P.rom` + - Platform names: Recalbox: `MSX2P.rom`, RetroBat: `MSX2P.ROM` - **[MSX2PEXT.ROM](bios/Microsoft/MSX/MSX2PEXT.ROM)** (16,384 bytes) - SHA1: `fe0254cbfc11405b79e7c86c7769bd6322b04995` - MD5: `7c8243c71d8f143b2531f01afa6a05dc` - CRC32: `b8ba44d3` - Also known as: `MSX2PEXT.rom`, `fs-a1wsx_msx2psub.rom` - - Platform names: Batocera: `fs-a1wsx_msx2psub.rom`, Recalbox: `MSX2PEXT.rom` + - Platform names: Batocera: `fs-a1wsx_msx2psub.rom`, Recalbox: `MSX2PEXT.rom`, RetroBat: `fs-a1wsx_msx2psub.rom` - **[MSX2PMUS.rom](bios/Microsoft/MSX/MSX2PMUS.rom)** (16,384 bytes) - SHA1: `6354ccc5c100b1c558c9395fa8c00784d2e9b0a3` - MD5: `f877f32e6d8687474ac5ee83e40de23b` @@ -2291,7 +2294,7 @@ These are large asset packs required by specific cores. They are included in the - MD5: `9dfdebfaa6b547222a40aab8bb2e29f8` - CRC32: `b4fc574d` - Also known as: `fs-a1wsx_kanjibasic.rom` - - Platform names: Batocera: `fs-a1wsx_kanjibasic.rom` + - Platform names: Batocera: `fs-a1wsx_kanjibasic.rom`, RetroBat: `fs-a1wsx_kanjibasic.rom` - **[MSXKR.rom](bios/Microsoft/MSX/MSXKR.rom)** (32,768 bytes) - SHA1: `171b587bd5a947a13f3114120b6e7baca3b57d78` - MD5: `c84f362c44192659273d45ae97462362` @@ -2342,6 +2345,8 @@ These are large asset packs required by specific cores. They are included in the - SHA1: `78cd7f847e77fd8cd51a647efb2725ba93f4c471` - MD5: `86269da485e852d9f581ac27f4ba32ff` - CRC32: `1e7d6512` + - Also known as: `fs-5500_disk.rom` + - Platform names: RetroBat: `fs-5500_disk.rom` - **[NOVAXIS.rom](bios/Microsoft/MSX/NOVAXIS.rom)** (16,384 bytes) - SHA1: `352ec8c99fe1397a88ecb3aee6dbb4d121c818e9` - MD5: `20989124671593ab04eeb01d52a1e25c` @@ -2359,7 +2364,7 @@ These are large asset packs required by specific cores. They are included in the - MD5: `00aa02b6077de40a0b51d71a3c3e1d5f` - CRC32: `17fa392b` - Also known as: `fs-a1wsx_disk.rom` - - Platform names: Batocera: `fs-a1wsx_disk.rom` + - Platform names: Batocera: `fs-a1wsx_disk.rom`, RetroBat: `fs-a1wsx_disk.rom` - **[PHILIPSDISK.rom](bios/Microsoft/MSX/PHILIPSDISK.rom)** (16,384 bytes) - SHA1: `c3efedda7ab947a06d9345f7b8261076fa7ceeef` - MD5: `01dd1d72ed9bb6afe8a9b441c198a1cd` @@ -3514,8 +3519,8 @@ These are large asset packs required by specific cores. They are included in the - SHA1: `e4fc7560b69d062cb2da5b1ffbe11cd1ca03cc37` - MD5: `20a0334c447cb069a040ae5be1d938df` - CRC32: `42f124b0` - - Also known as: `apple2gs1.rom` - - Platform names: Recalbox: `apple2gs1.rom` + - Also known as: `APPLE2GS.ROM`, `apple2gs1.rom` + - Platform names: Recalbox: `apple2gs1.rom`, RetroBat: `APPLE2GS.ROM` - **[SOUND.ROM](bios/NEC/PC-98/SOUND.ROM)** (16,384 bytes) - SHA1: `34137c287c39c44300b04ee97c1e6459bb826b60` - MD5: `caf90f22197aed6f14c471c21e64658d` @@ -3762,7 +3767,7 @@ These are large asset packs required by specific cores. They are included in the - MD5: `32fbbd84168d3482956eb3c5051637f5` - CRC32: `59c8598e` - Also known as: `gb_bios.bin` - - Platform names: Batocera: `gb_bios.bin`, Lakka: `dmg_boot.bin`, Lakka: `gb_bios.bin`, Recalbox: `gb_bios.bin`, RetroArch: `dmg_boot.bin`, RetroArch: `gb_bios.bin`, RetroPie: `dmg_boot.bin`, RetroPie: `gb_bios.bin` + - Platform names: Batocera: `gb_bios.bin`, Lakka: `dmg_boot.bin`, Lakka: `gb_bios.bin`, Recalbox: `gb_bios.bin`, RetroArch: `dmg_boot.bin`, RetroArch: `gb_bios.bin`, RetroBat: `gb_bios.bin`, RetroPie: `dmg_boot.bin`, RetroPie: `gb_bios.bin` - **[mgb_boot.bin](bios/Nintendo/Game%20Boy/mgb_boot.bin)** (256 bytes) - SHA1: `9817bdae9335a3accb584f77c165dc5726555d1f` - MD5: `df79723ee8093b0580496f3df436e4c4` @@ -3880,8 +3885,8 @@ These are large asset packs required by specific cores. They are included in the - SHA1: `bf861922dcb78c316360e3e742f4f70ff63c9bc3` - MD5: `8d3d9f294b6e174bc7b1d2fd1c727530` - CRC32: `7f933ce2` - - Also known as: `IPL.n64` - - Platform names: Recalbox: `IPL.n64` + - Also known as: `IPL.n64`, `IPL_JAP.n64` + - Platform names: Recalbox: `IPL.n64`, RetroBat: `IPL_JAP.n64` ### Nintendo/Nintendo DS @@ -3890,13 +3895,13 @@ These are large asset packs required by specific cores. They are included in the - MD5: `559dae4ea78eb9d67702c56c1d791e81` - CRC32: `9f1840d9` - Also known as: `dsi_bios7.bin` - - Platform names: Batocera: `dsi_bios7.bin` + - Platform names: Batocera: `dsi_bios7.bin`, RetroBat: `dsi_bios7.bin` - **[biosdsi9.bin](bios/Nintendo/Nintendo%20DS/biosdsi9.bin)** (65,536 bytes) - SHA1: `7bf549b8be9e48ab0cdc9b0fdadd49a5131f97eb` - MD5: `87b665fce118f76251271c3732532777` - CRC32: `3d64d498` - Also known as: `dsi_bios9.bin` - - Platform names: Batocera: `dsi_bios9.bin` + - Platform names: Batocera: `dsi_bios9.bin`, RetroBat: `dsi_bios9.bin` - **[choose-your-dsi-sd-images-size.zip](bios/Nintendo/Nintendo%20DS/choose-your-dsi-sd-images-size.zip)** (3,518,551 bytes) - SHA1: `f1ad917e0affaeb8d2114c7ecd02b9f938c3cbd9` - MD5: `bfd8292fbf0a251647a23c5cb310a97a` @@ -3938,13 +3943,13 @@ These are large asset packs required by specific cores. They are included in the - MD5: `df692a80a5b1bc90728bc3dfc76cd948` - CRC32: `1280f0d5` - Also known as: `bios7.bin` - - Platform names: Batocera: `bios7.bin`, Lakka: `bios7.bin`, Recalbox: `bios7.bin`, RetroArch: `bios7.bin`, RetroPie: `bios7.bin` + - Platform names: Batocera: `bios7.bin`, Lakka: `bios7.bin`, Recalbox: `bios7.bin`, RetroArch: `bios7.bin`, RetroBat: `bios7.bin`, RetroPie: `bios7.bin` - **[nds9.bin](bios/Nintendo/Nintendo%20DS/nds9.bin)** (4,096 bytes) - SHA1: `bfaac75f101c135e32e2aaf541de6b1be4c8c62d` - MD5: `a392174eb3e572fed6447e956bde4b25` - CRC32: `2ab23573` - Also known as: `bios9.bin` - - Platform names: Batocera: `bios9.bin`, Lakka: `bios9.bin`, Recalbox: `bios9.bin`, RetroArch: `bios9.bin`, RetroPie: `bios9.bin` + - Platform names: Batocera: `bios9.bin`, Lakka: `bios9.bin`, Recalbox: `bios9.bin`, RetroArch: `bios9.bin`, RetroBat: `bios9.bin`, RetroPie: `bios9.bin` ### Nintendo/Pokemon Mini @@ -4065,25 +4070,25 @@ These are large asset packs required by specific cores. They are included in the - MD5: `d574d4f9c12f305074798f54c091a8b4` - CRC32: `ec8a83b9` - Also known as: `sgb1.boot.rom`, `sgb_bios.bin` - - Platform names: Batocera: `sgb_bios.bin`, Batocera: `sgb_boot.bin`, Lakka: `sgb1.boot.rom`, Lakka: `sgb_bios.bin`, Recalbox: `sgb_bios.bin`, RetroArch: `sgb1.boot.rom`, RetroArch: `sgb_bios.bin`, RetroPie: `sgb1.boot.rom`, RetroPie: `sgb_bios.bin` + - Platform names: Batocera: `sgb_bios.bin`, Batocera: `sgb_boot.bin`, Lakka: `sgb1.boot.rom`, Lakka: `sgb_bios.bin`, Recalbox: `sgb_bios.bin`, RetroArch: `sgb1.boot.rom`, RetroArch: `sgb_bios.bin`, RetroBat: `sgb_boot.bin`, RetroPie: `sgb1.boot.rom`, RetroPie: `sgb_bios.bin` - **[sgb1.program.rom](bios/Nintendo/Super%20Game%20Boy/sgb1.program.rom)** (262,144 bytes) - SHA1: `973e10840db683cf3faf61bd443090786b3a9f04` - MD5: `b15ddb15721c657d82c5bab6db982ee9` - CRC32: `8a4a174f` - Also known as: `SGB1.sfc`, `SGB1.sfc/program.rom` - - Platform names: Batocera: `SGB1.sfc`, Lakka: `SGB1.sfc`, Recalbox: `SGB1.sfc`, RetroArch: `SGB1.sfc`, RetroPie: `SGB1.sfc` + - Platform names: Batocera: `SGB1.sfc`, Lakka: `SGB1.sfc`, Recalbox: `SGB1.sfc`, RetroArch: `SGB1.sfc`, RetroBat: `SGB1.sfc`, RetroPie: `SGB1.sfc` - **[sgb2.boot.rom](bios/Nintendo/Super%20Game%20Boy/sgb2.boot.rom)** (256 bytes) - SHA1: `93407ea10d2f30ab96a314d8eca44fe160aea734` - MD5: `e0430bca9925fb9882148fd2dc2418c1` - CRC32: `53d0dd63` - Also known as: `sgb2_bios.bin` - - Platform names: Batocera: `sgb2_boot.bin`, Lakka: `sgb2_bios.bin`, RetroArch: `sgb2_bios.bin`, RetroPie: `sgb2_bios.bin` + - Platform names: Batocera: `sgb2_boot.bin`, Lakka: `sgb2_bios.bin`, RetroArch: `sgb2_bios.bin`, RetroBat: `sgb2_boot.bin`, RetroPie: `sgb2_bios.bin` - **[sgb2.program.rom](bios/Nintendo/Super%20Game%20Boy/sgb2.program.rom)** (524,288 bytes) - SHA1: `e5b2922ca137051059e4269b236d07a22c07bc84` - MD5: `8ecd73eb4edf7ed7e81aef1be80031d5` - CRC32: `cb176e45` - Also known as: `SGB2.sfc`, `SGB2.sfc/program.rom` - - Platform names: Batocera: `SGB2.sfc`, Lakka: `SGB2.sfc`, Recalbox: `SGB2.sfc`, RetroArch: `SGB2.sfc`, RetroPie: `SGB2.sfc` + - Platform names: Batocera: `SGB2.sfc`, Lakka: `SGB2.sfc`, Recalbox: `SGB2.sfc`, RetroArch: `SGB2.sfc`, RetroBat: `SGB2.sfc`, RetroPie: `SGB2.sfc` - **[sgb2_boot.bin](bios/Nintendo/Super%20Game%20Boy/sgb2_boot.bin)** (256 bytes) - SHA1: `f282b3aaf98f8423dab7d77f1aa0192be630f2fb` - MD5: `6d507dcf3b61ce45a5717421cdd0ae95` @@ -14745,7 +14750,7 @@ These are large asset packs required by specific cores. They are included in the - SHA1: `fc398ab4e13ca6bfef3366ed3391b1050e0eb5e8` - MD5: `dffb72f116d36d025068b23970a4f6df` - CRC32: `362e948d` - - Platform names: Batocera: `neogeo.zip` + - Platform names: Batocera: `neogeo.zip`, RetroBat: `neogeo.zip` ### SNK/Neo Geo CD @@ -15025,7 +15030,7 @@ These are large asset packs required by specific cores. They are included in the - SHA1: `5adb6c3af218c60868e6b723ec47e36bbdf5e6f0` - MD5: `854b9150240a198070150e4566ae1290` - CRC32: `9f6f6276` - - Platform names: Batocera: `bios_CD_U.bin` + - Platform names: Batocera: `bios_CD_U.bin`, RetroBat: `bios_CD_U.bin` - **[jp_mcd1_9112.bin](bios/Sega/Mega%20CD/jp_mcd1_9112.bin)** (131,072 bytes) - SHA1: `e4193c6ae44c3cea002707d2a88f1fbcced664de` - MD5: `bdeb4c47da613946d422d97d98b21cda` @@ -15103,7 +15108,7 @@ These are large asset packs required by specific cores. They are included in the - MD5: `af5828fdff51384f99b3c4926be27762` - CRC32: `2aba43c2` - Also known as: `saturn_bios.bin` - - Platform names: Batocera: `saturn_bios.bin`, Lakka: `saturn_bios.bin`, Recalbox: `saturn_bios.bin`, RetroArch: `saturn_bios.bin`, RetroPie: `saturn_bios.bin` + - Platform names: Batocera: `saturn_bios.bin`, Lakka: `saturn_bios.bin`, Recalbox: `saturn_bios.bin`, RetroArch: `saturn_bios.bin`, RetroBat: `saturn_bios.bin`, RetroPie: `saturn_bios.bin` - **[sega_100a.bin](bios/Sega/Saturn/sega_100a.bin)** (524,288 bytes) - SHA1: `3bb41feb82838ab9a35601ac666de5aacfd17a58` - MD5: `f273555d7d91e8a5a6bfd9bcf066331c` @@ -15171,12 +15176,12 @@ These are large asset packs required by specific cores. They are included in the - SHA1: `44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3` - MD5: `56c28adcf1f3a2f87cf3d57c378013f5` - CRC32: `2e8b767c` - - Platform names: Batocera: `iplrom.x1t` + - Platform names: Batocera: `iplrom.x1t`, RetroBat: `iplrom.x1t` - **[iplrom.x1](bios/Sharp/X1/iplrom.x1)** (4,096 bytes) - SHA1: `d3395e9aeb5b8bbba7654dd471bcd8af228ee69a` - MD5: `eeeea1cd29c6e0e8b094790ae969bfa7` - CRC32: `e70011d3` - - Platform names: Batocera: `IPLROM.X1`, Recalbox: `IPLROM.X1` + - Platform names: Batocera: `IPLROM.X1`, Recalbox: `IPLROM.X1`, RetroBat: `IPLROM.X1` - **[iplrom.x1t](bios/Sharp/X1/iplrom.x1t)** (2,048 bytes) - SHA1: `1c1a0d8c9f4c446ccd7470516b215ddca5052fb2` - MD5: `851e4a5936f17d13f8c39a980cf00d77` @@ -16150,4 +16155,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on submitting BIOS files. This repository provides BIOS files for personal backup and archival purposes. -*Auto-generated on 2026-03-17T08:46:20Z* +*Auto-generated on 2026-03-17T10:36:15Z* diff --git a/database.json b/database.json index ae148f95..3e69f939 100644 --- a/database.json +++ b/database.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-03-17T08:46:20Z", + "generated_at": "2026-03-17T10:36:15Z", "total_files": 6285, "total_size": 2847791495, "files": { @@ -81027,6 +81027,9 @@ "apple2gs1.rom": [ "e4fc7560b69d062cb2da5b1ffbe11cd1ca03cc37" ], + "APPLE2GS.ROM": [ + "e4fc7560b69d062cb2da5b1ffbe11cd1ca03cc37" + ], "apple2gs3.rom": [ "bc32bc0e8902946663998f56aea52be597d9e361" ], @@ -81042,6 +81045,9 @@ "FMPAC.rom": [ "9d789166e3caf28e4742fe933d962e99618c633d" ], + "fmpac.rom": [ + "9d789166e3caf28e4742fe933d962e99618c633d" + ], "MSX.rom": [ "e998f0c441f4f1800ef44e42cd1659150206cf79", "409e82adac40f6bdd18eb6c84e8b2fbdc7fb5498" @@ -81049,6 +81055,9 @@ "MSX2.rom": [ "6103b39f1e38d1aa2d84b1c3219c44f1abb5436e" ], + "nms8245_basic-bios2.rom": [ + "6103b39f1e38d1aa2d84b1c3219c44f1abb5436e" + ], "MSX2EXT.rom": [ "5c1f9c7fb655e43d38e5dd1fcc6b942b2ff68b02" ], @@ -81064,15 +81073,27 @@ "IPL.n64": [ "bf861922dcb78c316360e3e742f4f70ff63c9bc3" ], + "IPL_JAP.n64": [ + "bf861922dcb78c316360e3e742f4f70ff63c9bc3" + ], "d64rom2.rom": [ "e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e" ], "d64tano2.rom": [ "e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e" ], + "d64_2.rom": [ + "e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e" + ], "d64tano.rom": [ "1983b4fb398e3dd9668d424c666c5a0b3f1e2b69" ], + "d64_1.rom": [ + "f119506eaa3b4b70b9aa0dd83761e8cbe043d042" + ], + "fs-5500_disk.rom": [ + "78cd7f847e77fd8cd51a647efb2725ba93f4c471" + ], "pcfxbios.bin": [ "1a77fd83e337f906aecab27a1604db064cf10074" ], diff --git a/platforms/_registry.yml b/platforms/_registry.yml index 949bc5c9..bcd0cc83 100644 --- a/platforms/_registry.yml +++ b/platforms/_registry.yml @@ -34,6 +34,15 @@ platforms: hash_type: md5 schedule: monthly + retrobat: + config: retrobat.yml + status: active + scraper: retrobat + source_url: "https://raw.githubusercontent.com/RetroBat-Official/emulatorlauncher/master/batocera-systems/Resources/batocera-systems.json" + source_format: json + hash_type: md5 + schedule: weekly + lakka: config: lakka.yml status: active diff --git a/platforms/retrobat.yml b/platforms/retrobat.yml new file mode 100644 index 00000000..5a13f136 --- /dev/null +++ b/platforms/retrobat.yml @@ -0,0 +1,1401 @@ +platform: RetroBat +version: 7.5.3 +homepage: "https://www.retrobat.org" +source: "https://raw.githubusercontent.com/RetroBat-Official/emulatorlauncher/master/batocera-systems/Resources/batocera-systems.json" +base_destination: bios +hash_type: md5 +verification_mode: md5 +systems: + 3do: + files: + - name: panafz1.bin + destination: panafz1.bin + required: true + md5: f47264dd47fe30f73ab3c010015c155b + - name: panafz10.bin + destination: panafz10.bin + required: true + md5: 51f2f43ae2f3508a14d9f56597e2d3ce + - name: goldstar.bin + destination: goldstar.bin + required: true + md5: 8639fd5e549bd6238cfee79e3e749114 + adam: + files: + - name: adam.zip + destination: adam.zip + required: true + - name: adam_ddp.zip + destination: adam_ddp.zip + required: true + - name: adam_fdc.zip + destination: adam_fdc.zip + required: true + - name: adam_kb.zip + destination: adam_kb.zip + required: true + - name: adam_prn.zip + destination: adam_prn.zip + required: true + - name: adam_cart.xml + destination: mame/hash/adam_cart.xml + required: true + - name: adam_cass.xml + destination: mame/hash/adam_cass.xml + required: true + - name: adam_flop.xml + destination: mame/hash/adam_flop.xml + required: true + advision: + files: + - name: advision.zip + destination: advision.zip + required: true + md5: 1c08606408029751fd30ac91d2bf30d5 + - name: advision.xml + destination: mame/hash/advision.xml + required: true + amiga500: + files: + - name: kick33180.A500 + destination: kick33180.A500 + required: true + md5: 85ad74194e87c08904327de1a9443b7a + - name: kick34005.A500 + destination: kick34005.A500 + required: true + md5: 82a21c1890cae844b3df741f2762d48d + - name: kick37175.A500 + destination: kick37175.A500 + required: true + md5: dc10d7bdd1b6f450773dfb558477c230 + amiga1200: + files: + - name: kick40068.A1200 + destination: kick40068.A1200 + required: true + md5: 646773759326fbac3b2311fd8c8793ee + amiga4000: + files: + - name: kick40068.A4000 + destination: kick40068.A4000 + required: true + md5: 9bdedde6a4f33555b4a270c8ca53297d + amigacdtv: + files: + - name: kick40060.CD32.ext + destination: kick40060.CD32.ext + required: true + md5: bb72565701b1b6faece07d68ea5da639 + - name: kick34005.CDTV + destination: kick34005.CDTV + required: true + md5: 89da1838a24460e4b93f4f0c5d92d48d + amigacd32: + files: + - name: kick40060.CD32.ext + destination: kick40060.CD32.ext + required: true + md5: bb72565701b1b6faece07d68ea5da639 + - name: kick40060.CD32 + destination: kick40060.CD32 + required: true + md5: 5f8924d013dd57a89cf349f4cdedc6b1 + apfm1000: + files: + - name: apfm1000.zip + destination: apfm1000.zip + required: true + md5: b197db12f7a13827717bbeb7cfd9542a + - name: apfm1000.xml + destination: mame/hash/apfm1000.xml + required: true + apple2: + files: + - name: apple2.zip + destination: apple2.zip + required: true + - name: apple2e.zip + destination: apple2e.zip + required: true + - name: apple2ee.zip + destination: apple2ee.zip + required: true + - name: apple2p.zip + destination: apple2p.zip + required: true + - name: a2diskiing.zip + destination: a2diskiing.zip + required: true + - name: votrsc01a.zip + destination: votrsc01a.zip + required: true + - name: votrsc01.zip + destination: votrsc01.zip + required: true + - name: d2fdc.zip + destination: d2fdc.zip + required: true + - name: AppleIIe_DiskII.rom + destination: AppleIIe_DiskII.rom + required: true + - name: AppleIIe.rom + destination: AppleIIe.rom + required: true + - name: apple2-int-auto.rom + destination: apple2-int-auto.rom + required: true + - name: apple2-asoft-auto.rom + destination: apple2-asoft-auto.rom + required: true + - name: disk2-13boot.rom + destination: disk2-13boot.rom + required: true + - name: disk2-13seq.rom + destination: disk2-13seq.rom + required: true + - name: disk2-16boot.rom + destination: disk2-16boot.rom + required: true + - name: disk2-16seq.rom + destination: disk2-16seq.rom + required: true + - name: apple2_cass.xml + destination: mame/hash/apple2_cass.xml + required: true + - name: apple2_flop_clcracked.xml + destination: mame/hash/apple2_flop_clcracked.xml + required: true + - name: apple2_flop_misc.xml + destination: mame/hash/apple2_flop_misc.xml + required: true + - name: apple2_flop_orig.xml + destination: mame/hash/apple2_flop_orig.xml + required: true + apple2gs: + files: + - name: APPLE2GS.ROM + destination: APPLE2GS.ROM + required: true + md5: 20a0334c447cb069a040ae5be1d938df + - name: apple2gs.zip + destination: apple2gs.zip + required: true + - name: apple2gs_flop_clcracked.xml + destination: mame/hash/apple2gs_flop_clcracked.xml + required: true + - name: apple2gs_flop_misc.xml + destination: mame/hash/apple2gs_flop_misc.xml + required: true + - name: apple2gs_flop_orig.xml + destination: mame/hash/apple2gs_flop_orig.xml + required: true + aquarius: + files: + - name: aquarius.zip + destination: aquarius.zip + required: true + - name: aquariusp.zip + destination: aquariusp.zip + required: true + - name: aquarius2.zip + destination: aquarius2.zip + required: true + - name: aquarius_ar.zip + destination: aquarius_ar.zip + required: true + - name: aquarius_cart.xml + destination: mame/hash/aquarius_cart.xml + required: true + - name: aquarius_cass.xml + destination: mame/hash/aquarius_cass.xml + required: true + arcadia: + files: + - name: ar_bios.zip + destination: ar_bios.zip + required: true + md5: 37e9746f4491aa2df9a83729d1a93620 + - name: arcadia.xml + destination: mame/hash/arcadia.xml + required: true + archimedes: + files: + - name: aa310.zip + destination: aa310.zip + required: true + - name: archimedes_keyboard.zip + destination: archimedes_keyboard.zip + required: true + - name: archimedes.xml + destination: mame/hash/archimedes.xml + required: true + astrocde: + files: + - name: astrocde.zip + destination: astrocde.zip + required: true + md5: f58a3823ab308ef0a02b498d126e5d96 + - name: astrocde.xml + destination: mame/hash/astrocde.xml + required: true + atari800: + files: + - name: ATARIXL.ROM + destination: ATARIXL.ROM + required: true + md5: 06daac977823773a3eea3422fd26a703 + - name: ATARIBAS.ROM + destination: ATARIBAS.ROM + required: true + md5: 0bac0c6a50104045d902df4503a4c30b + - name: ATARIOSA.ROM + destination: ATARIOSA.ROM + required: true + md5: eb1f32f5d9f382db1bbfb8d7f9cb343a + - name: ATARIOSB.ROM + destination: ATARIOSB.ROM + required: true + md5: a3e8d617c95d08031fe1b20d541434b2 + atari5200: + files: + - name: 5200.rom + destination: 5200.rom + required: true + md5: 281f20ea4320404ec820fb7ec0693b38 + atari7800: + files: + - name: "7800 BIOS (E).rom" + destination: "7800 BIOS (E).rom" + required: true + md5: 397bb566584be7b9764e7a68974c4263 + - name: "7800 BIOS (U).rom" + destination: "7800 BIOS (U).rom" + required: true + md5: 0763f1ffb006ddbe32e52d497ee848ae + - name: ProSystem.dat + destination: ProSystem.dat + required: true + md5: ce6a86574d0c9de9075705f14e99d090 + - name: A78_highscore.bin + destination: A78_highscore.bin + required: true + atarist: + files: + - name: tos.img + destination: tos.img + required: true + - name: emutos.img + destination: hatari/tos/emutos.img + required: true + - name: tos102.img + destination: hatari/tos/tos102.img + required: true + - name: tos106.img + destination: hatari/tos/tos106.img + required: true + - name: tos104.img + destination: hatari/tos/tos104.img + required: true + - name: tos206.img + destination: hatari/tos/tos206.img + required: true + - name: emutos.img + destination: hatarib/emutos.img + required: true + - name: tos102.img + destination: hatarib/tos102.img + required: true + - name: tos106.img + destination: hatarib/tos106.img + required: true + - name: tos104.img + destination: hatarib/tos104.img + required: true + - name: tos206.img + destination: hatarib/tos206.img + required: true + atom: + files: + - name: atom.zip + destination: atom.zip + required: true + - name: atom_cass.xml + destination: mame/hash/atom_cass.xml + required: true + - name: atom_flop.xml + destination: mame/hash/atom_flop.xml + required: true + - name: atom_rom.xml + destination: mame/hash/atom_rom.xml + required: true + atomiswave: + files: + - name: awbios.zip + destination: dc/awbios.zip + required: true + md5: 0ec5ae5b5a5c4959fa8b43fcf8687f7c + bbcmicro: + files: + - name: bbcb.zip + destination: bbcb.zip + required: true + - name: bbc_acorn8271.zip + destination: bbc_acorn8271.zip + required: true + - name: saa5050.zip + destination: saa5050.zip + required: true + - name: bbc_tube_80186.zip + destination: bbc_tube_80186.zip + required: true + - name: bbcm.zip + destination: bbcm.zip + required: true + - name: bbcmc.zip + destination: bbcmc.zip + required: true + - name: bbc_bitstik1.zip + destination: bbc_bitstik1.zip + required: true + - name: bbc_bitstik2.zip + destination: bbc_bitstik2.zip + required: true + - name: bbc.zip + destination: mame/samples/bbc.zip + required: true + - name: bbc_cass.xml + destination: mame/hash/bbc_cass.xml + required: true + - name: bbc_rom.xml + destination: mame/hash/bbc_rom.xml + required: true + - name: bbcb_flop.xml + destination: mame/hash/bbcb_flop.xml + required: true + - name: bbcb_flop_orig.xml + destination: mame/hash/bbcb_flop_orig.xml + required: true + - name: bbcb_flop_us.xml + destination: mame/hash/bbcb_flop_us.xml + required: true + - name: bbcm_cart.xml + destination: mame/hash/bbcm_cart.xml + required: true + - name: bbcm_flop.xml + destination: mame/hash/bbcm_flop.xml + required: true + - name: bbcmc_flop.xml + destination: mame/hash/bbcmc_flop.xml + required: true + loopy: + files: + - name: casloopy.zip + destination: casloopy.zip + required: true + md5: 0e1d8dc0110ecf8201c0cef11ef4a858 + - name: casloopy.xml + destination: mame/hash/casloopy.xml + required: true + cdi: + files: + - name: cdibios.zip + destination: cdibios.zip + required: true + - name: cdimono1.zip + destination: cdimono1.zip + required: true + - name: cdimono2.zip + destination: cdimono2.zip + required: true + - name: cdi.xml + destination: mame/hash/cdi.xml + required: true + - name: cdibios.zip + destination: same_cdi/bios/cdibios.zip + required: true + - name: cdimono1.zip + destination: same_cdi/bios/cdimono1.zip + required: true + - name: cdimono2.zip + destination: same_cdi/bios/cdimono2.zip + required: true + channelf: + files: + - name: sl31253.bin + destination: sl31253.bin + required: true + md5: ac9804d4c0e9d07e33472e3726ed15c3 + - name: sl31254.bin + destination: sl31254.bin + required: true + md5: da98f4bb3242ab80d76629021bb27585 + - name: sl90025.bin + destination: sl90025.bin + required: true + md5: 95d339631d867c8f1d15a5f2ec26069d + coco: + files: + - name: coco.zip + destination: coco.zip + required: true + - name: coco2.zip + destination: coco2.zip + required: true + - name: coco2b.zip + destination: coco2b.zip + required: true + - name: coco3.zip + destination: coco3.zip + required: true + - name: coco3p.zip + destination: coco3p.zip + required: true + - name: coco_cart.xml + destination: mame/hash/coco_cart.xml + required: true + - name: coco_flop.xml + destination: mame/hash/coco_flop.xml + required: true + colecovision: + files: + - name: colecovision.rom + destination: colecovision.rom + required: true + md5: 2c66f5911e5b42b8ebe113403548eee7 + - name: coleco.rom + destination: openMSX/share/systemroms/coleco.rom + required: true + md5: 2c66f5911e5b42b8ebe113403548eee7 + crvision: + files: + - name: crvision.zip + destination: crvision.zip + required: true + - name: crvision.xml + destination: mame/hash/crvision.xml + required: true + dragon32: + files: + - name: d32.rom + destination: dragon/d32.rom + required: true + md5: 3420b96031078a4ef408cad7bf21a33f + - name: d64_1.rom + destination: dragon/d64_1.rom + required: true + md5: 5f0bee59710e55f5880e74890912ed78 + - name: d64_2.rom + destination: dragon/d64_2.rom + required: true + md5: fd91edce7be5e7c2d88e46b76956a8aa + dreamcast: + files: + - name: dc_boot.bin + destination: dc/dc_boot.bin + required: true + md5: e10c53c2f8b90bab96ead2d368858623 + - name: dc_flash.bin + destination: dc/dc_flash.bin + required: true + md5: 0a93f7940c455905bea6e392dfde92a4 + - name: dc.zip + destination: dc/dc.zip + required: true + electron: + files: + - name: electron.zip + destination: electron.zip + required: true + - name: electron_plus1.zip + destination: electron_plus1.zip + required: true + - name: electron_plus3.zip + destination: electron_plus3.zip + required: true + - name: electron64.zip + destination: electron64.zip + required: true + - name: electron_cass.xml + destination: mame/hash/electron_cass.xml + required: true + - name: electron_cart.xml + destination: mame/hash/electron_cart.xml + required: true + - name: electron_flop.xml + destination: mame/hash/electron_flop.xml + required: true + fds: + files: + - name: disksys.rom + destination: disksys.rom + required: true + md5: ca30b50f880eb660a320674ed365ef7a + ecwolf: + files: + - name: ecwolf.pk3 + destination: ecwolf.pk3 + required: true + md5: dbaa5c4e20a11000d1c4db3a2a28f374 + fm7: + files: + - name: fm7.zip + destination: fm7.zip + required: true + - name: fm77av.zip + destination: fm77av.zip + required: true + - name: fm7_cass.xml + destination: mame/hash/fm7_cass.xml + required: true + - name: fm7_disk.xml + destination: mame/hash/fm7_disk.xml + required: true + - name: fm77av.xml + destination: mame/hash/fm77av.xml + required: true + fmtowns: + files: + - name: fmtowns.zip + destination: fmtowns.zip + required: true + - name: fmtownsux.zip + destination: fmtownsux.zip + required: true + - name: FMT_DIC.ROM + destination: fmtowns/FMT_DIC.ROM + required: true + md5: 8fa4e553f28cfc0c30a0a1e589799942 + - name: FMT_DOS.ROM + destination: fmtowns/FMT_DOS.ROM + required: true + md5: 0585b19930d4a7f4c71bcc8a33746588 + - name: FMT_F20.ROM + destination: fmtowns/FMT_F20.ROM + required: true + md5: ac0c7021e9bf48ca84b51ab651169a88 + - name: FMT_FNT.ROM + destination: fmtowns/FMT_FNT.ROM + required: true + md5: b91300e55b70227ce98b59c5f02fa8dd + - name: FMT_SYS.ROM + destination: fmtowns/FMT_SYS.ROM + required: true + md5: 86fb6f7280689259f0ca839dd3dd6cde + - name: fmtowns_cd.xml + destination: mame/hash/fmtowns_cd.xml + required: true + - name: fmtowns_flop_cracked.xml + destination: mame/hash/fmtowns_flop_cracked.xml + required: true + - name: fmtowns_flop_misc.xml + destination: mame/hash/fmtowns_flop_misc.xml + required: true + - name: fmtowns_flop_orig.xml + destination: mame/hash/fmtowns_flop_orig.xml + required: true + gamate: + files: + - name: gamate.zip + destination: gamate.zip + required: true + md5: 320bf3d4142fa1043255db7ff87d17c7 + - name: gamate.xml + destination: mame/hash/gamate.xml + required: true + gamecom: + files: + - name: gamecom.zip + destination: gamecom.zip + required: true + md5: f2087ed09f7fa8d8856cfafb20dd00dc + - name: gamecom.xml + destination: mame/hash/gamecom.xml + required: true + gamepock: + files: + - name: gamepock.zip + destination: gamepock.zip + required: true + md5: 887479fe3c69a0b935c57a7a738e26c4 + - name: gamepock.xml + destination: mame/hash/gamepock.xml + required: true + gb: + files: + - name: gb_bios.bin + destination: gb_bios.bin + required: true + md5: 32fbbd84168d3482956eb3c5051637f5 + gba: + files: + - name: gba_bios.bin + destination: gba_bios.bin + required: true + md5: a860e8c0b6d573d191e4ec7db1b1e4f6 + gbc: + files: + - name: gbc_bios.bin + destination: gbc_bios.bin + required: true + md5: dbfce9db9deaa2567f6a84fde55f9680 + gmaster: + files: + - name: gmaster.zip + destination: gmaster.zip + required: true + md5: 4239d6f44a0d78d27c69f9b95885f48e + - name: gmaster.xml + destination: mame/hash/gmaster.xml + required: true + gp32: + files: + - name: gp32.zip + destination: gp32.zip + required: true + md5: 8c392f475834218d88533150d36cc84c + - name: gp32.xml + destination: mame/hash/gp32.xml + required: true + hikaru: + files: + - name: hikaru.zip + destination: hikaru.zip + required: true + md5: aac601811a25d7b31a3d5f3f1f82f338 + - name: mie.zip + destination: mie.zip + required: true + md5: e95415b161121bef35ade12367138c63 + intellivision: + files: + - name: exec.bin + destination: exec.bin + required: true + md5: 62e761035cb657903761800f4437b8af + - name: grom.bin + destination: grom.bin + required: true + md5: 0cd5946c6473e42e8e4c2137785e427f + j2me: + files: + - name: freej2me-lr.jar + destination: freej2me-lr.jar + required: true + md5: a6f31483d1da4558cc19025e21f95c1d + jaguar: + files: + - name: "[BIOS] Atari Jaguar (World).j64" + destination: "[BIOS] Atari Jaguar (World).j64" + required: true + md5: bcfe348c565d9dedb173822ee6850dea + laseractive: + files: + - name: "[BIOS] LaserActive PAC-N1 (Japan) (v1.02).bin" + destination: "laseractive/[BIOS] LaserActive PAC-N1 (Japan) (v1.02).bin" + required: true + md5: f69f173b251d8bf7649b10a9167a10bf + - name: "[BIOS] LaserActive PAC-N10 (US) (v1.02).bin" + destination: "laseractive/[BIOS] LaserActive PAC-N10 (US) (v1.02).bin" + required: true + md5: f0fb8a4605ac7eefbafd4f2d5a793cc8 + - name: "[BIOS] LaserActive PCE-LP1 (Japan) (v1.02).bin" + destination: "laseractive/[BIOS] LaserActive PCE-LP1 (Japan) (v1.02).bin" + required: true + md5: 761fea207d0eafd4cfd78da7c44cac88 + - name: "Pioneer LaserActive Sega PAC Boot ROM v1.02 (1993)(Pioneer - Sega)(JP)(en-ja).bin" + destination: "laseractive/Pioneer LaserActive Sega PAC Boot ROM v1.02 (1993)(Pioneer\ + \ - Sega)(JP)(en-ja).bin" + required: true + md5: a5a2f9aae57d464bc66b80ee79c3da6e + - name: "Pioneer LaserActive Sega PAC Boot ROM v1.04 (1993)(Pioneer - Sega)(US).bin" + destination: "laseractive/Pioneer LaserActive Sega PAC Boot ROM v1.04 (1993)(Pioneer\ + \ - Sega)(US).bin" + required: true + md5: 0e7393cd0951d6dde818fcd4cd819466 + lynx: + files: + - name: lynxboot.img + destination: lynxboot.img + required: true + md5: fcd403db69f54290b51035d82f835e7b + camplynx: + files: + - name: lynx48k.zip + destination: lynx48k.zip + required: true + - name: lynx96k.zip + destination: lynx96k.zip + required: true + - name: lynx128k.zip + destination: lynx128k.zip + required: true + - name: lynx48-1.rom + destination: emulators/jynx/lynx48-1.rom + required: true + - name: lynx48-2.rom + destination: emulators/jynx/lynx48-2.rom + required: true + - name: lynx96-1.rom + destination: emulators/jynx/lynx96-1.rom + required: true + - name: lynx96-2.rom + destination: emulators/jynx/lynx96-2.rom + required: true + - name: lynx96-3.rom + destination: emulators/jynx/lynx96-3.rom + required: true + - name: lynx96-3-scorpion.rom + destination: emulators/jynx/lynx96-3-scorpion.rom + required: true + - name: camplynx_cass.xml + destination: mame/hash/camplynx_cass.xml + required: true + - name: camplynx_flop.xml + destination: mame/hash/camplynx_flop.xml + required: true + mastersystem: + files: + - name: "[BIOS] Sega Master System (USA, Europe) (v1.3).sms" + destination: "[BIOS] Sega Master System (USA, Europe) (v1.3).sms" + required: true + - name: "[BIOS] Sega Master System (Japan) (v2.1).sms" + destination: "[BIOS] Sega Master System (Japan) (v2.1).sms" + required: true + msx: + files: + - name: MSX.ROM + destination: MSX.ROM + required: true + md5: 364a1a579fe5cb8dba54519bcfcdac0d + - name: DISK.ROM + destination: DISK.ROM + required: true + md5: 80dcd1ad1a4cf65d64b7ba10504e8190 + - name: FMPAC.ROM + destination: FMPAC.ROM + required: true + md5: 6f69cc8b5ed761b03afd78000dfb0e19 + - name: MSXDOS2.ROM + destination: MSXDOS2.ROM + required: true + md5: 6418d091cd6907bbcf940324339e43bb + - name: PAINTER.ROM + destination: PAINTER.ROM + required: true + md5: 403cdea1cbd2bb24fae506941f8f655e + - name: KANJI.ROM + destination: KANJI.ROM + required: true + md5: febe8782b466d7c3b16de6d104826b34 + - name: cf-3300_basic-bios1.rom + destination: openMSX/share/systemroms/cf-3300_basic-bios1.rom + required: true + md5: f873f1260b14f1468fa118778ae1c3d2 + - name: cf-3300_disk.rom + destination: openMSX/share/systemroms/cf-3300_disk.rom + required: true + md5: 318b6aa76da71c54ccad7734356e1902 + - name: vg8020_basic-bios1.rom + destination: openMSX/share/systemroms/vg8020_basic-bios1.rom + required: true + md5: a0452dbf5ace7d2e49d0a8029efed09a + - name: px-7_basic-bios1.rom + destination: openMSX/share/systemroms/px-7_basic-bios1.rom + required: true + md5: 9218f6dd89f7ba01e3090d44721b4260 + - name: px-7_pbasic.rom + destination: openMSX/share/systemroms/px-7_pbasic.rom + required: true + md5: 281809cafe63437fc4bffb3033fbd0db + - name: fmpac.rom + destination: openMSX/share/systemroms/fmpac.rom + required: true + md5: 6f69cc8b5ed761b03afd78000dfb0e19 + - name: yrw801.rom + destination: openMSX/share/systemroms/yrw801.rom + required: true + md5: 42af93619160ef2116416f74a6cb12f2 + msx2: + files: + - name: MSX2.ROM + destination: MSX2.ROM + required: true + md5: ec3a01c91f24fbddcbcab0ad301bc9ef + - name: MSX2EXT.ROM + destination: MSX2EXT.ROM + required: true + md5: 2183c2aff17cf4297bdb496de78c2e8a + - name: fs-5500_basic-bios2.rom + destination: openMSX/share/systemroms/fs-5500_basic-bios2.rom + required: true + md5: 5bf4fdfd3c3ffea3e573b386550cb3fa + - name: fs-5500_disk.rom + destination: openMSX/share/systemroms/fs-5500_disk.rom + required: true + md5: 86269da485e852d9f581ac27f4ba32ff + - name: fs-5500_kanjibasic.rom + destination: openMSX/share/systemroms/fs-5500_kanjibasic.rom + required: true + md5: afbe6ba903453902540ae988cc89dc7b + - name: fs-5500_kanjifont.rom + destination: openMSX/share/systemroms/fs-5500_kanjifont.rom + required: true + md5: 090539674630c1338a90a1df943a93e2 + - name: fs-5500_msx2sub.rom + destination: openMSX/share/systemroms/fs-5500_msx2sub.rom + required: true + md5: dcd5e2388115172f2fb48875b2089dbf + - name: fs-5500_superimp.rom + destination: openMSX/share/systemroms/fs-5500_superimp.rom + required: true + md5: 7eb6ae0fbe9736b20dda8dcbd5064f67 + - name: nms8245_basic-bios2.rom + destination: openMSX/share/systemroms/nms8245_basic-bios2.rom + required: true + md5: ec3a01c91f24fbddcbcab0ad301bc9ef + - name: nms8245_disk.rom + destination: openMSX/share/systemroms/nms8245_disk.rom + required: true + md5: 3525ea046ddedc66991790eeae32acfd + - name: nms8245_disk_1.06.rom + destination: openMSX/share/systemroms/nms8245_disk_1.06.rom + required: true + md5: 57509815f93e2817d3eb57e20286c7fb + - name: nms8245_msx2sub.rom + destination: openMSX/share/systemroms/nms8245_msx2sub.rom + required: true + md5: 248514aba82a0ec7fe2a9106862b05cd + - name: fmpac.rom + destination: openMSX/share/systemroms/fmpac.rom + required: true + md5: 6f69cc8b5ed761b03afd78000dfb0e19 + - name: yrw801.rom + destination: openMSX/share/systemroms/yrw801.rom + required: true + md5: 42af93619160ef2116416f74a6cb12f2 + msx2+: + files: + - name: MSX2P.ROM + destination: MSX2P.ROM + required: true + md5: 847cc025ffae665487940ff2639540e5 + - name: MSX2PEXT.ROM + destination: MSX2PEXT.ROM + required: true + md5: 7c8243c71d8f143b2531f01afa6a05dc + - name: fs-a1wsx_basic-bios2p.rom + destination: openMSX/share/systemroms/fs-a1wsx_basic-bios2p.rom + required: true + md5: c5c26c3e8bc6c485424818057f0507b9 + - name: fs-a1wsx_disk.rom + destination: openMSX/share/systemroms/fs-a1wsx_disk.rom + required: true + md5: 00aa02b6077de40a0b51d71a3c3e1d5f + - name: fs-a1wsx_firmware.rom + destination: openMSX/share/systemroms/fs-a1wsx_firmware.rom + required: true + md5: fa8e7d4b999af058fe2864a5f2e014ec + - name: fs-a1wsx_fmbasic.rom + destination: openMSX/share/systemroms/fs-a1wsx_fmbasic.rom + required: true + md5: 0c40e7db1c1fcc2405e4d0cdd215adb4 + - name: fs-a1wsx_kanjibasic.rom + destination: openMSX/share/systemroms/fs-a1wsx_kanjibasic.rom + required: true + md5: 9dfdebfaa6b547222a40aab8bb2e29f8 + - name: fs-a1wsx_kanjifont.rom + destination: openMSX/share/systemroms/fs-a1wsx_kanjifont.rom + required: true + md5: acf53887c2d2783dc059a9b442c86b90 + - name: fs-a1wsx_msx2psub.rom + destination: openMSX/share/systemroms/fs-a1wsx_msx2psub.rom + required: true + md5: 7c8243c71d8f143b2531f01afa6a05dc + - name: fmpac.rom + destination: openMSX/share/systemroms/fmpac.rom + required: true + md5: 6f69cc8b5ed761b03afd78000dfb0e19 + - name: yrw801.rom + destination: openMSX/share/systemroms/yrw801.rom + required: true + md5: 42af93619160ef2116416f74a6cb12f2 + msxturbor: + files: + - name: fs-a1gt_firmware.rom + destination: openMSX/share/systemroms/fs-a1gt_firmware.rom + required: true + md5: af17a344bcc177b97a4888c4c559f3ae + - name: fs-a1gt_kanjifont.rom + destination: openMSX/share/systemroms/fs-a1gt_kanjifont.rom + required: true + md5: acf53887c2d2783dc059a9b442c86b90 + - name: fmpac.rom + destination: openMSX/share/systemroms/fmpac.rom + required: true + md5: 6f69cc8b5ed761b03afd78000dfb0e19 + - name: yrw801.rom + destination: openMSX/share/systemroms/yrw801.rom + required: true + md5: 42af93619160ef2116416f74a6cb12f2 + n64dd: + files: + - name: IPL_JAP.n64 + destination: Mupen64plus/IPL_JAP.n64 + required: true + md5: 8d3d9f294b6e174bc7b1d2fd1c727530 + - name: IPL_USA.n64 + destination: Mupen64plus/IPL_USA.n64 + required: true + md5: 37c36e4286d36892a9fc70eafe4104be + - name: IPL_DEV.n64 + destination: Mupen64plus/IPL_DEV.n64 + required: true + md5: aad37b1492886b892f1821f37fd3ae34 + naomi: + files: + - name: naomi.zip + destination: dc/naomi.zip + required: true + md5: eb4099aeb42ef089cfe94f8fe95e51f6 + naomi2: + files: + - name: naomi2.zip + destination: dc/naomi2.zip + required: true + nds: + files: + - name: firmware.bin + destination: firmware.bin + required: true + - name: bios7.bin + destination: bios7.bin + required: true + md5: df692a80a5b1bc90728bc3dfc76cd948 + - name: bios9.bin + destination: bios9.bin + required: true + md5: a392174eb3e572fed6447e956bde4b25 + - name: dsi_bios9.bin + destination: dsi_bios9.bin + required: true + - name: dsi_bios7.bin + destination: dsi_bios7.bin + required: true + - name: dsi_firmware.bin + destination: dsi_firmware.bin + required: true + neogeo: + files: + - name: neogeo.zip + destination: neogeo.zip + required: true + md5: dffb72f116d36d025068b23970a4f6df + neogeo64: + files: + - name: neogeo.zip + destination: neogeo.zip + required: true + md5: dffb72f116d36d025068b23970a4f6df + neogeocd: + files: + - name: neogeo.zip + destination: neogeo.zip + required: true + md5: dffb72f116d36d025068b23970a4f6df + - name: neocdz.zip + destination: neocdz.zip + required: true + md5: c733b4b7bd30fa849874d96c591c8639 + - name: neocd_f.rom + destination: neocd/neocd_f.rom + required: true + - name: neocd_sf.rom + destination: neocd/neocd_sf.rom + required: true + - name: neocd_t.rom + destination: neocd/neocd_t.rom + required: true + - name: neocd_st.rom + destination: neocd/neocd_st.rom + required: true + - name: neocd_z.rom + destination: neocd/neocd_z.rom + required: true + - name: neocd_sz.rom + destination: neocd/neocd_sz.rom + required: true + - name: front-sp1.bin + destination: neocd/front-sp1.bin + required: true + - name: top-sp1.bin + destination: neocd/top-sp1.bin + required: true + - name: neocd.bin + destination: neocd/neocd.bin + required: true + - name: uni-bioscd.rom + destination: neocd/uni-bioscd.rom + required: true + ngage: + files: + - name: SYM.ROM + destination: eka2l1/data/roms/NEM-4/SYM.ROM + required: true + md5: 64a95a4a884cf4cc15a566b856603193 + ngp: + files: + - name: "[BIOS] SNK Neo Geo Pocket (Japan, Europe) (En,Ja).ngp" + destination: "[BIOS] SNK Neo Geo Pocket (Japan, Europe) (En,Ja).ngp" + required: true + ngpc: + files: + - name: "[BIOS] SNK Neo Geo Pocket (Japan, Europe) (En,Ja).ngp" + destination: "[BIOS] SNK Neo Geo Pocket (Japan, Europe) (En,Ja).ngp" + required: true + odyssey2: + files: + - name: o2rom.bin + destination: o2rom.bin + required: true + md5: 562d5ebf9e030a40d6fabfc2f33139fd + - name: c52.bin + destination: c52.bin + required: true + md5: f1071cdb0b6b10dde94d3bc8a6146387 + - name: g7400.bin + destination: g7400.bin + required: true + md5: c500ff71236068e0dc0d0603d265ae76 + - name: jopac.bin + destination: jopac.bin + required: true + md5: 279008e4a0db2dc5f1c048853b033828 + pc88: + files: + - name: N88.ROM + destination: quasi88/N88.ROM + required: true + md5: 4f984e04a99d56c4cfe36115415d6eb8 + - name: N88SUB.ROM + destination: quasi88/N88SUB.ROM + required: true + md5: 793f86784e5608352a5d7f03f03e0858 + - name: N88N.ROM + destination: quasi88/N88N.ROM + required: true + md5: 2ff07b8769367321128e03924af668a0 + - name: N88EXT0.ROM + destination: quasi88/N88EXT0.ROM + required: true + md5: d675a2ca186c6efcd6277b835de4c7e5 + - name: N88EXT1.ROM + destination: quasi88/N88EXT1.ROM + required: true + md5: e844534dfe5744b381444dbe61ef1b66 + - name: N88EXT2.ROM + destination: quasi88/N88EXT2.ROM + required: true + md5: 6548fa45061274dee1ea8ae1e9e93910 + - name: N88EXT3.ROM + destination: quasi88/N88EXT3.ROM + required: true + md5: fc4b76a402ba501e6ba6de4b3e8b4273 + pc98: + files: + - name: BIOS.ROM + destination: np2kai/BIOS.ROM + required: true + md5: e246140dec5124c5e404869a84caefce + - name: FONT.ROM + destination: np2kai/FONT.ROM + required: true + md5: 2af6179d7de4893ea0b705c00e9a98d6 + - name: SOUND.ROM + destination: np2kai/SOUND.ROM + required: true + md5: caf90f22197aed6f14c471c21e64658d + - name: ITF.ROM + destination: np2kai/ITF.ROM + required: true + md5: e9fc3890963b12cf15d0a2eea5815b72 + - name: font.bmp + destination: np2kai/font.bmp + required: true + md5: 7da1e5b7c482d4108d22a5b09631d967 + pcengine: + files: + - name: syscard3.pce + destination: syscard3.pce + required: true + md5: 38179df8f4ac870017db21ebcbf53114 + pcenginecd: + files: + - name: syscard3.pce + destination: syscard3.pce + required: true + md5: 38179df8f4ac870017db21ebcbf53114 + pcfx: + files: + - name: pcfx.rom + destination: pcfx.rom + required: true + md5: 08e36edbea28a017f79f8d4f7ff9b6d7 + - name: fx-scsi.rom + destination: fx-scsi.rom + required: true + pegasus: + files: + - name: pegasus.zip + destination: pegasus.zip + required: true + md5: fee37d8140e4fab48aac4fdab2847f7d + - name: pegasus_cart.xml + destination: mame/hash/pegasus_cart.xml + required: true + pokemini: + files: + - name: bios.min + destination: bios.min + required: true + md5: 1e4fb124a3a886865acb574f388c803d + ps2: + files: + - name: ps2-0230a-20080220.bin + destination: pcsx2/bios/ps2-0230a-20080220.bin + required: true + md5: 21038400dc633070a78ad53090c53017 + psx: + files: + - name: psxonpsp660.bin + destination: psxonpsp660.bin + required: true + md5: c53ca5908936d412331790f4426c6c33 + pv1000: + files: + - name: pv1000.xml + destination: mame/hash/pv1000.xml + required: true + satellaview: + files: + - name: BS-X.bin + destination: BS-X.bin + required: true + md5: fed4d8242cfbed61343d53d48432aced + saturn: + files: + - name: sega_101.bin + destination: sega_101.bin + required: true + md5: 85ec9ca47d8f6807718151cbcca8b964 + - name: mpr-17933.bin + destination: mpr-17933.bin + required: true + md5: 3240872c70984b6cbfda1586cab68dbe + - name: mpr-18811-mx.ic1 + destination: mpr-18811-mx.ic1 + required: true + md5: 255113ba943c92a54facd25a10fd780c + - name: mpr-19367-mx.ic1 + destination: mpr-19367-mx.ic1 + required: true + md5: 1cd19988d1d72a3e7caa0b73234c96b4 + - name: saturn_bios.bin + destination: saturn_bios.bin + required: true + md5: af5828fdff51384f99b3c4926be27762 + - name: saturn_bios.bin + destination: kronos/saturn_bios.bin + required: true + md5: af5828fdff51384f99b3c4926be27762 + scummvm: + files: + - name: MT32_CONTROL.ROM + destination: scummvm/extra/MT32_CONTROL.ROM + required: true + md5: 5626206284b22c2734f3e9efefcd2675 + - name: MT32_PCM.ROM + destination: scummvm/extra/MT32_PCM.ROM + required: true + md5: 89e42e386e82e0cacb4a2704a03706ca + scv: + files: + - name: scv.zip + destination: scv.zip + required: true + md5: 33df021613fb12abe2ad14b9eb17c7fe + - name: upd7801g.s01 + destination: upd7801g.s01 + required: true + md5: 635a978fd40db9a18ee44eff449fc126 + - name: scv.xml + destination: mame/hash/scv.xml + required: true + sega32x: + files: + - name: 32X_G_BIOS.BIN + destination: 32X_G_BIOS.BIN + required: true + - name: 32X_M_BIOS.BIN + destination: 32X_M_BIOS.BIN + required: true + - name: 32X_S_BIOS.BIN + destination: 32X_S_BIOS.BIN + required: true + megacd: + files: + - name: bios_CD_E.bin + destination: bios_CD_E.bin + required: true + md5: e66fa1dc5820d254611fdcdba0662372 + - name: bios_CD_U.bin + destination: bios_CD_U.bin + required: true + md5: 854b9150240a198070150e4566ae1290 + - name: bios_CD_J.bin + destination: bios_CD_J.bin + required: true + md5: 278a9397d192149e84e820ac621a8edd + segastv: + files: + - name: stvbios.zip + destination: kronos/stvbios.zip + required: true + sgb: + files: + - name: sgb_boot.bin + destination: sgb_boot.bin + required: true + md5: d574d4f9c12f305074798f54c091a8b4 + - name: sgb2_boot.bin + destination: sgb2_boot.bin + required: true + md5: e0430bca9925fb9882148fd2dc2418c1 + - name: SGB1.sfc + destination: SGB1.sfc + required: true + md5: b15ddb15721c657d82c5bab6db982ee9 + - name: SGB2.sfc + destination: SGB2.sfc + required: true + md5: 8ecd73eb4edf7ed7e81aef1be80031d5 + sufami: + files: + - name: STBIOS.bin + destination: STBIOS.bin + required: true + md5: d3a44ba7d42a74d3ac58cb9c14c6a5ca + supergrafx: + files: + - name: syscard3.pce + destination: syscard3.pce + required: true + md5: 38179df8f4ac870017db21ebcbf53114 + supracan: + files: + - name: supracan.zip + destination: supracan.zip + required: true + - name: umc6650.zip + destination: umc6650.zip + required: true + - name: supracan.xml + destination: mame/hash/supracan.xml + required: true + ti99: + files: + - name: ti99_4a.zip + destination: ti99_4a.zip + required: true + - name: ti99_speech.zip + destination: ti99_speech.zip + required: true + - name: ti99_cart.xml + destination: mame/hash/ti99_cart.xml + required: true + triforce: + files: + - name: segaboot.gcm + destination: emulators/dolphin-emu/User/Triforce/segaboot.gcm + required: true + tutor: + files: + - name: tutor.zip + destination: tutor.zip + required: true + - name: tutor.xml + destination: mame/hash/tutor.xml + required: true + vc4000: + files: + - name: vc4000.xml + destination: mame/hash/vc4000.xml + required: true + vectrex: + files: + - name: Vectrex_Bios.bin + destination: Vectrex_Bios.bin + required: true + vg5k: + files: + - name: vg5k.zip + destination: vg5k.zip + required: true + - name: vg5k.xml + destination: mame/hash/vg5k.xml + required: true + vsmile: + files: + - name: vsmile.zip + destination: vsmile.zip + required: true + - name: vsmile_cart.xml + destination: mame/hash/vsmile_cart.xml + required: true + - name: vsmile_cd.xml + destination: mame/hash/vsmile_cd.xml + required: true + - name: vsmilem_cart.xml + destination: mame/hash/vsmilem_cart.xml + required: true + - name: vsmileb_cart.xml + destination: mame/hash/vsmileb_cart.xml + required: true + x1: + files: + - name: IPLROM.X1 + destination: xmil/IPLROM.X1 + required: true + md5: eeeea1cd29c6e0e8b094790ae969bfa7 + - name: iplrom.x1t + destination: xmil/iplrom.x1t + required: true + md5: 56c28adcf1f3a2f87cf3d57c378013f5 + x68000: + files: + - name: iplrom.dat + destination: keropi/iplrom.dat + required: true + md5: 7fd4caabac1d9169e289f0f7bbf71d8e + - name: cgrom.dat + destination: keropi/cgrom.dat + required: true + md5: cb0a5cfcf7247a7eab74bb2716260269 + xbox: + files: + - name: mcpx_1.0.bin + destination: mcpx_1.0.bin + required: true + md5: d49c52a4102f6df7bcf8d0617ac475ed + - name: Complex_4627.bin + destination: Complex_4627.bin + required: true + md5: 39cee882148a87f93cb440b99dde3ceb + xegs: + files: + - name: xegs.zip + destination: xegs.zip + required: true + - name: xegs.xml + destination: mame/hash/xegs.xml + required: true diff --git a/scripts/generate_pack.py b/scripts/generate_pack.py index 884ded20..0dd7b9e8 100644 --- a/scripts/generate_pack.py +++ b/scripts/generate_pack.py @@ -51,7 +51,8 @@ def fetch_large_file(name: str, dest_dir: str = ".cache/large") -> str | None: if os.path.exists(cached): return cached - url = f"https://github.com/{LARGE_FILES_REPO}/releases/download/{LARGE_FILES_RELEASE}/{name}" + encoded_name = urllib.request.quote(name) + url = f"https://github.com/{LARGE_FILES_REPO}/releases/download/{LARGE_FILES_RELEASE}/{encoded_name}" try: req = urllib.request.Request(url, headers={"User-Agent": "retrobios-pack/1.0"}) with urllib.request.urlopen(req, timeout=300) as resp: diff --git a/scripts/scraper/retrobat_scraper.py b/scripts/scraper/retrobat_scraper.py new file mode 100644 index 00000000..0a7d2a26 --- /dev/null +++ b/scripts/scraper/retrobat_scraper.py @@ -0,0 +1,216 @@ +#!/usr/bin/env python3 +"""Scraper for RetroBat batocera-systems.json. + +Source: https://github.com/RetroBat-Official/emulatorlauncher +Format: JSON with system keys containing biosFiles arrays +Hash: MD5 primary +""" + +from __future__ import annotations + +import json +import sys +import urllib.request +import urllib.error + +try: + from .base_scraper import BaseScraper, BiosRequirement, fetch_github_latest_version +except ImportError: + from base_scraper import BaseScraper, BiosRequirement, fetch_github_latest_version + +PLATFORM_NAME = "retrobat" + +SOURCE_URL = ( + "https://raw.githubusercontent.com/RetroBat-Official/emulatorlauncher/" + "master/batocera-systems/Resources/batocera-systems.json" +) + +GITHUB_REPO = "RetroBat-Official/retrobat" + + +class Scraper(BaseScraper): + """Scraper for RetroBat batocera-systems.json.""" + + def __init__(self, url: str = SOURCE_URL): + self.url = url + self._raw_data: str | None = None + self._parsed: dict | None = None + + def _fetch_raw(self) -> str: + if self._raw_data is not None: + return self._raw_data + + try: + req = urllib.request.Request(self.url, headers={"User-Agent": "retrobios-scraper/1.0"}) + with urllib.request.urlopen(req, timeout=30) as resp: + self._raw_data = resp.read().decode("utf-8") + return self._raw_data + except urllib.error.URLError as e: + raise ConnectionError(f"Failed to fetch {self.url}: {e}") from e + + def _parse_json(self) -> dict: + if self._parsed is not None: + return self._parsed + + raw = self._fetch_raw() + try: + self._parsed = json.loads(raw) + except json.JSONDecodeError as e: + raise ValueError(f"Failed to parse JSON: {e}") from e + return self._parsed + + def fetch_requirements(self) -> list[BiosRequirement]: + """Parse batocera-systems.json and return BIOS requirements.""" + raw = self._fetch_raw() + + if not self.validate_format(raw): + raise ValueError("batocera-systems.json format validation failed") + + data = self._parse_json() + requirements = [] + + for sys_key, sys_data in data.items(): + if not isinstance(sys_data, dict): + continue + + bios_files = sys_data.get("biosFiles", []) + if not isinstance(bios_files, list): + continue + + for bios in bios_files: + if not isinstance(bios, dict): + continue + + file_path = bios.get("file", "") + md5 = bios.get("md5", "") + + if not file_path: + continue + + # Strip bios/ prefix from file paths + if file_path.startswith("bios/"): + file_path = file_path[5:] + + name = file_path.split("/")[-1] if "/" in file_path else file_path + + requirements.append(BiosRequirement( + name=name, + system=sys_key, + md5=md5 or None, + destination=file_path, + required=True, + )) + + return requirements + + def validate_format(self, raw_data: str) -> bool: + """Validate that raw_data is valid JSON containing biosFiles entries.""" + try: + data = json.loads(raw_data) + except (json.JSONDecodeError, TypeError): + return False + + if not isinstance(data, dict): + return False + + has_bios = False + for sys_key, sys_data in data.items(): + if isinstance(sys_data, dict) and "biosFiles" in sys_data: + has_bios = True + break + + return has_bios + + def generate_platform_yaml(self) -> dict: + """Generate a platform YAML config dict from scraped data.""" + requirements = self.fetch_requirements() + + systems = {} + for req in requirements: + if req.system not in systems: + systems[req.system] = {"files": []} + + entry = { + "name": req.name, + "destination": req.destination, + "required": req.required, + } + if req.md5: + entry["md5"] = req.md5 + + systems[req.system]["files"].append(entry) + + version = "" + tag = fetch_github_latest_version(GITHUB_REPO) + if tag: + version = tag + + return { + "platform": "RetroBat", + "version": version, + "homepage": "https://www.retrobat.org", + "source": SOURCE_URL, + "base_destination": "bios", + "hash_type": "md5", + "verification_mode": "md5", + "systems": systems, + } + + +def main(): + """CLI entry point for testing.""" + import argparse + + parser = argparse.ArgumentParser(description="Scrape RetroBat batocera-systems.json") + parser.add_argument("--dry-run", action="store_true") + parser.add_argument("--json", action="store_true") + parser.add_argument("--output", "-o") + args = parser.parse_args() + + scraper = Scraper() + + try: + reqs = scraper.fetch_requirements() + except (ConnectionError, ValueError) as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + + if args.dry_run: + by_system = {} + for req in reqs: + by_system.setdefault(req.system, []).append(req) + + for system, files in sorted(by_system.items()): + print(f"\n{system} ({len(files)} files):") + for f in files: + hash_info = f.md5[:12] if f.md5 else "no-hash" + print(f" {f.name} ({hash_info}...)") + + print(f"\nTotal: {len(reqs)} BIOS files across {len(by_system)} systems") + return + + if args.json: + config = scraper.generate_platform_yaml() + print(json.dumps(config, indent=2)) + return + + if args.output: + try: + import yaml + except ImportError: + print("Error: PyYAML required", file=sys.stderr) + sys.exit(1) + + config = scraper.generate_platform_yaml() + with open(args.output, "w") as f: + yaml.dump(config, f, default_flow_style=False, allow_unicode=True, sort_keys=False) + print(f"Written to {args.output}") + else: + by_system = {} + for req in reqs: + by_system.setdefault(req.system, []).append(req) + print(f"Scraped {len(reqs)} BIOS files across {len(by_system)} systems") + + +if __name__ == "__main__": + main()