agentsclimarketplace

Batocera roms

Skill t3chnaztea/batocera-skills/skills/batocera-roms

Use when working with ROMs and gamelists on a Batocera cabinet: figuring out which directory a system's ROMs go in, why a game does not appear in the menu, which file formats and extensions a system accepts, curating a large library by hiding rather than deleting, editing gamelist.xml safely, cleaning up multi-disc games, or verifying dumps against No-Intro/Redump DATs. Covers extensionless-ROM-in-zip failures, the 3DO/Opera no-m3u trap, cave3rd, and the es_systems_custom.cfg landmine. Not for shaders/bezels (batocera-display), or ROM directories renamed by a Batocera version upgrade (batocera-maintenance).From its SKILL.md

Install
npx -y skills add t3chnaztea/batocera-skills --skill batocera-roms

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

3 things to look at

  • 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
  • runs commandsInstructs the agent to run 6 commands, including `SSHB "grep -E '<name>|<fullname>' /usr/share/emulationstation/es_systems.cfg"` and 5 more.
  • fetches URLsInstructs the agent to fetch 1 URL, including http://127.0.0.1:1234/systems/<system>/games.

SKILL.md

6.6 KB, ~1.6k tokens by cl100k_base, as published. Nobody here has run it

Batocera ROMs

Managing the game library: where ROMs live, why they do or don't show up, how to curate a big collection without deleting anything, and how to verify dumps. Assumes the connection pattern and safety doctrine from batocera-ops.

System directories

ROMs live in /userdata/roms/<system>/, one directory per system. The directory name is Batocera's internal system name, which is not always the obvious one. Don't guess — look it up on the box:

# Every system Batocera knows, with its dir name and display name:
SSHB "grep -E '<name>|<fullname>' /usr/share/emulationstation/es_systems.cfg"

# What you actually have ROMs for:
SSHB "ls /userdata/roms/"

Names that trip people up: Cave CV1000 arcade lives in cave3rd (not cv1000); Odyssey 2 is odyssey2 (renamed from o2em); Half-Life is halflife (renamed from xash3d_fwgs). Directory renames across versions are common — the batocera-maintenance migration reference lists the ones that bite.

Why a game doesn't appear

In rough order of likelihood:

  1. Wrong extension for that system. Each system accepts a fixed set of extensions; a file with any other extension is invisible to ES. Check the accepted list: SSHB "grep -A2 '<system>' /usr/share/emulationstation/es_systems.cfg | grep extension". A bare .bin is a frequent offender — for many disc systems .bin is not an ES extension (you need a .cue or .chd).
  2. It's hidden. <hidden>true</hidden> in gamelist.xml, or its whole system is in the ES HiddenSystems list. Hidden games still exist on disk — this is a feature, see curation below.
  3. Extensionless ROM inside a zip. ES lists the .zip, but the emulator refuses to load it because the inner file has no recognizable extension. See the formats reference — this fails silently (RetroArch exits ~1s, status 1, "Could not read content file").
  4. A custom system-list file overrode the stock list. If a whole swath of systems vanished, suspect es_systems_custom.cfg — see the landmine below.

gamelist.xml anatomy

Each system's /userdata/roms/<system>/gamelist.xml is per-game metadata:

<gameList>
  <game>
    <path>./Super Mario World (USA).sfc</path>
    <name>Super Mario World</name>
    <desc>...</desc>
    <image>./media/images/Super Mario World (USA).png</image>
    <hidden>true</hidden>          <!-- present + "true" = hidden from menu -->
    <favorite>true</favorite>
  </game>
</gameList>
  • <path> is relative to the system dir and includes the extension. It's the join key to the file on disk.
  • Removing the <hidden> element (or setting it to anything but true) unhides.
  • ES rewrites this file on exit. Never edit it while ES is running and then let ES exit cleanly — it clobbers your edit. Stop ES or SIGKILL-restart it (see batocera-ops → emulationstation reference). Back the file up first.

Curation: hide, don't delete

The core methodology for taming a large or messy library, e.g. building a focused view for an arcade cabinet: set <hidden>true</hidden>, never rm.

Why hiding wins:

  • Reversible in one flag. ROMs stay on disk; flip the flag to restore.
  • Non-destructive — aligns with the batocera-ops doctrine on a shared machine. A wrong call costs a flag flip, not a re-download.
  • Composable — you can layer passes (per-game hides, cross-platform dedup, regional-variant dedup) and roll any one back independently by restoring that pass's gamelist backup.

Workflow:

  1. Back up the gamelist(s) you'll touch: cp gamelist.xml gamelist.xml.bak-<tag>.
  2. Stop ES (or plan a SIGKILL-restart) so your edits survive.
  3. Edit <hidden> flags — scripted for anything past a handful.
  4. Restart ES and verify counts via the API: curl -s http://127.0.0.1:1234/systems/<system>/games and count hidden entries.

Methodology detail (system-level HiddenSystems, cross-platform canonicalization / 1G1R, regional and format dedup) is in references/curation.md. It is method only — bring your own taste; there are no game lists here.

Multi-disc games

Multi-disc CD games (PSX, Saturn, 3DO, Sega CD…) each show every disc as its own menu entry by default, cluttering the list. The clean fix — one visible entry per game, remaining discs hidden, per-disc launch still possible — plus the disc-swap mechanics that differ by emulator, is in references/formats-and-quirks.md. A ready-to-adapt implementation for 3DO is scripts/fix-3do-multidisc.py. Do not reach for .m3u on 3DO/Opera — that core doesn't support playlists (a documented trap the script explains).

Format landmines

Full detail in references/formats-and-quirks.md; the ones that cost the most time:

  • es_systems_custom.cfg REPLACES the stock system list, it does not merge. Drop a custom system definition in as es_systems_custom.cfg and ES boots with only your custom systems — every stock system disappears. To add a system, use a differently-named merge file, not es_systems_custom.cfg.
  • Extensionless ROM inside a zip → silent load failure. unzip -Z1 *.zip and check the inner suffix; rezip with a proper extension.
  • 3DO/Opera has no .m3u support; multi-disc needs the per-entry approach.
  • Bare .bin disc images are invisible on systems whose ES extension list wants .cue/.chd. Generate a .cue.

Verifying dumps against DATs

To confirm your ROMs are known-good dumps (right data, not just right filename), verify against No-Intro DATs (cartridges, hash match) and Redump DATs (discs, extract + hash). Methodology, tiers, and known limits (GD-ROM CHDs that can't hash-verify, Sega CD CDDA mismatches) are in references/dat-verification.md, with a ready-to-run scripts/dat-verify.py.

What ships with it: 5 files

49.3 KB alongside SKILL.md, 2 of them executable

scripts/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.