selene-core 0.4.2

selene-core is the backend for Selene, a local-first music player
Documentation
use std::process::Command;

use serde::{Deserialize, Serialize};

use crate::media_container::{Codec, ContainerFormat};

pub const BITRATE_128K: u32 = 128_000;
pub const BITRATE_192K: u32 = 192_000;
pub const BITRATE_256K: u32 = 256_000;
pub const BITRATE_320K: u32 = 320_000;

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub struct TranscodeSettings {
    pub from_format: Option<ContainerFormat>,
    pub from_codec: Option<Codec>,
    pub target: TranscodeTarget,
}

impl TranscodeSettings {
    #[must_use] 
    pub fn to_flac(from_format: Option<ContainerFormat>, from_codec: Option<Codec>) -> Self {
        Self {
            from_format,
            from_codec,
            target: TranscodeTarget::Flac(FlacEncoderSettings::default()),
        }
    }

    #[must_use] 
    pub fn is_lossless(&self) -> bool {
        matches!(self.target, TranscodeTarget::Flac(_))
    }

    pub fn add_ffmpeg_args(&self, command: &mut Command) {
        match self.target {
            TranscodeTarget::Flac(flac_encoder_settings) => {
                flac_encoder_settings.add_ffmpeg_args(command);
            }
        }
    }

    #[must_use] 
    pub fn container_codec(&self) -> (ContainerFormat, Codec) {
        match self.target {
            TranscodeTarget::Flac(_) => (ContainerFormat::Flac, Codec::Flac),
        }
    }
}

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum TranscodeTarget {
    Flac(FlacEncoderSettings),
}

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub struct FlacEncoderSettings {
    pub compression_level: u8,
}

impl FlacEncoderSettings {
    pub fn add_ffmpeg_args(&self, command: &mut Command) {
        command
            .args(["-f", "flac", "-c:a", "flac", "-compression_level"])
            .arg(self.compression_level.to_string());
    }
}

impl Default for FlacEncoderSettings {
    fn default() -> Self {
        Self {
            compression_level: 5,
        }
    }
}