Skip to main content

selene_core/library/
track.rs

1use std::{ops::Deref, path::PathBuf};
2
3use crate::{
4    config::common::LoudnormConfig, database::EntryId, ffmpeg::loudnorm::LoudnormAnalysis,
5    library::track::track_meta::TrackMeta, media_container::MediaContainer,
6};
7use blake3::Hash;
8use serde::{Deserialize, Serialize};
9
10pub(crate) mod internal;
11
12pub mod core_impls;
13pub mod frontend_impls;
14pub mod trait_impls;
15
16pub mod lyric_data;
17pub mod track_meta;
18
19pub const UNKNOWN_TITLE: &str = "UNKNOWN TITLE";
20
21/// Track root. Defines file info, container info, metadata info
22#[derive(Serialize, Deserialize, Debug, Clone)]
23pub struct Track {
24    id: TrackId,
25    pub(crate) src_container: MediaContainer,
26    pub(crate) lib_container: Option<MediaContainer>,
27    pub relative_library_path: PathBuf,
28
29    pub metadata: TrackMeta,
30
31    pub(crate) loudnorm_analysis: Option<LoudnormAnalysis>,
32    pub(crate) applied_loudnorm: Option<LoudnormConfig>,
33
34    version: u32,
35}
36
37#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq, Hash)]
38pub struct TrackId {
39    id: Hash,
40}
41
42impl EntryId for TrackId {
43    type Entry = Track;
44}
45
46impl Deref for TrackId {
47    type Target = Hash;
48
49    fn deref(&self) -> &Self::Target {
50        &self.id
51    }
52}
53
54impl TrackId {
55    pub(crate) fn new(id: Hash) -> Self {
56        Self { id }
57    }
58}