"""Series/season/episode response schemas.""" from __future__ import annotations from datetime import date, datetime from pydantic import BaseModel from app.schemas.common import ( AlternateTitleOut, CastCreditOut, CompanyBriefOut, CrewCreditOut, GenreOut, ImagesOut, KeywordOut, ReleaseDateOut, VideoOut, WatchProviderRegionOut, ) class SeriesSummaryOut(BaseModel): id: str type: str = "series" title: str original_title: str | None = None overview: str | None = None first_air_date: date | None = None poster_path: str | None = None popularity: float | None = None vote_average: float | None = None class SeasonBriefOut(BaseModel): id: str season_number: int title: str | None = None episode_count: int | None = None air_date: date | None = None poster_path: str | None = None class SeriesDetailOut(BaseModel): id: str type: str = "series" title: str original_title: str | None = None overview: str | None = None tagline: str | None = None status: str original_language: str | None = None first_air_date: date | None = None last_air_date: date | None = None number_of_seasons: int | None = None number_of_episodes: int | None = None popularity: float | None = None vote_average: float | None = None vote_count: int | None = None # The US TV rating (e.g. "TV-MA") -- convenience pick out of # `release_dates` below, same as MovieDetailOut.certification. certification: str | None = None genres: list[GenreOut] = [] keywords: list[KeywordOut] = [] alternate_titles: list[AlternateTitleOut] = [] creators: list[CrewCreditOut] = [] cast: list[CastCreditOut] = [] crew: list[CrewCreditOut] = [] networks: list[CompanyBriefOut] = [] companies: list[CompanyBriefOut] = [] seasons: list[SeasonBriefOut] = [] images: ImagesOut = ImagesOut() videos: list[VideoOut] = [] release_dates: list[ReleaseDateOut] = [] watch_providers: dict[str, WatchProviderRegionOut] = {} external_ids: dict[str, str] = {} created_at: datetime updated_at: datetime class SeriesWatchProvidersOut(BaseModel): id: str results: dict[str, WatchProviderRegionOut] = {} class SeriesSeasonsOut(BaseModel): id: str seasons: list[SeasonBriefOut] = [] class SeriesCreditsOut(BaseModel): id: str cast: list[CastCreditOut] = [] crew: list[CrewCreditOut] = [] creators: list[CrewCreditOut] = [] class SeriesImagesOut(BaseModel): id: str images: ImagesOut = ImagesOut() class SeriesVideosOut(BaseModel): id: str videos: list[VideoOut] = [] class SeriesListOut(BaseModel): page: int page_size: int total_results: int total_pages: int results: list[SeriesSummaryOut] = [] class RatedSeriesOut(SeriesSummaryOut): rating: float class RatedSeriesListOut(BaseModel): page: int page_size: int total_results: int total_pages: int results: list[RatedSeriesOut] = [] class EpisodeBriefOut(BaseModel): id: str episode_number: int title: str | None = None air_date: date | None = None still_path: str | None = None class SeasonDetailOut(BaseModel): id: str type: str = "season" series_id: str season_number: int title: str | None = None overview: str | None = None air_date: date | None = None episode_count: int | None = None episodes: list[EpisodeBriefOut] = [] images: ImagesOut = ImagesOut() external_ids: dict[str, str] = {} created_at: datetime updated_at: datetime class EpisodeDetailOut(BaseModel): id: str type: str = "episode" series_id: str season_id: str season_number: int episode_number: int title: str | None = None overview: str | None = None air_date: date | None = None runtime: int | None = None cast: list[CastCreditOut] = [] guest_stars: list[CastCreditOut] = [] crew: list[CrewCreditOut] = [] images: ImagesOut = ImagesOut() external_ids: dict[str, str] = {} created_at: datetime updated_at: datetime