From 3a8069d1a46578c810f24c7b1b092251ffc22c39 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Thu, 9 Jan 2020 12:05:15 +0100 Subject: Even more stuff --- src/main.rs | 86 +++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 47 insertions(+), 39 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index 3939e17..63bbbf0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,8 @@ use std::io; use std::fs::File; use argparse::{ArgumentParser, StoreTrue, Store}; -use crate::options::{EncodingOptions, Options}; +use crate::options::Options; +use crate::id3v2::{ID3v2, Frame}; mod encoding; mod error; @@ -9,57 +10,64 @@ mod id3v2; mod options; mod util; -fn main() -> io::Result<()> { - let options = { - let mut options: Options = Default::default(); +fn parse_options_into(opt: &mut Options) { + let mut ap = ArgumentParser::new(); + ap.set_description("ID3v2 tag editor/fixer. Incomplete/work-in-progress."); + + ap.refer(&mut opt.write) + .add_option(&["-w", "--write"], StoreTrue, + "Write updated information instead of just displaying. Unmodified or unknown tags are preserved as-is."); - { - let mut ap = ArgumentParser::new(); - ap.set_description("ID3v2 tag editor/fixer. Incomplete/work-in-progress."); + ap.refer(&mut opt.latin1_as_utf8) + .add_option(&["--assume-utf8"], StoreTrue, + "Assume that all strings specified in the MP3 as Latin-1 are really UTF-8."); - ap.refer(&mut options.write) - .add_option(&["-w", "--write"], StoreTrue, - "Write updated information instead of just displaying. Unmodified or unknown tags are preserved as-is."); + ap.refer(&mut opt.set_tags.album) .add_option(&["-A", "--album"], Store, "Set/replace album"); + ap.refer(&mut opt.set_tags.artist).add_option(&["-a", "--artist"], Store, "Set/replace artist"); + ap.refer(&mut opt.set_tags.title) .add_option(&["-t", "--title"], Store, "Set/replace title"); + ap.refer(&mut opt.set_tags.track) .add_option(&["-T", "--track"], Store, "Set/replace track number (num or num/num)"); + ap.refer(&mut opt.set_tags.year) .add_option(&["-y", "--year"], Store, "Set/replace year"); - ap.refer(&mut options.latin1_as_utf8) - .add_option(&["--assume-utf8"], StoreTrue, - "Assume that all strings specified in the MP3 as Latin-1 are really UTF-8."); + ap.refer(&mut opt.file) + .required() + .add_argument("file", Store, + "File to operate on (probably a .mp3)"); - ap.refer(&mut options.set_tags.album) .add_option(&["-A", "--album"], Store, "Set/replace album"); - ap.refer(&mut options.set_tags.artist).add_option(&["-a", "--artist"], Store, "Set/replace artist"); - ap.refer(&mut options.set_tags.title) .add_option(&["-t", "--title"], Store, "Set/replace title"); - ap.refer(&mut options.set_tags.track) .add_option(&["-T", "--track"], Store, "Set/replace track number (num or num/num)"); - ap.refer(&mut options.set_tags.year) .add_option(&["-y", "--year"], Store, "Set/replace year"); + ap.parse_args_or_exit(); +} - ap.refer(&mut options.file) - .required() - .add_argument("file", Store, - "File to operate on (probably a .mp3)"); +fn parse_options() -> Options { + let mut options = Default::default(); + parse_options_into(&mut options); + options +} - ap.parse_args_or_exit(); +fn print_tag(tag: &ID3v2) -> io::Result<()> { + for frame in &tag.frames { + match frame.interpret()? { + Some(Frame::TALB(album)) => println!("Album : '{}'", album), + Some(Frame::TIT2(title)) => println!("Title : '{}'", title), + Some(Frame::TPE1(artist)) => println!("Artist: '{}'", artist), + Some(Frame::TYER(year)) => println!("Year : '{}'", year), + Some(Frame::TRCK(track)) => println!("Track : '{}'", track), + None => { + println!("Unknown frame: {:?}", frame); + } } + } + Ok(()) +} - options - }; +fn main() -> io::Result<()> { + let options = parse_options(); - let mut f = File::open(options.file)?; - let tag = id3v2::ID3v2::from_stream(&mut f)?; + let tag = ID3v2::from_stream(&mut File::open(options.file)?)?; // println!("{:?}", tag); // TODO: apply changes from options here + // Use RawFrame::map_string - for frame in tag.frames { - match frame.interpret(&EncodingOptions { latin1_as_utf8: options.latin1_as_utf8 })? { - Some(id3v2::Frame::TALB(album)) => println!("Album : '{}'", album), - Some(id3v2::Frame::TIT2(title)) => println!("Title : '{}'", title), - Some(id3v2::Frame::TPE1(artist)) => println!("Artist: '{}'", artist), - Some(id3v2::Frame::TYER(year)) => println!("Year : '{}'", year), - Some(id3v2::Frame::TRCK(track)) => println!("Track : '{}'", track), - None => { - println!("Unknown frame: {:?}", frame); - } - } - } + print_tag(&tag)?; // TODO: if -w, then write tags to file (if it fits) -- cgit v1.2.3