Files
docker-infrastructure/romm/populate-roms.sh
T
poprhythm 97ff83a246 romm: add arcade (FBNeo) to populate-roms, add IGDB credentials
100 arcade titles spanning Pac-Man/Namco classics, Street Fighter,
Mortal Kombat, Metal Slug, King of Fighters, Samurai Shodown,
Fatal Fury, beat-em-ups (TMNT, Simpsons, X-Men), and more.

Also adds IGDB_CLIENT_ID/SECRET env vars for metadata scraping.
2026-03-10 01:54:53 +00:00

577 lines
17 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
NO_INTRO_BASE="/mnt/nas_games/[No-Intro] PropeR 1G1R Collection (2024)/ROMs"
FBNEO_ARCADE="/mnt/nas_games/FBNeo 1.0.0.2 ROMs (split)/arcade"
ROMS_DEST="/mnt/nas_games/roms"
extracted=0
skipped=0
not_found=0
copy_arcade() {
local src_dir="$1"
local dest_dir="$2"
local rom="$3"
if [[ -f "$dest_dir/$rom" ]]; then
echo " [SKIP] $rom"
(( skipped++ )) || true; return 0
fi
if [[ ! -f "$src_dir/$rom" ]]; then
echo " [MISSING] $rom"
(( not_found++ )) || true; return 0
fi
echo " [COPY] $rom"
cp "$src_dir/$rom" "$dest_dir/$rom"
(( extracted++ )) || true
}
extract_game() {
local platform_zip="$1"
local inner_prefix="$2"
local dest_dir="$3"
local game_name="$4"
if [[ -f "$dest_dir/$game_name" ]]; then
echo " [SKIP] $game_name"
(( skipped++ )) || true
return 0
fi
if ! unzip -Z1 "$platform_zip" "${inner_prefix}${game_name}" &>/dev/null; then
echo " [MISSING] $game_name"
(( not_found++ )) || true
return 0
fi
echo " [EXTRACT] $game_name"
unzip -j -n "$platform_zip" "${inner_prefix}${game_name}" -d "$dest_dir"
(( extracted++ )) || true
}
# ---------------------------------------------------------------------------
# Atari 2600
# ---------------------------------------------------------------------------
ATARI_ZIP="$NO_INTRO_BASE/Atari - 2600.zip"
ATARI_PREFIX="Atari - 2600/"
ATARI_DEST="$ROMS_DEST/atari2600"
if [[ ! -f "$ATARI_ZIP" ]]; then
echo "[WARN] Atari 2600 zip not found: $ATARI_ZIP"
else
echo "==> Atari 2600 -> $ATARI_DEST"
mkdir -p "$ATARI_DEST"
ATARI_GAMES=(
"Adventure (USA).zip"
"Asteroids (Japan, USA) (En).zip"
"Atlantis (USA).zip"
"Berzerk (Japan, USA) (En).zip"
"Boxing (USA).zip"
"Breakout ~ Breakaway IV (Japan, USA) (En).zip"
"Centipede (Japan, USA) (En).zip"
"Chopper Command (USA).zip"
"Combat ~ Tank-Plus (USA).zip"
"Demon Attack (USA) (Rev 1).zip"
"Donkey Kong (USA).zip"
"Enduro (USA).zip"
"Frogger (USA).zip"
"H.E.R.O. (USA).zip"
"Haunted House (USA).zip"
"Kaboom! (USA).zip"
"Missile Command (USA).zip"
"Moon Patrol (USA).zip"
"Pac-Man (USA).zip"
"Phoenix (USA).zip"
"Pitfall! - Pitfall Harry's Jungle Adventure (USA).zip"
"Pitfall II - Lost Caverns (USA).zip"
"River Raid (USA).zip"
"Space Invaders (USA).zip"
"Yars' Revenge (USA).zip"
)
for game in "${ATARI_GAMES[@]}"; do
extract_game "$ATARI_ZIP" "$ATARI_PREFIX" "$ATARI_DEST" "$game"
done
fi
# ---------------------------------------------------------------------------
# NES
# ---------------------------------------------------------------------------
NES_ZIP="$NO_INTRO_BASE/Nintendo - Nintendo Entertainment System (Headerless).zip"
NES_PREFIX="Nintendo - Nintendo Entertainment System (Headerless)/"
NES_DEST="$ROMS_DEST/nes"
if [[ ! -f "$NES_ZIP" ]]; then
echo "[WARN] NES zip not found: $NES_ZIP"
else
echo "==> NES -> $NES_DEST"
mkdir -p "$NES_DEST"
NES_GAMES=(
"Balloon Fight (USA).zip"
"Battletoads (USA).zip"
"Bionic Commando (USA).zip"
"Blaster Master (USA).zip"
"Castlevania (USA) (Rev 1).zip"
"Chip 'n Dale - Rescue Rangers (USA).zip"
"Contra (USA).zip"
"Double Dragon (USA).zip"
"Double Dragon II - The Revenge (USA) (Rev 1).zip"
"Dr. Mario (Japan, USA) (En) (Rev 1).zip"
"Duck Hunt (World).zip"
"DuckTales (USA).zip"
"Excitebike (Japan, USA) (En).zip"
"Final Fantasy (USA).zip"
"Gradius (USA).zip"
"Ice Climber (USA, Europe, Korea) (En).zip"
"Kid Icarus (USA, Europe) (Rev 1).zip"
"Kirby's Adventure (USA) (Rev 1).zip"
"Legend of Zelda, The (USA) (Rev 1).zip"
"Mega Man 2 (USA).zip"
"Mega Man 3 (USA).zip"
"Metroid (USA).zip"
"Mike Tyson's Punch-Out!! (Japan, USA) (En) (Rev 1).zip"
"Ninja Gaiden (USA).zip"
"River City Ransom (USA).zip"
"Super Mario Bros. (World).zip"
"Super Mario Bros. 3 (USA) (Rev 1).zip"
"Teenage Mutant Ninja Turtles II - The Arcade Game (USA).zip"
)
for game in "${NES_GAMES[@]}"; do
extract_game "$NES_ZIP" "$NES_PREFIX" "$NES_DEST" "$game"
done
fi
# ---------------------------------------------------------------------------
# Genesis (Mega Drive)
# ---------------------------------------------------------------------------
GENESIS_ZIP="$NO_INTRO_BASE/Sega - Mega Drive - Genesis.zip"
GENESIS_PREFIX="Sega - Mega Drive - Genesis/"
GENESIS_DEST="$ROMS_DEST/genesis"
if [[ ! -f "$GENESIS_ZIP" ]]; then
echo "[WARN] Genesis zip not found: $GENESIS_ZIP"
else
echo "==> Genesis -> $GENESIS_DEST"
mkdir -p "$GENESIS_DEST"
GENESIS_GAMES=(
"Aladdin (USA).zip"
"Altered Beast (Japan, USA) (En) (Rev A).zip"
"Beyond Oasis (USA).zip"
"Castle of Illusion Starring Mickey Mouse (USA, Europe).zip"
"Castlevania - Bloodlines (USA).zip"
"Comix Zone (USA).zip"
"Contra - Hard Corps (USA, Korea) (En).zip"
"Earthworm Jim (USA).zip"
"Ecco the Dolphin (USA, Europe, Korea) (En).zip"
"Golden Axe (World) (Rev A).zip"
"Golden Axe II (World).zip"
"Gunstar Heroes (USA).zip"
"Lion King, The (World).zip"
"Mortal Kombat (World).zip"
"Mortal Kombat II (World).zip"
"NBA Jam - Tournament Edition (World).zip"
"Phantasy Star II (USA, Europe) (Rev A).zip"
"QuackShot Starring Donald Duck (World) (Rev A).zip"
"Ristar (USA, Europe).zip"
"Road Rash II (USA, Europe) (RR206).zip"
"Rocket Knight Adventures (USA).zip"
"Shining Force (USA).zip"
"Sonic The Hedgehog (Japan, Europe, Korea) (En).zip"
"Sonic The Hedgehog 2 (World) (Rev B).zip"
"Sonic The Hedgehog 3 (USA).zip"
"Streets of Rage (World) (Rev A).zip"
"Streets of Rage 2 (USA).zip"
"ToeJam & Earl (USA, Europe, Korea) (En).zip"
"Vectorman (USA, Europe).zip"
"Virtua Racing (USA).zip"
)
for game in "${GENESIS_GAMES[@]}"; do
extract_game "$GENESIS_ZIP" "$GENESIS_PREFIX" "$GENESIS_DEST" "$game"
done
fi
# ---------------------------------------------------------------------------
# SNES
# ---------------------------------------------------------------------------
SNES_ZIP="$NO_INTRO_BASE/Nintendo - Super Nintendo Entertainment System.zip"
SNES_PREFIX="Nintendo - Super Nintendo Entertainment System/"
SNES_DEST="$ROMS_DEST/snes"
if [[ ! -f "$SNES_ZIP" ]]; then
echo "[WARN] SNES zip not found: $SNES_ZIP"
else
echo "==> SNES -> $SNES_DEST"
mkdir -p "$SNES_DEST"
SNES_GAMES=(
"ActRaiser (USA).zip"
"Breath of Fire II (USA).zip"
"Chrono Trigger (USA).zip"
"Contra III - The Alien Wars (USA).zip"
"Donkey Kong Country (USA) (Rev 2).zip"
"Donkey Kong Country 2 - Diddy's Kong Quest (USA) (En,Fr) (Rev 1).zip"
"EarthBound (USA).zip"
"F-Zero (USA).zip"
"Final Fantasy III (USA) (Rev 1).zip"
"Illusion of Gaia (USA).zip"
"Kirby Super Star (USA).zip"
"Legend of Zelda, The - A Link to the Past (USA).zip"
"Mega Man X (USA) (Rev 1).zip"
"Mega Man X2 (USA).zip"
"Pilotwings (USA).zip"
"Secret of Mana (USA).zip"
"Soul Blazer (USA).zip"
"Star Fox (USA) (Rev 2).zip"
"Street Fighter II Turbo (USA) (Rev 1).zip"
"Super Bomberman 2 (USA).zip"
"Super Castlevania IV (USA).zip"
"Super Mario All-Stars + Super Mario World (USA).zip"
"Super Mario Kart (USA).zip"
"Super Mario RPG - Legend of the Seven Stars (USA).zip"
"Super Mario World 2 - Yoshi's Island (USA) (Rev 1).zip"
"Super Metroid (Japan, USA) (En,Ja).zip"
"Super Punch-Out!! (USA).zip"
)
for game in "${SNES_GAMES[@]}"; do
extract_game "$SNES_ZIP" "$SNES_PREFIX" "$SNES_DEST" "$game"
done
fi
# ---------------------------------------------------------------------------
# Game Boy
# ---------------------------------------------------------------------------
GB_ZIP="$NO_INTRO_BASE/Nintendo - Game Boy.zip"
GB_PREFIX="Nintendo - Game Boy/"
GB_DEST="$ROMS_DEST/gb"
if [[ ! -f "$GB_ZIP" ]]; then
echo "[WARN] Game Boy zip not found: $GB_ZIP"
else
echo "==> Game Boy -> $GB_DEST"
mkdir -p "$GB_DEST"
GB_GAMES=(
"Alleyway (World).zip"
"Balloon Kid (USA, Europe).zip"
"Castlevania - The Adventure (USA).zip"
"Castlevania II - Belmont's Revenge (USA, Europe).zip"
"Castlevania Legends (USA, Europe) (SGB Enhanced).zip"
"Contra - The Alien Wars (USA) (SGB Enhanced).zip"
"Donkey Kong Land 2 (USA, Europe) (SGB Enhanced).zip"
"Dr. Mario (World) (Rev 1).zip"
"Final Fantasy Adventure (USA).zip"
"Final Fantasy Legend II (USA).zip"
"Final Fantasy Legend III (USA).zip"
"Game & Watch Gallery (USA) (Rev 1) (SGB Enhanced).zip"
"Gargoyle's Quest (USA, Europe).zip"
"Kid Dracula (USA, Europe).zip"
"Kirby's Dream Land (USA, Europe).zip"
"Kirby's Dream Land 2 (USA, Europe) (SGB Enhanced).zip"
"Kirby's Pinball Land (USA, Europe).zip"
"Legend of Zelda, The - Link's Awakening (USA, Europe) (Rev 2).zip"
"Mario's Picross (USA, Europe) (SGB Enhanced).zip"
"Mega Man II (USA).zip"
"Mega Man III (USA).zip"
"Mega Man IV (USA).zip"
"Mega Man V (USA) (SGB Enhanced).zip"
"Metroid II - Return of Samus (World).zip"
"Pokemon - Blue Version (USA, Europe) (SGB Enhanced).zip"
"Pokemon - Red Version (USA, Europe) (SGB Enhanced).zip"
"Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (CGB+SGB Enhanced).zip"
"Super Mario Land (World) (Rev 1).zip"
"Super Mario Land 2 - 6 Golden Coins (USA, Europe) (Rev 2).zip"
"Tetris (World) (Rev 1).zip"
"Wario Land - Super Mario Land 3 (World).zip"
"Wave Race (USA, Europe).zip"
)
for game in "${GB_GAMES[@]}"; do
extract_game "$GB_ZIP" "$GB_PREFIX" "$GB_DEST" "$game"
done
fi
# ---------------------------------------------------------------------------
# Game Boy Advance
# ---------------------------------------------------------------------------
GBA_ZIP="$NO_INTRO_BASE/Nintendo - Game Boy Advance.zip"
GBA_PREFIX="Nintendo - Game Boy Advance/"
GBA_DEST="$ROMS_DEST/gba"
if [[ ! -f "$GBA_ZIP" ]]; then
echo "[WARN] GBA zip not found: $GBA_ZIP"
else
echo "==> Game Boy Advance -> $GBA_DEST"
mkdir -p "$GBA_DEST"
GBA_GAMES=(
"Advance Wars (USA) (Rev 1).zip"
"Advance Wars 2 - Black Hole Rising (USA).zip"
"Castlevania - Aria of Sorrow (USA).zip"
"Classic NES Series - Castlevania (USA).zip"
"Classic NES Series - Dr. Mario (USA, Europe).zip"
"Classic NES Series - Metroid (USA, Europe).zip"
"Classic NES Series - The Legend of Zelda (USA, Europe).zip"
"Dragon Ball Z - Supersonic Warriors (USA).zip"
"Final Fantasy I & II - Dawn of Souls (USA).zip"
"Final Fantasy IV Advance (USA).zip"
"Final Fantasy V Advance (USA).zip"
"Final Fantasy VI Advance (USA).zip"
"Fire Emblem (USA, Australia).zip"
"Fire Emblem - The Sacred Stones (USA, Australia).zip"
"Golden Sun (USA, Europe).zip"
"Golden Sun - The Lost Age (USA, Europe).zip"
"Kirby & The Amazing Mirror (USA).zip"
"Kirby - Nightmare in Dream Land (USA).zip"
"Legend of Zelda, The - A Link to the Past & Four Swords (USA).zip"
"Legend of Zelda, The - The Minish Cap (USA).zip"
"Mario & Luigi - Superstar Saga (USA).zip"
"Mario Golf - Advance Tour (USA).zip"
"Mario vs. Donkey Kong (USA, Australia).zip"
"Metroid Fusion (USA).zip"
"Metroid - Zero Mission (USA).zip"
"Mother 3 (Japan).zip"
"Pokemon - Ruby Version (USA, Europe) (Rev 2).zip"
"Pokemon - Sapphire Version (USA, Europe) (Rev 2).zip"
"Sonic Advance (USA) (En,Ja).zip"
"Sonic Advance 2 (USA) (En,Ja,Fr,De,Es,It).zip"
"Sonic Advance 3 (USA) (En,Ja,Fr,De,Es,It).zip"
"Super Mario Advance (USA, Europe).zip"
"Super Mario Advance 2 - Super Mario World (USA, Australia).zip"
"Super Mario Advance 3 - Yoshi's Island (USA).zip"
"Wario Land 4 (USA, Europe).zip"
"WarioWare - Twisted! (USA, Australia).zip"
)
for game in "${GBA_GAMES[@]}"; do
extract_game "$GBA_ZIP" "$GBA_PREFIX" "$GBA_DEST" "$game"
done
fi
# ---------------------------------------------------------------------------
# Amiga
# NOTE: Amiga emulation requires Kickstart ROM firmware (not included in
# No-Intro). Place kickstart .rom files in /romm/library/bios/ in the
# RomM container. Source from Amiga Forever (Cloanto) or real hardware.
# ---------------------------------------------------------------------------
AMIGA_ZIP="$NO_INTRO_BASE/Commodore - Amiga.zip"
AMIGA_PREFIX="Commodore - Amiga/"
AMIGA_DEST="$ROMS_DEST/amiga"
if [[ ! -f "$AMIGA_ZIP" ]]; then
echo "[WARN] Amiga zip not found: $AMIGA_ZIP"
else
echo "==> Amiga -> $AMIGA_DEST"
mkdir -p "$AMIGA_DEST"
AMIGA_GAMES=(
"Alien Breed (Europe).zip"
"Alien Breed - Special Edition 92 (Europe).zip"
"Alien Breed II - The Horror Continues (Europe).zip"
"All New World of Lemmings (Europe) (AGA).zip"
"Another World (Europe).zip"
"Body Blows (Europe) (v2.0).zip"
"Chaos Engine, The (Europe).zip"
"Civilization (Europe) (v855e.01) (AGA).zip"
"Elite (Europe) (v2.0).zip"
"Frontier - Elite II (Europe) (2.9.1992).zip"
"Gods (Europe).zip"
"James Pond - Underwater Agent (Europe).zip"
"James Pond II - Codename RoboCod (Europe) (Budget - Kixx).zip"
"Lemmings (USA).zip"
"Lemmings 2 - The Tribes (USA).zip"
"Lotus Esprit Turbo Challenge (Europe).zip"
"Monkey Island 2 - LeChuck's Revenge (Europe).zip"
"Oh No! More Lemmings (USA) (Addon).zip"
"Oscar (Europe).zip"
"Pinball Dreams (Europe).zip"
"Pinball Illusions (Europe) (AGA).zip"
"Populous (USA).zip"
"Populous II - Trials of the Olympian Gods (Europe).zip"
"Rick Dangerous (Europe) (Amiga + PC) (Budget - Kixx).zip"
"Rick Dangerous 2 (Europe).zip"
"Secret of Monkey Island, The (Europe) (v1.2).zip"
"Sensible Soccer - European Champions (Europe) (En,Fr,De,It) (v1.1).zip"
"Sensible World of Soccer '96-'97 (Europe).zip"
"Shadow of the Beast (Europe).zip"
"Shadow of the Beast II (Europe).zip"
"Shadow of the Beast III (USA).zip"
"Speedball (USA) (v1.05).zip"
"Speedball 2 - Brutal Deluxe (USA).zip"
"Superfrog (Europe).zip"
"Syndicate (Europe) (En,Fr,It).zip"
"Theme Park (Europe) (En,Fr,De,It).zip"
"Turrican (USA).zip"
"Turrican II - The Final Fight (Europe).zip"
"Turrican 3 (Europe).zip"
"Worms (Europe) (En,Fr,De).zip"
"Zool 2 (Europe) (AGA).zip"
)
for game in "${AMIGA_GAMES[@]}"; do
extract_game "$AMIGA_ZIP" "$AMIGA_PREFIX" "$AMIGA_DEST" "$game"
done
fi
# ---------------------------------------------------------------------------
# Arcade (FBNeo)
# ---------------------------------------------------------------------------
ARCADE_DEST="$ROMS_DEST/arcade"
if [[ ! -d "$FBNEO_ARCADE" ]]; then
echo "[WARN] FBNeo arcade directory not found: $FBNEO_ARCADE"
else
echo "==> Arcade (FBNeo) -> $ARCADE_DEST"
mkdir -p "$ARCADE_DEST"
ARCADE_ROMS=(
# Pac-Man / Namco classics
"pacman.zip"
"mspacman.zip"
"galaga.zip"
"galaxian.zip"
"digdug.zip"
"btime.zip"
"pengo.zip"
# Nintendo classics
"dkong.zip"
"dkongjr.zip"
"popeye.zip"
"punchout.zip"
"spnchout.zip"
# Early arcade classics
"invaders.zip"
"centiped.zip"
"frogger.zip"
"qbert.zip"
"zaxxon.zip"
"arkanoid.zip"
# Sega
"outrun.zip"
"aburner2.zip"
# Shooters / Shmups
"1942.zip"
"1943.zip"
"19xx.zip"
"gradius.zip"
"gradius2.zip"
"gradius3.zip"
"raiden.zip"
"raiden2.zip"
"contra.zip"
# Capcom beat-em-ups
"ffight.zip"
"knights.zip"
"kod.zip"
"wof.zip"
"dino.zip"
"avsp.zip"
"ddsom.zip"
"ddtod.zip"
"batcir.zip"
"msword.zip"
"strider.zip"
# Konami beat-em-ups
"tmnt.zip"
"tmnt2.zip"
"simpsons.zip"
"xmen.zip"
"captaven.zip"
"punisher.zip"
"aliens.zip"
"ssriders.zip"
# Double Dragon / Technos
"ddragon.zip"
"ddragon2.zip"
"ddragon3.zip"
# Platform / action
"ghouls.zip"
"pang.zip"
"spang.zip"
"bublbobl.zip"
"pbobble.zip"
"rbisland.zip"
"snowbros.zip"
"slammast.zip"
"gauntlet.zip"
"gaunt2.zip"
# Street Fighter
"sf2.zip"
"sf2ce.zip"
"sf2hf.zip"
"ssf2t.zip"
"sfa.zip"
"sfa2.zip"
"sfa3.zip"
"sfiii3.zip"
# Mortal Kombat
"mk.zip"
"mk2.zip"
"mk3.zip"
# Marvel / Capcom crossovers
"xmvsf.zip"
"msh.zip"
"mvsc.zip"
"nwarr.zip"
# King of Fighters
"kof94.zip"
"kof95.zip"
"kof96.zip"
"kof97.zip"
"kof98.zip"
"kof99.zip"
"kof2000.zip"
"kof2001.zip"
"kof2002.zip"
"kof2003.zip"
# Fatal Fury / Garou
"fatfury1.zip"
"fatfury2.zip"
"fatfursp.zip"
"fatfury3.zip"
"rbff1.zip"
"rbff2.zip"
"garou.zip"
# Samurai Shodown
"samsho.zip"
"samsho2.zip"
"samsho3.zip"
"samsho4.zip"
"samsho5.zip"
# Metal Slug
"mslug.zip"
"mslug2.zip"
"mslug3.zip"
"mslug4.zip"
"mslug5.zip"
"mslugx.zip"
# Neo Geo misc
"blazstar.zip"
"wjammers.zip"
"turfmast.zip"
"lastbld2.zip"
"rotd.zip"
"neobombe.zip"
"kabukikl.zip"
"matrim.zip"
)
for rom in "${ARCADE_ROMS[@]}"; do
copy_arcade "$FBNEO_ARCADE" "$ARCADE_DEST" "$rom"
done
fi
# ---------------------------------------------------------------------------
# Summary
# ---------------------------------------------------------------------------
echo ""
echo "Done. extracted=$extracted skipped=$skipped not_found=$not_found"