use std::path::PathBuf;
use anyhow::Context;
use bytesize::ByteSize;
use clap::Parser;
use flac_tracksplit::split_one_file;
use rayon::prelude::*;
use tracing::error;
use tracing_subscriber::prelude::*;
use tracing_subscriber::EnvFilter;
#[derive(Debug, Parser)]
#[command(author, version, about, long_about=None)]
struct Args {
paths: Vec<PathBuf>,
#[arg(long, default_value = "./")]
output_dir: PathBuf,
#[arg(long, default_value = "2kB")]
metadata_padding: ByteSize,
}
fn main() -> anyhow::Result<()> {
let indicatif_layer = tracing_indicatif::IndicatifLayer::new();
let filter = EnvFilter::builder()
.with_default_directive(tracing_subscriber::filter::LevelFilter::INFO.into())
.from_env_lossy();
let writer = indicatif_layer.get_stderr_writer();
let app_log_layer = tracing_subscriber::fmt::layer()
.with_target(false)
.compact()
.with_writer(writer);
tracing_subscriber::registry()
.with(filter)
.with(app_log_layer)
.with(indicatif_layer)
.init();
let args = Args::parse();
let base_path = args.output_dir.as_path();
let metadata_padding: u32 = args
.metadata_padding
.as_u64()
.try_into()
.context("--metadata-padding should fit into a 32-bit unsigned int")?;
if let Err(err) = args
.paths
.into_par_iter()
.panic_fuse()
.try_for_each(|path| {
split_one_file(&path, base_path, metadata_padding)
.map(|_| ())
.with_context(|| format!("splitting {:?}", path))
})
{
error!(error = %err);
Err(err)
} else {
Ok(())
}
}