use serde::{Deserialize, Serialize};
use super::{date::PartialDate, genre::Genre, media_id::MediaId};
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Gender {
NotSpecified,
Female,
Male,
NonBinary,
}
impl Gender {
pub fn from_tmdb(code: i64) -> Option<Self> {
match code {
1 => Some(Gender::Female),
2 => Some(Gender::Male),
3 => Some(Gender::NonBinary),
_ => None,
}
}
pub fn from_anilist(value: &str) -> Self {
match value {
"Female" => Gender::Female,
"Male" => Gender::Male,
"Non-binary" => Gender::NonBinary,
_ => Gender::NotSpecified,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Collection {
pub id: Option<u64>,
pub name: String,
pub poster_url: Option<String>,
pub backdrop_url: Option<String>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Company {
pub id: Option<u64>,
pub name: String,
pub logo_url: Option<String>,
pub origin_country: Option<String>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Network {
pub id: Option<u64>,
pub name: String,
pub logo_url: Option<String>,
pub origin_country: Option<String>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Creator {
pub id: Option<u64>,
pub name: String,
pub profile_url: Option<String>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnifiedMovie {
pub provider_id: MediaId,
pub title: String,
pub original_title: Option<String>,
pub overview: Option<String>,
pub release_date: Option<PartialDate>,
pub poster_url: Option<String>,
pub backdrop_url: Option<String>,
pub genres: Vec<Genre>,
pub popularity: Option<f64>,
pub vote_average: Option<f64>,
pub vote_count: Option<u64>,
pub original_language: Option<String>,
pub adult: Option<bool>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnifiedMovieDetails {
pub movie: UnifiedMovie,
pub tagline: Option<String>,
pub runtime: Option<u32>,
pub budget: Option<u64>,
pub revenue: Option<u64>,
pub status: Option<String>,
pub homepage: Option<String>,
pub imdb_id: Option<String>,
pub production_companies: Vec<Company>,
pub production_countries: Vec<String>,
pub spoken_languages: Vec<String>,
pub video: bool,
pub belongs_to_collection: Option<Collection>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnifiedTvShow {
pub provider_id: MediaId,
pub name: String,
pub original_name: Option<String>,
pub overview: Option<String>,
pub first_air_date: Option<PartialDate>,
pub poster_url: Option<String>,
pub backdrop_url: Option<String>,
pub genres: Vec<Genre>,
pub popularity: Option<f64>,
pub vote_average: Option<f64>,
pub vote_count: Option<u64>,
pub original_language: Option<String>,
pub origin_country: Vec<String>,
pub adult: Option<bool>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnifiedTvShowDetails {
pub show: UnifiedTvShow,
pub tagline: Option<String>,
pub number_of_seasons: Option<u32>,
pub number_of_episodes: Option<u32>,
pub in_production: bool,
pub status: Option<String>,
pub homepage: Option<String>,
pub networks: Vec<Network>,
pub production_companies: Vec<Company>,
pub last_air_date: Option<PartialDate>,
pub type_: Option<String>,
pub media_format: Option<String>,
pub created_by: Vec<Creator>,
pub episode_run_time: Vec<u32>,
pub spoken_languages: Vec<String>,
pub production_countries: Vec<String>,
pub seasons: Vec<UnifiedSeason>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnifiedSeason {
pub season_number: u32,
pub name: Option<String>,
pub overview: Option<String>,
pub air_date: Option<PartialDate>,
pub episode_count: Option<u32>,
pub poster_url: Option<String>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnifiedPerson {
pub provider_id: MediaId,
pub name: String,
pub known_for_department: Option<String>,
pub profile_url: Option<String>,
pub popularity: Option<f64>,
pub gender: Option<Gender>,
pub adult: Option<bool>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnifiedPersonDetails {
pub person: UnifiedPerson,
pub biography: Option<String>,
pub birthday: Option<PartialDate>,
pub deathday: Option<PartialDate>,
pub place_of_birth: Option<String>,
pub imdb_id: Option<String>,
pub homepage: Option<String>,
pub also_known_as: Vec<String>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum UnifiedSearchResult {
Movie(UnifiedMovie),
TvShow(UnifiedTvShow),
Person(UnifiedPerson),
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnifiedSeasonDetails {
pub show_id: MediaId,
pub season_number: u32,
pub name: Option<String>,
pub overview: Option<String>,
pub air_date: Option<PartialDate>,
pub poster_url: Option<String>,
pub episodes: Vec<UnifiedEpisode>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnifiedEpisode {
pub episode_number: u32,
pub name: Option<String>,
pub overview: Option<String>,
pub air_date: Option<PartialDate>,
pub runtime: Option<u32>,
pub still_url: Option<String>,
pub vote_average: Option<f64>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnifiedWatchProviders {
pub provider_id: MediaId,
pub results: std::collections::HashMap<String, UnifiedWatchProviderEntry>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct UnifiedWatchProviderEntry {
pub flatrate: Vec<UnifiedStreamingService>,
pub rent: Vec<UnifiedStreamingService>,
pub buy: Vec<UnifiedStreamingService>,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnifiedStreamingService {
pub name: String,
pub logo_url: Option<String>,
}