From 2d298f982408f222ad344b2aa9c18bbe7dc70f12 Mon Sep 17 00:00:00 2001 From: Tyler Hoang Date: Wed, 6 May 2026 17:20:35 -0700 Subject: 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 --- routers/films.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'routers/films.py') diff --git a/routers/films.py b/routers/films.py index ec56c0a..4ac023c 100644 --- a/routers/films.py +++ b/routers/films.py @@ -467,6 +467,23 @@ async def update_film_stars(film_id: int, request: Request, db: Session = Depend return {"film_id": film.id, "stars": film.stars} +@router.post("/films/{film_id}/poster") +async def update_film_poster(film_id: int, request: Request, db: Session = Depends(get_db)): + film = _get_film_or_404(db, film_id) + try: + payload = await request.json() + except Exception as exc: # noqa: BLE001 + raise HTTPException(status_code=400, detail="Request body must be JSON.") from exc + + poster_url = payload.get("poster_url", "").strip() + if not poster_url: + raise HTTPException(status_code=400, detail="poster_url is required.") + + film.poster_url = poster_url + db.commit() + return {"film_id": film.id, "poster_url": film.poster_url} + + @router.get("/director/{director_name}") async def director_detail(director_name: str, request: Request, db: Session = Depends(get_db)): films = _director_films(db, director_name) -- cgit v1.3-2-g0d8e