/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2023 metamuffin */ pub mod config; pub mod helpers; pub mod r#impl; pub mod stream; use bincode::{Decode, Encode}; #[cfg(feature = "rocket")] use rocket::{FromFormField, UriDisplayQuery}; use serde::{Deserialize, Serialize}; use std::{collections::BTreeMap, path::PathBuf}; #[derive(Debug, Clone, Deserialize, Serialize)] pub struct Node { pub public: NodePublic, pub private: NodePrivate, } #[rustfmt::skip] #[derive(Debug, Clone, Deserialize, Serialize, Default)] pub struct NodePrivate { #[serde(default)] pub id: Option, #[serde(default)] pub import: Option, #[serde(default)] pub poster: Option, #[serde(default)] pub backdrop: Option, #[serde(default)] pub source: Option, } #[rustfmt::skip] #[derive(Debug, Clone, Deserialize, Serialize, Default)] pub struct NodePublic { pub kind: NodeKind, pub title: String, #[serde(default)] pub parent: Option, #[serde(default)] pub children: Vec, #[serde(default)] pub tagline: Option, #[serde(default)] pub description: Option, #[serde(default)] pub index: Option, #[serde(default)] pub media: Option, #[serde(default)] pub ratings: BTreeMap, #[serde(default)] pub federated: Option, } #[rustfmt::skip] #[derive(Debug, Clone, Deserialize, Serialize)] pub struct RemoteImportOptions { pub host: String, pub id: String, #[serde(default)] pub flatten: bool, #[serde(default)] pub prefix: Option, } #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "snake_case")] pub enum AssetLocation { Cache(PathBuf), Library(PathBuf), Assets(PathBuf), } #[rustfmt::skip] #[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Default)] #[cfg_attr(feature = "rocket", derive(FromFormField, UriDisplayQuery))] #[serde(rename_all = "snake_case")] pub enum NodeKind { #[cfg_attr(feature = "rocket", field(value = "movie"))] #[default] Movie, #[cfg_attr(feature = "rocket", field(value = "video"))] Video, #[cfg_attr(feature = "rocket", field(value = "collection"))] Collection, #[cfg_attr(feature = "rocket", field(value = "channel"))] Channel, #[cfg_attr(feature = "rocket", field(value = "show"))] Show, #[cfg_attr(feature = "rocket", field(value = "series"))] Series, #[cfg_attr(feature = "rocket", field(value = "season"))] Season, #[cfg_attr(feature = "rocket", field(value = "episode"))] Episode, } #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "snake_case")] pub enum MediaSource { Local { tracks: Vec }, Remote { host: String, remote_id: String }, } pub enum PublicMediaSource { Local, Remote(String), } pub type TrackID = usize; #[derive(Debug, Clone, Deserialize, Serialize)] pub struct LocalTrack { pub path: PathBuf, pub track: TrackID, pub codec_private: Option>, } #[derive(Debug, Clone, Deserialize, Serialize)] pub struct MediaInfo { pub duration: f64, // in seconds pub tracks: Vec, } #[derive(Debug, Clone, Deserialize, Serialize)] pub struct SourceTrack { pub kind: SourceTrackKind, pub name: String, pub codec: String, pub language: String, pub default_duration: Option, } #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, PartialOrd, Ord)] #[serde(rename_all = "snake_case")] pub enum Rating { RottenTomatoes, Metacritic, Imdb, YoutubeViews, YoutubeLikes, YoutubeFollowers, } #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "snake_case")] pub enum SourceTrackKind { Video { width: u64, height: u64, fps: f64, }, Audio { channels: usize, sample_rate: f64, bit_depth: usize, }, Subtitles, } pub const SEEK_INDEX_VERSION: u32 = 0x5eef1de4; #[derive(Debug, Clone, Decode, Encode)] pub struct SeekIndex { pub version: u32, pub blocks: Vec, pub keyframes: Vec, } #[derive(Debug, Clone, Decode, Encode)] pub struct BlockIndex { pub pts: u64, pub source_off: usize, pub size: usize, } impl Default for SeekIndex { fn default() -> Self { Self { version: SEEK_INDEX_VERSION, blocks: Vec::new(), keyframes: Vec::new(), } } }