use std::env;
use std::fs;
use std::process;
use remata::{
AtomMeta,
Id3,
RiffMeta,
AsfMeta,
AiffMeta,
Vob
};
pub enum Meta {
Atom(AtomMeta),
Id3(Id3),
Aiff(AiffMeta),
Asf(AsfMeta),
Riff(RiffMeta),
}
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
eprintln!("Usage: {} <file>", args[0]);
process::exit(1);
}
let file_path = &args[1];
let data = match fs::read(file_path) {
Ok(d) => d,
Err(e) => {
eprintln!("Failed to read file {}: {}", file_path, e);
process::exit(1);
}
};
if data.starts_with(b"fLaC") || data.starts_with(b"OggS") {
match Vob::parse(&data) {
Ok(v) => println!("{}", v),
Err(e) => {
eprintln!("Failed to parse VOB file: {}", e.message);
process::exit(1);
}
}
} else if data.starts_with(b"ID3") {
match Id3::parse(&data) {
Ok(id) => println!("{}", id),
Err(e) => {
eprintln!("Failed to parse ID3: {}", e.message);
process::exit(1);
}
}
} else if data.len() > 8 && &data[4..8] == b"ftyp" {
match AtomMeta::parse(&data) {
Ok(meta) => println!("{}", meta),
Err(e) => {
eprintln!("Failed to parse MP4/M4A metadata: {}", e.message);
process::exit(1);
}
}
} else if data.starts_with(b"FORM") && data.len() > 8 && &data[8..12] == b"AIFF" {
match AiffMeta::parse(&data) {
Ok(aiff) => println!("{}", aiff),
Err(e) => {
eprintln!("Failed to parse AIFF metadata: {}", e.message);
process::exit(1);
}
}
} else if data.starts_with(b"RIFF") && data.len() > 8 && &data[8..12] == b"WAVE" {
match RiffMeta::parse(&data) {
Ok(riff) => println!("{}", riff),
Err(e) => {
eprintln!("Failed to parse RIFF metadata: {}", e.message);
process::exit(1);
}
}
} else if data.starts_with(b"0&\xB2\x75") {
match AsfMeta::parse(&data) {
Ok(asf) => println!("{}", asf),
Err(e) => {
eprintln!("Failed to parse ASF metadata: {}", e.message);
process::exit(1);
}
}
} else {
eprintln!("Unsupported file format");
process::exit(1);
}
}