aboutsummaryrefslogtreecommitdiff
path: root/server/src/compat/jellyfin/models.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/compat/jellyfin/models.rs')
-rw-r--r--server/src/compat/jellyfin/models.rs198
1 files changed, 198 insertions, 0 deletions
diff --git a/server/src/compat/jellyfin/models.rs b/server/src/compat/jellyfin/models.rs
new file mode 100644
index 0000000..6a68455
--- /dev/null
+++ b/server/src/compat/jellyfin/models.rs
@@ -0,0 +1,198 @@
+/*
+ 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) 2025 metamuffin <metamuffin.org>
+*/
+use serde::{Deserialize, Serialize};
+use serde_json::Value;
+use std::collections::BTreeMap;
+
+#[derive(Debug, Serialize, Deserialize)]
+pub(super) enum JellyfinItemType {
+ AudioBook,
+ Movie,
+ BoxSet,
+ Book,
+ Photo,
+ PhotoAlbum,
+ TvChannel,
+ LiveTvProgram,
+ Video,
+ Audio,
+ MusicAlbum,
+ CollectionFolder,
+}
+
+#[derive(Debug, Clone, Serialize)]
+pub(super) enum JellyfinMediaStreamType {
+ Video,
+ Audio,
+ Subtitle,
+}
+
+#[derive(Debug, Clone, Serialize)]
+#[serde(rename_all = "PascalCase")]
+pub(super) struct JellyfinMediaStream {
+ pub codec: String,
+ pub time_base: String,
+ pub video_range: String,
+ pub video_range_type: String,
+ pub audio_spatial_format: String,
+ pub display_title: String,
+ pub is_interlaced: bool,
+ pub is_avc: bool,
+ pub bit_rate: usize,
+ pub bit_depth: usize,
+ pub ref_frames: usize,
+ pub is_default: bool,
+ pub is_forced: bool,
+ pub is_hearing_impaired: bool,
+ pub height: Option<u64>,
+ pub width: Option<u64>,
+ pub average_frame_rate: Option<f64>,
+ pub real_frame_rate: Option<f64>,
+ pub reference_frame_rate: Option<f64>,
+ pub profile: String,
+ pub r#type: JellyfinMediaStreamType,
+ pub aspect_ratio: String,
+ pub index: usize,
+ pub is_external: bool,
+ pub is_text_subtitle_stream: bool,
+ pub supports_external_stream: bool,
+ pub pixel_format: String,
+ pub level: usize,
+ pub is_anamorphic: bool,
+ pub channel_layout: Option<String>,
+ pub channels: Option<usize>,
+ pub sample_rate: Option<f64>,
+ pub localized_default: String,
+ pub localized_external: String,
+}
+
+#[derive(Debug, Clone, Serialize)]
+pub(super) enum JellyfinMediaSourceProtocol {
+ File,
+}
+#[derive(Debug, Clone, Serialize)]
+pub(super) enum JellyfinMediaSourceType {
+ Default,
+}
+
+#[derive(Debug, Clone, Serialize)]
+pub(super) enum JellyfinVideoType {
+ VideoFile,
+}
+
+#[derive(Debug, Clone, Serialize)]
+#[serde(rename_all = "PascalCase")]
+pub(super) struct JellyfinMediaSource {
+ pub protocol: JellyfinMediaSourceProtocol,
+ pub id: String,
+ pub path: String,
+ pub r#type: JellyfinMediaSourceType,
+ pub container: String,
+ pub size: usize,
+ pub name: String,
+ pub is_remote: bool,
+ pub e_tag: String,
+ pub run_time_ticks: f64,
+ pub read_at_native_framerate: bool,
+ pub ignore_dts: bool,
+ pub ignore_index: bool,
+ pub gen_pts_input: bool,
+ pub supports_transcoding: bool,
+ pub supports_direct_stream: bool,
+ pub supports_direct_play: bool,
+ pub is_infinite_stream: bool,
+ pub use_most_compatible_transcoding_profile: bool,
+ pub requires_opening: bool,
+ pub requires_closing: bool,
+ pub requires_looping: bool,
+ pub supports_probing: bool,
+ pub video_type: JellyfinVideoType,
+ pub media_streams: Vec<JellyfinMediaStream>,
+ pub media_attachments: Vec<()>,
+ pub formats: Vec<()>,
+ pub bitrate: usize,
+ pub required_http_headers: BTreeMap<(), ()>,
+ pub transcoding_sub_protocol: String,
+ pub default_audio_stream_index: usize,
+ pub default_subtitle_stream_index: usize,
+ pub has_segments: bool,
+}
+
+#[derive(Debug, Serialize)]
+#[serde(rename_all = "PascalCase")]
+pub(super) struct JellyfinItem {
+ pub name: String,
+ pub server_id: String,
+ pub id: String,
+ pub e_tag: String,
+ pub date_created: String,
+ pub can_delete: bool,
+ pub can_download: bool,
+ pub preferred_metadata_language: String,
+ pub preferred_metadata_country_code: String,
+ pub sort_name: String,
+ pub forced_sort_name: String,
+ pub external_urls: Vec<()>,
+ pub enable_media_source_display: bool,
+ pub custom_rating: String,
+ pub channel_id: Option<String>,
+ pub overview: String,
+ pub taglines: Vec<String>,
+ pub genres: Vec<()>,
+ pub play_access: Option<String>,
+ pub remote_trailers: Vec<()>,
+ pub provider_ids: BTreeMap<(), ()>,
+ pub is_folder: bool,
+ pub parent_id: String,
+ pub r#type: JellyfinItemType,
+ pub people: Vec<JellyfinPerson>,
+ pub studios: Vec<JellyfinStudio>,
+ pub genre_items: Vec<()>,
+ pub local_trailer_count: usize,
+ pub special_feature_count: usize,
+ pub child_count: usize,
+ pub locked_fields: Vec<()>,
+ pub lock_data: bool,
+ pub tags: Vec<String>,
+ pub user_data: Value,
+ pub display_preferences_id: String,
+ pub primary_image_aspect_ratio: f64,
+ pub collection_type: String,
+ pub image_tags: BTreeMap<String, String>,
+ pub backdrop_image_tags: Vec<String>,
+ pub location_type: Option<String>,
+ pub media_type: String,
+ pub video_type: Option<String>,
+ pub container: Option<String>,
+ pub run_time_ticks: Option<i64>,
+ pub media_sources: Option<Vec<JellyfinMediaSource>>,
+ pub media_streams: Option<Vec<JellyfinMediaStream>>,
+ pub path: Option<String>,
+}
+
+#[derive(Debug, Serialize)]
+pub(super) enum JellyfinPersonType {
+ Actor,
+ // Writer,
+ // Producer,
+}
+
+#[derive(Debug, Serialize)]
+#[serde(rename_all = "PascalCase")]
+pub(super) struct JellyfinPerson {
+ pub name: String,
+ pub id: String,
+ pub role: String,
+ pub r#type: JellyfinPersonType,
+ pub primary_image_tag: String,
+}
+
+#[derive(Debug, Serialize)]
+#[serde(rename_all = "PascalCase")]
+pub(super) struct JellyfinStudio {
+ pub name: String,
+ pub id: String,
+}