Crates.io | nodtool |
lib.rs | nodtool |
version | 1.4.4 |
source | src |
created_at | 2024-09-05 02:05:12.838272 |
updated_at | 2024-10-18 06:11:59.874493 |
description | CLI tool for verifying and converting GameCube and Wii disc images. |
homepage | |
repository | https://github.com/encounter/nod |
max_upload_size | |
id | 1364079 |
size | 2,210,990 |
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:
This crate includes a command-line tool called nodtool
.
Download the latest release from the releases page, or install it using Cargo:
cargo install --locked nodtool
Displays information about a disc image.
nodtool info /path/to/game.iso
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]
Converts any supported format to raw ISO.
nodtool convert /path/to/game.wia /path/to/game.iso
Hashes the contents of a disc image and verifies it.
nodtool verify /path/to/game.iso
Opening a disc image and reading a file:
use std::io::Read;
// Open a disc image and the first data partition.
let disc = nod::Disc::new("path/to/file.iso")
.expect("Failed to open disc");
let mut partition = disc.open_partition_kind(nod::PartitionKind::Data)
.expect("Failed to open data partition");
// Read partition metadata and the file system table.
let meta = partition.meta()
.expect("Failed to read partition metadata");
let fst = meta.fst()
.expect("File system table is invalid");
// Find a file by path and read it into a string.
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);
}
Converting a disc image to raw ISO:
// Enable `rebuild_encryption` to ensure the output is a valid ISO.
let options = nod::OpenOptions { rebuild_encryption: true, ..Default::default() };
let mut disc = nod::Disc::new_with_options("path/to/file.rvz", &options)
.expect("Failed to open disc");
// Read directly from the open disc and write to the output file.
let mut out = std::fs::File::create("output.iso")
.expect("Failed to create output file");
std::io::copy(&mut disc, &mut out)
.expect("Failed to write data");
Licensed under either of
at your option.
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.