From bac47e456085ea153ae6ae1b1e28e41868693c9c Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 18 Nov 2025 12:08:34 +0100 Subject: start reworking model --- common/src/lib.rs | 232 ++++++++++++++++++++++-------------------------------- 1 file changed, 95 insertions(+), 137 deletions(-) (limited to 'common/src/lib.rs') diff --git a/common/src/lib.rs b/common/src/lib.rs index 0cc9ab5..d09153e 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -15,7 +15,6 @@ pub use jellystream_types as stream; pub use chrono; -use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; use std::{ collections::{BTreeMap, BTreeSet}, @@ -46,7 +45,7 @@ macro_rules! url_enum { }; } -#[derive(Clone, Copy, Debug, Encode, Decode, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct NodeID(pub [u8; 32]); pub enum NodeIDOrSlug { @@ -54,15 +53,11 @@ pub enum NodeIDOrSlug { Slug(String), } -#[derive(Debug, Clone, Deserialize, Serialize, Default, Encode, Decode)] +#[derive(Debug, Clone, Deserialize, Serialize, Default)] pub struct Node { - #[serde(default)] pub slug: String, - #[serde(default)] pub parents: BTreeSet, pub kind: NodeKind, - pub poster: Option, - pub backdrop: Option, pub title: Option, pub subtitle: Option, pub tagline: Option, @@ -70,94 +65,78 @@ pub struct Node { pub release_date: Option, // in unix millis pub index: Option, pub media: Option, - #[serde(default)] - pub ratings: BTreeMap, pub federated: Option, - #[serde(default)] pub tags: BTreeSet, - #[serde(default)] - pub people: BTreeMap>, - #[serde(default)] - pub external_ids: BTreeMap, - #[serde(default)] + pub ratings: BTreeMap, + pub pictures: BTreeMap, + pub credits: BTreeMap>, + pub identifiers: Identifiers, pub visibility: Visibility, - #[serde(default)] pub storage_size: u64, } -#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Encode, Decode)] +#[derive(Debug, Clone, Deserialize, Serialize, Default)] +pub struct Identifiers(pub BTreeMap); + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, PartialOrd, Ord)] +#[serde(rename_all = "snake_case")] +pub enum PictureSlot { + Poster, + Cover, + Backdrop, + Headshot, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, PartialOrd, Ord)] +#[serde(rename_all = "snake_case")] +pub enum IdentifierType { + MusicbrainzRecording, + MusicbrainzArtist, + MusicbrainzRelease, + MusicbrainzReleaseGroup, + Isrc, + Trakt, + Imdb, + Tmdb, + Tvdb, + Omdb, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] pub struct Asset(pub String); -#[derive(Debug, Clone, Deserialize, Serialize, Default, Encode, Decode)] +#[derive(Debug, Clone, Deserialize, Serialize)] pub struct Appearance { - #[serde(default)] pub jobs: Vec, - #[serde(default)] pub characters: Vec, - pub person: Person, -} - -#[derive(Debug, Clone, Deserialize, Serialize, Default, Encode, Decode)] -pub struct Person { - pub name: String, - pub headshot: Option, - pub ids: ObjectIds, + pub node: NodeID, } -#[derive(Debug, Clone, Deserialize, Serialize, Default, Encode, Decode)] -pub struct ObjectIds { - pub trakt: Option, - pub slug: Option, - pub imdb: Option, - pub tmdb: Option, - pub omdb: Option, - pub tvdb: Option, +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, PartialOrd, Ord)] +#[serde(rename_all = "snake_case")] +pub enum CreditCategory { + Cast, + Writing, + Directing, + Art, + Sound, + Camera, + Lighting, + Crew, + Editing, + Production, + Vfx, + CostumeMakeup, + CreatedBy, + Performance, + Instrument, + Vocal, + Arranger, + Producer, + Engineer, } -url_enum!( - #[derive( - Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, PartialOrd, Ord, Encode, Decode, - )] - #[serde(rename_all = "snake_case")] - enum PeopleGroup { - Cast = "cast", - Writing = "writing", - Directing = "directing", - Art = "art", - Sound = "sound", - Camera = "camera", - Lighting = "lighting", - Crew = "crew", - Editing = "editing", - Production = "production", - Vfx = "vfx", - CostumeMakeup = "costume_makeup", - CreatedBy = "created_by", - // https://musicbrainz.org/relationships/artist-recording - // modelling after this, but its too many categories - Performance = "performance", - Instrument = "instrument", - Vocal = "vocal", - Arranger = "arranger", - Producer = "producer", - Engineer = "engineer", - } -); - -#[derive( - Debug, - Clone, - Copy, - Deserialize, - Serialize, - PartialEq, - Eq, - PartialOrd, - Ord, - Encode, - Decode, - Default, -)] +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, PartialOrd, Ord, Default)] #[serde(rename_all = "snake_case")] pub enum Visibility { Hidden, @@ -166,39 +145,24 @@ pub enum Visibility { Visible, } -url_enum!( - #[derive( - Debug, - Clone, - Copy, - Deserialize, - Serialize, - PartialEq, - Eq, - Default, - Encode, - Decode, - PartialOrd, - Ord, - )] - #[serde(rename_all = "snake_case")] - enum NodeKind { - #[default] - Unknown = "unknown", - Movie = "movie", - Video = "video", - Music = "music", - ShortFormVideo = "short_form_video", - Collection = "collection", - Channel = "channel", - Show = "show", - Series = "series", - Season = "season", - Episode = "episode", - } -); +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Default, PartialOrd, Ord)] +#[serde(rename_all = "snake_case")] +pub enum NodeKind { + #[default] + Unknown, + Movie, + Video, + Music, + ShortFormVideo, + Collection, + Channel, + Show, + Series, + Season, + Episode, +} -#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)] +#[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "snake_case")] pub enum TrackSource { Local(Asset), @@ -207,13 +171,13 @@ pub enum TrackSource { pub type TrackID = usize; -#[derive(Debug, Clone, Deserialize, Serialize, Hash, Encode, Decode, PartialEq, Eq)] +#[derive(Debug, Clone, Deserialize, Serialize, Hash, PartialEq, Eq)] pub struct LocalTrack { pub path: PathBuf, pub track: TrackID, } -#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)] +#[derive(Debug, Clone, Deserialize, Serialize)] pub struct MediaInfo { pub duration: f64, // in seconds pub tracks: Vec, @@ -221,14 +185,14 @@ pub struct MediaInfo { pub chapters: Vec, } -#[derive(Debug, Clone, Deserialize, Serialize, Default, Encode, Decode)] +#[derive(Debug, Clone, Deserialize, Serialize, Default)] pub struct Chapter { pub time_start: Option, pub time_end: Option, pub labels: Vec<(String, String)>, } -#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)] +#[derive(Debug, Clone, Deserialize, Serialize)] pub struct SourceTrack { pub source: TrackSource, pub kind: SourceTrackKind, @@ -239,32 +203,25 @@ pub struct SourceTrack { pub federated: Vec, } -url_enum!( - #[derive( - Debug, Clone, Deserialize, Serialize, PartialEq, Eq, PartialOrd, Ord, Hash, Encode, Decode, - )] - #[serde(rename_all = "snake_case")] - enum Rating { - Imdb = "imdb", - Tmdb = "tmdb", - RottenTomatoes = "rotten_tomatoes", - Metacritic = "metacritic", - YoutubeViews = "youtube_views", - YoutubeLikes = "youtube_likes", - YoutubeFollowers = "youtube_followers", - Trakt = "trakt", - } -); +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[serde(rename_all = "snake_case")] +pub enum RatingType { + Imdb, + Tmdb, + RottenTomatoes, + Metacritic, + YoutubeViews, + YoutubeLikes, + YoutubeFollowers, + Trakt, +} -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Encode, Decode)] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "snake_case")] pub enum SourceTrackKind { Video { width: u64, height: u64, - display_width: Option, - display_height: Option, - display_unit: u64, fps: Option, }, Audio { @@ -275,7 +232,8 @@ pub enum SourceTrackKind { Subtitle, } -#[derive(Debug, Serialize, Deserialize, Clone, Copy, Hash, PartialEq, Encode, Decode)] +// TODO move this somewhere else +#[derive(Debug, Serialize, Deserialize, Clone, Copy, Hash, PartialEq)] #[serde(rename_all = "snake_case")] pub enum TraktKind { Movie, -- cgit v1.3