You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
recyclarr/src/app/api/radarr.py

73 lines
3.0 KiB

import requests
import json
from copy import deepcopy
from app.api.server import Server, TrashHttpError
from app.trash_error import TrashError
class RadarrHttpError(TrashHttpError):
@staticmethod
def get_error_message(response: requests.Response):
content = json.loads(response.content)
if len(content) > 0:
if type(content) is list:
return content[0]['errorMessage']
elif type(content) is dict and 'message' in content:
return content['message']
return None
def __str__(self):
msg = f'HTTP Response Error [Status Code {self.response.status_code}] [URI: {self.response.url}]'
if error_msg := RadarrHttpError.get_error_message(self.response):
msg += f'\n Response Message: {error_msg}'
return msg
class Radarr(Server):
# --------------------------------------------------------------------------------------------------
def __init__(self, args, logger):
if not args.base_uri or not args.api_key:
raise TrashError('--base-uri and --api-key are required arguments when not using --preview')
self.logger = logger
base_uri = f'{args.base_uri}/api/v3'
key = f'?apikey={args.api_key}'
super().__init__(base_uri, key, RadarrHttpError)
# --------------------------------------------------------------------------------------------------
# GET /qualitydefinition
def get_quality_definition(self):
return self.request('get', '/qualitydefinition')
# --------------------------------------------------------------------------------------------------
# PUT /qualityDefinition/update
def update_quality_definition(self, server_definition, guide_definition):
new_definition = []
for quality, min_value, max_value, preferred in guide_definition:
entry = self.find_quality_definition_entry(server_definition, quality)
if not entry:
print(f'WARN: Quality definition lacks entry for {quality}; it will be skipped.')
continue
entry = deepcopy(entry)
entry['minSize'] = min_value
entry['maxSize'] = max_value
entry['preferredSize'] = preferred
new_definition.append(entry)
self.logger.debug('Setting Quality '
f'[Name: {entry["quality"]["name"]}] '
f'[Source: {entry["quality"]["source"]}] '
f'[Min: {entry["minSize"]}] '
f'[Max: {entry["maxSize"]}] '
f'[Preferred: {entry["preferredSize"]}] '
)
self.request('put', '/qualityDefinition/update', new_definition)
# --------------------------------------------------------------------------------------------------
def find_quality_definition_entry(self, definition, quality):
for entry in definition:
if entry.get('quality').get('name') == quality:
return entry
return None