metadata 0.1.10

Media file metadata for human consumption
Documentation
extern crate metadata;

extern crate clap;
extern crate env_logger;
extern crate ffmpeg_next as ffmpeg;

use clap::App;
use metadata::{MediaFileMetadata, Render};
use std::io;
use std::path::Path;
use std::process;

fn main() {
    process::exit(if run_main() { 0 } else { 1 });
}

fn run_main() -> bool {
    env_logger::init();

    let matches = App::new("metadata")
        .version(env!("CARGO_PKG_VERSION"))
        .author("Zhiming Wang <metadata@zhimingwang.org>")
        .about("Media file metadata for human consumption.")
        .args_from_usage(
            "-c, --checksum     'Include file checksum(s)'
            -t, --tags          'Print metadata tags, except mundane ones'
            -A, --all-tags      'Print all metadata tags'
            <FILE>...           'Media file(s)'",
        )
        .get_matches();
    let files = matches.values_of("FILE").unwrap();
    let include_checksum = matches.is_present("checksum");
    let include_tags = matches.is_present("tags");
    let include_all_tags = matches.is_present("all-tags");

    let mut successful = true;

    if ffmpeg::init().is_err() {
        eprintln!("Error: failed to initialize libav*");
        return false;
    }
    unsafe {
        ffmpeg::ffi::av_log_set_level(ffmpeg::ffi::AV_LOG_FATAL);
    }

    let build_media_file_metadata = |file: &str| -> io::Result<MediaFileMetadata> {
        let mut meta = MediaFileMetadata::new(&file)?;
        meta.include_checksum(include_checksum)?
            .include_tags(include_tags)
            .include_all_tags(include_all_tags);
        Ok(meta)
    };

    for file in files {
        if !Path::new(file).is_file() {
            eprintln!("Error: \"{}\" does not exist or is not a file", file);
            successful = false;
            continue;
        }
        match build_media_file_metadata(&file) {
            Ok(m) => match m.render_default() {
                Ok(rendered) => println!("{}", rendered),
                Err(_) => {
                    eprintln!("Error: failed to render metadata for \"{}\"", file);
                    successful = false;
                }
            },
            Err(error) => {
                eprintln!("Error: {}", error);
                successful = false;
            }
        }
    }

    successful
}