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)
}
}