selene-core 0.9.0-rc.1

Backend for selene-server
Documentation
use std::{fs, path::PathBuf};

use lunar_lib::paths::cache_dir;

use crate::{
    library::track::Track,
    transcoding::{
        decoder::Decoder,
        encoder::{OpusEncoderBitrate, OpusTranscodeError, OpusTranscoder},
    },
};

impl Track {
    pub fn load_cached_opus(
        &self,
        base_name: impl std::fmt::Display,
        quality: OpusEncoderBitrate,
    ) -> Result<PathBuf, OpusTranscodeError> {
        let path = cache_dir().join(format!(
            "transcodings/{base_name}_{}.opus",
            quality.bitrate()
        ));

        if path.try_exists()? {
            return Ok(path);
        }

        let decoder = Decoder::from_track(self, 512 * 1024)?;
        let mut encoder = OpusTranscoder::new(decoder, quality, None)?;

        let parent = cache_dir().join("transcodings");
        fs::create_dir_all(parent)?;
        let writer = fs::OpenOptions::new()
            .write(true)
            .create(true)
            .truncate(true)
            .open(&path)?;

        encoder.encode_to_io(writer)?;
        Ok(path)
    }
}