Skip to main content

dinorefurb-disc-archiver

Every copy command shows this notice and refuses to run until you accept it (--accept-personal-use on the command line, a tick box in the window). Every output folder gets a PERSONAL-ARCHIVE-ONLY.txt with the same text.

What it does

It reads a disc with an established dumping program, then writes the copy in the formats you choose, from the most complete to the ones people most often have. It reads each format back and compares it with the dump, so a restoration can test its fingerprinting and asset import against every form a player's copy may come in, and know that each of them holds the same disc.

Reading the disc (--backend):

Backend Program What it keeps
redumper redumper Everything: every sector of every track, subchannel, lead-in and lead-out, copy-protection data, C2 error checks and rereads. The Redump-quality archival dump.
cdrdao cdrdao and its toc2cue Every raw sector of data and audio tracks, with pregaps. No subchannel or protection data.
data-copy none The data track's 2,048-byte sectors as an ISO. No audio. For data-only discs on a computer without either program.

auto (the default) works down that list:

  1. redumper, if it is installed, in the download's tools/ folder, or already downloaded;
  2. otherwise the pinned redumper release, downloaded from GitHub. The window asks first; the command downloads unless given --no-download;
  3. if the download is declined or fails, cdrdao, if it is installed;
  4. otherwise the data track copy, which reads no audio. The log says so, and a disc profile that expects audio tracks reports the mismatch.

Asking for --backend redumper downloads it the same way, but fails rather than falling back. The backend's own files (redumper's .scram, .subcode, .toc and .log, for example) are kept unchanged in the archival folder.

Downloading redumper

The release to download is pinned in src/dinorefurb_disc_archiver/redumper.json: a tag and the SHA-256 of each platform's zip. A download is used only when its SHA-256 matches the pin, or, for a platform the pin leaves null, the digest GitHub publishes for that asset; a download with neither is refused. It is unpacked, unmodified, into your own data folder under its tag, so a new pin downloads its own copy:

System Folder
Windows %LOCALAPPDATA%\dinorefurb-disc-archiver\redumper\<tag>
macOS ~/Library/Application Support/dinorefurb-disc-archiver/redumper/<tag>
Linux $XDG_DATA_HOME/dinorefurb-disc-archiver/redumper/<tag> (default ~/.local/share)

DISC_ARCHIVER_HOME moves that folder. disc-archiver install-redumper downloads it ahead of time, and disc-archiver tools says whether it is there. Downloading redumper is the archiver's only use of the network.

Writing the copy (--format, repeat for several):

Format Files Holds
bincue-split one .bin per track and a .cue Every raw sector, pregaps included: the Redump layout.
bincue one .bin and a .cue The same in one file. Read by most tools and by the toolkit's OriginalContentSource.
ccd .ccd, .img, .sub Every raw sector; the subchannel is generated from the table of contents, not read from the disc.
chd .chd Every raw sector, compressed by MAME's chdman. Needs chdman.
iso-flac .iso, one .flac per audio track, .cue Data user data and lossless audio from each track's INDEX 01. Needs ffmpeg.
iso-wav .iso, one .wav per audio track, .cue The same with WAV audio: the DOSBox-style sheet.
iso-ogg .iso, one .ogg per audio track, .cue The form many re-releases ship. Lossy. Needs ffmpeg.
iso .iso The data track's user data only. Audio tracks are left out.
files a directory The data track's files, with Joliet names where the disc has them, and their dates.

--format all writes every format that can be made. --format recommended, the default, writes what the disc profile recommends.

Programs are found on PATH, or through DISC_ARCHIVER_REDUMPER, DISC_ARCHIVER_CDRDAO, DISC_ARCHIVER_TOC2CUE, DISC_ARCHIVER_CHDMAN and DISC_ARCHIVER_FFMPEG. A format whose program is missing is skipped and reported; the others are still written.

Install

Download (no Python needed)

Download the zip for your computer from the toolkit's releases and unpack it anywhere:

File For
disc-archiver-<version>-windows-x64.zip Windows 10 and 11
disc-archiver-<version>-macos-arm64.zip Macs with Apple silicon
disc-archiver-<version>-linux-x64.zip 64-bit Linux

Each holds the window and the command, ready to run:

disc-archiver-<version>-windows-x64/
  Disc Archiver.exe          the window: double-click it
  disc-archiver.exe          the command, for a terminal
  tools/                     put chdman or ffmpeg here if you want those formats
  README.txt
  PERSONAL-ARCHIVE-ONLY.txt

On macOS the window is Disc Archiver.app, and on Linux disc-archiver-gui. The builds are not code-signed yet: on Windows choose More info and Run anyway if SmartScreen stops it; on macOS right-click the app and choose Open, or allow it under System Settings > Privacy & Security.

redumper is downloaded the first time you copy a disc (see Downloading redumper). Programs placed in tools/ (or tools/<name>/bin/) beside the executables are found first, so a redumper you downloaded yourself, chdman or ffmpeg can be dropped in there too.

With Python

For development, scripts and people who already have Python 3.12 or later. The window needs Tk, which the python.org installers for Windows and macOS include (on Debian and Ubuntu, install python3-tk).

pipx install dinorefurb-disc-archiver     # or: uv tool install dinorefurb-disc-archiver

This installs the same disc-archiver command and disc-archiver-gui window. redumper is downloaded on first use in the same way, or install it yourself and put it on PATH (or set DISC_ARCHIVER_REDUMPER).

Use it

The window

Double-click Disc Archiver (or run disc-archiver-gui). To start with a restoration's disc profile selected:

"Disc Archiver.exe" --profile path\to\disc-profile.json     # the download, on Windows
disc-archiver-gui --profile path/to/disc-profile.json         # installed with Python

Tick the notice, choose the drive (or an image you already made), the game's profile and the folder, and press Make the copy. The formats the profile recommends are ticked already.

The command

Everything the window does, the command does too, for scripts and for people who prefer a terminal. In the download it is disc-archiver.exe (Windows) or ./disc-archiver; installed with Python it is disc-archiver.

disc-archiver --help                                     # commands; disc-archiver <command> --help for options
disc-archiver tools                                      # backends, programs and drives found
disc-archiver install-redumper                           # download the pinned redumper now
disc-archiver rip --drive E: --output "D:\Discs\My Game" --name "My Game" \
    --profile disc-profile.json --accept-personal-use
disc-archiver rip --drive /dev/sr0 --output ~/discs/game --format all --accept-personal-use
disc-archiver convert --input "My Game.cue" --output ~/discs/game --format iso --format files \
    --accept-personal-use                                # formats from a copy you already have
disc-archiver check --input "My Game.cue" --profile disc-profile.json
disc-archiver formats                                    # every format, most complete first
disc-archiver notice                                     # the personal-use notice

convert and check read .cue (one or several BIN files, ISO-plus-WAVE sheets), .iso, .ccd and .chd (through chdman). rip passes --backend-arg values on to the backend program, for example --backend-arg=--retries=20 for redumper, and --no-download keeps it from downloading redumper. Progress goes to standard error and the summary to standard output.

Exit codes: 0 done and verified, 1 failed, 2 usage error or notice not accepted, 3 a profile check failed or a written format differs from its source.

On Windows, if redumper cannot open the drive, start the window or the terminal as administrator. On Linux, add yourself to the group that owns the drive (often cdrom).

Building the download

cd packages/disc-archiver
python -m pip install . -r packaging/requirements.txt
python packaging/build_bundle.py --out dist      # --no-gui-smoke without a display

It builds for the platform it runs on with PyInstaller and starts both executables before zipping them. --with-redumper also carries the pinned redumper in tools/redumper/ with its GPL-3.0 licence, checked the same way as a download, for a zip that works offline. CI builds all three platforms on every pull request and attaches them to each release.

The output folder

My Game/
  PERSONAL-ARCHIVE-ONLY.txt
  rip-manifest.json
  archival/      the backend's dump, as it wrote it (rip only)
  bincue/        My Game.cue, My Game.bin, PERSONAL-ARCHIVE-ONLY.txt
  iso/           My Game.iso, PERSONAL-ARCHIVE-ONLY.txt
  files/         My Game/ (the disc's files), PERSONAL-ARCHIVE-ONLY.txt

rip-manifest.json records:

  • disc: the layout, the volume identifier (each byte read as the Latin-1 character of the same value without the trailing spaces and NULs, as the .NET OriginalContentSource.Label reads it, or null when it is all padding), each track's start, pregap and length, the SHA-256 of the data track's user data from INDEX 01, and the SHA-256 of each audio track's samples from INDEX 01 to the next track's INDEX 00. These hashes are the same whichever format holds the disc, so they are what restorations' fingerprints and the formats are compared by.
  • profile.checks: each expectation of the profile and what the disc showed.
  • outputs: each format's files, with size, CRC32, MD5, SHA-1 and SHA-256 (the hashes disc databases such as Redump list, so you can check your dump against them yourself), what the format leaves out or generates (notes), and its verification:
    • matched: everything the source holds was compared and agreed.
    • partial: everything compared agreed, and notCompared lists what the format does not hold or could not be compared: audio left out of an ISO, lossy Ogg audio, sound in a pregap that ISO-plus-audio formats drop.
    • mismatched: differences says what differs.
  • unavailable: formats that could not be made from this source, and why. A plain ISO has no raw sectors, so no BIN/CUE, CloneCD or CHD can be made from it.

Disc profiles

A restoration describes its disc in a profile file (schema) and keeps it in its own repository:

{
  "$schema": "https://raw.githubusercontent.com/kibertoad/refurbished-dinosaurs-toolkit/main/schemas/disc-profile.schema.json",
  "profile": 1,
  "title": "Example Game, English retail CD-ROM",
  "restoration": "example-game-restored",
  "layout": "mixed-mode",
  "volumeIdentifier": "EXAMPLE",
  "audioTracks": 11,
  "expectedPaths": ["DATA"],
  "recommendedFormats": ["bincue"],
  "notes": "Shown in the window under the profile."
}

layout is data-only (one ISO 9660 track) or mixed-mode (a data track followed by CD audio). recommendedFormats are the formats the restoration's importer reads, and are ticked by default. Any expectation the profile leaves out is not checked. The built-in profiles are any, data-only and mixed-mode; without a recommendation a data-only disc gets iso and anything else gets bincue, which keeps the audio. A copy with no raw sectors falls back to iso.

Python

from pathlib import Path

from dinorefurb_disc_archiver import derive, fingerprint, load_profile, open_source

with open_source(Path("game.cue"), Path("work"), print) as disc:
    print(fingerprint(disc))
    derive(disc, Path("out"), "game", ["bincue", "iso"], load_profile("mixed-mode"), print, {})

The supported imports are the names in dinorefurb_disc_archiver.__all__.

Limits

  • Single-session discs only. A cue sheet's first track must start at INDEX 01 00:00:00; POSTGAP, MODE2/2336, CDG and MOTOROLA files are refused.
  • Cue sheets are limited to 1 MiB and 99 tracks, profiles to 64 KiB, file systems to 200,000 files.
  • data-copy stops at the first sector that still fails after five reads. Nothing stands in for an unread sector.
  • The CloneCD subchannel is generated, not read: it carries no copy-protection marks. Use the redumper dump in archival when they matter.
  • Drives are listed on Windows and Linux. On macOS, give --drive as redumper names it.

Metadata

Release files for dinorefurb-disc-archiver 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dinorefurb-disc-archiver 1.0.0
File Size Uploaded
dinorefurb_disc_archiver-1.0.0.tar.gz 61.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dinorefurb-disc-archiver 1.0.0
File Interpreter ABI Platform
dinorefurb_disc_archiver-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 116.6 kB

Release files / dinorefurb_disc_archiver-1.0.0.tar.gz

Download URL dinorefurb_disc_archiver-1.0.0.tar.gz
Size 61.2 kB
Tags Source
SHA-256 checksum
How to use checksums
68a9d4ac054b474969dda0b92081a5fb93df44fc3497e60c895bd96d5728fe53
BLAKE2b-256 checksum
How to use checksums
6bf09c2f09c10647bfc4466da192c97f05ccff391f7370af9d8902604c0e2fcf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.

Transparency log

Release files / dinorefurb_disc_archiver-1.0.0-py3-none-any.whl

Download URL dinorefurb_disc_archiver-1.0.0-py3-none-any.whl
Size 55.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c0a559d13239a46fd9d292711749c3b9deba28f0e8e4c4c3809d9b1a79d2d38d
BLAKE2b-256 checksum
How to use checksums
195b40219c1a5c50e2289e33ab6b0dc78f70a7f770f52228f7b7fff33f01319c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.

Transparency log

Release history Release notifications | RSS feed

4.4.2

2 release files

4.4.1

2 release files

4.4.0

2 release files

4.3.0

2 release files

4.2.0

2 release files

4.1.0

2 release files

4.0.0

2 release files

3.1.0

2 release files

3.0.0

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.0

2 release files

This release

1.0.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page