CLI options, and better path/string handling

This commit is contained in:
Andrew Radev
2019-02-24 11:23:58 +02:00
parent 711314fe57
commit 432ee8f8b6
4 changed files with 68 additions and 43 deletions

View File

@ -1,21 +1,33 @@
use std::env;
use std::process;
use std::path::PathBuf;
use structopt::StructOpt;
use id3_image::embed_image;
#[derive(StructOpt, Debug)]
#[structopt(name = "id3-image-embed")]
struct Opt {
/// Verbose mode (-v, -vv, -vvv, etc.)
#[structopt(short = "v", long = "verbose", parse(from_occurrences))]
verbose: u8,
/// Music file to embed image into
#[structopt(name = "music-file.mp3", required = true, parse(from_os_str))]
music_filename: PathBuf,
/// Image file to embed
#[structopt(name = "image-file.jpg", required = true, parse(from_os_str))]
image_filename: PathBuf,
}
fn main() {
let args: Vec<_> = env::args().collect();
let opt = Opt::from_args();
if args.len() < 3 {
eprintln!("USAGE: id3-image-embed <mp3-file> <image-file>");
process::exit(1);
}
let music_filename = args[1].clone();
let image_filename = args[2].clone();
if let Err(e) = embed_image(&music_filename, &image_filename) {
if let Err(e) = embed_image(&opt.music_filename, &opt.image_filename) {
eprintln!("{}", e);
process::exit(1);
}
if opt.verbose >= 1 {
println!("Embedded {:?} into {:?}", opt.image_filename, opt.music_filename);
}
}

View File

@ -1,28 +1,41 @@
use std::env;
use std::process;
use std::path::PathBuf;
use structopt::StructOpt;
use id3_image::extract_image;
#[derive(StructOpt, Debug)]
#[structopt(name = "id3-image-embed")]
struct Opt {
/// Verbose mode (-v, -vv, -vvv, etc.)
#[structopt(short = "v", long = "verbose", parse(from_occurrences))]
verbose: u8,
/// Music file to extract image from
#[structopt(name = "music-file.mp3", required = true, parse(from_os_str))]
music_filename: PathBuf,
/// (Optional) Output image: defaults to music filename with .jpg extension
#[structopt(name = "image-file.jpg", parse(from_os_str))]
image_filename: Option<PathBuf>,
}
fn main() {
let args: Vec<_> = env::args().collect();
let opt = Opt::from_args();
if args.len() < 2 {
eprintln!("USAGE: id3-image-extract <mp3-file> [image-file]");
process::exit(1);
}
let image_filename = opt.image_filename.clone().
unwrap_or_else(|| opt.music_filename.with_extension("jpg"));
let music_filename = args[1].clone();
let image_filename = args.get(2).cloned().unwrap_or_else(|| replace_extension(&music_filename, "jpg"));
if let Err(e) = extract_image(&music_filename, &image_filename) {
if let Err(e) = extract_image(&opt.music_filename, &image_filename) {
eprintln!("{}", e);
process::exit(1);
}
}
fn replace_extension(path: &str, replacement: &str) -> String {
let mut path = PathBuf::from(&path);
path.set_extension(replacement);
path.to_string_lossy().to_string()
if opt.verbose == 1 {
// then just print the output filename for scripting purposes:
println!("{}", image_filename.display());
} else if opt.verbose >= 2 {
// show a longer status message:
println!("Extracted cover art from {:?} to {:?}", opt.music_filename, image_filename);
}
}