Rust crate for reading GameCube and Wii disc images
Go to file
Luke Street 1895b7df3f Fixes & bump to version 1.0.0 2024-02-22 23:49:28 -07:00
.github/workflows Fixes & bump to version 1.0.0 2024-02-22 23:49:28 -07:00
nod Fixes & bump to version 1.0.0 2024-02-22 23:49:28 -07:00
nodtool Fixes & bump to version 1.0.0 2024-02-22 23:49:28 -07:00
.gitignore Restore all functionality, split lib/bin & integrate redump validation 2024-02-21 23:14:07 -07:00
Cargo.lock Fixes & bump to version 1.0.0 2024-02-22 23:49:28 -07:00
Cargo.toml Restore all functionality, split lib/bin & integrate redump validation 2024-02-21 23:14:07 -07:00
LICENSE-APACHE Fix LICENSE copyright 2021-08-25 14:54:52 -04:00
LICENSE-MIT Fix LICENSE copyright 2021-08-25 14:54:52 -04:00
README.md Add GCZ support, nodtool extract --partition, various fixes 2024-02-22 19:58:31 -07:00
deny.toml Restore all functionality, split lib/bin & integrate redump validation 2024-02-21 23:14:07 -07:00
rustfmt.toml WIP WIA/RVZ & more 2024-02-02 16:21:05 -07:00

README.md

nod Build Status Latest Version Api Rustdoc Rust Version

Library for traversing & reading Nintendo Optical Disc (GameCube and Wii) images.

Originally based on the C++ library nod, but does not currently support authoring.

Currently supported file formats:

  • ISO (GCM)
  • WIA / RVZ
  • WBFS (+ NKit 2 lossless)
  • CISO (+ NKit 2 lossless)
  • NFS (Wii U VC)
  • GCZ

CLI tool

This crate includes a command-line tool called nodtool.

info

Displays information about a disc image.

nodtool info /path/to/game.iso

extract

Extracts the contents of a disc image to a directory.

nodtool extract /path/to/game.iso [outdir]

For Wii U VC titles, use content/hif_000000.nfs:

nodtool extract /path/to/game/content/hif_000000.nfs [outdir]

convert

Converts any supported format to raw ISO.

nodtool convert /path/to/game.wia /path/to/game.iso

verify

Hashes the contents of a disc image and verifies it.

nodtool verify /path/to/game.iso

Library example

Opening a disc image and reading a file:

use std::io::Read;

use nod::{Disc, PartitionKind};

fn main() -> nod::Result<()> {
    let disc = Disc::new("path/to/file.iso")?;
    let mut partition = disc.open_partition_kind(PartitionKind::Data)?;
    let meta = partition.meta()?;
    let fst = meta.fst()?;
    if let Some((_, node)) = fst.find("/MP3/Worlds.txt") {
        let mut s = String::new();
        partition
            .open_file(node)
            .expect("Failed to open file stream")
            .read_to_string(&mut s)
            .expect("Failed to read file");
        println!("{}", s);
    }
    Ok(())
}

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.