from typing import Any, Dict, Optional from .base import ApiClient class SonarrClient(ApiClient): async def get_system_status(self) -> Optional[Dict[str, Any]]: return await self.get("/api/v3/system/status") async def get_series_by_tvdb_id(self, tvdb_id: int) -> Optional[Dict[str, Any]]: return await self.get("/api/v3/series", params={"tvdbId": tvdb_id}) async def get_root_folders(self) -> Optional[Dict[str, Any]]: return await self.get("/api/v3/rootfolder") async def get_quality_profiles(self) -> Optional[Dict[str, Any]]: return await self.get("/api/v3/qualityprofile") async def get_queue(self, series_id: int) -> Optional[Dict[str, Any]]: return await self.get("/api/v3/queue", params={"seriesId": series_id}) async def get_episodes(self, series_id: int) -> Optional[Dict[str, Any]]: return await self.get("/api/v3/episode", params={"seriesId": series_id}) async def search(self, series_id: int) -> Optional[Dict[str, Any]]: return await self.post("/api/v3/command", payload={"name": "SeriesSearch", "seriesId": series_id}) async def search_episodes(self, episode_ids: list[int]) -> Optional[Dict[str, Any]]: return await self.post("/api/v3/command", payload={"name": "EpisodeSearch", "episodeIds": episode_ids}) async def add_series( self, tvdb_id: int, quality_profile_id: int, root_folder: str, monitored: bool = True, title: Optional[str] = None, search_missing: bool = True, ) -> Optional[Dict[str, Any]]: payload = { "tvdbId": tvdb_id, "qualityProfileId": quality_profile_id, "rootFolderPath": root_folder, "monitored": monitored, "seasonFolder": True, "addOptions": {"searchForMissingEpisodes": search_missing}, } if title: payload["title"] = title return await self.post("/api/v3/series", payload=payload) async def grab_release(self, guid: str, indexer_id: int) -> Optional[Dict[str, Any]]: return await self.post("/api/v3/release", payload={"guid": guid, "indexerId": indexer_id})