v2: The parent/clone infer, slice, and dice edition
You're gonna be in a great mood all day, because you're going to be parent/cloning your troubles away with igir
. Stop having a boring ROM collection, stop having a boring life.
🚀 New features
Parent/clone inference
A number of DAT groups, such as Redump, don't provide parent/clone information in their DATs. Unless you use a tool such as SabreTools you won't be able to create 1G1R sets from these DATs.
No longer! igir
can now associate most games together into parent/clone sets. There is no other widely used ROM manager that has this feature.
Here are some variants igir
can group together with ease:
- Differing regions
- Differing languages
- Differing release types (alpha, beta, debug, demo, prototype, sample, etc.) - including No-Intro, TOSEC, and GoodTools style tags!
- Differing retail types (collector's edition, limited edition, reprint, rerelease, etc.)
One caveat is: igir
isn't able to group together games that have different localized names, i.e. Pokemon - Blue Version (USA, Europe) (SGB Enhanced)
and Pokemon - Edicion Azul (Spain) (SGB Enhanced)
.
As the updated docs say, this type of inference will never be perfect, so please open a GitHub issue if you find a scenario that isn't working right!
MAME unmerged/split/merged set creation
igir
can now use parent/clone information from MAME DATs to create full un-merged, un-merged, split, and merged ROM sets.
This change comes with a whole new set of arcade documentation to explain merge types and how to build ROM sets for arcade emulators. The DATs page has also been updated with arcade information.
Other than CHD scanning, handling ROM set merging was one of the last major feature gaps igir
had vs. other ROM managers.
🐞 Fixes
Non-preferred ROMs are now reported as "ignored"
When running igir
in 1G1R (--single
) mode, both CLI & CSV reports would indicate that clones that were not written to the output directory were "missing." Now, the preferred clone from a parent/clone set is reported as "found," and all others are reported as "ignored."
Thank you @feurry for this bug report!
"Unmatched" ROMs in reports are now called "unused"
To more accurately describe what's actually happening, files in input directories that are not used as a source for any output file are now described as "unused."
The word "unmatched" was confusing because it could imply these files did not match any DAT, which might not be the case. Files might not be used because they're a duplicate, were filtered out, or weren't preferred based on 1G1R (--single
) settings.
Thank you @feurry for this suggestion!
CLI & CSV reports now respect --only-device
This was an oversight in v1.8.1.
Zip files are re-read for testing
Since v1.7.0, zip files in the output directory were not being re-read from disk in order to test them. This was a bug with some efficiency features added in that version.
📐 Command & option consistency
The --fixdat
option has been replaced with the fixdat
command
The --fixdat
option was the only option to cause file output, so for consistency, it was turned into a command.
The --fixdat
option will still work for now, but it will print a deprecation warning when used.
The --*-filter
options have been renamed to --filter-*
Other options that share similar behavior also share common prefixes, such as --dir-*
and --prefer-*
, so the --*-filter
options (--language-filter
, --region-filter
) got the same prefix treatment.
The --*-filter
options will still work for now, but they will print a deprecation warning when used.
The --dat-regex*
options have been renamed to --dat-name-regex*
...and new --dat-description-regex*
options have been added.
Unofficial MAME XML DATs, in particular, tend to have fairly sparse information in their name, so it may be desirable to filter based on their description instead.
The --dat-regex*
options will still work for now, but they will print a deprecating warning when used.
📂 Output token updates
{batocera}
Support has been added for:
- Nintendo DS
- Nintendo 3DS
Huge shoutout to @dcramer for their code contribution and GitHub Sponsors support!
🙏 Thank you
I started igir
in July 2022 because I was excited to eventually receive my Analogue Pocket preorder, but also because I was frustrated by the existing ROM management tools available. I found other tools unintuitive, lacking 1G1R functionality, and locked to single operating systems. And as a fallible software engineer, I thought I could do better.
Some stats about igir
:
- 7.7k downloads on npm and GitHub combined
- 170 stars on GitHub
- 592 pull requests merged on GitHub
- 11 feature requests reported & implemented, from 8 contributors
- 20 bugs reported & fixed, from 10 contributors
- 24,477 current lines of TypeScript
- 2 community code contributors
I just want to say thank you to everyone who has given me support on GitHub or Reddit, or even if you've just used igir
once. This is easily the most popular code project I've ever managed, and I can't wait to see where it goes in the following years 🚀.
All changes
23 September 2023 - 33a016d
- v2.0.0 (#687)
23 September 2023 - c334118
- Feature: DAT description regex options (#679)
23 September 2023 - 33e0f27
- Docs: usage updates (#686)
23 September 2023 - b1fb461
- Fix: fixdat command rather than option (#566)
23 September 2023 - 0987692
- Fix: --filter option prefix consistency (#565)
23 September 2023 - a9f7353
- Fix: rename UNMATCHED report status to UNUSED (#668)
23 September 2023 - 8688d68
- Fix: don't report non-preferred clones as missing (#667)
22 September 2023 - 1c9366d
- Fix: catch & log ROM header processing exceptions (#685)
22 September 2023 - 2e609e6
- Refactor: default --merge-roms fullnonmerged (#684)
22 September 2023 - 4701b8a
- Refactor: reformat the DAT processing progress bar (#683)
22 September 2023 - 4ee5583
- Fix: create a fresh Zip object when testing (#682)
22 September 2023 - 551436a
- Fix: Array[0] is not guaranteed to be defined (#680)
22 September 2023 - d141497
- CI: lower Renovate's TypeScript priority (#681)
22 September 2023 - f46ed92
- Docs: update (#678)
21 September 2023 - 0765e9d
- Feature: infer parent/child relationships between games (#542)
21 September 2023 - c952f2c
- Feature: DAT ROM merger & splitter (#666)
21 September 2023 - 86efbdd
- Refactor: start enums at 1 (#677)
21 September 2023 - caafc5b
- CI: don't limit concurrency on github.head_ref for on:pull_request (#675)
21 September 2023 - acefe02
- Fix: only consider writing candidates with files (#674)
21 September 2023 - 375f3bc
- Refactor: eliminate some Array.indexOf() calls (#673)
21 September 2023 - 12668c2
- Fix: reports should respect --only-device (#672)
20 September 2023 - ca868b4
- Chore: pin dependencies (#671)
20 September 2023 - 3033bc0
- Refactor: use 'beforeExit' to cleanup the temp directory (#669)
20 September 2023 - 9d1b98d
- Chore: update dependency node to v18.18.0 (#664)
20 September 2023 - 89c9a81
- Refactor: adopt some eslint-plugin-unicorn linter rules (#670)
19 September 2023 - cef793b
- Feature: Add NDS and 3DS token support (#647)
19 September 2023 - 5c08cf9
- Chore: pin dependencies (#665)
19 September 2023 - f37d511
- Feature: MAME ListXML support (#650)
18 September 2023 - 1732918
- Refactor: create ROMProps interface (#663)
16 September 2023 - 4e693b6
- Chore: TypeScript module & moduleResolution: node16 (#662)
16 September 2023 - c347e94
- CI: comment back on the version bump PR after publishing to npm (#661)
igir
, and other open-source projects like it, are a labor of love. They wouldn't be nearly as meaningful without the community supporting them. Constructive feedback and general positivity will always be welcome. Be kind to others, and be kind to yourselves.