43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
"""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)
|