use std::{ops::Deref, str::FromStr};
use crate::{
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 cover_art;
pub mod lyric_data;
pub mod track_meta;
pub const UNKNOWN_TITLE: &str = "UNKNOWN TITLE";
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Track {
id: TrackId,
pub(crate) container: MediaContainer,
pub metadata: TrackMeta,
pub(crate) loudnorm_analysis: Option<LoudnormAnalysis>,
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 FromStr for TrackId {
type Err = <Hash as FromStr>::Err;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(Self {
id: Hash::from_str(s)?,
})
}
}
impl TrackId {
pub(crate) fn new(id: Hash) -> Self {
Self { id }
}
#[must_use]
pub fn to_hash(&self) -> Hash {
self.id
}
#[must_use]
pub fn to_selene_id(&self) -> String {
format!("track:{}", self.id)
}
}