selene-core 0.2.0

selene-core is the backend for Selene, a local-first music player
Documentation
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(())
    }
}