diff options
| author | Tyler Hoang <tyler@tylerhoang.xyz> | 2026-05-06 17:20:35 -0700 |
|---|---|---|
| committer | Tyler Hoang <tyler@tylerhoang.xyz> | 2026-05-06 17:20:35 -0700 |
| commit | 2d298f982408f222ad344b2aa9c18bbe7dc70f12 (patch) | |
| tree | 7347dff5f45789189032bee2821c3cd314b69625 /services/tmdb.py | |
| parent | 4bbafdd460945eb506ddb07b9068731245708812 (diff) | |
Add TMDB poster picker to film detail page
- New movie_images() async function in services/tmdb.py fetches poster
URLs from TMDB /movie/{id}/images endpoint, filtering for English
and no-text posters only
- New GET /tmdb/posters endpoint returns list of available posters for
a TMDB ID
- New POST /films/{film_id}/poster endpoint to save selected poster
(mirrors the stars endpoint pattern)
- Add "Change Poster" button on detail page (only shown if film has a
TMDB ID) that opens a 3-column grid of posters
- Selected poster gets accent border, main image updates instantly, no
page reload needed
- Posters are cached per load to avoid refetching on re-open
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Diffstat (limited to 'services/tmdb.py')
| -rw-r--r-- | services/tmdb.py | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/services/tmdb.py b/services/tmdb.py index 3618168..3574f57 100644 --- a/services/tmdb.py +++ b/services/tmdb.py @@ -84,6 +84,26 @@ async def movie_detail(client: httpx.AsyncClient, movie_id: int, key: str | None return response.json() +async def movie_images(client: httpx.AsyncClient, movie_id: int) -> list[str]: + """Return list of poster URLs for a TMDB movie ID.""" + try: + url = f"https://api.themoviedb.org/3/movie/{movie_id}/images" + response = await client.get( + url, + params={"api_key": api_key(), "include_image_language": "en,null"}, + ) + response.raise_for_status() + data = response.json() + except httpx.HTTPError: + return [] + + return [ + poster_url(p["file_path"]) + for p in data.get("posters", []) + if p.get("file_path") + ] + + def movie_payload(movie: dict, fallback: dict | None = None) -> dict: fallback = fallback or {} release_date = movie.get("release_date") or fallback.get("release_date") |
