|
|
|
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
|