selene-core 0.4.2

selene-core is the backend for Selene, a local-first music player
Documentation
use std::{ops::Deref, path::PathBuf};

use crate::{
    config::common::LoudnormSettings,
    database::LibraryDb,
    library::{loudnorm::LoudnormAnalysis, track::track_meta::TrackMeta},
    media_container::MediaContainer,
};
use blake3::Hash;
use lunar_lib::database::EntryId;
use serde::{Deserialize, Serialize};

pub(crate) mod internal;

pub mod core_impls;
pub mod frontend_impls;
pub mod trait_impls;

pub mod lyric_data;
pub mod track_meta;

pub const UNKNOWN_TITLE: &str = "UNKNOWN TITLE";

/// Track root. Defines file info, container info, metadata info
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Track {
    id: TrackId,
    pub(crate) src_container: MediaContainer,
    pub(crate) lib_container: Option<MediaContainer>,
    pub relative_library_path: PathBuf,

    pub metadata: TrackMeta,

    pub(crate) loudnorm_analysis: Option<LoudnormAnalysis>,
    pub(crate) applied_loudnorm: Option<LoudnormSettings>,

    version: u32,
}

#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq, Hash)]
pub struct TrackId {
    id: Hash,
}

impl EntryId for TrackId {
    type Entry = Track;
    type IdDb = LibraryDb;
}

impl Deref for TrackId {
    type Target = [u8; 32];

    fn deref(&self) -> &Self::Target {
        self.id.as_bytes()
    }
}

impl TrackId {
    pub(crate) fn new(id: Hash) -> Self {
        Self { id }
    }

    #[must_use] 
    pub fn to_selene_id(&self) -> String {
        format!("track:{}", self.id)
    }
}