Plex-Meta-Manager/modules/radarr.py

116 lines
4.7 KiB
Python
Raw Normal View History

2021-01-20 21:37:59 +00:00
import logging, re, requests
from modules import util
from modules.util import Failed
from retrying import retry
logger = logging.getLogger("Plex Meta Manager")
class RadarrAPI:
def __init__(self, tmdb, params):
2021-02-24 06:44:06 +00:00
self.url_params = {"apikey": f"{params['token']}"}
self.base_url = f"{params['url']}/api{'/v3' if params['version'] == 'v3' else ''}/"
2021-01-20 21:37:59 +00:00
try:
2021-02-24 06:44:06 +00:00
result = requests.get(f"{self.base_url}system/status", params=self.url_params).json()
2021-02-24 06:42:58 +00:00
except Exception:
2021-01-20 21:37:59 +00:00
util.print_stacktrace()
2021-02-24 06:44:06 +00:00
raise Failed(f"Radarr Error: Could not connect to Radarr at {params['url']}")
2021-01-20 21:37:59 +00:00
if "error" in result and result["error"] == "Unauthorized":
raise Failed("Radarr Error: Invalid API Key")
if "version" not in result:
raise Failed("Radarr Error: Unexpected Response Check URL")
self.quality_profile_id = None
profiles = ""
2021-04-02 15:45:29 +00:00
for profile in self.send_get("qualityProfile" if params["version"] == "v3" else "profile"):
2021-01-20 21:37:59 +00:00
if len(profiles) > 0:
profiles += ", "
profiles += profile["name"]
if profile["name"] == params["quality_profile"]:
self.quality_profile_id = profile["id"]
if not self.quality_profile_id:
2021-02-24 06:44:06 +00:00
raise Failed(f"Radarr Error: quality_profile: {params['quality_profile']} does not exist in radarr. Profiles available: {profiles}")
2021-04-02 18:15:43 +00:00
self.tags = self.get_tags()
2021-01-20 21:37:59 +00:00
self.tmdb = tmdb
self.url = params["url"]
self.version = params["version"]
self.token = params["token"]
self.root_folder_path = params["root_folder_path"]
self.add = params["add"]
self.search = params["search"]
2021-02-16 14:31:15 +00:00
self.tag = params["tag"]
2021-01-20 21:37:59 +00:00
2021-04-02 18:15:43 +00:00
def get_tags(self):
return {tag["label"]: tag["id"] for tag in self.send_get("tag")}
def add_tags(self, tags):
added = False
for label in tags:
if label not in self.tags:
added = True
self.send_post("tag", {"label": str(label)})
if added:
self.tags = self.get_tags()
def add_tmdb(self, tmdb_ids, tags=None, folder=None):
2021-01-20 21:37:59 +00:00
logger.info("")
2021-02-24 06:44:06 +00:00
logger.debug(f"TMDb IDs: {tmdb_ids}")
2021-02-16 14:31:15 +00:00
tag_nums = []
2021-01-20 21:37:59 +00:00
add_count = 0
2021-04-02 18:15:43 +00:00
if tags is None:
tags = self.tag
if tags:
self.add_tags(tags)
tag_nums = [self.tags[label] for label in tags if label in self.tags]
2021-01-20 21:37:59 +00:00
for tmdb_id in tmdb_ids:
try:
movie = self.tmdb.get_movie(tmdb_id)
except Failed as e:
logger.error(e)
continue
try:
year = movie.release_date.split("-")[0]
except AttributeError:
2021-02-24 06:44:06 +00:00
logger.error(f"TMDb Error: No year for ({tmdb_id}) {movie.title}")
2021-01-20 21:37:59 +00:00
continue
if year.isdigit() is False:
2021-02-24 06:44:06 +00:00
logger.error(f"TMDb Error: No release date yet for ({tmdb_id}) {movie.title}")
2021-01-20 21:37:59 +00:00
continue
2021-02-24 06:44:06 +00:00
poster = f"https://image.tmdb.org/t/p/original{movie.poster_path}"
2021-01-20 21:37:59 +00:00
2021-02-24 06:44:06 +00:00
titleslug = re.sub(r"([^\s\w]|_)+", "", f"{movie.title} {year}").replace(" ", "-").lower()
2021-01-20 21:37:59 +00:00
url_json = {
"title": movie.title,
2021-02-24 06:44:06 +00:00
f"{'qualityProfileId' if self.version == 'v3' else 'profileId'}": self.quality_profile_id,
2021-01-20 21:37:59 +00:00
"year": int(year),
2021-02-11 03:50:01 +00:00
"tmdbid": int(tmdb_id),
2021-01-20 21:37:59 +00:00
"titleslug": titleslug,
"monitored": True,
"rootFolderPath": self.root_folder_path if folder is None else folder,
2021-01-20 21:37:59 +00:00
"images": [{"covertype": "poster", "url": poster}],
"addOptions": {"searchForMovie": self.search}
}
2021-02-16 14:31:15 +00:00
if tag_nums:
url_json["tags"] = tag_nums
2021-04-02 15:45:29 +00:00
response = self.send_post("movie", url_json)
2021-01-20 21:37:59 +00:00
if response.status_code < 400:
2021-02-24 06:44:06 +00:00
logger.info(f"Added to Radarr | {tmdb_id:<6} | {movie.title}")
2021-01-20 21:37:59 +00:00
add_count += 1
else:
2021-02-10 19:10:53 +00:00
try:
2021-02-24 06:44:06 +00:00
logger.error(f"Radarr Error: ({tmdb_id}) {movie.title}: ({response.status_code}) {response.json()[0]['errorMessage']}")
2021-02-24 06:42:58 +00:00
except KeyError:
2021-02-10 19:10:53 +00:00
logger.debug(url_json)
2021-02-24 06:44:06 +00:00
logger.error(f"Radarr Error: {response.json()}")
logger.info(f"{add_count} Movie{'s' if add_count > 1 else ''} added to Radarr")
2021-01-20 21:37:59 +00:00
2021-02-16 14:31:15 +00:00
@retry(stop_max_attempt_number=6, wait_fixed=10000)
2021-02-16 21:50:03 +00:00
def send_get(self, url):
2021-04-02 15:45:29 +00:00
return requests.get(f"{self.base_url}{url}", params=self.url_params).json()
2021-02-16 14:31:15 +00:00
2021-01-20 21:37:59 +00:00
@retry(stop_max_attempt_number=6, wait_fixed=10000)
def send_post(self, url, url_json):
2021-04-02 15:45:29 +00:00
return requests.post(f"{self.base_url}{url}", json=url_json, params=self.url_params)