use torrent::metainfo::{Metainfo, Mode};
use tracing_subscriber::EnvFilter;
fn main() {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.init();
let data = include_bytes!("data/ubuntu-26.04-live-server-amd64.iso.torrent");
let meta = Metainfo::try_from(data).expect("failed to parse .torrent file");
println!("=== Torrent Metadata ===");
println!("Tracker URL: {}", meta.announce);
println!("Info hash: {:02x?}", meta.info_hash());
println!("Piece length: {} bytes", meta.info.piece_length);
println!("Total size: {} bytes", meta.info.total_size());
println!("Number of pieces: {}", meta.info.num_pieces());
if let Some(date) = meta.creation_date {
println!("Created: {}", date);
}
if let Some(ref comment) = meta.comment {
println!("Comment: {}", comment);
}
if let Some(ref created_by) = meta.created_by {
println!("Created by: {}", created_by);
}
if !meta.announce_list.is_empty() {
println!();
println!("=== Tracker Tiers ===");
for (i, tier) in meta.announce_list.iter().enumerate() {
println!(" Tier {}:", i);
for url in tier {
println!(" {}", url);
}
}
}
match &meta.info.mode {
Mode::Single { name, length } => {
println!();
println!("=== File Layout (single-file) ===");
println!(" {} ({} bytes)", name, length);
}
Mode::Multiple { name, files } => {
println!();
println!("=== File Layout (multi-file) ===");
println!(" Root: {}", name);
for f in files {
println!(" {} ({} bytes)", f.path.join("/"), f.length);
}
}
}
}