From 9a1bf4baa67e65a497336bba804cdfc378de5332 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Thu, 22 Oct 2026 21:16:47 +0200 Subject: [PATCH] feat: record the systems each libretro core runs --- platforms/batocera.yml | 401 +++++++++++++++++ platforms/knulli.yml | 379 ++++++++++++++++ platforms/recalbox.yml | 425 ++++++++++++++++++ platforms/retrobat.yml | 472 ++++++++++++++++++++ platforms/retrodeck.yml | 635 +++++++++++++++++++++++++++ schemas/platform.schema.json | 14 + scripts/scraper/batocera_scraper.py | 28 ++ scripts/scraper/knulli_scraper.py | 4 + scripts/scraper/recalbox_scraper.py | 29 +- scripts/scraper/retrobat_scraper.py | 28 ++ scripts/scraper/retrodeck_scraper.py | 52 ++- 11 files changed, 2462 insertions(+), 5 deletions(-) diff --git a/platforms/batocera.yml b/platforms/batocera.yml index fcf06b16..636ec81a 100644 --- a/platforms/batocera.yml +++ b/platforms/batocera.yml @@ -5813,6 +5813,407 @@ dual_mode_cores: - scummvm - stella - tic80 +libretro_systems: + "81": + - zx81 + a5200: + - atari5200 + applewin: + - apple2 + arduous: + - arduboy + atari800: + - atari5200 + - atari800 + beetle-saturn: + - saturn + bennugd: + - bennugd + bk: + - bk + blastem: + - megadrive + bluemsx: + - colecovision + - msx1 + - msx2 + - msx2+ + - msxturbor + - spectravideo + boom3: + - doom3 + bsnes: + - sgb-msu1 + - snes + - snes-msu1 + bsnes_hd: + - sgb-msu1 + - snes + - snes-msu1 + cap32: + - amstradcpc + - gx4000 + desmume: + - nds + dice: + - dice + dolphin: + - gamecube + - wii + dosbox_pure: + - dos + easyrpg: + - easyrpg + emuscv: + - scv + ep128emu-core: + - enterprise + - tvc + fake08: + - pico8 + fbalpha: + - fbneo + - neogeo + fbneo: + - fbneo + - neogeo + fceumm: + - fds + - nes + flycast: + - atomiswave + - dreamcast + - naomi + - naomi2 + - systemsp + flycastvl: + - atomiswave + - dreamcast + - naomi + fmsx: + - msx1 + - msx2 + - msx2+ + freechaf: + - channelf + freeintv: + - intellivision + freej2me: + - j2me + fuse: + - zxspectrum + gambatte: + - gb + - gbc + gearcoleco: + - colecovision + gearsystem: + - gamegear + - mastersystem + - multivision + - sg1000 + genesisplusgx: + - gamegear + - mastersystem + - megacd + - megadrive + - megadrive-msu + - pico + - sg1000 + genesisplusgx-expanded: + - megadrive + genesisplusgx-wide: + - megadrive + - megadrive-msu + - pico + gong: + - gong + gpsp: + - gba + gw: + - gameandwatch + handy: + - lynx + hatari: + - atarist + hatarib: + - atarist + holani: + - lynx + imame4all: + - mame + - neogeo + kronos: + - saturn + lowresnx: + - lowresnx + lutro: + - lutro + mame: + - adam + - advision + - apfm1000 + - apple2 + - arcadia + - archimedes + - astrocade + - atom + - bbcmicro + - beena + - bk + - camplynx + - cave3rd + - cdi + - cgenie + - coco + - crvision + - ctvboy + - dragon64 + - electron + - enterprise + - fm7 + - fmtowns + - gaelco + - gamate + - gameandwatch + - gamecom + - gamepock + - gmaster + - gp32 + - laser310 + - lcdgames + - loopy + - macintosh + - mame + - mc10 + - megaduck + - model2 + - mz2000 + - mz2500 + - mz700 + - mz800 + - mz80k + - namco22 + - neogeo + - oricatmos + - pc60 + - pc80 + - pcw + - pdp1 + - pv1000 + - pv2000 + - rx78 + - samcoupe + - sc3000 + - segaai + - socrates + - supracan + - sv8000 + - ti99 + - trs80 + - tutor + - tvc + - tvgames + - uzebox + - vc4000 + - vectrex + - vgmplay + - vis + - vsmile + - xegs + mame078plus: + - mame + - neogeo + mednafen_lynx: + - lynx + mednafen_ngp: + - ngp + - ngpc + mednafen_psx: + - psx + mednafen_supergrafx: + - supergrafx + mednafen_wswan: + - wswan + - wswanc + melonds: + - nds + melondsds: + - nds + mesen: + - fds + - nes + mesen-s: + - gb + - gbc + - satellaview + - sgb + - snes + mgba: + - gb + - gba + - gbc + - sgb + minivmac: + - macintosh + mrboom: + - mrboom + mupen64plus-next: + - n64 + - n64dd + neocd: + - neogeocd + nestopia: + - fds + - nes + np2kai: + - pc98 + nxengine: + - cavestory + o2em: + - odyssey2 + - videopacplus + opera: + - 3do + parallel_n64: + - n64 + - n64dd + pce: + - pcengine + - pcenginecd + pce_fast: + - pcengine + - pcenginecd + pcfx: + - pcfx + pcsx2: + - ps2 + pcsx_rearmed: + - psx + pd777: + - cassettevision + picodrive: + - gamegear + - mastersystem + - megacd + - megadrive + - pico + - sega32x + play: + - ps2 + pocketsnes: + - satellaview + - snes + - snes-msu1 + pokemini: + - pokemini + potator: + - supervision + ppsspp: + - psp + prboom: + - prboom + prosystem: + - atari7800 + puae: + - amiga1200 + - amiga500 + - amigacd32 + - amigacdtv + puae2021: + - amiga1200 + - amiga500 + - amigacd32 + - amigacdtv + px68k: + - x68000 + quasi88: + - pc88 + reminiscence: + - reminiscence + same_cdi: + - cdi + sameduck: + - megaduck + scummvm: + - scummvm + smsplus: + - gamegear + - mastersystem + snes9x: + - satellaview + - snes + - snes-msu1 + - sufami + snes9x_next: + - snes + squirreljme: + - j2me + stella: + - atari2600 + stella2014: + - atari2600 + superbroswar: + - superbroswar + swanstation: + - psx + tgbdual: + - gb2players + - gbc2players + theodore: + - thomson + tic80: + - tic80 + tyrquake: + - quake + uae4arm: + - amiga1200 + - amiga500 + - amigacd32 + - amigacdtv + uzem: + - uzebox + vb: + - virtualboy + vba-m: + - gb + - gba + - gbc + vecx: + - vectrex + vemulator: + - vemulator + vice_x128: + - c128 + vice_x64: + - c64 + vice_x64sc: + - c64 + vice_xpet: + - pet + vice_xplus4: + - cplus4 + vice_xscpu64: + - c64 + vice_xvic: + - c20 + vircon32: + - vircon32 + virtualjaguar: + - jaguar + - jaguarcd + vitaquake2: + - quake2 + wasm4: + - wasm4 + x1: + - x1 + xrick: + - xrick + yabasanshiro: + - saturn + zc210: + - zc210 launchers: - emulator: duckstation build: standalone diff --git a/platforms/knulli.yml b/platforms/knulli.yml index 45e00ab0..947545a9 100644 --- a/platforms/knulli.yml +++ b/platforms/knulli.yml @@ -5015,3 +5015,382 @@ dual_mode_cores: - scummvm - stella - yabasanshiro +libretro_systems: + "81": + - zx81 + a5200: + - atari5200 + applewin: + - apple2 + arduous: + - arduboy + atari800: + - atari5200 + - atari800 + beetle-saturn: + - saturn + bennugd: + - bennugd + blastem: + - megadrive + bluemsx: + - colecovision + - msx1 + - msx2 + - msx2+ + - msxturbor + - spectravideo + boom3: + - doom3 + bsnes: + - sgb-msu1 + - snes + - snes-msu1 + bsnes_hd: + - sgb-msu1 + - snes + - snes-msu1 + cap32: + - amstradcpc + - gx4000 + citra: + - 3ds + desmume: + - nds + dice: + - dice + dolphin: + - gamecube + - wii + dosbox_pure: + - dos + easyrpg: + - easyrpg + emuscv: + - scv + fake08: + - pico8 + fbalpha: + - fbneo + - neogeo + fbneo: + - fbneo + - neogeo + fceumm: + - fds + - nes + flycast: + - atomiswave + - dreamcast + - naomi + - naomi2 + - systemsp + flycast-xtreme: + - atomiswave + - dreamcast + - naomi + - naomi2 + - systemsp + flycastvl: + - atomiswave + - dreamcast + - naomi + fmsx: + - msx1 + - msx2 + - msx2+ + freechaf: + - channelf + freeintv: + - intellivision + freej2me: + - j2me + fuse: + - zxspectrum + gambatte: + - gb + - gbc + gearsystem: + - gamegear + - mastersystem + - multivision + - sg1000 + genesisplusgx: + - gamegear + - mastersystem + - megadrive + - msu-md + - pico + - segacd + - sg1000 + genesisplusgx-expanded: + - megadrive + genesisplusgx-wide: + - megadrive + - msu-md + - pico + geolith: + - fbneo + - neogeo + gong: + - gong + gpsp: + - gba + gw: + - gameandwatch + handy: + - lynx + hatari: + - atarist + hatarib: + - atarist + holani: + - lynx + imame4all: + - mame + - neogeo + kronos: + - saturn + lowresnx: + - lowresnx + lutro: + - lutro + mame: + - adam + - advision + - apfm1000 + - apple2 + - apple2gs + - arcadia + - archimedes + - astrocde + - atom + - bbc + - camplynx + - cdi + - coco + - crvision + - electron + - fm7 + - fmtowns + - gamate + - gameandwatch + - gamecom + - gamepock + - gmaster + - gp32 + - laser310 + - lcdgames + - macintosh + - mame + - megaduck + - namco22 + - neogeo + - pdp1 + - plugnplay + - pv1000 + - socrates + - supracan + - ti99 + - tutor + - vc4000 + - vgmplay + - vis + - vsmile + - xegs + mame0139: + - mame + - neogeo + mame078plus: + - mame + - neogeo + mednafen_lynx: + - lynx + mednafen_ngp: + - ngp + - ngpc + mednafen_psx: + - psx + mednafen_supergrafx: + - supergrafx + mednafen_wswan: + - wswan + - wswanc + melonds: + - nds + melondsds: + - nds + mesen: + - fds + - nes + mesen-s: + - gb + - gbc + - satellaview + - sgb + - snes + mgba: + - gb + - gba + - gbc + - sgb + minivmac: + - macintosh + mrboom: + - mrboom + mupen64plus-next: + - n64 + - n64dd + neocd: + - neogeocd + nestopia: + - fds + - nes + np2kai: + - pc98 + nxengine: + - cavestory + o2em: + - o2em + - videopacplus + openlara: + - traider1 + opera: + - 3do + parallel_n64: + - n64 + - n64dd + pce: + - pcengine + - pcenginecd + pce_fast: + - pcengine + - pcenginecd + pcfx: + - pcfx + pcsx2: + - ps2 + pcsx_rearmed: + - psx + picodrive: + - gamegear + - mastersystem + - megadrive + - pico + - sega32x + - segacd + play: + - ps2 + pocketsnes: + - satellaview + - snes + - snes-msu1 + pokemini: + - pokemini + potator: + - supervision + ppsspp: + - psp + prboom: + - prboom + prosystem: + - atari7800 + puae: + - amiga1200 + - amiga500 + - amigacd32 + - amigacdtv + puae2021: + - amiga1200 + - amiga500 + - amigacd32 + - amigacdtv + px68k: + - x68000 + quasi88: + - pc88 + reminiscence: + - reminiscence + same_cdi: + - cdi + sameduck: + - megaduck + scummvm: + - scummvm + smsplus: + - gamegear + - mastersystem + snes9x: + - satellaview + - snes + - snes-msu1 + - sufami + snes9x_next: + - snes + squirreljme: + - j2me + stella: + - atari2600 + stella2014: + - atari2600 + superbroswar: + - superbroswar + swanstation: + - psx + tgbdual: + - gb2players + - gbc2players + theodore: + - thomson + tic80: + - tic80 + tyrquake: + - quake + uae4arm: + - amiga1200 + - amiga500 + - amigacd32 + - amigacdtv + uzem: + - uzebox + vb: + - virtualboy + vba-m: + - gb + - gba + - gbc + vecx: + - vectrex + vemulator: + - vemulator + vice_x128: + - c128 + vice_x64: + - c64 + vice_x64sc: + - c64 + vice_xpet: + - pet + vice_xplus4: + - cplus4 + vice_xscpu64: + - c64 + vice_xvic: + - c20 + vircon32: + - vircon32 + virtualjaguar: + - jaguar + - jaguarcd + vitaquake2: + - quake2 + wasm4: + - wasm4 + x1: + - x1 + xrick: + - xrick + yabasanshiro: + - saturn + zc210: + - zc210 diff --git a/platforms/recalbox.yml b/platforms/recalbox.yml index ad54a51e..13249dcd 100644 --- a/platforms/recalbox.yml +++ b/platforms/recalbox.yml @@ -3409,6 +3409,431 @@ systems: mandatory_declared: true native_name: ST-V native_id: stv +libretro_systems: + "2048": + - "2048" + "81": + - zx81 + a5200: + - atari5200 + amiberry: + - amiga1200 + - amiga600 + - amigacd32 + - amigacdtv + applewin: + - apple2 + arduous: + - arduboy + atari800: + - atari5200 + - atari800 + b2: + - bbcmicro + bk: + - bk + bluemsx: + - colecovision + - msx1 + - msx2 + - msxturbor + - multivision + - sg1000 + - spectravideo + boom3: + - doom3 + bsnes: + - gb + - gbc + - satellaview + - snes + bsneshd: + - satellaview + - snes + cannonball: + - outrun + cap32: + - amstradcpc + - gx4000 + cdi2015: + - cdi + craft: + - minecraft + crocods: + - amstradcpc + desmume: + - nds + dice: + - dice + dinothawr: + - dinothawr + dirksimple: + - daphne + dolphin: + - gamecube + - wii + dosbox_pure: + - dos + easyrpg: + - easyrpg + ecwolf: + - wolfenstein3d + eightyone: + - zx81 + - zxspectrum + emuscv: + - scv + exel-hence: + - exl100 + fake08: + - pico8 + fbneo: + - channelf + - colecovision + - fbneo + - fds + - gamegear + - mastersystem + - megadrive + - msx1 + - neogeo + - neogeocd + - nes + - ngp + - pcengine + - sg1000 + - supergrafx + - zxspectrum + fceumm: + - fds + - nes + flycast: + - 240ptestsuite + - atomiswave + - dreamcast + - naomi + - naomigd + flycast-next: + - atomiswave + - dreamcast + - naomi + - naomi2 + - naomigd + fmsx: + - msx1 + - msx2 + freechaf: + - channelf + freeintv: + - intellivision + fuse: + - zxspectrum + gambatte: + - 240ptestsuite + - gb + - gbc + gearcoleco: + - colecovision + geargrafx: + - pcengine + - pcenginecd + - supergrafx + gearsystem: + - gamegear + - mastersystem + - multivision + - sg1000 + genesisplusgx: + - 240ptestsuite + - gamegear + - mastersystem + - megadrive + - segacd + - sg1000 + genesisplusgx_ex: + - megadrive + genesisplusgxwide: + - megadrive + geolith: + - neogeo + - neogeocd + gong: + - gong + gpsp: + - gba + gw: + - gw + handy: + - lynx + hatari: + - atarist + hatarib: + - atarist + holani: + - lynx + hypseus_singe: + - daphne + imageviewer: + - imageviewer + kronos: + - saturn + - stv + lowresnx: + - lowresnx + lutro: + - lutro + m2000: + - p2000t + mame0258: + - mame + mame0278: + - mame + mame2000: + - mame + - neogeo + mame2003: + - mame + - neogeo + mame2003_plus: + - mame + - neogeo + mame2010: + - mame + - neogeo + mame2015: + - mame + - neogeo + mame2016: + - neogeo + mednafen_lynx: + - lynx + mednafen_ngp: + - ngp + - ngpc + mednafen_pce_fast: + - pcengine + - pcenginecd + mednafen_pcfx: + - pcfx + mednafen_psx: + - psx + mednafen_psx_hw: + - psx + mednafen_saturn: + - saturn + mednafen_stv: + - stv + mednafen_supafaust: + - snes + mednafen_supergrafx: + - 240ptestsuite + - pcengine + - pcenginecd + - supergrafx + mednafen_vb: + - virtualboy + mednafen_wswan: + - pcv2 + - wswan + - wswanc + melonds: + - nds + mesen: + - fds + - nes + mesen_s: + - gb + - gbc + - satellaview + - snes + meteor: + - gba + mgba: + - 240ptestsuite + - gb + - gba + - gbc + minivmac: + - macintosh + mojozork: + - zmachine + mrboom: + - mrboom + mu: + - palm + mupen64plus: + - n64 + mupen64plus_next: + - 64dd + - n64 + neocd: + - neogeocd + nestopia: + - 240ptestsuite + - fds + - nes + np2kai: + - pc98 + nxengine: + - cavestory + o2em: + - o2em + - videopacplus + opera: + - 3do + parallel_n64: + - 64dd + - n64 + pcsx2: + - ps2 + pcsx_rearmed: + - psx + pd777: + - cassettevision + picodrive: + - gamegear + - mastersystem + - megadrive + - pico + - sega32x + - segacd + - sg1000 + pokemini: + - pokemini + potator: + - supervision + ppsspp: + - psp + prboom: + - doom + prosystem: + - atari7800 + ps2: + - ps2 + puae: + - amiga1200 + - amiga600 + - amigacd32 + - amigacdtv + puae2021: + - amiga1200 + - amiga600 + - amigacd32 + - amigacdtv + px68k: + - x68000 + quasi88: + - pc88 + quicknes: + - nes + race: + - ngp + - ngpc + rb5000: + - vg5000 + reminiscence: + - flashback + retro8: + - pico8 + retrodream: + - dreamcast + same_cdi: + - cdi + sameboy: + - gb + - gbc + sameduck: + - megaduck + scummvm: + - scummvm + snes9x: + - 240ptestsuite + - satellaview + - snes + - sufami + snes9x2002: + - snes + snes9x2005: + - snes + snes9x2010: + - snes + stella: + - atari2600 + stella2014: + - atari2600 + stonesoup: + - dungeoncrawlstonesoup + sugarbox2: + - amstradcpc + - gx4000 + swanstation: + - 240ptestsuite + - psx + tamalibretro: + - tamagotchi + tgbdual: + - gb + - gbc + theodore: + - thomson + thepowdertoy: + - thepowdertoy + tic80: + - tic80 + tyrquake: + - quake + uae4all: + - amiga600 + uae4arm: + - amiga1200 + - amiga600 + - amigacd32 + - amigacdtv + uzem: + - uzebox + vecx: + - vectrex + vice_x128: + - c64 + vice_x64: + - c64 + vice_x64sc: + - c64 + vice_xcbm2: + - c64 + vice_xcbm5x0: + - c64 + vice_xpet: + - c64 + vice_xplus4: + - c64 + vice_xscpu64: + - c64 + vice_xvic: + - c64 + - vic20 + vircon32: + - vircon32 + virtualjaguar: + - jaguar + vitaquake2: + - quake2 + vitaquake3: + - quake3 + vitavoyager: + - startrekvoyager + wasm4: + - wasm4 + x1: + - x1 + xrick: + - rickdangerous + yabasanshiro: + - saturn + yabause: + - saturn + ymir: + - saturn launchers: - emulator: hatari build: standalone diff --git a/platforms/retrobat.yml b/platforms/retrobat.yml index d0adca3d..b4dbadaf 100644 --- a/platforms/retrobat.yml +++ b/platforms/retrobat.yml @@ -3047,6 +3047,478 @@ systems: native_path: bios/mame/hash/xegs.xml native_name: Atari XEGS name: Atari XEGS +libretro_systems: + "81": + - zx81 + DoubleCherryGB: + - gb + - gb2players + - gbc + - gbc2players + a5200: + - atari5200 + amiarcadia: + - arcadia + - vc4000 + amiberry: + - amiga1200 + - amiga4000 + - amiga500 + - amigacd32 + - amigacdtv + applewin: + - apple2 + ardens: + - arduboy + arduous: + - arduboy + atari800: + - atari5200 + - atari800 + azahar: + - 3ds + b2: + - bbcmicro + bennugd: + - bennugd + bk: + - bk + bluemsx: + - colecovision + - msx1 + - msx2 + - msx2+ + - msxturbor + - spectravideo + boom3: + - doom3 + boom3_xp: + - doom3 + bsnes: + - gb + - sgb-msu1 + - snes + - snes-msu1 + - sufami + bsnes-jg: + - snes + bsnes_hd_beta: + - sgb-msu1 + - snes + - snes-msu1 + cannonball: + - cannonball + cap32: + - amstradcpc + - gx4000 + crocods: + - amstradcpc + desmume: + - nds + desmume2015: + - nds + dice: + - dice + dinothawr: + - dinothawr + dolphin: + - gamecube + - triforce + - wii + dosbox_pure: + - dos + doukutsu_rs: + - cavestory + easyrpg: + - easyrpg + ecwolf: + - ecwolf + emuscv: + - scv + ep128emu_core: + - enterprise + fake08: + - pico8 + fbalpha: + - cave + - cps1 + - cps2 + - cps3 + - fbneo + - neogeo + fbalpha2012: + - cave + - cps1 + - cps2 + - cps3 + - fbneo + fbalpha2012_cps1: + - cps1 + fbalpha2012_cps2: + - cps2 + fbalpha2012_cps3: + - cps3 + fbalpha2012_neogeo: + - fbneo + - neogeo + fbneo: + - cave + - colecovision + - cps1 + - cps2 + - cps3 + - fbneo + - gamegear + - mastersystem + - megadrive + - msx1 + - msx2 + - msx2+ + - msxturbor + - neogeo + - neogeocd + - pcengine + - pcenginecd + - supergrafx + - zx81 + - zxspectrum + fceumm: + - fds + - nes + flycast: + - atomiswave + - dreamcast + - naomi + - naomi2 + freechaf: + - channelf + freeintv: + - intellivision + freej2me: + - j2me + frodo: + - c64 + fuse: + - zx81 + - zxspectrum + gambatte: + - gb + - gbc + gearcoleco: + - adam + - colecovision + geargrafx: + - supergrafx + gearsystem: + - gamegear + - mastersystem + - multivision + - sg1000 + genesis_plus_gx: + - gamegear + - mastersystem + - megacd + - megadrive + - megadrive-msu + - sg1000 + genesis_plus_gx_expanded: + - megadrive-msu + genesis_plus_gx_wide: + - megacd + - megadrive + - megadrive-msu + geolith: + - neogeo + gpsp: + - gba + gw: + - gw + - lcdgames + handy: + - lynx + hatari: + - atarist + hatarib: + - atarist + holani: + - lynx + imageviewer: + - screenshots + jollycv: + - colecovision + - crvision + kronos: + - saturn + - segastv + lowresnx: + - lowresnx + lutro: + - lutro + m2000: + - p2000t + mame: + - adam + - advision + - apfm1000 + - apple2 + - apple2gs + - aquarius + - arcadia + - archimedes + - astrocade + - atom + - bbcmicro + - camplynx + - casloopy + - cave + - cdi + - coco + - crvision + - electron + - fm7 + - fmtowns + - gaelco + - gamate + - gamecom + - gamepock + - gmaster + - gp32 + - gw + - hbmame + - lcdgames + - mame + - megaduck + - model2 + - neogeo64 + - odyssey2 + - oricatmos + - pegasus + - pv1000 + - scv + - segastv + - supracan + - ti99 + - tutor + - tvgames + - vc4000 + - vg5k + - vsmile + - xegs + - zinc + mame2000: + - mame + mame2003: + - mame + - segastv + mame2003_midway: + - mame + mame2003_plus: + - cave + - mame + - segastv + mame2010: + - mame + - segastv + mame2014: + - gaelco + - mame + - segastv + mame2016: + - cave + - gaelco + - mame + - neogeo64 + - segastv + mednafen_gba: + - gba + mednafen_lynx: + - lynx + mednafen_ngp: + - ngp + - ngpc + mednafen_pce: + - pcengine + - pcenginecd + mednafen_pce_fast: + - pcengine + - pcenginecd + mednafen_pcfx: + - pcfx + mednafen_psx_hw: + - psx + mednafen_saturn: + - saturn + mednafen_snes: + - snes + mednafen_supergrafx: + - supergrafx + mednafen_vb: + - virtualboy + mednafen_wswan: + - wswan + - wswanc + melonds: + - nds + melondsds: + - nds + mesen: + - fds + - nes + mesen-s: + - gb + - satellaview + - sgb + - snes + - snes-msu1 + mgba: + - gba + - sgb + mupen64plus_next: + - n64 + - n64dd + nekop2: + - pc98 + neocd: + - neogeocd + nestopia: + - fds + - nes + noods: + - nds + np2kai: + - pc98 + nxengine: + - cavestory + o2em: + - odyssey2 + openlara: + - openlara + opera: + - 3do + parallel_n64: + - n64 + - n64dd + pcsx2: + - ps2 + pcsx_rearmed: + - psx + pd777: + - cassettevision + picodrive: + - gamegear + - mastersystem + - megacd + - megadrive + - sega32x + pocketcdg: + - karaoke + pokemini: + - pokemini + potator: + - supervision + ppsspp: + - psp + prboom: + - doom + prosystem: + - atari7800 + puae: + - amiga1200 + - amiga4000 + - amiga500 + - amigacd32 + - amigacdtv + px68k: + - x68000 + quasi88: + - pc88 + race: + - ngp + - ngpc + reminiscence: + - reminiscence + retro8: + - pico8 + same_cdi: + - cdi + sameboy: + - gb + - gb2players + - gbc + - gbc2players + sameduck: + - megaduck + scummvm: + - scummvm + snes9x: + - satellaview + - snes + - snes-msu1 + - sufami + snes9x2005: + - snes + stella: + - atari2600 + stella2014: + - atari2600 + - atari5200 + superbroswar: + - superbroswar + supermodel: + - model3 + swanstation: + - psx + tgbdual: + - gb + - gb2players + - gbc + - gbc2players + theodore: + - thomson + tic80: + - tic80 + tyrquake: + - quake + uzem: + - uzebox + vecx: + - vectrex + vice_x128: + - c128 + vice_x64: + - c64 + vice_x64sc: + - c64 + vice_xpet: + - pet + vice_xplus4: + - c16 + - cplus4 + vice_xvic: + - c20 + vircon32: + - vircon32 + virtualjaguar: + - jaguar + - jaguarcd + vitaquake2: + - quake2 + vitaquake2-rogue: + - quake2 + vitaquake2-xatrix: + - quake2 + vitaquake2-zaero: + - quake2 + wasm4: + - wasm4 + x1: + - x1 + yabasanshiro: + - saturn + ymir: + - saturn + zc255: + - zeldaclassic launchers: - emulator: amiberry build: standalone diff --git a/platforms/retrodeck.yml b/platforms/retrodeck.yml index 3506c588..f59aa340 100644 --- a/platforms/retrodeck.yml +++ b/platforms/retrodeck.yml @@ -16040,6 +16040,641 @@ systems: native_system: coco component: xroar description: Generic disk ROM +libretro_systems: + "81": + - zx81 + DoubleCherryGB: + - gb + - gbc + a5200: + - atari5200 + amiarcadia: + - arcadia + amiberry: + - amiga + - amiga1200 + - amiga600 + - amigacd32 + - cdtv + applewin: + - apple2 + ardens: + - arduboy + arduous: + - arduboy + atari800: + - atari5200 + - atari800 + - atarixe + azahar: + - n3ds + b2: + - bbcmicro + blastem: + - colecovision + - gamegear + - genesis + - mark3 + - mastersystem + - megacd + - megacdjp + - megadrive + - megadrivejp + - sega32x + - sega32xjp + - sega32xna + - segacd + - sg-1000 + bluemsx: + - colecovision + - msx + - msx1 + - msx2 + - msxturbor + - sg-1000 + - spectravideo + boom3: + - doom + boom3_xp: + - doom + bsnes: + - gb + - gbc + - satellaview + - sfc + - snes + - snesna + - sufami + bsnes-jg: + - satellaview + - sfc + - snes + - snesna + - sufami + bsnes_hd_beta: + - satellaview + - sfc + - snes + - snesna + - sufami + bsnes_mercury_accuracy: + - satellaview + - sfc + - snes + - snesna + - sufami + cannonball: + - ports + cap32: + - amstradcpc + - gx4000 + cdi2015: + - cdimono1 + cemu: + - wiiu + chailove: + - chailove + citra: + - n3ds + citra2018: + - n3ds + clownmdemu: + - megacd + - megacdjp + - segacd + craft: + - ports + crocods: + - amstradcpc + - gx4000 + desmume: + - nds + desmume2015: + - nds + dice: + - arcade + - mame + dirksimple: + - daphne + - laserdisc + dolphin: + - gc + - wii + dosbox_core: + - dos + - pc + dosbox_pure: + - dos + - pc + - windows3x + - windows9x + dosbox_svn: + - dos + - pc + easyrpg: + - easyrpg + ecwolf: + - ports + fbalpha2012: + - arcade + - cps + - cps1 + - cps2 + - cps3 + - fba + - mame + fbalpha2012_cps1: + - cps + - cps1 + - fba + fbalpha2012_cps2: + - cps + - cps2 + - fba + fbalpha2012_cps3: + - cps + - cps3 + - fba + fbalpha2012_neogeo: + - fba + fbneo: + - arcade + - cps + - cps1 + - cps2 + - cps3 + - fbneo + - mame + - neogeo + - neogeocd + - neogeocdjp + fceumm: + - famicom + - fds + - nes + flycast: + - arcade + - atomiswave + - consolearcade + - dreamcast + - mame + - naomi + - naomi2 + - naomigd + fmsx: + - msx + - msx1 + - msx2 + freechaf: + - channelf + freeintv: + - intellivision + frodo: + - c64 + fsuae: + - amiga + - amiga1200 + - amiga600 + fuse: + - zxspectrum + gambatte: + - gb + - gbc + gearboy: + - gb + - gbc + gearcoleco: + - colecovision + geargrafx: + - pcengine + - pcenginecd + - supergrafx + - tg-cd + - tg16 + gearsystem: + - gamegear + - mark3 + - mastersystem + - multivision + - sg-1000 + genesis-plus-gx-expanded-rom-size-paprium: + - megadrive + - megadrivejp + genesis_plus_gx: + - gamegear + - genesis + - mark3 + - mastersystem + - megacd + - megacdjp + - megadrive + - megadrivejp + - segacd + - sg-1000 + genesis_plus_gx_wide: + - gamegear + - genesis + - mark3 + - mastersystem + - megacd + - megacdjp + - megadrive + - megadrivejp + - segacd + - sg-1000 + geolith: + - arcade + - mame + - neogeo + - neogeocd + - neogeocdjp + gpsp: + - gba + gw: + - gameandwatch + - lcdgames + handy: + - atarilynx + hatari: + - atarist + hatari2014: + - atarist + hbmame: + - arcade + - mame + holani: + - atarilynx + irogb: + - gb + - gbc + jollycv: + - colecovision + - crvision + kronos: + - arcade + - consolearcade + - mame + - saturn + - saturnjp + - stv + lowresnx: + - lowresnx + lutro: + - lutro + mame: + - apple2 + - apple2gs + - arcade + - arcadia + - astrocde + - atari7800 + - channelf + - consolearcade + - cps + - cps1 + - cps2 + - cps3 + - crvision + - daphne + - fmtowns + - gamate + - gameandwatch + - gamecom + - gmaster + - intellivision + - laserdisc + - lcdgames + - mame + - megaduck + - model2 + - neogeo + - odyssey2 + - pv1000 + - scv + - stv + - supervision + - supracan + - vectrex + - videopac + - vsmile + mame2000: + - arcade + - cps + - cps1 + - cps2 + - cps3 + - mame + mame2003: + - arcade + - cps + - cps1 + - cps2 + - cps3 + - mame + mame2003_plus: + - arcade + - cps + - cps1 + - cps2 + - cps3 + - mame + mame2010: + - arcade + - cps + - cps1 + - cps2 + - cps3 + - mame + mednafen_lynx: + - atarilynx + mednafen_ngp: + - ngp + - ngpc + mednafen_pce: + - pcengine + - pcenginecd + - supergrafx + - tg-cd + - tg16 + mednafen_pce_fast: + - pcengine + - pcenginecd + - tg-cd + - tg16 + mednafen_pcfx: + - pcfx + mednafen_psx: + - psx + mednafen_psx_hw: + - psx + mednafen_saturn: + - saturn + - saturnjp + mednafen_supafaust: + - sfc + - snes + - snesna + mednafen_supergrafx: + - pcengine + - pcenginecd + - supergrafx + - tg-cd + - tg16 + mednafen_vb: + - virtualboy + mednafen_wswan: + - wonderswan + - wonderswancolor + melonds: + - nds + melondsds: + - nds + mesen: + - famicom + - fds + - nes + mesen-s: + - gb + - gbc + - satellaview + - sfc + - sgb + - snes + - snesna + mesen2: + - famicom + - fds + - gamegear + - gb + - gba + - gbc + - mark3 + - mastersystem + - nes + - pcengine + - pcenginecd + - satellaview + - sfc + - sgb + - snes + - snesna + - supergrafx + - tg-cd + - tg16 + - wonderswan + - wonderswancolor + mess2015: + - mess + mgba: + - gb + - gba + - gbc + - sgb + mojozork: + - zmachine + mrboom: + - ports + mu: + - palm + mupen64plus_next: + - n64 + - n64dd + nekop2: + - pc98 + neocd: + - neogeocd + - neogeocdjp + nestopia: + - famicom + - fds + - nes + noods: + - gba + np2kai: + - pc98 + nxengine: + - ports + o2em: + - odyssey2 + - videopac + openlara: + - ports + opera: + - 3do + panda3ds: + - n3ds + parallel_n64: + - n64 + - n64dd + pcee2: + - ps2 + pcsx2: + - ps2 + pcsx_rearmed: + - psx + picodrive: + - gamegear + - genesis + - mark3 + - mastersystem + - megacd + - megacdjp + - megadrive + - megadrivejp + - sega32x + - sega32xjp + - sega32xna + - segacd + pokemini: + - pokemini + potator: + - supervision + ppsspp: + - psp + prboom: + - doom + prosystem: + - atari7800 + puae: + - amiga + - amiga1200 + - amiga600 + - amigacd32 + - cdtv + puae2021: + - amiga + - amiga1200 + - amiga600 + - amigacd32 + - cdtv + px68k: + - x68000 + quasi88: + - pc88 + quicknes: + - famicom + - nes + race: + - ngp + - ngpc + retro8: + - pico8 + rustynes: + - famicom + - fds + - nes + same_cdi: + - cdimono1 + sameboy: + - gb + - gbc + - sgb + sameduck: + - megaduck + scummvm: + - scummvm + skyemu: + - gb + - gba + - gbc + smsplus: + - gamegear + - mark3 + - mastersystem + snes9x: + - satellaview + - sfc + - snes + - snesna + - sufami + snes9x2005_plus: + - satellaview + - sfc + - snes + - snesna + - sufami + snes9x2010: + - satellaview + - sfc + - snes + - snesna + - sufami + squirreljme: + - j2me + stella: + - atari2600 + stella2014: + - atari2600 + stella2023: + - atari2600 + superbroswar: + - ports + supermodel: + - arcade + - mame + swanstation: + - psx + tgbdual: + - gb + - gbc + theodore: + - moto + - to8 + tia: + - atari2600 + tic80: + - tic80 + tyrquake: + - quake + uzem: + - uzebox + vba_next: + - gba + vbam: + - gb + - gba + - gbc + vecx: + - vectrex + vice_x128: + - c64 + vice_x64: + - c64 + vice_x64sc: + - c64 + vice_xplus4: + - plus4 + vice_xscpu64: + - c64 + vice_xvic: + - vic20 + vircon32: + - vircon32 + virtualjaguar: + - atarijaguar + virtualxt: + - dos + - pc + vitaquake2: + - quake + vitaquake2-rogue: + - quake + vitaquake2-xatrix: + - quake + vitaquake2-zaero: + - quake + vitaquake3: + - quake + wasm4: + - wasm4 + x1: + - x1 + yabasanshiro: + - saturn + - saturnjp + yabause: + - saturn + - saturnjp launchers: - emulator: cemu build: standalone diff --git a/schemas/platform.schema.json b/schemas/platform.schema.json index b6007472..f652fba7 100644 --- a/schemas/platform.schema.json +++ b/schemas/platform.schema.json @@ -53,6 +53,20 @@ "uniqueItems": true, "description": "Emulators of standalone_cores the platform also launches as a libretro core: both layouts get their files" }, + "libretro_systems": { + "type": "object", + "description": "libretro core name -> the systems the platform's system list offers it for, as the launcher names them. A launcher handing each core / (save_directory.by_system in the registry) places a file the core reads below its save directory once in each of these folders", + "additionalProperties": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1, + "pattern": "^[^/\\\\]+$" + } + } + }, "core_system_dirs": { "type": "object", "description": "The libretro system directory the platform hands each core, keyed by that directory relative to the pack root. A platform that declares it gives a core no other directory: the core's files are placed below each directory listed for it, and a core listed nowhere gets none (MinUI hands each launch tag its own Bios//)", diff --git a/scripts/scraper/batocera_scraper.py b/scripts/scraper/batocera_scraper.py index 14df84a4..dd166749 100644 --- a/scripts/scraper/batocera_scraper.py +++ b/scripts/scraper/batocera_scraper.py @@ -142,6 +142,29 @@ def es_systems_libretro(text: str) -> set[str]: return found +def es_systems_libretro_systems(text: str, dropped: set[str]) -> dict[str, list[str]]: + """libretro core -> the systems es_systems.yml offers it under `libretro:`. + + configgen hands a libretro core /userdata/saves/ at each launch + (libretroConfig.py: savefile_directory = SAVES / system.name), so a file + a core reads below its save directory sits once in each of these + system folders. + """ + data = yaml_load_upstream(text) + if not isinstance(data, dict): + raise ValueError("es_systems.yml is not a mapping") + found: dict[str, set[str]] = {} + for system, spec in data.items(): + emulators = spec.get("emulators") if isinstance(spec, dict) else None + libretro = emulators.get("libretro") if isinstance(emulators, dict) else None + if not isinstance(libretro, dict): + continue + for core, entry in libretro.items(): + if isinstance(entry, dict) and str(core) not in dropped: + found.setdefault(str(core), set()).add(str(system)) + return {core: sorted(systems) for core, systems in sorted(found.items())} + + def es_systems_by_system( es_systems_text: str, defaults_text: str, dropped: set[str] ) -> dict[str, list[str]]: @@ -518,6 +541,9 @@ class Scraper(BaseScraper): ) cores, standalone, dual = self._fetch_cores() + libretro_systems = es_systems_libretro_systems( + self._fetch_text(ES_SYSTEMS_URL.format(tag=self.tag)), _not_cores() + ) result = { "platform": "Batocera", "version": self.tag.removeprefix("batocera-"), @@ -534,6 +560,8 @@ class Scraper(BaseScraper): if dual: # Launched both ways: each layout gets its files. result["dual_mode_cores"] = dual + # The systems each libretro core runs for: its save folders. + result["libretro_systems"] = libretro_systems result["launchers"] = extract_launchers( lambda path: self._fetch_text(f"{_RAW_BASE}/{self.tag}/{path}") ) diff --git a/scripts/scraper/knulli_scraper.py b/scripts/scraper/knulli_scraper.py index 9cda899b..7c293690 100644 --- a/scripts/scraper/knulli_scraper.py +++ b/scripts/scraper/knulli_scraper.py @@ -38,6 +38,7 @@ from .batocera_scraper import ( _not_cores, configgen_cores, es_systems_by_system, + es_systems_libretro_systems, extract_systems_dict, platform_systems, requirements_from_systems, @@ -120,6 +121,9 @@ class Scraper(BaseScraper): result["standalone_cores"] = standalone if dual: result["dual_mode_cores"] = dual + # configgen hands a libretro core /userdata/saves/, as + # Batocera's does: the systems each core runs for are its save folders. + result["libretro_systems"] = es_systems_libretro_systems(es_systems, dropped) return result diff --git a/scripts/scraper/recalbox_scraper.py b/scripts/scraper/recalbox_scraper.py index b8ce473c..84ef8dfb 100644 --- a/scripts/scraper/recalbox_scraper.py +++ b/scripts/scraper/recalbox_scraper.py @@ -167,6 +167,29 @@ def system_ini_libretro(text: str) -> set[str]: } +def system_ini_name(text: str, folder: str) -> str: + """The system name a system.ini gives, the one ES passes configgen. + + configgen hands a libretro core /recalbox/share/saves/ + (projects/configgen/configgen/generators/libretro/libretroRetroarch.py + savesFolder). The folder name stands in where the file names none. + """ + return _ini_sections(text).get("system", {}).get("name") or folder + + +def libretro_systems(inis: dict[str, str]) -> dict[str, list[str]]: + """libretro core -> the systems whose system.ini offers it. + + ``inis`` maps each system folder to its system.ini. + """ + found: dict[str, set[str]] = {} + for folder, text in inis.items(): + name = system_ini_name(text, folder) + for core in system_ini_libretro(text): + found.setdefault(core, set()).add(name) + return {core: sorted(systems) for core, systems in sorted(found.items())} + + def system_ini_cores(text: str) -> tuple[set[str], set[str]]: """The cores one Recalbox system.ini offers, and those run standalone. @@ -282,7 +305,10 @@ class Scraper(BaseScraper): cores: set[str] = set() standalone: set[str] = set() libretro: set[str] = set() - for text in self._system_inis(systems): + texts = self._system_inis(systems) + # The systems each libretro core runs for: its save folders. + self.libretro_systems = libretro_systems(dict(zip(systems, texts))) + for text in texts: found, alone = system_ini_cores(text) cores |= found standalone |= alone @@ -397,6 +423,7 @@ class Scraper(BaseScraper): # Launched both ways: each layout gets its files. **({"dual_mode_cores": dual} if dual else {}), "systems": systems, + "libretro_systems": self.libretro_systems, "launchers": self._fetch_launchers(), } diff --git a/scripts/scraper/retrobat_scraper.py b/scripts/scraper/retrobat_scraper.py index c0bd706e..720ec618 100644 --- a/scripts/scraper/retrobat_scraper.py +++ b/scripts/scraper/retrobat_scraper.py @@ -99,6 +99,31 @@ def es_systems_cores(text: str) -> tuple[set[str], set[str]]: return cores, standalone +def es_systems_libretro_systems(text: str) -> dict[str, list[str]]: + """libretro core -> the ES systems es_systems.cfg offers it for. + + emulatorLauncher hands a libretro core saves\\ at each launch + (LibRetro.Generator.cs Configure: savefile_directory), so a file a core + reads below its save directory sits once in each of these system + folders. A commented-out system is no element and counts for nothing. + """ + from common import parse_untrusted_xml + + found: dict[str, set[str]] = {} + for system in parse_untrusted_xml(text, "es_systems.cfg").iter("system"): + name = (system.findtext("name") or "").strip() + if not name: + continue + for emulator in system.iter("emulator"): + if (emulator.get("name") or "").strip() != "libretro": + continue + for core in emulator.iter("core"): + core_name = (core.text or "").strip() + if core_name: + found.setdefault(core_name, set()).add(name) + return {core: sorted(systems) for core, systems in sorted(found.items())} + + def launcher_revision(url: str) -> str: """The emulatorLauncher commit a source URL is pinned to.""" found = re.search(r"/emulatorlauncher/([0-9a-f]{40})/", url) @@ -259,6 +284,7 @@ class Scraper(BaseScraper): es_text = resp.read().decode("utf-8") cores, standalone = es_systems_cores(es_text) dual = es_systems_dual(es_text) + libretro_systems = es_systems_libretro_systems(es_text) except urllib.error.URLError as e: raise ConnectionError(f"Failed to fetch {es_url}: {e}") from e if not cores: @@ -277,6 +303,8 @@ class Scraper(BaseScraper): # Launched both ways: each layout gets its files. **({"dual_mode_cores": sorted(dual)} if dual else {}), "systems": systems, + # The systems each libretro core runs for: its save folders. + "libretro_systems": libretro_systems, "launchers": fetch_launchers(launcher_revision(self.url)), } diff --git a/scripts/scraper/retrodeck_scraper.py b/scripts/scraper/retrodeck_scraper.py index 22261886..4b6797d9 100644 --- a/scripts/scraper/retrodeck_scraper.py +++ b/scripts/scraper/retrodeck_scraper.py @@ -39,6 +39,8 @@ try: BaseScraper, BiosRequirement, fetch_branch_head, + fetch_bytes, + fetch_github_latest_version, github_headers, requirement_entry, ) @@ -49,6 +51,8 @@ except ImportError: BaseScraper, BiosRequirement, fetch_branch_head, + fetch_bytes, + fetch_github_latest_version, github_headers, requirement_entry, ) @@ -60,6 +64,38 @@ COMPONENTS_BRANCH = "main" COMPONENTS_API_URL = "https://api.github.com/repos/" + COMPONENTS_REPO + "/git/trees/{rev}" RAW_BASE = "https://raw.githubusercontent.com/" + COMPONENTS_REPO + "/{rev}" SKIP_DIRS = {"archive_later", "archive_old", "automation-tools", ".github"} + +# ES-DE's system list as RetroDECK's fork builds it. +ES_DE_REPO = "RetroDECK/ES-DE" +ES_DE_SYSTEMS_URL = ( + "https://raw.githubusercontent.com/" + ES_DE_REPO + + "/{rev}/resources/systems/linux/es_systems.xml" +) +_RETROARCH_CORE = re.compile(r"%CORE_RETROARCH%/([\w.+-]+?)_libretro\.so") + + +def es_systems_libretro_systems(text: str) -> dict[str, list[str]]: + """libretro core -> the ROM folders of the systems whose commands load it. + + RetroDECK's RetroArch sorts saves by content and not by core + (retroarch/rd_assets/rd_config/retroarch.cfg, sort_savefiles_by_content_enable + and sort_savefiles_enable): a core is handed saves/, the system's folder below %ROMPATH%. A commented-out + command is no element and counts for nothing. + """ + from common import parse_untrusted_xml + + found: dict[str, set[str]] = {} + for system in parse_untrusted_xml(text, "es_systems.xml").iter("system"): + path = (system.findtext("path") or "").strip().replace("\\", "/") + folder = path.rstrip("/").rsplit("/", 1)[-1] + if not folder or folder.startswith("%"): + continue + for command in system.iter("command"): + match = _RETROARCH_CORE.search(command.text or "") + if match: + found.setdefault(match.group(1), set()).add(folder) + return {core: sorted(folders) for core, folders in sorted(found.items())} NON_EMULATOR_COMPONENTS = { "framework", "es-de", @@ -468,6 +504,16 @@ class Scraper(BaseScraper): return requirements + def _fetch_libretro_systems(self) -> dict[str, list[str]]: + """libretro core -> ROM folders, from the ES-DE build RetroDECK ships. + + RetroDECK takes ES-DE's latest release of its fork + (automation-tools/alchemist/desired_versions.sh, ES_DE_DESIRED_VERSION). + """ + tag = fetch_github_latest_version(ES_DE_REPO) + text = fetch_bytes(ES_DE_SYSTEMS_URL.format(rev=tag)).decode("utf-8") + return es_systems_libretro_systems(text) + def generate_platform_yaml(self) -> dict: reqs = self.fetch_requirements() manifests = self._get_manifests() @@ -486,10 +532,6 @@ class Scraper(BaseScraper): sys_entry = systems.setdefault(req.system, {"files": []}) sys_entry["files"].append(requirement_entry(req)) - try: - from .base_scraper import fetch_github_latest_version - except ImportError: - from scraper.base_scraper import fetch_github_latest_version version = fetch_github_latest_version("RetroDECK/RetroDECK") return { @@ -509,6 +551,8 @@ class Scraper(BaseScraper): # its own, and retroarch is the one that runs cores. "standalone_cores": [c for c in cores if c != "retroarch"], "systems": systems, + # The ROM folders each libretro core runs for: its save folders. + "libretro_systems": self._fetch_libretro_systems(), "launchers": extract_launchers(cores, self.component_file), }