Giter VIP home page Giter VIP logo

emmercm / igir Goto Github PK

View Code? Open in Web Editor NEW
277.0 277.0 14.0 14.87 MB

๐Ÿ•น A video game ROM collection manager to help filter, sort, patch, archive, and report on collections on any OS.

Home Page: https://igir.io/

License: GNU General Public License v3.0

Shell 0.19% JavaScript 0.09% TypeScript 99.67% Handlebars 0.05%
1g1r analogue-pocket anbernic batocera cmpro emulation hacktoberfest logiqx mame mister miyoo no-intro redump retroarch roms tosec

igir's Introduction

Portland, OR

๐Ÿ‘‹ Hi, I'm Christian

I'm a software engineering professional who sometimes blogs, often hacks on projects, and is always listening to music.

See the "now" page on my website for the most up-to-date information about me!

igir's People

Contributors

dcramer avatar dependabot[bot] avatar emmercm avatar extremeradical avatar juliadin avatar maxexcloo avatar phasecorex avatar renovate[bot] avatar samwelnella avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

igir's Issues

Invalid count value error

Paste the command

npx igir@latest move zip report --dat _ROMs_dat/ --input _ROMs/roms --output _ROMs-Sorted/ --dir-dat-name --single --prefer-pal --no-bios --no-device --no-demo

Describe the bug

Screenshot 2023-08-06 at 09 03 16

This is a screenshot of the error.

Expected behavior

I do not expect an error

Debug logs

I do not have the logs. The second time I run the command with -vvv the error disappeared.

DAT(s) used

No response

igir version

1.9.0 (igir@latest)

Node.js version

18.17

Operating system

MacOS Ventura

Additional context

This is not a problem for me, but I hope it can be useful as a report.

Possibility to re-run `igir` commands, e.g. as in `igir_pocket_sync.sh`, to update collectionsโ“

Maybe this feature is already built-in, please consider this to be a question instead.

Based on your igir_pocket_sync.sh script, I just created my first collection, if thatโ€™s the correct term weโ€™d like to use here.

#!/bin/bash

set -euo pipefail

trap "printf \"\n-- %s -- \n\n\" \"rsync: interrupted\" >&2; exit 2;" INT TERM

dir="/Volumes/MISTERFPGA"

src="/Volumes/ARCHIVE"

if command -v igir >/dev/null; then
  igir copy extract test clean \
    --dat "${src}/No-Intro*.zip" \
    --input "${src}/No-Intro/" \
    --output "${dir}/games/{mister}/" \
    --dir-letter \
    --clean-exclude "${dir}/games/*/*.*" \
    --clean-exclude "${dir}/games/*/Palettes" \
    --no-bios \
    --no-unlicensed \
    --no-demo \
    --no-beta \
    --no-sample \
    --no-prototype \
    --no-test-roms \
    --no-aftermarket \
    --no-homebrew \
    --no-unverified \
    --no-bad \
    --single \
    --prefer-language EN \
    --prefer-region USA,WORLD,EUR,JPN \
    --prefer-revision-newer \
    --prefer-retail
fi

Would I be able to basically re-run that script, updating the created collection without again copying/extracting all files which are already present? Iโ€™m having something like rsync in mind, which basically compares the source and destination and only makes changes if something is either missing or different in the destination.

Note: Iโ€™m also very new to MiSTer FPGA, so maybe the arguments/parameters in my script could be improved.

--

Edit: It seems Iโ€™m having problems with the following exludes; using the first or second result in an error, using the last keeps some files and folders, but deletes other below games/*/Palettes/*; maybe my globbing is wrong in each and every one of those three lines?

--clean-exclude "${dir}/games/*/Palettes" \
--clean-exclude "${dir}/games/*/Palettes/" \
--clean-exclude "${dir}/games/*/Palettes/*" \

Non-existing `--clean-exclude` file/folder throws error and stops `igir` command

When running igir as in your documented igir_pocket_sync.sh script, with some path or glob to be excluded like for example --clean-exclude "./Assets/*/common/*.*", the command/script currently throws an error and stops if the path or glob to be excluded does not exist, i.e. nothing matches the exclude path or glob.

Thinking about this behavior, Iโ€™d say it would make more sense to be able to define whatever exludes as one wishes, and if something matches, it getโ€™s excluded as defined, and if nothing matches, i.e. nothing exists that matches, the command/script should gracefully continue and finish.

Iโ€™m not sure if this only is the case for --clean-exclude or also some of the other --*-exclude flags.

`copy zip` on MAME rom resulting in `Type_a.getHeader is not a function` error

Paste the command

npx igir@latest copy zip --dat roms/dats/MAME\ Dats\ 0.78/MAME\ 078.dat --input MAME_2003-Plus_Reference_Set_2018/roms/3countb.zip --output roms/roms-sorted --dir-dat-name

Describe the bug

Working from 0.78 MAME romset and for test purposes, running against 1 specific rom I get the following error (below is full output),

โœ“ Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 1 unique DAT found
โœ“ Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 27 files found
ERROR: MAME: roms/roms-sorted/MAME/neogeo.zip: failed to create zip: Type_a.getHeader is not a function
ERROR: MAME: roms/roms-sorted/MAME/3countb.zip: failed to create zip: Type_a.getHeader is not a function
โœ“ MAME ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท | 2/4,610 games, 1/15 BIOSes, 2/4,610 retail releases written
โœ“ Processing DATs ยทยทยทยทยทยทยทยทยทยทยทยทยทยท | 1 DAT processed

If I try do a copy and do not include a zip then I get the following error,

โœ“ Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 1 unique DAT found
โœ“ Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 27 files found
โš™ Processing DATs ยทยทยทยทยทยทยทยทยทยทยทยทยทยท | โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’ | 0/1
โœŽ MAME ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท | โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ | 0/1file:///Users/kristan/.npm/_npx/0d8028b15d717946/node_modules/igir/build/src/types/logiqx/dat.js:154
        if ((_a = this.getHeader().getClrMamePro()) === null || _a === void 0 ? void 0 : _a.getHeader()) {
                                                                                            ^

TypeError: _a.getHeader is not a function
    at DAT.isHeadered (file:///Users/kristan/.npm/_npx/0d8028b15d717946/node_modules/igir/build/src/types/logiqx/dat.js:154:93)
    at Options.canRemoveHeader (file:///Users/kristan/.npm/_npx/0d8028b15d717946/node_modules/igir/build/src/types/options.js:610:17)
    at CandidateWriter.<anonymous> (file:///Users/kristan/.npm/_npx/0d8028b15d717946/node_modules/igir/build/src/modules/candidateWriter.js:279:47)
    at Generator.next (<anonymous>)
    at file:///Users/kristan/.npm/_npx/0d8028b15d717946/node_modules/igir/build/src/modules/candidateWriter.js:7:71
    at new Promise (<anonymous>)
    at __awaiter (file:///Users/kristan/.npm/_npx/0d8028b15d717946/node_modules/igir/build/src/modules/candidateWriter.js:3:12)
    at CandidateWriter.writeRawFile (file:///Users/kristan/.npm/_npx/0d8028b15d717946/node_modules/igir/build/src/modules/candidateWriter.js:278:16)
    at CandidateWriter.<anonymous> (file:///Users/kristan/.npm/_npx/0d8028b15d717946/node_modules/igir/build/src/modules/candidateWriter.js:264:30)
    at Generator.next (<anonymous>)
    at fulfilled (file:///Users/kristan/.npm/_npx/0d8028b15d717946/node_modules/igir/build/src/modules/candidateWriter.js:4:58)

Node.js v18.5.0

Expected behavior

Expect rom to be identified and copied to the output dir.

Debug logs

[13:16:07.601] INFO: CandidatePreferer: MAME: done filtering candidates
[13:16:07.601] INFO: CandidatePostProcessor: MAME: processing candidates
[13:16:07.681] INFO: CandidatePostProcessor: MAME: done processing candidates
[13:16:07.682] INFO: CandidateWriter: MAME: writing 2 candidates
[13:16:07.683] TRACE: CandidateWriter: MAME: neogeo: writing 2 candidates
[13:16:07.684] TRACE: CandidateWriter: MAME: roms/roms-sorted/MAME/neogeo.zip: writing 10 archive entries ...
[13:16:07.701] ERROR: CandidateWriter: MAME: roms/roms-sorted/MAME/neogeo.zip: failed to create zip: Type_a.getHeader is not a function
[13:16:07.701] TRACE: CandidateWriter: MAME: neogeo: no raw files to write
[13:16:07.701] TRACE: CandidateWriter: MAME: roms/roms-sorted/MAME/3countb.zip: writing 20 archive entries ...
[13:16:07.708] ERROR: CandidateWriter: MAME: roms/roms-sorted/MAME/3countb.zip: failed to create zip: Type_a.getHeader is not a function
[13:16:07.708] TRACE: CandidateWriter: MAME: 3countb: no raw files to write
[13:16:07.708] TRACE: CandidateWriter: MAME: neogeo: done writing 2 candidates
[13:16:07.708] INFO: CandidateWriter: MAME: done writing 2 candidates
[13:16:07.709] INFO: StatusGenerator: MAME: generating ROM statuses
[13:16:07.720] INFO: StatusGenerator: MAME: done generating ROM statuses
MAME ... 2/4,610 games, 1/15 BIOSes, 2/4,610 retail releases written
[13:16:07.721] INFO: done processing 1 DAT

DAT(s) used

https://www.progettosnaps.net/download/?tipo=dat_mame&file=/dats/MAME/MAME_Dats_078.rar

igir version

v1.9.0

Node.js version

v18.5.0

Operating system

macOS Sonoma 14.0

Additional context

No response

Report on unmatched files in input directories

Is your feature request related to a problem?

No response

Describe the solution you'd like

First off thanks for such a wonderful tool, I've been looking for something like this for years.
I was wondering if it's possible to add filtering to the report, like list only missing games, or list all unknown files? Looked through and didn't see anything like that already implemented.

Thanks again.

Additional context

No response

Add Xbox support to Game Consoles

Is your feature request related to a problem?

No response

Describe the solution you'd like

Right now it appears Xbox (incl. Xbox 360) is one of the major systems not accounted for in the GameConsole handler. Should be simple to add akin to PlayStation etc and dats are available on Redump.

Additional context

No response

Support Hardware Target Game Database SMDBs as DATs

Is your feature request related to a problem?

No response

Describe the solution you'd like

Be able to support Hardware Target Game Database .txt SMDBs as if they were DATs, including their opinionated ROM sorting schemes.

Additional context

#315

SMDBs don't all include filesize, so as long as igir is exclusively using CRC32 for hashing we won't be able to support SMDBs without filesize.

`fixdat` writing to unexpected location

Paste the command

./node_modules/.bin/ts-node ./index.ts -vvv report --dat /Volumes/home/games/DATs/Redump/SNK\ -\ Neo\ Geo\ CD\ -\ Datfile\ \(111\)\ \(2022-09-23\ 17-55-26\)\(1\).zip --input /Volumes/home/games/Redump/SNK\ -\ Neo\ Geo\ CD/ --fixdat

Describe the bug

When using the --fixdat flag, I was unable to find any outputted fixdat files. I ended up adding a log locally to find what the path actually is, and it seems to write it to a weird temporary or test directory.

src/igir.ts line 99

      // Write a fixdat
      var fixpath = await new FixdatCreator(this.options, progressBar).write(dat, parentsToCombinedCandidates);
      await progressBar.logError(`${fixpath}: fixdat path`);

/var/folders/3s/1_v_qynj73sg7jfymxd9dny00000gn/T/igir/eyj2mb/SNK - Neo Geo CD fixdat (20230507-085738).dat
image

Expected behavior

I would expect the fixdats to be output in the directories specified by the --output flag (and to honor --dir-dat-name), or if omitted the --input. At the very list the same location as the DAT specified by --dat.

https://igir.io/dats/?h=fixdat#fixdats seems to imply the fixdats will go to the output directory.

Debug logs

[08:59:21.270] DEBUG: DATScanner: found 1 DAT file
[08:59:21.271] DEBUG: DATScanner: enumerating DAT archives
[08:59:21.323] DEBUG: DATScanner: downloading DATs from URLs
[08:59:21.324] DEBUG: DATScanner: parsing 1 DAT file
[08:59:21.404] TRACE: DATScanner: /Volumes/home/games/DATs/Redump/SNK - Neo Geo CD - Datfile (111) (2022-09-23 17-55-26)(1).zip|SNK - Neo Geo CD - Datfile (111) (2022-09-23
17-55-26).dat: attempting to parse 684.1KiB of XML
[08:59:21.532] TRACE: DATScanner: /Volumes/home/games/DATs/Redump/SNK - Neo Geo CD - Datfile (111) (2022-09-23 17-55-26)(1).zip|SNK - Neo Geo CD - Datfile (111) (2022-09-23
17-55-26).dat: parsed XML, deserializing to DAT
[08:59:21.761] TRACE: DATScanner: /Volumes/home/games/DATs/Redump/SNK - Neo Geo CD - Datfile (111) (2022-09-23 17-55-26)(1).zip|SNK - Neo Geo CD - Datfile (111) (2022-09-23
17-55-26).dat: 60GiB of 111 games, 111 parents parsed
[08:59:21.762] INFO:  DATScanner: done scanning DAT files
โœ“ Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 1 unique DAT found
[08:59:21.765] INFO:  ROMScanner: scanning ROM files
[08:59:22.193] DEBUG: ROMScanner: found 107 ROM files
[08:59:28.161] INFO:  ROMScanner: done scanning ROM files
โœ“ Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 2,944 unique ROMs found
[08:59:28.163] INFO:  HeaderProcessor: processing file headers
[08:59:28.217] DEBUG: HeaderProcessor: found headers in 0 ROMs
[08:59:28.217] INFO:  HeaderProcessor: done processing file headers
โœ“ Detecting ROM headers ยทยทยทยทยทยทยทยท | 2,944 ROMs processed
[08:59:28.218] INFO:  processing 1 DAT
[08:59:28.220] INFO:  CandidateFilter: SNK - Neo Geo CD: generating candidates
[08:59:28.223] DEBUG: CandidateFilter: SNK - Neo Geo CD: 2,944 unique ROMs found
[08:59:28.225] TRACE: CandidateFilter: SNK - Neo Geo CD: Top Hunter - Roddy & Cathy (Japan) (En,Ja): found 1 candidate
[08:59:28.225] TRACE: CandidateFilter: SNK - Neo Geo CD: Raguy ~ Blue's Journey (Japan) (En,Ja): found 1 candidate
[08:59:28.227] TRACE: CandidateFilter: SNK - Neo Geo CD: Magician Lord (Japan) (En,Ja): found 1 candidate
[08:59:28.227] TRACE: CandidateFilter: SNK - Neo Geo CD: Ninja Commando (Japan) (En,Ja): found 1 candidate
[08:59:28.228] TRACE: CandidateFilter: SNK - Neo Geo CD: Mutation Nation (Japan) (En,Ja): found 1 candidate
[08:59:28.228] TRACE: CandidateFilter: SNK - Neo Geo CD: Rally Chase (Japan) (En,Ja): found 1 candidate
[08:59:28.229] TRACE: CandidateFilter: SNK - Neo Geo CD: Viewpoint (Japan): found 1 candidate
[08:59:28.229] TRACE: CandidateFilter: SNK - Neo Geo CD: ASO II - The Last Guardian ~ Alpha Mission II (Japan) (En,Ja): found 1 candidate
[08:59:28.229] TRACE: CandidateFilter: SNK - Neo Geo CD: Ghost Pilots (World): found 1 candidate
[08:59:28.230] TRACE: CandidateFilter: SNK - Neo Geo CD: Sonic Wings 2 ~ Aero Fighters 2 (World) (En,Ja): found 1 candidate
[08:59:28.230] TRACE: CandidateFilter: SNK - Neo Geo CD: Shougi no Tatsujin - Master of Syougi (Japan): found 1 candidate
[08:59:28.230] TRACE: CandidateFilter: SNK - Neo Geo CD: Top Player's Golf (Japan) (En,Ja): found 1 candidate
[08:59:28.231] TRACE: CandidateFilter: SNK - Neo Geo CD: 2020 Super Baseball (Japan) (En,Ja): found 1 candidate
[08:59:28.231] TRACE: CandidateFilter: SNK - Neo Geo CD: Soccer Brawl (World): found 1 candidate
[08:59:28.232] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '94, The (World) (En,Ja) (Rev 1): found 1 candidate
[08:59:28.232] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '95, The (World) (En,Ja): found 1 candidate
[08:59:28.233] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '96, The (World) (En,Ja): found 1 candidate
[08:59:28.233] TRACE: CandidateFilter: SNK - Neo Geo CD: Galaxy Fight - Universal Warriors (Japan) (En,Ja,Es): found 1 candidate
[08:59:28.234] TRACE: CandidateFilter: SNK - Neo Geo CD: Fire Suplex ~ 3 Count Bout (World) (En,Ja): found 1 candidate
[08:59:28.234] TRACE: CandidateFilter: SNK - Neo Geo CD: Dunk Dream ~ Street Slam ~ Street Hoop (World): found 1 candidate
[08:59:28.234] TRACE: CandidateFilter: SNK - Neo Geo CD: Double Dragon (Japan) (En,Ja) (Rev 1): found 1 candidate
[08:59:28.235] TRACE: CandidateFilter: SNK - Neo Geo CD: Shinsetsu Samurai Spirits - Bushidou Retsuden (Japan): found 1 candidate
[08:59:28.236] TRACE: CandidateFilter: SNK - Neo Geo CD: Samurai Spirits ~ Samurai Shodown (Japan) (En,Ja): found 1 candidate
[08:59:28.236] TRACE: CandidateFilter: SNK - Neo Geo CD: Shin Samurai Spirits - Haoumaru Jigokuhen ~ Samurai Shodown II (World) (En,Ja): found 1 candidate
[08:59:28.238] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '94, The (World) (En,Ja): found 1 candidate
[08:59:28.239] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '97, The (Japan) (En,Ja): found 1 candidate
[08:59:28.239] TRACE: CandidateFilter: SNK - Neo Geo CD: Quiz King of Fighters (Japan): found 1 candidate
[08:59:28.240] TRACE: CandidateFilter: SNK - Neo Geo CD: Metal Slug (Japan) (En,Ja): found 1 candidate
[08:59:28.240] TRACE: CandidateFilter: SNK - Neo Geo CD: Metal Slug 2 (World) (En,Ja): found 1 candidate
[08:59:28.240] TRACE: CandidateFilter: SNK - Neo Geo CD: Last Resort (Japan) (En,Ja): found 1 candidate
[08:59:28.241] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '98, The - Dream Match Never Ends ~ The King of Fighters '98 - The Slugfest (Japan) (En,Ja): found 1
candidate
[08:59:28.241] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes Perfect (World) (En,Ja): found 1 candidate
[08:59:28.242] TRACE: CandidateFilter: SNK - Neo Geo CD: Tsuukai Gangan Koushinkyoku ~ Aggressors of Dark Kombat (World) (En,Ja): found 1 candidate
[08:59:28.242] TRACE: CandidateFilter: SNK - Neo Geo CD: Power Spikes II (Japan) (En,Ja): found 1 candidate
[08:59:28.243] TRACE: CandidateFilter: SNK - Neo Geo CD: Double Dragon (Export) (En,Ja): found 1 candidate
[08:59:28.243] WARN:  CandidateFilter: SNK - Neo Geo CD: missing 2 files for: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (Japan)
(En,Ja,Es,Pt)
[08:59:28.243] WARN:  CandidateFilter:   Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (Japan) (En,Ja,Es,Pt).cue
[08:59:28.243] WARN:  CandidateFilter:   Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (Japan) (En,Ja,Es,Pt) (Track 01).bin
[08:59:28.244] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (Japan) (En,Ja,Es,Pt): found
0 candidates
[08:59:28.245] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (Export) (En,Ja,Es,Pt) (Rev
3): found 1 candidate
[08:59:28.246] TRACE: CandidateFilter: SNK - Neo Geo CD: Real Bout Garou Densetsu ~ Real Bout Fatal Fury (World) (En,Ja,Es,Pt): found 1 candidate
[08:59:28.246] TRACE: CandidateFilter: SNK - Neo Geo CD: Samurai Spirits - Amakusa Kourin ~ Samurai Shodown IV - Amakusa's Revenge (World) (En,Ja,Es,Pt): found 1 candidate
[08:59:28.247] TRACE: CandidateFilter: SNK - Neo Geo CD: Neo-Geo CD Special (Japan): found 1 candidate
[08:59:28.247] TRACE: CandidateFilter: SNK - Neo Geo CD: Ryuuko no Ken 2 ~ Art of Fighting 2 (World) (En,Ja,Es): found 1 candidate
[08:59:28.248] TRACE: CandidateFilter: SNK - Neo Geo CD: Art of Fighting - Ryuuko no Ken Gaiden ~ The Path of the Warrior - Art of Fighting 3 (World) (En,Ja,Es,Pt): found 1
candidate
[08:59:28.248] TRACE: CandidateFilter: SNK - Neo Geo CD: Real Bout Garou Densetsu Special ~ Real Bout Fatal Fury Special (World) (En,Ja,Es,Pt): found 1 candidate
[08:59:28.250] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes 2 Jet (Japan) (En,Ja): found 1 candidate
[08:59:28.251] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja): found 1 candidate
[08:59:28.251] TRACE: CandidateFilter: SNK - Neo Geo CD: Choujin Gakuen - Gowcaizer (Japan) (En,Ja): found 1 candidate
[08:59:28.251] TRACE: CandidateFilter: SNK - Neo Geo CD: Next Thing, The - King of the Monsters 2 (World) (En,Ja): found 1 candidate
[08:59:28.252] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '99, The ~ The King of Fighters '99 - Millennium Battle (World) (En,Ja,Es,Pt): found 1 candidate
[08:59:28.252] TRACE: CandidateFilter: SNK - Neo Geo CD: Tokuten-ou 3 - Eikou e no Chousen ~ Super Sidekicks 3 - The Next Glory (World) (En,Ja,Fr,Es,It,Pt): found 1 candidate
[08:59:28.253] WARN:  CandidateFilter: SNK - Neo Geo CD: missing 2 files for: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (World)
(En,Ja,Es,Pt) (Rev 1)
[08:59:28.253] WARN:  CandidateFilter:   Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (World) (En,Ja,Es,Pt) (Rev 1).cue
[08:59:28.253] WARN:  CandidateFilter:   Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (World) (En,Ja,Es,Pt) (Rev 1) (Track 01).bin
[08:59:28.254] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (World) (En,Ja,Es,Pt) (Rev
1): found 0 candidates
[08:59:28.255] TRACE: CandidateFilter: SNK - Neo Geo CD: Ryuuko no Ken ~ Art of Fighting (World) (En,Ja,Es): found 1 candidate
[08:59:28.255] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 2 ~ Fatal Fury 2 (Japan) (En,Ja): found 1 candidate
[08:59:28.256] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (Export) (En,Ja,Es,Pt) (Rev
2): found 1 candidate
[08:59:28.256] WARN:  CandidateFilter: SNK - Neo Geo CD: missing 4 files for: Garou Densetsu Special ~ Fatal Fury Special (World) (En,Ja) (Rev 1)
[08:59:28.256] WARN:  CandidateFilter:   Garou Densetsu Special ~ Fatal Fury Special (World) (En,Ja) (Rev 1).cue
[08:59:28.256] WARN:  CandidateFilter:   Garou Densetsu Special ~ Fatal Fury Special (World) (En,Ja) (Rev 1) (Track 01).bin
[08:59:28.256] WARN:  CandidateFilter:   Garou Densetsu Special ~ Fatal Fury Special (World) (En,Ja) (Rev 1) (Track 26).bin
[08:59:28.256] WARN:  CandidateFilter:   Garou Densetsu Special ~ Fatal Fury Special (World) (En,Ja) (Rev 1) (Track 27).bin
[08:59:28.258] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu Special ~ Fatal Fury Special (World) (En,Ja) (Rev 1): found 0 candidates
[08:59:28.258] TRACE: CandidateFilter: SNK - Neo Geo CD: Samurai Spirits - Zankurou Musouken ~ Samurai Shodown III (World) (En,Ja,Es,Pt): found 1 candidate
[08:59:28.259] TRACE: CandidateFilter: SNK - Neo Geo CD: Fighter's History Dynamite ~ Karnov's Revenge (Japan) (En,Ja): found 1 candidate
[08:59:28.259] TRACE: CandidateFilter: SNK - Neo Geo CD: Crossed Swords (Japan): found 1 candidate
[08:59:28.260] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '95, The (Japan) (En,Ja) (Rev 1): found 1 candidate
[08:59:28.260] TRACE: CandidateFilter: SNK - Neo Geo CD: Puzzle Bobble ~ Bust-A-Move (Japan) (En,Ja): found 1 candidate
[08:59:28.260] TRACE: CandidateFilter: SNK - Neo Geo CD: League Bowling (Japan) (En,Ja): found 1 candidate
[08:59:28.261] TRACE: CandidateFilter: SNK - Neo Geo CD: Ninja Master's - Haou Ninpou Chou (Japan) (En,Ja): found 1 candidate
[08:59:28.263] TRACE: CandidateFilter: SNK - Neo Geo CD: Far East of Eden - Tengai Makyou Shinden ~ Far East of Eden - Kabuki Klash (Japan) (En,Ja): found 1 candidate
[08:59:28.264] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes (Japan) (En,Ja): found 1 candidate
[08:59:28.264] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes 2 (Japan) (En,Ja): found 1 candidate
[08:59:28.265] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu - Shukumei no Tatakai ~ Fatal Fury - King of Fighters (Japan) (En,Ja): found 1 candidate
[08:59:28.265] TRACE: CandidateFilter: SNK - Neo Geo CD: RB2 - The Newcomers - Real Bout Garou Densetsu 2 ~ RB2 - The Newcomers - Real Bout Fatal Fury 2 (Japan) (En,Ja):
found 1 candidate
[08:59:28.266] TRACE: CandidateFilter: SNK - Neo Geo CD: Flying Power Disc ~ Windjammers (Japan) (En,Ja): found 1 candidate
[08:59:28.267] TRACE: CandidateFilter: SNK - Neo Geo CD: Bakumatsu Roman - Gekka no Kenshi ~ The Last Blade (Japan) (En,Ja,Es,Pt): found 1 candidate
[08:59:28.267] TRACE: CandidateFilter: SNK - Neo Geo CD: Bakumatsu Roman Daini Maku - Gekka no Kenshi - Tsuki ni Saku Hana, Chiri Yuku Hana ~ The Last Blade 2 (Japan)
(En,Ja,Es,Pt): found 1 candidate
[08:59:28.268] TRACE: CandidateFilter: SNK - Neo Geo CD: Football Frenzy (Japan) (En,Ja): found 1 candidate
[08:59:28.268] TRACE: CandidateFilter: SNK - Neo Geo CD: Tokuten-ou 2 ~ Super Sidekicks 2 - The World Championship (Japan) (En,Ja,Es): found 1 candidate
[08:59:28.269] TRACE: CandidateFilter: SNK - Neo Geo CD: Sonic Wings 3 ~ Aero Fighters 3 (Japan) (En,Ja): found 1 candidate
[08:59:28.270] TRACE: CandidateFilter: SNK - Neo Geo CD: Idol Mahjong - Final Romance 2 (Japan): found 1 candidate
[08:59:28.270] TRACE: CandidateFilter: SNK - Neo Geo CD: Fuuun Mokushiroku - Kakutou Sousei ~ Savage Reign (World) (En,Ja,Es,Pt): found 1 candidate
[08:59:28.271] TRACE: CandidateFilter: SNK - Neo Geo CD: Stakes Winner - GI Kanzen Seiha e no Michi (Japan): found 1 candidate
[08:59:28.271] TRACE: CandidateFilter: SNK - Neo Geo CD: Pulstar (Japan) (En,Ja): found 1 candidate
[08:59:28.271] TRACE: CandidateFilter: SNK - Neo Geo CD: Magical Drop 2 (Japan) (En,Ja): found 1 candidate
[08:59:28.272] TRACE: CandidateFilter: SNK - Neo Geo CD: ADK World (Japan): found 1 candidate
[08:59:28.272] TRACE: CandidateFilter: SNK - Neo Geo CD: Burning Fight (Japan) (En,Ja): found 1 candidate
[08:59:28.273] TRACE: CandidateFilter: SNK - Neo Geo CD: Joy Joy Kid ~ Puzzled (World) (En,Ja): found 1 candidate
[08:59:28.273] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '96 NeoGeo Collection, The (Japan): found 1 candidate
[08:59:28.274] TRACE: CandidateFilter: SNK - Neo Geo CD: Janshin Densetsu - Quest of Jongmaster (Japan): found 1 candidate
[08:59:28.274] TRACE: CandidateFilter: SNK - Neo Geo CD: Mahjong-kyou Retsuden - Nishi Nihon-hen (Japan): found 1 candidate
[08:59:28.276] TRACE: CandidateFilter: SNK - Neo Geo CD: Nam-1975 (Japan) (En,Ja): found 1 candidate
[08:59:28.276] TRACE: CandidateFilter: SNK - Neo Geo CD: Ninja Combat (Japan) (En,Ja): found 1 candidate
[08:59:28.277] TRACE: CandidateFilter: SNK - Neo Geo CD: Riding Hero (Japan) (En,Ja): found 1 candidate
[08:59:28.277] TRACE: CandidateFilter: SNK - Neo Geo CD: Robo Army (Japan) (En,Ja): found 1 candidate
[08:59:28.277] TRACE: CandidateFilter: SNK - Neo Geo CD: Baseball Stars 2 (Japan) (En,Ja): found 1 candidate
[08:59:28.278] TRACE: CandidateFilter: SNK - Neo Geo CD: Fuuun Mokushiroku - Kakutou Sousei ~ Savage Reign (Export) (En,Ja,Es,Pt) (Rev 1): found 1 candidate
[08:59:28.278] TRACE: CandidateFilter: SNK - Neo Geo CD: Crossed Swords II (Japan) (En,Ja): found 1 candidate
[08:59:28.279] TRACE: CandidateFilter: SNK - Neo Geo CD: Treasure of the Caribbean (France) (En,Ja) (Unl): found 0 candidates
[08:59:28.279] TRACE: CandidateFilter: SNK - Neo Geo CD: Baseball Stars Professional (Japan) (En,Ja): found 1 candidate
[08:59:28.279] TRACE: CandidateFilter: SNK - Neo Geo CD: Breakers (Japan) (En,Ja): found 1 candidate
[08:59:28.280] TRACE: CandidateFilter: SNK - Neo Geo CD: Big Tournament Golf ~ Neo Turf Masters (Japan) (En,Ja): found 1 candidate
[08:59:28.280] TRACE: CandidateFilter: SNK - Neo Geo CD: Cyber-Lip (Japan) (En,Ja): found 1 candidate
[08:59:28.280] TRACE: CandidateFilter: SNK - Neo Geo CD: Futsal - 5 on 5 Mini Soccer ~ PleasureGoal - 5 on 5 Mini Soccer (Japan) (En,Ja): found 1 candidate
[08:59:28.281] TRACE: CandidateFilter: SNK - Neo Geo CD: Shinouken ~ Ragnagard (Japan) (En,Ja,Es): found 1 candidate
[08:59:28.281] TRACE: CandidateFilter: SNK - Neo Geo CD: Super Sidekicks - Tokuten-ou (Japan) (En,Ja): found 1 candidate
[08:59:28.282] TRACE: CandidateFilter: SNK - Neo Geo CD: Super Spy, The (Japan) (En,Ja): found 1 candidate
[08:59:28.282] TRACE: CandidateFilter: SNK - Neo Geo CD: Andro Dunos (France) (Unl): found 1 candidate
[08:59:28.283] TRACE: CandidateFilter: SNK - Neo Geo CD: Sengoku Denshou 2 ~ Sengoku 2 (Japan) (En,Ja): found 1 candidate
[08:59:28.283] TRACE: CandidateFilter: SNK - Neo Geo CD: Neo Drift Out - New Technology (Japan): found 1 candidate
[08:59:28.283] TRACE: CandidateFilter: SNK - Neo Geo CD: OverTop (Japan) (En,Ja): found 1 candidate
[08:59:28.284] TRACE: CandidateFilter: SNK - Neo Geo CD: Choutetsu Brikin'ger ~ Ironclad - Tesshou Rusha (Japan) (En,Ja): found 1 candidate
[08:59:28.284] TRACE: CandidateFilter: SNK - Neo Geo CD: Sengoku Denshou ~ Sengoku (Japan) (En,Ja): found 1 candidate
[08:59:28.285] TRACE: CandidateFilter: SNK - Neo Geo CD: Oshidashi Zintrick ~ ZinTricK (Japan) (En,Ja): found 1 candidate
[08:59:28.285] TRACE: CandidateFilter: SNK - Neo Geo CD: Twinkle Star Sprites (Japan) (En,Ja): found 1 candidate
[08:59:28.285] TRACE: CandidateFilter: SNK - Neo Geo CD: Bang^2 Busters (France) (En,Ja) (Unl): found 1 candidate
[08:59:28.286] TRACE: CandidateFilter: SNK - Neo Geo CD: Last Hope (Germany) (Unl): found 1 candidate
[08:59:28.286] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes Perfect (Export) (En,Ja) (Rev 1): found 1 candidate
[08:59:28.287] TRACE: CandidateFilter: SNK - Neo Geo CD: Xeno Crisis (World) (Unl): found 1 candidate
[08:59:28.289] DEBUG: CandidateFilter: SNK - Neo Geo CD: generated 57.3GiB of 107 candidates for 111 parents
[08:59:28.289] INFO:  CandidateFilter: SNK - Neo Geo CD: done generating candidates
[08:59:28.289] INFO:  PatchCandidateGenerator: SNK - Neo Geo CD: generating patched candidates
[08:59:28.291] DEBUG: PatchCandidateGenerator: SNK - Neo Geo CD: 0 unique patches found
[08:59:28.295] INFO:  PatchCandidateGenerator: SNK - Neo Geo CD: done generating patched candidates
[08:59:28.347] INFO:  CandidateFilter: SNK - Neo Geo CD: filtering candidates
[08:59:28.348] TRACE: CandidateFilter: SNK - Neo Geo CD: Top Hunter - Roddy & Cathy (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.350] TRACE: CandidateFilter: SNK - Neo Geo CD: Top Hunter - Roddy & Cathy (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.351] TRACE: CandidateFilter: SNK - Neo Geo CD: Raguy ~ Blue's Journey (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.352] TRACE: CandidateFilter: SNK - Neo Geo CD: Raguy ~ Blue's Journey (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.353] TRACE: CandidateFilter: SNK - Neo Geo CD: Magician Lord (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.353] TRACE: CandidateFilter: SNK - Neo Geo CD: Magician Lord (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.353] TRACE: CandidateFilter: SNK - Neo Geo CD: Ninja Commando (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.354] TRACE: CandidateFilter: SNK - Neo Geo CD: Ninja Commando (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.354] TRACE: CandidateFilter: SNK - Neo Geo CD: Mutation Nation (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.354] TRACE: CandidateFilter: SNK - Neo Geo CD: Mutation Nation (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.355] TRACE: CandidateFilter: SNK - Neo Geo CD: Rally Chase (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.355] TRACE: CandidateFilter: SNK - Neo Geo CD: Rally Chase (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.355] TRACE: CandidateFilter: SNK - Neo Geo CD: Viewpoint (Japan): 1 candidate before filtering
[08:59:28.355] TRACE: CandidateFilter: SNK - Neo Geo CD: Viewpoint (Japan): 1 candidate after filtering
[08:59:28.356] TRACE: CandidateFilter: SNK - Neo Geo CD: ASO II - The Last Guardian ~ Alpha Mission II (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.356] TRACE: CandidateFilter: SNK - Neo Geo CD: ASO II - The Last Guardian ~ Alpha Mission II (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.357] TRACE: CandidateFilter: SNK - Neo Geo CD: Ghost Pilots (World): 1 candidate before filtering
[08:59:28.358] TRACE: CandidateFilter: SNK - Neo Geo CD: Ghost Pilots (World): 1 candidate after filtering
[08:59:28.358] TRACE: CandidateFilter: SNK - Neo Geo CD: Sonic Wings 2 ~ Aero Fighters 2 (World) (En,Ja): 1 candidate before filtering
[08:59:28.360] TRACE: CandidateFilter: SNK - Neo Geo CD: Sonic Wings 2 ~ Aero Fighters 2 (World) (En,Ja): 1 candidate after filtering
[08:59:28.360] TRACE: CandidateFilter: SNK - Neo Geo CD: Shougi no Tatsujin - Master of Syougi (Japan): 1 candidate before filtering
[08:59:28.361] TRACE: CandidateFilter: SNK - Neo Geo CD: Shougi no Tatsujin - Master of Syougi (Japan): 1 candidate after filtering
[08:59:28.361] TRACE: CandidateFilter: SNK - Neo Geo CD: Top Player's Golf (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.361] TRACE: CandidateFilter: SNK - Neo Geo CD: Top Player's Golf (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.362] TRACE: CandidateFilter: SNK - Neo Geo CD: 2020 Super Baseball (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.362] TRACE: CandidateFilter: SNK - Neo Geo CD: 2020 Super Baseball (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.362] TRACE: CandidateFilter: SNK - Neo Geo CD: Soccer Brawl (World): 1 candidate before filtering
[08:59:28.363] TRACE: CandidateFilter: SNK - Neo Geo CD: Soccer Brawl (World): 1 candidate after filtering
[08:59:28.364] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '94, The (World) (En,Ja) (Rev 1): 1 candidate before filtering
[08:59:28.365] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '94, The (World) (En,Ja) (Rev 1): 1 candidate after filtering
[08:59:28.365] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '95, The (World) (En,Ja): 1 candidate before filtering
[08:59:28.365] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '95, The (World) (En,Ja): 1 candidate after filtering
[08:59:28.366] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '96, The (World) (En,Ja): 1 candidate before filtering
[08:59:28.366] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '96, The (World) (En,Ja): 1 candidate after filtering
[08:59:28.366] TRACE: CandidateFilter: SNK - Neo Geo CD: Galaxy Fight - Universal Warriors (Japan) (En,Ja,Es): 1 candidate before filtering
[08:59:28.367] TRACE: CandidateFilter: SNK - Neo Geo CD: Galaxy Fight - Universal Warriors (Japan) (En,Ja,Es): 1 candidate after filtering
[08:59:28.367] TRACE: CandidateFilter: SNK - Neo Geo CD: Fire Suplex ~ 3 Count Bout (World) (En,Ja): 1 candidate before filtering
[08:59:28.367] TRACE: CandidateFilter: SNK - Neo Geo CD: Fire Suplex ~ 3 Count Bout (World) (En,Ja): 1 candidate after filtering
[08:59:28.367] TRACE: CandidateFilter: SNK - Neo Geo CD: Dunk Dream ~ Street Slam ~ Street Hoop (World): 1 candidate before filtering
[08:59:28.368] TRACE: CandidateFilter: SNK - Neo Geo CD: Dunk Dream ~ Street Slam ~ Street Hoop (World): 1 candidate after filtering
[08:59:28.368] TRACE: CandidateFilter: SNK - Neo Geo CD: Double Dragon (Japan) (En,Ja) (Rev 1): 1 candidate before filtering
[08:59:28.369] TRACE: CandidateFilter: SNK - Neo Geo CD: Double Dragon (Japan) (En,Ja) (Rev 1): 1 candidate after filtering
[08:59:28.369] TRACE: CandidateFilter: SNK - Neo Geo CD: Shinsetsu Samurai Spirits - Bushidou Retsuden (Japan): 1 candidate before filtering
[08:59:28.369] TRACE: CandidateFilter: SNK - Neo Geo CD: Shinsetsu Samurai Spirits - Bushidou Retsuden (Japan): 1 candidate after filtering
[08:59:28.369] TRACE: CandidateFilter: SNK - Neo Geo CD: Samurai Spirits ~ Samurai Shodown (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.370] TRACE: CandidateFilter: SNK - Neo Geo CD: Samurai Spirits ~ Samurai Shodown (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.370] TRACE: CandidateFilter: SNK - Neo Geo CD: Shin Samurai Spirits - Haoumaru Jigokuhen ~ Samurai Shodown II (World) (En,Ja): 1 candidate before filtering
[08:59:28.370] TRACE: CandidateFilter: SNK - Neo Geo CD: Shin Samurai Spirits - Haoumaru Jigokuhen ~ Samurai Shodown II (World) (En,Ja): 1 candidate after filtering
[08:59:28.371] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '94, The (World) (En,Ja): 1 candidate before filtering
[08:59:28.371] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '94, The (World) (En,Ja): 1 candidate after filtering
[08:59:28.371] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '97, The (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.371] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '97, The (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.372] TRACE: CandidateFilter: SNK - Neo Geo CD: Quiz King of Fighters (Japan): 1 candidate before filtering
[08:59:28.372] TRACE: CandidateFilter: SNK - Neo Geo CD: Quiz King of Fighters (Japan): 1 candidate after filtering
[08:59:28.372] TRACE: CandidateFilter: SNK - Neo Geo CD: Metal Slug (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.372] TRACE: CandidateFilter: SNK - Neo Geo CD: Metal Slug (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.373] TRACE: CandidateFilter: SNK - Neo Geo CD: Metal Slug 2 (World) (En,Ja): 1 candidate before filtering
[08:59:28.373] TRACE: CandidateFilter: SNK - Neo Geo CD: Metal Slug 2 (World) (En,Ja): 1 candidate after filtering
[08:59:28.373] TRACE: CandidateFilter: SNK - Neo Geo CD: Last Resort (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.373] TRACE: CandidateFilter: SNK - Neo Geo CD: Last Resort (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.374] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '98, The - Dream Match Never Ends ~ The King of Fighters '98 - The Slugfest (Japan) (En,Ja): 1
candidate before filtering
[08:59:28.374] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '98, The - Dream Match Never Ends ~ The King of Fighters '98 - The Slugfest (Japan) (En,Ja): 1
candidate after filtering
[08:59:28.374] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes Perfect (World) (En,Ja): 1 candidate before filtering
[08:59:28.375] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes Perfect (World) (En,Ja): 1 candidate after filtering
[08:59:28.375] TRACE: CandidateFilter: SNK - Neo Geo CD: Tsuukai Gangan Koushinkyoku ~ Aggressors of Dark Kombat (World) (En,Ja): 1 candidate before filtering
[08:59:28.375] TRACE: CandidateFilter: SNK - Neo Geo CD: Tsuukai Gangan Koushinkyoku ~ Aggressors of Dark Kombat (World) (En,Ja): 1 candidate after filtering
[08:59:28.376] TRACE: CandidateFilter: SNK - Neo Geo CD: Power Spikes II (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.376] TRACE: CandidateFilter: SNK - Neo Geo CD: Power Spikes II (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.376] TRACE: CandidateFilter: SNK - Neo Geo CD: Double Dragon (Export) (En,Ja): 1 candidate before filtering
[08:59:28.376] TRACE: CandidateFilter: SNK - Neo Geo CD: Double Dragon (Export) (En,Ja): 1 candidate after filtering
[08:59:28.377] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (Japan) (En,Ja,Es,Pt): 0
candidates before filtering
[08:59:28.377] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (Japan) (En,Ja,Es,Pt): 0
candidates after filtering
[08:59:28.377] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (Export) (En,Ja,Es,Pt) (Rev
3): 1 candidate before filtering
[08:59:28.378] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (Export) (En,Ja,Es,Pt) (Rev
3): 1 candidate after filtering
[08:59:28.378] TRACE: CandidateFilter: SNK - Neo Geo CD: Real Bout Garou Densetsu ~ Real Bout Fatal Fury (World) (En,Ja,Es,Pt): 1 candidate before filtering
[08:59:28.379] TRACE: CandidateFilter: SNK - Neo Geo CD: Real Bout Garou Densetsu ~ Real Bout Fatal Fury (World) (En,Ja,Es,Pt): 1 candidate after filtering
[08:59:28.379] TRACE: CandidateFilter: SNK - Neo Geo CD: Samurai Spirits - Amakusa Kourin ~ Samurai Shodown IV - Amakusa's Revenge (World) (En,Ja,Es,Pt): 1 candidate before
filtering
[08:59:28.380] TRACE: CandidateFilter: SNK - Neo Geo CD: Samurai Spirits - Amakusa Kourin ~ Samurai Shodown IV - Amakusa's Revenge (World) (En,Ja,Es,Pt): 1 candidate after
filtering
[08:59:28.380] TRACE: CandidateFilter: SNK - Neo Geo CD: Neo-Geo CD Special (Japan): 1 candidate before filtering
[08:59:28.380] TRACE: CandidateFilter: SNK - Neo Geo CD: Neo-Geo CD Special (Japan): 1 candidate after filtering
[08:59:28.381] TRACE: CandidateFilter: SNK - Neo Geo CD: Ryuuko no Ken 2 ~ Art of Fighting 2 (World) (En,Ja,Es): 1 candidate before filtering
[08:59:28.381] TRACE: CandidateFilter: SNK - Neo Geo CD: Ryuuko no Ken 2 ~ Art of Fighting 2 (World) (En,Ja,Es): 1 candidate after filtering
[08:59:28.381] TRACE: CandidateFilter: SNK - Neo Geo CD: Art of Fighting - Ryuuko no Ken Gaiden ~ The Path of the Warrior - Art of Fighting 3 (World) (En,Ja,Es,Pt): 1
candidate before filtering
[08:59:28.382] TRACE: CandidateFilter: SNK - Neo Geo CD: Art of Fighting - Ryuuko no Ken Gaiden ~ The Path of the Warrior - Art of Fighting 3 (World) (En,Ja,Es,Pt): 1
candidate after filtering
[08:59:28.382] TRACE: CandidateFilter: SNK - Neo Geo CD: Real Bout Garou Densetsu Special ~ Real Bout Fatal Fury Special (World) (En,Ja,Es,Pt): 1 candidate before filtering
[08:59:28.383] TRACE: CandidateFilter: SNK - Neo Geo CD: Real Bout Garou Densetsu Special ~ Real Bout Fatal Fury Special (World) (En,Ja,Es,Pt): 1 candidate after filtering
[08:59:28.384] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes 2 Jet (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.384] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes 2 Jet (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.384] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.385] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.385] TRACE: CandidateFilter: SNK - Neo Geo CD: Choujin Gakuen - Gowcaizer (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.386] TRACE: CandidateFilter: SNK - Neo Geo CD: Choujin Gakuen - Gowcaizer (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.386] TRACE: CandidateFilter: SNK - Neo Geo CD: Next Thing, The - King of the Monsters 2 (World) (En,Ja): 1 candidate before filtering
[08:59:28.387] TRACE: CandidateFilter: SNK - Neo Geo CD: Next Thing, The - King of the Monsters 2 (World) (En,Ja): 1 candidate after filtering
[08:59:28.387] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '99, The ~ The King of Fighters '99 - Millennium Battle (World) (En,Ja,Es,Pt): 1 candidate before
filtering
[08:59:28.387] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '99, The ~ The King of Fighters '99 - Millennium Battle (World) (En,Ja,Es,Pt): 1 candidate after
filtering
[08:59:28.388] TRACE: CandidateFilter: SNK - Neo Geo CD: Tokuten-ou 3 - Eikou e no Chousen ~ Super Sidekicks 3 - The Next Glory (World) (En,Ja,Fr,Es,It,Pt): 1 candidate
before filtering
[08:59:28.389] TRACE: CandidateFilter: SNK - Neo Geo CD: Tokuten-ou 3 - Eikou e no Chousen ~ Super Sidekicks 3 - The Next Glory (World) (En,Ja,Fr,Es,It,Pt): 1 candidate after
filtering
[08:59:28.389] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (World) (En,Ja,Es,Pt) (Rev
1): 0 candidates before filtering
[08:59:28.390] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (World) (En,Ja,Es,Pt) (Rev
1): 0 candidates after filtering
[08:59:28.393] TRACE: CandidateFilter: SNK - Neo Geo CD: Ryuuko no Ken ~ Art of Fighting (World) (En,Ja,Es): 1 candidate before filtering
[08:59:28.393] TRACE: CandidateFilter: SNK - Neo Geo CD: Ryuuko no Ken ~ Art of Fighting (World) (En,Ja,Es): 1 candidate after filtering
[08:59:28.393] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 2 ~ Fatal Fury 2 (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.394] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 2 ~ Fatal Fury 2 (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.395] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (Export) (En,Ja,Es,Pt) (Rev
2): 1 candidate before filtering
[08:59:28.395] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu 3 - Road to the Final Victory ~ Fatal Fury 3 - Road to the Final Victory (Export) (En,Ja,Es,Pt) (Rev
2): 1 candidate after filtering
[08:59:28.396] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu Special ~ Fatal Fury Special (World) (En,Ja) (Rev 1): 0 candidates before filtering
[08:59:28.397] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu Special ~ Fatal Fury Special (World) (En,Ja) (Rev 1): 0 candidates after filtering
[08:59:28.397] TRACE: CandidateFilter: SNK - Neo Geo CD: Samurai Spirits - Zankurou Musouken ~ Samurai Shodown III (World) (En,Ja,Es,Pt): 1 candidate before filtering
[08:59:28.397] TRACE: CandidateFilter: SNK - Neo Geo CD: Samurai Spirits - Zankurou Musouken ~ Samurai Shodown III (World) (En,Ja,Es,Pt): 1 candidate after filtering
[08:59:28.398] TRACE: CandidateFilter: SNK - Neo Geo CD: Fighter's History Dynamite ~ Karnov's Revenge (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.398] TRACE: CandidateFilter: SNK - Neo Geo CD: Fighter's History Dynamite ~ Karnov's Revenge (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.399] TRACE: CandidateFilter: SNK - Neo Geo CD: Crossed Swords (Japan): 1 candidate before filtering
[08:59:28.399] TRACE: CandidateFilter: SNK - Neo Geo CD: Crossed Swords (Japan): 1 candidate after filtering
[08:59:28.400] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '95, The (Japan) (En,Ja) (Rev 1): 1 candidate before filtering
[08:59:28.400] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '95, The (Japan) (En,Ja) (Rev 1): 1 candidate after filtering
[08:59:28.401] TRACE: CandidateFilter: SNK - Neo Geo CD: Puzzle Bobble ~ Bust-A-Move (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.401] TRACE: CandidateFilter: SNK - Neo Geo CD: Puzzle Bobble ~ Bust-A-Move (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.401] TRACE: CandidateFilter: SNK - Neo Geo CD: League Bowling (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.402] TRACE: CandidateFilter: SNK - Neo Geo CD: League Bowling (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.402] TRACE: CandidateFilter: SNK - Neo Geo CD: Ninja Master's - Haou Ninpou Chou (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.403] TRACE: CandidateFilter: SNK - Neo Geo CD: Ninja Master's - Haou Ninpou Chou (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.403] TRACE: CandidateFilter: SNK - Neo Geo CD: Far East of Eden - Tengai Makyou Shinden ~ Far East of Eden - Kabuki Klash (Japan) (En,Ja): 1 candidate before
filtering
[08:59:28.404] TRACE: CandidateFilter: SNK - Neo Geo CD: Far East of Eden - Tengai Makyou Shinden ~ Far East of Eden - Kabuki Klash (Japan) (En,Ja): 1 candidate after
filtering
[08:59:28.405] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.405] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.406] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes 2 (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.406] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes 2 (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.406] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu - Shukumei no Tatakai ~ Fatal Fury - King of Fighters (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.407] TRACE: CandidateFilter: SNK - Neo Geo CD: Garou Densetsu - Shukumei no Tatakai ~ Fatal Fury - King of Fighters (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.407] TRACE: CandidateFilter: SNK - Neo Geo CD: RB2 - The Newcomers - Real Bout Garou Densetsu 2 ~ RB2 - The Newcomers - Real Bout Fatal Fury 2 (Japan) (En,Ja): 1
candidate before filtering
[08:59:28.408] TRACE: CandidateFilter: SNK - Neo Geo CD: RB2 - The Newcomers - Real Bout Garou Densetsu 2 ~ RB2 - The Newcomers - Real Bout Fatal Fury 2 (Japan) (En,Ja): 1
candidate after filtering
[08:59:28.409] TRACE: CandidateFilter: SNK - Neo Geo CD: Flying Power Disc ~ Windjammers (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.409] TRACE: CandidateFilter: SNK - Neo Geo CD: Flying Power Disc ~ Windjammers (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.410] TRACE: CandidateFilter: SNK - Neo Geo CD: Bakumatsu Roman - Gekka no Kenshi ~ The Last Blade (Japan) (En,Ja,Es,Pt): 1 candidate before filtering
[08:59:28.410] TRACE: CandidateFilter: SNK - Neo Geo CD: Bakumatsu Roman - Gekka no Kenshi ~ The Last Blade (Japan) (En,Ja,Es,Pt): 1 candidate after filtering
[08:59:28.411] TRACE: CandidateFilter: SNK - Neo Geo CD: Bakumatsu Roman Daini Maku - Gekka no Kenshi - Tsuki ni Saku Hana, Chiri Yuku Hana ~ The Last Blade 2 (Japan)
(En,Ja,Es,Pt): 1 candidate before filtering
[08:59:28.411] TRACE: CandidateFilter: SNK - Neo Geo CD: Bakumatsu Roman Daini Maku - Gekka no Kenshi - Tsuki ni Saku Hana, Chiri Yuku Hana ~ The Last Blade 2 (Japan)
(En,Ja,Es,Pt): 1 candidate after filtering
[08:59:28.412] TRACE: CandidateFilter: SNK - Neo Geo CD: Football Frenzy (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.412] TRACE: CandidateFilter: SNK - Neo Geo CD: Football Frenzy (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.413] TRACE: CandidateFilter: SNK - Neo Geo CD: Tokuten-ou 2 ~ Super Sidekicks 2 - The World Championship (Japan) (En,Ja,Es): 1 candidate before filtering
[08:59:28.413] TRACE: CandidateFilter: SNK - Neo Geo CD: Tokuten-ou 2 ~ Super Sidekicks 2 - The World Championship (Japan) (En,Ja,Es): 1 candidate after filtering
[08:59:28.413] TRACE: CandidateFilter: SNK - Neo Geo CD: Sonic Wings 3 ~ Aero Fighters 3 (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.414] TRACE: CandidateFilter: SNK - Neo Geo CD: Sonic Wings 3 ~ Aero Fighters 3 (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.414] TRACE: CandidateFilter: SNK - Neo Geo CD: Idol Mahjong - Final Romance 2 (Japan): 1 candidate before filtering
[08:59:28.415] TRACE: CandidateFilter: SNK - Neo Geo CD: Idol Mahjong - Final Romance 2 (Japan): 1 candidate after filtering
[08:59:28.415] TRACE: CandidateFilter: SNK - Neo Geo CD: Fuuun Mokushiroku - Kakutou Sousei ~ Savage Reign (World) (En,Ja,Es,Pt): 1 candidate before filtering
[08:59:28.416] TRACE: CandidateFilter: SNK - Neo Geo CD: Fuuun Mokushiroku - Kakutou Sousei ~ Savage Reign (World) (En,Ja,Es,Pt): 1 candidate after filtering
[08:59:28.416] TRACE: CandidateFilter: SNK - Neo Geo CD: Stakes Winner - GI Kanzen Seiha e no Michi (Japan): 1 candidate before filtering
[08:59:28.416] TRACE: CandidateFilter: SNK - Neo Geo CD: Stakes Winner - GI Kanzen Seiha e no Michi (Japan): 1 candidate after filtering
[08:59:28.417] TRACE: CandidateFilter: SNK - Neo Geo CD: Pulstar (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.417] TRACE: CandidateFilter: SNK - Neo Geo CD: Pulstar (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.418] TRACE: CandidateFilter: SNK - Neo Geo CD: Magical Drop 2 (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.418] TRACE: CandidateFilter: SNK - Neo Geo CD: Magical Drop 2 (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.418] TRACE: CandidateFilter: SNK - Neo Geo CD: ADK World (Japan): 1 candidate before filtering
[08:59:28.419] TRACE: CandidateFilter: SNK - Neo Geo CD: ADK World (Japan): 1 candidate after filtering
[08:59:28.419] TRACE: CandidateFilter: SNK - Neo Geo CD: Burning Fight (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.419] TRACE: CandidateFilter: SNK - Neo Geo CD: Burning Fight (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.420] TRACE: CandidateFilter: SNK - Neo Geo CD: Joy Joy Kid ~ Puzzled (World) (En,Ja): 1 candidate before filtering
[08:59:28.420] TRACE: CandidateFilter: SNK - Neo Geo CD: Joy Joy Kid ~ Puzzled (World) (En,Ja): 1 candidate after filtering
[08:59:28.421] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '96 NeoGeo Collection, The (Japan): 1 candidate before filtering
[08:59:28.421] TRACE: CandidateFilter: SNK - Neo Geo CD: King of Fighters '96 NeoGeo Collection, The (Japan): 1 candidate after filtering
[08:59:28.421] TRACE: CandidateFilter: SNK - Neo Geo CD: Janshin Densetsu - Quest of Jongmaster (Japan): 1 candidate before filtering
[08:59:28.422] TRACE: CandidateFilter: SNK - Neo Geo CD: Janshin Densetsu - Quest of Jongmaster (Japan): 1 candidate after filtering
[08:59:28.422] TRACE: CandidateFilter: SNK - Neo Geo CD: Mahjong-kyou Retsuden - Nishi Nihon-hen (Japan): 1 candidate before filtering
[08:59:28.423] TRACE: CandidateFilter: SNK - Neo Geo CD: Mahjong-kyou Retsuden - Nishi Nihon-hen (Japan): 1 candidate after filtering
[08:59:28.423] TRACE: CandidateFilter: SNK - Neo Geo CD: Nam-1975 (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.423] TRACE: CandidateFilter: SNK - Neo Geo CD: Nam-1975 (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.424] TRACE: CandidateFilter: SNK - Neo Geo CD: Ninja Combat (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.424] TRACE: CandidateFilter: SNK - Neo Geo CD: Ninja Combat (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.424] TRACE: CandidateFilter: SNK - Neo Geo CD: Riding Hero (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.425] TRACE: CandidateFilter: SNK - Neo Geo CD: Riding Hero (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.428] TRACE: CandidateFilter: SNK - Neo Geo CD: Robo Army (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.428] TRACE: CandidateFilter: SNK - Neo Geo CD: Robo Army (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.429] TRACE: CandidateFilter: SNK - Neo Geo CD: Baseball Stars 2 (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.429] TRACE: CandidateFilter: SNK - Neo Geo CD: Baseball Stars 2 (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.429] TRACE: CandidateFilter: SNK - Neo Geo CD: Fuuun Mokushiroku - Kakutou Sousei ~ Savage Reign (Export) (En,Ja,Es,Pt) (Rev 1): 1 candidate before filtering
[08:59:28.430] TRACE: CandidateFilter: SNK - Neo Geo CD: Fuuun Mokushiroku - Kakutou Sousei ~ Savage Reign (Export) (En,Ja,Es,Pt) (Rev 1): 1 candidate after filtering
[08:59:28.430] TRACE: CandidateFilter: SNK - Neo Geo CD: Crossed Swords II (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.431] TRACE: CandidateFilter: SNK - Neo Geo CD: Crossed Swords II (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.431] TRACE: CandidateFilter: SNK - Neo Geo CD: Treasure of the Caribbean (France) (En,Ja) (Unl): 0 candidates before filtering
[08:59:28.431] TRACE: CandidateFilter: SNK - Neo Geo CD: Treasure of the Caribbean (France) (En,Ja) (Unl): 0 candidates after filtering
[08:59:28.432] TRACE: CandidateFilter: SNK - Neo Geo CD: Baseball Stars Professional (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.432] TRACE: CandidateFilter: SNK - Neo Geo CD: Baseball Stars Professional (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.432] TRACE: CandidateFilter: SNK - Neo Geo CD: Breakers (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.432] TRACE: CandidateFilter: SNK - Neo Geo CD: Breakers (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.433] TRACE: CandidateFilter: SNK - Neo Geo CD: Big Tournament Golf ~ Neo Turf Masters (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.433] TRACE: CandidateFilter: SNK - Neo Geo CD: Big Tournament Golf ~ Neo Turf Masters (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.434] TRACE: CandidateFilter: SNK - Neo Geo CD: Cyber-Lip (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.434] TRACE: CandidateFilter: SNK - Neo Geo CD: Cyber-Lip (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.434] TRACE: CandidateFilter: SNK - Neo Geo CD: Futsal - 5 on 5 Mini Soccer ~ PleasureGoal - 5 on 5 Mini Soccer (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.435] TRACE: CandidateFilter: SNK - Neo Geo CD: Futsal - 5 on 5 Mini Soccer ~ PleasureGoal - 5 on 5 Mini Soccer (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.436] TRACE: CandidateFilter: SNK - Neo Geo CD: Shinouken ~ Ragnagard (Japan) (En,Ja,Es): 1 candidate before filtering
[08:59:28.436] TRACE: CandidateFilter: SNK - Neo Geo CD: Shinouken ~ Ragnagard (Japan) (En,Ja,Es): 1 candidate after filtering
[08:59:28.436] TRACE: CandidateFilter: SNK - Neo Geo CD: Super Sidekicks - Tokuten-ou (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.437] TRACE: CandidateFilter: SNK - Neo Geo CD: Super Sidekicks - Tokuten-ou (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.437] TRACE: CandidateFilter: SNK - Neo Geo CD: Super Spy, The (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.437] TRACE: CandidateFilter: SNK - Neo Geo CD: Super Spy, The (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.438] TRACE: CandidateFilter: SNK - Neo Geo CD: Andro Dunos (France) (Unl): 1 candidate before filtering
[08:59:28.438] TRACE: CandidateFilter: SNK - Neo Geo CD: Andro Dunos (France) (Unl): 1 candidate after filtering
[08:59:28.438] TRACE: CandidateFilter: SNK - Neo Geo CD: Sengoku Denshou 2 ~ Sengoku 2 (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.438] TRACE: CandidateFilter: SNK - Neo Geo CD: Sengoku Denshou 2 ~ Sengoku 2 (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.439] TRACE: CandidateFilter: SNK - Neo Geo CD: Neo Drift Out - New Technology (Japan): 1 candidate before filtering
[08:59:28.439] TRACE: CandidateFilter: SNK - Neo Geo CD: Neo Drift Out - New Technology (Japan): 1 candidate after filtering
[08:59:28.439] TRACE: CandidateFilter: SNK - Neo Geo CD: OverTop (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.440] TRACE: CandidateFilter: SNK - Neo Geo CD: OverTop (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.440] TRACE: CandidateFilter: SNK - Neo Geo CD: Choutetsu Brikin'ger ~ Ironclad - Tesshou Rusha (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.441] TRACE: CandidateFilter: SNK - Neo Geo CD: Choutetsu Brikin'ger ~ Ironclad - Tesshou Rusha (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.441] TRACE: CandidateFilter: SNK - Neo Geo CD: Sengoku Denshou ~ Sengoku (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.441] TRACE: CandidateFilter: SNK - Neo Geo CD: Sengoku Denshou ~ Sengoku (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.441] TRACE: CandidateFilter: SNK - Neo Geo CD: Oshidashi Zintrick ~ ZinTricK (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.442] TRACE: CandidateFilter: SNK - Neo Geo CD: Oshidashi Zintrick ~ ZinTricK (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.442] TRACE: CandidateFilter: SNK - Neo Geo CD: Twinkle Star Sprites (Japan) (En,Ja): 1 candidate before filtering
[08:59:28.442] TRACE: CandidateFilter: SNK - Neo Geo CD: Twinkle Star Sprites (Japan) (En,Ja): 1 candidate after filtering
[08:59:28.442] TRACE: CandidateFilter: SNK - Neo Geo CD: Bang^2 Busters (France) (En,Ja) (Unl): 1 candidate before filtering
[08:59:28.443] TRACE: CandidateFilter: SNK - Neo Geo CD: Bang^2 Busters (France) (En,Ja) (Unl): 1 candidate after filtering
[08:59:28.443] TRACE: CandidateFilter: SNK - Neo Geo CD: Last Hope (Germany) (Unl): 1 candidate before filtering
[08:59:28.443] TRACE: CandidateFilter: SNK - Neo Geo CD: Last Hope (Germany) (Unl): 1 candidate after filtering
[08:59:28.443] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes Perfect (Export) (En,Ja) (Rev 1): 1 candidate before filtering
[08:59:28.444] TRACE: CandidateFilter: SNK - Neo Geo CD: World Heroes Perfect (Export) (En,Ja) (Rev 1): 1 candidate after filtering
[08:59:28.444] TRACE: CandidateFilter: SNK - Neo Geo CD: Xeno Crisis (World) (Unl): 1 candidate before filtering
[08:59:28.444] TRACE: CandidateFilter: SNK - Neo Geo CD: Xeno Crisis (World) (Unl): 1 candidate after filtering
[08:59:28.446] DEBUG: CandidateFilter: SNK - Neo Geo CD: filtered to 57.3GiB of 107 candidates for 111 parents
[08:59:28.446] INFO:  CandidateFilter: SNK - Neo Geo CD: done filtering candidates
[08:59:28.448] INFO:  FixdatCreator: SNK - Neo Geo CD: generating a fixdat
[08:59:28.476] INFO:  FixdatCreator: SNK - Neo Geo CD: done generating a fixdat
[08:59:28.476] ERROR: /var/folders/3s/1_v_qynj73sg7jfymxd9dny00000gn/T/igir/eJJ0Ow/SNK - Neo Geo CD fixdat (20230507-085928).dat: fixdat path
[08:59:28.476] INFO:  StatusGenerator: SNK - Neo Geo CD: generating ROM statuses
[08:59:28.494] INFO:  StatusGenerator: SNK - Neo Geo CD: done generating ROM statuses
โœ“ SNK - Neo Geo CD ยทยทยทยทยทยทยทยทยทยทยทยทยท | 107/111 games, 107/111 retail releases found
[08:59:28.495] INFO:  done processing 1 DAT
[08:59:28.498] INFO:  ReportGenerator: generating report
[08:59:28.562] DEBUG: ReportGenerator: /Users/jeff/Documents/repositories/igir/igir_2023-05-07T08;59;28.csv: wrote 1 CSV row
[08:59:28.564] INFO:  ReportGenerator: done generating report
โœ“ Generating report ยทยทยทยทยทยทยทยทยทยทยทยท | /Users/jeff/Documents/repositories/igir/igir_2023-05-07T08;59;28.csv

[08:59:28.567] INFO:  done

igir version

1.6.2

Node.js version

18.12.0 / 19.6.0

Operating system

Linux / MacOS

Additional context

No response

Create --only-* options for every --no-* option

Ah and also one thing will be neat!

You made this options: --no-demo, --no-beta, --no-sample, etc.

Can you thinking adding: --demo, --beta, --prototype, --aftermarket and --homebrew?
If we make a script we can do what we have in mind. But this kind of options are more quickly to organise some stuff how we want. For exemple, I like to have a folder named aftermarket and put all those games inside.

(maybe automatic create folders and put ROMs into it when you write aftermarket, for exemple - it's can be a copy if it's more simple, I mean you can found this game in a folder b - still an exemple - and into aftermarket also)

Thank you :)

Originally posted by @21millStreets in #484 (comment)

Infer parent/child relationships between games

Is your feature request related to a problem?

No response

Describe the solution you'd like

For:

  • DAT groups such as Redump
  • DATs in the CMPro format
  • And even some No-Intro DATs

parent/clone information is missing for a significant number of games.

Develop a parent/clone inference module that runs before the candidate generator & filter.

Additional context

Converted from #423.

--prefer-revision-newer argument don't seems to work

Paste the command

npx igir@latest move zip test clean report \ --dat "./No-Intro*.zip" \ --input "./No-Intro/" \ --output "./No-Intro/" \ --no-bios \ --no-bad \ --single \ --no-beta \ --no-demo \ --no-prototype \ --no-test-roms \ --prefer-language FR \ --prefer-region USA,WORLD,EUR,JPN \ --prefer-revision-newer \ --prefer-retail \ --language-filter FR,EN \ --filter-regex-exclude "/(InfoGenius)/i" \ --dir-dat-name

Describe the bug

The script moved all the versions of the rom

Warp Coin Catastrophe, The (World) (v1.0) (Aftermarket) (Unl).zip
Warp Coin Catastrophe, The (World) (v1.1) (Aftermarket) (Unl).zip
Warp Coin Catastrophe, The (World) (v1.1.2) (Aftermarket) (Unl).zip

Expected behavior

With --prefer-revision-newer argument I expected that the script will keep only the last revision of the file, i-e:

Warp Coin Catastrophe, The (World) (v1.1.2) (Aftermarket) (Unl).zip

Debug logs

N/A

igir version

@latest

Node.js version

v20.1.0

Operating system

Apple M1 - 13.4

Additional context

No response

Include core-specific output option for Onion/GarlicOS

Is your feature request related to a problem?

Popular SBC devices like Miyoo Mini and Anbernic RG35XX often run the CFW Onion/GarlicOS, which has it's own expected directory structure. It would be great to have the ability to output following this convention, similar to the Analogue Pocket and MiSTer FPGA options.

Describe the solution you'd like

{onion} option that behaves identically to {pocket} and {mister}, but uses the directory names Onion expects.

Additional context

image

See each emulator's magically named folder documented here:
https://github.com/OnionUI/Onion/wiki/Emulators

https://www.patreon.com/posts/garlicos-for-76561333

Don't immediately delete input files that are used in multiple candidates

Paste the command

sudo ./igir move zip report --input ./RomsUnsorted/Atari800 --output ./TOSEC --dat ./TOSEC.zip --dir-dat-name --dat-threads 4 --dir-dat-name

Describe the bug

I get an error with .zip archives containing the same title in two versions of the emulator file, e.g.
Bruce_Lee.zip

  • Bruce Lee.atx
  • Bruce Lee.cas

Expected behavior

Sometime archive is parsed only with Error and continues processing:

INFO:  PatchCandidateGenerator: Atari 8bit - Sources - [CAS]: Generating patched candidates
DEBUG: PatchCandidateGenerator: Atari 8bit - Sources - [CAS]: 0 unique patches found
INFO:  PatchCandidateGenerator: Atari 8bit - Sources - [CAS]: Done generating patched candidates
INFO:  CandidateFilter: Atari 8bit - Sources - [CAS]: Filtering candidates
DEBUG: CandidateFilter: Atari 8bit - Sources - [CAS]: No parent has candidates
INFO:  StatusGenerator: Atari 8bit - Sources - [CAS]: Generating ROM statuses
INFO:  StatusGenerator: Atari 8bit - Sources - [CAS]: Done generating ROM statuses
INFO:  ROMWriter: Atari 8bit - - [ATX]: Done writing candidates
INFO:  StatusGenerator: Atari 8bit - - [ATX]: Generating ROM statuses
INFO:  StatusGenerator: Atari 8bit - - [ATX]: Done generating ROM statuses
โœ“ Atari 8bit - - [ATX] ยทยทยทยทยทยทยทยทยท | 1/98 games, 1/98 retail releases written
ERROR: ROMWriter: Atari 8bit - - [XEX]: RomsUnsorted/Atari800-2/Bang!_Bank!.zip: failed to delete
INFO:  ROMWriter: Atari 8bit - - [XEX]: Done writing candidates372/372
INFO:  StatusGenerator: Atari 8bit - - [XEX]: Generating ROM statuses3,007
INFO:  StatusGenerator: Atari 8bit - - [XEX]: Done generating ROM statuses
โœ“ Atari 8bit - - [XEX] ยทยทยทยทยทยทยทยทยท | 1/3,007 games, 0/2,829 retail releases written
ERROR: ROMWriter: Atari 8bit - - [CAS]: RomsUnsorted/Atari800-2/Bruce_Lee.zip: failed to delete
INFO:  ROMWriter: Atari 8bit - - [CAS]: Done writing candidates372/372
INFO:  StatusGenerator: Atari 8bit - - [CAS]: Generating ROM statuses
INFO:  StatusGenerator: Atari 8bit - - [CAS]: Done generating ROM statuses
โœ“ Atari 8bit - - [CAS] ยทยทยทยทยทยทยทยทยท | 1/372 games, 1/362 retail releases written
INFO:  Done processing 42 DATs
INFO:  ReportGenerator: Generating report
DEBUG: ReportGenerator: TOSEC-Atari/igir_2023-03-21T12;37;47+01;00.csv: wrote 42 statuses
INFO:  ReportGenerator: Done generating report
โœ“ Generating report ยทยทยทยทยทยทยทยทยทยทยทยท | TOSEC-Atari/igir_2023-03-21T12;37;47+01;00.csv

Debug logs

tomek@Legion:/mnt/u/Retro$ sudo ./igir move zip report --input ./RomsUnsorted/Atari800-2 --output ./TOSEC-Atari --dat ./TOSEC-Atari.ZIP --dir-dat-name --dat-threads 4  --dir-dat-name -vv
 ______   ______   ______  _______
|      \ /      \ |      \|       \
 \$$$$$$|  $$$$$$\ \$$$$$$| $$$$$$$\
  | $$  | $$ __\$$  | $$  | $$__| $$
  | $$  | $$|    \  | $$  | $$    $$   ROM collection manager
  | $$  | $$ \$$$$  | $$  | $$$$$$$\
 _| $$_ | $$__| $$ _| $$_ | $$  | $$   v1.4.0
|   $$ \ \$$    $$|   $$ \| $$  | $$
 \$$$$$$  \$$$$$$  \$$$$$$ \$$   \$$


INFO:  DATScanner: Scanning DAT files
DEBUG: DATScanner: Found 1 DAT file
DEBUG: DATScanner: Enumerating DAT archives
DEBUG: DATScanner: Deserializing DAT XML to objects
DEBUG: DATScanner: Parsing DAT files
INFO:  DATScanner: Done scanning DAT files
โœ“ Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 42 unique DATs found
INFO:  ROMScanner: Scanning ROM files
DEBUG: ROMScanner: Found 5,494 ROM files
INFO:  ROMScanner: Done scanning ROM files
โœ“ Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 6,028 unique ROMs found
INFO:  HeaderProcessor: Processing file headers
INFO:  HeaderProcessor: Done processing file headers
โœ“ Detecting ROM headers ยทยทยทยทยทยทยทยท | 6,028 ROMs processed
INFO:  Processing 42 DATs
INFO:  CandidateFilter: Atari 8bit - - [ATX]: Generating candidates
INFO:  CandidateFilter: Atari 8bit - - [BAS]: Generating candidates744
INFO:  CandidateFilter: Atari 8bit - - [BIN]: Generating candidates
INFO:  CandidateFilter: Atari 8bit - - [ATR]: Generating candidates8
DEBUG: CandidateFilter: Atari 8bit - - [BAS]: 6,028 unique ROMs found
DEBUG: CandidateFilter: Atari 8bit - - [BIN]: 6,028 unique ROMs found8
DEBUG: CandidateFilter: Atari 8bit - - [ATR]: 6,028 unique ROMs found8
DEBUG: CandidateFilter: Atari 8bit - - [ATX]: 6,028 unique ROMs found8
DEBUG: CandidateFilter: Atari 8bit - - [ATX]: generated 756.6KiB of 8 candidates for 98 parents
INFO:  CandidateFilter: Atari 8bit - - [ATX]: Done generating candidates
INFO:  PatchCandidateGenerator: Atari 8bit - - [ATX]: Generating patched candidates
DEBUG: PatchCandidateGenerator: Atari 8bit - - [ATX]: 0 unique patches found
INFO:  PatchCandidateGenerator: Atari 8bit - - [ATX]: Done generating patched candidates
INFO:  CandidateFilter: Atari 8bit - - [ATX]: Filtering candidates8
DEBUG: CandidateFilter: Atari 8bit - - [ATX]: filtered to 756.6KiB of 8 candidates for 98 parents
INFO:  CandidateFilter: Atari 8bit - - [ATX]: Done filtering candidates
INFO:  ROMWriter: Atari 8bit - - [ATX]: Writing candidatesโ–‘โ–‘ | 0/98
DEBUG: ROMWriter: Atari 8bit - - [ATX]: Deleting moved files
INFO:  ROMWriter: Atari 8bit - - [ATX]: Done writing candidates36/5,744 | ETA: 41m
INFO:  StatusGenerator: Atari 8bit - - [ATX]: Generating ROM statuses
INFO:  StatusGenerator: Atari 8bit - - [ATX]: Done generating ROM statuses
โœ“ Atari 8bit - - [ATX] ยทยทยทยทยทยทยทยทยท | 8/98 games, 8/98 retail releases written
INFO:  CandidateFilter: Atari 8bit - - [CAS]: Generating candidates
DEBUG: CandidateFilter: Atari 8bit - - [CAS]: 6,028 unique ROMs found
DEBUG: CandidateFilter: Atari 8bit - - [BIN]: generated 2.7MiB of 116 candidates for 299 parents
INFO:  CandidateFilter: Atari 8bit - - [BIN]: Done generating candidates| ETA: 41m
INFO:  PatchCandidateGenerator: Atari 8bit - - [BIN]: Generating patched candidates

cut to fit 65536 characters....

โœ“ Atari 8bit - Educational - [XE | 3/25 games, 3/25 retail releases written
INFO:  ROMWriter: Atari 8bit - Magazines - [ATR]: Done writing candidates
INFO:  StatusGenerator: Atari 8bit - Magazines - [ATR]: Generating ROM statusesA: 25s
INFO:  StatusGenerator: Atari 8bit - Magazines - [ATR]: Done generating ROM statuses
โœ“ Atari 8bit - Magazines - [ATR] | 2/873 games, 2/854 retail releases written
DEBUG: CandidateFilter: Atari 8bit - - [ATR]: generated 157.2MiB of 2,604 candidates for 5,744 parents
INFO:  CandidateFilter: Atari 8bit - - [ATR]: Done generating candidates44 | ETA: 1s
INFO:  PatchCandidateGenerator: Atari 8bit - - [ATR]: Generating patched candidates
DEBUG: PatchCandidateGenerator: Atari 8bit - - [ATR]: 0 unique patches found
INFO:  PatchCandidateGenerator: Atari 8bit - - [ATR]: Done generating patched candidates
INFO:  CandidateFilter: Atari 8bit - - [ATR]: Filtering candidates
DEBUG: CandidateFilter: Atari 8bit - - [ATR]: filtered to 157.2MiB of 2,604 candidates for 5,744 parents
INFO:  CandidateFilter: Atari 8bit - - [ATR]: Done filtering candidates744
INFO:  ROMWriter: Atari 8bit - - [ATR]: Writing candidates
โš™ Processing DATs ยทยทยทยทยทยทยทยทยทยทยทยทยทยท | โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘ | 41/42
โœŽ Atari 8bit - - [ATR] ยทยทยทยทยทยทยทยทยท | โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ | 301/5,744node:internal/process/promises:288
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[Error: ENOENT: no such file or directory, stat 'RomsUnsorted/Atari800-2/The_Arcade_Machine.zip'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'stat',
  path: 'RomsUnsorted/Atari800-2/The_Arcade_Machine.zip'
}

Node.js v18.15.0

igir version

1.4.0

Node.js version

18.15.0

Operating system

WSL Ubuntu

Additional context

No response

Create a Homebrew formula

Is your feature request related to a problem?

No

Describe the solution you'd like

Create a new Homebrew formula such that macOS users can run:

brew install igir
brew upgrade igir

This may require a personal Homebrew tap in order to automate formula updates upon GitHub releases.

Additional context

Some quick links:

Action Required: Fix Renovate Configuration

There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop PRs until it is resolved.

Location: renovate.json5
Error type: The renovate configuration file contains some invalid settings
Message: npm.packageRules[0]: Each packageRule must contain at least one match* or exclude* selector. Rule: {"groupName":"Dependencies","rangeStrategy":"bump"}

No-Intro NES Headered and Headerless DATs matching same headered ROMs

Paste the command

npx igir@latest -vv copy report \
--dat ./Nintendo\ -\ Nintendo\ Entertainment\ System\ \(Headered\)\ \(Parent-Clone\)\ \(20230202-191513\).dat \
--dat ./Nintendo\ -\ Nintendo\ Entertainment\ System\ \(Headerless\)\ \(Parent-Clone\)\ \(20230202-191513\).dat \
--input ./ROMs/nes/Nintendo\ -\ Nintendo\ Entertainment\ System\ \(20220418-114958\)\ \[headered_NES2.0\]/Contra\ \(USA\).zip* \
--output ./No-Intro/ \
--dir-dat-name

Describe the bug

Running igir on most of my headered NES ROMs seems to match the DAT files for both the NES headered and headerless versions. The various sizes, CRC, MD5, SHA1 attributes are all different in the DAT files, but yet the result of the command is as if the ROMs are identical between headerless and headered versions.

The outcome of the command results in the same ROM file being copied to No-Intro/Nintendo - Nintendo Entertainment System (Headered) as well as No-Intro/Nintendo - Nintendo Entertainment System (Headerless).

The resulting CSV report has FOUND for both DAT entries.

Expected behavior

When running igir with both headered and headerless DATs, a headered ROM would only match the headered DAT entry, and a headerless ROM would only match the headerless DAT entry.

Debug logs

INFO:  DATScanner: Scanning DAT files
DEBUG: DATScanner: Found 2 DAT files
DEBUG: DATScanner: Enumerating DAT archives
DEBUG: DATScanner: Deserializing DAT XML to objects
DEBUG: DATScanner: Parsing DAT files
INFO:  DATScanner: Done scanning DAT files
โœ“ Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 2 unique DATs found
INFO:  ROMScanner: Scanning ROM files
DEBUG: ROMScanner: Found 1 ROM file
INFO:  ROMScanner: Done scanning ROM files
โœ“ Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 1 unique ROM found
INFO:  HeaderProcessor: Processing file headers
INFO:  HeaderProcessor: Done processing file headers
โœ“ Detecting ROM headers ยทยทยทยทยทยทยทยท | 1 ROM processed
INFO:  Processing 2 DATs
INFO:  CandidateFilter: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): Generating candidates
INFO:  CandidateFilter: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): Generating candidates
DEBUG: CandidateFilter: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): 2 unique ROMs found
DEBUG: CandidateFilter: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): 2 unique ROMs found
DEBUG: CandidateFilter: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): generated 128KiB of 1 candidate for 2,501 parents
INFO:  CandidateFilter: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): Done generating candidates
INFO:  PatchCandidateGenerator: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): Generating patched candidates
DEBUG: PatchCandidateGenerator: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): 0 unique patches found
INFO:  PatchCandidateGenerator: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): Done generating patched candidates
INFO:  CandidateFilter: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): Filtering candidates
DEBUG: CandidateFilter: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): filtered to 128KiB of 1 candidate for 2,501 parents
INFO:  CandidateFilter: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): Done filtering candidates
INFO:  ROMWriter: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): Writing candidates
DEBUG: CandidateFilter: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): generated 128KiB of 1 candidate for 2,501 parents
INFO:  CandidateFilter: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): Done generating candidates
INFO:  PatchCandidateGenerator: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): Generating patched candidates
DEBUG: PatchCandidateGenerator: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): 0 unique patches found
INFO:  PatchCandidateGenerator: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): Done generating patched candidates
INFO:  CandidateFilter: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): Filtering candidates
DEBUG: CandidateFilter: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): filtered to 128KiB of 1 candidate for 2,501 parents
INFO:  CandidateFilter: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): Done filtering candidates
INFO:  ROMWriter: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): Writing candidates
INFO:  ROMWriter: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): Done writing candidates
INFO:  StatusGenerator: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): Generating ROM statuses
INFO:  StatusGenerator: Nintendo - Nintendo Entertainment System (Headered) (Parent-Clone): Done generating ROM statuses
โœ“ Nintendo - Nintendo Entertainm | 1/4,602 games, 0/5 BIOSes, 1/2,905 retail releases written
INFO:  ROMWriter: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): Done writing candidates
INFO:  StatusGenerator: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): Generating ROM statuses
INFO:  StatusGenerator: Nintendo - Nintendo Entertainment System (Headerless) (Parent-Clone): Done generating ROM statuses
โœ“ Nintendo - Nintendo Entertainm | 1/4,602 games, 0/5 BIOSes, 1/2,905 retail releases written
INFO:  Done processing 2 DATs
INFO:  ReportGenerator: Generating report
DEBUG: ReportGenerator: No-Intro/igir_2023-02-07T23;46;48-05;00.csv: wrote 2 statuses
INFO:  ReportGenerator: Done generating report
โœ“ Generating report ยทยทยทยทยทยทยทยทยทยทยทยท | No-Intro/igir_2023-02-07T23;46;48-05;00.csv

igir version

1.2.0

Node.js version

12.22.12

Operating system

Linux

Additional context

No response

Add --dir-letter-limit option

Hi,

I just try this command:

npx igir copy extract test --dat DAT/Nintendo/Super\ Nintendo\ Entertainment\ System --input ROM --output Assets/{pocket}/common/ --dir-letter

It's work perfectly fine, but I have one issue.

The S folder have 923 files. Pocket works with 500 files into the folders (according the JB, it's between 300 and 500).

I would like to know if we can add an option to limit the number of files for each folder and in this case get a S1 folder, S2 folder, etc.

Thanks :)

Originally posted by @21millStreets in #484

Specify recursion depth

Is your feature request related to a problem?

No response

Describe the solution you'd like

I have a folder like ROMS\ARCADE\Imgs, ROMS\ATARI\Imgs I want to include ARCADE and ATARI (first level) but nothing below that. I can specify all possible ROM extensions (zip, 7z, etc. ) with multiple --input but that's a bit awkward

Additional context

No response

Don't delete moved archives unless every entry was matched

Paste the command

igir move zip test report --input atari-test --output No-Intro-Atari --overwrite --dir-dat-name --single --dat Atari.zip

Describe the bug

I don't know if it's a bug or how it's supposed to work, but to clear the source directory of files, I have to repeat the igir move command three times (in this case, on this set of files).

For example:

Test conditions:
	Input directory files: 602
	Output directory files: 0
	No txt, images, etc

First run:
	โˆš Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 3 unique DATs found
	โˆš Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 506 unique ROMs found
	โˆš Detecting ROM headers ยทยทยทยทยทยทยทยท | 506 ROMs processed
	โˆš Atari - 7800 ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท | 0/2 BIOSes, 58/112 retail releases written
	โˆš Atari - ST ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท | 314/314 retail releases written
	โˆš Deleting moved files ยทยทยทยทยทยทยทยทยท | 485 moved files deleted
	โˆš Generating report ยทยทยทยทยทยทยทยทยทยทยทยท | .\igir_2023-04-15T12;21;55.csv
	Input directory files: 117 - OK
	Output directory files: 379
	
	
Second run:
	โˆš Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 3 unique DATs found
	โˆš Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 60 unique ROMs found
	โˆš Detecting ROM headers ยทยทยทยทยทยทยทยท | 60 ROMs processed
	โˆš Atari - 7800 ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท | 0/2 BIOSes, 58/112 retail releases written
	โˆš Deleting moved files ยทยทยทยทยทยทยทยทยท | 60 moved files deleted
	โˆš Generating report ยทยทยทยทยทยทยทยทยทยทยทยท | .\igir_2023-04-15T12;30;11.csv
	Input directory files: 57 - OK
	Output directory files: 381
	
Third run:
	โˆš Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 3 unique DATs found
	โˆš Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 57 unique ROMs found
	โˆš Detecting ROM headers ยทยทยทยทยทยทยทยท | 57 ROMs processed
	โˆš Atari - 7800 ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท | 0/2 BIOSes, 57/112 retail releases written
	โˆš Deleting moved files ยทยทยทยทยทยทยทยทยท | 57 moved files deleted
	โˆš Generating report ยทยทยทยทยทยทยทยทยทยทยทยท | .\igir_2023-04-15T12;41;16.csv
	Input directory files: 0 - OK
	Output directory files: 381

Expected behavior

Why files aren't processed in one run?

Debug logs

Trace.zip

igir version

1.6.0

Node.js version

igir.exe

Operating system

Windows 10

Additional context

No response

Failed to parse file : TypeError [ERR_INVALID_ARG_TYPE]

Paste the command

igir copy --dat "E:\ROMVault_V3.4.5\DatRoot\7 Retool 1G1R [Redump Console]\Sega - Saturn [EN] (2023-01-27 03-45-33) (Retool 2023-01-30 10-07-00) (324) (-bBdPrv).dat" --input "Z:\3 Redump [Console]\Sega - Saturn" --output "Z:\7 Retool 1G1R [Redump Console]\Sega - Saturn [EN] (Retool)"

Describe the bug

Attempting to process a 1G1R dat for Sega Saturn and I receive the attached error. This particular game isn't in the DAT file, just the directory.

IGIR error

Expected behavior

No error based on file name.

Debug logs

IGIR error 2

igir version

1.0.2

Node.js version

18.13.0

Operating system

Windows 10

Additional context

No response

Manual GitHub Action for version bumping

Is your feature request related to a problem?

No

Describe the solution you'd like

Rather than:

  • Creating a new branch
  • Running npm run bump:*
  • Pushing
  • Creating a PR
  • Auto-enabling merge
  • Pulling trunk locally
  • Running npm run release

it would be great to have a GitHub Action that would do all the above, and then create a draft release to be filled out by hand after.

Additional context

Links:

Error: ENOENT: no such file or directory

Paste the command

igir move zip test --input atari-test --output No-Intro --overwrite --dir-dat-name --single --dat "No-Intro Love Pack (PC XML) (2023-03-19).zip" -vv

Describe the bug

Interesting error only when processing dozens of files and a complete No-Intro file. When I put about 700+ files in the atari7800 and atarist directories I get the following error, but when using the same files and --dat contains only atari files then everything finishes without errors

igir move zip test --input atari-test --output No-Intro --overwrite --dir-dat-name --single --dat AtariDAT.zip
 ______   ______   ______  _______
|      \ /      \ |      \|       \
 \$$$$$$|  $$$$$$\ \$$$$$$| $$$$$$$\
  | $$  | $$ __\$$  | $$  | $$__| $$
  | $$  | $$|    \  | $$  | $$    $$   ROM collection manager
  | $$  | $$ \$$$$  | $$  | $$$$$$$\
 _| $$_ | $$__| $$ _| $$_ | $$  | $$   v1.5.0
|   $$ \ \$$    $$|   $$ \| $$  | $$
 \$$$$$$  \$$$$$$  \$$$$$$ \$$   \$$


โˆš Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 13 unique DATs found
โˆš Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 696 unique ROMs found
โˆš Detecting ROM headers ยทยทยทยทยทยทยทยท | 696 ROMs processed
ERROR: Atari - 7800: No-Intro\Atari - 7800\Asteroids (USA).zip: written zip has the file Asteroids (USA).a78 with the CRC dfb93f40, expected eac69cf0
ERROR: Atari - 7800: No-Intro\Atari - 7800\Choplifter! (USA).zip: written zip has the file Choplifter! (USA).a78 with the CRC 419bff61, expected d3ba607f
ERROR: Atari - 7800: No-Intro\Atari - 7800\Ballblazer (USA).zip: written zip has the file Ballblazer (USA).a78 with the CRC a4c4808b, expected 44615260
ERROR: Atari - 7800: No-Intro\Atari - 7800\Donkey Kong (USA).zip: written zip has the file Donkey Kong (USA).a78 with the CRC 065e063f, expected d7a55f95
ERROR: Atari - 7800: No-Intro\Atari - 7800\Donkey Kong Junior (USA).zip: written zip has the file Donkey Kong Junior (USA).a78 with the CRC 1c5a1082, expected 6e989686
ERROR: Atari - 7800: No-Intro\Atari - 7800\Centipede (USA).zip: written zip has the file Centipede (USA).a78 with the CRC 020efe25, expected 5f94939e
ERROR: Atari - 7800: No-Intro\Atari - 7800\Baseball (Europe).zip: written zip has the file Baseball (Europe).a78 with the CRC 68d48fdc, expected a8189e81
ERROR: Atari - 7800: No-Intro\Atari - 7800\Dig Dug (USA).zip: written zip has the file Dig Dug (USA).a78 with the CRC 50cb13f3, expected 8ead573d
ERROR: Atari - 7800: No-Intro\Atari - 7800\F-18 Hornet (USA).zip: written zip has the file F-18 Hornet (USA).a78 with the CRC 63d1c7c1, expected fa3e8cbb
ERROR: Atari - 7800: No-Intro\Atari - 7800\Desert Falcon (USA).zip: written zip has the file Desert Falcon (USA).a78 with the CRC a1dc0899, expected a6a62e78
ERROR: Atari - 7800: No-Intro\Atari - 7800\Ace of Aces (USA).zip: written zip has the file Ace of Aces (USA).a78 with the CRC 05a2b94c, expected e682c28f
ERROR: Atari - 7800: No-Intro\Atari - 7800\Crack'ed (USA).zip: written zip has the file Crack'ed (USA).a78 with the CRC e645fd1f, expected 61dcc763
ERROR: Atari - 7800: No-Intro\Atari - 7800\Barnyard Blaster (USA).zip: written zip has the file Barnyard Blaster (USA).a78 with the CRC ed0a587d, expected c086ed30
ERROR: Atari - 7800: No-Intro\Atari - 7800\Basketbrawl (USA).zip: written zip has the file Basketbrawl (USA).a78 with the CRC c8b9d7b5, expected fd3aec38
ERROR: Atari - 7800: No-Intro\Atari - 7800\Dark Chambers (USA).zip: written zip has the file Dark Chambers (USA).a78 with the CRC 366777f1, expected b5a87d19
ERROR: Atari - 7800: No-Intro\Atari - 7800\Double Dragon (USA).zip: written zip has the file Double Dragon (USA).a78 with the CRC aa265865, expected 16e2fc12
ERROR: Atari - 7800: No-Intro\Atari - 7800\Crossbow (USA).zip: written zip has the file Crossbow (USA).a78 with the CRC d2ea5686, expected a2678e2d
ERROR: Atari - 7800: No-Intro\Atari - 7800\Alien Brigade (USA).zip: written zip has the file Alien Brigade (USA).a78 with the CRC c8849d36, expected 3cef22ca
ERROR: Atari - 7800: No-Intro\Atari - 7800\Commando (USA).zip: written zip has the file Commando (USA).a78 with the CRC cd1a98c5, expected 81c6c079
ERROR: Atari - 7800: No-Intro\Atari - 7800\Fatal Run (USA).zip: written zip has the file Fatal Run (USA).a78 with the CRC a44df354, expected 718232bb
ERROR: Atari - 7800: No-Intro\Atari - 7800\Food Fight (USA).zip: written zip has the file Food Fight (USA).a78 with the CRC e64a5cde, expected 03ec1894
ERROR: Atari - 7800: No-Intro\Atari - 7800\Galaga (USA).zip: written zip has the file Galaga (USA).a78 with the CRC 1a0a3eb3, expected cffaa1b7
ERROR: Atari - 7800: No-Intro\Atari - 7800\Hat Trick (USA).zip: written zip has the file Hat Trick (USA).a78 with the CRC cf6f4a6c, expected 6247efa8
ERROR: Atari - 7800: No-Intro\Atari - 7800\Joust (USA).zip: written zip has the file Joust (USA).a78 with the CRC 2c430bce, expected fda13f77
ERROR: Atari - 7800: No-Intro\Atari - 7800\Karateka (USA).zip: written zip has the file Karateka (USA).a78 with the CRC fec21472, expected 7089a354
ERROR: Atari - 7800: No-Intro\Atari - 7800\Kung-Fu Master (USA).zip: written zip has the file Kung-Fu Master (USA).a78 with the CRC 297899bb, expected 37816887
ERROR: Atari - 7800: No-Intro\Atari - 7800\Mario Bros. (USA).zip: written zip has the file Mario Bros. (USA).a78 with the CRC 8021a13b, expected 4d072a3e
ERROR: Atari - 7800: No-Intro\Atari - 7800\Ikari Warriors (USA).zip: written zip has the file Ikari Warriors (USA).a78 with the CRC 8a6c1f15, expected aa0cfb30
ERROR: Atari - 7800: No-Intro\Atari - 7800\Klax (USA) (Proto).zip: written zip has the file Klax (USA) (Proto).a78 with the CRC f26621e3, expected 0ae5c4d3
ERROR: Atari - 7800: No-Intro\Atari - 7800\Jinks (USA).zip: written zip has the file Jinks (USA).a78 with the CRC 0818d8cd, expected 9571c998
ERROR: Atari - 7800: No-Intro\Atari - 7800\Impossible Mission (USA).zip: written zip has the file Impossible Mission (USA).a78 with the CRC 3b1f2f47, expected fa0a683e
ERROR: Atari - 7800: No-Intro\Atari - 7800\Ms. Pac-Man (USA).zip: written zip has the file Ms. Pac-Man (USA).a78 with the CRC e42fc700, expected 5ec9c910
ERROR: Atari - 7800: No-Intro\Atari - 7800\Fight Night (USA).zip: written zip has the file Fight Night (USA).a78 with the CRC 720ebc74, expected 28e38bd7
ERROR: Atari - 7800: No-Intro\Atari - 7800\Meltdown (USA).zip: written zip has the file Meltdown (USA).a78 with the CRC 4a8f2171, expected 14502302
ERROR: Atari - 7800: No-Intro\Atari - 7800\Missing in Action (USA) (Proto).zip: written zip has the file Missing in Action (USA) (Proto).a78 with the CRC ff7a4c60, expected c29973d4
ERROR: Atari - 7800: No-Intro\Atari - 7800\Mean 18 Ultimate Golf (USA).zip: written zip has the file Mean 18 Ultimate Golf (USA).a78 with the CRC cf21d9ac, expected d22f4b02
ERROR: Atari - 7800: No-Intro\Atari - 7800\Motor Psycho (USA).zip: written zip has the file Motor Psycho (USA).a78 with the CRC 1e219482, expected fc414689
ERROR: Atari - 7800: No-Intro\Atari - 7800\Mat Mania Challenge (USA).zip: written zip has the file Mat Mania Challenge (USA).a78 with the CRC aba91829, expected 33bb15ac
ERROR: Atari - 7800: No-Intro\Atari - 7800\Midnight Mutants (USA).zip: written zip has the file Midnight Mutants (USA).a78 with the CRC 187ec84e, expected e7157222
ERROR: Atari - 7800: No-Intro\Atari - 7800\Ninja Golf (USA).zip: written zip has the file Ninja Golf (USA).a78 with the CRC cb48e8dc, expected 9e5d3625
ERROR: Atari - 7800: No-Intro\Atari - 7800\One-on-One Basketball (USA).zip: written zip has the file One-on-One Basketball (USA).a78 with the CRC 7d9370fb, expected 34646e22
ERROR: Atari - 7800: No-Intro\Atari - 7800\Robotron - 2084 (USA).zip: written zip has the file Robotron - 2084 (USA).a78 with the CRC cb22305d, expected ab7bc9ce
ERROR: Atari - 7800: No-Intro\Atari - 7800\Pit Fighter (USA) (Proto).zip: written zip has the file Pit Fighter (USA) (Proto).a78 with the CRC a5e75537, expected f29e8142
ERROR: Atari - 7800: No-Intro\Atari - 7800\Pole Position II (USA).zip: written zip has the file Pole Position II (USA).a78 with the CRC a85fb962, expected 4bf501cb
ERROR: Atari - 7800: No-Intro\Atari - 7800\RealSports Baseball (USA).zip: written zip has the file RealSports Baseball (USA).a78 with the CRC b1508030, expected f33bd4fd
ERROR: Atari - 7800: No-Intro\Atari - 7800\Rampage (USA).zip: written zip has the file Rampage (USA).a78 with the CRC 39a316aa, expected 859d9352
ERROR: Atari - 7800: No-Intro\Atari - 7800\Plutos (USA) (Proto).zip: written zip has the file Plutos (USA) (Proto).a78 with the CRC 2f211f7f, expected 9857c02b
ERROR: Atari - 7800: No-Intro\Atari - 7800\Rampart (USA) (Proto).zip: written zip has the file Rampart (USA) (Proto).a78 with the CRC e8c2a662, expected 9113dc54
ERROR: Atari - 7800: No-Intro\Atari - 7800\Super Skateboardin' (USA).zip: written zip has the file Super Skateboardin' (USA).a78 with the CRC 13b68650, expected faa12091
ERROR: Atari - 7800: No-Intro\Atari - 7800\Planet Smashers (Europe).zip: written zip has the file Planet Smashers (Europe).a78 with the CRC 95dc7e96, expected e8929246
ERROR: Atari - 7800: No-Intro\Atari - 7800\Super Huey UH-IX (USA).zip: written zip has the file Super Huey UH-IX (USA).a78 with the CRC 71846500, expected 629d1032
ERROR: Atari - 7800: No-Intro\Atari - 7800\Sentinel (Europe).zip: written zip has the file Sentinel (Europe).a78 with the CRC 47340df9, expected ba588ff0
ERROR: Atari - 7800: No-Intro\Atari - 7800\Scrapyard Dog (USA).zip: written zip has the file Scrapyard Dog (USA).a78 with the CRC 5cc8c34f, expected db61ae81
ERROR: Atari - 7800: No-Intro\Atari - 7800\Sirius (USA) (Proto).zip: written zip has the file Sirius (USA) (Proto).a78 with the CRC 65ae616e, expected 9d3cd869
ERROR: Atari - 7800: No-Intro\Atari - 7800\Tank Command (USA).zip: written zip has the file Tank Command (USA).a78 with the CRC db91b181, expected 9ffc9515
ERROR: Atari - 7800: No-Intro\Atari - 7800\Title Match Pro Wrestling (USA).zip: written zip has the file Title Match Pro Wrestling (USA).a78 with the CRC bc23c57b, expected a5742a96
ERROR: Atari - 7800: No-Intro\Atari - 7800\Summer Games (USA).zip: written zip has the file Summer Games (USA).a78 with the CRC 65c6df3f, expected 8e4cf69c
ERROR: Atari - 7800: No-Intro\Atari - 7800\Tomcat - The F-14 Fighter Simulator (USA).zip: written zip has the file Tomcat - The F-14 Fighter Simulator (USA).a78 with the CRC 513cb9ee, expected ab48f361
ERROR: Atari - 7800: No-Intro\Atari - 7800\Tower Toppler (USA).zip: written zip has the file Tower Toppler (USA).a78 with the CRC 4407ba04, expected f701bd43
ERROR: Atari - 7800: No-Intro\Atari - 7800\Water Ski (USA).zip: written zip has the file Water Ski (USA).a78 with the CRC 930b30df, expected 09a27634
ERROR: Atari - 7800: No-Intro\Atari - 7800\Xevious (USA).zip: written zip has the file Xevious (USA).a78 with the CRC 75fc124f, expected 44584fa2
ERROR: Atari - 7800: No-Intro\Atari - 7800\Touchdown Football (USA).zip: written zip has the file Touchdown Football (USA).a78 with the CRC aae12695, expected 4162e98f
ERROR: Atari - 7800: No-Intro\Atari - 7800\Xenophobe (USA).zip: written zip has the file Xenophobe (USA).a78 with the CRC 5fd9a141, expected 96ee8584
ERROR: Atari - 7800: No-Intro\Atari - 7800\Winter Games (USA).zip: written zip has the file Winter Games (USA).a78 with the CRC 8981b531, expected 12454060
โˆš Atari - 7800 ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท | 0/2 BIOSes, 58/112 retail releases written
โˆš Atari - ST ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท | 314/314 retail releases written
โˆš Processing DATs ยทยทยทยทยทยทยทยทยทยทยทยทยทยท | 13 DATs processed

and vice versa, if I put only the files Lethal Xcess - Wings of Death II (Europe) (Amiga + ST) (Disk A).ipf and B in the atarist directory and use the full No-Intro it is also finishes without errors

Expected behavior

Pass with no errors.

Debug logs

igir move zip test --input atari-test --output No-Intro --overwrite --dir-dat-name --single --dat "No-Intro Love Pack (PC XML) (2023-03-19).zip" -vv
 ______   ______   ______  _______
|      \ /      \ |      \|       \
 \$$$$$$|  $$$$$$\ \$$$$$$| $$$$$$$\
  | $$  | $$ __\$$  | $$  | $$__| $$
  | $$  | $$|    \  | $$  | $$    $$   ROM collection manager
  | $$  | $$ \$$$$  | $$  | $$$$$$$\
 _| $$_ | $$__| $$ _| $$_ | $$  | $$   v1.5.0
|   $$ \ \$$    $$|   $$ \| $$  | $$
 \$$$$$$  \$$$$$$  \$$$$$$ \$$   \$$


INFO:  DATScanner: Scanning DAT files
DEBUG: DATScanner: Found 1 DAT file
DEBUG: DATScanner: Enumerating DAT archives
DEBUG: DATScanner: Deserializing DAT XML to objects
DEBUG: DATScanner: Parsing DAT files
DEBUG: DATScanner: No-Intro Love Pack (PC XML) (2023-03-19).zip|index.txt: failed to parse XML : Non-whitespace before first tag., Line: 0, Column: 1, Char: A
DEBUG: DATScanner: No-Intro Love Pack (PC XML) (2023-03-19).zip|index.txt: SMDB file has no rows
DEBUG: DATScanner: No-Intro Love Pack (PC XML) (2023-03-19).zip|index.txt: failed to parse DAT file
INFO:  DATScanner: Done scanning DAT files
โˆš Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 273 unique DATs found
INFO:  ROMScanner: Scanning ROM files
DEBUG: ROMScanner: Found 792 ROM files
INFO:  ROMScanner: Done scanning ROM files
โˆš Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 696 unique ROMs found
INFO:  HeaderProcessor: Processing file headers
INFO:  HeaderProcessor: Done processing file headers
โˆš Detecting ROM headers ยทยทยทยทยทยทยทยท | 696 ROMs processed
INFO:  Processing 273 DATs
...
ERROR: ROMWriter: Atari - 7800: No-Intro\Atari - 7800\Xenophobe (USA).zip: written zip has the file Xenophobe (USA).a78 with the CRC 5fd9a141, expected 96ee8584
DEBUG: ROMWriter: Atari - 7800: deleting 1 moved file
INFO:  ROMWriter: Atari - 7800: done writing 65 candidates
INFO:  StatusGenerator: Atari - 7800: Generating ROM statuses
INFO:  StatusGenerator: Atari - 7800: Done generating ROM statuses
โˆš Atari - 7800 ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท | 0/2 BIOSes, 58/112 retail releases written
DEBUG: CandidateFilter: Atari - ST: generated 252.4MiB of 314 candidates for 404 parents
INFO:  CandidateFilter: Atari - ST: Done generating candidates 231/404 | ETA: 2s
INFO:  PatchCandidateGenerator: Atari - ST: Generating patched candidates
DEBUG: PatchCandidateGenerator: Atari - ST: 0 unique patches found
INFO:  PatchCandidateGenerator: Atari - ST: Done generating patched candidates
INFO:  CandidateFilter: Atari - ST: Filtering candidates
DEBUG: CandidateFilter: Atari - ST: filtered to 252.4MiB of 314 candidates for 404 parents
INFO:  CandidateFilter: Atari - ST: Done filtering candidates| 0/404
INFO:  ROMWriter: Atari - ST: writing 314 candidates
ERROR: ROMWriter: Atari - ST: No-Intro\Atari - ST\Foundation's Waste (Europe) (Coverdisk - The One - Issue 22) (Amiga + ST).zip: failed to create zip : ENOENT: no such file or directory, open 'P:\Retro\igir-tests\atari-test\atarist\Foundation's Waste (Europe) (Coverdisk - '
ยค Processing DATs ยทยทยทยทยทยทยทยทยทยทยทยทยทยท | โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ | 272/273
ยป Atari - ST ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท | โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ | 169/404node:events:491
      throw er; // Unhandled 'error' event
      ^

Error: ENOENT: no such file or directory, open 'P:\Retro\igir-tests\atari-test\atarist\Lethal Xcess - Wings of Death II (Europe) (Amiga + ST) (Disk B).ipf'
Emitted 'error' event on ReadStream instance at:
    at emitErrorNT (node:internal/streams/destroy:151:8)
    at emitErrorCloseNT (node:internal/streams/destroy:116:3)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: 'P:\\Retro\\igir-tests\\atari-test\\atarist\\Lethal Xcess - Wings of Death II (Europe) (Amiga + ST) (Disk B).ipf'
}

igir version

1.5.0

Node.js version

18.15.0

Operating system

Windows 10

Additional context

No response

Don't calculate checksums when there are no DATs and the output isn't being tested

Is your feature request related to a problem?

No response

Describe the solution you'd like

Checksums are used for matching files to ROMs in DATs, and for testing files after they have been written. There can be substantial time savings by not calculating checksums for large files if they aren't being used.

Additional context

The GameCube script is particularly slow:

igir/docs/usage/personal.md

Lines 114 to 120 in 0f9978d

npx igir@latest copy extract test clean \
--input "${SOURCE}/Redump/Nintendo - GameCube" \
--output "./ISOs/" \
--dir-letter \
--no-bios \
--no-bad \
--filter-regex-exclude "/(Baseball|FIFA|MLB|NBA|NCAA|NFL|NHL|PGA)/i"

Add an "overwrite if invalid" CLI flag

Is your feature request related to a problem?

No response

Describe the solution you'd like

Files in the output directory that would be overwritten with --overwrite are currently tested for accuracy in order to produce a warning message if they're bad. Add a new flag such as --overwrite-invalid which will overwrite these files, but leave other good files in the output directory alone.

Additional context

No response

ERROR: TypeCannot read properties of undefined (reading 'getRomsWithFiles')

Paste the command

npx igir@latest report --dat /Users/michael/Downloads/MAME_Dats_256/DATs/MAME\ 0.256.dat --input /Users/michael/Documents/Emulator\ Data/MAME/roms

Describe the bug

I just tried to run a report for my MAME ROMs, and while it seems to scan for DATs and ROMs okay, when generating the report, I get the error in the title.

โœ“ Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 1 unique DAT found
โœ“ Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 12,032 unique ROMs found
โœ“ Detecting ROM headers ยทยทยทยทยทยทยทยท | 12,032 ROMs processed
โœ“ MAME ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท | 6,355/43,920 games, 7/75 BIOSes, 6,355/43,920 retail releases fod
โœŽ Generating report ยทยทยทยทยทยทยทยทยทยทยทยท | โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘
ERROR: TypeCannot read properties of undefined (reading 'getRomsWithFiles')

I'm pretty sure this is something I'm doing wrong, vs. an actual bug, but not sure what to do to get the report.

Expected behavior

The command executes without an error and I can access the report.

Debug logs

debug.txt

igir version

1.6.6

Node.js version

20.4.0

Operating system

macOS 13.4.1 (22F82)

Additional context

No response

ERROR: x.zip: written zip failed to get archive contents: Error: ENOENT: no such file or directory, stat 'x.zip'

Paste the command

sudo ./igir move zip test report --input "RomsTestGB" --output "./No-IntroGB" --dat ./Nintendo\ -\ Game\ Boy\ \(Parent-Clone\)\ \(20230318-005235\).zip --single --prefer-language EN --prefer-region USA,EUR,WORLD,JPN --dir-dat-name --overwrite -vv

Describe the bug

First: start with empty No-IntroGB' folder and 5 files in RomsTestGB\gb`. Result: pass, I mean 5 files transferred and renamed

INFO:  DATScanner: Scanning DAT files
DEBUG: DATScanner: Found 1 DAT file
DEBUG: DATScanner: Enumerating DAT archives
DEBUG: DATScanner: Deserializing DAT XML to objects
DEBUG: DATScanner: Parsing DAT files
INFO:  DATScanner: Done scanning DAT files
โœ“ Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 1 unique DAT found
INFO:  ROMScanner: Scanning ROM files
DEBUG: ROMScanner: Found 5 ROM files
INFO:  ROMScanner: Done scanning ROM files
โœ“ Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 5 unique ROMs found
INFO:  HeaderProcessor: Processing file headers
INFO:  HeaderProcessor: Done processing file headers
โœ“ Detecting ROM headers ยทยทยทยทยทยทยทยท | 5 ROMs processed
INFO:  Processing 1 DAT
INFO:  CandidateFilter: Nintendo - Game Boy: Generating candidates
DEBUG: CandidateFilter: Nintendo - Game Boy: 5 unique ROMs found
DEBUG: CandidateFilter: Nintendo - Game Boy: generated 1.1MiB of 9 candidates for 1,338 parents
INFO:  CandidateFilter: Nintendo - Game Boy: Done generating candidates
INFO:  PatchCandidateGenerator: Nintendo - Game Boy: Generating patched candidates
DEBUG: PatchCandidateGenerator: Nintendo - Game Boy: 0 unique patches found
INFO:  PatchCandidateGenerator: Nintendo - Game Boy: Done generating patched candidates
INFO:  CandidateFilter: Nintendo - Game Boy: Filtering candidates
DEBUG: CandidateFilter: Nintendo - Game Boy: filtered to 640KiB of 5 candidates for 1,338 parents
INFO:  CandidateFilter: Nintendo - Game Boy: Done filtering candidates
INFO:  ROMWriter: Nintendo - Game Boy: Writing candidates
DEBUG: ROMWriter: Nintendo - Game Boy: Deleting moved files
INFO:  ROMWriter: Nintendo - Game Boy: Done writing candidates 0/1,338
INFO:  StatusGenerator: Nintendo - Game Boy: Generating ROM statuses
INFO:  StatusGenerator: Nintendo - Game Boy: Done generating ROM statuses
โœ“ Nintendo - Game Boy ยทยทยทยทยทยทยทยทยทยท | 0/3 BIOSes, 5/1,672 retail releases written
INFO:  Done processing 1 DAT
INFO:  ReportGenerator: Generating report
DEBUG: ReportGenerator: No-IntroGB/igir_2023-03-22T13;26;54+01;00.csv: wrote 1 status
INFO:  ReportGenerator: Done generating report
โœ“ Generating report ยทยทยทยทยทยทยทยทยทยทยทยท | No-IntroGB/igir_2023-03-22T13;26;54+01;00.csv

Second: fill RomsTestGB\gb again with the same original files (cartridges dumps) and rerun the same command, also No-IntroGB now has Nintendo - Game Boy in it and 5 files, result: some errors:

INFO:  DATScanner: Scanning DAT files
DEBUG: DATScanner: Found 1 DAT file
DEBUG: DATScanner: Enumerating DAT archives
DEBUG: DATScanner: Deserializing DAT XML to objects
DEBUG: DATScanner: Parsing DAT files
INFO:  DATScanner: Done scanning DAT files
โœ“ Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 1 unique DAT found
INFO:  ROMScanner: Scanning ROM files
DEBUG: ROMScanner: Found 5 ROM files
INFO:  ROMScanner: Done scanning ROM files
โœ“ Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 5 unique ROMs found
INFO:  HeaderProcessor: Processing file headers
INFO:  HeaderProcessor: Done processing file headers
โœ“ Detecting ROM headers ยทยทยทยทยทยทยทยท | 5 ROMs processed
INFO:  Processing 1 DAT
INFO:  CandidateFilter: Nintendo - Game Boy: Generating candidates
DEBUG: CandidateFilter: Nintendo - Game Boy: 5 unique ROMs found
DEBUG: CandidateFilter: Nintendo - Game Boy: generated 1.1MiB of 9 candidates for 1,338 parents
INFO:  CandidateFilter: Nintendo - Game Boy: Done generating candidates
INFO:  PatchCandidateGenerator: Nintendo - Game Boy: Generating patched candidates
DEBUG: PatchCandidateGenerator: Nintendo - Game Boy: 0 unique patches found
INFO:  PatchCandidateGenerator: Nintendo - Game Boy: Done generating patched candidates
INFO:  CandidateFilter: Nintendo - Game Boy: Filtering candidates
DEBUG: CandidateFilter: Nintendo - Game Boy: filtered to 640KiB of 5 candidates for 1,338 parents
INFO:  CandidateFilter: Nintendo - Game Boy: Done filtering candidates
INFO:  ROMWriter: Nintendo - Game Boy: Writing candidates
ERROR: ROMWriter: Nintendo - Game Boy: No-IntroGB/Nintendo - Game Boy/Addams Family, The (USA).zip: written zip failed to get archive contents: Error: ENOENT: no such file or directory, stat 'No-IntroGB/Nintendo - Game Boy/Addams Family, The (USA).zip'
DEBUG: ROMWriter: Nintendo - Game Boy: Deleting moved files
INFO:  ROMWriter: Nintendo - Game Boy: Done writing candidates 1,333/1,338
INFO:  StatusGenerator: Nintendo - Game Boy: Generating ROM statuses
INFO:  StatusGenerator: Nintendo - Game Boy: Done generating ROM statuses
โœ“ Nintendo - Game Boy ยทยทยทยทยทยทยทยทยทยท | 0/3 BIOSes, 5/1,672 retail releases written
INFO:  Done processing 1 DAT
INFO:  ReportGenerator: Generating report
DEBUG: ReportGenerator: No-IntroGB/igir_2023-03-22T13;29;04+01;00.csv: wrote 1 status
INFO:  ReportGenerator: Done generating report
โœ“ Generating report ยทยทยทยทยทยทยทยทยทยทยทยท | No-IntroGB/igir_2023-03-22T13;29;04+01;00.csv

So, the same file Addams Family, The (USA) first was moved and processed properly and second time not.

Expected behavior

When specifying move and overwrite I expect igir to move all supported files.

Debug logs

Report content from first and second run:

Nintendo - Game Boy,"Addams Family, The (USA)",FOUND,"No-IntroGB/Nintendo - Game Boy/Addams Family, The (USA).zip",false,false,true,false,false,false,false,false,false,false,false,false

igir version

1.4.1

Node.js version

12.22.9

Operating system

WSL Ubuntu

Additional context

No response

Add ability to apply multiple patches to same ROM

Is your feature request related to a problem?

No response

Describe the solution you'd like

Many ROMs have addendum patches that have patch dependencies; they assume the core ROM has already been patched. It seems that igir will produce a unique ROM for each patch file it finds, and does not combine them. Also for some patches, order of being applied matters.

Examples:

Kaeru no Tame ni Kane wa Naru: (order matters)
Translation: https://www.romhacking.net/translations/1623/
Addendum (fix title screen): https://www.romhacking.net/translations/6517/

Final Fantasy II: (order doesn't matter)
Ultima (contains multiple optional patches): https://www.romhacking.net/hacks/4134/

Additional context

For ips patches I've tried adding the CRC32 checksum of the dependency ROM for each successive patch, but it didn't make a difference. It only lead to the later patches failing to be applied because igir seems to be unaware of the matching checksum of a new ROM it generated after applying a patch.

Example

> ls $INPUT
Kaeru no Tame ni Kane wa Naru (Japan).gb

> ls $PATCHES
"Frog_v1.0.ips"
"The Frog for Whom the Bell Tolls.ips"

> crc32 $INPUT/"Kaeru no Tame ni Kane wa Naru (Japan).gb"
c18cd57a
> mv $PATCHES/"Frog_v1.0.ips" $PATCHES/"Frog_v1.0 c18cd57a.ips"

> crc32 Frog_v1.0.gb (obtained after manually patching)
630193e8
> mv $PATCHES/"The Frog for Whom the Bell Tolls.ips" $PATCHES/"The Frog for Whom the Bell Tolls 630193e8.ips"

> ls $PATCHES
"Frog_v1.0 c18cd57a.ips"
"The Frog for Whom the Bell Tolls 630193e8.ips"

> npx igir@latest copy --input $INPUT --output $OUTPUT --patch $PATCHES

...

> ls $OUTPUT/Kaeru no Tame ni Kane wa Naru (Japan)/
"Frog_v1.0.gb"
"Kaeru no Tame ni Kane wa Naru (Japan).gb"
(no "The Frog for Whom the Bell Tolls.gb")

Add a --dat-exclude path option

Is your feature request related to a problem?

No-Intro's DAT-o-Matic site provides a way of downloading a full zipped archive of all DATs via the daily filter. It would be convenient to run igir using this archive, but to have the option to "exclude DAT" to avoid unneeded scans or erroneous matching, for example in situations where games appear in both Nintendo - Nintendo 64 (BigEndian) and Nintendo - Nintendo 64 (ByteSwapped) DAT files, but you're only interested in maintaining a BigEndian collection.

Describe the solution you'd like

Similar to --input-exclude, a flag like --dat-exclude that would ignore any matching DAT files.

Additional context

No response

Breaking changes wishlist

Command consistency

  • Make --fixdat a command

Option consistency

  • Make all ROM filter options have a --filter prefix

Erroneous `Cannot move different files to` warnings resulting in improper behavior

Paste the command

npx -yes igir@latest -vvv move test report --dat ../DATs/Redump/NEC\ -\ PC\ Engine\ CD\ \&\ TurboGrafx\ CD\ -\ Datfile\ \(541\)\ \(2023-04-09\ 22-11-42\).dat --input ./input --output ./output

> ls -l ./input/
total 514436
-rwxrwxrwx  1 jeff users 368156053 May 20 13:28 'Fighting Street (USA).zip'
-rwxrwxrwx+ 1 jeff users 158625630 May 20 13:23 'Jack Nicklaus Turbo Golf (USA).zip'
> ls -l ./output/
total 0

Describe the bug

Certain optical media files seem to behave unexpectedly when processed against certain other optical media files. I haven't been able to figure out why this happens, but I've isolated many examples of it. It results in a failure to copy or move one or both files.

In the below example igir fails to identify Jack Nicklaus Turbo Golf (USA).zip as a candidate when it should, and it spits out the following warning:

[13:28:17.360] WARN:  CandidateFilter: Cannot move different files to: output/Jack Nicklaus Turbo Golf (USA).zip:
[13:28:17.360] WARN:  CandidateFilter:   input/Jack Nicklaus Turbo Golf (USA).zip
[13:28:17.360] WARN:  CandidateFilter:   input/Fighting Street (USA).zip
[13:28:17.366] TRACE: CandidateFilter: NEC - PC Engine CD & TurboGrafx CD: Jack Nicklaus Turbo Golf (USA): found 0 candidates

Note the conflict with Fighting Street (USA).zip. This file is later successfully and properly identified as a candidate and is moved or copied as such. If I remove Fighting Street (USA).zip from ./input/, Jack Nicklaus Turbo Golf (USA).zip is properly identified as a candidate and the tool behaves as expected. I cannot reproduce this behavior with any other combination of files against Jack Nicklaus Turbo Golf (USA).zip.

Here are is a very short, incomplete list of other conflicts I've encountered (just TurboGrafx, but I see this for many other optical-based system DATs as well):

Zero Wing (Japan).zip + Dungeon Master - Theron's Quest (Japan).zip
Gain Ground SX (Japan).zip + Alnam no Kiba - Juuzoku Juuni Shinto Densetsu (Japan) (FAAT).zip
Hihou Densetsu - Chris no Bouken (Japan).zip + A.III. - A Ressha de Ikou III (Japan).zip
Super Air Zonk - Rockabilly-Paradise (USA).zip + Bonk III - Bonk's Big Adventure (USA).zip + CD Denjin - Rockabilly Tengoku (Japan).zip
Shadow of the Beast (USA).zip + Bonk III - Bonk's Big Adventure (USA).zip + Shadow of the Beast - Mashou no Okite (Japan).zip
Loom (USA).zip + Loom (Japan).zip
....hundreds more combinations

More details:

Excerpt from NEC - PC Engine CD & TurboGrafx CD - Datfile (541) (2023-04-09 22-11-42).dat:

	<game name="Jack Nicklaus Turbo Golf (USA)">
		<category>Games</category>
		<description>Jack Nicklaus Turbo Golf (USA)</description>
		<rom name="Jack Nicklaus Turbo Golf (USA).cue" size="1224" crc="93f9b06c" md5="591f2f3dd07461dc990b089e0963a719" sha1="b2a200c9a87cb22080192dcc899f56a4f624db86"/>
		<rom name="Jack Nicklaus Turbo Golf (USA) (Track 01).bin" size="7914480" crc="17623548" md5="77232c745e40cc155ad72c1b79780986" sha1="e1baaf01eee215def8bd6f6aa080e3a41ffc74f4"/>
		<rom name="Jack Nicklaus Turbo Golf (USA) (Track 02).bin" size="22946112" crc="c9cdcb10" md5="b30c100096e78328c3ef80c06d794b53" sha1="5f59a0080a26f35c25ac8de25ebf22c83dc75406"/>
		<rom name="Jack Nicklaus Turbo Golf (USA) (Track 03).bin" size="11005008" crc="7df2dc3e" md5="0a08889b2cff35740f982bfca0abd34c" sha1="dc58e79d38cb85bb54e3c15a9e03e3744cf24428"/>
		<rom name="Jack Nicklaus Turbo Golf (USA) (Track 04).bin" size="27723024" crc="b4580daf" md5="1ce418ce541cdd10854ffd78b02fd7d5" sha1="c1d0ff11a7c0b63c031083a1e1b306676e96cfba"/>
		<rom name="Jack Nicklaus Turbo Golf (USA) (Track 05).bin" size="5407248" crc="cdcf16e9" md5="5587af5d843eaf719e80fdae2f1264c7" sha1="c90a80e4be09ed5aac6c76c5b1e31434358649ef"/>
		<rom name="Jack Nicklaus Turbo Golf (USA) (Track 06).bin" size="24576048" crc="cd070c6f" md5="36d015776a4ac44d9daf250b336d0dfb" sha1="ecaefc831654200e78775985244af5b004f3c762"/>
		<rom name="Jack Nicklaus Turbo Golf (USA) (Track 07).bin" size="26789280" crc="af06ac59" md5="f90dfebef960f5358c295e8e929d2d99" sha1="54207863f1e5fb82815537fac682c15c38c76227"/>
		<rom name="Jack Nicklaus Turbo Golf (USA) (Track 08).bin" size="26624640" crc="19309a5a" md5="c1d7b1ec9a78fbb177fadd1f6ec10b02" sha1="2675e4d635a94e77df277db183dce57d6ed75bfb"/>
		<rom name="Jack Nicklaus Turbo Golf (USA) (Track 09).bin" size="18449088" crc="615709b5" md5="9e3dd07f45d13238e79efbadd2a1f4f3" sha1="3b3cfbe0dc1d797117713b7881991d72995f112d"/>
		<rom name="Jack Nicklaus Turbo Golf (USA) (Track 10).bin" size="13945008" crc="07842367" md5="e1e698803b01feaad7e9f82857621a0d" sha1="b45baea264810cd80e439784fb010626a47ad7a7"/>
		<rom name="Jack Nicklaus Turbo Golf (USA) (Track 11).bin" size="22595664" crc="025adc5c" md5="bf5ea8a875a5e8a2547bf856c0de0721" sha1="789012ea63cbbfedac32cf013da4c2f8845cd574"/>
	</game>

Hashes on disk (they match the dat file):

> sha1sum Jack\ Nicklaus\ Turbo\ Golf\ \(USA\)*
e1baaf01eee215def8bd6f6aa080e3a41ffc74f4  Jack Nicklaus Turbo Golf (USA) (Track 01).bin
5f59a0080a26f35c25ac8de25ebf22c83dc75406  Jack Nicklaus Turbo Golf (USA) (Track 02).bin
dc58e79d38cb85bb54e3c15a9e03e3744cf24428  Jack Nicklaus Turbo Golf (USA) (Track 03).bin
c1d0ff11a7c0b63c031083a1e1b306676e96cfba  Jack Nicklaus Turbo Golf (USA) (Track 04).bin
c90a80e4be09ed5aac6c76c5b1e31434358649ef  Jack Nicklaus Turbo Golf (USA) (Track 05).bin
ecaefc831654200e78775985244af5b004f3c762  Jack Nicklaus Turbo Golf (USA) (Track 06).bin
54207863f1e5fb82815537fac682c15c38c76227  Jack Nicklaus Turbo Golf (USA) (Track 07).bin
2675e4d635a94e77df277db183dce57d6ed75bfb  Jack Nicklaus Turbo Golf (USA) (Track 08).bin
3b3cfbe0dc1d797117713b7881991d72995f112d  Jack Nicklaus Turbo Golf (USA) (Track 09).bin
b45baea264810cd80e439784fb010626a47ad7a7  Jack Nicklaus Turbo Golf (USA) (Track 10).bin
789012ea63cbbfedac32cf013da4c2f8845cd574  Jack Nicklaus Turbo Golf (USA) (Track 11).bin
b2a200c9a87cb22080192dcc899f56a4f624db86  Jack Nicklaus Turbo Golf (USA).cue

Expected behavior

  1. I expect otherwise positive matching candidates to be treated as such, and not conflict with anything else going on.

  2. The log message let message = `Cannot ${this.options.writeString()} different files to: ${duplicateOutput}:`; is unintuitive and I honestly don't understand what it means when this issue is encountered. Maybe clearer messaging would help?

  3. Unrelated to this behavior specifically, but the console is flooded with missing XX files for: <unrelated ROM name>. In my example of using only two ROMs in ./input/, I see dozens of warnings of what look like attempts to match one of the ROMs to the wrong candidate, and the tool being overly helpful in explaining why. For example:

[13:46:44.561] WARN:  CandidateFilter: NEC - PC Engine CD & TurboGrafx CD: missing 43 files for: Ys Book I & II (USA)
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA).cue
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 02).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 03).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 04).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 05).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 06).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 07).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 08).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 09).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 10).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 11).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 12).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 13).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 14).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 15).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 16).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 17).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 18).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 19).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 20).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 21).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 22).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 23).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 24).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 25).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 26).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 27).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 28).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 29).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 30).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 31).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 32).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 33).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 34).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 35).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 36).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 37).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 38).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 39).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 40).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 41).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 42).bin
[13:46:44.561] WARN:  CandidateFilter:   Ys Book I & II (USA) (Track 43).bin
[13:46:44.576] TRACE: CandidateFilter: NEC - PC Engine CD & TurboGrafx CD: Ys Book I & II (USA): found 0 candidates

This is true, but Ys Book I & II (USA) is not among the ROMs in ./input/. This doesn't feel like it rises to the occasion of needing a WARN, especially because it's not doing this for every ROM in the DAT, just a subset. See the attached output for a better overview.

Debug logs

log.txt

igir version

1.6.4

Node.js version

18.12.0

Operating system

Linux

Additional context

No response

Support "split" and "merged" merge types

Is your feature request related to a problem?

No response

Describe the solution you'd like

Because igir is not MAME centric, the only merge type supported right now is "non-merged".

Additional context

No response

Error when running "symlink clean"

Paste the command

./bin/igir symlink clean \
  --dat "./MiSTer.DATs/*.dat" \
  --input "./roms/**/*.zip" \
  --output "./MiSTer/{mister}" \
  --dir-letter \
  --no-bios \
  --single \
  --only-retail \
  --prefer-language DE,EN \
  --prefer-region USA,WORLD,EUR,JPN

Describe the bug

When executing the command above, I get the following error at the end and the cleanup operation stops:

[11:47:30.966] INFO:  DirectoryCleaner: cleaning files in output
[11:47:31.992] ERROR: MiSTer/Atari5200/A/Atari PAM Diagnostics (USA) (v2.0).zip: no files found

First of all, the file quoted above does not exist. There is no indication that it got created during the symlink part. There is the following in the log though:

[11:46:18.416] TRACE: CandidateGenerator: Atari - 5200: Atari PAM Diagnostics (USA) (v2.3): found 2 candidates

(Please not the version difference though)

Expected behavior

Cleanup operation finishes successfully.

Debug logs

n/a

DAT(s) used

Atari - 5200 (Parent-Clone) (20220405-183755).dat

igir version

1.9.1

Node.js version

n/a

Operating system

Linux

Additional context

No response

Add --miss-only to report command

Is your feature request related to a problem?

Quickly generate a miss list of missing roms

Describe the solution you'd like

It would be comfortable to have an option to generate just a list of which roms are missing in the set. Something like "--miss-only" flag specific for the report command.

Additional context

Thank your for this great app!

MAME XML DATs don't parse correctly

Discussed in #446

Originally posted by mattieb June 14, 2023
I have figured out how to use igir with No-Intro DATs and it's perfect. ๐Ÿคฉ

It's unclear to me if I can use it with e.g. pleasuredome MAME DATs, or other MAME DATs. Since they list "machine" elements instead of "game", I'm guessing that may be unimplemented?

Although igir appears to find all the ROMs inside the MAME ZIPs, all ZIPs end up listed as "UNMATCHED" in the report.

MAME DATs use <machine> instead of <game> for no explainable reason.

https://web.archive.org/web/20230619034434/http://www.logiqx.com/DatFAQs/

They might also use <mame> instead of <datafile> in the official DATs.

Not deleting original file after successful `move`

Paste the command

npx -yes igir@latest -vvv move --dat ./DATs/Redump/SNK\ -\ Neo\ Geo\ CD\ -\ Datfile\ \(111\)\ \(2022-09-23\ 17-55-26\).zip --input ../downloads/Garou\ Densetsu\ Special\ ~\ Fatal\ Fury\ Special\ \(Japan\)\ \(En\,Ja\).zip --output ./Redump_downloadtest/ --dir-dat-name

Describe the bug

I'm running into cases where the original files are not being deleted after a successful move to the output directory. It aborts the operation with the warning message not deleting moved file, XX archive entries were unmatched. It seems to occur with ROMs of the cue/bin format.

In the example I provide, I manually hashed each file to confirm it matched the DAT entries. It's a perfect match, so I'm unsure what the problem could be.

[20:28:22.553] INFO:  ROMWriter: SNK - Neo Geo CD: done writing 1 candidate
[20:28:22.556] INFO:  StatusGenerator: SNK - Neo Geo CD: generating ROM statuses
[20:28:22.579] INFO:  StatusGenerator: SNK - Neo Geo CD: done generating ROM statuses
โœ“ SNK - Neo Geo CD ยทยทยทยทยทยทยทยทยทยทยทยทยท | 1/111 games, 1/111 retail releases written
[20:28:22.584] INFO:  done processing 1 DAT
[20:28:22.591] INFO:  MovedROMDeleter: deleting moved ROMs
[20:28:22.594] WARN:  MovedROMDeleter: ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja).zip: not deleting moved file, 28 archive entries were
unmatched:
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 01).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 02).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 03).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 04).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 05).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 06).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 07).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 08).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 09).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 10).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 11).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 12).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 13).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 14).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 15).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 16).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 17).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 18).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 19).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 20).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 21).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 22).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 23).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 24).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 25).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 26).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 27).bin,
[20:28:22.594] WARN:  MovedROMDeleter:   Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja).cue
[20:28:22.606] DEBUG: MovedROMDeleter: deleting 0 moved files
[20:28:22.608] INFO:  MovedROMDeleter: done deleting moved ROMs

Expected behavior

When using the move command, ROMs that match a DAT entry should be copied to the output directory and then removed from the input directory.

Debug logs

Excerpt from SNK - Neo Geo CD - Datfile (111) (2022-09-23 17-55-26).dat:

	<game name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)">
		<category>Games</category>
		<description>Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)</description>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja).cue" size="3970" crc="e95e098f" md5="86e2bea7e948ff55564e646b2373aae4" sha1="ae6c9618aab99527135015bc4cb65f8edaaf7f5a"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 01).bin" size="25634448" crc="ef787662" md5="5796897e1d8ae5b87413cf592d4d8141" sha1="5df92d1c9be9d7b313753fac1c6b4a9efa275b4a"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 02).bin" size="4475856" crc="78699f8e" md5="6c4f316d952e9b3594d71508af50f93a" sha1="2fe5562e1373a496f700cfc22465f545f9b15e00"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 03).bin" size="4116000" crc="3ac9721f" md5="865d6e0b179b74bf33da645b3fd8ef81" sha1="047f97d551f3297f8d29f22fa9e78feef6347d70"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 04).bin" size="23268336" crc="439020bc" md5="98b1cfed664ce3442c6595a37d5841ae" sha1="921ab8f9eb0922f53e6ae06fe779ba933d503d4f"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 05).bin" size="7197120" crc="8041c8ff" md5="75de46ed078cf25032b1c67f04d60409" sha1="9c814bb938ef1aaa2c09564ae11c0c5a87b7ec67"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 06).bin" size="21396144" crc="48a79f55" md5="26f38eb1081df38ac9b8d5169428da12" sha1="bd614984e83aa5efa65f78f4e994cdf3925564c9"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 07).bin" size="4320624" crc="786c1186" md5="c9e09bf560521c1ac31ed507f53e8135" sha1="2366ea8a657f807799b4c88b4daf97246438f7dd"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 08).bin" size="3024672" crc="6f13eafd" md5="82dfe8f58f2e95d8b3d2b803816f90ba" sha1="41375a9ada4d53308eec6cad38a5b9c2866751da"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 09).bin" size="22560384" crc="0f960a71" md5="1eda0348826177c1d1d9f06e25bf4131" sha1="44ed12d24c3bca4c3122916c0f6601cfb171146b"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 10).bin" size="33965232" crc="f9d0fa44" md5="322ace3238bc175c8fc81dd0b4b4d50a" sha1="d095a3b176a0b2e11b94fb8d0828f481863959b6"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 11).bin" size="34066368" crc="db92e075" md5="41e3aedef6df59ccc277098a6fb03c60" sha1="ad90f194d1821c68926fbe39e69e2a30c3c6a6b8"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 12).bin" size="34487376" crc="3ca8ac07" md5="fd504423137eb3d16a3820eda6c101df" sha1="5c54a07148b8a3f69b7c9a9a022a3096114a7615"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 13).bin" size="34419168" crc="0980b41c" md5="99cade798b52bc951da171ed568549bb" sha1="542b9d06a7c47eb66977f5761fecdea94a6a72d0"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 14).bin" size="34496784" crc="d39752a2" md5="bd8a26fefed601fd96e55ba51ff7375a" sha1="4ee915b232c0eeeefecafe3d71cc69ed22ac4979"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 15).bin" size="34795488" crc="921b5654" md5="d4e67172cca7d8e84ffafcc36ad07ef9" sha1="d3d55b431e8445167dba5dca876fe6a177d38e96"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 16).bin" size="34318032" crc="dc369db5" md5="90f19751738f5ab8f2f1d4b19e57d911" sha1="9e43f950f3bdf786491f3a68cac2899620f408c8"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 17).bin" size="34195728" crc="44e50ef2" md5="5ac3819c15d23819e65319614bbeda81" sha1="203856a8352fd3ae6111e4fb099e9830cb3bd15e"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 18).bin" size="34223952" crc="5dcaef3f" md5="fb641fe9a5436ab52b169a648fbee75f" sha1="ab46cf81a1061aa3256b95aaabbffbcf36ece9eb"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 19).bin" size="33969936" crc="f83dc97b" md5="94abfed3b73ab474c42ded5b2e75e3ab" sha1="8818535bb62e11711bf7335a66cd284b8f5475eb"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 20).bin" size="34263936" crc="dce52e16" md5="564b06bd2e57964571de94ce8ec7f0fe" sha1="26a8f8ae4d6651f97663e7bbfe2067d3b7b87fec"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 21).bin" size="34322736" crc="fe60b2f9" md5="fe47ba8deffe97315ab3349b366f5eef" sha1="a23cf7bf44aedc53cd03ec1dcaa9d2b29f46be38"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 22).bin" size="22553328" crc="74bee513" md5="fb6eb6998a1055751ecdf061962e3cdc" sha1="1faa6f3e91efd59c967729e0fe02df5b34fef3b8"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 23).bin" size="34684944" crc="c534a8ec" md5="6d10882c400b1b556f9f7a68ec93f3ef" sha1="71f8ff3e196a8abb8e670e558fd955b46be59d18"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 24).bin" size="34569696" crc="3b094e2c" md5="1f2ce15e8fc6f246f1cd9b894770a8bf" sha1="81ce7de8815119cf5cd42b60636f8852dae0b355"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 25).bin" size="34454448" crc="8989ae66" md5="1d3a1878f0a5de791141749a320d88ff" sha1="43798f7e0a76e88c4171eba052275323e13ed865"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 26).bin" size="33826464" crc="37a9380a" md5="167eb654d9d24b83ae6ec4d6b3081133" sha1="3b6338e2309d8ebd59268ee099ae86419aa17385"/>
		<rom name="Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 27).bin" size="30959376" crc="64b5378e" md5="14cdabbef8edb139507a211ea457efee" sha1="414b1d4e46b8ba1d36cdcbc907b3951df79c112c"/>
	</game>

SHA1 hashes on file:

$ sha1sum ../downloads/Garou\ Densetsu\ Special\ ~\ Fatal\ Fury\ Special\ \(Japan\)\ \(En\,Ja\)/Garou\ Densetsu\ Special\ ~\ Fatal\ Fury\ Special\ \(Japan\)\ \(En\,Ja\)*
5df92d1c9be9d7b313753fac1c6b4a9efa275b4a  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 01).bin
2fe5562e1373a496f700cfc22465f545f9b15e00  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 02).bin
047f97d551f3297f8d29f22fa9e78feef6347d70  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 03).bin
921ab8f9eb0922f53e6ae06fe779ba933d503d4f  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 04).bin
9c814bb938ef1aaa2c09564ae11c0c5a87b7ec67  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 05).bin
bd614984e83aa5efa65f78f4e994cdf3925564c9  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 06).bin
2366ea8a657f807799b4c88b4daf97246438f7dd  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 07).bin
41375a9ada4d53308eec6cad38a5b9c2866751da  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 08).bin
44ed12d24c3bca4c3122916c0f6601cfb171146b  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 09).bin
d095a3b176a0b2e11b94fb8d0828f481863959b6  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 10).bin
ad90f194d1821c68926fbe39e69e2a30c3c6a6b8  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 11).bin
5c54a07148b8a3f69b7c9a9a022a3096114a7615  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 12).bin
542b9d06a7c47eb66977f5761fecdea94a6a72d0  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 13).bin
4ee915b232c0eeeefecafe3d71cc69ed22ac4979  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 14).bin
d3d55b431e8445167dba5dca876fe6a177d38e96  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 15).bin
9e43f950f3bdf786491f3a68cac2899620f408c8  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 16).bin
203856a8352fd3ae6111e4fb099e9830cb3bd15e  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 17).bin
ab46cf81a1061aa3256b95aaabbffbcf36ece9eb  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 18).bin
8818535bb62e11711bf7335a66cd284b8f5475eb  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 19).bin
26a8f8ae4d6651f97663e7bbfe2067d3b7b87fec  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 20).bin
a23cf7bf44aedc53cd03ec1dcaa9d2b29f46be38  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 21).bin
1faa6f3e91efd59c967729e0fe02df5b34fef3b8  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 22).bin
71f8ff3e196a8abb8e670e558fd955b46be59d18  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 23).bin
81ce7de8815119cf5cd42b60636f8852dae0b355  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 24).bin
43798f7e0a76e88c4171eba052275323e13ed865  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 25).bin
3b6338e2309d8ebd59268ee099ae86419aa17385  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 26).bin
414b1d4e46b8ba1d36cdcbc907b3951df79c112c  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja) (Track 27).bin
ae6c9618aab99527135015bc4cb65f8edaaf7f5a  ../downloads/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja)/Garou Densetsu Special ~ Fatal Fury Special (Japan) (En,Ja).cue

Logs too long to include, so see attached.
igir_log.txt

igir version

1.6.2

Node.js version

18.12.0

Operating system

Linux

Additional context

No response

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Awaiting Schedule

These updates are awaiting their schedule. Click on a checkbox to get an update now.

  • Chore: update dependencies (@node-rs/crc32, @types/micromatch, @types/tar, reflect-metadata, unzipper)
  • Chore: update ESLint (@typescript-eslint/eslint-plugin, @typescript-eslint/parser, eslint-plugin-jsdoc, eslint-plugin-simple-import-sort)
  • Chore: update dependency @types/node to v20.12.7
  • Chore: update docs dependencies (mkdocs, mkdocs-htmlproofer-plugin, mkdocs-material)
  • Chore: update codecov/codecov-action action to v4
  • Chore: update dependency eslint-plugin-jest to v28
  • Chore: update dependency eslint-plugin-unicorn to v52
  • Chore: update lockfile
  • Chore: update dependency typescript to v5.4.5

Edited/Blocked

These updates have been manually edited so Renovate will no longer make changes. To discard all commits and start over, click on a checkbox.

Detected dependencies

github-actions
.github/workflows/codecov.yml
  • actions/checkout v4
  • formsort/action-check-codecov-config v1
  • actions/checkout v4
  • volta-cli/action v4
  • codecov/codecov-action v3
.github/workflows/gh-automerge-disabler.yml
  • actions/checkout v4
  • thollander/actions-comment-pull-request v2
  • thollander/actions-comment-pull-request v2
.github/workflows/gh-automerge-rebase.yml
  • adRise/update-pr-branch v0.7.2
.github/workflows/gh-dependabot-automerge.yml
  • actions/checkout v4
.github/workflows/gh-first-interaction.yml
.github/workflows/gh-label-sync.yml
  • actions/checkout v4
  • EndBug/label-sync v2
  • actions/checkout v4
  • EndBug/label-sync v2
.github/workflows/gh-lock-issues.yml
  • dessant/lock-threads v5
.github/workflows/gh-pages.yml
  • actions/checkout v4
  • actions/checkout v4
  • actions/checkout v4
  • actions/setup-python v5
  • actions/cache v4
  • actions/checkout v4
  • actions/setup-python v5
  • actions/cache v4
.github/workflows/gh-release-drafter.yml
  • actions/checkout v4
  • EndBug/version-check v2
  • volta-cli/action v4
  • release-drafter/release-drafter v6
  • thollander/actions-comment-pull-request v2
.github/workflows/gh-repo-update.yml
  • actions/checkout v4
.github/workflows/gh-stale-issues.yml
  • actions/stale v9
.github/workflows/lint.yml
  • actions/checkout v4
  • rinchsan/renovate-config-validator v0.2.0
  • actions/checkout v4
  • actions/checkout v4
  • actions/setup-go v5
.github/workflows/node-compile.yml
  • actions/checkout v4
  • actions/checkout v4
  • docker/setup-qemu-action v3
  • volta-cli/action v4
  • actions/upload-artifact v4
  • actions/checkout v4
  • volta-cli/action v4
  • actions/download-artifact v4
  • softprops/action-gh-release v2
.github/workflows/node-publish.yml
  • actions/checkout v4
  • volta-cli/action v4
  • thollander/actions-comment-pull-request v2
.github/workflows/node-test.yml
  • actions/checkout v4
  • actions/checkout v4
  • volta-cli/action v4
  • actions/checkout v4
  • volta-cli/action v4
  • actions/checkout v4
  • volta-cli/action v4
  • actions/checkout v4
  • volta-cli/action v4
  • actions/checkout v4
  • volta-cli/action v4
.github/workflows/node-version-bump.yml
  • actions/checkout v4
  • volta-cli/action v4
  • peter-evans/create-pull-request v6
.github/workflows/pr-commenter.yml
  • volta-cli/action v4
  • thollander/actions-comment-pull-request v2
.github/workflows/pr-renamer.yml
  • actions/checkout v4
  • thollander/actions-comment-pull-request v2
npm
package.json
  • @fast-csv/format 5.0.0
  • @fast-csv/parse 5.0.0
  • @node-rs/crc32 1.10.0
  • 7zip-min 1.4.4
  • archiver 7.0.1
  • async 3.2.5
  • async-mutex 0.5.0
  • chalk 5.3.0
  • class-transformer 0.5.1
  • cli-progress 3.12.0
  • fast-glob 3.3.2
  • fast-xml-parser 4.3.6
  • figlet 1.7.0
  • graceful-fs 4.2.11
  • is-admin 4.0.0
  • junk 4.0.1
  • micromatch 4.0.5
  • moment 2.30.1
  • node-disk-info 1.3.0
  • node-unrar-js 2.0.2
  • reflect-metadata 0.2.1
  • semver 7.6.0
  • simple-statistics 7.8.3
  • strip-ansi 7.1.0
  • tar 6.2.1
  • term-size 4.0.0
  • trash 8.1.1
  • typescript-memoize 1.1.1
  • unzipper 0.10.14
  • wrap-ansi 8.1.0
  • xml2js 0.6.2
  • yargs 17.7.2
  • @jest/globals 29.7.0
  • @types/7zip-min 1.3.3
  • @types/archiver 6.0.2
  • @types/async 3.2.24
  • @types/cli-progress 3.11.5
  • @types/figlet 1.5.8
  • @types/jest 29.5.12
  • @types/micromatch 4.0.6
  • @types/node 20.11.30
  • @types/semver 7.5.8
  • @types/tar 6.1.11
  • @types/unzipper 0.10.9
  • @types/which 3.0.3
  • @types/xml2js 0.4.14
  • @types/yargs 17.0.32
  • @typescript-eslint/eslint-plugin 7.5.0
  • @typescript-eslint/parser 7.5.0
  • auto-changelog 2.4.0
  • caxa 3.0.1
  • eslint 8.57.0
  • eslint-config-airbnb-typescript 18.0.0
  • eslint-plugin-import 2.29.1
  • eslint-plugin-jest 27.9.0
  • eslint-plugin-jsdoc 48.2.1
  • eslint-plugin-simple-import-sort 12.0.0
  • eslint-plugin-unicorn 51.0.1
  • husky 9.0.11
  • jest 29.7.0
  • jest-extended 4.0.2
  • ts-jest 29.1.2
  • ts-node 10.9.2
  • typescript 5.4.3
  • which 4.0.0
  • node 20.12.2
pip_requirements
docs/requirements.txt
  • mkdocs ==1.5.3
  • mkdocs-material ==9.5.17
  • mkdocs-exclude-search ==0.6.6
  • mkdocs-git-revision-date-localized-plugin ==1.2.4
  • mkdocs-htmlproofer-plugin ==1.2.0
  • mkdocs-redirects ==1.2.1
  • mkdocs-unused-files ==0.2.0
  • mdx-truly-sane-lists ==1.3
  • Pillow ==10.3.0
  • CairoSVG ==2.7.1

  • Check this box to trigger a request for Renovate to run again on this repository

Create new {gameType} token

I saw you make a new update of igir with the --only-* option, it's great ๐Ÿ‘

I would like to know what about the {type} token you spoke before? Just curious, if you have still in mind?

And just because my English it's not good enough, I would like describe a use case with --only-* option and my first idea.

Let say I got a few ROMs:

  • 7th Saga, The (USA)
  • 16 BIT XMAS 2012 - Snowball Fight (World) (Aftermarket) (Homebrew)
  • ActRaiser (Europe)
  • Bomberman B-Daman (Japan)

So if I want to copy this to my SD card I will get a # folder, a folder and a b folder.

If I use the --only-aftermarket option, I will get only a # folder with one game.

On my point of view, something is missing.

Get the first option, copy all files in a SD card and get # folder, a folder and a b folder. All games in there.
The difference will be a new folder aftermarket with one game inside.

The name of this option can be something like --dir-* (for --dir-demo, --dir-aftermarket, etc.)

What do you think about?

Originally posted by @21millStreets in #484 (comment)

Parsing large DAT files takes a very long time

Is your feature request related to a problem?

I'm attempting to run igir with several DAT files, but I suspect Redump's IBM PC compatible DAT file of ~40,000 entries is causing the tool some major problems. I've been running the tool for 7 days, and it has been stuck on the parsing DAT files phase since day 1.

I'm not using the most robust of machines, so I acknowledge it would be reasonable for things to be slow, but this is so slow it seems there must be a practical upper limit on DAT sizes.

http://redump.org/downloads/
http://redump.org/datfile/pc/

I suspect I could unblock myself by manually breaking up the large DAT file into multiple smaller ones, but I have not tried this.

Describe the solution you'd like

More robust logging to indicate the tool is not hanging. Different memory management strategy for compatibility with larger DAT files.

Additional context

image

Allow specifying report output location (and perhaps name?)

Is your feature request related to a problem?

No response

Describe the solution you'd like

Maybe I'm missing it, but when using "report" I can't figure out how to tell igir where to place the output report. Currently it's always in the root path sent to igir. Would also be nice to specify a filename so I can programatically parse it afterwards.

Additional context

No response

Report on cleaned files

Is your feature request related to a problem?

No response

Describe the solution you'd like

Building on top of #326, add the functionality to report on files that were cleaned from the output directory with the igir clean command.

Additional context

No response

Multiple files with same checksum result in warning

Paste the command

./bin/igir move zip test
--dat "./fixdat/*"
"${INPUTS[@]}"
--output "./Fixes/"
--dir-dat-name
--overwrite-invalid

Describe the bug

When importing a rom that contains of multiple files and more than one share the same checksum, an warning like this will be produced:

WARN:  <filename>: not deleting moved file, 3 archive entries were unmatched:
...

As a result, a copy of archive file will remain in the original location.

Expected behavior

No warning and the file gets moved properly

Debug logs

DAT(s) used

No response

igir version

1.9.0

Node.js version

n/a

Operating system

Linux

Additional context

No response

Fatal error when processing 7z file with UTF-8 characters

Paste the command

igir move zip test report --input snes-test --output No-Intro --overwrite --dir-dat-name --single --dat "Nintendo - Super Nintendo Entertainment System (Parent-Clone) (20230318-120602).dat" -vvv

Describe the bug

When the ROM archive contains characters in the file name, eg รฃรงรต igir throws out of memory error at the stage of parsing the file headers.

obraz

Expected behavior

UTF-8 filenames support.

Debug logs

 ______   ______   ______  _______
|      \ /      \ |      \|       \
 \$$$$$$|  $$$$$$\ \$$$$$$| $$$$$$$\
  | $$  | $$ __\$$  | $$  | $$__| $$
  | $$  | $$|    \  | $$  | $$    $$   ROM collection manager
  | $$  | $$ \$$$$  | $$  | $$$$$$$\
 _| $$_ | $$__| $$ _| $$_ | $$  | $$   v1.6.2
|   $$ \ \$$    $$|   $$ \| $$  | $$
 \$$$$$$  \$$$$$$  \$$$$$$ \$$   \$$


[10:33:30.270] INFO:  DATScanner: scanning DAT files
[10:33:30.340] DEBUG: DATScanner: found 1 DAT file
[10:33:30.343] DEBUG: DATScanner: enumerating DAT archives
[10:33:30.363] DEBUG: DATScanner: downloading DATs from URLs
[10:33:30.365] DEBUG: DATScanner: parsing 1 DAT file
[10:33:30.377] TRACE: DATScanner: Nintendo - Super Nintendo Entertainment System (Parent-Clone) (20230318-120602).dat: attempting to parse 1.5MiB of XML
[10:33:31.111] TRACE: DATScanner: Nintendo - Super Nintendo Entertainment System (Parent-Clone) (20230318-120602).dat: parsed XML, deserializing to DAT
[10:33:31.674] TRACE: DATScanner: Nintendo - Super Nintendo Entertainment System (Parent-Clone) (20230318-120602).dat: 5.7GiB of 4009 games, 1914 parents parsed
[10:33:31.680] INFO:  DATScanner: done scanning DAT files
โˆš Scanning for DATs ยทยทยทยทยทยทยทยทยทยทยทยท | 1 unique DAT found
[10:33:31.689] INFO:  ROMScanner: scanning ROM files
[10:33:31.718] DEBUG: ROMScanner: found 1 ROM file
[10:33:31.819] INFO:  ROMScanner: done scanning ROM files
โˆš Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 1 unique ROM found
[10:33:31.826] INFO:  HeaderProcessor: processing file headers
# Detecting ROM headers ยทยทยทยทยทยทยทยท | โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ | 1/1
<--- Last few GCs --->

[19860:000001F4E086D590]  1705227 ms: Mark-sweep 3974.6 (4132.7) -> 3962.9 (4133.9) MB, 12515.7 / 0.0 ms  (average mu = 0.140, current mu = 0.049) task; scavenge might not succeed
[19860:000001F4E086D590]  1720003 ms: Mark-sweep 3976.6 (4134.2) -> 3964.4 (4135.4) MB, 13993.5 / 0.0 ms  (average mu = 0.098, current mu = 0.053) task; scavenge might not succeed


<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 00007FF66314D51F node_api_throw_syntax_error+175743
 2: 00007FF6630D2E66 v8::internal::wasm::WasmCode::safepoint_table_offset+59654
 3: 00007FF6630D4B72 v8::internal::wasm::WasmCode::safepoint_table_offset+67090
 4: 00007FF663B7AAB4 v8::Isolate::ReportExternalAllocationLimitReached+116
 5: 00007FF663B65E12 v8::Isolate::Exit+674
 6: 00007FF6639E7C6C v8::internal::EmbedderStackStateScope::ExplicitScopeForTesting+124
 7: 00007FF6639F4F4D v8::internal::Heap::PublishPendingAllocations+1117
 8: 00007FF6639F1FD7 v8::internal::Heap::PageFlagsAreConsistent+3367
 9: 00007FF6639E4707 v8::internal::Heap::CollectGarbage+2039
10: 00007FF66398BAA5 v8::internal::IndexGenerator::~IndexGenerator+22565
11: 00007FF663067153 EVP_CIPHER_CTX_get_cipher_data+4835
12: 00007FF663065AF6 v8::CTypeInfoBuilder<void>::Build+21718
13: 00007FF6631A922B uv_update_time+491
14: 00007FF6631A8D72 uv_run+1266
15: 00007FF66317B465 node::SpinEventLoop+325
16: 00007FF66308A588 EVP_CIPHER_CTX_get_cipher_data+149272
17: 00007FF66310F372 node::InitializeOncePerProcess+2898
18: 00007FF663110BA3 node::Start+835
19: 00007FF662F17ECC AES_cbc_encrypt+124156
20: 00007FF66417E248 inflateValidate+18712
21: 00007FFAA8CC7604 BaseThreadInitThunk+20
22: 00007FFAAA9426A1 RtlUserThreadStart+33

igir version

1.6.2

Node.js version

Embeded

Operating system

Windows 10

Additional context

No response

Make non-TTY output match TTY

I profit to ask this:

I like the report in the Terminal, I use also the CSV, but I would like both.

If I use this:
npx igir report --dat DAT --input ROM --report-output report.csv >> test.txt

I get this in a file:

Sega - Master System - Mark III ...
Sega - 32X ... 213/213 games, 3/3 BIOSes, 61/61 retail releases found
Sega - Mega Drive - Genesis ...
Sega - Game Gear ... 808/808 games, 1/1 BIOSes, 490/490 retail releases found
Sega - PICO ...
Sega - Master System - Mark III ... 715/722 games, 13/13 BIOSes, 540/547 retail releases found
Sega - SG-1000 ...
Sega - Mega Drive - Genesis ... 2โ€ฏ799/2โ€ฏ801 games, 31/31 BIOSes, 1โ€ฏ766/1โ€ฏ766 retail releases found
SNK - NeoGeo Pocket ...
Sega - PICO ... 445/445 games, 343/343 retail releases found

I get one line empty and one line with data.

I would like the same result into the Terminal, see the first message (alphabetic order, result, etc. - and here it's good because the name of platform are complete).

Am I doing something wrong?

Originally posted by @21millStreets in #517 (comment)

Add fixdat support

Is your feature request related to a problem?

This feature allows the creation of a fixdat with all the entries which are missing from the main dat, so it will be easy to search and rebuild the missing roms

Describe the solution you'd like

a flag to the command "report" for example something like "--fix-dat" which creates the dat with only the missing entries of the main dat.

Additional context

example of a fixdat content created with RomVault:

<?xml version="1.0"?>
<datafile>
	<header>
		<name>FixDat_datname</name>
		<description>FixDat_datname</description>
		<version>20230412-000000</version>
		<date>2023-04-12</date>
		<author>RomVault</author>
		<homepage>N/A</homepage>
		<url>N/A</url>
		<romvault/>
	</header>
	<game name="gamename">
		<description>gamename</description>
		<rom name="romname" size="1048576" crc="crc32" md5="md5"/>
	</game>
</datafile>

Hanging on file `copy`/`move` for certain combinations of ROMs

Paste the command

npx -yes igir@latest -vvv copy --input input --output output
npx -yes igir@latest -vvv move --input input --output output

Describe the bug

Using an input folder with certain combinations of ROMs, the tool hangs (reliably) before completing the copyor move operation. If the tool is run on each ROM individually, it completes successfully.

I have witnessed this behavior with multiple different ROMs, but managed to catch this one recently and whittled it down to the smallest footprint to reproduce as I could. I have only witnessed this behavior with cue/bin ROMs. Maybe because they're larger on disk? Maybe because the zip archives can have many more files in them?

$ ls -l input/
total 1114376
-rwxrwxrwx+ 1 jeff users 401968677 May 13 20:16 'Eye of the Beholder (USA).zip'
-rwxrwxrwx+ 1 jeff users 310171331 May 13 20:16 'Lunar - Eternal Blue (USA) (RE).zip'
-rwxrwxrwx+ 1 jeff users 428977255 May 13 20:16 'Lunar - The Silver Star (USA) (RE).zip'

Expected behavior

All ROMs in the input folder that should be copied/moved are copied/move and the tool does not hang.

Debug logs

 ______   ______   ______  _______  
|      \ /      \ |      \|       \ 
 \$$$$$$|  $$$$$$\ \$$$$$$| $$$$$$$\
  | $$  | $$ __\$$  | $$  | $$__| $$
  | $$  | $$|    \  | $$  | $$    $$   ROM collection manager
  | $$  | $$ \$$$$  | $$  | $$$$$$$\
 _| $$_ | $$__| $$ _| $$_ | $$  | $$   v1.6.3
|   $$ \ \$$    $$|   $$ \| $$  | $$
 \$$$$$$  \$$$$$$  \$$$$$$ \$$   \$$


[20:18:46.321] INFO:  running
[20:18:46.326] WARN:  No DAT files provided, consider using some for the best results!
[20:18:46.339] INFO:  ROMScanner: scanning ROM files
[20:18:46.393] DEBUG: ROMScanner: found 3 ROM files
[20:18:50.806] INFO:  ROMScanner: done scanning ROM files
โœ“ Scanning for ROMs ยทยทยทยทยทยทยทยทยทยทยทยท | 114 unique ROMs found
[20:18:50.815] INFO:  HeaderProcessor: processing file headers
[20:18:50.833] DEBUG: HeaderProcessor: found headers in 0 ROMs
[20:18:50.834] INFO:  HeaderProcessor: done processing file headers
โœ“ Detecting ROM headers ยทยทยทยทยทยทยทยท | 114 ROMs processed
[20:18:50.842] INFO:  DATInferrer: inferring DATs for 114 ROMs
[20:18:50.844] DEBUG: DATInferrer: inferred 1 DAT
[20:18:50.850] INFO:  DATInferrer: done inferring DATs
[20:18:50.851] INFO:  processing 1 DAT
[20:18:50.857] INFO:  CandidateFilter: input: generating candidates
[20:18:50.867] DEBUG: CandidateFilter: input: 114 unique ROMs found
[20:18:52.026] TRACE: CandidateFilter: input: Eye of the Beholder (USA): found 1 candidate
[20:18:52.786] TRACE: CandidateFilter: input: Lunar - Eternal Blue (USA) (RE): found 1 candidate
[20:18:53.793] TRACE: CandidateFilter: input: Lunar - The Silver Star (USA) (RE): found 1 candidate
[20:18:53.797] DEBUG: CandidateFilter: input: generated 1.5GiB of 3 candidates for 3 parents
[20:18:53.798] INFO:  CandidateFilter: input: done generating candidates: 2s
[20:18:53.800] INFO:  PatchCandidateGenerator: input: generating patched candidates
[20:18:53.804] DEBUG: PatchCandidateGenerator: input: 0 unique patches found
[20:18:53.806] INFO:  PatchCandidateGenerator: input: done generating patched candidates
[20:18:53.821] INFO:  CandidateFilter: input: filtering candidates
[20:18:53.827] TRACE: CandidateFilter: input: Eye of the Beholder (USA): 1 candidate before filtering
[20:18:53.834] TRACE: CandidateFilter: input: Eye of the Beholder (USA): 1 candidate after filtering
[20:18:53.836] TRACE: CandidateFilter: input: Lunar - Eternal Blue (USA) (RE): 1 candidate before filtering
[20:18:53.842] TRACE: CandidateFilter: input: Lunar - Eternal Blue (USA) (RE): 1 candidate after filtering
[20:18:53.844] TRACE: CandidateFilter: input: Lunar - The Silver Star (USA) (RE): 1 candidate before filtering
[20:18:53.847] TRACE: CandidateFilter: input: Lunar - The Silver Star (USA) (RE): 1 candidate after filtering
[20:18:53.851] DEBUG: CandidateFilter: input: filtered to 1.5GiB of 3 candidates for 3 parents
[20:18:53.859] INFO:  CandidateFilter: input: done filtering candidates
[20:18:53.861] INFO:  ROMWriter: input: writing 3 candidates
[20:18:53.871] TRACE: ROMWriter: input: Eye of the Beholder (USA): writing 1 candidate
[20:18:53.877] TRACE: ROMWriter: input: Lunar - Eternal Blue (USA) (RE): writing 1 candidate
[20:18:53.879] TRACE: ROMWriter: input: Lunar - The Silver Star (USA) (RE): writing 1 candidate
[20:18:56.942] TRACE: ROMWriter: input: Lunar - Eternal Blue (USA) (RE): no zip archives to write
[20:19:04.432] TRACE: ROMWriter: input: input/Lunar - Eternal Blue (USA) (RE).zip writing to output/Lunar - Eternal Blue (USA) (RE).zip
[20:19:04.521] TRACE: ROMWriter: input: Lunar - The Silver Star (USA) (RE): no zip archives to write
[20:19:04.525] TRACE: ROMWriter: input: input/Lunar - The Silver Star (USA) (RE).zip writing to output/Lunar - The Silver Star (USA) (RE).zip
โš™ Processing DATs ยทยทยทยทยทยทยทยทยทยทยทยทยทยท | โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘
โœŽ input ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท | โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ | 2/3

Process is hung at this point. Worth noting that Lunar - The Silver Star (USA) (RE),zip and Lunar - Eternal Blue (USA) (RE).zip are successfully copied at this point, where Eye of the Beholder (USA).zip is not.

igir version

1.6.3

Node.js version

18.12.0

Operating system

Linux

Additional context

No response

Drop log level for output token replacement failure messages

Is your feature request related to a problem?

No response

Describe the solution you'd like

To reduce spam, drop the log level for output token replacement failure messages (e.g. {pocket} and {mister}) from WARN to INFO.

This will require docs/ updating that warns about the current spam, as well.

Additional context

#315

Check for updates on startup

Is your feature request related to a problem?

No

Describe the solution you'd like

Upon startup of igir, asynchronously check for new versions (via npm, via GitHub releases, etc.) and log if a new one exists.

Additional context

No response

Multi-disc gamelist creation

https://wiki.batocera.org/cd_image_formats#multi-disc_games

Some disc-based emulators won't support zip files, so would be nice to generate these kinds of solutions. The problem you see as a user is you end up with multiple copies of a game in the UI (unclear if it launches each disc, havent tried).

May be out of scope for this project, and there may be other formats or other solutions. Super adjacent though and somehow could be nice as part of the copy-to-sorted story.

An improved addition woudl be to allow folder creation per game:

https://wiki.batocera.org/cd_image_formats#a_subfolder_for_each_multi-disc_game

Feels a little gross to do this for every single emulator though just to support disc-based ones in a single command.

Either way it looks like the .m3u is still needed. Maybe could just be an option to generate m3us when there are multi disc games, and an additional option to generate a folder per rom (which maybe you can pull off today w/ the output tokens, didnt eval).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.