diff --git a/Cargo.lock b/Cargo.lock index f44309e..d1d79c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4106,9 +4106,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -5934,7 +5934,10 @@ dependencies = [ name = "typegen" version = "0.1.0" dependencies = [ + "heck 0.5.0", "indexmap", + "prettyplease", + "proc-macro2", "quote", "serde", "serde_json", diff --git a/api/Cargo.toml b/api/Cargo.toml index 3fbc01a..6ecbe0a 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -5,7 +5,7 @@ edition = "2024" [dependencies] iref = { version = "3.2.2", features = ["serde"] } -reqwest = "0.12.24" +reqwest = { version = "0.12.24", features = ["json"] } serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.145" thiserror = "2.0.17" diff --git a/api/src/jellyfin.rs b/api/src/jellyfin.rs new file mode 100644 index 0000000..5eefae6 --- /dev/null +++ b/api/src/jellyfin.rs @@ -0,0 +1,5414 @@ +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct AccessSchedule { + #[serde(rename = "Id")] + pub id: i32, + #[serde(rename = "UserId")] + pub user_id: String, + #[serde(rename = "DayOfWeek")] + pub day_of_week: DynamicDayOfWeek, + #[serde(rename = "StartHour")] + pub start_hour: f64, + #[serde(rename = "EndHour")] + pub end_hour: f64, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ActivityLogEntry { + #[serde(rename = "Id")] + pub id: i64, + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "Overview")] + pub overview: Option, + #[serde(rename = "ShortOverview")] + pub short_overview: Option, + #[serde(rename = "Type")] + pub _type: String, + #[serde(rename = "ItemId")] + pub item_id: Option, + #[serde(rename = "Date")] + pub date: String, + #[serde(rename = "UserId")] + pub user_id: String, + #[serde(rename = "UserPrimaryImageTag")] + pub user_primary_image_tag: Option, + #[serde(rename = "Severity")] + pub severity: LogLevel, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ActivityLogEntryMessage { + #[serde(rename = "Data")] + pub data: Option>, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ActivityLogEntryQueryResult { + #[serde(rename = "Items")] + pub items: Vec, + #[serde(rename = "TotalRecordCount")] + pub total_record_count: i32, + #[serde(rename = "StartIndex")] + pub start_index: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ActivityLogEntryStartMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ActivityLogEntryStopMessage { + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct AddVirtualFolderDto { + #[serde(rename = "LibraryOptions")] + pub library_options: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct AlbumInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "OriginalTitle")] + pub original_title: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "MetadataLanguage")] + pub metadata_language: Option, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: Option, + #[serde(rename = "ProviderIds")] + pub provider_ids: Option>>, + #[serde(rename = "Year")] + pub year: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "PremiereDate")] + pub premiere_date: Option, + #[serde(rename = "IsAutomated")] + pub is_automated: bool, + #[serde(rename = "AlbumArtists")] + pub album_artists: Vec, + #[serde(rename = "ArtistProviderIds")] + pub artist_provider_ids: std::collections::HashMap>, + #[serde(rename = "SongInfos")] + pub song_infos: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct AlbumInfoRemoteSearchQuery { + #[serde(rename = "SearchInfo")] + pub search_info: Option, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SearchProviderName")] + pub search_provider_name: Option, + #[serde(rename = "IncludeDisabledProviders")] + pub include_disabled_providers: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct AllThemeMediaResult { + #[serde(rename = "ThemeVideosResult")] + pub theme_videos_result: Option, + #[serde(rename = "ThemeSongsResult")] + pub theme_songs_result: Option, + #[serde(rename = "SoundtrackSongsResult")] + pub soundtrack_songs_result: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ArtistInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "OriginalTitle")] + pub original_title: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "MetadataLanguage")] + pub metadata_language: Option, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: Option, + #[serde(rename = "ProviderIds")] + pub provider_ids: Option>>, + #[serde(rename = "Year")] + pub year: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "PremiereDate")] + pub premiere_date: Option, + #[serde(rename = "IsAutomated")] + pub is_automated: bool, + #[serde(rename = "SongInfos")] + pub song_infos: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ArtistInfoRemoteSearchQuery { + #[serde(rename = "SearchInfo")] + pub search_info: Option, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SearchProviderName")] + pub search_provider_name: Option, + #[serde(rename = "IncludeDisabledProviders")] + pub include_disabled_providers: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct AuthenticateUserByName { + #[serde(rename = "Username")] + pub username: Option, + #[serde(rename = "Pw")] + pub pw: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct AuthenticationInfo { + #[serde(rename = "Id")] + pub id: i64, + #[serde(rename = "AccessToken")] + pub access_token: Option, + #[serde(rename = "DeviceId")] + pub device_id: Option, + #[serde(rename = "AppName")] + pub app_name: Option, + #[serde(rename = "AppVersion")] + pub app_version: Option, + #[serde(rename = "DeviceName")] + pub device_name: Option, + #[serde(rename = "UserId")] + pub user_id: String, + #[serde(rename = "IsActive")] + pub is_active: bool, + #[serde(rename = "DateCreated")] + pub date_created: String, + #[serde(rename = "DateRevoked")] + pub date_revoked: Option, + #[serde(rename = "DateLastActivity")] + pub date_last_activity: String, + #[serde(rename = "UserName")] + pub user_name: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct AuthenticationInfoQueryResult { + #[serde(rename = "Items")] + pub items: Vec, + #[serde(rename = "TotalRecordCount")] + pub total_record_count: i32, + #[serde(rename = "StartIndex")] + pub start_index: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct AuthenticationResult { + #[serde(rename = "User")] + pub user: Option, + #[serde(rename = "SessionInfo")] + pub session_info: Option, + #[serde(rename = "AccessToken")] + pub access_token: Option, + #[serde(rename = "ServerId")] + pub server_id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct BaseItemDto { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "OriginalTitle")] + pub original_title: Option, + #[serde(rename = "ServerId")] + pub server_id: Option, + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "Etag")] + pub etag: Option, + #[serde(rename = "SourceType")] + pub source_type: Option, + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: Option, + #[serde(rename = "DateCreated")] + pub date_created: Option, + #[serde(rename = "DateLastMediaAdded")] + pub date_last_media_added: Option, + #[serde(rename = "ExtraType")] + pub extra_type: Option, + #[serde(rename = "AirsBeforeSeasonNumber")] + pub airs_before_season_number: Option, + #[serde(rename = "AirsAfterSeasonNumber")] + pub airs_after_season_number: Option, + #[serde(rename = "AirsBeforeEpisodeNumber")] + pub airs_before_episode_number: Option, + #[serde(rename = "CanDelete")] + pub can_delete: Option, + #[serde(rename = "CanDownload")] + pub can_download: Option, + #[serde(rename = "HasLyrics")] + pub has_lyrics: Option, + #[serde(rename = "HasSubtitles")] + pub has_subtitles: Option, + #[serde(rename = "PreferredMetadataLanguage")] + pub preferred_metadata_language: Option, + #[serde(rename = "PreferredMetadataCountryCode")] + pub preferred_metadata_country_code: Option, + #[serde(rename = "Container")] + pub container: Option, + #[serde(rename = "SortName")] + pub sort_name: Option, + #[serde(rename = "ForcedSortName")] + pub forced_sort_name: Option, + #[serde(rename = "Video3DFormat")] + pub video3_d_format: Option, + #[serde(rename = "PremiereDate")] + pub premiere_date: Option, + #[serde(rename = "ExternalUrls")] + pub external_urls: Option>, + #[serde(rename = "MediaSources")] + pub media_sources: Option>, + #[serde(rename = "CriticRating")] + pub critic_rating: Option, + #[serde(rename = "ProductionLocations")] + pub production_locations: Option>, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "EnableMediaSourceDisplay")] + pub enable_media_source_display: Option, + #[serde(rename = "OfficialRating")] + pub official_rating: Option, + #[serde(rename = "CustomRating")] + pub custom_rating: Option, + #[serde(rename = "ChannelId")] + pub channel_id: Option, + #[serde(rename = "ChannelName")] + pub channel_name: Option, + #[serde(rename = "Overview")] + pub overview: Option, + #[serde(rename = "Taglines")] + pub taglines: Option>, + #[serde(rename = "Genres")] + pub genres: Option>, + #[serde(rename = "CommunityRating")] + pub community_rating: Option, + #[serde(rename = "CumulativeRunTimeTicks")] + pub cumulative_run_time_ticks: Option, + #[serde(rename = "RunTimeTicks")] + pub run_time_ticks: Option, + #[serde(rename = "PlayAccess")] + pub play_access: Option, + #[serde(rename = "AspectRatio")] + pub aspect_ratio: Option, + #[serde(rename = "ProductionYear")] + pub production_year: Option, + #[serde(rename = "IsPlaceHolder")] + pub is_place_holder: Option, + #[serde(rename = "Number")] + pub number: Option, + #[serde(rename = "ChannelNumber")] + pub channel_number: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "IndexNumberEnd")] + pub index_number_end: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "RemoteTrailers")] + pub remote_trailers: Option>, + #[serde(rename = "ProviderIds")] + pub provider_ids: Option>>, + #[serde(rename = "IsHD")] + pub is_hd: Option, + #[serde(rename = "IsFolder")] + pub is_folder: Option, + #[serde(rename = "ParentId")] + pub parent_id: Option, + #[serde(rename = "Type")] + pub _type: BaseItemKind, + #[serde(rename = "People")] + pub people: Option>, + #[serde(rename = "Studios")] + pub studios: Option>, + #[serde(rename = "GenreItems")] + pub genre_items: Option>, + #[serde(rename = "ParentLogoItemId")] + pub parent_logo_item_id: Option, + #[serde(rename = "ParentBackdropItemId")] + pub parent_backdrop_item_id: Option, + #[serde(rename = "ParentBackdropImageTags")] + pub parent_backdrop_image_tags: Option>, + #[serde(rename = "LocalTrailerCount")] + pub local_trailer_count: Option, + #[serde(rename = "UserData")] + pub user_data: Option, + #[serde(rename = "RecursiveItemCount")] + pub recursive_item_count: Option, + #[serde(rename = "ChildCount")] + pub child_count: Option, + #[serde(rename = "SeriesName")] + pub series_name: Option, + #[serde(rename = "SeriesId")] + pub series_id: Option, + #[serde(rename = "SeasonId")] + pub season_id: Option, + #[serde(rename = "SpecialFeatureCount")] + pub special_feature_count: Option, + #[serde(rename = "DisplayPreferencesId")] + pub display_preferences_id: Option, + #[serde(rename = "Status")] + pub status: Option, + #[serde(rename = "AirTime")] + pub air_time: Option, + #[serde(rename = "AirDays")] + pub air_days: Option>, + #[serde(rename = "Tags")] + pub tags: Option>, + #[serde(rename = "PrimaryImageAspectRatio")] + pub primary_image_aspect_ratio: Option, + #[serde(rename = "Artists")] + pub artists: Option>, + #[serde(rename = "ArtistItems")] + pub artist_items: Option>, + #[serde(rename = "Album")] + pub album: Option, + #[serde(rename = "CollectionType")] + pub collection_type: Option, + #[serde(rename = "DisplayOrder")] + pub display_order: Option, + #[serde(rename = "AlbumId")] + pub album_id: Option, + #[serde(rename = "AlbumPrimaryImageTag")] + pub album_primary_image_tag: Option, + #[serde(rename = "SeriesPrimaryImageTag")] + pub series_primary_image_tag: Option, + #[serde(rename = "AlbumArtist")] + pub album_artist: Option, + #[serde(rename = "AlbumArtists")] + pub album_artists: Option>, + #[serde(rename = "SeasonName")] + pub season_name: Option, + #[serde(rename = "MediaStreams")] + pub media_streams: Option>, + #[serde(rename = "VideoType")] + pub video_type: Option, + #[serde(rename = "PartCount")] + pub part_count: Option, + #[serde(rename = "MediaSourceCount")] + pub media_source_count: Option, + #[serde(rename = "ImageTags")] + pub image_tags: Option>, + #[serde(rename = "BackdropImageTags")] + pub backdrop_image_tags: Option>, + #[serde(rename = "ScreenshotImageTags")] + pub screenshot_image_tags: Option>, + #[serde(rename = "ParentLogoImageTag")] + pub parent_logo_image_tag: Option, + #[serde(rename = "ParentArtItemId")] + pub parent_art_item_id: Option, + #[serde(rename = "ParentArtImageTag")] + pub parent_art_image_tag: Option, + #[serde(rename = "SeriesThumbImageTag")] + pub series_thumb_image_tag: Option, + #[serde(rename = "ImageBlurHashes")] + pub image_blur_hashes: Option>, + #[serde(rename = "SeriesStudio")] + pub series_studio: Option, + #[serde(rename = "ParentThumbItemId")] + pub parent_thumb_item_id: Option, + #[serde(rename = "ParentThumbImageTag")] + pub parent_thumb_image_tag: Option, + #[serde(rename = "ParentPrimaryImageItemId")] + pub parent_primary_image_item_id: Option, + #[serde(rename = "ParentPrimaryImageTag")] + pub parent_primary_image_tag: Option, + #[serde(rename = "Chapters")] + pub chapters: Option>, + #[serde(rename = "Trickplay")] + pub trickplay: Option< + std::collections::HashMap< + String, + std::collections::HashMap, + >, + >, + #[serde(rename = "LocationType")] + pub location_type: Option, + #[serde(rename = "IsoType")] + pub iso_type: Option, + #[serde(rename = "MediaType")] + pub media_type: MediaType, + #[serde(rename = "EndDate")] + pub end_date: Option, + #[serde(rename = "LockedFields")] + pub locked_fields: Option>, + #[serde(rename = "TrailerCount")] + pub trailer_count: Option, + #[serde(rename = "MovieCount")] + pub movie_count: Option, + #[serde(rename = "SeriesCount")] + pub series_count: Option, + #[serde(rename = "ProgramCount")] + pub program_count: Option, + #[serde(rename = "EpisodeCount")] + pub episode_count: Option, + #[serde(rename = "SongCount")] + pub song_count: Option, + #[serde(rename = "AlbumCount")] + pub album_count: Option, + #[serde(rename = "ArtistCount")] + pub artist_count: Option, + #[serde(rename = "MusicVideoCount")] + pub music_video_count: Option, + #[serde(rename = "LockData")] + pub lock_data: Option, + #[serde(rename = "Width")] + pub width: Option, + #[serde(rename = "Height")] + pub height: Option, + #[serde(rename = "CameraMake")] + pub camera_make: Option, + #[serde(rename = "CameraModel")] + pub camera_model: Option, + #[serde(rename = "Software")] + pub software: Option, + #[serde(rename = "ExposureTime")] + pub exposure_time: Option, + #[serde(rename = "FocalLength")] + pub focal_length: Option, + #[serde(rename = "ImageOrientation")] + pub image_orientation: Option, + #[serde(rename = "Aperture")] + pub aperture: Option, + #[serde(rename = "ShutterSpeed")] + pub shutter_speed: Option, + #[serde(rename = "Latitude")] + pub latitude: Option, + #[serde(rename = "Longitude")] + pub longitude: Option, + #[serde(rename = "Altitude")] + pub altitude: Option, + #[serde(rename = "IsoSpeedRating")] + pub iso_speed_rating: Option, + #[serde(rename = "SeriesTimerId")] + pub series_timer_id: Option, + #[serde(rename = "ProgramId")] + pub program_id: Option, + #[serde(rename = "ChannelPrimaryImageTag")] + pub channel_primary_image_tag: Option, + #[serde(rename = "StartDate")] + pub start_date: Option, + #[serde(rename = "CompletionPercentage")] + pub completion_percentage: Option, + #[serde(rename = "IsRepeat")] + pub is_repeat: Option, + #[serde(rename = "EpisodeTitle")] + pub episode_title: Option, + #[serde(rename = "ChannelType")] + pub channel_type: Option, + #[serde(rename = "Audio")] + pub audio: Option, + #[serde(rename = "IsMovie")] + pub is_movie: Option, + #[serde(rename = "IsSports")] + pub is_sports: Option, + #[serde(rename = "IsSeries")] + pub is_series: Option, + #[serde(rename = "IsLive")] + pub is_live: Option, + #[serde(rename = "IsNews")] + pub is_news: Option, + #[serde(rename = "IsKids")] + pub is_kids: Option, + #[serde(rename = "IsPremiere")] + pub is_premiere: Option, + #[serde(rename = "TimerId")] + pub timer_id: Option, + #[serde(rename = "NormalizationGain")] + pub normalization_gain: Option, + #[serde(rename = "CurrentProgram")] + pub current_program: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct BaseItemDtoQueryResult { + #[serde(rename = "Items")] + pub items: Vec, + #[serde(rename = "TotalRecordCount")] + pub total_record_count: i32, + #[serde(rename = "StartIndex")] + pub start_index: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct BaseItemPerson { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "Role")] + pub role: Option, + #[serde(rename = "Type")] + pub _type: PersonKind, + #[serde(rename = "PrimaryImageTag")] + pub primary_image_tag: Option, + #[serde(rename = "ImageBlurHashes")] + pub image_blur_hashes: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct BookInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "OriginalTitle")] + pub original_title: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "MetadataLanguage")] + pub metadata_language: Option, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: Option, + #[serde(rename = "ProviderIds")] + pub provider_ids: Option>>, + #[serde(rename = "Year")] + pub year: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "PremiereDate")] + pub premiere_date: Option, + #[serde(rename = "IsAutomated")] + pub is_automated: bool, + #[serde(rename = "SeriesName")] + pub series_name: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct BookInfoRemoteSearchQuery { + #[serde(rename = "SearchInfo")] + pub search_info: Option, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SearchProviderName")] + pub search_provider_name: Option, + #[serde(rename = "IncludeDisabledProviders")] + pub include_disabled_providers: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct BoxSetInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "OriginalTitle")] + pub original_title: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "MetadataLanguage")] + pub metadata_language: Option, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: Option, + #[serde(rename = "ProviderIds")] + pub provider_ids: Option>>, + #[serde(rename = "Year")] + pub year: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "PremiereDate")] + pub premiere_date: Option, + #[serde(rename = "IsAutomated")] + pub is_automated: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct BoxSetInfoRemoteSearchQuery { + #[serde(rename = "SearchInfo")] + pub search_info: Option, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SearchProviderName")] + pub search_provider_name: Option, + #[serde(rename = "IncludeDisabledProviders")] + pub include_disabled_providers: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct BrandingOptions { + #[serde(rename = "LoginDisclaimer")] + pub login_disclaimer: Option, + #[serde(rename = "CustomCss")] + pub custom_css: Option, + #[serde(rename = "SplashscreenEnabled")] + pub splashscreen_enabled: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct BufferRequestDto { + #[serde(rename = "When")] + pub when: String, + #[serde(rename = "PositionTicks")] + pub position_ticks: i64, + #[serde(rename = "IsPlaying")] + pub is_playing: bool, + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct CastReceiverApplication { + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "Name")] + pub name: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ChannelFeatures { + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "CanSearch")] + pub can_search: bool, + #[serde(rename = "MediaTypes")] + pub media_types: Vec, + #[serde(rename = "ContentTypes")] + pub content_types: Vec, + #[serde(rename = "MaxPageSize")] + pub max_page_size: Option, + #[serde(rename = "AutoRefreshLevels")] + pub auto_refresh_levels: Option, + #[serde(rename = "DefaultSortFields")] + pub default_sort_fields: Vec, + #[serde(rename = "SupportsSortOrderToggle")] + pub supports_sort_order_toggle: bool, + #[serde(rename = "SupportsLatestMedia")] + pub supports_latest_media: bool, + #[serde(rename = "CanFilter")] + pub can_filter: bool, + #[serde(rename = "SupportsContentDownloading")] + pub supports_content_downloading: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ChannelMappingOptionsDto { + #[serde(rename = "TunerChannels")] + pub tuner_channels: Vec, + #[serde(rename = "ProviderChannels")] + pub provider_channels: Vec, + #[serde(rename = "Mappings")] + pub mappings: Vec, + #[serde(rename = "ProviderName")] + pub provider_name: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ChapterInfo { + #[serde(rename = "StartPositionTicks")] + pub start_position_ticks: i64, + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "ImagePath")] + pub image_path: Option, + #[serde(rename = "ImageDateModified")] + pub image_date_modified: String, + #[serde(rename = "ImageTag")] + pub image_tag: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct CheckpointId { + #[serde(rename = "Id")] + pub id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ClientCapabilitiesDto { + #[serde(rename = "PlayableMediaTypes")] + pub playable_media_types: Vec, + #[serde(rename = "SupportedCommands")] + pub supported_commands: Vec, + #[serde(rename = "SupportsMediaControl")] + pub supports_media_control: bool, + #[serde(rename = "SupportsPersistentIdentifier")] + pub supports_persistent_identifier: bool, + #[serde(rename = "DeviceProfile")] + pub device_profile: Option, + #[serde(rename = "AppStoreUrl")] + pub app_store_url: Option, + #[serde(rename = "IconUrl")] + pub icon_url: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ClientLogDocumentResponseDto { + #[serde(rename = "FileName")] + pub file_name: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct CodecProfile { + #[serde(rename = "Type")] + pub _type: CodecType, + #[serde(rename = "Conditions")] + pub conditions: Vec, + #[serde(rename = "ApplyConditions")] + pub apply_conditions: Vec, + #[serde(rename = "Codec")] + pub codec: Option, + #[serde(rename = "Container")] + pub container: Option, + #[serde(rename = "SubContainer")] + pub sub_container: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct CollectionCreationResult { + #[serde(rename = "Id")] + pub id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ConfigImageTypes { + #[serde(rename = "BackdropSizes")] + pub backdrop_sizes: Option>, + #[serde(rename = "BaseUrl")] + pub base_url: Option, + #[serde(rename = "LogoSizes")] + pub logo_sizes: Option>, + #[serde(rename = "PosterSizes")] + pub poster_sizes: Option>, + #[serde(rename = "ProfileSizes")] + pub profile_sizes: Option>, + #[serde(rename = "SecureBaseUrl")] + pub secure_base_url: Option, + #[serde(rename = "StillSizes")] + pub still_sizes: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ConfigurationPageInfo { + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "EnableInMainMenu")] + pub enable_in_main_menu: bool, + #[serde(rename = "MenuSection")] + pub menu_section: Option, + #[serde(rename = "MenuIcon")] + pub menu_icon: Option, + #[serde(rename = "DisplayName")] + pub display_name: Option, + #[serde(rename = "PluginId")] + pub plugin_id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ContainerProfile { + #[serde(rename = "Type")] + pub _type: DlnaProfileType, + #[serde(rename = "Conditions")] + pub conditions: Vec, + #[serde(rename = "Container")] + pub container: Option, + #[serde(rename = "SubContainer")] + pub sub_container: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct CountryInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "DisplayName")] + pub display_name: Option, + #[serde(rename = "TwoLetterISORegionName")] + pub two_letter_iso_region_name: Option, + #[serde(rename = "ThreeLetterISORegionName")] + pub three_letter_iso_region_name: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct CreatePlaylistDto { + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "Ids")] + pub ids: Vec, + #[serde(rename = "UserId")] + pub user_id: Option, + #[serde(rename = "MediaType")] + pub media_type: Option, + #[serde(rename = "Users")] + pub users: Vec, + #[serde(rename = "IsPublic")] + pub is_public: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct CreateUserByName { + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "Password")] + pub password: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct CultureDto { + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "DisplayName")] + pub display_name: String, + #[serde(rename = "TwoLetterISOLanguageName")] + pub two_letter_iso_language_name: String, + #[serde(rename = "ThreeLetterISOLanguageName")] + pub three_letter_iso_language_name: Option, + #[serde(rename = "ThreeLetterISOLanguageNames")] + pub three_letter_iso_language_names: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct DefaultDirectoryBrowserInfoDto { + #[serde(rename = "Path")] + pub path: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct DeviceInfoDto { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "CustomName")] + pub custom_name: Option, + #[serde(rename = "AccessToken")] + pub access_token: Option, + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "LastUserName")] + pub last_user_name: Option, + #[serde(rename = "AppName")] + pub app_name: Option, + #[serde(rename = "AppVersion")] + pub app_version: Option, + #[serde(rename = "LastUserId")] + pub last_user_id: Option, + #[serde(rename = "DateLastActivity")] + pub date_last_activity: Option, + #[serde(rename = "Capabilities")] + pub capabilities: ClientCapabilitiesDto, + #[serde(rename = "IconUrl")] + pub icon_url: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct DeviceInfoDtoQueryResult { + #[serde(rename = "Items")] + pub items: Vec, + #[serde(rename = "TotalRecordCount")] + pub total_record_count: i32, + #[serde(rename = "StartIndex")] + pub start_index: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct DeviceOptionsDto { + #[serde(rename = "Id")] + pub id: i32, + #[serde(rename = "DeviceId")] + pub device_id: Option, + #[serde(rename = "CustomName")] + pub custom_name: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct DeviceProfile { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "MaxStreamingBitrate")] + pub max_streaming_bitrate: Option, + #[serde(rename = "MaxStaticBitrate")] + pub max_static_bitrate: Option, + #[serde(rename = "MusicStreamingTranscodingBitrate")] + pub music_streaming_transcoding_bitrate: Option, + #[serde(rename = "MaxStaticMusicBitrate")] + pub max_static_music_bitrate: Option, + #[serde(rename = "DirectPlayProfiles")] + pub direct_play_profiles: Vec, + #[serde(rename = "TranscodingProfiles")] + pub transcoding_profiles: Vec, + #[serde(rename = "ContainerProfiles")] + pub container_profiles: Vec, + #[serde(rename = "CodecProfiles")] + pub codec_profiles: Vec, + #[serde(rename = "SubtitleProfiles")] + pub subtitle_profiles: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct DirectPlayProfile { + #[serde(rename = "Container")] + pub container: String, + #[serde(rename = "AudioCodec")] + pub audio_codec: Option, + #[serde(rename = "VideoCodec")] + pub video_codec: Option, + #[serde(rename = "Type")] + pub _type: DlnaProfileType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct DisplayPreferencesDto { + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "ViewType")] + pub view_type: Option, + #[serde(rename = "SortBy")] + pub sort_by: Option, + #[serde(rename = "IndexBy")] + pub index_by: Option, + #[serde(rename = "RememberIndexing")] + pub remember_indexing: bool, + #[serde(rename = "PrimaryImageHeight")] + pub primary_image_height: i32, + #[serde(rename = "PrimaryImageWidth")] + pub primary_image_width: i32, + #[serde(rename = "CustomPrefs")] + pub custom_prefs: std::collections::HashMap>, + #[serde(rename = "ScrollDirection")] + pub scroll_direction: ScrollDirection, + #[serde(rename = "ShowBackdrop")] + pub show_backdrop: bool, + #[serde(rename = "RememberSorting")] + pub remember_sorting: bool, + #[serde(rename = "SortOrder")] + pub sort_order: SortOrder, + #[serde(rename = "ShowSidebar")] + pub show_sidebar: bool, + #[serde(rename = "Client")] + pub client: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct EncodingOptions { + #[serde(rename = "EncodingThreadCount")] + pub encoding_thread_count: i32, + #[serde(rename = "TranscodingTempPath")] + pub transcoding_temp_path: Option, + #[serde(rename = "FallbackFontPath")] + pub fallback_font_path: Option, + #[serde(rename = "EnableFallbackFont")] + pub enable_fallback_font: bool, + #[serde(rename = "EnableAudioVbr")] + pub enable_audio_vbr: bool, + #[serde(rename = "DownMixAudioBoost")] + pub down_mix_audio_boost: f64, + #[serde(rename = "DownMixStereoAlgorithm")] + pub down_mix_stereo_algorithm: DownMixStereoAlgorithms, + #[serde(rename = "MaxMuxingQueueSize")] + pub max_muxing_queue_size: i32, + #[serde(rename = "EnableThrottling")] + pub enable_throttling: bool, + #[serde(rename = "ThrottleDelaySeconds")] + pub throttle_delay_seconds: i32, + #[serde(rename = "EnableSegmentDeletion")] + pub enable_segment_deletion: bool, + #[serde(rename = "SegmentKeepSeconds")] + pub segment_keep_seconds: i32, + #[serde(rename = "HardwareAccelerationType")] + pub hardware_acceleration_type: HardwareAccelerationType, + #[serde(rename = "EncoderAppPath")] + pub encoder_app_path: Option, + #[serde(rename = "EncoderAppPathDisplay")] + pub encoder_app_path_display: Option, + #[serde(rename = "VaapiDevice")] + pub vaapi_device: Option, + #[serde(rename = "QsvDevice")] + pub qsv_device: Option, + #[serde(rename = "EnableTonemapping")] + pub enable_tonemapping: bool, + #[serde(rename = "EnableVppTonemapping")] + pub enable_vpp_tonemapping: bool, + #[serde(rename = "EnableVideoToolboxTonemapping")] + pub enable_video_toolbox_tonemapping: bool, + #[serde(rename = "TonemappingAlgorithm")] + pub tonemapping_algorithm: TonemappingAlgorithm, + #[serde(rename = "TonemappingMode")] + pub tonemapping_mode: TonemappingMode, + #[serde(rename = "TonemappingRange")] + pub tonemapping_range: TonemappingRange, + #[serde(rename = "TonemappingDesat")] + pub tonemapping_desat: f64, + #[serde(rename = "TonemappingPeak")] + pub tonemapping_peak: f64, + #[serde(rename = "TonemappingParam")] + pub tonemapping_param: f64, + #[serde(rename = "VppTonemappingBrightness")] + pub vpp_tonemapping_brightness: f64, + #[serde(rename = "VppTonemappingContrast")] + pub vpp_tonemapping_contrast: f64, + #[serde(rename = "H264Crf")] + pub h264_crf: i32, + #[serde(rename = "H265Crf")] + pub h265_crf: i32, + #[serde(rename = "EncoderPreset")] + pub encoder_preset: Option, + #[serde(rename = "DeinterlaceDoubleRate")] + pub deinterlace_double_rate: bool, + #[serde(rename = "DeinterlaceMethod")] + pub deinterlace_method: DeinterlaceMethod, + #[serde(rename = "EnableDecodingColorDepth10Hevc")] + pub enable_decoding_color_depth10_hevc: bool, + #[serde(rename = "EnableDecodingColorDepth10Vp9")] + pub enable_decoding_color_depth10_vp9: bool, + #[serde(rename = "EnableDecodingColorDepth10HevcRext")] + pub enable_decoding_color_depth10_hevc_rext: bool, + #[serde(rename = "EnableDecodingColorDepth12HevcRext")] + pub enable_decoding_color_depth12_hevc_rext: bool, + #[serde(rename = "EnableEnhancedNvdecDecoder")] + pub enable_enhanced_nvdec_decoder: bool, + #[serde(rename = "PreferSystemNativeHwDecoder")] + pub prefer_system_native_hw_decoder: bool, + #[serde(rename = "EnableIntelLowPowerH264HwEncoder")] + pub enable_intel_low_power_h264_hw_encoder: bool, + #[serde(rename = "EnableIntelLowPowerHevcHwEncoder")] + pub enable_intel_low_power_hevc_hw_encoder: bool, + #[serde(rename = "EnableHardwareEncoding")] + pub enable_hardware_encoding: bool, + #[serde(rename = "AllowHevcEncoding")] + pub allow_hevc_encoding: bool, + #[serde(rename = "AllowAv1Encoding")] + pub allow_av1_encoding: bool, + #[serde(rename = "EnableSubtitleExtraction")] + pub enable_subtitle_extraction: bool, + #[serde(rename = "HardwareDecodingCodecs")] + pub hardware_decoding_codecs: Option>, + #[serde(rename = "AllowOnDemandMetadataBasedKeyframeExtractionForExtensions")] + pub allow_on_demand_metadata_based_keyframe_extraction_for_extensions: Option< + Vec, + >, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct EndPointInfo { + #[serde(rename = "IsLocal")] + pub is_local: bool, + #[serde(rename = "IsInNetwork")] + pub is_in_network: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ExternalIdInfo { + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "Key")] + pub key: String, + #[serde(rename = "Type")] + pub _type: Option, + #[serde(rename = "UrlFormatString")] + pub url_format_string: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ExternalUrl { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Url")] + pub url: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct FileSystemEntryInfo { + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "Path")] + pub path: String, + #[serde(rename = "Type")] + pub _type: FileSystemEntryType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct FontFile { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Size")] + pub size: i64, + #[serde(rename = "DateCreated")] + pub date_created: String, + #[serde(rename = "DateModified")] + pub date_modified: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ForceKeepAliveMessage { + #[serde(rename = "Data")] + pub data: i32, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ForgotPasswordDto { + #[serde(rename = "EnteredUsername")] + pub entered_username: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ForgotPasswordPinDto { + #[serde(rename = "Pin")] + pub pin: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ForgotPasswordResult { + #[serde(rename = "Action")] + pub action: ForgotPasswordAction, + #[serde(rename = "PinFile")] + pub pin_file: Option, + #[serde(rename = "PinExpirationDate")] + pub pin_expiration_date: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct GeneralCommand { + #[serde(rename = "Name")] + pub name: GeneralCommandType, + #[serde(rename = "ControllingUserId")] + pub controlling_user_id: String, + #[serde(rename = "Arguments")] + pub arguments: std::collections::HashMap>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct GeneralCommandMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct GetProgramsDto { + #[serde(rename = "ChannelIds")] + pub channel_ids: Option>, + #[serde(rename = "UserId")] + pub user_id: Option, + #[serde(rename = "MinStartDate")] + pub min_start_date: Option, + #[serde(rename = "HasAired")] + pub has_aired: Option, + #[serde(rename = "IsAiring")] + pub is_airing: Option, + #[serde(rename = "MaxStartDate")] + pub max_start_date: Option, + #[serde(rename = "MinEndDate")] + pub min_end_date: Option, + #[serde(rename = "MaxEndDate")] + pub max_end_date: Option, + #[serde(rename = "IsMovie")] + pub is_movie: Option, + #[serde(rename = "IsSeries")] + pub is_series: Option, + #[serde(rename = "IsNews")] + pub is_news: Option, + #[serde(rename = "IsKids")] + pub is_kids: Option, + #[serde(rename = "IsSports")] + pub is_sports: Option, + #[serde(rename = "StartIndex")] + pub start_index: Option, + #[serde(rename = "Limit")] + pub limit: Option, + #[serde(rename = "SortBy")] + pub sort_by: Option>, + #[serde(rename = "SortOrder")] + pub sort_order: Option>, + #[serde(rename = "Genres")] + pub genres: Option>, + #[serde(rename = "GenreIds")] + pub genre_ids: Option>, + #[serde(rename = "EnableImages")] + pub enable_images: Option, + #[serde(rename = "EnableTotalRecordCount")] + pub enable_total_record_count: bool, + #[serde(rename = "ImageTypeLimit")] + pub image_type_limit: Option, + #[serde(rename = "EnableImageTypes")] + pub enable_image_types: Option>, + #[serde(rename = "EnableUserData")] + pub enable_user_data: Option, + #[serde(rename = "SeriesTimerId")] + pub series_timer_id: Option, + #[serde(rename = "LibrarySeriesId")] + pub library_series_id: Option, + #[serde(rename = "Fields")] + pub fields: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct GroupInfoDto { + #[serde(rename = "GroupId")] + pub group_id: String, + #[serde(rename = "GroupName")] + pub group_name: String, + #[serde(rename = "State")] + pub state: GroupStateType, + #[serde(rename = "Participants")] + pub participants: Vec, + #[serde(rename = "LastUpdatedAt")] + pub last_updated_at: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct GroupInfoDtoGroupUpdate { + #[serde(rename = "GroupId")] + pub group_id: String, + #[serde(rename = "Type")] + pub _type: GroupUpdateType, + #[serde(rename = "Data")] + pub data: GroupInfoDto, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct GroupStateUpdate { + #[serde(rename = "State")] + pub state: GroupStateType, + #[serde(rename = "Reason")] + pub reason: PlaybackRequestType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct GroupStateUpdateGroupUpdate { + #[serde(rename = "GroupId")] + pub group_id: String, + #[serde(rename = "Type")] + pub _type: GroupUpdateType, + #[serde(rename = "Data")] + pub data: GroupStateUpdate, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct GroupUpdate { + #[serde(rename = "GroupId")] + pub group_id: String, + #[serde(rename = "Type")] + pub _type: GroupUpdateType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct GuideInfo { + #[serde(rename = "StartDate")] + pub start_date: String, + #[serde(rename = "EndDate")] + pub end_date: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct IgnoreWaitRequestDto { + #[serde(rename = "IgnoreWait")] + pub ignore_wait: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ImageInfo { + #[serde(rename = "ImageType")] + pub image_type: ImageType, + #[serde(rename = "ImageIndex")] + pub image_index: Option, + #[serde(rename = "ImageTag")] + pub image_tag: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "BlurHash")] + pub blur_hash: Option, + #[serde(rename = "Height")] + pub height: Option, + #[serde(rename = "Width")] + pub width: Option, + #[serde(rename = "Size")] + pub size: i64, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ImageOption { + #[serde(rename = "Type")] + pub _type: ImageType, + #[serde(rename = "Limit")] + pub limit: i32, + #[serde(rename = "MinWidth")] + pub min_width: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ImageProviderInfo { + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "SupportedImages")] + pub supported_images: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct InboundKeepAliveMessage { + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct InstallationInfo { + #[serde(rename = "Guid")] + pub guid: String, + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Version")] + pub version: Option, + #[serde(rename = "Changelog")] + pub changelog: Option, + #[serde(rename = "SourceUrl")] + pub source_url: Option, + #[serde(rename = "Checksum")] + pub checksum: Option, + #[serde(rename = "PackageInfo")] + pub package_info: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct IPlugin { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Description")] + pub description: Option, + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "Version")] + pub version: Option, + #[serde(rename = "AssemblyFilePath")] + pub assembly_file_path: Option, + #[serde(rename = "CanUninstall")] + pub can_uninstall: bool, + #[serde(rename = "DataFolderPath")] + pub data_folder_path: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ItemCounts { + #[serde(rename = "MovieCount")] + pub movie_count: i32, + #[serde(rename = "SeriesCount")] + pub series_count: i32, + #[serde(rename = "EpisodeCount")] + pub episode_count: i32, + #[serde(rename = "ArtistCount")] + pub artist_count: i32, + #[serde(rename = "ProgramCount")] + pub program_count: i32, + #[serde(rename = "TrailerCount")] + pub trailer_count: i32, + #[serde(rename = "SongCount")] + pub song_count: i32, + #[serde(rename = "AlbumCount")] + pub album_count: i32, + #[serde(rename = "MusicVideoCount")] + pub music_video_count: i32, + #[serde(rename = "BoxSetCount")] + pub box_set_count: i32, + #[serde(rename = "BookCount")] + pub book_count: i32, + #[serde(rename = "ItemCount")] + pub item_count: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct JoinGroupRequestDto { + #[serde(rename = "GroupId")] + pub group_id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LibraryChangedMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LibraryOptionInfoDto { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "DefaultEnabled")] + pub default_enabled: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LibraryOptions { + #[serde(rename = "Enabled")] + pub enabled: bool, + #[serde(rename = "EnablePhotos")] + pub enable_photos: bool, + #[serde(rename = "EnableRealtimeMonitor")] + pub enable_realtime_monitor: bool, + #[serde(rename = "EnableLUFSScan")] + pub enable_lufs_scan: bool, + #[serde(rename = "EnableChapterImageExtraction")] + pub enable_chapter_image_extraction: bool, + #[serde(rename = "ExtractChapterImagesDuringLibraryScan")] + pub extract_chapter_images_during_library_scan: bool, + #[serde(rename = "EnableTrickplayImageExtraction")] + pub enable_trickplay_image_extraction: bool, + #[serde(rename = "ExtractTrickplayImagesDuringLibraryScan")] + pub extract_trickplay_images_during_library_scan: bool, + #[serde(rename = "PathInfos")] + pub path_infos: Vec, + #[serde(rename = "SaveLocalMetadata")] + pub save_local_metadata: bool, + #[serde(rename = "EnableInternetProviders")] + pub enable_internet_providers: bool, + #[serde(rename = "EnableAutomaticSeriesGrouping")] + pub enable_automatic_series_grouping: bool, + #[serde(rename = "EnableEmbeddedTitles")] + pub enable_embedded_titles: bool, + #[serde(rename = "EnableEmbeddedExtrasTitles")] + pub enable_embedded_extras_titles: bool, + #[serde(rename = "EnableEmbeddedEpisodeInfos")] + pub enable_embedded_episode_infos: bool, + #[serde(rename = "AutomaticRefreshIntervalDays")] + pub automatic_refresh_interval_days: i32, + #[serde(rename = "PreferredMetadataLanguage")] + pub preferred_metadata_language: Option, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: Option, + #[serde(rename = "SeasonZeroDisplayName")] + pub season_zero_display_name: String, + #[serde(rename = "MetadataSavers")] + pub metadata_savers: Option>, + #[serde(rename = "DisabledLocalMetadataReaders")] + pub disabled_local_metadata_readers: Vec, + #[serde(rename = "LocalMetadataReaderOrder")] + pub local_metadata_reader_order: Option>, + #[serde(rename = "DisabledSubtitleFetchers")] + pub disabled_subtitle_fetchers: Vec, + #[serde(rename = "SubtitleFetcherOrder")] + pub subtitle_fetcher_order: Vec, + #[serde(rename = "DisabledMediaSegmentProviders")] + pub disabled_media_segment_providers: Vec, + #[serde(rename = "MediaSegmentProvideOrder")] + pub media_segment_provide_order: Vec, + #[serde(rename = "SkipSubtitlesIfEmbeddedSubtitlesPresent")] + pub skip_subtitles_if_embedded_subtitles_present: bool, + #[serde(rename = "SkipSubtitlesIfAudioTrackMatches")] + pub skip_subtitles_if_audio_track_matches: bool, + #[serde(rename = "SubtitleDownloadLanguages")] + pub subtitle_download_languages: Option>, + #[serde(rename = "RequirePerfectSubtitleMatch")] + pub require_perfect_subtitle_match: bool, + #[serde(rename = "SaveSubtitlesWithMedia")] + pub save_subtitles_with_media: bool, + #[serde(rename = "SaveLyricsWithMedia")] + pub save_lyrics_with_media: bool, + #[serde(rename = "SaveTrickplayWithMedia")] + pub save_trickplay_with_media: bool, + #[serde(rename = "DisabledLyricFetchers")] + pub disabled_lyric_fetchers: Vec, + #[serde(rename = "LyricFetcherOrder")] + pub lyric_fetcher_order: Vec, + #[serde(rename = "PreferNonstandardArtistsTag")] + pub prefer_nonstandard_artists_tag: bool, + #[serde(rename = "UseCustomTagDelimiters")] + pub use_custom_tag_delimiters: bool, + #[serde(rename = "CustomTagDelimiters")] + pub custom_tag_delimiters: Vec, + #[serde(rename = "DelimiterWhitelist")] + pub delimiter_whitelist: Vec, + #[serde(rename = "AutomaticallyAddToCollection")] + pub automatically_add_to_collection: bool, + #[serde(rename = "AllowEmbeddedSubtitles")] + pub allow_embedded_subtitles: EmbeddedSubtitleOptions, + #[serde(rename = "TypeOptions")] + pub type_options: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LibraryOptionsResultDto { + #[serde(rename = "MetadataSavers")] + pub metadata_savers: Vec, + #[serde(rename = "MetadataReaders")] + pub metadata_readers: Vec, + #[serde(rename = "SubtitleFetchers")] + pub subtitle_fetchers: Vec, + #[serde(rename = "LyricFetchers")] + pub lyric_fetchers: Vec, + #[serde(rename = "TypeOptions")] + pub type_options: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LibraryTypeOptionsDto { + #[serde(rename = "Type")] + pub _type: Option, + #[serde(rename = "MetadataFetchers")] + pub metadata_fetchers: Vec, + #[serde(rename = "ImageFetchers")] + pub image_fetchers: Vec, + #[serde(rename = "SupportedImageTypes")] + pub supported_image_types: Vec, + #[serde(rename = "DefaultImageOptions")] + pub default_image_options: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LibraryUpdateInfo { + #[serde(rename = "FoldersAddedTo")] + pub folders_added_to: Vec, + #[serde(rename = "FoldersRemovedFrom")] + pub folders_removed_from: Vec, + #[serde(rename = "ItemsAdded")] + pub items_added: Vec, + #[serde(rename = "ItemsRemoved")] + pub items_removed: Vec, + #[serde(rename = "ItemsUpdated")] + pub items_updated: Vec, + #[serde(rename = "CollectionFolders")] + pub collection_folders: Vec, + #[serde(rename = "IsEmpty")] + pub is_empty: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ListingsProviderInfo { + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "Type")] + pub _type: Option, + #[serde(rename = "Username")] + pub username: Option, + #[serde(rename = "Password")] + pub password: Option, + #[serde(rename = "ListingsId")] + pub listings_id: Option, + #[serde(rename = "ZipCode")] + pub zip_code: Option, + #[serde(rename = "Country")] + pub country: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "EnabledTuners")] + pub enabled_tuners: Option>, + #[serde(rename = "EnableAllTuners")] + pub enable_all_tuners: bool, + #[serde(rename = "NewsCategories")] + pub news_categories: Option>, + #[serde(rename = "SportsCategories")] + pub sports_categories: Option>, + #[serde(rename = "KidsCategories")] + pub kids_categories: Option>, + #[serde(rename = "MovieCategories")] + pub movie_categories: Option>, + #[serde(rename = "ChannelMappings")] + pub channel_mappings: Option>, + #[serde(rename = "MoviePrefix")] + pub movie_prefix: Option, + #[serde(rename = "PreferredLanguage")] + pub preferred_language: Option, + #[serde(rename = "UserAgent")] + pub user_agent: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LiveStreamResponse { + #[serde(rename = "MediaSource")] + pub media_source: MediaSourceInfo, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LiveTvInfo { + #[serde(rename = "Services")] + pub services: Vec, + #[serde(rename = "IsEnabled")] + pub is_enabled: bool, + #[serde(rename = "EnabledUsers")] + pub enabled_users: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LiveTvOptions { + #[serde(rename = "GuideDays")] + pub guide_days: Option, + #[serde(rename = "RecordingPath")] + pub recording_path: Option, + #[serde(rename = "MovieRecordingPath")] + pub movie_recording_path: Option, + #[serde(rename = "SeriesRecordingPath")] + pub series_recording_path: Option, + #[serde(rename = "EnableRecordingSubfolders")] + pub enable_recording_subfolders: bool, + #[serde(rename = "EnableOriginalAudioWithEncodedRecordings")] + pub enable_original_audio_with_encoded_recordings: bool, + #[serde(rename = "TunerHosts")] + pub tuner_hosts: Option>, + #[serde(rename = "ListingProviders")] + pub listing_providers: Option>, + #[serde(rename = "PrePaddingSeconds")] + pub pre_padding_seconds: i32, + #[serde(rename = "PostPaddingSeconds")] + pub post_padding_seconds: i32, + #[serde(rename = "MediaLocationsCreated")] + pub media_locations_created: Option>, + #[serde(rename = "RecordingPostProcessor")] + pub recording_post_processor: Option, + #[serde(rename = "RecordingPostProcessorArguments")] + pub recording_post_processor_arguments: Option, + #[serde(rename = "SaveRecordingNFO")] + pub save_recording_nfo: bool, + #[serde(rename = "SaveRecordingImages")] + pub save_recording_images: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LiveTvServiceInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "HomePageUrl")] + pub home_page_url: Option, + #[serde(rename = "Status")] + pub status: LiveTvServiceStatus, + #[serde(rename = "StatusMessage")] + pub status_message: Option, + #[serde(rename = "Version")] + pub version: Option, + #[serde(rename = "HasUpdateAvailable")] + pub has_update_available: bool, + #[serde(rename = "IsVisible")] + pub is_visible: bool, + #[serde(rename = "Tuners")] + pub tuners: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LocalizationOption { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Value")] + pub value: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LogFile { + #[serde(rename = "DateCreated")] + pub date_created: String, + #[serde(rename = "DateModified")] + pub date_modified: String, + #[serde(rename = "Size")] + pub size: i64, + #[serde(rename = "Name")] + pub name: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LoginInfoInput { + #[serde(rename = "Username")] + pub username: String, + #[serde(rename = "Password")] + pub password: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LyricDto { + #[serde(rename = "Metadata")] + pub metadata: LyricMetadata, + #[serde(rename = "Lyrics")] + pub lyrics: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LyricLine { + #[serde(rename = "Text")] + pub text: String, + #[serde(rename = "Start")] + pub start: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct LyricMetadata { + #[serde(rename = "Artist")] + pub artist: Option, + #[serde(rename = "Album")] + pub album: Option, + #[serde(rename = "Title")] + pub title: Option, + #[serde(rename = "Author")] + pub author: Option, + #[serde(rename = "Length")] + pub length: Option, + #[serde(rename = "By")] + pub by: Option, + #[serde(rename = "Offset")] + pub offset: Option, + #[serde(rename = "Creator")] + pub creator: Option, + #[serde(rename = "Version")] + pub version: Option, + #[serde(rename = "IsSynced")] + pub is_synced: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MediaAttachment { + #[serde(rename = "Codec")] + pub codec: Option, + #[serde(rename = "CodecTag")] + pub codec_tag: Option, + #[serde(rename = "Comment")] + pub comment: Option, + #[serde(rename = "Index")] + pub index: i32, + #[serde(rename = "FileName")] + pub file_name: Option, + #[serde(rename = "MimeType")] + pub mime_type: Option, + #[serde(rename = "DeliveryUrl")] + pub delivery_url: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MediaPathDto { + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "PathInfo")] + pub path_info: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MediaPathInfo { + #[serde(rename = "Path")] + pub path: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MediaSegmentDto { + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "Type")] + pub _type: MediaSegmentType, + #[serde(rename = "StartTicks")] + pub start_ticks: i64, + #[serde(rename = "EndTicks")] + pub end_ticks: i64, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MediaSegmentDtoQueryResult { + #[serde(rename = "Items")] + pub items: Vec, + #[serde(rename = "TotalRecordCount")] + pub total_record_count: i32, + #[serde(rename = "StartIndex")] + pub start_index: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MediaSourceInfo { + #[serde(rename = "Protocol")] + pub protocol: MediaProtocol, + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "EncoderPath")] + pub encoder_path: Option, + #[serde(rename = "EncoderProtocol")] + pub encoder_protocol: Option, + #[serde(rename = "Type")] + pub _type: MediaSourceType, + #[serde(rename = "Container")] + pub container: Option, + #[serde(rename = "Size")] + pub size: Option, + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "IsRemote")] + pub is_remote: bool, + #[serde(rename = "ETag")] + pub e_tag: Option, + #[serde(rename = "RunTimeTicks")] + pub run_time_ticks: Option, + #[serde(rename = "ReadAtNativeFramerate")] + pub read_at_native_framerate: bool, + #[serde(rename = "IgnoreDts")] + pub ignore_dts: bool, + #[serde(rename = "IgnoreIndex")] + pub ignore_index: bool, + #[serde(rename = "GenPtsInput")] + pub gen_pts_input: bool, + #[serde(rename = "SupportsTranscoding")] + pub supports_transcoding: bool, + #[serde(rename = "SupportsDirectStream")] + pub supports_direct_stream: bool, + #[serde(rename = "SupportsDirectPlay")] + pub supports_direct_play: bool, + #[serde(rename = "IsInfiniteStream")] + pub is_infinite_stream: bool, + #[serde(rename = "UseMostCompatibleTranscodingProfile")] + pub use_most_compatible_transcoding_profile: bool, + #[serde(rename = "RequiresOpening")] + pub requires_opening: bool, + #[serde(rename = "OpenToken")] + pub open_token: Option, + #[serde(rename = "RequiresClosing")] + pub requires_closing: bool, + #[serde(rename = "LiveStreamId")] + pub live_stream_id: Option, + #[serde(rename = "BufferMs")] + pub buffer_ms: Option, + #[serde(rename = "RequiresLooping")] + pub requires_looping: bool, + #[serde(rename = "SupportsProbing")] + pub supports_probing: bool, + #[serde(rename = "VideoType")] + pub video_type: Option, + #[serde(rename = "IsoType")] + pub iso_type: Option, + #[serde(rename = "Video3DFormat")] + pub video3_d_format: Option, + #[serde(rename = "MediaStreams")] + pub media_streams: Option>, + #[serde(rename = "MediaAttachments")] + pub media_attachments: Option>, + #[serde(rename = "Formats")] + pub formats: Option>, + #[serde(rename = "Bitrate")] + pub bitrate: Option, + #[serde(rename = "FallbackMaxStreamingBitrate")] + pub fallback_max_streaming_bitrate: Option, + #[serde(rename = "Timestamp")] + pub timestamp: Option, + #[serde(rename = "RequiredHttpHeaders")] + pub required_http_headers: Option>>, + #[serde(rename = "TranscodingUrl")] + pub transcoding_url: Option, + #[serde(rename = "TranscodingSubProtocol")] + pub transcoding_sub_protocol: MediaStreamProtocol, + #[serde(rename = "TranscodingContainer")] + pub transcoding_container: Option, + #[serde(rename = "AnalyzeDurationMs")] + pub analyze_duration_ms: Option, + #[serde(rename = "DefaultAudioStreamIndex")] + pub default_audio_stream_index: Option, + #[serde(rename = "DefaultSubtitleStreamIndex")] + pub default_subtitle_stream_index: Option, + #[serde(rename = "HasSegments")] + pub has_segments: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MediaStream { + #[serde(rename = "Codec")] + pub codec: Option, + #[serde(rename = "CodecTag")] + pub codec_tag: Option, + #[serde(rename = "Language")] + pub language: Option, + #[serde(rename = "ColorRange")] + pub color_range: Option, + #[serde(rename = "ColorSpace")] + pub color_space: Option, + #[serde(rename = "ColorTransfer")] + pub color_transfer: Option, + #[serde(rename = "ColorPrimaries")] + pub color_primaries: Option, + #[serde(rename = "DvVersionMajor")] + pub dv_version_major: Option, + #[serde(rename = "DvVersionMinor")] + pub dv_version_minor: Option, + #[serde(rename = "DvProfile")] + pub dv_profile: Option, + #[serde(rename = "DvLevel")] + pub dv_level: Option, + #[serde(rename = "RpuPresentFlag")] + pub rpu_present_flag: Option, + #[serde(rename = "ElPresentFlag")] + pub el_present_flag: Option, + #[serde(rename = "BlPresentFlag")] + pub bl_present_flag: Option, + #[serde(rename = "DvBlSignalCompatibilityId")] + pub dv_bl_signal_compatibility_id: Option, + #[serde(rename = "Rotation")] + pub rotation: Option, + #[serde(rename = "Comment")] + pub comment: Option, + #[serde(rename = "TimeBase")] + pub time_base: Option, + #[serde(rename = "CodecTimeBase")] + pub codec_time_base: Option, + #[serde(rename = "Title")] + pub title: Option, + #[serde(rename = "VideoRange")] + pub video_range: VideoRange, + #[serde(rename = "VideoRangeType")] + pub video_range_type: VideoRangeType, + #[serde(rename = "VideoDoViTitle")] + pub video_do_vi_title: Option, + #[serde(rename = "AudioSpatialFormat")] + pub audio_spatial_format: AudioSpatialFormat, + #[serde(rename = "LocalizedUndefined")] + pub localized_undefined: Option, + #[serde(rename = "LocalizedDefault")] + pub localized_default: Option, + #[serde(rename = "LocalizedForced")] + pub localized_forced: Option, + #[serde(rename = "LocalizedExternal")] + pub localized_external: Option, + #[serde(rename = "LocalizedHearingImpaired")] + pub localized_hearing_impaired: Option, + #[serde(rename = "DisplayTitle")] + pub display_title: Option, + #[serde(rename = "NalLengthSize")] + pub nal_length_size: Option, + #[serde(rename = "IsInterlaced")] + pub is_interlaced: bool, + #[serde(rename = "IsAVC")] + pub is_avc: Option, + #[serde(rename = "ChannelLayout")] + pub channel_layout: Option, + #[serde(rename = "BitRate")] + pub bit_rate: Option, + #[serde(rename = "BitDepth")] + pub bit_depth: Option, + #[serde(rename = "RefFrames")] + pub ref_frames: Option, + #[serde(rename = "PacketLength")] + pub packet_length: Option, + #[serde(rename = "Channels")] + pub channels: Option, + #[serde(rename = "SampleRate")] + pub sample_rate: Option, + #[serde(rename = "IsDefault")] + pub is_default: bool, + #[serde(rename = "IsForced")] + pub is_forced: bool, + #[serde(rename = "IsHearingImpaired")] + pub is_hearing_impaired: bool, + #[serde(rename = "Height")] + pub height: Option, + #[serde(rename = "Width")] + pub width: Option, + #[serde(rename = "AverageFrameRate")] + pub average_frame_rate: Option, + #[serde(rename = "RealFrameRate")] + pub real_frame_rate: Option, + #[serde(rename = "ReferenceFrameRate")] + pub reference_frame_rate: Option, + #[serde(rename = "Profile")] + pub profile: Option, + #[serde(rename = "Type")] + pub _type: MediaStreamType, + #[serde(rename = "AspectRatio")] + pub aspect_ratio: Option, + #[serde(rename = "Index")] + pub index: i32, + #[serde(rename = "Score")] + pub score: Option, + #[serde(rename = "IsExternal")] + pub is_external: bool, + #[serde(rename = "DeliveryMethod")] + pub delivery_method: Option, + #[serde(rename = "DeliveryUrl")] + pub delivery_url: Option, + #[serde(rename = "IsExternalUrl")] + pub is_external_url: Option, + #[serde(rename = "IsTextSubtitleStream")] + pub is_text_subtitle_stream: bool, + #[serde(rename = "SupportsExternalStream")] + pub supports_external_stream: bool, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "PixelFormat")] + pub pixel_format: Option, + #[serde(rename = "Level")] + pub level: Option, + #[serde(rename = "IsAnamorphic")] + pub is_anamorphic: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MediaUpdateInfoDto { + #[serde(rename = "Updates")] + pub updates: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MediaUpdateInfoPathDto { + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "UpdateType")] + pub update_type: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MediaUrl { + #[serde(rename = "Url")] + pub url: Option, + #[serde(rename = "Name")] + pub name: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MessageCommand { + #[serde(rename = "Header")] + pub header: Option, + #[serde(rename = "Text")] + pub text: String, + #[serde(rename = "TimeoutMs")] + pub timeout_ms: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MetadataConfiguration { + #[serde(rename = "UseFileCreationTimeForDateAdded")] + pub use_file_creation_time_for_date_added: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MetadataEditorInfo { + #[serde(rename = "ParentalRatingOptions")] + pub parental_rating_options: Vec, + #[serde(rename = "Countries")] + pub countries: Vec, + #[serde(rename = "Cultures")] + pub cultures: Vec, + #[serde(rename = "ExternalIdInfos")] + pub external_id_infos: Vec, + #[serde(rename = "ContentType")] + pub content_type: Option, + #[serde(rename = "ContentTypeOptions")] + pub content_type_options: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MetadataOptions { + #[serde(rename = "ItemType")] + pub item_type: Option, + #[serde(rename = "DisabledMetadataSavers")] + pub disabled_metadata_savers: Option>, + #[serde(rename = "LocalMetadataReaderOrder")] + pub local_metadata_reader_order: Option>, + #[serde(rename = "DisabledMetadataFetchers")] + pub disabled_metadata_fetchers: Option>, + #[serde(rename = "MetadataFetcherOrder")] + pub metadata_fetcher_order: Option>, + #[serde(rename = "DisabledImageFetchers")] + pub disabled_image_fetchers: Option>, + #[serde(rename = "ImageFetcherOrder")] + pub image_fetcher_order: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MovePlaylistItemRequestDto { + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: String, + #[serde(rename = "NewIndex")] + pub new_index: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MovieInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "OriginalTitle")] + pub original_title: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "MetadataLanguage")] + pub metadata_language: Option, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: Option, + #[serde(rename = "ProviderIds")] + pub provider_ids: Option>>, + #[serde(rename = "Year")] + pub year: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "PremiereDate")] + pub premiere_date: Option, + #[serde(rename = "IsAutomated")] + pub is_automated: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MovieInfoRemoteSearchQuery { + #[serde(rename = "SearchInfo")] + pub search_info: Option, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SearchProviderName")] + pub search_provider_name: Option, + #[serde(rename = "IncludeDisabledProviders")] + pub include_disabled_providers: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MusicVideoInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "OriginalTitle")] + pub original_title: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "MetadataLanguage")] + pub metadata_language: Option, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: Option, + #[serde(rename = "ProviderIds")] + pub provider_ids: Option>>, + #[serde(rename = "Year")] + pub year: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "PremiereDate")] + pub premiere_date: Option, + #[serde(rename = "IsAutomated")] + pub is_automated: bool, + #[serde(rename = "Artists")] + pub artists: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct MusicVideoInfoRemoteSearchQuery { + #[serde(rename = "SearchInfo")] + pub search_info: Option, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SearchProviderName")] + pub search_provider_name: Option, + #[serde(rename = "IncludeDisabledProviders")] + pub include_disabled_providers: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct NameGuidPair { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Id")] + pub id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct NameIdPair { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Id")] + pub id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct NameValuePair { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Value")] + pub value: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct NetworkConfiguration { + #[serde(rename = "BaseUrl")] + pub base_url: String, + #[serde(rename = "EnableHttps")] + pub enable_https: bool, + #[serde(rename = "RequireHttps")] + pub require_https: bool, + #[serde(rename = "CertificatePath")] + pub certificate_path: String, + #[serde(rename = "CertificatePassword")] + pub certificate_password: String, + #[serde(rename = "InternalHttpPort")] + pub internal_http_port: i32, + #[serde(rename = "InternalHttpsPort")] + pub internal_https_port: i32, + #[serde(rename = "PublicHttpPort")] + pub public_http_port: i32, + #[serde(rename = "PublicHttpsPort")] + pub public_https_port: i32, + #[serde(rename = "AutoDiscovery")] + pub auto_discovery: bool, + #[serde(rename = "EnableUPnP")] + pub enable_u_pn_p: bool, + #[serde(rename = "EnableIPv4")] + pub enable_i_pv4: bool, + #[serde(rename = "EnableIPv6")] + pub enable_i_pv6: bool, + #[serde(rename = "EnableRemoteAccess")] + pub enable_remote_access: bool, + #[serde(rename = "LocalNetworkSubnets")] + pub local_network_subnets: Vec, + #[serde(rename = "LocalNetworkAddresses")] + pub local_network_addresses: Vec, + #[serde(rename = "KnownProxies")] + pub known_proxies: Vec, + #[serde(rename = "IgnoreVirtualInterfaces")] + pub ignore_virtual_interfaces: bool, + #[serde(rename = "VirtualInterfaceNames")] + pub virtual_interface_names: Vec, + #[serde(rename = "EnablePublishedServerUriByRequest")] + pub enable_published_server_uri_by_request: bool, + #[serde(rename = "PublishedServerUriBySubnet")] + pub published_server_uri_by_subnet: Vec, + #[serde(rename = "RemoteIPFilter")] + pub remote_ip_filter: Vec, + #[serde(rename = "IsRemoteIPFilterBlacklist")] + pub is_remote_ip_filter_blacklist: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct NewGroupRequestDto { + #[serde(rename = "GroupName")] + pub group_name: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct NextItemRequestDto { + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct OpenLiveStreamDto { + #[serde(rename = "OpenToken")] + pub open_token: Option, + #[serde(rename = "UserId")] + pub user_id: Option, + #[serde(rename = "PlaySessionId")] + pub play_session_id: Option, + #[serde(rename = "MaxStreamingBitrate")] + pub max_streaming_bitrate: Option, + #[serde(rename = "StartTimeTicks")] + pub start_time_ticks: Option, + #[serde(rename = "AudioStreamIndex")] + pub audio_stream_index: Option, + #[serde(rename = "SubtitleStreamIndex")] + pub subtitle_stream_index: Option, + #[serde(rename = "MaxAudioChannels")] + pub max_audio_channels: Option, + #[serde(rename = "ItemId")] + pub item_id: Option, + #[serde(rename = "EnableDirectPlay")] + pub enable_direct_play: Option, + #[serde(rename = "EnableDirectStream")] + pub enable_direct_stream: Option, + #[serde(rename = "AlwaysBurnInSubtitleWhenTranscoding")] + pub always_burn_in_subtitle_when_transcoding: Option, + #[serde(rename = "DeviceProfile")] + pub device_profile: Option, + #[serde(rename = "DirectPlayProtocols")] + pub direct_play_protocols: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct OutboundKeepAliveMessage { + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PackageInfo { + #[serde(rename = "name")] + pub name: String, + #[serde(rename = "description")] + pub description: String, + #[serde(rename = "overview")] + pub overview: String, + #[serde(rename = "owner")] + pub owner: String, + #[serde(rename = "category")] + pub category: String, + #[serde(rename = "guid")] + pub guid: String, + #[serde(rename = "versions")] + pub versions: Vec, + #[serde(rename = "imageUrl")] + pub image_url: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ParentalRating { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Value")] + pub value: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PathSubstitution { + #[serde(rename = "From")] + pub from: String, + #[serde(rename = "To")] + pub to: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PersonLookupInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "OriginalTitle")] + pub original_title: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "MetadataLanguage")] + pub metadata_language: Option, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: Option, + #[serde(rename = "ProviderIds")] + pub provider_ids: Option>>, + #[serde(rename = "Year")] + pub year: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "PremiereDate")] + pub premiere_date: Option, + #[serde(rename = "IsAutomated")] + pub is_automated: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PersonLookupInfoRemoteSearchQuery { + #[serde(rename = "SearchInfo")] + pub search_info: Option, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SearchProviderName")] + pub search_provider_name: Option, + #[serde(rename = "IncludeDisabledProviders")] + pub include_disabled_providers: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PingRequestDto { + #[serde(rename = "Ping")] + pub ping: i64, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PinRedeemResult { + #[serde(rename = "Success")] + pub success: bool, + #[serde(rename = "UsersReset")] + pub users_reset: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlaybackInfoDto { + #[serde(rename = "UserId")] + pub user_id: Option, + #[serde(rename = "MaxStreamingBitrate")] + pub max_streaming_bitrate: Option, + #[serde(rename = "StartTimeTicks")] + pub start_time_ticks: Option, + #[serde(rename = "AudioStreamIndex")] + pub audio_stream_index: Option, + #[serde(rename = "SubtitleStreamIndex")] + pub subtitle_stream_index: Option, + #[serde(rename = "MaxAudioChannels")] + pub max_audio_channels: Option, + #[serde(rename = "MediaSourceId")] + pub media_source_id: Option, + #[serde(rename = "LiveStreamId")] + pub live_stream_id: Option, + #[serde(rename = "DeviceProfile")] + pub device_profile: Option, + #[serde(rename = "EnableDirectPlay")] + pub enable_direct_play: Option, + #[serde(rename = "EnableDirectStream")] + pub enable_direct_stream: Option, + #[serde(rename = "EnableTranscoding")] + pub enable_transcoding: Option, + #[serde(rename = "AllowVideoStreamCopy")] + pub allow_video_stream_copy: Option, + #[serde(rename = "AllowAudioStreamCopy")] + pub allow_audio_stream_copy: Option, + #[serde(rename = "AutoOpenLiveStream")] + pub auto_open_live_stream: Option, + #[serde(rename = "AlwaysBurnInSubtitleWhenTranscoding")] + pub always_burn_in_subtitle_when_transcoding: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlaybackInfoResponse { + #[serde(rename = "MediaSources")] + pub media_sources: Vec, + #[serde(rename = "PlaySessionId")] + pub play_session_id: Option, + #[serde(rename = "ErrorCode")] + pub error_code: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlaybackProgressInfo { + #[serde(rename = "CanSeek")] + pub can_seek: bool, + #[serde(rename = "Item")] + pub item: Option, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SessionId")] + pub session_id: Option, + #[serde(rename = "MediaSourceId")] + pub media_source_id: Option, + #[serde(rename = "AudioStreamIndex")] + pub audio_stream_index: Option, + #[serde(rename = "SubtitleStreamIndex")] + pub subtitle_stream_index: Option, + #[serde(rename = "IsPaused")] + pub is_paused: bool, + #[serde(rename = "IsMuted")] + pub is_muted: bool, + #[serde(rename = "PositionTicks")] + pub position_ticks: Option, + #[serde(rename = "PlaybackStartTimeTicks")] + pub playback_start_time_ticks: Option, + #[serde(rename = "VolumeLevel")] + pub volume_level: Option, + #[serde(rename = "Brightness")] + pub brightness: Option, + #[serde(rename = "AspectRatio")] + pub aspect_ratio: Option, + #[serde(rename = "PlayMethod")] + pub play_method: PlayMethod, + #[serde(rename = "LiveStreamId")] + pub live_stream_id: Option, + #[serde(rename = "PlaySessionId")] + pub play_session_id: Option, + #[serde(rename = "RepeatMode")] + pub repeat_mode: RepeatMode, + #[serde(rename = "PlaybackOrder")] + pub playback_order: PlaybackOrder, + #[serde(rename = "NowPlayingQueue")] + pub now_playing_queue: Option>, + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlaybackStartInfo { + #[serde(rename = "CanSeek")] + pub can_seek: bool, + #[serde(rename = "Item")] + pub item: Option, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SessionId")] + pub session_id: Option, + #[serde(rename = "MediaSourceId")] + pub media_source_id: Option, + #[serde(rename = "AudioStreamIndex")] + pub audio_stream_index: Option, + #[serde(rename = "SubtitleStreamIndex")] + pub subtitle_stream_index: Option, + #[serde(rename = "IsPaused")] + pub is_paused: bool, + #[serde(rename = "IsMuted")] + pub is_muted: bool, + #[serde(rename = "PositionTicks")] + pub position_ticks: Option, + #[serde(rename = "PlaybackStartTimeTicks")] + pub playback_start_time_ticks: Option, + #[serde(rename = "VolumeLevel")] + pub volume_level: Option, + #[serde(rename = "Brightness")] + pub brightness: Option, + #[serde(rename = "AspectRatio")] + pub aspect_ratio: Option, + #[serde(rename = "PlayMethod")] + pub play_method: PlayMethod, + #[serde(rename = "LiveStreamId")] + pub live_stream_id: Option, + #[serde(rename = "PlaySessionId")] + pub play_session_id: Option, + #[serde(rename = "RepeatMode")] + pub repeat_mode: RepeatMode, + #[serde(rename = "PlaybackOrder")] + pub playback_order: PlaybackOrder, + #[serde(rename = "NowPlayingQueue")] + pub now_playing_queue: Option>, + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlaybackStopInfo { + #[serde(rename = "Item")] + pub item: Option, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SessionId")] + pub session_id: Option, + #[serde(rename = "MediaSourceId")] + pub media_source_id: Option, + #[serde(rename = "PositionTicks")] + pub position_ticks: Option, + #[serde(rename = "LiveStreamId")] + pub live_stream_id: Option, + #[serde(rename = "PlaySessionId")] + pub play_session_id: Option, + #[serde(rename = "Failed")] + pub failed: bool, + #[serde(rename = "NextMediaType")] + pub next_media_type: Option, + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: Option, + #[serde(rename = "NowPlayingQueue")] + pub now_playing_queue: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlayerStateInfo { + #[serde(rename = "PositionTicks")] + pub position_ticks: Option, + #[serde(rename = "CanSeek")] + pub can_seek: bool, + #[serde(rename = "IsPaused")] + pub is_paused: bool, + #[serde(rename = "IsMuted")] + pub is_muted: bool, + #[serde(rename = "VolumeLevel")] + pub volume_level: Option, + #[serde(rename = "AudioStreamIndex")] + pub audio_stream_index: Option, + #[serde(rename = "SubtitleStreamIndex")] + pub subtitle_stream_index: Option, + #[serde(rename = "MediaSourceId")] + pub media_source_id: Option, + #[serde(rename = "PlayMethod")] + pub play_method: Option, + #[serde(rename = "RepeatMode")] + pub repeat_mode: RepeatMode, + #[serde(rename = "PlaybackOrder")] + pub playback_order: PlaybackOrder, + #[serde(rename = "LiveStreamId")] + pub live_stream_id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlaylistCreationResult { + #[serde(rename = "Id")] + pub id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlaylistDto { + #[serde(rename = "OpenAccess")] + pub open_access: bool, + #[serde(rename = "Shares")] + pub shares: Vec, + #[serde(rename = "ItemIds")] + pub item_ids: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlaylistUserPermissions { + #[serde(rename = "UserId")] + pub user_id: String, + #[serde(rename = "CanEdit")] + pub can_edit: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlayMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlayQueueUpdate { + #[serde(rename = "Reason")] + pub reason: PlayQueueUpdateReason, + #[serde(rename = "LastUpdate")] + pub last_update: String, + #[serde(rename = "Playlist")] + pub playlist: Vec, + #[serde(rename = "PlayingItemIndex")] + pub playing_item_index: i32, + #[serde(rename = "StartPositionTicks")] + pub start_position_ticks: i64, + #[serde(rename = "IsPlaying")] + pub is_playing: bool, + #[serde(rename = "ShuffleMode")] + pub shuffle_mode: GroupShuffleMode, + #[serde(rename = "RepeatMode")] + pub repeat_mode: GroupRepeatMode, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlayQueueUpdateGroupUpdate { + #[serde(rename = "GroupId")] + pub group_id: String, + #[serde(rename = "Type")] + pub _type: GroupUpdateType, + #[serde(rename = "Data")] + pub data: PlayQueueUpdate, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlayRequest { + #[serde(rename = "ItemIds")] + pub item_ids: Option>, + #[serde(rename = "StartPositionTicks")] + pub start_position_ticks: Option, + #[serde(rename = "PlayCommand")] + pub play_command: PlayCommand, + #[serde(rename = "ControllingUserId")] + pub controlling_user_id: String, + #[serde(rename = "SubtitleStreamIndex")] + pub subtitle_stream_index: Option, + #[serde(rename = "AudioStreamIndex")] + pub audio_stream_index: Option, + #[serde(rename = "MediaSourceId")] + pub media_source_id: Option, + #[serde(rename = "StartIndex")] + pub start_index: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlayRequestDto { + #[serde(rename = "PlayingQueue")] + pub playing_queue: Vec, + #[serde(rename = "PlayingItemPosition")] + pub playing_item_position: i32, + #[serde(rename = "StartPositionTicks")] + pub start_position_ticks: i64, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlaystateMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PlaystateRequest { + #[serde(rename = "Command")] + pub command: PlaystateCommand, + #[serde(rename = "SeekPositionTicks")] + pub seek_position_ticks: Option, + #[serde(rename = "ControllingUserId")] + pub controlling_user_id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PluginInfo { + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "Version")] + pub version: String, + #[serde(rename = "ConfigurationFileName")] + pub configuration_file_name: Option, + #[serde(rename = "Description")] + pub description: String, + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "CanUninstall")] + pub can_uninstall: bool, + #[serde(rename = "HasImage")] + pub has_image: bool, + #[serde(rename = "Status")] + pub status: PluginStatus, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PluginInstallationCancelledMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PluginInstallationCompletedMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PluginInstallationFailedMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PluginInstallingMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PluginUninstalledMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PreviousItemRequestDto { + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ProblemDetails { + #[serde(rename = "type")] + pub _type: Option, + #[serde(rename = "title")] + pub title: Option, + #[serde(rename = "status")] + pub status: Option, + #[serde(rename = "detail")] + pub detail: Option, + #[serde(rename = "instance")] + pub instance: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ProfileCondition { + #[serde(rename = "Condition")] + pub condition: ProfileConditionType, + #[serde(rename = "Property")] + pub property: ProfileConditionValue, + #[serde(rename = "Value")] + pub value: Option, + #[serde(rename = "IsRequired")] + pub is_required: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PublicSystemInfo { + #[serde(rename = "LocalAddress")] + pub local_address: Option, + #[serde(rename = "ServerName")] + pub server_name: Option, + #[serde(rename = "Version")] + pub version: Option, + #[serde(rename = "ProductName")] + pub product_name: Option, + #[serde(rename = "OperatingSystem")] + pub operating_system: Option, + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "StartupWizardCompleted")] + pub startup_wizard_completed: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct QueryFilters { + #[serde(rename = "Genres")] + pub genres: Option>, + #[serde(rename = "Tags")] + pub tags: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct QueryFiltersLegacy { + #[serde(rename = "Genres")] + pub genres: Option>, + #[serde(rename = "Tags")] + pub tags: Option>, + #[serde(rename = "OfficialRatings")] + pub official_ratings: Option>, + #[serde(rename = "Years")] + pub years: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct QueueItem { + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct QueueRequestDto { + #[serde(rename = "ItemIds")] + pub item_ids: Vec, + #[serde(rename = "Mode")] + pub mode: GroupQueueMode, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct QuickConnectDto { + #[serde(rename = "Secret")] + pub secret: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct QuickConnectResult { + #[serde(rename = "Authenticated")] + pub authenticated: bool, + #[serde(rename = "Secret")] + pub secret: String, + #[serde(rename = "Code")] + pub code: String, + #[serde(rename = "DeviceId")] + pub device_id: String, + #[serde(rename = "DeviceName")] + pub device_name: String, + #[serde(rename = "AppName")] + pub app_name: String, + #[serde(rename = "AppVersion")] + pub app_version: String, + #[serde(rename = "DateAdded")] + pub date_added: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ReadyRequestDto { + #[serde(rename = "When")] + pub when: String, + #[serde(rename = "PositionTicks")] + pub position_ticks: i64, + #[serde(rename = "IsPlaying")] + pub is_playing: bool, + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct RecommendationDto { + #[serde(rename = "Items")] + pub items: Option>, + #[serde(rename = "RecommendationType")] + pub recommendation_type: RecommendationType, + #[serde(rename = "BaselineItemName")] + pub baseline_item_name: Option, + #[serde(rename = "CategoryId")] + pub category_id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct RefreshProgressMessage { + #[serde(rename = "Data")] + pub data: Option>>, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct RemoteImageInfo { + #[serde(rename = "ProviderName")] + pub provider_name: Option, + #[serde(rename = "Url")] + pub url: Option, + #[serde(rename = "ThumbnailUrl")] + pub thumbnail_url: Option, + #[serde(rename = "Height")] + pub height: Option, + #[serde(rename = "Width")] + pub width: Option, + #[serde(rename = "CommunityRating")] + pub community_rating: Option, + #[serde(rename = "VoteCount")] + pub vote_count: Option, + #[serde(rename = "Language")] + pub language: Option, + #[serde(rename = "Type")] + pub _type: ImageType, + #[serde(rename = "RatingType")] + pub rating_type: RatingType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct RemoteImageResult { + #[serde(rename = "Images")] + pub images: Option>, + #[serde(rename = "TotalRecordCount")] + pub total_record_count: i32, + #[serde(rename = "Providers")] + pub providers: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct RemoteLyricInfoDto { + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "ProviderName")] + pub provider_name: String, + #[serde(rename = "Lyrics")] + pub lyrics: LyricDto, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct RemoteSearchResult { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "ProviderIds")] + pub provider_ids: Option>>, + #[serde(rename = "ProductionYear")] + pub production_year: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "IndexNumberEnd")] + pub index_number_end: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "PremiereDate")] + pub premiere_date: Option, + #[serde(rename = "ImageUrl")] + pub image_url: Option, + #[serde(rename = "SearchProviderName")] + pub search_provider_name: Option, + #[serde(rename = "Overview")] + pub overview: Option, + #[serde(rename = "AlbumArtist")] + pub album_artist: Option>, + #[serde(rename = "Artists")] + pub artists: Option>>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct RemoteSubtitleInfo { + #[serde(rename = "ThreeLetterISOLanguageName")] + pub three_letter_iso_language_name: Option, + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "ProviderName")] + pub provider_name: Option, + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Format")] + pub format: Option, + #[serde(rename = "Author")] + pub author: Option, + #[serde(rename = "Comment")] + pub comment: Option, + #[serde(rename = "DateCreated")] + pub date_created: Option, + #[serde(rename = "CommunityRating")] + pub community_rating: Option, + #[serde(rename = "FrameRate")] + pub frame_rate: Option, + #[serde(rename = "DownloadCount")] + pub download_count: Option, + #[serde(rename = "IsHashMatch")] + pub is_hash_match: Option, + #[serde(rename = "AiTranslated")] + pub ai_translated: Option, + #[serde(rename = "MachineTranslated")] + pub machine_translated: Option, + #[serde(rename = "Forced")] + pub forced: Option, + #[serde(rename = "HearingImpaired")] + pub hearing_impaired: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct RemovedItem { + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SeriesId")] + pub series_id: Option, + #[serde(rename = "Season")] + pub season: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct RemovedItemQueryResult { + #[serde(rename = "Items")] + pub items: Vec, + #[serde(rename = "TotalRecordCount")] + pub total_record_count: i32, + #[serde(rename = "StartIndex")] + pub start_index: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct RemoveFromPlaylistRequestDto { + #[serde(rename = "PlaylistItemIds")] + pub playlist_item_ids: Vec, + #[serde(rename = "ClearPlaylist")] + pub clear_playlist: bool, + #[serde(rename = "ClearPlayingItem")] + pub clear_playing_item: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct RepositoryInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Url")] + pub url: Option, + #[serde(rename = "Enabled")] + pub enabled: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct RestartRequiredMessage { + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ScheduledTaskEndedMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ScheduledTasksInfoMessage { + #[serde(rename = "Data")] + pub data: Option>, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ScheduledTasksInfoStartMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ScheduledTasksInfoStopMessage { + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SearchHint { + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "MatchedTerm")] + pub matched_term: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "ProductionYear")] + pub production_year: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "PrimaryImageTag")] + pub primary_image_tag: Option, + #[serde(rename = "ThumbImageTag")] + pub thumb_image_tag: Option, + #[serde(rename = "ThumbImageItemId")] + pub thumb_image_item_id: Option, + #[serde(rename = "BackdropImageTag")] + pub backdrop_image_tag: Option, + #[serde(rename = "BackdropImageItemId")] + pub backdrop_image_item_id: Option, + #[serde(rename = "Type")] + pub _type: BaseItemKind, + #[serde(rename = "IsFolder")] + pub is_folder: Option, + #[serde(rename = "RunTimeTicks")] + pub run_time_ticks: Option, + #[serde(rename = "MediaType")] + pub media_type: MediaType, + #[serde(rename = "StartDate")] + pub start_date: Option, + #[serde(rename = "EndDate")] + pub end_date: Option, + #[serde(rename = "Series")] + pub series: Option, + #[serde(rename = "Status")] + pub status: Option, + #[serde(rename = "Album")] + pub album: Option, + #[serde(rename = "AlbumId")] + pub album_id: Option, + #[serde(rename = "AlbumArtist")] + pub album_artist: Option, + #[serde(rename = "Artists")] + pub artists: Vec, + #[serde(rename = "SongCount")] + pub song_count: Option, + #[serde(rename = "EpisodeCount")] + pub episode_count: Option, + #[serde(rename = "ChannelId")] + pub channel_id: Option, + #[serde(rename = "ChannelName")] + pub channel_name: Option, + #[serde(rename = "PrimaryImageAspectRatio")] + pub primary_image_aspect_ratio: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SearchHintResult { + #[serde(rename = "SearchHints")] + pub search_hints: Vec, + #[serde(rename = "TotalRecordCount")] + pub total_record_count: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SeekRequestDto { + #[serde(rename = "PositionTicks")] + pub position_ticks: i64, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SendCommand { + #[serde(rename = "GroupId")] + pub group_id: String, + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: String, + #[serde(rename = "When")] + pub when: String, + #[serde(rename = "PositionTicks")] + pub position_ticks: Option, + #[serde(rename = "Command")] + pub command: SendCommandType, + #[serde(rename = "EmittedAt")] + pub emitted_at: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SeriesInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "OriginalTitle")] + pub original_title: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "MetadataLanguage")] + pub metadata_language: Option, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: Option, + #[serde(rename = "ProviderIds")] + pub provider_ids: Option>>, + #[serde(rename = "Year")] + pub year: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "PremiereDate")] + pub premiere_date: Option, + #[serde(rename = "IsAutomated")] + pub is_automated: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SeriesInfoRemoteSearchQuery { + #[serde(rename = "SearchInfo")] + pub search_info: Option, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SearchProviderName")] + pub search_provider_name: Option, + #[serde(rename = "IncludeDisabledProviders")] + pub include_disabled_providers: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SeriesTimerCancelledMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SeriesTimerCreatedMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SeriesTimerInfoDto { + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "Type")] + pub _type: Option, + #[serde(rename = "ServerId")] + pub server_id: Option, + #[serde(rename = "ExternalId")] + pub external_id: Option, + #[serde(rename = "ChannelId")] + pub channel_id: String, + #[serde(rename = "ExternalChannelId")] + pub external_channel_id: Option, + #[serde(rename = "ChannelName")] + pub channel_name: Option, + #[serde(rename = "ChannelPrimaryImageTag")] + pub channel_primary_image_tag: Option, + #[serde(rename = "ProgramId")] + pub program_id: Option, + #[serde(rename = "ExternalProgramId")] + pub external_program_id: Option, + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Overview")] + pub overview: Option, + #[serde(rename = "StartDate")] + pub start_date: String, + #[serde(rename = "EndDate")] + pub end_date: String, + #[serde(rename = "ServiceName")] + pub service_name: Option, + #[serde(rename = "Priority")] + pub priority: i32, + #[serde(rename = "PrePaddingSeconds")] + pub pre_padding_seconds: i32, + #[serde(rename = "PostPaddingSeconds")] + pub post_padding_seconds: i32, + #[serde(rename = "IsPrePaddingRequired")] + pub is_pre_padding_required: bool, + #[serde(rename = "ParentBackdropItemId")] + pub parent_backdrop_item_id: Option, + #[serde(rename = "ParentBackdropImageTags")] + pub parent_backdrop_image_tags: Option>, + #[serde(rename = "IsPostPaddingRequired")] + pub is_post_padding_required: bool, + #[serde(rename = "KeepUntil")] + pub keep_until: KeepUntil, + #[serde(rename = "RecordAnyTime")] + pub record_any_time: bool, + #[serde(rename = "SkipEpisodesInLibrary")] + pub skip_episodes_in_library: bool, + #[serde(rename = "RecordAnyChannel")] + pub record_any_channel: bool, + #[serde(rename = "KeepUpTo")] + pub keep_up_to: i32, + #[serde(rename = "RecordNewOnly")] + pub record_new_only: bool, + #[serde(rename = "Days")] + pub days: Option>, + #[serde(rename = "DayPattern")] + pub day_pattern: Option, + #[serde(rename = "ImageTags")] + pub image_tags: Option>, + #[serde(rename = "ParentThumbItemId")] + pub parent_thumb_item_id: Option, + #[serde(rename = "ParentThumbImageTag")] + pub parent_thumb_image_tag: Option, + #[serde(rename = "ParentPrimaryImageItemId")] + pub parent_primary_image_item_id: Option, + #[serde(rename = "ParentPrimaryImageTag")] + pub parent_primary_image_tag: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SeriesTimerInfoDtoQueryResult { + #[serde(rename = "Items")] + pub items: Vec, + #[serde(rename = "TotalRecordCount")] + pub total_record_count: i32, + #[serde(rename = "StartIndex")] + pub start_index: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ServerConfiguration { + #[serde(rename = "LogFileRetentionDays")] + pub log_file_retention_days: i32, + #[serde(rename = "IsStartupWizardCompleted")] + pub is_startup_wizard_completed: bool, + #[serde(rename = "CachePath")] + pub cache_path: Option, + #[serde(rename = "PreviousVersion")] + pub previous_version: Option, + #[serde(rename = "PreviousVersionStr")] + pub previous_version_str: Option, + #[serde(rename = "EnableMetrics")] + pub enable_metrics: bool, + #[serde(rename = "EnableNormalizedItemByNameIds")] + pub enable_normalized_item_by_name_ids: bool, + #[serde(rename = "IsPortAuthorized")] + pub is_port_authorized: bool, + #[serde(rename = "QuickConnectAvailable")] + pub quick_connect_available: bool, + #[serde(rename = "EnableCaseSensitiveItemIds")] + pub enable_case_sensitive_item_ids: bool, + #[serde(rename = "DisableLiveTvChannelUserDataName")] + pub disable_live_tv_channel_user_data_name: bool, + #[serde(rename = "MetadataPath")] + pub metadata_path: String, + #[serde(rename = "PreferredMetadataLanguage")] + pub preferred_metadata_language: String, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: String, + #[serde(rename = "SortReplaceCharacters")] + pub sort_replace_characters: Vec, + #[serde(rename = "SortRemoveCharacters")] + pub sort_remove_characters: Vec, + #[serde(rename = "SortRemoveWords")] + pub sort_remove_words: Vec, + #[serde(rename = "MinResumePct")] + pub min_resume_pct: i32, + #[serde(rename = "MaxResumePct")] + pub max_resume_pct: i32, + #[serde(rename = "MinResumeDurationSeconds")] + pub min_resume_duration_seconds: i32, + #[serde(rename = "MinAudiobookResume")] + pub min_audiobook_resume: i32, + #[serde(rename = "MaxAudiobookResume")] + pub max_audiobook_resume: i32, + #[serde(rename = "InactiveSessionThreshold")] + pub inactive_session_threshold: i32, + #[serde(rename = "LibraryMonitorDelay")] + pub library_monitor_delay: i32, + #[serde(rename = "LibraryUpdateDuration")] + pub library_update_duration: i32, + #[serde(rename = "ImageSavingConvention")] + pub image_saving_convention: ImageSavingConvention, + #[serde(rename = "MetadataOptions")] + pub metadata_options: Vec, + #[serde(rename = "SkipDeserializationForBasicTypes")] + pub skip_deserialization_for_basic_types: bool, + #[serde(rename = "ServerName")] + pub server_name: String, + #[serde(rename = "UICulture")] + pub ui_culture: String, + #[serde(rename = "SaveMetadataHidden")] + pub save_metadata_hidden: bool, + #[serde(rename = "ContentTypes")] + pub content_types: Vec, + #[serde(rename = "RemoteClientBitrateLimit")] + pub remote_client_bitrate_limit: i32, + #[serde(rename = "EnableFolderView")] + pub enable_folder_view: bool, + #[serde(rename = "EnableGroupingIntoCollections")] + pub enable_grouping_into_collections: bool, + #[serde(rename = "DisplaySpecialsWithinSeasons")] + pub display_specials_within_seasons: bool, + #[serde(rename = "CodecsUsed")] + pub codecs_used: Vec, + #[serde(rename = "PluginRepositories")] + pub plugin_repositories: Vec, + #[serde(rename = "EnableExternalContentInSuggestions")] + pub enable_external_content_in_suggestions: bool, + #[serde(rename = "ImageExtractionTimeoutMs")] + pub image_extraction_timeout_ms: i32, + #[serde(rename = "PathSubstitutions")] + pub path_substitutions: Vec, + #[serde(rename = "EnableSlowResponseWarning")] + pub enable_slow_response_warning: bool, + #[serde(rename = "SlowResponseThresholdMs")] + pub slow_response_threshold_ms: i64, + #[serde(rename = "CorsHosts")] + pub cors_hosts: Vec, + #[serde(rename = "ActivityLogRetentionDays")] + pub activity_log_retention_days: Option, + #[serde(rename = "LibraryScanFanoutConcurrency")] + pub library_scan_fanout_concurrency: i32, + #[serde(rename = "LibraryMetadataRefreshConcurrency")] + pub library_metadata_refresh_concurrency: i32, + #[serde(rename = "RemoveOldPlugins")] + pub remove_old_plugins: bool, + #[serde(rename = "AllowClientLogUpload")] + pub allow_client_log_upload: bool, + #[serde(rename = "DummyChapterDuration")] + pub dummy_chapter_duration: i32, + #[serde(rename = "ChapterImageResolution")] + pub chapter_image_resolution: ImageResolution, + #[serde(rename = "ParallelImageEncodingLimit")] + pub parallel_image_encoding_limit: i32, + #[serde(rename = "CastReceiverApplications")] + pub cast_receiver_applications: Vec, + #[serde(rename = "TrickplayOptions")] + pub trickplay_options: TrickplayOptions, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ServerDiscoveryInfo { + #[serde(rename = "Address")] + pub address: String, + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "EndpointAddress")] + pub endpoint_address: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ServerRestartingMessage { + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ServerShuttingDownMessage { + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SessionInfoDto { + #[serde(rename = "PlayState")] + pub play_state: Option, + #[serde(rename = "AdditionalUsers")] + pub additional_users: Option>, + #[serde(rename = "Capabilities")] + pub capabilities: Option, + #[serde(rename = "RemoteEndPoint")] + pub remote_end_point: Option, + #[serde(rename = "PlayableMediaTypes")] + pub playable_media_types: Vec, + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "UserId")] + pub user_id: String, + #[serde(rename = "UserName")] + pub user_name: Option, + #[serde(rename = "Client")] + pub client: Option, + #[serde(rename = "LastActivityDate")] + pub last_activity_date: String, + #[serde(rename = "LastPlaybackCheckIn")] + pub last_playback_check_in: String, + #[serde(rename = "LastPausedDate")] + pub last_paused_date: Option, + #[serde(rename = "DeviceName")] + pub device_name: Option, + #[serde(rename = "DeviceType")] + pub device_type: Option, + #[serde(rename = "NowPlayingItem")] + pub now_playing_item: Option, + #[serde(rename = "NowViewingItem")] + pub now_viewing_item: Option, + #[serde(rename = "DeviceId")] + pub device_id: Option, + #[serde(rename = "ApplicationVersion")] + pub application_version: Option, + #[serde(rename = "TranscodingInfo")] + pub transcoding_info: Option, + #[serde(rename = "IsActive")] + pub is_active: bool, + #[serde(rename = "SupportsMediaControl")] + pub supports_media_control: bool, + #[serde(rename = "SupportsRemoteControl")] + pub supports_remote_control: bool, + #[serde(rename = "NowPlayingQueue")] + pub now_playing_queue: Option>, + #[serde(rename = "NowPlayingQueueFullItems")] + pub now_playing_queue_full_items: Option>, + #[serde(rename = "HasCustomDeviceName")] + pub has_custom_device_name: bool, + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: Option, + #[serde(rename = "ServerId")] + pub server_id: Option, + #[serde(rename = "UserPrimaryImageTag")] + pub user_primary_image_tag: Option, + #[serde(rename = "SupportedCommands")] + pub supported_commands: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SessionsMessage { + #[serde(rename = "Data")] + pub data: Option>, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SessionsStartMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SessionsStopMessage { + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SessionUserInfo { + #[serde(rename = "UserId")] + pub user_id: String, + #[serde(rename = "UserName")] + pub user_name: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SetChannelMappingDto { + #[serde(rename = "ProviderId")] + pub provider_id: String, + #[serde(rename = "TunerChannelId")] + pub tuner_channel_id: String, + #[serde(rename = "ProviderChannelId")] + pub provider_channel_id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SetPlaylistItemRequestDto { + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SetRepeatModeRequestDto { + #[serde(rename = "Mode")] + pub mode: GroupRepeatMode, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SetShuffleModeRequestDto { + #[serde(rename = "Mode")] + pub mode: GroupShuffleMode, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SongInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "OriginalTitle")] + pub original_title: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "MetadataLanguage")] + pub metadata_language: Option, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: Option, + #[serde(rename = "ProviderIds")] + pub provider_ids: Option>>, + #[serde(rename = "Year")] + pub year: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "PremiereDate")] + pub premiere_date: Option, + #[serde(rename = "IsAutomated")] + pub is_automated: bool, + #[serde(rename = "AlbumArtists")] + pub album_artists: Option>, + #[serde(rename = "Album")] + pub album: Option, + #[serde(rename = "Artists")] + pub artists: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SpecialViewOptionDto { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Id")] + pub id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct StartupConfigurationDto { + #[serde(rename = "UICulture")] + pub ui_culture: Option, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: Option, + #[serde(rename = "PreferredMetadataLanguage")] + pub preferred_metadata_language: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct StartupRemoteAccessDto { + #[serde(rename = "EnableRemoteAccess")] + pub enable_remote_access: bool, + #[serde(rename = "EnableAutomaticPortMapping")] + pub enable_automatic_port_mapping: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct StartupUserDto { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Password")] + pub password: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct StringGroupUpdate { + #[serde(rename = "GroupId")] + pub group_id: String, + #[serde(rename = "Type")] + pub _type: GroupUpdateType, + #[serde(rename = "Data")] + pub data: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SubtitleOptions { + #[serde(rename = "SkipIfEmbeddedSubtitlesPresent")] + pub skip_if_embedded_subtitles_present: bool, + #[serde(rename = "SkipIfAudioTrackMatches")] + pub skip_if_audio_track_matches: bool, + #[serde(rename = "DownloadLanguages")] + pub download_languages: Option>, + #[serde(rename = "DownloadMovieSubtitles")] + pub download_movie_subtitles: bool, + #[serde(rename = "DownloadEpisodeSubtitles")] + pub download_episode_subtitles: bool, + #[serde(rename = "OpenSubtitlesUsername")] + pub open_subtitles_username: Option, + #[serde(rename = "OpenSubtitlesPasswordHash")] + pub open_subtitles_password_hash: Option, + #[serde(rename = "IsOpenSubtitleVipAccount")] + pub is_open_subtitle_vip_account: bool, + #[serde(rename = "RequirePerfectMatch")] + pub require_perfect_match: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SubtitleProfile { + #[serde(rename = "Format")] + pub format: Option, + #[serde(rename = "Method")] + pub method: SubtitleDeliveryMethod, + #[serde(rename = "DidlMode")] + pub didl_mode: Option, + #[serde(rename = "Language")] + pub language: Option, + #[serde(rename = "Container")] + pub container: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SyncPlayCommandMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SyncPlayGroupUpdateCommandMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SyncPlayQueueItem { + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "PlaylistItemId")] + pub playlist_item_id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SyncStats { + #[serde(rename = "UpdatedFolders")] + pub updated_folders: i32, + #[serde(rename = "RemovedFolders")] + pub removed_folders: i32, + #[serde(rename = "UpdatedBoxSets")] + pub updated_box_sets: i32, + #[serde(rename = "RemovedBoxSets")] + pub removed_box_sets: i32, + #[serde(rename = "UpdatedPlaylists")] + pub updated_playlists: i32, + #[serde(rename = "RemovedPlaylists")] + pub removed_playlists: i32, + #[serde(rename = "UpdatedTvShows")] + pub updated_tv_shows: i32, + #[serde(rename = "RemovedTvShows")] + pub removed_tv_shows: i32, + #[serde(rename = "UpdatedSeasons")] + pub updated_seasons: i32, + #[serde(rename = "RemovedSeasons")] + pub removed_seasons: i32, + #[serde(rename = "UpdatedVideos")] + pub updated_videos: i32, + #[serde(rename = "RemovedVideos")] + pub removed_videos: i32, + #[serde(rename = "UpdatedCollectionFolders")] + pub updated_collection_folders: i32, + #[serde(rename = "UpdatedUserData")] + pub updated_user_data: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct SystemInfo { + #[serde(rename = "LocalAddress")] + pub local_address: Option, + #[serde(rename = "ServerName")] + pub server_name: Option, + #[serde(rename = "Version")] + pub version: Option, + #[serde(rename = "ProductName")] + pub product_name: Option, + #[serde(rename = "OperatingSystem")] + pub operating_system: Option, + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "StartupWizardCompleted")] + pub startup_wizard_completed: Option, + #[serde(rename = "OperatingSystemDisplayName")] + pub operating_system_display_name: Option, + #[serde(rename = "PackageName")] + pub package_name: Option, + #[serde(rename = "HasPendingRestart")] + pub has_pending_restart: bool, + #[serde(rename = "IsShuttingDown")] + pub is_shutting_down: bool, + #[serde(rename = "SupportsLibraryMonitor")] + pub supports_library_monitor: bool, + #[serde(rename = "WebSocketPortNumber")] + pub web_socket_port_number: i32, + #[serde(rename = "CompletedInstallations")] + pub completed_installations: Option>, + #[serde(rename = "CanSelfRestart")] + pub can_self_restart: bool, + #[serde(rename = "CanLaunchWebBrowser")] + pub can_launch_web_browser: bool, + #[serde(rename = "ProgramDataPath")] + pub program_data_path: Option, + #[serde(rename = "WebPath")] + pub web_path: Option, + #[serde(rename = "ItemsByNamePath")] + pub items_by_name_path: Option, + #[serde(rename = "CachePath")] + pub cache_path: Option, + #[serde(rename = "LogPath")] + pub log_path: Option, + #[serde(rename = "InternalMetadataPath")] + pub internal_metadata_path: Option, + #[serde(rename = "TranscodingTempPath")] + pub transcoding_temp_path: Option, + #[serde(rename = "CastReceiverApplications")] + pub cast_receiver_applications: Option>, + #[serde(rename = "HasUpdateAvailable")] + pub has_update_available: bool, + #[serde(rename = "EncoderLocation")] + pub encoder_location: Option, + #[serde(rename = "SystemArchitecture")] + pub system_architecture: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TaskInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "State")] + pub state: TaskState, + #[serde(rename = "CurrentProgressPercentage")] + pub current_progress_percentage: Option, + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "LastExecutionResult")] + pub last_execution_result: Option, + #[serde(rename = "Triggers")] + pub triggers: Option>, + #[serde(rename = "Description")] + pub description: Option, + #[serde(rename = "Category")] + pub category: Option, + #[serde(rename = "IsHidden")] + pub is_hidden: bool, + #[serde(rename = "Key")] + pub key: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TaskResult { + #[serde(rename = "StartTimeUtc")] + pub start_time_utc: String, + #[serde(rename = "EndTimeUtc")] + pub end_time_utc: String, + #[serde(rename = "Status")] + pub status: TaskCompletionStatus, + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Key")] + pub key: Option, + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "ErrorMessage")] + pub error_message: Option, + #[serde(rename = "LongErrorMessage")] + pub long_error_message: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TaskTriggerInfo { + #[serde(rename = "Type")] + pub _type: Option, + #[serde(rename = "TimeOfDayTicks")] + pub time_of_day_ticks: Option, + #[serde(rename = "IntervalTicks")] + pub interval_ticks: Option, + #[serde(rename = "DayOfWeek")] + pub day_of_week: Option, + #[serde(rename = "MaxRuntimeTicks")] + pub max_runtime_ticks: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ThemeMediaResult { + #[serde(rename = "Items")] + pub items: Vec, + #[serde(rename = "TotalRecordCount")] + pub total_record_count: i32, + #[serde(rename = "StartIndex")] + pub start_index: i32, + #[serde(rename = "OwnerId")] + pub owner_id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TimerCancelledMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TimerCreatedMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TimerEventInfo { + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "ProgramId")] + pub program_id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TimerInfoDto { + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "Type")] + pub _type: Option, + #[serde(rename = "ServerId")] + pub server_id: Option, + #[serde(rename = "ExternalId")] + pub external_id: Option, + #[serde(rename = "ChannelId")] + pub channel_id: String, + #[serde(rename = "ExternalChannelId")] + pub external_channel_id: Option, + #[serde(rename = "ChannelName")] + pub channel_name: Option, + #[serde(rename = "ChannelPrimaryImageTag")] + pub channel_primary_image_tag: Option, + #[serde(rename = "ProgramId")] + pub program_id: Option, + #[serde(rename = "ExternalProgramId")] + pub external_program_id: Option, + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Overview")] + pub overview: Option, + #[serde(rename = "StartDate")] + pub start_date: String, + #[serde(rename = "EndDate")] + pub end_date: String, + #[serde(rename = "ServiceName")] + pub service_name: Option, + #[serde(rename = "Priority")] + pub priority: i32, + #[serde(rename = "PrePaddingSeconds")] + pub pre_padding_seconds: i32, + #[serde(rename = "PostPaddingSeconds")] + pub post_padding_seconds: i32, + #[serde(rename = "IsPrePaddingRequired")] + pub is_pre_padding_required: bool, + #[serde(rename = "ParentBackdropItemId")] + pub parent_backdrop_item_id: Option, + #[serde(rename = "ParentBackdropImageTags")] + pub parent_backdrop_image_tags: Option>, + #[serde(rename = "IsPostPaddingRequired")] + pub is_post_padding_required: bool, + #[serde(rename = "KeepUntil")] + pub keep_until: KeepUntil, + #[serde(rename = "Status")] + pub status: RecordingStatus, + #[serde(rename = "SeriesTimerId")] + pub series_timer_id: Option, + #[serde(rename = "ExternalSeriesTimerId")] + pub external_series_timer_id: Option, + #[serde(rename = "RunTimeTicks")] + pub run_time_ticks: Option, + #[serde(rename = "ProgramInfo")] + pub program_info: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TimerInfoDtoQueryResult { + #[serde(rename = "Items")] + pub items: Vec, + #[serde(rename = "TotalRecordCount")] + pub total_record_count: i32, + #[serde(rename = "StartIndex")] + pub start_index: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TrailerInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "OriginalTitle")] + pub original_title: Option, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "MetadataLanguage")] + pub metadata_language: Option, + #[serde(rename = "MetadataCountryCode")] + pub metadata_country_code: Option, + #[serde(rename = "ProviderIds")] + pub provider_ids: Option>>, + #[serde(rename = "Year")] + pub year: Option, + #[serde(rename = "IndexNumber")] + pub index_number: Option, + #[serde(rename = "ParentIndexNumber")] + pub parent_index_number: Option, + #[serde(rename = "PremiereDate")] + pub premiere_date: Option, + #[serde(rename = "IsAutomated")] + pub is_automated: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TrailerInfoRemoteSearchQuery { + #[serde(rename = "SearchInfo")] + pub search_info: Option, + #[serde(rename = "ItemId")] + pub item_id: String, + #[serde(rename = "SearchProviderName")] + pub search_provider_name: Option, + #[serde(rename = "IncludeDisabledProviders")] + pub include_disabled_providers: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TranscodingInfo { + #[serde(rename = "AudioCodec")] + pub audio_codec: Option, + #[serde(rename = "VideoCodec")] + pub video_codec: Option, + #[serde(rename = "Container")] + pub container: Option, + #[serde(rename = "IsVideoDirect")] + pub is_video_direct: bool, + #[serde(rename = "IsAudioDirect")] + pub is_audio_direct: bool, + #[serde(rename = "Bitrate")] + pub bitrate: Option, + #[serde(rename = "Framerate")] + pub framerate: Option, + #[serde(rename = "CompletionPercentage")] + pub completion_percentage: Option, + #[serde(rename = "Width")] + pub width: Option, + #[serde(rename = "Height")] + pub height: Option, + #[serde(rename = "AudioChannels")] + pub audio_channels: Option, + #[serde(rename = "HardwareAccelerationType")] + pub hardware_acceleration_type: Option, + #[serde(rename = "TranscodeReasons")] + pub transcode_reasons: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TranscodingProfile { + #[serde(rename = "Container")] + pub container: String, + #[serde(rename = "Type")] + pub _type: DlnaProfileType, + #[serde(rename = "VideoCodec")] + pub video_codec: String, + #[serde(rename = "AudioCodec")] + pub audio_codec: String, + #[serde(rename = "Protocol")] + pub protocol: MediaStreamProtocol, + #[serde(rename = "EstimateContentLength")] + pub estimate_content_length: bool, + #[serde(rename = "EnableMpegtsM2TsMode")] + pub enable_mpegts_m2_ts_mode: bool, + #[serde(rename = "TranscodeSeekInfo")] + pub transcode_seek_info: TranscodeSeekInfo, + #[serde(rename = "CopyTimestamps")] + pub copy_timestamps: bool, + #[serde(rename = "Context")] + pub context: EncodingContext, + #[serde(rename = "EnableSubtitlesInManifest")] + pub enable_subtitles_in_manifest: bool, + #[serde(rename = "MaxAudioChannels")] + pub max_audio_channels: Option, + #[serde(rename = "MinSegments")] + pub min_segments: i32, + #[serde(rename = "SegmentLength")] + pub segment_length: i32, + #[serde(rename = "BreakOnNonKeyFrames")] + pub break_on_non_key_frames: bool, + #[serde(rename = "Conditions")] + pub conditions: Vec, + #[serde(rename = "EnableAudioVbrEncoding")] + pub enable_audio_vbr_encoding: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TrickplayInfo { + #[serde(rename = "Width")] + pub width: i32, + #[serde(rename = "Height")] + pub height: i32, + #[serde(rename = "TileWidth")] + pub tile_width: i32, + #[serde(rename = "TileHeight")] + pub tile_height: i32, + #[serde(rename = "ThumbnailCount")] + pub thumbnail_count: i32, + #[serde(rename = "Interval")] + pub interval: i32, + #[serde(rename = "Bandwidth")] + pub bandwidth: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TrickplayOptions { + #[serde(rename = "EnableHwAcceleration")] + pub enable_hw_acceleration: bool, + #[serde(rename = "EnableHwEncoding")] + pub enable_hw_encoding: bool, + #[serde(rename = "EnableKeyFrameOnlyExtraction")] + pub enable_key_frame_only_extraction: bool, + #[serde(rename = "ScanBehavior")] + pub scan_behavior: TrickplayScanBehavior, + #[serde(rename = "ProcessPriority")] + pub process_priority: ProcessPriorityClass, + #[serde(rename = "Interval")] + pub interval: i32, + #[serde(rename = "WidthResolutions")] + pub width_resolutions: Vec, + #[serde(rename = "TileWidth")] + pub tile_width: i32, + #[serde(rename = "TileHeight")] + pub tile_height: i32, + #[serde(rename = "Qscale")] + pub qscale: i32, + #[serde(rename = "JpegQuality")] + pub jpeg_quality: i32, + #[serde(rename = "ProcessThreads")] + pub process_threads: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TunerChannelMapping { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "ProviderChannelName")] + pub provider_channel_name: Option, + #[serde(rename = "ProviderChannelId")] + pub provider_channel_id: Option, + #[serde(rename = "Id")] + pub id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TunerHostInfo { + #[serde(rename = "Id")] + pub id: Option, + #[serde(rename = "Url")] + pub url: Option, + #[serde(rename = "Type")] + pub _type: Option, + #[serde(rename = "DeviceId")] + pub device_id: Option, + #[serde(rename = "FriendlyName")] + pub friendly_name: Option, + #[serde(rename = "ImportFavoritesOnly")] + pub import_favorites_only: bool, + #[serde(rename = "AllowHWTranscoding")] + pub allow_hw_transcoding: bool, + #[serde(rename = "AllowFmp4TranscodingContainer")] + pub allow_fmp4_transcoding_container: bool, + #[serde(rename = "AllowStreamSharing")] + pub allow_stream_sharing: bool, + #[serde(rename = "FallbackMaxStreamingBitrate")] + pub fallback_max_streaming_bitrate: i32, + #[serde(rename = "EnableStreamLooping")] + pub enable_stream_looping: bool, + #[serde(rename = "Source")] + pub source: Option, + #[serde(rename = "TunerCount")] + pub tuner_count: i32, + #[serde(rename = "UserAgent")] + pub user_agent: Option, + #[serde(rename = "IgnoreDts")] + pub ignore_dts: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct TypeOptions { + #[serde(rename = "Type")] + pub _type: Option, + #[serde(rename = "MetadataFetchers")] + pub metadata_fetchers: Option>, + #[serde(rename = "MetadataFetcherOrder")] + pub metadata_fetcher_order: Option>, + #[serde(rename = "ImageFetchers")] + pub image_fetchers: Option>, + #[serde(rename = "ImageFetcherOrder")] + pub image_fetcher_order: Option>, + #[serde(rename = "ImageOptions")] + pub image_options: Option>, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UpdateLibraryOptionsDto { + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "LibraryOptions")] + pub library_options: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UpdateMediaPathRequestDto { + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "PathInfo")] + pub path_info: MediaPathInfo, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UpdatePlaylistDto { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Ids")] + pub ids: Option>, + #[serde(rename = "Users")] + pub users: Option>, + #[serde(rename = "IsPublic")] + pub is_public: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UpdatePlaylistUserDto { + #[serde(rename = "CanEdit")] + pub can_edit: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UpdateUserItemDataDto { + #[serde(rename = "Rating")] + pub rating: Option, + #[serde(rename = "PlayedPercentage")] + pub played_percentage: Option, + #[serde(rename = "UnplayedItemCount")] + pub unplayed_item_count: Option, + #[serde(rename = "PlaybackPositionTicks")] + pub playback_position_ticks: Option, + #[serde(rename = "PlayCount")] + pub play_count: Option, + #[serde(rename = "IsFavorite")] + pub is_favorite: Option, + #[serde(rename = "Likes")] + pub likes: Option, + #[serde(rename = "LastPlayedDate")] + pub last_played_date: Option, + #[serde(rename = "Played")] + pub played: Option, + #[serde(rename = "Key")] + pub key: Option, + #[serde(rename = "ItemId")] + pub item_id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UpdateUserPassword { + #[serde(rename = "CurrentPassword")] + pub current_password: Option, + #[serde(rename = "CurrentPw")] + pub current_pw: Option, + #[serde(rename = "NewPw")] + pub new_pw: Option, + #[serde(rename = "ResetPassword")] + pub reset_password: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UploadSubtitleDto { + #[serde(rename = "Language")] + pub language: String, + #[serde(rename = "Format")] + pub format: String, + #[serde(rename = "IsForced")] + pub is_forced: bool, + #[serde(rename = "IsHearingImpaired")] + pub is_hearing_impaired: bool, + #[serde(rename = "Data")] + pub data: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UserConfiguration { + #[serde(rename = "AudioLanguagePreference")] + pub audio_language_preference: Option, + #[serde(rename = "PlayDefaultAudioTrack")] + pub play_default_audio_track: bool, + #[serde(rename = "SubtitleLanguagePreference")] + pub subtitle_language_preference: Option, + #[serde(rename = "DisplayMissingEpisodes")] + pub display_missing_episodes: bool, + #[serde(rename = "GroupedFolders")] + pub grouped_folders: Vec, + #[serde(rename = "SubtitleMode")] + pub subtitle_mode: SubtitlePlaybackMode, + #[serde(rename = "DisplayCollectionsView")] + pub display_collections_view: bool, + #[serde(rename = "EnableLocalPassword")] + pub enable_local_password: bool, + #[serde(rename = "OrderedViews")] + pub ordered_views: Vec, + #[serde(rename = "LatestItemsExcludes")] + pub latest_items_excludes: Vec, + #[serde(rename = "MyMediaExcludes")] + pub my_media_excludes: Vec, + #[serde(rename = "HidePlayedInLatest")] + pub hide_played_in_latest: bool, + #[serde(rename = "RememberAudioSelections")] + pub remember_audio_selections: bool, + #[serde(rename = "RememberSubtitleSelections")] + pub remember_subtitle_selections: bool, + #[serde(rename = "EnableNextEpisodeAutoPlay")] + pub enable_next_episode_auto_play: bool, + #[serde(rename = "CastReceiverId")] + pub cast_receiver_id: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UserDataChangedMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UserDataChangeInfo { + #[serde(rename = "UserId")] + pub user_id: String, + #[serde(rename = "UserDataList")] + pub user_data_list: Vec, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UserDeletedMessage { + #[serde(rename = "Data")] + pub data: String, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UserDto { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "ServerId")] + pub server_id: Option, + #[serde(rename = "ServerName")] + pub server_name: Option, + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "PrimaryImageTag")] + pub primary_image_tag: Option, + #[serde(rename = "HasPassword")] + pub has_password: bool, + #[serde(rename = "HasConfiguredPassword")] + pub has_configured_password: bool, + #[serde(rename = "HasConfiguredEasyPassword")] + pub has_configured_easy_password: bool, + #[serde(rename = "EnableAutoLogin")] + pub enable_auto_login: Option, + #[serde(rename = "LastLoginDate")] + pub last_login_date: Option, + #[serde(rename = "LastActivityDate")] + pub last_activity_date: Option, + #[serde(rename = "Configuration")] + pub configuration: Option, + #[serde(rename = "Policy")] + pub policy: Option, + #[serde(rename = "PrimaryImageAspectRatio")] + pub primary_image_aspect_ratio: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UserItemDataDto { + #[serde(rename = "Rating")] + pub rating: Option, + #[serde(rename = "PlayedPercentage")] + pub played_percentage: Option, + #[serde(rename = "UnplayedItemCount")] + pub unplayed_item_count: Option, + #[serde(rename = "PlaybackPositionTicks")] + pub playback_position_ticks: i64, + #[serde(rename = "PlayCount")] + pub play_count: i32, + #[serde(rename = "IsFavorite")] + pub is_favorite: bool, + #[serde(rename = "Likes")] + pub likes: Option, + #[serde(rename = "LastPlayedDate")] + pub last_played_date: Option, + #[serde(rename = "Played")] + pub played: bool, + #[serde(rename = "Key")] + pub key: String, + #[serde(rename = "ItemId")] + pub item_id: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UserItemDataDtoQueryResult { + #[serde(rename = "Items")] + pub items: Vec, + #[serde(rename = "TotalRecordCount")] + pub total_record_count: i32, + #[serde(rename = "StartIndex")] + pub start_index: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UserPolicy { + #[serde(rename = "IsAdministrator")] + pub is_administrator: bool, + #[serde(rename = "IsHidden")] + pub is_hidden: bool, + #[serde(rename = "EnableCollectionManagement")] + pub enable_collection_management: bool, + #[serde(rename = "EnableSubtitleManagement")] + pub enable_subtitle_management: bool, + #[serde(rename = "EnableLyricManagement")] + pub enable_lyric_management: bool, + #[serde(rename = "IsDisabled")] + pub is_disabled: bool, + #[serde(rename = "MaxParentalRating")] + pub max_parental_rating: Option, + #[serde(rename = "BlockedTags")] + pub blocked_tags: Option>, + #[serde(rename = "AllowedTags")] + pub allowed_tags: Option>, + #[serde(rename = "EnableUserPreferenceAccess")] + pub enable_user_preference_access: bool, + #[serde(rename = "AccessSchedules")] + pub access_schedules: Option>, + #[serde(rename = "BlockUnratedItems")] + pub block_unrated_items: Option>, + #[serde(rename = "EnableRemoteControlOfOtherUsers")] + pub enable_remote_control_of_other_users: bool, + #[serde(rename = "EnableSharedDeviceControl")] + pub enable_shared_device_control: bool, + #[serde(rename = "EnableRemoteAccess")] + pub enable_remote_access: bool, + #[serde(rename = "EnableLiveTvManagement")] + pub enable_live_tv_management: bool, + #[serde(rename = "EnableLiveTvAccess")] + pub enable_live_tv_access: bool, + #[serde(rename = "EnableMediaPlayback")] + pub enable_media_playback: bool, + #[serde(rename = "EnableAudioPlaybackTranscoding")] + pub enable_audio_playback_transcoding: bool, + #[serde(rename = "EnableVideoPlaybackTranscoding")] + pub enable_video_playback_transcoding: bool, + #[serde(rename = "EnablePlaybackRemuxing")] + pub enable_playback_remuxing: bool, + #[serde(rename = "ForceRemoteSourceTranscoding")] + pub force_remote_source_transcoding: bool, + #[serde(rename = "EnableContentDeletion")] + pub enable_content_deletion: bool, + #[serde(rename = "EnableContentDeletionFromFolders")] + pub enable_content_deletion_from_folders: Option>, + #[serde(rename = "EnableContentDownloading")] + pub enable_content_downloading: bool, + #[serde(rename = "EnableSyncTranscoding")] + pub enable_sync_transcoding: bool, + #[serde(rename = "EnableMediaConversion")] + pub enable_media_conversion: bool, + #[serde(rename = "EnabledDevices")] + pub enabled_devices: Option>, + #[serde(rename = "EnableAllDevices")] + pub enable_all_devices: bool, + #[serde(rename = "EnabledChannels")] + pub enabled_channels: Option>, + #[serde(rename = "EnableAllChannels")] + pub enable_all_channels: bool, + #[serde(rename = "EnabledFolders")] + pub enabled_folders: Option>, + #[serde(rename = "EnableAllFolders")] + pub enable_all_folders: bool, + #[serde(rename = "InvalidLoginAttemptCount")] + pub invalid_login_attempt_count: i32, + #[serde(rename = "LoginAttemptsBeforeLockout")] + pub login_attempts_before_lockout: i32, + #[serde(rename = "MaxActiveSessions")] + pub max_active_sessions: i32, + #[serde(rename = "EnablePublicSharing")] + pub enable_public_sharing: bool, + #[serde(rename = "BlockedMediaFolders")] + pub blocked_media_folders: Option>, + #[serde(rename = "BlockedChannels")] + pub blocked_channels: Option>, + #[serde(rename = "RemoteClientBitrateLimit")] + pub remote_client_bitrate_limit: i32, + #[serde(rename = "AuthenticationProviderId")] + pub authentication_provider_id: String, + #[serde(rename = "PasswordResetProviderId")] + pub password_reset_provider_id: String, + #[serde(rename = "SyncPlayAccess")] + pub sync_play_access: SyncPlayUserAccessType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UserUpdatedMessage { + #[serde(rename = "Data")] + pub data: Option, + #[serde(rename = "MessageId")] + pub message_id: String, + #[serde(rename = "MessageType")] + pub message_type: SessionMessageType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UtcTimeResponse { + #[serde(rename = "RequestReceptionTime")] + pub request_reception_time: String, + #[serde(rename = "ResponseTransmissionTime")] + pub response_transmission_time: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ValidatePathDto { + #[serde(rename = "ValidateWritable")] + pub validate_writable: bool, + #[serde(rename = "Path")] + pub path: Option, + #[serde(rename = "IsFile")] + pub is_file: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct VersionInfo { + #[serde(rename = "version")] + pub version: String, + #[serde(rename = "VersionNumber")] + pub version_number: String, + #[serde(rename = "changelog")] + pub changelog: Option, + #[serde(rename = "targetAbi")] + pub target_abi: Option, + #[serde(rename = "sourceUrl")] + pub source_url: Option, + #[serde(rename = "checksum")] + pub checksum: Option, + #[serde(rename = "timestamp")] + pub timestamp: Option, + #[serde(rename = "repositoryName")] + pub repository_name: String, + #[serde(rename = "repositoryUrl")] + pub repository_url: String, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct VirtualFolderInfo { + #[serde(rename = "Name")] + pub name: Option, + #[serde(rename = "Locations")] + pub locations: Option>, + #[serde(rename = "CollectionType")] + pub collection_type: Option, + #[serde(rename = "LibraryOptions")] + pub library_options: Option, + #[serde(rename = "ItemId")] + pub item_id: Option, + #[serde(rename = "PrimaryImageItemId")] + pub primary_image_item_id: Option, + #[serde(rename = "RefreshProgress")] + pub refresh_progress: Option, + #[serde(rename = "RefreshStatus")] + pub refresh_status: Option, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct WakeOnLanInfo { + #[serde(rename = "MacAddress")] + pub mac_address: Option, + #[serde(rename = "Port")] + pub port: i32, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct XbmcMetadataOptions { + #[serde(rename = "UserId")] + pub user_id: Option, + #[serde(rename = "ReleaseDateFormat")] + pub release_date_format: String, + #[serde(rename = "SaveImagePathsInNfo")] + pub save_image_paths_in_nfo: bool, + #[serde(rename = "EnablePathSubstitution")] + pub enable_path_substitution: bool, + #[serde(rename = "EnableExtraThumbsDuplication")] + pub enable_extra_thumbs_duplication: bool, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ApiName { + Mal, + AniList, + Kitsu, + Annict, + Shikimori, + Simkl, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum AudioSpatialFormat { + None, + DolbyAtmos, + Dtsx, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum BaseItemKind { + AggregateFolder, + Audio, + AudioBook, + BasePluginFolder, + Book, + BoxSet, + Channel, + ChannelFolderItem, + CollectionFolder, + Episode, + Folder, + Genre, + ManualPlaylistsFolder, + Movie, + LiveTvChannel, + LiveTvProgram, + MusicAlbum, + MusicArtist, + MusicGenre, + MusicVideo, + Person, + Photo, + PhotoAlbum, + Playlist, + PlaylistsFolder, + Program, + Recording, + Season, + Series, + Studio, + Trailer, + TvChannel, + TvProgram, + UserRootFolder, + UserView, + Video, + Year, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ChannelItemSortField { + Name, + CommunityRating, + PremiereDate, + DateCreated, + Runtime, + PlayCount, + CommunityPlayCount, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ChannelMediaContentType { + Clip, + Podcast, + Trailer, + Movie, + Episode, + Song, + MovieExtra, + TvExtra, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ChannelMediaType { + Audio, + Video, + Photo, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ChannelType { + Tv, + Radio, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum CodecType { + Video, + VideoAudio, + Audio, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum CollectionType { + Unknown, + Movies, + Tvshows, + Music, + Musicvideos, + Trailers, + Homevideos, + Boxsets, + Books, + Photos, + Livetv, + Playlists, + Folders, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum CollectionTypeOptions { + Movies, + Tvshows, + Music, + Musicvideos, + Homevideos, + Boxsets, + Books, + Mixed, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum DayOfWeek { + Sunday, + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum DayPattern { + Daily, + Weekdays, + Weekends, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum DeinterlaceMethod { + Yadif, + Bwdif, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum DlnaProfileType { + Audio, + Video, + Photo, + Subtitle, + Lyric, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum DownMixStereoAlgorithms { + None, + Dave750, + NightmodeDialogue, + Rfc7845, + Ac4, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum DynamicDayOfWeek { + Sunday, + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Everyday, + Weekday, + Weekend, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum EmbeddedSubtitleOptions { + AllowAll, + AllowText, + AllowImage, + AllowNone, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum EncoderPreset { + Auto, + Placebo, + Veryslow, + Slower, + Slow, + Medium, + Fast, + Faster, + Veryfast, + Superfast, + Ultrafast, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum EncodingContext { + Streaming, + Static, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ExternalIdMediaType { + Album, + AlbumArtist, + Artist, + BoxSet, + Episode, + Movie, + OtherArtist, + Person, + ReleaseGroup, + Season, + Series, + Track, + Book, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ExtraType { + Unknown, + Clip, + Trailer, + BehindTheScenes, + DeletedScene, + Interview, + Scene, + Sample, + ThemeSong, + ThemeVideo, + Featurette, + Short, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum FileSystemEntryType { + File, + Directory, + NetworkComputer, + NetworkShare, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ForgotPasswordAction { + ContactAdmin, + PinCode, + InNetworkRequired, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum GeneralCommandType { + MoveUp, + MoveDown, + MoveLeft, + MoveRight, + PageUp, + PageDown, + PreviousLetter, + NextLetter, + ToggleOsd, + ToggleContextMenu, + Select, + Back, + TakeScreenshot, + SendKey, + SendString, + GoHome, + GoToSettings, + VolumeUp, + VolumeDown, + Mute, + Unmute, + ToggleMute, + SetVolume, + SetAudioStreamIndex, + SetSubtitleStreamIndex, + ToggleFullscreen, + DisplayContent, + GoToSearch, + DisplayMessage, + SetRepeatMode, + ChannelUp, + ChannelDown, + Guide, + ToggleStats, + PlayMediaSource, + PlayTrailers, + SetShuffleQueue, + PlayState, + PlayNext, + ToggleOsdMenu, + Play, + SetMaxStreamingBitrate, + SetPlaybackOrder, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum GroupQueueMode { + Queue, + QueueNext, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum GroupRepeatMode { + RepeatOne, + RepeatAll, + RepeatNone, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum GroupShuffleMode { + Sorted, + Shuffle, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum GroupStateType { + Idle, + Waiting, + Paused, + Playing, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum GroupUpdateType { + UserJoined, + UserLeft, + GroupJoined, + GroupLeft, + StateUpdate, + PlayQueue, + NotInGroup, + GroupDoesNotExist, + CreateGroupDenied, + JoinGroupDenied, + LibraryAccessDenied, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum HardwareAccelerationType { + None, + Amf, + Qsv, + Nvenc, + V4l2m2m, + Vaapi, + Videotoolbox, + Rkmpp, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ImageFormat { + Bmp, + Gif, + Jpg, + Png, + Webp, + Svg, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ImageOrientation { + TopLeft, + TopRight, + BottomRight, + BottomLeft, + LeftTop, + RightTop, + RightBottom, + LeftBottom, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ImageResolution { + MatchSource, + P144, + P240, + P360, + P480, + P720, + P1080, + P1440, + P2160, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ImageSavingConvention { + Legacy, + Compatible, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ImageType { + Primary, + Art, + Backdrop, + Banner, + Logo, + Thumb, + Disc, + Box, + Screenshot, + Menu, + Chapter, + BoxRear, + Profile, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum IsoType { + Dvd, + BluRay, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ItemFields { + AirTime, + CanDelete, + CanDownload, + ChannelInfo, + Chapters, + Trickplay, + ChildCount, + CumulativeRunTimeTicks, + CustomRating, + DateCreated, + DateLastMediaAdded, + DisplayPreferencesId, + Etag, + ExternalUrls, + Genres, + HomePageUrl, + ItemCounts, + MediaSourceCount, + MediaSources, + OriginalTitle, + Overview, + ParentId, + Path, + People, + PlayAccess, + ProductionLocations, + ProviderIds, + PrimaryImageAspectRatio, + RecursiveItemCount, + Settings, + ScreenshotImageTags, + SeriesPrimaryImage, + SeriesStudio, + SortName, + SpecialEpisodeNumbers, + Studios, + Taglines, + Tags, + RemoteTrailers, + MediaStreams, + SeasonUserData, + ServiceName, + ThemeSongIds, + ThemeVideoIds, + ExternalEtag, + PresentationUniqueKey, + InheritedParentalRatingValue, + ExternalSeriesId, + SeriesPresentationUniqueKey, + DateLastRefreshed, + DateLastSaved, + RefreshState, + ChannelImage, + EnableMediaSourceDisplay, + Width, + Height, + ExtraIds, + LocalTrailerCount, + IsHd, + SpecialFeatureCount, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ItemFilter { + IsFolder, + IsNotFolder, + IsUnplayed, + IsPlayed, + IsFavorite, + IsResumable, + Likes, + Dislikes, + IsFavoriteOrLikes, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ItemSortBy { + Default, + AiredEpisodeOrder, + Album, + AlbumArtist, + Artist, + DateCreated, + OfficialRating, + DatePlayed, + PremiereDate, + StartDate, + SortName, + Name, + Random, + Runtime, + CommunityRating, + ProductionYear, + PlayCount, + CriticRating, + IsFolder, + IsUnplayed, + IsPlayed, + SeriesSortName, + VideoBitRate, + AirTime, + Studio, + IsFavoriteOrLiked, + DateLastContentAdded, + SeriesDatePlayed, + ParentIndexNumber, + IndexNumber, + SimilarityScore, + SearchScore, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum KeepUntil { + UntilDeleted, + UntilSpaceNeeded, + UntilWatched, + UntilDate, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum LiveTvServiceStatus { + Ok, + Unavailable, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum LocationType { + FileSystem, + Remote, + Virtual, + Offline, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum LogLevel { + Trace, + Debug, + Information, + Warning, + Error, + Critical, + None, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum MediaProtocol { + File, + Http, + Rtmp, + Rtsp, + Udp, + Rtp, + Ftp, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum MediaSegmentType { + Unknown, + Commercial, + Preview, + Recap, + Outro, + Intro, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum MediaSourceType { + Default, + Grouping, + Placeholder, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum MediaStreamProtocol { + Http, + Hls, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum MediaStreamType { + Audio, + Video, + Subtitle, + EmbeddedImage, + Data, + Lyric, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum MediaType { + Unknown, + Video, + Audio, + Photo, + Book, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum MetadataField { + Cast, + Genres, + ProductionLocations, + Studios, + Tags, + Name, + Overview, + Runtime, + OfficialRating, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum MetadataRefreshMode { + None, + ValidationOnly, + Default, + FullRefresh, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ParameterInclude { + ProviderList, + LocalIpAddress, + LocalPort, + Https, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum PersonKind { + Unknown, + Actor, + Director, + Composer, + Writer, + GuestStar, + Producer, + Conductor, + Lyricist, + Arranger, + Engineer, + Mixer, + Remixer, + Creator, + Artist, + AlbumArtist, + Author, + Illustrator, + Penciller, + Inker, + Colorist, + Letterer, + CoverArtist, + Editor, + Translator, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum PlayAccess { + Full, + None, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum PlaybackErrorCode { + NotAllowed, + NoCompatibleStream, + RateLimitExceeded, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum PlaybackOrder { + Default, + Shuffle, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum PlaybackRequestType { + Play, + SetPlaylistItem, + RemoveFromPlaylist, + MovePlaylistItem, + Queue, + Unpause, + Pause, + Stop, + Seek, + Buffer, + Ready, + NextItem, + PreviousItem, + SetRepeatMode, + SetShuffleMode, + Ping, + IgnoreWait, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum PlayCommand { + PlayNow, + PlayNext, + PlayLast, + PlayInstantMix, + PlayShuffle, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum PlayMethod { + Transcode, + DirectStream, + DirectPlay, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum PlayQueueUpdateReason { + NewPlaylist, + SetCurrentItem, + RemoveItems, + MoveItem, + Queue, + QueueNext, + NextItem, + PreviousItem, + RepeatMode, + ShuffleMode, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum PlaystateCommand { + Stop, + Pause, + Unpause, + NextTrack, + PreviousTrack, + Seek, + Rewind, + FastForward, + PlayPause, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum PluginStatus { + Active, + Restart, + Deleted, + Superceded, + Malfunctioned, + NotSupported, + Disabled, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ProcessPriorityClass { + Normal, + Idle, + High, + RealTime, + BelowNormal, + AboveNormal, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ProfileConditionType { + Equals, + NotEquals, + LessThanEqual, + GreaterThanEqual, + EqualsAny, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ProfileConditionValue { + AudioChannels, + AudioBitrate, + AudioProfile, + Width, + Height, + Has64BitOffsets, + PacketLength, + VideoBitDepth, + VideoBitrate, + VideoFramerate, + VideoLevel, + VideoProfile, + VideoTimestamp, + IsAnamorphic, + RefFrames, + NumAudioStreams, + NumVideoStreams, + IsSecondaryAudio, + VideoCodecTag, + IsAvc, + IsInterlaced, + AudioSampleRate, + AudioBitDepth, + VideoRangeType, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ProgramAudio { + Mono, + Stereo, + Dolby, + DolbyDigital, + Thx, + Atmos, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum RatingType { + Score, + Likes, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum RecommendationType { + SimilarToRecentlyPlayed, + SimilarToLikedItem, + HasDirectorFromRecentlyPlayed, + HasActorFromRecentlyPlayed, + HasLikedDirector, + HasLikedActor, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum RecordingStatus { + New, + InProgress, + Completed, + Cancelled, + ConflictedOk, + ConflictedNotOk, + Error, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum RepeatMode { + RepeatNone, + RepeatAll, + RepeatOne, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum ScrollDirection { + Horizontal, + Vertical, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum SendCommandType { + Unpause, + Pause, + Stop, + Seek, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum SeriesStatus { + Continuing, + Ended, + Unreleased, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum SessionMessageType { + ForceKeepAlive, + GeneralCommand, + UserDataChanged, + Sessions, + Play, + SyncPlayCommand, + SyncPlayGroupUpdate, + Playstate, + RestartRequired, + ServerShuttingDown, + ServerRestarting, + LibraryChanged, + UserDeleted, + UserUpdated, + SeriesTimerCreated, + TimerCreated, + SeriesTimerCancelled, + TimerCancelled, + RefreshProgress, + ScheduledTaskEnded, + PackageInstallationCancelled, + PackageInstallationFailed, + PackageInstallationCompleted, + PackageInstalling, + PackageUninstalled, + ActivityLogEntry, + ScheduledTasksInfo, + ActivityLogEntryStart, + ActivityLogEntryStop, + SessionsStart, + SessionsStop, + ScheduledTasksInfoStart, + ScheduledTasksInfoStop, + KeepAlive, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum SortOrder { + Ascending, + Descending, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum Status { + Completed, + Watching, + Both, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum SubtitleDeliveryMethod { + Encode, + Embed, + External, + Hls, + Drop, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum SubtitlePlaybackMode { + Default, + Always, + OnlyForced, + None, + Smart, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum SyncAction { + UpdateProvider, + UpdateJellyfin, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum SyncPlayUserAccessType { + CreateAndJoinGroups, + JoinGroups, + None, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum TaskCompletionStatus { + Completed, + Failed, + Cancelled, + Aborted, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum TaskState { + Idle, + Cancelling, + Running, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum TonemappingAlgorithm { + None, + Clip, + Linear, + Gamma, + Reinhard, + Hable, + Mobius, + Bt2390, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum TonemappingMode { + Auto, + Max, + Rgb, + Lum, + Itp, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum TonemappingRange { + Auto, + Tv, + Pc, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum TranscodeReason { + ContainerNotSupported, + VideoCodecNotSupported, + AudioCodecNotSupported, + SubtitleCodecNotSupported, + AudioIsExternal, + SecondaryAudioNotSupported, + VideoProfileNotSupported, + VideoLevelNotSupported, + VideoResolutionNotSupported, + VideoBitDepthNotSupported, + VideoFramerateNotSupported, + RefFramesNotSupported, + AnamorphicVideoNotSupported, + InterlacedVideoNotSupported, + AudioChannelsNotSupported, + AudioProfileNotSupported, + AudioSampleRateNotSupported, + AudioBitDepthNotSupported, + ContainerBitrateExceedsLimit, + VideoBitrateNotSupported, + AudioBitrateNotSupported, + UnknownVideoStreamInfo, + UnknownAudioStreamInfo, + DirectPlayError, + VideoRangeTypeNotSupported, + VideoCodecTagNotSupported, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum TranscodeSeekInfo { + Auto, + Bytes, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum TransportStreamTimestamp { + None, + Zero, + Valid, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum TrickplayScanBehavior { + Blocking, + NonBlocking, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum UnratedItem { + Movie, + Trailer, + Series, + Music, + Book, + LiveTvChannel, + LiveTvProgram, + ChannelContent, + Other, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum Video3DFormat { + HalfSideBySide, + FullSideBySide, + FullTopAndBottom, + HalfTopAndBottom, + Mvc, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum VideoRange { + Unknown, + Sdr, + Hdr, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum VideoRangeType { + Unknown, + Sdr, + Hdr10, + Hlg, + Dovi, + DoviWithHdr10, + DoviWithHlg, + DoviWithSdr, + Hdr10Plus, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub enum VideoType { + VideoFile, + Iso, + Dvd, + BluRay, +} diff --git a/api/src/lib.rs b/api/src/lib.rs index e314d0f..256cd11 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -1,3 +1,4 @@ +pub mod jellyfin; use serde::{Deserialize, Serialize}; #[derive(thiserror::Error, Debug)] pub enum JellyfinApiError { @@ -28,15 +29,16 @@ impl JellyfinClient { .header("Content-Type", "application/json") } - // pub async fn authenticate(&mut self) -> Result<()> { - // self.post("Users/AuthenticateByName") - // .json(AuthenticateUserByName { - // username: self.config.username.clone(), - // pw: self.config.password.clone(), - // }) - // .send() - // .await - // } + pub async fn authenticate(&mut self) -> Result<()> { + self.post("Users/AuthenticateByName") + .json(&jellyfin::AuthenticateUserByName { + username: Some(self.config.username.clone()), + pw: Some(self.config.password.clone()), + }) + .send() + .await?; + Ok(()) + } } #[derive(Debug, Serialize, Deserialize, Clone)] @@ -46,87 +48,3 @@ pub struct JellyfinConfig { pub server_url: iref::IriBuf, pub device_id: String, } - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "PascalCase")] -pub struct AuthenticationResult { - user: UserDto, - session_info: Option, - access_token: Option, - server_id: Option, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "PascalCase")] -pub struct UserDto {} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "PascalCase")] -pub struct SerssionInfoDto {} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "PascalCase")] -pub struct AuthenticateUserByName { - username: String, - pw: String, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "PascalCase")] -pub struct QuickConnectDto { - secret: String, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "PascalCase")] -struct User { - id: String, - configuration: Configuration, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "PascalCase")] -struct Configuration { - audio_language_preference: Option, - play_default_audio_track: bool, - subtitle_language_preference: String, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "PascalCase")] -struct Items { - items: Vec, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "PascalCase")] -pub struct MediaItem { - // #[serde(rename = "Id")] - pub id: String, - // #[serde(rename = "Name")] - pub name: String, - // #[serde(rename = "Type")] - pub type_: String, - // #[serde(rename = "Path")] - pub path: Option, - // #[serde(rename = "CollectionType")] - pub collection_type: Option, - // #[serde(rename = "ProductionYear")] - pub year: Option, - // #[serde(rename = "Overview")] - pub overview: Option, - // #[serde(rename = "CommunityRating")] - pub imdb_rating: Option, - // #[serde(rename = "CriticRating")] - pub critic_rating: Option, - // #[serde(rename = "RunTimeTicks")] - pub runtime_ticks: Option, - // #[serde(rename = "SeriesId")] - pub series_id: Option, - // #[serde(rename = "SeriesName")] - pub series_name: Option, - // #[serde(rename = "ParentIndexNumber")] - pub parent_index_number: Option, - // #[serde(rename = "IndexNumber")] - pub index_number: Option, -} diff --git a/api/types.rs b/api/types.rs index e69de29..8f03c4d 100644 --- a/api/types.rs +++ b/api/types.rs @@ -0,0 +1,3897 @@ +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct AccessSchedule { + #[serde(skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub user_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub day_of_week: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub start_hour: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub end_hour: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ActivityLogEntry { + #[serde(skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub overview: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub short_overview: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub item_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub date: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub user_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub user_primary_image_tag: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub severity: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ActivityLogEntryMessage { + #[serde(skip_serializing_if = "Option::is_none")] + pub data: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub message_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub message_type: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ActivityLogEntryQueryResult { + #[serde(skip_serializing_if = "Option::is_none")] + pub items: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub total_record_count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub start_index: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ActivityLogEntryStartMessage { + #[serde(skip_serializing_if = "Option::is_none")] + pub data: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub message_type: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ActivityLogEntryStopMessage { + #[serde(skip_serializing_if = "Option::is_none")] + pub message_type: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct AddVirtualFolderDto { + #[serde(skip_serializing_if = "Option::is_none")] + pub library_options: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct AlbumInfo { + #[serde(skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub original_title: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub path: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata_language: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata_country_code: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub provider_ids: Option>>, + #[serde(skip_serializing_if = "Option::is_none")] + pub year: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub index_number: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub parent_index_number: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub premiere_date: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub is_automated: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub album_artists: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub artist_provider_ids: Option>>, + #[serde(skip_serializing_if = "Option::is_none")] + pub song_infos: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct AlbumInfoRemoteSearchQuery { + #[serde(skip_serializing_if = "Option::is_none")] + pub search_info: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub item_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub search_provider_name: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub include_disabled_providers: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct AllThemeMediaResult { + #[serde(skip_serializing_if = "Option::is_none")] + pub theme_videos_result: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub theme_songs_result: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub soundtrack_songs_result: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ApiName(pub String); + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ArtistInfo { + #[serde(skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub original_title: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub path: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata_language: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata_country_code: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub provider_ids: Option>>, + #[serde(skip_serializing_if = "Option::is_none")] + pub year: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub index_number: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub parent_index_number: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub premiere_date: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub is_automated: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub song_infos: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ArtistInfoRemoteSearchQuery { + #[serde(skip_serializing_if = "Option::is_none")] + pub search_info: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub item_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub search_provider_name: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub include_disabled_providers: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum AudioSpatialFormat { + None, + DolbyAtmos, + DTSX, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct AuthenticateUserByName { + pub username: Option, + pub pw: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct AuthenticationInfo { + pub id: Option, + pub access_token: Option, + pub device_id: Option, + pub app_name: Option, + pub app_version: Option, + pub device_name: Option, + pub user_id: Option, + pub is_active: Option, + pub date_created: Option, + pub date_revoked: Option, + pub date_last_activity: Option, + pub user_name: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct AuthenticationInfoQueryResult { + pub items: Option>, + pub total_record_count: Option, + pub start_index: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct AuthenticationResult { + pub user: Option, + pub session_info: Option, + pub access_token: Option, + pub server_id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BaseItemDto { + pub name: Option, + pub original_title: Option, + pub server_id: Option, + pub id: String, + pub etag: Option, + pub source_type: Option, + pub playlist_item_id: Option, + pub date_created: Option, + pub date_last_media_added: Option, + pub extra_type: Option, + pub airs_before_season_number: Option, + pub airs_after_season_number: Option, + pub airs_before_episode_number: Option, + pub can_delete: Option, + pub can_download: Option, + pub has_lyrics: Option, + pub has_subtitles: Option, + pub preferred_metadata_language: Option, + pub preferred_metadata_country_code: Option, + pub container: Option, + pub sort_name: Option, + pub forced_sort_name: Option, + pub video_3_d_format: Option, + pub premiere_date: Option, + pub external_urls: Option>, + pub media_sources: Option>, + pub critic_rating: Option, + pub production_locations: Option>, + pub path: Option, + pub enable_media_source_display: Option, + pub official_rating: Option, + pub custom_rating: Option, + pub channel_id: Option, + pub channel_name: Option, + pub overview: Option, + pub taglines: Option>, + pub genres: Option>, + pub community_rating: Option, + pub cumulative_run_time_ticks: Option, + pub run_time_ticks: Option, + pub play_access: Option, + pub aspect_ratio: Option, + pub production_year: Option, + pub is_placeholder: Option, + pub number: Option, + pub channel_number: Option, + pub index_number: Option, + pub index_number_end: Option, + pub parent_index_number: Option, + pub remote_trailers: Option>, + pub provider_ids: Option>>, + pub is_hd: Option, + pub is_folder: Option, + pub parent_id: Option, + pub r#type: Option, + pub people: Option>, + pub studios: Option>, + pub genre_items: Option>, + pub parent_logo_item_id: Option, + pub parent_backdrop_item_id: Option, + pub parent_backdrop_image_tags: Option>, + pub local_trailer_count: Option, + pub user_data: Option, + pub recursive_item_count: Option, + pub child_count: Option, + pub series_name: Option, + pub series_id: Option, + pub season_id: Option, + pub special_feature_count: Option, + pub display_preferences_id: Option, + pub status: Option, + pub air_time: Option, + pub air_days: Option>, + pub tags: Option>, + pub primary_image_aspect_ratio: Option, + pub artists: Option>, + pub artist_items: Option>, + pub album: Option, + pub collection_type: Option, + pub display_order: Option, + pub album_id: Option, + pub album_primary_image_tag: Option, + pub series_primary_image_tag: Option, + pub album_artist: Option, + pub album_artists: Option>, + pub season_name: Option, + pub media_streams: Option>, + pub video_type: Option, + pub part_count: Option, + pub media_source_count: Option, + pub image_tags: Option>, + pub backdrop_image_tags: Option>, + pub screenshot_image_tags: Option>, + pub parent_logo_image_tag: Option, + pub parent_art_item_id: Option, + pub parent_art_image_tag: Option, + pub series_thumb_image_tag: Option, + pub image_blur_hashes: Option, + pub series_studio: Option, + pub parent_thumb_item_id: Option, + pub parent_thumb_image_tag: Option, + pub parent_primary_image_item_id: Option, + pub parent_primary_image_tag: Option, + pub chapters: Option>, + pub trickplay: Option>>, + pub location_type: Option, + pub iso_type: Option, + pub media_type: Option, + pub end_date: Option, + pub locked_fields: Option>, + pub trailer_count: Option, + pub movie_count: Option, + pub series_count: Option, + pub program_count: Option, + pub episode_count: Option, + pub song_count: Option, + pub album_count: Option, + pub artist_count: Option, + pub music_video_count: Option, + pub lock_data: Option, + pub width: Option, + pub height: Option, + pub camera_make: Option, + pub camera_model: Option, + pub software: Option, + pub exposure_time: Option, + pub focal_length: Option, + pub image_orientation: Option, + pub aperture: Option, + pub shutter_speed: Option, + pub latitude: Option, + pub longitude: Option, + pub altitude: Option, + pub iso_speed_rating: Option, + pub series_timer_id: Option, + pub program_id: Option, + pub channel_primary_image_tag: Option, + pub start_date: Option, + pub completion_percentage: Option, + pub is_repeat: Option, + pub episode_title: Option, + pub channel_type: Option, + pub audio: Option, + pub is_movie: Option, + pub is_sports: Option, + pub is_series: Option, + pub is_live: Option, + pub is_news: Option, + pub is_kids: Option, + pub is_premiere: Option, + pub timer_id: Option, + pub normalization_gain: Option, + pub current_program: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BaseItemDtoQueryResult { + pub items: Option>, + pub total_record_count: Option, + pub start_index: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum BaseItemKind { + AggregateFolder, + Audio, + AudioBook, + BasePluginFolder, + Book, + BoxSet, + Channel, + ChannelFolderItem, + CollectionFolder, + Episode, + Folder, + Genre, + ManualPlaylistsFolder, + Movie, + LiveTvChannel, + LiveTvProgram, + MusicAlbum, + MusicArtist, + MusicGenre, + MusicVideo, + Person, + Photo, + PhotoAlbum, + Playlist, + PlaylistsFolder, + Program, + Recording, + Season, + Series, + Studio, + Trailer, + TvChannel, + TvProgram, + UserRootFolder, + UserView, + Video, + Year, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BaseItemPerson { + pub name: Option, + pub id: String, + pub role: Option, + pub r#type: Option, + pub primary_image_tag: Option, + pub image_blur_hashes: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BasePluginConfiguration { + // no properties +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BookInfo { + pub name: Option, + pub original_title: Option, + pub path: Option, + pub metadata_language: Option, + pub metadata_country_code: Option, + pub provider_ids: Option>>, + pub year: Option, + pub index_number: Option, + pub parent_index_number: Option, + pub premiere_date: Option, + pub is_automated: Option, + pub series_name: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BookInfoRemoteSearchQuery { + pub search_info: Option, + pub item_id: Option, + pub search_provider_name: Option, + pub include_disabled_providers: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BoxSetInfo { + pub name: Option, + pub original_title: Option, + pub path: Option, + pub metadata_language: Option, + pub metadata_country_code: Option, + pub provider_ids: Option>>, + pub year: Option, + pub index_number: Option, + pub parent_index_number: Option, + pub premiere_date: Option, + pub is_automated: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BoxSetInfoRemoteSearchQuery { + pub search_info: Option, + pub item_id: Option, + pub search_provider_name: Option, + pub include_disabled_providers: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BrandingOptions { + pub login_disclaimer: Option, + pub custom_css: Option, + pub splashscreen_enabled: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct BufferRequestDto { + pub when: Option, + pub position_ticks: Option, + pub is_playing: Option, + pub playlist_item_id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct CastReceiverApplication { + pub id: String, + pub name: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ChannelFeatures { + pub name: String, + pub id: String, + pub can_search: Option, + pub media_types: Option>, + pub content_types: Option>, + pub max_page_size: Option, + pub auto_refresh_levels: Option, + pub default_sort_fields: Option>, + pub supports_sort_order_toggle: Option, + pub supports_latest_media: Option, + pub can_filter: Option, + pub supports_content_downloading: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ChannelItemSortField { + Name, + CommunityRating, + PremiereDate, + DateCreated, + Runtime, + PlayCount, + CommunityPlayCount, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ChannelMappingOptionsDto { + pub tuner_channels: Option>, + pub provider_channels: Option>, + pub mappings: Option>, + pub provider_name: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ChannelMediaContentType { + Clip, + Podcast, + Trailer, + Movie, + Episode, + Song, + MovieExtra, + TvExtra, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ChannelMediaType { + Audio, + Video, + Photo, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ChannelType { + TV, + Radio, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ChapterInfo { + pub start_position_ticks: Option, + pub name: Option, + pub image_path: Option, + pub image_date_modified: Option, + pub image_tag: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct CheckpointId { + pub id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ClientCapabilitiesDto { + pub playable_media_types: Option>, + pub supported_commands: Option>, + pub supports_media_control: Option, + pub supports_persistent_identifier: Option, + pub device_profile: Option, + pub app_store_url: Option, + pub icon_url: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ClientLogDocumentResponseDto { + pub file_name: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct CodecProfile { + pub r#type: Option, + pub conditions: Option>, + pub apply_conditions: Option>, + pub codec: Option, + pub container: Option, + pub sub_container: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum CodecType { + Video, + VideoAudio, + Audio, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct CollectionCreationResult { + pub id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum CollectionType { + Unknown, + Movies, + Tvshows, + Music, + Musicvideos, + Trailers, + Homevideos, + Boxsets, + Books, + Photos, + Livetv, + Playlists, + Folders, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum CollectionTypeOptions { + Movies, + Tvshows, + Music, + Musicvideos, + Homevideos, + Boxsets, + Books, + Mixed, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ConfigImageTypes { + pub backdrop_sizes: Option>, + pub base_url: Option, + pub logo_sizes: Option>, + pub poster_sizes: Option>, + pub profile_sizes: Option>, + pub secure_base_url: Option, + pub still_sizes: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ConfigurationPageInfo { + pub name: String, + pub enable_in_main_menu: Option, + pub menu_section: Option, + pub menu_icon: Option, + pub display_name: Option, + pub plugin_id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ContainerProfile { + pub r#type: Option, + pub conditions: Option>, + pub container: Option, + pub sub_container: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum CountryInfo { + Name(String), + DisplayName(String), + TwoLetterISORegionName(String), + ThreeLetterISORegionName(String), +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct CreatePlaylistDto { + pub name: String, + pub ids: Option>, + pub user_id: Option, + pub media_type: Option, + pub users: Option>, + pub is_public: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct CreateUserByName { + pub name: String, + pub password: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct CultureDto { + pub name: String, + pub display_name: String, + pub two_letter_i_s_o_language_name: String, + pub three_letter_i_s_o_language_name: Option, + pub three_letter_i_s_o_language_names: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum DayOfWeek { + Sunday, + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum DayPattern { + Daily, + Weekdays, + Weekends, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DefaultDirectoryBrowserInfoDto { + pub path: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum DeinterlaceMethod { + Yadif, + Bwdif, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum DeviceInfoDto { + Name: Option, + CustomName: Option, + AccessToken: Option, + Id: Option, + LastUserName: Option, + AppName: Option, + AppVersion: Option, + LastUserId: Option, + DateLastActivity: Option, + Capabilities: Option, + IconUrl: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DeviceInfoDtoQueryResult { + pub items: Option>, + pub total_record_count: Option, + pub start_index: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DeviceOptionsDto { + pub id: Option, + pub device_id: Option, + pub custom_name: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DeviceProfile { + pub name: Option, + pub id: Option, + pub max_streaming_bitrate: Option, + pub max_static_bitrate: Option, + pub music_streaming_transcoding_bitrate: Option, + pub max_static_music_bitrate: Option, + pub direct_play_profiles: Option>, + pub transcoding_profiles: Option>, + pub container_profiles: Option>, + pub codec_profiles: Option>, + pub subtitle_profiles: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DirectPlayProfile { + pub container: Option, + pub audio_codec: Option, + pub video_codec: Option, + pub r#type: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct DisplayPreferencesDto { + pub id: Option, + pub view_type: Option, + pub sort_by: Option, + pub index_by: Option, + pub remember_indexing: Option, + pub primary_image_height: Option, + pub primary_image_width: Option, + pub custom_prefs: Option>>, + pub scroll_direction: Option, + pub show_backdrop: Option, + pub remember_sorting: Option, + pub sort_order: Option, + pub show_sidebar: Option, + pub client: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum DlnaProfileType { + Audio, + Video, + Photo, + Subtitle, + Lyric, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum DownMixStereoAlgorithms { + None, + Dave750, + NightmodeDialogue, + Rfc7845, + Ac4, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum EmbeddedSubtitleOptions { + AllowAll, + AllowText, + AllowImage, + AllowNone, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum EncoderPreset { + Auto, + Placebo, + Varieslow, + Slower, + Slow, + Medium, + Fast, + Faster, + Veryfast, + Superfast, + Ultrafast, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum EncodingContext { + Streaming, + Static, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct EncodingOptions { + pub encoding_thread_count: Option, + pub transcoding_temp_path: Option, + pub fallback_font_path: Option, + pub enable_fallback_font: Option, + pub enable_audio_vbr: Option, + pub down_mix_audio_boost: Option, + pub down_mix_stereo_algorithm: Option, + pub max_muxing_queue_size: Option, + pub enable_throttling: Option, + pub throttle_delay_seconds: Option, + pub enable_segment_deletion: Option, + pub segment_keep_seconds: Option, + pub hardware_acceleration_type: Option, + pub encoder_app_path: Option, + pub encoder_app_path_display: Option, + pub vaapi_device: Option, + pub qsv_device: Option, + pub enable_tonemapping: Option, + pub enable_vpp_tonemapping: Option, + pub enable_video_toolbox_tonemapping: Option, + pub tonemapping_algorithm: Option, + pub tonemapping_mode: Option, + pub tonemapping_range: Option, + pub tonemapping_desat: Option, + pub tonemapping_peak: Option, + pub tonemapping_param: Option, + pub vpp_tonemapping_brightness: Option, + pub vpp_tonemapping_contrast: Option, + pub h264_crf: Option, + pub h265_crf: Option, + pub encoder_preset: Option, + pub deinterlace_double_rate: Option, + pub deinterlace_method: Option, + pub enable_decoding_color_depth_10_hevc: Option, + pub enable_decoding_color_depth_10_vp9: Option, + pub enable_decoding_color_depth_10_hevc_rext: Option, + pub enable_decoding_color_depth_12_hevc_rext: Option, + pub enable_enhanced_nvdec_decoder: Option, + pub prefer_system_native_hw_decoder: Option, + pub enable_intel_low_power_h264_hw_encoder: Option, + pub enable_intel_low_power_hevc_hw_encoder: Option, + pub enable_hardware_encoding: Option, + pub allow_hevc_encoding: Option, + pub allow_av1_encoding: Option, + pub enable_subtitle_extraction: Option, + pub hardware_decoding_codecs: Option>, + pub allow_on_demand_metadata_based_keyframe_extraction_for_extensions: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum EndPointInfo { + is_local: Option, + is_in_network: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ExternalIdInfo { + pub name: String, + pub key: String, + pub r#type: Option, + pub url_format_string: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ExternalIdMediaType { + Album, + AlbumArtist, + Artist, + BoxSet, + Episode, + Movie, + OtherArtist, + Person, + ReleaseGroup, + Season, + Series, + Track, + Book, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ExternalUrl { + pub name: Option, + pub url: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ExtraType { + Unknown, + Clip, + Trailer, + BehindTheScenes, + DeletedScene, + Interview, + Scene, + Sample, + ThemeSong, + ThemeVideo, + Featurette, + Short, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct FileSystemEntryInfo { + pub name: String, + pub path: String, + pub r#type: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum FileSystemEntryType { + File, + Directory, + NetworkComputer, + NetworkShare, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct FontFile { + pub name: Option, + pub size: i64, + pub date_created: String, + pub date_modified: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ForceKeepAliveMessage { + Data: Option, + MessageId: String, + MessageType: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ForgotPasswordAction { + ContactAdmin, + PinCode, + InNetworkRequired, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ForgotPasswordDto { + pub entered_username: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ForgotPasswordPinDto { + pub pin: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ForgotPasswordResult { + pub action: ForgotPasswordAction, + pub pin_file: Option, + pub pin_expiration_date: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct GeneralCommand { + pub name: GeneralCommandType, + pub controlling_user_id: Option, + pub arguments: Option>>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct GeneralCommandMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum GeneralCommandType { + MoveUp, + MoveDown, + MoveLeft, + MoveRight, + PageUp, + PageDown, + PreviousLetter, + NextLetter, + ToggleOsd, + ToggleContextMenu, + Select, + Back, + TakeScreenshot, + SendKey, + SendString, + GoHome, + GoToSettings, + VolumeUp, + VolumeDown, + Mute, + Unmute, + ToggleMute, + SetVolume, + SetAudioStreamIndex, + SetSubtitleStreamIndex, + ToggleFullscreen, + DisplayContent, + GoToSearch, + DisplayMessage, + SetRepeatMode, + ChannelUp, + ChannelDown, + Guide, + ToggleStats, + PlayMediaSource, + PlayTrailers, + SetShuffleQueue, + PlayState, + PlayNext, + ToggleOsdMenu, + Play, + SetMaxStreamingBitrate, + SetPlaybackOrder, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct GetProgramsDto { + pub channel_ids: Option>, + pub user_id: Option, + pub min_start_date: Option, + pub has_aired: Option, + pub is_airing: Option, + pub max_start_date: Option, + pub min_end_date: Option, + pub max_end_date: Option, + pub is_movie: Option, + pub is_series: Option, + pub is_news: Option, + pub is_kids: Option, + pub is_sports: Option, + pub start_index: Option, + pub limit: Option, + pub sort_by: Option>, + pub sort_order: Option>, + pub genres: Option>, + pub genre_ids: Option>, + pub enable_images: Option, + pub enable_total_record_count: Option, + pub image_type_limit: Option, + pub enable_image_types: Option>, + pub enable_user_data: Option, + pub series_timer_id: Option, + pub library_series_id: Option, + pub fields: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct GroupInfoDto { + pub group_id: String, + pub group_name: String, + pub state: GroupStateType, + pub participants: Vec, + pub last_updated_at: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct GroupInfoDtoGroupUpdate { + pub group_id: String, + pub r#type: GroupUpdateType, + pub data: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum GroupQueueMode { + Queue, + QueueNext, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum GroupRepeatMode { + RepeatOne, + RepeatAll, + RepeatNone, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum GroupShuffleMode { + Sorted, + Shuffle, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum GroupStateType { + Idle, + Waiting, + Paused, + Playing, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct GroupStateUpdate { + pub state: GroupStateType, + pub reason: PlaybackRequestType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct GroupStateUpdateGroupUpdate { + pub group_id: String, + pub r#type: GroupUpdateType, + pub data: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum GroupUpdateType { + UserJoined, + UserLeft, + GroupJoined, + GroupLeft, + StateUpdate, + PlayQueue, + NotInGroup, + GroupDoesNotExist, + CreateGroupDenied, + JoinGroupDenied, + LibraryAccessDenied, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct GuideInfo { + pub start_date: String, + pub end_date: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum HardwareAccelerationType { + None, + Amf, + Qsv, + Nvenc, + V4l2m2m, + Vaapi, + Videotoolbox, + Rkmpp, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct IgnoreWaitRequestDto { + pub ignore_wait: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ImageFormat { + Bmp, + Gif, + Jpg, + Png, + Webp, + Svg, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ImageInfo { + pub image_type: ImageType, + pub image_index: Option, + pub image_tag: Option, + pub path: Option, + pub blur_hash: Option, + pub height: Option, + pub width: Option, + pub size: i64, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ImageOption { + pub r#type: ImageType, + pub limit: Option, + pub min_width: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ImageOrientation { + TopLeft, + TopRight, + BottomRight, + BottomLeft, + LeftTop, + RightTop, + RightBottom, + LeftBottom, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ImageProviderInfo { + pub name: String, + pub supported_images: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ImageResolution { + MatchSource, + P144, + P240, + P360, + P480, + P720, + P1080, + P1440, + P2160, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ImageSavingConvention { + Legacy, + Compatible, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ImageType { + Primary, + Art, + Backdrop, + Banner, + Logo, + Thumb, + Disc, + Box, + Screenshot, + Menu, + Chapter, + BoxRear, + Profile, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct InboundKeepAliveMessage { + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct InboundWebSocketMessage { + #[serde(flatten)] + pub message: WebSocketMessage, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct InstallationInfo { + pub guid: String, + pub name: Option, + pub version: Option, + pub changelog: Option, + pub source_url: Option, + pub checksum: Option, + pub package_info: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct IPlugin { + pub name: Option, + pub description: Option, + pub id: String, + pub version: Option, + pub assembly_file_path: Option, + pub can_uninstall: bool, + pub data_folder_path: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum IsoType { + Dvd, + BluRay, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ItemCounts { + pub movie_count: i32, + pub series_count: i32, + pub episode_count: i32, + pub artist_count: i32, + pub program_count: i32, + pub trailer_count: i32, + pub song_count: i32, + pub album_count: i32, + pub music_video_count: i32, + pub box_set_count: i32, + pub book_count: i32, + pub item_count: i32, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ItemFields { + AirTime, + CanDelete, + CanDownload, + ChannelInfo, + Chapters, + Trickplay, + ChildCount, + CumulativeRunTimeTicks, + CustomRating, + DateCreated, + DateLastMediaAdded, + DisplayPreferencesId, + Etag, + ExternalUrls, + Genres, + HomePageUrl, + ItemCounts, + MediaSourceCount, + MediaSources, + OriginalTitle, + Overview, + ParentId, + Path, + People, + PlayAccess, + ProductionLocations, + ProviderIds, + PrimaryImageAspectRatio, + RecursiveItemCount, + Settings, + ScreenshotImageTags, + SeriesPrimaryImage, + SeriesStudio, + SortName, + SpecialEpisodeNumbers, + Studios, + Taglines, + Tags, + RemoteTrailers, + MediaStreams, + SeasonUserData, + ServiceName, + ThemeSongIds, + ThemeVideoIds, + ExternalEtag, + PresentationUniqueKey, + InheritedParentalRatingValue, + ExternalSeriesId, + SeriesPresentationUniqueKey, + DateLastRefreshed, + DateLastSaved, + RefreshState, + ChannelImage, + EnableMediaSourceDisplay, + Width, + Height, + ExtraIds, + LocalTrailerCount, + IsHD, + SpecialFeatureCount, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ItemFilter { + IsFolder, + IsNotFolder, + IsUnplayed, + IsPlayed, + IsFavorite, + IsResumable, + Likes, + Dislikes, + IsFavoriteOrLikes, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ItemSortBy { + Default, + AiredEpisodeOrder, + Album, + AlbumArtist, + Artist, + DateCreated, + OfficialRating, + DatePlayed, + PremiereDate, + StartDate, + SortName, + Name, + Random, + Runtime, + CommunityRating, + ProductionYear, + PlayCount, + CriticRating, + IsFolder, + IsUnplayed, + IsPlayed, + SeriesSortName, + VideoBitRate, + AirTime, + Studio, + IsFavoriteOrLiked, + DateLastContentAdded, + SeriesDatePlayed, + ParentIndexNumber, + IndexNumber, + SimilarityScore, + SearchScore, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct JoinGroupRequestDto { + pub group_id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum KeepUntil { + UntilDeleted, + UntilSpaceNeeded, + UntilWatched, + UntilDate, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LibraryChangedMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LibraryOptionInfoDto { + pub name: Option, + pub default_enabled: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LibraryOptions { + pub enabled: bool, + pub enable_photos: bool, + pub enable_realtime_monitor: bool, + pub enable_lufs_scan: bool, + pub enable_chapter_image_extraction: bool, + pub extract_chapter_images_during_library_scan: bool, + pub enable_trickplay_image_extraction: bool, + pub extract_trickplay_images_during_library_scan: bool, + pub path_infos: Option>, + pub save_local_metadata: bool, + pub enable_internet_providers: bool, + pub enable_automatic_series_grouping: bool, + pub enable_embedded_titles: bool, + pub enable_embedded_extras_titles: bool, + pub enable_embedded_episode_infos: bool, + pub automatic_refresh_interval_days: Option, + pub preferred_metadata_language: Option, + pub metadata_country_code: Option, + pub season_zero_display_name: String, + pub metadata_savers: Option>, + pub disabled_local_metadata_readers: Vec, + pub local_metadata_reader_order: Option>, + pub disabled_subtitle_fetchers: Vec, + pub subtitle_fetcher_order: Vec, + pub disabled_media_segment_providers: Vec, + pub media_segment_provide_order: Vec, + pub skip_subtitles_if_embedded_subtitles_present: bool, + pub skip_subtitles_if_audio_track_matches: bool, + pub subtitle_download_languages: Option>, + pub require_perfect_subtitle_match: bool, + pub save_subtitles_with_media: bool, + pub save_lyrics_with_media: bool, + pub save_trickplay_with_media: bool, + pub disabled_lyric_fetchers: Vec, + pub lyric_fetcher_order: Vec, + pub prefer_nonstandard_artists_tag: bool, + pub use_custom_tag_delimiters: bool, + pub custom_tag_delimiters: Option>, + pub delimiter_whitelist: Option>, + pub automatically_add_to_collection: bool, + pub allow_embedded_subtitles: EmbeddedSubtitleOptions, + pub type_options: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LibraryOptionsResultDto { + pub metadata_savers: Option>, + pub metadata_readers: Option>, + pub subtitle_fetchers: Option>, + pub lyric_fetchers: Option>, + pub type_options: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LibraryTypeOptionsDto { + pub r#type: Option, + pub metadata_fetchers: Option>, + pub image_fetchers: Option>, + pub supported_image_types: Option>, + pub default_image_options: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LibraryUpdateInfo { + pub folders_added_to: Option>, + pub folders_removed_from: Option>, + pub items_added: Option>, + pub items_removed: Option>, + pub items_updated: Option>, + pub collection_folders: Option>, + pub is_empty: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ListingsProviderInfo { + pub id: Option, + pub r#type: Option, + pub username: Option, + pub password: Option, + pub listings_id: Option, + pub zip_code: Option, + pub country: Option, + pub path: Option, + pub enabled_tuners: Option>, + pub enable_all_tuners: bool, + pub news_categories: Option>, + pub sports_categories: Option>, + pub kids_categories: Option>, + pub movie_categories: Option>, + pub channel_mappings: Option>, + pub movie_prefix: Option, + pub preferred_language: Option, + pub user_agent: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LiveStreamResponse { + pub media_source: MediaSourceInfo, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LiveTvInfo { + pub services: Vec, + pub is_enabled: bool, + pub enabled_users: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LiveTvOptions { + pub guide_days: Option, + pub recording_path: Option, + pub movie_recording_path: Option, + pub series_recording_path: Option, + pub enable_recording_subfolders: bool, + pub enable_original_audio_with_encoded_recordings: bool, + pub tuner_hosts: Option>, + pub listing_providers: Option>, + pub pre_padding_seconds: i32, + pub post_padding_seconds: i32, + pub media_locations_created: Option>, + pub recording_post_processor: Option, + pub recording_post_processor_arguments: Option, + pub save_recording_nfo: bool, + pub save_recording_images: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LiveTvServiceInfo { + pub name: Option, + pub home_page_url: Option, + pub status: LiveTvServiceStatus, + pub status_message: Option, + pub version: Option, + pub has_update_available: bool, + pub is_visible: bool, + pub tuners: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum LiveTvServiceStatus { + Ok, + Unavailable, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LocalizationOption { + pub name: Option, + pub value: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LocationType { + pub r#type: LocationTypeEnum, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum LocationTypeEnum { + FileSystem, + Remote, + Virtual, + Offline, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LogFile { + pub date_created: String, + pub date_modified: String, + pub size: i64, + pub name: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LoginInfoInput { + pub username: String, + pub password: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LyricDto { + pub metadata: LyricMetadata, + pub lyrics: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LyricLine { + pub text: String, + pub start: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LyricMetadata { + pub artist: Option, + pub album: Option, + pub title: Option, + pub author: Option, + pub length: Option, + pub by: Option, + pub offset: Option, + pub creator: Option, + pub version: Option, + pub is_synced: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MediaAttachment { + pub codec: Option, + pub codec_tag: Option, + pub comment: Option, + pub index: i32, + pub file_name: Option, + pub mime_type: Option, + pub delivery_url: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MediaPathDto { + pub name: String, + pub path: Option, + pub path_info: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MediaPathInfo { + pub path: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum MediaProtocol { + File, + Http, + Rtmp, + Rtsp, + Udp, + Rtp, + Ftp, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MediaSegmentDto { + pub id: String, + pub item_id: String, + pub r#type: MediaSegmentType, + pub start_ticks: i64, + pub end_ticks: i64, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum MediaSegmentType { + Unknown, + Commercial, + Preview, + Recap, + Outro, + Intro, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MediaSegmentDtoQueryResult { + pub items: Option>, + pub total_record_count: Option, + pub start_index: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MediaSourceInfo { + pub protocol: MediaProtocol, + pub id: Option, + pub path: Option, + pub encoder_path: Option, + pub encoder_protocol: Option, + pub r#type: MediaSourceType, + pub container: Option, + pub size: Option, + pub name: Option, + pub is_remote: bool, + pub etag: Option, + pub run_time_ticks: Option, + 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 open_token: Option, + pub requires_closing: bool, + pub live_stream_id: Option, + pub buffer_ms: Option, + pub requires_looping: bool, + pub supports_probing: bool, + pub video_type: Option, + pub iso_type: Option, + pub video_3_d_format: Option, + pub media_streams: Option>, + pub media_attachments: Option>, + pub formats: Option>, + pub bitrate: Option, + pub fallback_max_streaming_bitrate: Option, + pub timestamp: Option, + pub required_http_headers: Option>>, + pub transcoding_url: Option, + pub transcoding_sub_protocol: Option, + pub transcoding_container: Option, + pub analyze_duration_ms: Option, + pub default_audio_stream_index: Option, + pub default_subtitle_stream_index: Option, + pub has_segments: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum MediaSourceType { + Default, + Grouping, + Placeholder, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MediaStream { + pub codec: Option, + pub codec_tag: Option, + pub language: Option, + pub color_range: Option, + pub color_space: Option, + pub color_transfer: Option, + pub color_primaries: Option, + pub dv_version_major: Option, + pub dv_version_minor: Option, + pub dv_profile: Option, + pub dv_level: Option, + pub rpu_present_flag: Option, + pub el_present_flag: Option, + pub bl_present_flag: Option, + pub dv_bl_signal_compatibility_id: Option, + pub rotation: Option, + pub comment: Option, + pub time_base: Option, + pub codec_time_base: Option, + pub title: Option, + pub video_range: VideoRange, + pub video_range_type: VideoRangeType, + pub video_do_vi_title: Option, + pub audio_spatial_format: AudioSpatialFormat, + pub localized_undefined: Option, + pub localized_default: Option, + pub localized_forced: Option, + pub localized_external: Option, + pub localized_hearing_impaired: Option, + pub display_title: Option, + pub nal_length_size: Option, + pub is_interlaced: bool, + pub is_avc: Option, + pub channel_layout: Option, + pub bitrate: Option, + pub bit_depth: Option, + pub ref_frames: Option, + pub packet_length: Option, + pub channels: Option, + pub sample_rate: Option, + pub is_default: bool, + pub is_forced: bool, + pub is_hearing_impaired: bool, + pub height: Option, + pub width: Option, + pub average_framerate: Option, + pub real_framerate: Option, + pub reference_framerate: Option, + pub profile: Option, + pub r#type: MediaStreamType, + pub aspect_ratio: Option, + pub index: i32, + pub score: Option, + pub is_external: bool, + pub delivery_method: Option, + pub delivery_url: Option, + pub is_external_url: Option, + pub is_text_subtitle_stream: bool, + pub supports_external_stream: bool, + pub path: Option, + pub pixel_format: Option, + pub level: Option, + pub is_anamorphic: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum MediaStreamProtocol { + Http, + Hls, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum MediaStreamType { + Audio, + Video, + Subtitle, + EmbeddedImage, + Data, + Lyric, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum MediaType { + Unknown, + Video, + Audio, + Photo, + Book, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MediaUpdateInfoDto { + pub updates: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MediaUpdateInfoPathDto { + pub path: Option, + pub update_type: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MediaUrl { + pub url: Option, + pub name: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MessageCommand { + pub header: Option, + pub text: String, + pub timeout_ms: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MetadataConfiguration { + pub use_file_creation_time_for_date_added: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MetadataEditorInfo { + pub parental_rating_options: Vec, + pub countries: Vec, + pub cultures: Vec, + pub external_id_infos: Vec, + pub content_type: Option, + pub content_type_options: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MetadataField { + pub r#type: MetadataFieldEnum, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum MetadataFieldEnum { + Cast, + Genres, + ProductionLocations, + Studios, + Tags, + Name, + Overview, + Runtime, + OfficialRating, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MetadataOptions { + pub item_type: Option, + pub disabled_metadata_savers: Option>, + pub local_metadata_reader_order: Option>, + pub disabled_metadata_fetchers: Option>, + pub metadata_fetcher_order: Option>, + pub disabled_image_fetchers: Option>, + pub image_fetcher_order: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum MetadataRefreshMode { + None, + ValidationOnly, + Default, + FullRefresh, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MovePlaylistItemRequestDto { + pub playlist_item_id: String, + pub new_index: i32, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MovieInfo { + pub name: Option, + pub original_title: Option, + pub path: Option, + pub metadata_language: Option, + pub metadata_country_code: Option, + pub provider_ids: Option>>, + pub year: Option, + pub index_number: Option, + pub parent_index_number: Option, + pub premiere_date: Option, + pub is_automated: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MovieInfoRemoteSearchQuery { + pub search_info: Option, + pub item_id: String, + pub search_provider_name: Option, + pub include_disabled_providers: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MusicVideoInfo { + pub name: Option, + pub original_title: Option, + pub path: Option, + pub metadata_language: Option, + pub metadata_country_code: Option, + pub provider_ids: Option>>, + pub year: Option, + pub index_number: Option, + pub parent_index_number: Option, + pub premiere_date: Option, + pub is_automated: bool, + pub artists: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct MusicVideoInfoRemoteSearchQuery { + pub search_info: Option, + pub item_id: String, + pub search_provider_name: Option, + pub include_disabled_providers: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct NameGuidPair { + pub name: Option, + pub id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct NameIdPair { + pub name: Option, + pub id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct NameValuePair { + pub name: Option, + pub value: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct NetworkConfiguration { + pub base_url: String, + pub enable_https: bool, + pub require_https: bool, + pub certificate_path: String, + pub certificate_password: String, + pub internal_http_port: i32, + pub internal_https_port: i32, + pub public_http_port: i32, + pub public_https_port: i32, + pub auto_discovery: bool, + pub enable_upnp: bool, + pub enable_ipv4: bool, + pub enable_ipv6: bool, + pub enable_remote_access: bool, + pub local_network_subnets: Vec, + pub local_network_addresses: Vec, + pub known_proxies: Vec, + pub ignore_virtual_interfaces: bool, + pub virtual_interface_names: Vec, + pub enable_published_server_uri_by_request: bool, + pub published_server_uri_by_subnet: Vec, + pub remote_ip_filter: Vec, + pub is_remote_ip_filter_blacklist: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct NewGroupRequestDto { + pub group_name: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct NextItemRequestDto { + pub playlist_item_id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct OpenLiveStreamDto { + pub open_token: Option, + pub user_id: Option, + pub play_session_id: Option, + pub max_streaming_bitrate: Option, + pub start_time_ticks: Option, + pub audio_stream_index: Option, + pub subtitle_stream_index: Option, + pub max_audio_channels: Option, + pub item_id: Option, + pub enable_direct_play: Option, + pub enable_direct_stream: Option, + pub always_burn_in_subtitle_when_transcoding: Option, + pub device_profile: Option, + pub direct_play_protocols: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct OutboundKeepAliveMessage { + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct OutboundWebSocketMessage { + #[serde(flatten)] + pub message: WebSocketMessage, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PackageInfo { + pub name: String, + pub description: String, + pub overview: String, + pub owner: String, + pub category: String, + pub guid: String, + pub versions: Vec, + pub image_url: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ParameterInclude { + pub r#type: ParameterIncludeEnum, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ParameterIncludeEnum { + ProviderList, + LocalIpAddress, + LocalPort, + Https, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ParentalRating { + pub name: Option, + pub value: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PathSubstitution { + pub from: String, + pub to: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PersonKind { + pub r#type: PersonKindEnum, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum PersonKindEnum { + Unknown, + Actor, + Director, + Composer, + Writer, + GuestStar, + Producer, + Conductor, + Lyricist, + Arranger, + Engineer, + Mixer, + Remixer, + Creator, + Artist, + AlbumArtist, + Author, + Illustrator, + Penciller, + Inker, + Colorist, + Letterer, + CoverArtist, + Editor, + Translator, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PersonLookupInfo { + pub name: Option, + pub original_title: Option, + pub path: Option, + pub metadata_language: Option, + pub metadata_country_code: Option, + pub provider_ids: Option>>, + pub year: Option, + pub index_number: Option, + pub parent_index_number: Option, + pub premiere_date: Option, + pub is_automated: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PersonLookupInfoRemoteSearchQuery { + pub search_info: Option, + pub item_id: String, + pub search_provider_name: Option, + pub include_disabled_providers: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PingRequestDto { + pub ping: i64, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PinRedeemResult { + pub success: bool, + pub users_reset: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum PlayAccess { + Full, + None, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum PlaybackErrorCode { + NotAllowed, + NoCompatibleStream, + RateLimitExceeded, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PlaybackInfoDto { + pub user_id: Option, + pub max_streaming_bitrate: Option, + pub start_time_ticks: Option, + pub audio_stream_index: Option, + pub subtitle_stream_index: Option, + pub max_audio_channels: Option, + pub media_source_id: Option, + pub live_stream_id: Option, + pub device_profile: Option, + pub enable_direct_play: Option, + pub enable_direct_stream: Option, + pub enable_transcoding: Option, + pub allow_video_stream_copy: Option, + pub allow_audio_stream_copy: Option, + pub auto_open_live_stream: Option, + pub always_burn_in_subtitle_when_transcoding: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PlaybackInfoResponse { + pub media_sources: Vec, + pub play_session_id: Option, + pub error_code: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum PlaybackOrder { + Default, + Shuffle, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PlaybackProgressInfo { + pub can_seek: bool, + pub item: Option, + pub item_id: String, + pub session_id: Option, + pub media_source_id: Option, + pub audio_stream_index: Option, + pub subtitle_stream_index: Option, + pub is_paused: bool, + pub is_muted: bool, + pub position_ticks: Option, + pub playback_start_time_ticks: Option, + pub volume_level: Option, + pub brightness: Option, + pub aspect_ratio: Option, + pub play_method: PlayMethod, + pub live_stream_id: Option, + pub play_session_id: Option, + pub repeat_mode: RepeatMode, + pub playback_order: PlaybackOrder, + pub now_playing_queue: Option>, + pub playlist_item_id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum PlaybackRequestType { + Play, + SetPlaylistItem, + RemoveFromPlaylist, + MovePlaylistItem, + Queue, + Unpause, + Pause, + Stop, + Seek, + Buffer, + Ready, + NextItem, + PreviousItem, + SetRepeatMode, + SetShuffleMode, + Ping, + IgnoreWait, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PlaybackStartInfo { + pub can_seek: bool, + pub item: Option, + pub item_id: String, + pub session_id: Option, + pub media_source_id: Option, + pub audio_stream_index: Option, + pub subtitle_stream_index: Option, + pub is_paused: bool, + pub is_muted: bool, + pub position_ticks: Option, + pub playback_start_time_ticks: Option, + pub volume_level: Option, + pub brightness: Option, + pub aspect_ratio: Option, + pub play_method: PlayMethod, + pub live_stream_id: Option, + pub play_session_id: Option, + pub repeat_mode: RepeatMode, + pub playback_order: PlaybackOrder, + pub now_playing_queue: Option>, + pub playlist_item_id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PlaybackStopInfo { + pub item: Option, + pub item_id: String, + pub session_id: Option, + pub media_source_id: Option, + pub position_ticks: Option, + pub live_stream_id: Option, + pub play_session_id: Option, + pub failed: bool, + pub next_media_type: Option, + pub playlist_item_id: Option, + pub now_playing_queue: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum PlayCommand { + PlayNow, + PlayNext, + PlayLast, + PlayInstantMix, + PlayShuffle, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PlayQueueUpdate { + pub reason: PlayQueueUpdateReason, + pub last_update: String, + pub playlist: Vec, + pub playing_item_index: i32, + pub start_position_ticks: i64, + pub is_playing: bool, + pub shuffle_mode: GroupShuffleMode, + pub repeat_mode: GroupRepeatMode, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PlayQueueUpdateGroupUpdate { + pub group_id: String, + pub r#type: GroupUpdateType, + pub data: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum PlayQueueUpdateReason { + NewPlaylist, + SetCurrentItem, + RemoveItems, + MoveItem, + Queue, + QueueNext, + NextItem, + PreviousItem, + RepeatMode, + ShuffleMode, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PlayRequest { + pub item_ids: Option>, + pub start_position_ticks: Option, + pub play_command: Option, + pub controlling_user_id: Option, + pub subtitle_stream_index: Option, + pub audio_stream_index: Option, + pub media_source_id: Option, + pub start_index: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PlayRequestDto { + pub playing_queue: Vec, + pub playing_item_position: i32, + pub start_position_ticks: i64, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum PlaystateCommand { + Stop, + Pause, + Unpause, + NextTrack, + PreviousTrack, + Seek, + Rewind, + FastForward, + PlayPause, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PlaystateRequest { + pub command: PlaystateCommand, + pub seek_position_ticks: Option, + pub controlling_user_id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PluginInfo { + pub name: String, + pub version: String, + pub configuration_file_name: Option, + pub description: String, + pub id: String, + pub can_uninstall: bool, + pub has_image: bool, + pub status: PluginStatus, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum PluginStatus { + Active, + Restart, + Deleted, + Superceded, + Malfunctioned, + NotSupported, + Disabled, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PluginInstallationCancelledMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PluginInstallationCompletedMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PluginInstallationFailedMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PluginInstallingMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PluginUninstalledMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PreviousItemRequestDto { + pub playlist_item_id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ProblemDetails { + pub r#type: Option, + pub title: Option, + pub status: Option, + pub detail: Option, + pub instance: Option, + #[serde(flatten)] + pub additional: BTreeMap, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ProcessPriorityClass { + Normal, + Idle, + High, + RealTime, + BelowNormal, + AboveNormal, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ProfileCondition { + pub condition: ProfileConditionType, + pub property: ProfileConditionValue, + pub value: Option, + pub is_required: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ProfileConditionType { + Equals, + NotEquals, + LessThanEqual, + GreaterThanEqual, + EqualsAny, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ProfileConditionValue { + AudioChannels, + AudioBitrate, + AudioProfile, + Width, + Height, + Has64BitOffsets, + PacketLength, + VideoBitDepth, + VideoBitrate, + VideoFramerate, + VideoLevel, + VideoProfile, + VideoTimestamp, + IsAnamorphic, + RefFrames, + NumAudioStreams, + NumVideoStreams, + IsSecondaryAudio, + VideoCodecTag, + IsAvc, + IsInterlaced, + AudioSampleRate, + AudioBitDepth, + VideoRangeType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ProgramAudio { + Mono, + Stereo, + Dolby, + DolbyDigital, + Thx, + Atmos, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PublicSystemInfo { + pub local_address: Option, + pub server_name: Option, + pub version: Option, + pub product_name: Option, + pub operating_system: Option, + pub id: Option, + pub startup_wizard_completed: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct QueryFilters { + pub genres: Option>, + pub tags: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct QueryFiltersLegacy { + pub genres: Option>, + pub tags: Option>, + pub official_ratings: Option>, + pub years: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct QueueItem { + pub id: String, + pub playlist_item_id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct QueueRequestDto { + pub item_ids: Vec, + pub mode: GroupQueueMode, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct QuickConnectDto { + pub secret: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct QuickConnectResult { + pub authenticated: bool, + pub secret: String, + pub code: String, + pub device_id: String, + pub device_name: String, + pub app_name: String, + pub app_version: String, + pub date_added: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum RatingType { + Score, + Likes, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ReadyRequestDto { + pub when: String, + pub position_ticks: i64, + pub is_playing: bool, + pub playlist_item_id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RecommendationDto { + pub items: Option>, + pub recommendation_type: RecommendationType, + pub baseline_item_name: Option, + pub category_id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum RecommendationType { + SimilarToRecentlyPlayed, + SimilarToLikedItem, + HasDirectorFromRecentlyPlayed, + HasActorFromRecentlyPlayed, + HasLikedDirector, + HasLikedActor, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum RecordingStatus { + New, + InProgress, + Completed, + Cancelled, + ConflictedOk, + ConflictedNotOk, + Error, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RefreshProgressMessage { + pub data: Option>>, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RemoteImageInfo { + pub provider_name: Option, + pub url: Option, + pub thumbnail_url: Option, + pub height: Option, + pub width: Option, + pub community_rating: Option, + pub vote_count: Option, + pub language: Option, + pub r#type: ImageType, + pub rating_type: RatingType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RemoteImageResult { + pub images: Option>, + pub total_record_count: i32, + pub providers: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RemoteLyricInfoDto { + pub id: String, + pub provider_name: String, + pub lyrics: LyricDto, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RemoteSearchResult { + pub name: Option, + pub provider_ids: Option>>, + pub production_year: Option, + pub index_number: Option, + pub index_number_end: Option, + pub parent_index_number: Option, + pub premiere_date: Option, + pub image_url: Option, + pub search_provider_name: Option, + pub overview: Option, + pub album_artist: Option, + pub artists: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RemoteSubtitleInfo { + pub three_letter_i_s_o_language_name: Option, + pub id: Option, + pub provider_name: Option, + pub name: Option, + pub format: Option, + pub author: Option, + pub comment: Option, + pub date_created: Option, + pub community_rating: Option, + pub frame_rate: Option, + pub download_count: Option, + pub is_hash_match: Option, + pub ai_translated: Option, + pub machine_translated: Option, + pub forced: Option, + pub hearing_impaired: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RemovedItem { + pub item_id: String, + pub series_id: Option, + pub season: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RemovedItemQueryResult { + pub items: Option>, + pub total_record_count: i32, + pub start_index: i32, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RemoveFromPlaylistRequestDto { + pub playlist_item_ids: Option>, + pub clear_playlist: bool, + pub clear_playing_item: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum RepeatMode { + RepeatNone, + RepeatAll, + RepeatOne, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RepositoryInfo { + pub name: Option, + pub url: Option, + pub enabled: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct RestartRequiredMessage { + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ScheduledTaskEndedMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ScheduledTasksInfoMessage { + pub data: Option>, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ScheduledTasksInfoStartMessage { + pub data: Option, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ScheduledTasksInfoStopMessage { + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ScrollDirection { + Horizontal, + Vertical, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SearchHint { + pub item_id: Option, + pub id: String, + pub name: String, + pub matched_term: Option, + pub index_number: Option, + pub production_year: Option, + pub parent_index_number: Option, + pub primary_image_tag: Option, + pub thumb_image_tag: Option, + pub thumb_image_item_id: Option, + pub backdrop_image_tag: Option, + pub backdrop_image_item_id: Option, + pub r#type: Option, + pub is_folder: Option, + pub run_time_ticks: Option, + pub media_type: Option, + pub start_date: Option, + pub end_date: Option, + pub series: Option, + pub status: Option, + pub album: Option, + pub album_id: Option, + pub album_artist: Option, + pub artists: Option>, + pub song_count: Option, + pub episode_count: Option, + pub channel_id: Option, + pub channel_name: Option, + pub primary_image_aspect_ratio: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SearchHintResult { + pub search_hints: Vec, + pub total_record_count: i32, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SeekRequestDto { + pub position_ticks: i64, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SendCommand { + pub group_id: String, + pub playlist_item_id: String, + pub when: String, + pub position_ticks: Option, + pub command: SendCommandType, + pub emitted_at: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum SendCommandType { + Unpause, + Pause, + Stop, + Seek, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SeriesInfo { + pub name: Option, + pub original_title: Option, + pub path: Option, + pub metadata_language: Option, + pub metadata_country_code: Option, + pub provider_ids: Option>>, + pub year: Option, + pub index_number: Option, + pub parent_index_number: Option, + pub premiere_date: Option, + pub is_automated: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SeriesInfoRemoteSearchQuery { + pub search_info: Option, + pub item_id: String, + pub search_provider_name: Option, + pub include_disabled_providers: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum SeriesStatus { + Continuing, + Ended, + Unreleased, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SeriesTimerCancelledMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SeriesTimerCreatedMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SeriesTimerInfoDto { + pub id: Option, + pub r#type: Option, + pub server_id: Option, + pub external_id: Option, + pub channel_id: String, + pub external_channel_id: Option, + pub channel_name: Option, + pub channel_primary_image_tag: Option, + pub program_id: Option, + pub external_program_id: Option, + pub name: Option, + pub overview: Option, + pub start_date: String, + pub end_date: String, + pub service_name: Option, + pub priority: i32, + pub pre_padding_seconds: i32, + pub post_padding_seconds: i32, + pub is_pre_padding_required: bool, + pub parent_backdrop_item_id: Option, + pub parent_backdrop_image_tags: Option>, + pub is_post_padding_required: bool, + pub keep_until: KeepUntil, + pub record_any_time: bool, + pub skip_episodes_in_library: bool, + pub record_any_channel: bool, + pub keep_up_to: Option, + pub record_new_only: bool, + pub days: Option>, + pub day_pattern: Option, + pub image_tags: Option>, + pub parent_thumb_item_id: Option, + pub parent_thumb_image_tag: Option, + pub parent_primary_image_item_id: Option, + pub parent_primary_image_tag: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SeriesTimerInfoDtoQueryResult { + pub items: Option>, + pub total_record_count: i32, + pub start_index: i32, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ServerConfiguration { + pub log_file_retention_days: i32, + pub is_startup_wizard_completed: bool, + pub cache_path: Option, + pub previous_version: Option, + pub previous_version_str: Option, + pub enable_metrics: bool, + pub enable_normalized_item_by_name_ids: bool, + pub is_port_authorized: bool, + pub quick_connect_available: bool, + pub enable_case_sensitive_item_ids: bool, + pub disable_live_tv_channel_user_data_name: bool, + pub metadata_path: Option, + pub preferred_metadata_language: Option, + pub metadata_country_code: Option, + pub sort_replace_characters: Option>, + pub sort_remove_characters: Option>, + pub sort_remove_words: Option>, + pub min_resume_pct: i32, + pub max_resume_pct: i32, + pub min_resume_duration_seconds: i32, + pub min_audiobook_resume: i32, + pub max_audiobook_resume: i32, + pub inactive_session_threshold: i32, + pub library_monitor_delay: i32, + pub library_update_duration: i32, + pub image_saving_convention: ImageSavingConvention, + pub metadata_options: Option>, + pub skip_deserialization_for_basic_types: bool, + pub server_name: String, + pub u_i_culture: String, + pub save_metadata_hidden: bool, + pub content_types: Option>, + pub remote_client_bitrate_limit: i32, + pub enable_folder_view: bool, + pub enable_grouping_into_collections: bool, + pub display_specials_within_seasons: bool, + pub codecs_used: Option>, + pub plugin_repositories: Option>, + pub enable_external_content_in_suggestions: bool, + pub image_extraction_timeout_ms: i32, + pub path_substitutions: Option>, + pub enable_slow_response_warning: bool, + pub slow_response_threshold_ms: i64, + pub cors_hosts: Option>, + pub activity_log_retention_days: Option, + pub library_scan_fanout_concurrency: i32, + pub library_metadata_refresh_concurrency: i32, + pub remove_old_plugins: bool, + pub allow_client_log_upload: bool, + pub dummy_chapter_duration: i32, + pub chapter_image_resolution: ImageResolution, + pub parallel_image_encoding_limit: i32, + pub cast_receiver_applications: Option>, + pub trickplay_options: TrickplayOptions, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ServerDiscoveryInfo { + pub address: String, + pub id: String, + pub name: String, + pub endpoint_address: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ServerRestartingMessage { + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ServerShuttingDownMessage { + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SessionInfoDto { + pub play_state: Option, + pub additional_users: Option>, + pub capabilities: Option, + pub remote_end_point: Option, + pub playable_media_types: Option>, + pub id: Option, + pub user_id: String, + pub user_name: Option, + pub client: Option, + pub last_activity_date: String, + pub last_playback_check_in: String, + pub last_paused_date: Option, + pub device_name: Option, + pub device_type: Option, + pub now_playing_item: Option, + pub now_viewing_item: Option, + pub device_id: Option, + pub application_version: Option, + pub transcoding_info: Option, + pub is_active: bool, + pub supports_media_control: bool, + pub supports_remote_control: bool, + pub now_playing_queue: Option>, + pub now_playing_queue_full_items: Option>, + pub has_custom_device_name: bool, + pub playlist_item_id: Option, + pub server_id: Option, + pub user_primary_image_tag: Option, + pub supported_commands: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum SessionMessageType { + ForceKeepAlive, + GeneralCommand, + UserDataChanged, + Sessions, + Play, + SyncPlayCommand, + SyncPlayGroupUpdate, + Playstate, + RestartRequired, + ServerShuttingDown, + ServerRestarting, + LibraryChanged, + UserDeleted, + UserUpdated, + SeriesTimerCreated, + TimerCreated, + SeriesTimerCancelled, + TimerCancelled, + RefreshProgress, + ScheduledTaskEnded, + PackageInstallationCancelled, + PackageInstallationFailed, + PackageInstallationCompleted, + PackageInstalling, + PackageUninstalled, + ActivityLogEntry, + ScheduledTasksInfo, + ActivityLogEntryStart, + ActivityLogEntryStop, + SessionsStart, + SessionsStop, + ScheduledTasksInfoStart, + ScheduledTasksInfoStop, + KeepAlive, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SessionsMessage { + pub data: Option>, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SessionsStartMessage { + pub data: Option, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SessionsStopMessage { + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SessionUserInfo { + pub user_id: String, + pub user_name: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SetChannelMappingDto { + pub provider_id: String, + pub tuner_channel_id: String, + pub provider_channel_id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SetPlaylistItemRequestDto { + pub playlist_item_id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SetRepeatModeRequestDto { + pub mode: GroupRepeatMode, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SetShuffleModeRequestDto { + pub mode: GroupShuffleMode, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SongInfo { + pub name: Option, + pub original_title: Option, + pub path: Option, + pub metadata_language: Option, + pub metadata_country_code: Option, + pub provider_ids: Option>>, + pub year: Option, + pub index_number: Option, + pub parent_index_number: Option, + pub premiere_date: Option, + pub is_automated: bool, + pub album_artists: Option>, + pub album: Option, + pub artists: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum SortOrder { + Ascending, + Descending, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SpecialViewOptionDto { + pub name: Option, + pub id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct StartupConfigurationDto { + pub u_i_culture: Option, + pub metadata_country_code: Option, + pub preferred_metadata_language: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct StartupRemoteAccessDto { + pub enable_remote_access: bool, + pub enable_automatic_port_mapping: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct StartupUserDto { + pub name: Option, + pub password: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum Status { + Completed, + Watching, + Both, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct StringGroupUpdate { + pub group_id: String, + pub r#type: GroupUpdateType, + pub data: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum SubtitleDeliveryMethod { + Encode, + Embed, + External, + Hls, + Drop, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SubtitleOptions { + pub skip_if_embedded_subtitles_present: bool, + pub skip_if_audio_track_matches: bool, + pub download_languages: Option>, + pub download_movie_subtitles: bool, + pub download_episode_subtitles: bool, + pub open_subtitles_username: Option, + pub open_subtitles_password_hash: Option, + pub is_open_subtitle_vip_account: bool, + pub require_perfect_match: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum SubtitlePlaybackMode { + Default, + Always, + OnlyForced, + None, + Smart, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SubtitleProfile { + pub format: Option, + pub method: SubtitleDeliveryMethod, + pub didl_mode: Option, + pub language: Option, + pub container: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum SyncAction { + UpdateProvider, + UpdateJellyfin, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SyncPlayCommandMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SyncPlayGroupUpdateCommandMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SyncPlayQueueItem { + pub item_id: String, + pub playlist_item_id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum SyncPlayUserAccessType { + CreateAndJoinGroups, + JoinGroups, + None, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SyncStats { + pub updated_folders: i32, + pub removed_folders: i32, + pub updated_box_sets: i32, + pub removed_box_sets: i32, + pub updated_playlists: i32, + pub removed_playlists: i32, + pub updated_tv_shows: i32, + pub removed_tv_shows: i32, + pub updated_seasons: i32, + pub removed_seasons: i32, + pub updated_videos: i32, + pub removed_videos: i32, + pub updated_collection_folders: i32, + pub updated_user_data: i32, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SystemInfo { + pub local_address: Option, + pub server_name: Option, + pub version: Option, + pub product_name: Option, + pub operating_system: Option, + pub id: Option, + pub startup_wizard_completed: Option, + pub operating_system_display_name: Option, + pub package_name: Option, + pub has_pending_restart: bool, + pub is_shutting_down: bool, + pub supports_library_monitor: bool, + pub web_socket_port_number: i32, + pub completed_installations: Option>, + pub can_self_restart: bool, + pub can_launch_web_browser: bool, + pub program_data_path: Option, + pub web_path: Option, + pub items_by_name_path: Option, + pub cache_path: Option, + pub log_path: Option, + pub internal_metadata_path: Option, + pub transcoding_temp_path: Option, + pub cast_receiver_applications: Option>, + pub has_update_available: bool, + pub encoder_location: String, + pub system_architecture: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TaskCompletionStatus { + pub r#type: TaskCompletionStatusEnum, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum TaskCompletionStatusEnum { + Completed, + Failed, + Cancelled, + Aborted, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TaskInfo { + pub name: Option, + pub state: TaskState, + pub current_progress_percentage: Option, + pub id: Option, + pub last_execution_result: Option, + pub triggers: Option>, + pub description: Option, + pub category: Option, + pub is_hidden: bool, + pub key: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TaskResult { + pub start_time_utc: String, + pub end_time_utc: String, + pub status: TaskCompletionStatus, + pub name: Option, + pub key: Option, + pub id: Option, + pub error_message: Option, + pub long_error_message: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum TaskState { + Idle, + Cancelling, + Running, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TaskTriggerInfo { + pub r#type: Option, + pub time_of_day_ticks: Option, + pub interval_ticks: Option, + pub day_of_week: Option, + pub max_runtime_ticks: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ThemeMediaResult { + pub items: Option>, + pub total_record_count: i32, + pub start_index: i32, + pub owner_id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TimerCancelledMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TimerCreatedMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TimerEventInfo { + pub id: String, + pub program_id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TimerInfoDto { + pub id: Option, + pub r#type: Option, + pub server_id: Option, + pub external_id: Option, + pub channel_id: String, + pub external_channel_id: Option, + pub channel_name: Option, + pub channel_primary_image_tag: Option, + pub program_id: Option, + pub external_program_id: Option, + pub name: Option, + pub overview: Option, + pub start_date: String, + pub end_date: String, + pub service_name: Option, + pub priority: i32, + pub pre_padding_seconds: i32, + pub post_padding_seconds: i32, + pub is_pre_padding_required: bool, + pub parent_backdrop_item_id: Option, + pub parent_backdrop_image_tags: Option>, + pub is_post_padding_required: bool, + pub keep_until: KeepUntil, + pub status: RecordingStatus, + pub series_timer_id: Option, + pub external_series_timer_id: Option, + pub run_time_ticks: Option, + pub program_info: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TimerInfoDtoQueryResult { + pub items: Option>, + pub total_record_count: i32, + pub start_index: i32, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TonemappingAlgorithm { + pub r#type: TonemappingAlgorithmEnum, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum TonemappingAlgorithmEnum { + None, + Clip, + Linear, + Gamma, + Reinhard, + Hable, + Mobius, + Bt2390, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TonemappingMode { + pub r#type: TonemappingModeEnum, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum TonemappingModeEnum { + Auto, + Max, + Rgb, + Lum, + Itp, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TonemappingRange { + pub r#type: TonemappingRangeEnum, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum TonemappingRangeEnum { + Auto, + Tv, + Pc, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TrailerInfo { + pub name: Option, + pub original_title: Option, + pub path: Option, + pub metadata_language: Option, + pub metadata_country_code: Option, + pub provider_ids: Option>>, + pub year: Option, + pub index_number: Option, + pub parent_index_number: Option, + pub premiere_date: Option, + pub is_automated: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TrailerInfoRemoteSearchQuery { + pub search_info: Option, + pub item_id: String, + pub search_provider_name: Option, + pub include_disabled_providers: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TranscodeReason { + pub r#type: TranscodeReasonEnum, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum TranscodeReasonEnum { + ContainerNotSupported, + VideoCodecNotSupported, + AudioCodecNotSupported, + SubtitleCodecNotSupported, + AudioIsExternal, + SecondaryAudioNotSupported, + VideoProfileNotSupported, + VideoLevelNotSupported, + VideoResolutionNotSupported, + VideoBitDepthNotSupported, + VideoFramerateNotSupported, + RefFramesNotSupported, + AnamorphicVideoNotSupported, + InterlacedVideoNotSupported, + AudioChannelsNotSupported, + AudioProfileNotSupported, + AudioSampleRateNotSupported, + AudioBitDepthNotSupported, + ContainerBitrateExceedsLimit, + VideoBitrateNotSupported, + AudioBitrateNotSupported, + UnknownVideoStreamInfo, + UnknownAudioStreamInfo, + DirectPlayError, + VideoRangeTypeNotSupported, + VideoCodecTagNotSupported, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TranscodeSeekInfo { + pub r#type: TranscodeSeekInfoEnum, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum TranscodeSeekInfoEnum { + Auto, + Bytes, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TranscodingInfo { + pub audio_codec: Option, + pub video_codec: Option, + pub container: Option, + pub is_video_direct: bool, + pub is_audio_direct: bool, + pub bitrate: Option, + pub framerate: Option, + pub completion_percentage: Option, + pub width: Option, + pub height: Option, + pub audio_channels: Option, + pub hardware_acceleration_type: Option, + pub transcoding_reasons: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TranscodingProfile { + pub container: Option, + pub r#type: DlnaProfileType, + pub video_codec: Option, + pub audio_codec: Option, + pub protocol: MediaStreamProtocol, + pub estimate_content_length: bool, + pub enable_mpegts_m2_ts_mode: bool, + pub transcoding_seek_info: TranscodeSeekInfo, + pub copy_timestamps: bool, + pub context: EncodingContext, + pub enable_subtitles_in_manifest: bool, + pub max_audio_channels: Option, + pub min_segments: i32, + pub segment_length: i32, + pub break_on_non_key_frames: bool, + pub conditions: Option>, + pub enable_audio_vbr_encoding: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TransportStreamTimestamp { + pub r#type: TransportStreamTimestampEnum, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum TransportStreamTimestampEnum { + None, + Zero, + Valid, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TrickplayInfo { + pub width: i32, + pub height: i32, + pub tile_width: i32, + pub tile_height: i32, + pub thumbnail_count: i32, + pub interval: i32, + pub bandwidth: i32, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TrickplayOptions { + pub enable_hw_acceleration: bool, + pub enable_hw_encoding: bool, + pub enable_key_frame_only_extraction: bool, + pub scan_behavior: TrickplayScanBehavior, + pub process_priority: ProcessPriorityClass, + pub interval: i32, + pub width_resolutions: Option>, + pub tile_width: i32, + pub tile_height: i32, + pub qscale: i32, + pub jpeg_quality: i32, + pub process_threads: i32, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum TrickplayScanBehavior { + Blocking, + NonBlocking, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TunerChannelMapping { + pub name: Option, + pub provider_channel_name: Option, + pub provider_channel_id: Option, + pub id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TunerHostInfo { + pub id: Option, + pub url: Option, + pub r#type: Option, + pub device_id: Option, + pub friendly_name: Option, + pub import_favorites_only: bool, + pub allow_hw_transcoding: bool, + pub allow_fmp4_transcoding_container: bool, + pub allow_stream_sharing: bool, + pub fallback_max_streaming_bitrate: i32, + pub enable_stream_looping: bool, + pub source: Option, + pub tuner_count: i32, + pub user_agent: Option, + pub ignore_dts: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TypeOptions { + pub r#type: Option, + pub metadata_fetchers: Option>, + pub metadata_fetcher_order: Option>, + pub image_fetchers: Option>, + pub image_fetcher_order: Option>, + pub image_options: Option>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UnratedItem { + pub r#type: UnratedItemEnum, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum UnratedItemEnum { + Movie, + Trailer, + Series, + Music, + Book, + LiveTvChannel, + LiveTvProgram, + ChannelContent, + Other, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UpdateLibraryOptionsDto { + pub id: String, + pub library_options: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UpdateMediaPathRequestDto { + pub name: String, + pub path_info: MediaPathInfo, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UpdatePlaylistDto { + pub name: Option, + pub ids: Option>, + pub users: Option>, + pub is_public: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UpdatePlaylistUserDto { + pub can_edit: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UpdateUserItemDataDto { + pub rating: Option, + pub played_percentage: Option, + pub unplayed_item_count: Option, + pub playback_position_ticks: i64, + pub play_count: i32, + pub is_favorite: bool, + pub likes: Option, + pub last_played_date: Option, + pub played: bool, + pub key: String, + pub item_id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UpdateUserPassword { + pub current_password: Option, + pub current_pw: Option, + pub new_pw: Option, + pub reset_password: bool, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UploadSubtitleDto { + pub language: String, + pub format: String, + pub is_forced: bool, + pub is_hearing_impaired: bool, + pub data: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UserConfiguration { + pub audio_language_preference: Option, + pub play_default_audio_track: bool, + pub subtitle_language_preference: Option, + pub display_missing_episodes: bool, + pub grouped_folders: Vec, + pub subtitle_mode: SubtitlePlaybackMode, + pub display_collections_view: bool, + pub enable_local_password: bool, + pub ordered_views: Vec, + pub latest_items_excludes: Vec, + pub my_media_excludes: Vec, + pub hide_played_in_latest: bool, + pub remember_audio_selections: bool, + pub remember_subtitle_selections: bool, + pub enable_next_episode_auto_play: bool, + pub cast_receiver_id: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UserDataChangedMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UserDataChangeInfo { + pub user_id: String, + pub user_data_list: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UserDeletedMessage { + pub data: String, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UserDto { + pub name: Option, + pub server_id: Option, + pub server_name: Option, + pub id: String, + pub primary_image_tag: Option, + pub has_password: bool, + pub has_configured_password: bool, + pub has_configured_easy_password: bool, + pub enable_auto_login: Option, + pub last_login_date: Option, + pub last_activity_date: Option, + pub configuration: Option, + pub policy: Option, + pub primary_image_aspect_ratio: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UserItemDataDto { + pub rating: Option, + pub played_percentage: Option, + pub unplayed_item_count: i32, + pub playback_position_ticks: i64, + pub play_count: i32, + pub is_favorite: bool, + pub likes: Option, + pub last_played_date: Option, + pub played: bool, + pub key: String, + pub item_id: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UserPolicy { + pub is_administrator: bool, + pub is_hidden: bool, + pub enable_collection_management: bool, + pub enable_subtitle_management: bool, + pub enable_lyric_management: bool, + pub is_disabled: bool, + pub max_parental_rating: Option, + pub blocked_tags: Option>, + pub allowed_tags: Option>, + pub enable_user_preference_access: bool, + pub access_schedules: Option>, + pub block_unrated_items: Option>, + pub enable_remote_control_of_other_users: bool, + pub enable_shared_device_control: bool, + pub enable_remote_access: bool, + pub enable_live_tv_management: bool, + pub enable_live_tv_access: bool, + pub enable_media_playback: bool, + pub enable_audio_playback_transcoding: bool, + pub enable_video_playback_transcoding: bool, + pub enable_playback_remuxing: bool, + pub force_remote_source_transcoding: bool, + pub enable_content_deletion: bool, + pub enable_content_deletion_from_folders: Option>, + pub enable_content_downloading: bool, + pub enable_sync_transcoding: bool, + pub enable_media_conversion: bool, + pub enabled_devices: Option>, + pub enable_all_devices: bool, + pub enabled_channels: Option>, + pub enable_all_channels: bool, + pub enabled_folders: Option>, + pub enable_all_folders: bool, + pub invalid_login_attempt_count: i32, + pub login_attempts_before_lockout: i32, + pub max_active_sessions: i32, + pub enable_public_sharing: bool, + pub blocked_media_folders: Option>, + pub blocked_channels: Option>, + pub remote_client_bitrate_limit: i32, + pub authentication_provider_id: String, + pub password_reset_provider_id: String, + pub sync_play_access: SyncPlayUserAccessType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UserUpdatedMessage { + pub data: Option, + pub message_id: String, + pub message_type: SessionMessageType, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UtcTimeResponse { + pub request_reception_time: String, + pub response_transmission_time: String, +} diff --git a/flake.lock b/flake.lock index d2660f0..cb219f7 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "advisory-db": { "flake": false, "locked": { - "lastModified": 1761631338, - "narHash": "sha256-F6dlUrDiShwhMfPR+WoVmaQguGdEwjW9SI4nKlkay7c=", + "lastModified": 1762774274, + "narHash": "sha256-tigj2sBL6S7zmjpt5JdXtvtGrClvja+/LAnmpU6+MV4=", "owner": "rustsec", "repo": "advisory-db", - "rev": "2e45336771e36acf5bcefe7c99280ab214719707", + "rev": "df17e8c0d170b71c0a4cca3f165c30030a526060", "type": "github" }, "original": { @@ -18,11 +18,11 @@ }, "crane": { "locked": { - "lastModified": 1760924934, - "narHash": "sha256-tuuqY5aU7cUkR71sO2TraVKK2boYrdW3gCSXUkF4i44=", + "lastModified": 1762538466, + "narHash": "sha256-8zrIPl6J+wLm9MH5ksHcW7BUHo7jSNOu0/hA0ohOOaM=", "owner": "ipetkov", "repo": "crane", - "rev": "c6b4d5308293d0d04fcfeee92705017537cad02f", + "rev": "0cea393fffb39575c46b7a0318386467272182fe", "type": "github" }, "original": { @@ -106,11 +106,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1761373498, - "narHash": "sha256-Q/uhWNvd7V7k1H1ZPMy/vkx3F8C13ZcdrKjO7Jv7v0c=", + "lastModified": 1762844143, + "narHash": "sha256-SlybxLZ1/e4T2lb1czEtWVzDCVSTvk9WLwGhmxFmBxI=", "owner": "nixos", "repo": "nixpkgs", - "rev": "6a08e6bb4e46ff7fcbb53d409b253f6bad8a28ce", + "rev": "9da7f1cf7f8a6e2a7cb3001b048546c92a8258b4", "type": "github" }, "original": { @@ -138,11 +138,11 @@ ] }, "locked": { - "lastModified": 1761705569, - "narHash": "sha256-dqljv29XldlKvdTwFw8GkxOQHrz3/13yxdwHW8+nzBI=", + "lastModified": 1763001554, + "narHash": "sha256-wsfhRTuxu6f06RMmP4JWcq3wWRlmYtQaJZ6b3f+EJ94=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "bca7909cb02f5139e0a490b0ff4bae775ea3ebf6", + "rev": "315d97eb753cee8e1aa039a5e622b84d32a454bb", "type": "github" }, "original": { diff --git a/justfile b/justfile new file mode 100644 index 0000000..8f492de --- /dev/null +++ b/justfile @@ -0,0 +1,6 @@ +typegen: + @echo "Generating jellyfin type definitions..." + cd typegen && cargo run + cp typegen/jellyfin.rs api/src/jellyfin.rs + rm typegen/jellyfin.rs + diff --git a/typegen/Cargo.toml b/typegen/Cargo.toml index 4913010..1b1af18 100644 --- a/typegen/Cargo.toml +++ b/typegen/Cargo.toml @@ -4,7 +4,10 @@ version = "0.1.0" edition = "2024" [dependencies] +heck = "0.5.0" indexmap = { version = "2.12.0", features = ["serde"] } +prettyplease = "0.2.37" +proc-macro2 = "1.0.103" quote = "1.0.41" serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.145" diff --git a/typegen/src/main.rs b/typegen/src/main.rs index 379bb10..42860af 100644 --- a/typegen/src/main.rs +++ b/typegen/src/main.rs @@ -1,5 +1,10 @@ +use heck::*; use indexmap::IndexMap; -use syn::{FieldsNamed, parse_quote, token::Enum}; + +const KEYWORDS: &[&str] = &[ + "type", "match", "enum", "struct", "fn", "mod", "pub", "use", "crate", "self", "super", "as", + "in", "let", "mut", "ref", "static", "trait", "where", +]; #[derive(Debug, serde::Serialize, serde::Deserialize, Clone)] pub struct JellyfinOpenapi { @@ -16,21 +21,87 @@ pub struct Schema { _type: Types, properties: Option>, #[serde(rename = "oneOf")] - one_of: Option>, + one_of: Option>, + #[serde(rename = "enum")] + _enum: Option>, description: Option, } #[derive(Debug, serde::Serialize, serde::Deserialize, Clone)] -pub struct EnumVariant { +pub struct RefName { #[serde(rename = "$ref")] _ref: String, } +impl RefName { + pub fn get_type_name(&self) -> String { + self._ref.split('/').last().unwrap().to_string() + } +} + #[derive(Debug, serde::Serialize, serde::Deserialize, Clone)] pub struct Property { #[serde(rename = "type")] _type: Option, nullable: Option, + format: Option, + items: Option>, + #[serde(rename = "additionalProperties")] + additional_properties: Option>, + #[serde(rename = "enum")] + _enum: Option>, + #[serde(rename = "allOf")] + all_of: Option>, + description: Option, + #[serde(rename = "$ref")] + _ref: Option, +} + +impl Property { + pub fn to_string(&self) -> String { + let out = match self._type { + Some(Types::String) => "String".to_string(), + Some(Types::Integer) => match self.format.as_deref() { + Some("int32") => "i32".to_string(), + Some("int64") => "i64".to_string(), + _ => "i32".to_string(), + }, + Some(Types::Boolean) => "bool".to_string(), + Some(Types::Number) => "f64".to_string(), + Some(Types::Array) => { + if let Some(ref items) = self.items { + format!("Vec<{}>", items.to_string()) + } else { + "Vec<()>".to_string() + } + } + Some(Types::Object) => { + if let Some(properties) = &self.additional_properties { + format!( + "std::collections::HashMap", + properties.to_string() + ) + } else { + "std::collections::HashMap".to_string() + } + } + + None => { + if let Some(ref _ref) = self._ref { + _ref.split('/').last().unwrap().to_string() + } else if let Some(ref all_of) = self.all_of { + all_of[0].get_type_name() + } else { + "()".into() + } + } + }; + if let Some(true) = self.nullable { + format!("Option<{}>", out) + } else { + out + } + } } #[derive(Debug, serde::Serialize, serde::Deserialize, Clone)] @@ -58,7 +129,7 @@ fn main() { .components .schemas .iter() - .filter(|(k, v)| v.one_of.is_some()) + .filter(|(_, v)| v._enum.is_some()) .map(|(k, v)| (k.clone(), v.clone())) .collect(); @@ -67,14 +138,86 @@ fn main() { .map(|(key, value)| { let fields = value .properties - .unwrap() + .as_ref() + .expect("Possible properties") .iter() - .map(|(name, _type)| format!("{}:{}", name, _type.is_)); - parse_quote! { + .map(|(name, _type)| { + let og_name = name.clone(); + let name = modify_keyword(&name.to_snake_case()); + let _type = _type.to_string(); + let _type = if _type.contains(key) { + _type.replace(&format!("<{}>", key), format!(">", key).as_str()) + } else { + _type + }; + syn::Field { + attrs: syn::parse_quote! { + #[serde(rename = #og_name)] + }, + mutability: syn::FieldMutability::None, + vis: syn::Visibility::Public(syn::Token![pub]( + proc_macro2::Span::call_site(), + )), + ident: Some(syn::Ident::new(&name, proc_macro2::Span::call_site())), + colon_token: Some(syn::token::Colon(proc_macro2::Span::call_site())), + ty: syn::parse_str(&_type).expect("Failed to parse type"), + } + }) + .collect::>(); + let key = modify_keyword(key); + let key = syn::Ident::new(&key.to_pascal_case(), proc_macro2::Span::call_site()); + let tokens = quote::quote! { + #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct #key { - + #(#fields),* } - } + }; + syn::parse2(tokens).expect("Failed to parse struct") }) .collect(); + + let syn_enums = enums + .iter() + .map(|(key, value)| { + let variants = value + ._enum + .as_ref() + .expect("Possible oneOf") + .iter() + .map(|variant| { + // let variant_name = modify_keyword(&ref_name.to_pascal_case()); + syn::Ident::new(&variant.to_pascal_case(), proc_macro2::Span::call_site()) + }) + .collect::>(); + let key = modify_keyword(key); + let key = syn::Ident::new(&key.to_pascal_case(), proc_macro2::Span::call_site()); + let tokens = quote::quote! { + #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] + pub enum #key { + #(#variants),* + } + }; + syn::parse2(tokens).expect("Failed to parse enum") + }) + .collect::>(); + + let file = syn::File { + shebang: None, + attrs: vec![], + items: syn_structs + .into_iter() + .map(syn::Item::Struct) + .chain(syn_enums.into_iter().map(syn::Item::Enum)) + .collect(), + }; + let code = prettyplease::unparse(&file); + std::fs::write("jellyfin.rs", code).expect("Unable to write file"); +} + +fn modify_keyword(name: &str) -> String { + if KEYWORDS.contains(&name) { + format!("_{}", name) + } else { + name.to_string() + } }