use std::fs;
use crate::{
database::{DatabaseEntry, DatabaseError},
errors::{ExportError, FfmpegError},
ffmpeg,
library::{album::AlbumId, track::Track},
};
impl Track {
pub fn db_find_by_title(name: impl AsRef<str>) -> Result<Vec<Self>, DatabaseError> {
let name = name.as_ref();
let mut items = Vec::new();
for item_raw in Self::tree().iter().values() {
let item: Self = ciborium::from_reader(&item_raw?[..])?;
if item.metadata.title.as_deref() == Some(name) {
items.push(item);
}
}
Ok(items)
}
pub fn db_find_by_album(album: AlbumId) -> Result<Vec<Self>, DatabaseError> {
let mut items = Vec::new();
for item_raw in Self::tree().iter().values() {
let item: Self = ciborium::from_reader(&item_raw?[..])?;
if let Some(album_reference) = item.metadata.album.as_ref()
&& album_reference.album == album
{
items.push(item);
}
}
Ok(items)
}
pub fn apply_metadata_to_file(&self) -> Result<(), ExportError> {
if let Some(lib_container) = self.lib_container() {
let tmp = lib_container.path().with_added_extension(".tmp");
ffmpeg::export_set_metadata(self, &tmp)?;
fs::rename(tmp, lib_container.path())?;
} else {
return Err(FfmpegError::Other(
"Input track does not have a library file to export from".to_owned(),
)
.into());
}
Ok(())
}
}