#!/usr/bin/env python3 from __future__ import annotations import json import urllib.parse import urllib.request from datetime import date TMDB_API_BASE = "https://api.themoviedb.org/3" def parse_release_date(value: str) -> date | None: text = (value or "").strip() if not text: return None try: return date.fromisoformat(text[:10]) except ValueError: return None def tmdb_get_json(path: str, params: dict, token: str) -> dict: url = TMDB_API_BASE + path if params: url += "?" + urllib.parse.urlencode(params) req = urllib.request.Request( url, headers={ "Accept": "application/json", "Authorization": f"Bearer {token}", "User-Agent": "anime-movies-script/1.0", }, ) with urllib.request.urlopen(req, timeout=20) as resp: return json.loads(resp.read().decode("utf-8")) def search_tmdb_movies(title: str, token: str, language: str = "en-US") -> list[dict]: query = (title or "").strip() if not query: return [] payload = tmdb_get_json( "/search/movie", { "query": query, "include_adult": "false", "language": language, "page": "1", }, token, ) results = [] for item in payload.get("results", []): movie_id = item.get("id") if not movie_id: continue results.append( { "tmdb_id": int(movie_id), "title": (item.get("title") or "").strip(), "original_title": (item.get("original_title") or "").strip(), "release_date": parse_release_date(str(item.get("release_date") or "")), } ) return results def fetch_tmdb_release_dates(movie_id: int, token: str) -> dict: return tmdb_get_json(f"/movie/{movie_id}/release_dates", {}, token) def extract_de_theatrical_dates(release_payload: dict) -> list[date]: german_block = None for result in release_payload.get("results", []): if str(result.get("iso_3166_1") or "").upper() == "DE": german_block = result break if not german_block: return [] dates = [] for entry in german_block.get("release_dates", []): release_type = int(entry.get("type") or 0) if release_type not in {2, 3}: continue release_date = parse_release_date(str(entry.get("release_date") or "")) if release_date: dates.append(release_date) return sorted(dates) def select_release_in_range(release_dates: list[date], start_date: date, end_date: date) -> date | None: for release_date in sorted(release_dates): if start_date <= release_date <= end_date: return release_date return None