From 2f11542ed3149823c087a698661d6862a9477b0b Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Thu, 2 Apr 2026 15:56:24 +0200 Subject: [PATCH] chore: regenerate manifests, site, and docs after new BIOS files --- install/batocera.json | 66 ++++++++++++++++++++++++++-- install/bizhawk.json | 39 +++++++++++++++-- install/lakka.json | 66 ++++++++++++++++++++++++++-- install/recalbox.json | 95 ++++++++++++++++++++++++++++++++++++++-- install/retroarch.json | 66 ++++++++++++++++++++++++++-- install/retrobat.json | 66 ++++++++++++++++++++++++++-- install/retrodeck.json | 77 ++++++++++++++++++++++++++++++-- install/romm.json | 39 +++++++++++++++-- scripts/generate_site.py | 84 ++++++++++++++++++++++++++++------- wiki/architecture.md | 4 +- 10 files changed, 558 insertions(+), 44 deletions(-) diff --git a/install/batocera.json b/install/batocera.json index 04d598a0..f63307ae 100644 --- a/install/batocera.json +++ b/install/batocera.json @@ -4,7 +4,7 @@ "platform": "batocera", "display_name": "Batocera", "version": "1.0", - "generated": "2026-04-02T08:32:09Z", + "generated": "2026-04-02T13:52:15Z", "base_destination": "bios", "detect": [ { @@ -15,8 +15,8 @@ } ], "standalone_copies": [], - "total_files": 1541, - "total_size": 3891648039, + "total_files": 1547, + "total_size": 4371484317, "files": [ { "dest": "panafz1.bin", @@ -6157,6 +6157,39 @@ "FinalBurn Neo" ] }, + { + "dest": "fbneo/samples/donpachi.zip", + "sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1", + "size": 208549253, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "donpachi.zip" + }, + { + "dest": "fbneo/samples/sfz3mix.zip", + "sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9", + "size": 116329446, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "sfz3mix.zip" + }, + { + "dest": "fbneo/samples/twotiger.zip", + "sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9", + "size": 154888877, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "twotiger.zip" + }, { "dest": "gamegenie.nes", "sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779", @@ -8398,6 +8431,24 @@ "NXEngine" ] }, + { + "dest": "nxengine/data/sprites.sif", + "sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b", + "size": 59482, + "repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif", + "cores": [ + "NXEngine" + ] + }, + { + "dest": "nxengine/tilekey.dat", + "sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da", + "size": 1028, + "repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat", + "cores": [ + "NXEngine" + ] + }, { "dest": "NMS8245SystemROM1.08.bin", "sha1": "cc57c1dcd7249ea9f8e2547244592e7d97308ed0", @@ -10666,6 +10717,15 @@ "XRoar" ] }, + { + "dest": "delta2.rom", + "sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60", + "size": 8192, + "repo_path": "bios/Dragon/Dragon/delta2.rom", + "cores": [ + "XRoar" + ] + }, { "dest": "cp450dsk.rom", "sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b", diff --git a/install/bizhawk.json b/install/bizhawk.json index 9aff486e..0314899e 100644 --- a/install/bizhawk.json +++ b/install/bizhawk.json @@ -4,7 +4,7 @@ "platform": "bizhawk", "display_name": "BizHawk", "version": "1.0", - "generated": "2026-04-01T14:00:10Z", + "generated": "2026-04-02T13:52:21Z", "base_destination": "Firmware", "detect": [ { @@ -19,8 +19,8 @@ } ], "standalone_copies": [], - "total_files": 527, - "total_size": 2068127713, + "total_files": 530, + "total_size": 2547895289, "files": [ { "dest": "panafz1.bin", @@ -1274,6 +1274,39 @@ "FinalBurn Neo" ] }, + { + "dest": "fbneo/samples/donpachi.zip", + "sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1", + "size": 208549253, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "donpachi.zip" + }, + { + "dest": "fbneo/samples/sfz3mix.zip", + "sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9", + "size": 116329446, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "sfz3mix.zip" + }, + { + "dest": "fbneo/samples/twotiger.zip", + "sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9", + "size": 154888877, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "twotiger.zip" + }, { "dest": "sl31253.bin", "sha1": "81193965a374d77b99b4743d317824b53c3e3c78", diff --git a/install/lakka.json b/install/lakka.json index 15b7b95f..bb2657c8 100644 --- a/install/lakka.json +++ b/install/lakka.json @@ -4,7 +4,7 @@ "platform": "lakka", "display_name": "Lakka", "version": "1.0", - "generated": "2026-04-02T08:32:35Z", + "generated": "2026-04-02T13:52:45Z", "base_destination": "system", "detect": [ { @@ -15,8 +15,8 @@ } ], "standalone_copies": [], - "total_files": 1621, - "total_size": 5255390792, + "total_files": 1627, + "total_size": 5735234905, "files": [ { "dest": "3do_arcade_saot.bin", @@ -5079,6 +5079,39 @@ "storage": "release", "release_asset": "vimana.zip" }, + { + "dest": "fbneo/samples/donpachi.zip", + "sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1", + "size": 208549253, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "donpachi.zip" + }, + { + "dest": "fbneo/samples/sfz3mix.zip", + "sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9", + "size": 116329446, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "sfz3mix.zip" + }, + { + "dest": "fbneo/samples/twotiger.zip", + "sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9", + "size": 154888877, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "twotiger.zip" + }, { "dest": "nes.pal", "sha1": "37027d92e1015b82a7dc5c43e9f1649a961577ab", @@ -7871,6 +7904,24 @@ "NXEngine" ] }, + { + "dest": "nxengine/data/sprites.sif", + "sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b", + "size": 59482, + "repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif", + "cores": [ + "NXEngine" + ] + }, + { + "dest": "nxengine/tilekey.dat", + "sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da", + "size": 1028, + "repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat", + "cores": [ + "NXEngine" + ] + }, { "dest": "mda.rom", "sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f", @@ -9659,6 +9710,15 @@ "SameBoy" ] }, + { + "dest": "sdlpal/desc.dat", + "sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba", + "size": 16027, + "repo_path": "bios/sdlpal/desc.dat", + "cores": [ + "SDLPAL" + ] + }, { "dest": "SkyEmu/dmg_rom.bin", "sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f", diff --git a/install/recalbox.json b/install/recalbox.json index 7f0607c7..69c49e4b 100644 --- a/install/recalbox.json +++ b/install/recalbox.json @@ -4,7 +4,7 @@ "platform": "recalbox", "display_name": "Recalbox", "version": "1.0", - "generated": "2026-04-02T08:33:02Z", + "generated": "2026-04-02T13:53:15Z", "base_destination": "bios", "detect": [ { @@ -15,8 +15,8 @@ } ], "standalone_copies": [], - "total_files": 1098, - "total_size": 3500175098, + "total_files": 1107, + "total_size": 3980096655, "files": [ { "dest": "3do/panafz1.bin", @@ -540,7 +540,7 @@ "dest": "dragon/deltados.rom", "sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60", "size": 8192, - "repo_path": "bios/Dragon/Dragon/deltados.rom", + "repo_path": "bios/Dragon/Dragon/delta2.rom", "cores": null }, { @@ -3804,6 +3804,39 @@ "FinalBurn Neo" ] }, + { + "dest": "fbneo/samples/donpachi.zip", + "sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1", + "size": 208549253, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "donpachi.zip" + }, + { + "dest": "fbneo/samples/sfz3mix.zip", + "sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9", + "size": 116329446, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "sfz3mix.zip" + }, + { + "dest": "fbneo/samples/twotiger.zip", + "sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9", + "size": 154888877, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "twotiger.zip" + }, { "dest": "gamegenie.nes", "sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779", @@ -6459,6 +6492,24 @@ "NXEngine" ] }, + { + "dest": "nxengine/data/sprites.sif", + "sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b", + "size": 59482, + "repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif", + "cores": [ + "NXEngine" + ] + }, + { + "dest": "nxengine/tilekey.dat", + "sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da", + "size": 1028, + "repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat", + "cores": [ + "NXEngine" + ] + }, { "dest": "64DD_IPL.bin", "sha1": "bf861922dcb78c316360e3e742f4f70ff63c9bc3", @@ -6828,6 +6879,33 @@ "Stella 2023" ] }, + { + "dest": "Gram Kracker.ctg", + "sha1": "56dd520570cdcdd60dda2eedc8af1e02a781dcc5", + "size": 7587, + "repo_path": "bios/Texas Instruments/TI-99/Gram Kracker.ctg", + "cores": [ + "ti99sim" + ] + }, + { + "dest": "ti-pcard.ctg", + "sha1": "c7bf5fcfea0502011dca76d12efcc242e23421b9", + "size": 71924, + "repo_path": "bios/Texas Instruments/TI-99/ti-pcard.ctg", + "cores": [ + "ti99sim" + ] + }, + { + "dest": "cf7+.ctg", + "sha1": "698c638e1773244a6bf8a353c87d210047cce402", + "size": 5768, + "repo_path": "bios/Texas Instruments/TI-99/cf7+.ctg", + "cores": [ + "ti99sim" + ] + }, { "dest": "JiffyDOS_SX-64.bin", "sha1": "942c2150123dc30f40b3df6086132ef0a3c43948", @@ -7053,6 +7131,15 @@ "XRoar" ] }, + { + "dest": "delta2.rom", + "sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60", + "size": 8192, + "repo_path": "bios/Dragon/Dragon/delta2.rom", + "cores": [ + "XRoar" + ] + }, { "dest": "cp450dsk.rom", "sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b", diff --git a/install/retroarch.json b/install/retroarch.json index 55167fdb..068254bb 100644 --- a/install/retroarch.json +++ b/install/retroarch.json @@ -4,7 +4,7 @@ "platform": "retroarch", "display_name": "RetroArch", "version": "1.0", - "generated": "2026-04-02T08:32:35Z", + "generated": "2026-04-02T13:52:45Z", "base_destination": "system", "detect": [ { @@ -33,8 +33,8 @@ } ], "standalone_copies": [], - "total_files": 1621, - "total_size": 5255390792, + "total_files": 1627, + "total_size": 5735234905, "files": [ { "dest": "3do_arcade_saot.bin", @@ -5097,6 +5097,39 @@ "storage": "release", "release_asset": "vimana.zip" }, + { + "dest": "fbneo/samples/donpachi.zip", + "sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1", + "size": 208549253, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "donpachi.zip" + }, + { + "dest": "fbneo/samples/sfz3mix.zip", + "sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9", + "size": 116329446, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "sfz3mix.zip" + }, + { + "dest": "fbneo/samples/twotiger.zip", + "sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9", + "size": 154888877, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "twotiger.zip" + }, { "dest": "nes.pal", "sha1": "37027d92e1015b82a7dc5c43e9f1649a961577ab", @@ -7889,6 +7922,24 @@ "NXEngine" ] }, + { + "dest": "nxengine/data/sprites.sif", + "sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b", + "size": 59482, + "repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif", + "cores": [ + "NXEngine" + ] + }, + { + "dest": "nxengine/tilekey.dat", + "sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da", + "size": 1028, + "repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat", + "cores": [ + "NXEngine" + ] + }, { "dest": "mda.rom", "sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f", @@ -9677,6 +9728,15 @@ "SameBoy" ] }, + { + "dest": "sdlpal/desc.dat", + "sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba", + "size": 16027, + "repo_path": "bios/sdlpal/desc.dat", + "cores": [ + "SDLPAL" + ] + }, { "dest": "SkyEmu/dmg_rom.bin", "sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f", diff --git a/install/retrobat.json b/install/retrobat.json index 93f5362d..b4dc2e33 100644 --- a/install/retrobat.json +++ b/install/retrobat.json @@ -4,7 +4,7 @@ "platform": "retrobat", "display_name": "RetroBat", "version": "1.0", - "generated": "2026-04-02T08:33:12Z", + "generated": "2026-04-02T13:53:25Z", "base_destination": "bios", "detect": [ { @@ -14,8 +14,8 @@ } ], "standalone_copies": [], - "total_files": 1163, - "total_size": 4297804943, + "total_files": 1169, + "total_size": 4777641221, "files": [ { "dest": "panafz1.bin", @@ -3977,6 +3977,39 @@ "storage": "release", "release_asset": "vimana.zip" }, + { + "dest": "fbneo/samples/donpachi.zip", + "sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1", + "size": 208549253, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "donpachi.zip" + }, + { + "dest": "fbneo/samples/sfz3mix.zip", + "sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9", + "size": 116329446, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "sfz3mix.zip" + }, + { + "dest": "fbneo/samples/twotiger.zip", + "sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9", + "size": 154888877, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "twotiger.zip" + }, { "dest": "gamegenie.nes", "sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779", @@ -6200,6 +6233,24 @@ "NXEngine" ] }, + { + "dest": "nxengine/data/sprites.sif", + "sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b", + "size": 59482, + "repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif", + "cores": [ + "NXEngine" + ] + }, + { + "dest": "nxengine/tilekey.dat", + "sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da", + "size": 1028, + "repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat", + "cores": [ + "NXEngine" + ] + }, { "dest": "panafz1j.bin", "sha1": "ec7ec62d60ec0459a14ed56ebc66761ef3c80efc", @@ -7448,6 +7499,15 @@ "XRoar" ] }, + { + "dest": "delta2.rom", + "sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60", + "size": 8192, + "repo_path": "bios/Dragon/Dragon/delta2.rom", + "cores": [ + "XRoar" + ] + }, { "dest": "cp450dsk.rom", "sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b", diff --git a/install/retrodeck.json b/install/retrodeck.json index 61745462..8181c030 100644 --- a/install/retrodeck.json +++ b/install/retrodeck.json @@ -4,7 +4,7 @@ "platform": "retrodeck", "display_name": "RetroDECK", "version": "1.0", - "generated": "2026-04-02T08:33:28Z", + "generated": "2026-04-02T13:53:43Z", "base_destination": "", "detect": [ { @@ -15,8 +15,8 @@ } ], "standalone_copies": [], - "total_files": 3146, - "total_size": 5871648429, + "total_files": 3153, + "total_size": 6351500734, "files": [ { "dest": "bios/panafz1.bin", @@ -11082,7 +11082,7 @@ "dest": "bios/deltados.rom", "sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60", "size": 8192, - "repo_path": "bios/Dragon/Dragon/deltados.rom", + "repo_path": "bios/Dragon/Dragon/delta2.rom", "cores": null }, { @@ -16297,6 +16297,39 @@ "storage": "release", "release_asset": "vimana.zip" }, + { + "dest": "fbneo/samples/donpachi.zip", + "sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1", + "size": 208549253, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "donpachi.zip" + }, + { + "dest": "fbneo/samples/sfz3mix.zip", + "sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9", + "size": 116329446, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "sfz3mix.zip" + }, + { + "dest": "fbneo/samples/twotiger.zip", + "sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9", + "size": 154888877, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "twotiger.zip" + }, { "dest": "gamegenie.nes", "sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779", @@ -18263,6 +18296,24 @@ "NXEngine" ] }, + { + "dest": "nxengine/data/sprites.sif", + "sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b", + "size": 59482, + "repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif", + "cores": [ + "NXEngine" + ] + }, + { + "dest": "nxengine/tilekey.dat", + "sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da", + "size": 1028, + "repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat", + "cores": [ + "NXEngine" + ] + }, { "dest": "mda.rom", "sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f", @@ -20044,6 +20095,15 @@ "SameBoy" ] }, + { + "dest": "sdlpal/desc.dat", + "sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba", + "size": 16027, + "repo_path": "bios/sdlpal/desc.dat", + "cores": [ + "SDLPAL" + ] + }, { "dest": "SkyEmu/dmg_rom.bin", "sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f", @@ -21740,6 +21800,15 @@ "XRoar" ] }, + { + "dest": "delta2.rom", + "sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60", + "size": 8192, + "repo_path": "bios/Dragon/Dragon/delta2.rom", + "cores": [ + "XRoar" + ] + }, { "dest": "cp450dsk.rom", "sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b", diff --git a/install/romm.json b/install/romm.json index 5f8d2feb..17293f7b 100644 --- a/install/romm.json +++ b/install/romm.json @@ -4,7 +4,7 @@ "platform": "romm", "display_name": "RomM", "version": "1.0", - "generated": "2026-04-01T14:43:09Z", + "generated": "2026-04-02T13:53:45Z", "base_destination": "bios", "detect": [ { @@ -14,8 +14,8 @@ } ], "standalone_copies": [], - "total_files": 535, - "total_size": 1076531155, + "total_files": 538, + "total_size": 1556298731, "files": [ { "dest": "3do/3do_arcade_saot.bin", @@ -2796,6 +2796,39 @@ "ep128emu-core" ] }, + { + "dest": "colecovision/fbneo/samples/donpachi.zip", + "sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1", + "size": 208549253, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "donpachi.zip" + }, + { + "dest": "colecovision/fbneo/samples/sfz3mix.zip", + "sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9", + "size": 116329446, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "sfz3mix.zip" + }, + { + "dest": "colecovision/fbneo/samples/twotiger.zip", + "sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9", + "size": 154888877, + "repo_path": "", + "cores": [ + "FinalBurn Neo" + ], + "storage": "release", + "release_asset": "twotiger.zip" + }, { "dest": "fds/gamegenie.nes", "sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779", diff --git a/scripts/generate_site.py b/scripts/generate_site.py index 7e5c0df4..4206e8ec 100644 --- a/scripts/generate_site.py +++ b/scripts/generate_site.py @@ -127,11 +127,22 @@ def _build_system_page_map_from_data( break +def _slugify_anchor(text: str) -> str: + """Slugify text for MkDocs anchor compatibility.""" + import re + + slug = text.lower() + slug = re.sub(r"[^\w\s-]", "", slug) + slug = re.sub(r"[\s]+", "-", slug) + slug = slug.strip("-") + return slug + + def _system_link(sys_id: str, prefix: str = "") -> str: """Generate a markdown link to a system page with anchor.""" if sys_id in _system_page_map: slug, console = _system_page_map[sys_id] - anchor = console.lower().replace(" ", "-").replace("/", "-") + anchor = _slugify_anchor(console) return f"[{sys_id}]({prefix}systems/{slug}.md#{anchor})" return sys_id @@ -239,7 +250,9 @@ def generate_home( # Classification stats classifications: dict[str, int] = {} for p in unique.values(): - cls = p.get("core_classification", "unclassified") + cls = p.get("core_classification", "other") + if cls not in CLS_LABELS or cls == "unclassified": + cls = "other" classifications[cls] = classifications.get(cls, 0) + 1 # Count total systems across all profiles @@ -893,8 +906,10 @@ def generate_emulator_page( emu_name = profile.get("emulator", name) emu_type = profile.get("type", "unknown") classification = profile.get("core_classification", "") - source = profile.get("source", "") - upstream = profile.get("upstream", "") + source_raw = profile.get("source", "") + source = str(source_raw) if not isinstance(source_raw, dict) else "" + upstream_raw = profile.get("upstream", "") + upstream = str(upstream_raw) if not isinstance(upstream_raw, dict) else "" version = profile.get("core_version", "unknown") profile.get("display_name", emu_name) profiled = profile.get("profiled_date", "unknown") @@ -920,10 +935,32 @@ def generate_emulator_page( if classification: cls_display = CLS_LABELS.get(classification, classification) lines.append(f"| Classification | {cls_display} |") - if source: - lines.append(f"| Source | [{source}]({source}) |") - if upstream and upstream != source: - lines.append(f"| Upstream | [{upstream}]({upstream}) |") + if isinstance(source_raw, dict): + parts = [] + for k, v in source_raw.items(): + if isinstance(v, str) and v.startswith("http"): + parts.append(f"[{k}]({v})") + else: + parts.append(f"{k}: {v}") + lines.append(f"| Source | {', '.join(parts)} |") + elif source: + if source.startswith("http"): + lines.append(f"| Source | [{source}]({source}) |") + else: + lines.append(f"| Source | {source} |") + if isinstance(upstream_raw, dict): + parts = [] + for k, v in upstream_raw.items(): + if isinstance(v, str) and v.startswith("http"): + parts.append(f"[{k}]({v})") + else: + parts.append(f"{k}: {v}") + lines.append(f"| Upstream | {', '.join(parts)} |") + elif upstream and upstream != source: + if upstream.startswith("http"): + lines.append(f"| Upstream | [{upstream}]({upstream}) |") + else: + lines.append(f"| Upstream | {upstream} |") lines.append(f"| Version | {version} |") lines.append(f"| Profiled | {profiled} |") if cores: @@ -1824,8 +1861,10 @@ def generate_cross_reference( cls_raw = p.get("core_classification", "-") cls = CLS_LABELS.get(cls_raw, cls_raw) p.get("type", "") - upstream = p.get("upstream", "") - source = p.get("source", "") + upstream_raw2 = p.get("upstream", "") + upstream = str(upstream_raw2) if not isinstance(upstream_raw2, dict) else "" + source_raw2 = p.get("source", "") + source = str(source_raw2) if not isinstance(source_raw2, dict) else "" systems = p.get("systems", []) files = p.get("files", []) @@ -1847,12 +1886,16 @@ def generate_cross_reference( file_str += f" ({', '.join(parts)})" upstream_display = "-" - if upstream: + if upstream and upstream.startswith("http"): upstream_short = upstream.replace("https://github.com/", "") upstream_display = f"[{upstream_short}]({upstream})" - elif source: + elif upstream: + upstream_display = upstream + elif source and source.startswith("http"): source_short = source.replace("https://github.com/", "") upstream_display = f"[{source_short}]({source})" + elif source: + upstream_display = source lines.append( f" | [{emu_display}](emulators/{emu_name}.md) | {cls} | " @@ -1874,9 +1917,10 @@ def generate_cross_reference( # Group profiles by upstream by_upstream: dict[str, list[str]] = {} for emu_name, p in sorted(unique.items()): - upstream = p.get("upstream", p.get("source", "")) - if upstream: - by_upstream.setdefault(upstream, []).append(emu_name) + raw_up = p.get("upstream", p.get("source", "")) + up_str = str(raw_up) if not isinstance(raw_up, dict) else "" + if up_str: + by_upstream.setdefault(up_str, []).append(emu_name) # Build platform membership per core platform_membership: dict[str, set[str]] = {} @@ -1910,8 +1954,12 @@ def generate_cross_reference( plat_str = ", ".join(sorted(all_plats)) if all_plats else "-" core_links = ", ".join(f"[{c}](emulators/{c}.md)" for c in sorted(cores)) + if upstream_url.startswith("http"): + upstream_cell = f"[{upstream_short}]({upstream_url})" + else: + upstream_cell = upstream_short lines.append( - f"| [{upstream_short}]({upstream_url}) | {core_links} | " + f"| {upstream_cell} | {core_links} | " f"{cls_str} | {plat_str} |" ) @@ -1973,6 +2021,7 @@ def generate_wiki_data_model(db: dict, profiles: dict) -> str: by_name = len(db.get("indexes", {}).get("by_name", {})) by_crc32 = len(db.get("indexes", {}).get("by_crc32", {})) by_path = len(db.get("indexes", {}).get("by_path_suffix", {})) + by_sha256 = len(db.get("indexes", {}).get("by_sha256", {})) lines = [ f"# Data model - {SITE_NAME}", @@ -2004,6 +2053,7 @@ def generate_wiki_data_model(db: dict, profiles: dict) -> str: f"| `by_name` | {by_name} | filename to SHA1 list (name-based resolution) |", f"| `by_crc32` | {by_crc32} | CRC32 to SHA1 lookup |", f"| `by_path_suffix` | {by_path} | relative path to SHA1 (regional variant disambiguation) |", + f"| `by_sha256` | {by_sha256} | SHA256 to SHA1 lookup (emulator profile validation) |", "", "### File resolution order", "", @@ -2016,6 +2066,8 @@ def generate_wiki_data_model(db: dict, profiles: dict) -> str: "5. Name + alias with md5_composite / direct MD5 per candidate", "6. zippedFile content match via inner ROM MD5 index", "7. MAME clone fallback (deduped ZIP mapped to canonical name)", + "8. Data directory scan (exact path then case-insensitive basename walk)", + "9. Agnostic fallback (size-constrained match under system path prefix)", "", "## Platform YAML", "", diff --git a/wiki/architecture.md b/wiki/architecture.md index a0c2ab66..58f9e79e 100644 --- a/wiki/architecture.md +++ b/wiki/architecture.md @@ -236,11 +236,11 @@ user's platform, filter files by hardware target, and download with SHA1 verific ## Tests -5 test files, 249 tests total: +5 test files, 259 tests total: | File | Tests | Coverage | |------|-------|----------| -| `test_e2e.py` | 186 | file resolution, verification, severity, cross-reference, aliases, inheritance, shared groups, data dirs, storage tiers, HLE, launchers, platform grouping, core resolution, target filtering, truth/diff, exporters | +| `test_e2e.py` | 196 | file resolution, verification, severity, cross-reference, aliases, inheritance, shared groups, data dirs, storage tiers, HLE, launchers, platform grouping, core resolution, target filtering, truth/diff, exporters | | `test_pack_integrity.py` | 8 | extract ZIP packs to disk, verify paths + hashes per platform's native mode | | `test_mame_parser.py` | 22 | BIOS root set detection, ROM block parsing, macro expansion | | `test_fbneo_parser.py` | 16 | BIOS set detection, ROM info parsing |