79 lines
3.3 KiB
Python
79 lines
3.3 KiB
Python
from typing import Any, Dict, Optional
|
|
from .base import ApiClient
|
|
|
|
|
|
class RadarrClient(ApiClient):
|
|
async def get_system_status(self) -> Optional[Dict[str, Any]]:
|
|
return await self.get("/api/v3/system/status")
|
|
|
|
async def get_movie_by_tmdb_id(self, tmdb_id: int) -> Optional[Dict[str, Any]]:
|
|
return await self.get("/api/v3/movie", params={"tmdbId": tmdb_id})
|
|
|
|
async def lookup_movie_by_tmdb_id(self, tmdb_id: int) -> Optional[Dict[str, Any]]:
|
|
result = await self.get("/api/v3/movie/lookup/tmdb", params={"tmdbId": tmdb_id})
|
|
return result if isinstance(result, dict) else None
|
|
|
|
async def get_movie(self, movie_id: int) -> Optional[Dict[str, Any]]:
|
|
return await self.get(f"/api/v3/movie/{movie_id}")
|
|
|
|
async def get_movies(self) -> Optional[Dict[str, Any]]:
|
|
return await self.get("/api/v3/movie")
|
|
|
|
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, movie_id: int) -> Optional[Dict[str, Any]]:
|
|
return await self.get("/api/v3/queue", params={"movieId": movie_id})
|
|
|
|
async def search_releases(self, movie_id: int) -> Optional[Any]:
|
|
return await self.get(
|
|
"/api/v3/release", params={"movieId": movie_id}, timeout_seconds=90.0
|
|
)
|
|
|
|
async def get_indexers(self) -> Optional[Dict[str, Any]]:
|
|
return await self.get("/api/v3/indexer")
|
|
|
|
async def search(self, movie_id: int) -> Optional[Dict[str, Any]]:
|
|
return await self.post("/api/v3/command", payload={"name": "MoviesSearch", "movieIds": [movie_id]})
|
|
|
|
async def add_movie(
|
|
self,
|
|
tmdb_id: int,
|
|
quality_profile_id: int,
|
|
root_folder: str,
|
|
monitored: bool = True,
|
|
search_for_movie: bool = True,
|
|
title: Optional[str] = None,
|
|
) -> Optional[Dict[str, Any]]:
|
|
lookup = await self.lookup_movie_by_tmdb_id(tmdb_id)
|
|
resolved_title = str((lookup or {}).get("title") or "").strip() or (title or "").strip()
|
|
if not resolved_title:
|
|
raise ValueError("Radarr could not resolve a title for this TMDB ID")
|
|
payload = {
|
|
"tmdbId": tmdb_id,
|
|
"title": resolved_title,
|
|
"qualityProfileId": quality_profile_id,
|
|
"rootFolderPath": root_folder,
|
|
"monitored": monitored,
|
|
"addOptions": {"searchForMovie": search_for_movie},
|
|
}
|
|
return await self.post("/api/v3/movie", payload=payload)
|
|
|
|
async def update_movie(self, payload: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
|
return await self.put("/api/v3/movie", 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})
|
|
|
|
async def push_release(self, payload: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
|
return await self.post("/api/v3/release/push", payload=payload)
|
|
|
|
async def download_release(self, guid: str, indexer_id: int) -> Optional[Dict[str, Any]]:
|
|
return await self.post(
|
|
"/api/v3/command",
|
|
payload={"name": "DownloadRelease", "guid": guid, "indexerId": indexer_id},
|
|
)
|