summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
Diffstat (limited to 'services')
-rw-r--r--services/omdb.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/services/omdb.py b/services/omdb.py
new file mode 100644
index 0000000..8e574a1
--- /dev/null
+++ b/services/omdb.py
@@ -0,0 +1,51 @@
+import os
+
+import httpx
+
+OMDB_URL = "http://www.omdbapi.com/"
+
+
+def _api_key() -> str | None:
+ return os.getenv("OMDB_API_KEY", "").strip() or None
+
+
+async def fetch_ratings(
+ *,
+ title: str | None = None,
+ year: int | None = None,
+) -> dict | None:
+ key = _api_key()
+ if not key or not title:
+ return None
+
+ params: dict = {"apikey": key, "t": title}
+ if year:
+ params["y"] = str(year)
+
+ try:
+ async with httpx.AsyncClient(timeout=5.0) as client:
+ response = await client.get(OMDB_URL, params=params)
+ data = response.json()
+ except Exception:
+ return None
+
+ if data.get("Response") == "False":
+ return None
+
+ result: dict = {}
+ for rating in data.get("Ratings", []):
+ source = rating.get("Source", "")
+ value = rating.get("Value", "")
+ if source == "Internet Movie Database":
+ result["imdb"] = value
+ elif source == "Rotten Tomatoes":
+ result["rt"] = value
+ elif source == "Metacritic":
+ result["metacritic"] = value
+
+ if not result.get("imdb"):
+ raw = data.get("imdbRating", "")
+ if raw and raw != "N/A":
+ result["imdb"] = f"{raw}/10"
+
+ return result or None