opticaldiscs 0.4.3

Format-agnostic optical disc image reading and filesystem browsing (ISO, BIN/CUE, CHD)
docs.rs failed to build opticaldiscs-0.4.3
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.

opticaldiscs

CI License: GPL-3.0

Format-agnostic optical disc image reading and filesystem browsing for Rust.

Provides a unified SectorReader abstraction that handles the cooked/raw sector translation across three container formats — ISO, BIN/CUE, and CHD — with filesystem browsers for ISO 9660, HFS, HFS+, and SGI EFS on top.

Status: Early development. See PLAN.md for the implementation roadmap.

CHD support

opticaldiscs-rs reads CHD optical images via libchdman-rs, which wraps MAME's official chd_file core. This provides byte-for-byte parity with the chdman tool — including subcode handling, audio byte-swapping, and per-track frame semantics — at the cost of needing to link MAME's C++ code.

By default, opticaldiscs-rs enables libchdman-rs's prebuilt feature, which downloads a pre-built static archive matching the build target from libchdman-rs's GitHub Releases instead of compiling MAME from source. This keeps CI build times in seconds, not minutes.

When you might need to override prebuilt behavior

Situation Set env var
Target triple isn't covered by libchdman-rs's prebuilt matrix LIBCHDMAN_PREBUILT_FALLBACK=1
Local development without network access LIBCHDMAN_FORCE_SOURCE=1
Linux: pick a specific glibc floor for the prebuilt archive LIBCHDMAN_GLIBC=2.31 (or 2.35, 2.39)

See libchdman-rs's README for the full list of supported targets, glibc floors, and escape hatches.

Features

Capability Status
ISO sector reader Phase 2
BIN/CUE sector reader (raw 2352-byte) Phase 3
CHD sector reader Phase 4
TOC + MusicBrainz/FreeDB DiscID Phase 5 (toc feature)
Disc format + filesystem auto-detection Phase 6
ISO 9660 filesystem browser Phase 7
HFS / HFS+ filesystem browser Phase 8
SGI Volume Header + EFS filesystem browser (IRIX CDs) 0.3.0
Physical optical drive enumeration Phase 9 (drives feature)

Quick Example

use opticaldiscs::detect::DiscImageInfo;
use opticaldiscs::browse;

let info = DiscImageInfo::open("disc.iso")?;
println!("Volume: {:?}", info.volume_label);
println!("Filesystem: {}", info.filesystem.display_name());

let mut fs = browse::open_disc_filesystem(&info)?;
let root = fs.root()?;
for entry in fs.list_directory(&root)? {
    println!("{:<40} {}", entry.name, entry.size_string());
}

Cargo.toml

# git dependency while API stabilises
opticaldiscs = { git = "https://github.com/dani/opticaldiscs-rs" }

# with optional features
opticaldiscs = { git = "...", features = ["toc", "drives"] }

Feature Flags

Flag Enables Extra deps
toc DiscTOC, MusicBrainz DiscID, FreeDB ID sha1, base64
drives list_drives() — enumerate physical optical drives

Used By

License

GPL-3.0 — see LICENSE.