igir
TypeScript icon, indicating that this package has built-in type declarations

2.6.3 • Public • Published

🕹️ igir

Pronounced "eager," igir is a video game ROM collection manager to help filter, sort, patch, archive, and report on collections on any OS.

CLI: Windows,macOS,Linux npm: version npm: downloads GitHub: downloads GitHub: stars

Snyk: vulnerabilities codecov: coverage Code Climate: maintainability license

See the project website for complete documentation, installation & usage instructions, and examples!


What does igir do?

A video of an example use case:

asciicast

With igir you can manage a ROM collection of any size:

  • 🔍 Scan for DATs, ROMs, and ROM patches - including those in archives (see scanning & archive docs)
  • 📂 Organize ROM files by console (see DAT docs)
  • 🪄 Name ROM files consistently, including the right extension (see DAT docs)
  • ✂️ Filter out duplicate ROMs, or ROMs in languages you don't understand (see filtering docs)
  • 🗜️ Extract or archive ROMs in mass (see archive docs)
  • 🩹 Patch ROMs automatically in mass (see scanning & patching docs)
  • 🎩 Parse ROMs with headers, and optionally remove them (see header docs)
  • ↔️ Build & re-build (un-merge, split, or merge) MAME ROM sets (see arcade docs)
  • 🔮 Report on what ROMs are present or missing for each console, and create fixdats for missing ROMs (see reporting & DAT docs)

How do I run igir?

Either download the latest version for your OS from the releases page, or if you have Node.js installed you can use npx to always run the latest version from the command line:

npx igir@latest [commands..] [options]

Here is the full help message which shows all available options and a number of common use case examples:

$ igir --help

 ______   ______   ______  _______
|      \ /      \ |      \|       \
 \$$$$$$|  $$$$$$\ \$$$$$$| $$$$$$$\
  | $$  | $$|    \  | $$  | $$    $$   ROM collection manager
  | $$  | $$|    \  | $$  | $$    $$   https://igir.io/
  | $$  | $$ \$$$$  | $$  | $$$$$$$\
 _| $$_ | $$__| $$ _| $$_ | $$  | $$   v2.6.3
|   $$ \ \$$    $$|   $$ \| $$  | $$
 \$$$$$$  \$$$$$$  \$$$$$$ \$$   \$$


Usage: igir [commands..] [options]

Commands (can specify multiple):
  igir copy     Copy ROM files from the input to output directory
  igir move     Move ROM files from the input to output directory
  igir link     Create links in the output directory to ROM files in the
                 input directory
  igir extract  Extract ROM files in archives when copying or moving
  igir zip      Create zip archives of ROMs when copying or moving
  igir test     Test ROMs for accuracy after writing them to the output
                directory
  igir dir2dat  Generate a DAT from all input files
  igir fixdat   Generate a fixdat of any missing games for every DAT pro
                cessed (requires --dat)
  igir clean    Recycle unknown files in the output directory
  igir report   Generate a CSV report on the known & unknown ROM files f
                ound in the input directories (requires --dat)

ROM input options:
  -i, --input               Path(s) to ROM files or archives (supports g
                            lobbing)                  [array] [required]
  -I, --input-exclude       Path(s) to ROM files or archives to exclude
                            from processing (supports globbing)  [array]
      --input-min-checksum  The minimum checksum level to calculate and
                            use for matching
          [choices: "CRC32", "MD5", "SHA1", "SHA256"] [default: "CRC32"]

DAT input options:
  -d, --dat                            Path(s) to DAT files or archives
                                       (supports globbing)       [array]
      --dat-exclude                    Path(s) to DAT files or archives
                                       to exclude from processing (suppo
                                       rts globbing)             [array]
      --dat-name-regex                 Regular expression of DAT names t
                                       o process                [string]
      --dat-name-regex-exclude         Regular expression of DAT names t
                                       o exclude from processing[string]
      --dat-description-regex          Regular expression of DAT descrip
                                       tions to process         [string]
      --dat-description-regex-exclude  Regular expression of DAT descrip
                                       tions to exclude from processing
                                                                [string]
      --dat-combine                    Combine every game from every fou
                                       nd & filtered DAT into one DAT
                                                               [boolean]
      --dat-ignore-parent-clone        Ignore any parent/clone informati
                                       on found in DATs        [boolean]

Patch input options:
  -p, --patch          Path(s) to ROM patch files or archives (supports
                       globbing) (supported: .aps, .bps, .dps, .ebp, .ip
                       s, .ips32, .ppf, .rup, .ups, .vcdiff, .xdelta)
                                                                 [array]
  -P, --patch-exclude  Path(s) to ROM patch files or archives to exclude
                        from processing (supports globbing)      [array]

ROM output options (processed in order):
  -o, --output               Path to the ROM output directory (supports
                             replaceable symbols, see below)    [string]
      --dir-mirror           Use the input subdirectory structure for th
                             e output directory                [boolean]
  -D, --dir-dat-name         Use the DAT name as the output subdirectory
                                                               [boolean]
      --dir-dat-description  Use the DAT description as the output subdi
                             rectory                           [boolean]
      --dir-letter           Group games in an output subdirectory by th
                             e first --dir-letter-count letters in their
                              name                             [boolean]
      --dir-letter-count     How many game name letters to use for the s
                             ubdirectory name      [number] [default: 1]
      --dir-letter-limit     Limit the number of games in letter subdire
                             ctories, splitting into multiple subdirecto
                             ries if necessary                  [number]
      --dir-letter-group     Group letter subdirectories into ranges, co
                             mbining multiple letters together (requires
                              --dir-letter-limit)              [boolean]
      --dir-game-subdir      Append the name of the game as an output su
                             bdirectory depending on its ROMs
          [choices: "never", "multiple", "always"] [default: "multiple"]
  -O, --overwrite            Overwrite any files in the output directory
                                                               [boolean]
      --overwrite-invalid    Overwrite files in the output directory tha
                             t are the wrong filesize, checksum, or zip
                             contents                          [boolean]
  -C, --clean-exclude        Path(s) to files to exclude from cleaning (
                             supports globbing)                  [array]
      --clean-dry-run        Don't clean any files and instead only prin
                             t what files would be cleaned     [boolean]

ROM zip command options:
  -Z, --zip-exclude   Glob pattern of files to exclude from zipping
                                                                [string]
      --zip-dat-name  Group all ROMs from the same DAT into the same zip
                       archive, if not excluded from zipping (enforces -
                      -dat-threads 1)                          [boolean]

ROM link command options:
      --symlink           Creates symbolic links instead of hard links
                                                               [boolean]
      --symlink-relative  Create symlinks as relative to the target path
                          , as opposed to absolute             [boolean]

ROM header options:
      --header          Glob pattern of files to force header processing
                         for                                    [string]
  -H, --remove-headers  Remove known headers from ROMs, optionally limit
                        ed to a list of comma-separated file extensions
                        (supported: .a78, .fds, .lnx, .nes, .smc)
                                                                [string]

ROM set options:
      --merge-roms             ROM merge/split mode (requires DATs with
                               parent/clone information)
  [choices: "fullnonmerged", "nonmerged", "split", "merged"] [default: "
                                                         fullnonmerged"]
      --allow-incomplete-sets  Allow writing games that don't have all o
                               f their ROMs                    [boolean]

ROM filtering options:
  -x, --filter-regex          Regular expression of game names to filter
                               to                               [string]
  -X, --filter-regex-exclude  Regular expression of game names to exclud
                              e                                 [string]
  -L, --filter-language       List of comma-separated languages to filte
                              r to (supported: DA, DE, EL, EN, ES, FI, F
                              R, IT, JA, KO, NL, NO, PT, RU, SV, ZH)
                                                                [string]
  -R, --filter-region         List of comma-separated regions to filter
                              to (supported: ARG, ASI, AUS, BEL, BRA, CA
                              N, CHN, DAN, EUR, FRA, FYN, GER, GRE, HK,
                              HOL, ITA, JPN, KOR, MEX, NOR, NZ, POR, RUS
                              , SPA, SWE, TAI, UK, UNK, USA, WORLD)
                                                                [string]
      --no-bios               Filter out BIOS files, opposite of --only-
                              bios                             [boolean]
      --no-device             Filter out MAME devies, opposite of --only
                              -device                          [boolean]
      --no-unlicensed         Filter out unlicensed ROMs, opposite of --
                              only-unlicensed                  [boolean]
      --only-retail           Filter to only retail releases, enabling a
                              ll the following "no" options    [boolean]
      --no-debug              Filter out debug ROMs, opposite of --only-
                              debug                            [boolean]
      --no-demo               Filter out demo ROMs, opposite of --only-d
                              emo                              [boolean]
      --no-beta               Filter out beta ROMs, opposite of --only-b
                              eta                              [boolean]
      --no-sample             Filter out sample ROMs, opposite of --only
                              -sample                          [boolean]
      --no-prototype          Filter out prototype ROMs, opposite of --o
                              nly-prototype                    [boolean]
      --no-program            Filter out program application ROMs, oppos
                              ite of --only-program            [boolean]
      --no-aftermarket        Filter out aftermarket ROMs, opposite of -
                              -only-aftermarket                [boolean]
      --no-homebrew           Filter out homebrew ROMs, opposite of --on
                              ly-homebrew                      [boolean]
      --no-unverified         Filter out unverified ROMs, opposite of --
                              only-unverified                  [boolean]
      --no-bad                Filter out bad ROM dumps, opposite of --on
                              ly-bad                           [boolean]

One game, one ROM (1G1R) options:
  -s, --single                 Output only a single game per parent (1G1
                               R) (required for all options below, requi
                               res DATs with parent/clone information)
                                                               [boolean]
      --prefer-game-regex      Regular expression of game names to prefe
                               r                                [string]
      --prefer-rom-regex       Regular expression of ROM filenames to pr
                               efer                             [string]
      --prefer-verified        Prefer verified ROM dumps over unverified
                                                               [boolean]
      --prefer-good            Prefer good ROM dumps over bad  [boolean]
  -l, --prefer-language        List of comma-separated languages in prio
                               rity order (supported: DA, DE, EL, EN, ES
                               , FI, FR, IT, JA, KO, NL, NO, PT, RU, SV,
                                ZH)                             [string]
  -r, --prefer-region          List of comma-separated regions in priori
                               ty order (supported: ARG, ASI, AUS, BEL,
                               BRA, CAN, CHN, DAN, EUR, FRA, FYN, GER, G
                               RE, HK, HOL, ITA, JPN, KOR, MEX, NOR, NZ,
                                POR, RUS, SPA, SWE, TAI, UK, UNK, USA, W
                               ORLD)                            [string]
      --prefer-revision-newer  Prefer newer ROM revisions over older
                                                               [boolean]
      --prefer-revision-older  Prefer older ROM revisions over newer
                                                               [boolean]
      --prefer-retail          Prefer retail releases (see --only-retail
                               )                               [boolean]
      --prefer-ntsc            Prefer NTSC ROMs over others    [boolean]
      --prefer-pal             Prefer PAL ROMs over others     [boolean]
      --prefer-parent          Prefer parent ROMs over clones  [boolean]

Report options:
      --report-output  Report output location (formatted with moment.js)
              [string] [default: "./igir_%YYYY-%MM-%DDT%HH:%mm:%ss.csv"]

Help & debug options:
      --dat-threads     Number of DATs to process in parallel
                                                   [number] [default: 3]
      --reader-threads  Maximum number of ROMs to read in parallel per d
                        isk                        [number] [default: 8]
      --writer-threads  Maximum number of ROMs to write in parallel
                                                   [number] [default: 4]
      --write-retry     Number of additional retries to attempt when wri
                        ting a file has failed (0 disables retries)
                                                   [number] [default: 2]
      --disable-cache   Disable the file and archive entry checksum cach
                        e                                      [boolean]
  -v, --verbose         Enable verbose logging, can specify up to three
                        times (-vvv)                             [count]
  -h, --help            Show help                              [boolean]

------------------------------------------------------------------------

Advanced usage:

  Tokens that are replaced when generating the output (--output) path of
   a ROM:
    {datName}         The name of the DAT that contains the ROM (e.g. "N
    intendo - Game Boy")
    {datDescription}  The description of the DAT that contains the ROM
    {gameRegion}      The region of the ROM release (e.g. "USA"), each R
    OM can have multiple
    {gameLanguage}    The language of the ROM release (e.g. "En"), each
    ROM can have multiple
    {gameType}        The type of the game (e.g. "Retail", "Demo", "Prot
    otype")

    {inputDirname}    The input file's dirname
    {outputBasename}  Equivalent to "{outputName}.{outputExt}"
    {outputName}      The output file's filename without extension
    {outputExt}       The output file's extension

    {adam}      The ROM's emulator-specific /ROMS/* directory for the 'A
    dam' image (e.g. "GB")
    {batocera}  The ROM's emulator-specific /roms/* directory for Batoce
    ra (e.g. "gb")
    {es}        The ROM's emulator-specific /roms/* directory for the 'E
    mulationStation' image (e.g. "gb")
    {funkeyos}  The ROM's emulator-specific /* directory for FunKey OS (
    e.g. "Game Boy")
    {jelos}     The ROM's emulator-specific /roms/* directory for JELOS
    (e.g. "gb")
    {minui}     The ROM's emulator-specific /Roms/* directory for MinUI
    (e.g. "Game Boy (GB)")
    {mister}    The ROM's core-specific /games/* directory for the MiSTe
    r FPGA (e.g. "Gameboy")
    {miyoocfw}  The ROM's emulator-specific /roms/* directory for MiyooC
    FW (e.g. "GB")
    {onion}     The ROM's emulator-specific /Roms/* directory for OnionO
    S/GarlicOS (e.g. "GB")
    {pocket}    The ROM's core-specific /Assets/* directory for the Anal
    ogue Pocket (e.g. "gb")
    {retrodeck} The ROM's emulator-specific /roms/* directory for the 'R
    etroDECK' image (e.g. "gb")
    {romm}      The ROM's manager-specific /roms/* directory for 'RomM'
    (e.g. "gb")
    {twmenu}    The ROM's emulator-specific /roms/* directory for TWiLig
    htMenu++ on the DSi/3DS (e.g. "gb")

Example use cases:

  Merge new ROMs into an existing ROM collection and delete any unrecogn
  ized files:
    igir copy clean --dat "*.dat" --input New-ROMs/ --input ROMs/ --outp
    ut ROMs/

  Organize and zip an existing ROM collection:
    igir move zip --dat "*.dat" --input ROMs/ --output ROMs/

  Generate a report on an existing ROM collection, without copying or mo
  ving ROMs (read only):
    igir report --dat "*.dat" --input ROMs/

  Produce a 1G1R set per console, preferring English ROMs from USA>WORLD
  >EUR>JPN:
    igir copy --dat "*.dat" --input "**/*.zip" --output 1G1R/ --dir-dat-
    name --single --prefer-language EN --prefer-region USA,WORLD,EUR,JPN

  Copy all Mario, Metroid, and Zelda games to one directory:
    igir copy --input ROMs/ --output Nintendo/ --filter-regex "/(Mario|M
    etroid|Zelda)/i"

  Copy all BIOS files into one directory, extracting if necessary:
    igir copy extract --dat "*.dat" --input "**/*.zip" --output BIOS/ --
    only-bios

  Create patched copies of ROMs in an existing collection, not overwriti
  ng existing files:
    igir copy extract --input ROMs/ --patch Patches/ --output ROMs/

  Re-build a MAME ROM set for a specific version of MAME:
    igir copy zip --dat "MAME 0.258.dat" --input MAME/ --output MAME-0.2
    58/ --merge-roms split

  Copy ROMs to an Analogue Pocket and test they were written correctly:
    igir copy extract test --dat "*.dat" --input ROMs/ --output /Assets/
    {pocket}/common/ --dir-letter

Feature requests, bug reports, and contributing

Feedback is a gift! Your feature requests and bug reports help improve the project for everyone. Feel free to submit an issue on GitHub using one of the templates.

Even better, if you feel comfortable writing code, please feel free to submit a pull request against the project! Please see the full contribution guidelines for rules to follow.


GitHub: contributors GitHub: bugs GitHub: feature requests GitHub: discussions Hacktoberfest: participant

Package Sidebar

Install

npm i igir

Homepage

igir.io/

Weekly Downloads

513

Version

2.6.3

License

GPL-3.0-or-later

Unpacked Size

1.3 MB

Total Files

288

Last publish

Collaborators

  • emmercm