"""Sonarr API client.""" import os import requests SONARR_HOST = os.environ["SONARR_HOST"].rstrip("/") SONARR_API_KEY = os.environ["SONARR_API_KEY"] SONARR_SERIES_ID = os.environ["SONARR_SERIES_ID"] HEADERS = {"X-Api-Key": SONARR_API_KEY} def _get_episodes(): """Fetch all episodes for the configured One Piece series.""" url = f"{SONARR_HOST}/api/v3/episode" params = {"seriesId": SONARR_SERIES_ID} resp = requests.get(url, headers=HEADERS, params=params, timeout=30) resp.raise_for_status() return resp.json() def get_absolute_episode(season: int, episode: int) -> int: """Return the absolute (series-wide) episode number for the given season/episode.""" episodes = _get_episodes() for ep in episodes: if ep.get("seasonNumber") == season and ep.get("episodeNumber") == episode: abs_num = ep.get("absoluteEpisodeNumber") if abs_num is None: raise RuntimeError( f"Sonarr has no absolute episode number for S{season:02d}E{episode:02d}" ) return abs_num raise RuntimeError(f"Episode S{season:02d}E{episode:02d} not found in Sonarr") def get_total_episodes() -> int: """Return total number of episodes in the series according to Sonarr.""" episodes = _get_episodes() # Exclude specials (season 0) regular = [ep for ep in episodes if ep.get("seasonNumber", 0) != 0 and ep.get("hasFile")] if not regular: regular = [ep for ep in episodes if ep.get("seasonNumber", 0) != 0] return len(regular)