pub mod apply;
pub mod info;
pub mod max_amplitude;
pub mod replaygain;
pub mod tags;
pub mod threading;
pub mod undo;
pub mod utils;
use anyhow::Result;
use colored::*;
use crate::cli::options::{Options, OutputFormat, StoredTagMode};
use crate::cli::parse_args::expand_files_recursive;
use apply::{cmd_apply, cmd_apply_channel};
use info::cmd_info;
use max_amplitude::cmd_max_amplitude;
use replaygain::{cmd_album_gain, cmd_album_gain_per_directory, cmd_track_gain};
use tags::{cmd_check_tags, cmd_delete_tags};
use undo::cmd_undo;
pub fn run(mut opts: Options) -> Result<()> {
if opts.files.is_empty() {
eprintln!("{}: no files specified", "error".red().bold());
std::process::exit(1);
}
if opts.recursive {
opts.files = expand_files_recursive(&opts.files)?;
if opts.files.is_empty() {
eprintln!("{}: no audio files found (MP3/M4A)", "error".red().bold());
std::process::exit(1);
}
}
threading::install_global_pool(threading::effective_threads(&opts));
if opts.assume_mpeg2 && !opts.quiet && opts.output_format == OutputFormat::Text {
eprintln!(
"{}: -f (assume MPEG2) is accepted for compatibility but has no effect",
"note".cyan()
);
}
if opts.force_recalc
&& !opts.use_stored_tags
&& !opts.quiet
&& opts.output_format == OutputFormat::Text
{
eprintln!(
"{}: -s r (force recalculation) is accepted for compatibility but has no effect (recalculation is the default; use -s R to reuse stored tags)",
"note".cyan()
);
}
if opts.use_stored_tags
&& !opts.stored_tags_usable()
&& !opts.quiet
&& opts.output_format == OutputFormat::Text
{
eprintln!(
"{}: -s R is ignored with -s r, -d/-m modifiers, or --rg2/--r128; files will be re-analyzed",
"note".cyan()
);
}
if opts.max_amplitude_only {
return cmd_max_amplitude(&opts.files, &opts);
}
if opts.stored_tag_mode == StoredTagMode::Delete {
return cmd_delete_tags(&opts.files, &opts);
}
if opts.stored_tag_mode == StoredTagMode::Check {
return cmd_check_tags(&opts.files, &opts);
}
if opts.undo {
return cmd_undo(&opts.files, &opts);
}
if opts.album_gain && !opts.skip_album {
if opts.per_directory {
return cmd_album_gain_per_directory(&opts.files, &opts);
}
return cmd_album_gain(&opts.files, &opts);
}
if opts.track_gain || opts.skip_album {
return cmd_track_gain(&opts.files, &opts);
}
if let Some((channel, steps)) = opts.channel_gain {
return cmd_apply_channel(&opts.files, channel, steps, &opts);
}
if let Some(steps) = opts.gain_steps {
cmd_apply(&opts.files, steps, &opts)
} else {
cmd_info(&opts.files, &opts)
}
}