Files
NixReaperandClaude Sonnet 5 6aa9f0b840
CI / lint (push) Canceled after 0s
CI / typecheck (push) Canceled after 0s
CI / unit-tests (push) Canceled after 0s
CI / integration-tests (push) Canceled after 0s
CI / container-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
Add GET /people browse/discover endpoint
Extends the browse/discover pattern already built for movies/series
to the fourth major entity type. No genre/year/status equivalent for
people -- known_for_department is the one categorical filter that
actually means something for a cast/crew list, and sort_by is just
popularity (default) or name. No invalid-filter case either: unlike
genre/status, known_for_department is a plain string compared
directly, nothing to parse or validate.

build_person_summary refactored to share row-to-summary logic with
the new list path, same pattern used for movies/series/companies.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-09-05 10:32:16 -05:00

81 lines
2.1 KiB
Python

"""Person response schemas."""
from __future__ import annotations
from datetime import date, datetime
from pydantic import BaseModel
from app.schemas.common import ArtworkOut
class PersonSummaryOut(BaseModel):
id: str
type: str = "person"
name: str
known_for_department: str | None = None
profile_path: str | None = None
popularity: float | None = None
class GuestEpisodeOut(BaseModel):
id: str
season_number: int
episode_number: int
title: str | None = None
air_date: date | None = None
class FilmographyCreditOut(BaseModel):
id: str
media_id: str
media_type: str
title: str
department: str
job: str | None = None
character: str | None = None
release_date: date | None = None
poster_path: str | None = None
# Set only for series filmography built from guest-star episode credits:
# how many distinct episodes this character/credit appeared in, since
# those are aggregated to one row per series rather than one per
# episode. None for movie credits and regular (non-guest) series roles.
episode_count: int | None = None
# The individual episodes behind episode_count, sorted by (season,
# episode) -- empty for movie credits and regular (non-guest) series
# roles, same as episode_count.
episodes: list[GuestEpisodeOut] = []
class PersonDetailOut(BaseModel):
id: str
type: str = "person"
name: str
aliases: list[str] = []
biography: str | None = None
birthday: date | None = None
deathday: date | None = None
birthplace: str | None = None
gender: str | None = None
known_for_department: str | None = None
popularity: float | None = None
profile_images: list[ArtworkOut] = []
external_ids: dict[str, str] = {}
created_at: datetime
updated_at: datetime
class PersonCreditsOut(BaseModel):
id: str
cast: list[FilmographyCreditOut] = []
crew: list[FilmographyCreditOut] = []
class PersonListOut(BaseModel):
page: int
page_size: int
total_results: int
total_pages: int
results: list[PersonSummaryOut] = []