From 2f3a891d0944a3b200d3dda949475bf9e1742f56 Mon Sep 17 00:00:00 2001 From: Tyler Hoang Date: Sat, 9 May 2026 01:41:48 -0700 Subject: Add IMDb, Rotten Tomatoes, and Metacritic ratings to film detail Fetches ratings from OMDB API in parallel with TMDB context. Displays three side-by-side chips between the subtitle and watch log panels. Requires OMDB_API_KEY in .env; degrades silently if missing or no match. Co-Authored-By: Claude Sonnet 4.6 --- routers/films.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'routers') diff --git a/routers/films.py b/routers/films.py index 333eaef..449fd44 100644 --- a/routers/films.py +++ b/routers/films.py @@ -1,3 +1,4 @@ +import asyncio from collections import Counter from datetime import date, datetime from itertools import groupby @@ -12,6 +13,7 @@ from sqlalchemy.orm import Session from database import get_db from models import Film +from services import omdb from services.film_people import director_href, normalize_name, split_credit_names from services.tmdb import TMDBNotConfiguredError, detail_context as tmdb_detail_context, movie_detail @@ -442,7 +444,6 @@ def get_films_partial( @router.get("/films/{film_id}") async def film_detail(film_id: int, request: Request, db: Session = Depends(get_db)): film = _get_film_or_404(db, film_id) - tmdb_context = await _film_tmdb_context(film) rewatch_filter = ( Film.tmdb_id == film.tmdb_id if film.tmdb_id is not None else Film.title == film.title @@ -454,6 +455,11 @@ async def film_detail(film_id: int, request: Request, db: Session = Depends(get_ .all() ) + tmdb_context, ratings = await asyncio.gather( + _film_tmdb_context(film), + omdb.fetch_ratings(title=film.title, year=film.year), + ) + return templates.TemplateResponse( request=request, name="detail.html", @@ -463,6 +469,7 @@ async def film_detail(film_id: int, request: Request, db: Session = Depends(get_ "active_shelf": film.shelf, "tmdb_context": tmdb_context, "rewatch_history": rewatch_history, + "ratings": ratings, }, ) -- cgit v1.3-2-g0d8e