caesura 0.11.2

An all-in-one command line tool to **transcode FLAC** audio files and **upload to gazelle** based indexers/trackers.
Documentation
use crate::fs::FlacFile;
use crate::logging::Colors;
use crate::naming::{SourceName, TrackName};
use crate::source::{Metadata, Source};
use colored::Colorize;
use log::info;
use regex::Regex;

pub struct Shortener;

impl Shortener {
    #[must_use]
    pub fn shorten_album(metadata: &Metadata) -> Option<Metadata> {
        let result = remove_parenthetical_suffix(&metadata.album);
        match result {
            None => None,
            Some(album) => {
                let mut metadata = metadata.clone();
                metadata.album = album;
                Some(metadata)
            }
        }
    }

    pub fn suggest_track_name(flac: &FlacFile) {
        if let Some(file_name) = TrackName::get(flac) {
            let difference = flac.file_name.len() - file_name.len();
            if difference > 0 {
                info!(
                    "{} track could save {difference} characters: {}",
                    "Renaming".bold(),
                    file_name.gray()
                );
            }
        }
    }

    pub fn suggest_album_name(source: &Source) {
        if let Some(shortened) = Shortener::shorten_album(&source.metadata) {
            let before = SourceName::get(&source.metadata);
            let after = SourceName::get(&shortened);
            let difference = before.len() - after.len();
            if difference > 0 {
                info!(
                    "{} directory could save {difference} characters: {}",
                    "Renaming".bold(),
                    after.gray()
                );
            }
        }
    }
}

fn remove_parenthetical_suffix(input: &str) -> Option<String> {
    let result = Regex::new(r"^(.*)(\(.*\))$")
        .expect("Regex should compile")
        .captures(input);
    match result {
        None => None,
        Some(captures) => {
            let shortened = captures.get(1).expect("Should have captures").as_str();
            let shortened = shortened.trim();
            if shortened.len() > 4 {
                Some(shortened.to_owned())
            } else {
                None
            }
        }
    }
}