summaryrefslogtreecommitdiff
path: root/services/tmdb.py
diff options
context:
space:
mode:
authorTyler Hoang <tyler@tylerhoang.xyz>2026-05-06 17:20:35 -0700
committerTyler Hoang <tyler@tylerhoang.xyz>2026-05-06 17:20:35 -0700
commit2d298f982408f222ad344b2aa9c18bbe7dc70f12 (patch)
tree7347dff5f45789189032bee2821c3cd314b69625 /services/tmdb.py
parent4bbafdd460945eb506ddb07b9068731245708812 (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.py20
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")