no log: centralized Sonarr/Radarr API url definition and improved usage

This commit is contained in:
morpheus65535 2023-10-25 23:04:03 -04:00
parent 54f9570a22
commit 0d882b3d6e
13 changed files with 50 additions and 91 deletions

View File

@ -9,8 +9,8 @@ from functools import wraps
from urllib.parse import unquote
from constants import headers
from sonarr.info import get_sonarr_info, url_sonarr
from radarr.info import get_radarr_info, url_radarr
from sonarr.info import url_api_sonarr
from radarr.info import url_api_radarr
from utilities.helper import check_credentials
from .config import settings, base_url
@ -109,10 +109,7 @@ def series_images(url):
url = url.strip("/")
apikey = settings.sonarr.apikey
baseUrl = settings.sonarr.base_url
if get_sonarr_info.is_legacy():
url_image = f'{url_sonarr()}/api/{url.lstrip(baseUrl)}?apikey={apikey}'.replace('poster-250', 'poster-500')
else:
url_image = f'{url_sonarr()}/api/v3/{url.lstrip(baseUrl)}?apikey={apikey}'.replace('poster-250', 'poster-500')
url_image = f'{url_api_sonarr()}{url.lstrip(baseUrl)}?apikey={apikey}'.replace('poster-250', 'poster-500')
try:
req = requests.get(url_image, stream=True, timeout=15, verify=False, headers=headers)
except Exception:
@ -126,10 +123,7 @@ def series_images(url):
def movies_images(url):
apikey = settings.radarr.apikey
baseUrl = settings.radarr.base_url
if get_radarr_info.is_legacy():
url_image = f'{url_radarr()}/api/{url.lstrip(baseUrl)}?apikey={apikey}'
else:
url_image = f'{url_radarr()}/api/v3/{url.lstrip(baseUrl)}?apikey={apikey}'
url_image = f'{url_api_radarr()}{url.lstrip(baseUrl)}?apikey={apikey}'
try:
req = requests.get(url_image, stream=True, timeout=15, verify=False, headers=headers)
except Exception:

View File

@ -4,7 +4,7 @@ import requests
import logging
from app.config import settings
from radarr.info import get_radarr_info, url_radarr
from radarr.info import url_api_radarr
from constants import headers
@ -12,14 +12,8 @@ def browse_radarr_filesystem(path='#'):
if path == '#':
path = ''
if get_radarr_info.is_legacy():
url_radarr_api_filesystem = (f"{url_radarr()}/api/filesystem?path={path}&"
f"allowFoldersWithoutTrailingSlashes=true&includeFiles=false&"
f"apikey={settings.radarr.apikey}")
else:
url_radarr_api_filesystem = (f"{url_radarr()}/api/v3/filesystem?path={path}&"
f"allowFoldersWithoutTrailingSlashes=true&includeFiles=false&"
f"apikey={settings.radarr.apikey}")
url_radarr_api_filesystem = (f"{url_api_radarr()}filesystem?path={path}&allowFoldersWithoutTrailingSlashes=true&"
f"includeFiles=false&apikey={settings.radarr.apikey}")
try:
r = requests.get(url_radarr_api_filesystem, timeout=int(settings.radarr.http_timeout), verify=False,
headers=headers)

View File

@ -95,3 +95,7 @@ def url_radarr():
port = f":{settings.radarr.port}"
return f"{protocol_radarr}://{settings.radarr.ip}{port}{settings.radarr.base_url}"
def url_api_radarr():
return url_radarr() + f'/api{"/v3" if not get_radarr_info.is_legacy() else ""}/'

View File

@ -4,16 +4,13 @@ import logging
import requests
from app.config import settings
from radarr.info import get_radarr_info, url_radarr
from radarr.info import url_api_radarr
from constants import headers
def notify_radarr(radarr_id):
try:
if get_radarr_info.is_legacy():
url = f"{url_radarr()}/api/command?apikey={settings.radarr.apikey}"
else:
url = f"{url_radarr()}/api/v3/command?apikey={settings.radarr.apikey}"
url = f"{url_api_radarr()}command?apikey={settings.radarr.apikey}"
data = {
'name': 'RescanMovie',
'movieId': int(radarr_id)

View File

@ -7,7 +7,7 @@ import logging
from app.config import settings
from utilities.path_mappings import path_mappings
from app.database import TableMoviesRootfolder, TableMovies, database, delete, update, insert, select
from radarr.info import get_radarr_info, url_radarr
from radarr.info import url_api_radarr
from constants import headers
@ -16,10 +16,7 @@ def get_radarr_rootfolder():
radarr_rootfolder = []
# Get root folder data from Radarr
if get_radarr_info.is_legacy():
url_radarr_api_rootfolder = f"{url_radarr()}/api/rootfolder?apikey={apikey_radarr}"
else:
url_radarr_api_rootfolder = f"{url_radarr()}/api/v3/rootfolder?apikey={apikey_radarr}"
url_radarr_api_rootfolder = f"{url_api_radarr()}rootfolder?apikey={apikey_radarr}"
try:
rootfolder = requests.get(url_radarr_api_rootfolder, timeout=int(settings.radarr.http_timeout), verify=False, headers=headers)

View File

@ -6,7 +6,6 @@ import logging
from sqlalchemy.exc import IntegrityError
from app.config import settings
from radarr.info import url_radarr
from utilities.path_mappings import path_mappings
from subtitles.indexer.movies import store_subtitles_movie, movies_full_scan_subtitles
from radarr.rootfolder import check_radarr_rootfolder
@ -82,7 +81,7 @@ def update_movies(send_event=True):
tagsDict = get_tags()
# Get movies data from radarr
movies = get_movies_from_radarr_api(url=url_radarr(), apikey_radarr=apikey_radarr)
movies = get_movies_from_radarr_api(apikey_radarr=apikey_radarr)
if not isinstance(movies, list):
return
else:
@ -100,7 +99,6 @@ def update_movies(send_event=True):
'movieFile' in movie and
(movie['movieFile']['size'] > 20480 or
get_movie_file_size_from_db(movie['movieFile']['path']) > 20480)]
movies_to_add = []
# Remove old movies from DB
movies_to_delete = list(set(current_movies_id_db) - set(current_movies_radarr))
@ -191,8 +189,7 @@ def update_one_movie(movie_id, action, defer_search=False):
try:
# Get movie data from radarr api
movie = None
movie_data = get_movies_from_radarr_api(url=url_radarr(), apikey_radarr=settings.radarr.apikey,
radarr_id=movie_id)
movie_data = get_movies_from_radarr_api(apikey_radarr=settings.radarr.apikey, radarr_id=movie_id)
if not movie_data:
return
else:

View File

@ -4,7 +4,7 @@ import requests
import logging
from app.config import settings
from radarr.info import get_radarr_info, url_radarr
from radarr.info import get_radarr_info, url_api_radarr
from constants import headers
@ -12,10 +12,8 @@ def get_profile_list():
apikey_radarr = settings.radarr.apikey
profiles_list = []
# Get profiles data from radarr
if get_radarr_info.is_legacy():
url_radarr_api_movies = f"{url_radarr()}/api/profile?apikey={apikey_radarr}"
else:
url_radarr_api_movies = f"{url_radarr()}/api/v3/qualityprofile?apikey={apikey_radarr}"
url_radarr_api_movies = (f"{url_api_radarr()}{'quality' if url_api_radarr().endswith('v3/') else ''}profile?"
f"apikey={apikey_radarr}")
try:
profiles_json = requests.get(url_radarr_api_movies, timeout=int(settings.radarr.http_timeout), verify=False, headers=headers)
@ -44,10 +42,7 @@ def get_tags():
tagsDict = []
# Get tags data from Radarr
if get_radarr_info.is_legacy():
url_radarr_api_series = f"{url_radarr()}/api/tag?apikey={apikey_radarr}"
else:
url_radarr_api_series = f"{url_radarr()}/api/v3/tag?apikey={apikey_radarr}"
url_radarr_api_series = f"{url_api_radarr()}tag?apikey={apikey_radarr}"
try:
tagsDict = requests.get(url_radarr_api_series, timeout=int(settings.radarr.http_timeout), verify=False, headers=headers)
@ -70,11 +65,8 @@ def get_tags():
return []
def get_movies_from_radarr_api(url, apikey_radarr, radarr_id=None):
if get_radarr_info.is_legacy():
url_radarr_api_movies = f'{url}/api/movie{f"/{radarr_id}" if radarr_id else ""}?apikey={apikey_radarr}'
else:
url_radarr_api_movies = f'{url}/api/v3/movie{f"/{radarr_id}" if radarr_id else ""}?apikey={apikey_radarr}'
def get_movies_from_radarr_api(apikey_radarr, radarr_id=None):
url_radarr_api_movies = f'{url_api_radarr()}movie{f"/{radarr_id}" if radarr_id else ""}?apikey={apikey_radarr}'
try:
r = requests.get(url_radarr_api_movies, timeout=int(settings.radarr.http_timeout), verify=False, headers=headers)

View File

@ -4,21 +4,15 @@ import requests
import logging
from app.config import settings
from sonarr.info import get_sonarr_info, url_sonarr
from sonarr.info import url_api_sonarr
from constants import headers
def browse_sonarr_filesystem(path='#'):
if path == '#':
path = ''
if get_sonarr_info.is_legacy():
url_sonarr_api_filesystem = (f"{url_sonarr()}/api/filesystem?path={path}&"
f"allowFoldersWithoutTrailingSlashes=true&includeFiles=false&"
f"apikey={settings.sonarr.apikey}")
else:
url_sonarr_api_filesystem = (f"{url_sonarr()}/api/v3/filesystem?path={path}&"
f"allowFoldersWithoutTrailingSlashes=true&includeFiles=false&"
f"apikey={settings.sonarr.apikey}")
url_sonarr_api_filesystem = (f"{url_api_sonarr()}filesystem?path={path}&allowFoldersWithoutTrailingSlashes=true&"
f"includeFiles=false&apikey={settings.sonarr.apikey}")
try:
r = requests.get(url_sonarr_api_filesystem, timeout=int(settings.sonarr.http_timeout), verify=False,
headers=headers)

View File

@ -95,3 +95,7 @@ def url_sonarr():
port = f":{settings.sonarr.port}"
return f"{protocol_sonarr}://{settings.sonarr.ip}{port}{settings.sonarr.base_url}"
def url_api_sonarr():
return url_sonarr() + f'/api{"/v3" if not get_sonarr_info.is_legacy() else ""}/'

View File

@ -4,16 +4,13 @@ import logging
import requests
from app.config import settings
from sonarr.info import get_sonarr_info, url_sonarr
from sonarr.info import url_api_sonarr
from constants import headers
def notify_sonarr(sonarr_series_id):
try:
if get_sonarr_info.is_legacy():
url = f"{url_sonarr()}/api/command?apikey={settings.sonarr.apikey}"
else:
url = f"{url_sonarr()}/api/v3/command?apikey={settings.sonarr.apikey}"
url = f"{url_api_sonarr()}command?apikey={settings.sonarr.apikey}"
data = {
'name': 'RescanSeries',
'seriesId': int(sonarr_series_id)

View File

@ -7,7 +7,7 @@ import logging
from app.config import settings
from app.database import TableShowsRootfolder, TableShows, database, insert, update, delete, select
from utilities.path_mappings import path_mappings
from sonarr.info import get_sonarr_info, url_sonarr
from sonarr.info import url_api_sonarr
from constants import headers
@ -16,10 +16,7 @@ def get_sonarr_rootfolder():
sonarr_rootfolder = []
# Get root folder data from Sonarr
if get_sonarr_info.is_legacy():
url_sonarr_api_rootfolder = f"{url_sonarr()}/api/rootfolder?apikey={apikey_sonarr}"
else:
url_sonarr_api_rootfolder = f"{url_sonarr()}/api/v3/rootfolder?apikey={apikey_sonarr}"
url_sonarr_api_rootfolder = f"{url_api_sonarr()}rootfolder?apikey={apikey_sonarr}"
try:
rootfolder = requests.get(url_sonarr_api_rootfolder, timeout=int(settings.sonarr.http_timeout), verify=False, headers=headers)

View File

@ -47,13 +47,11 @@ def sync_episodes(series_id, send_event=True):
episodes_to_add = []
# Get episodes data for a series from Sonarr
episodes = get_episodes_from_sonarr_api(url=url_sonarr(), apikey_sonarr=apikey_sonarr,
series_id=series_id)
episodes = get_episodes_from_sonarr_api(apikey_sonarr=apikey_sonarr, series_id=series_id)
if episodes:
# For Sonarr v3, we need to update episodes to integrate the episodeFile API endpoint results
if not get_sonarr_info.is_legacy():
episodeFiles = get_episodesFiles_from_sonarr_api(url=url_sonarr(), apikey_sonarr=apikey_sonarr,
series_id=series_id)
episodeFiles = get_episodesFiles_from_sonarr_api(apikey_sonarr=apikey_sonarr, series_id=series_id)
for episode in episodes:
if episodeFiles and episode['hasFile']:
item = [x for x in episodeFiles if x['id'] == episode['episodeFileId']]
@ -137,8 +135,7 @@ def sync_one_episode(episode_id, defer_search=False):
try:
# Get episode data from sonarr api
episode = None
episode_data = get_episodes_from_sonarr_api(url=url, apikey_sonarr=apikey_sonarr,
episode_id=episode_id)
episode_data = get_episodes_from_sonarr_api(apikey_sonarr=apikey_sonarr, episode_id=episode_id)
if not episode_data:
return
@ -146,7 +143,7 @@ def sync_one_episode(episode_id, defer_search=False):
# For Sonarr v3, we need to update episodes to integrate the episodeFile API endpoint results
if not get_sonarr_info.is_legacy() and existing_episode and episode_data['hasFile']:
episode_data['episodeFile'] = \
get_episodesFiles_from_sonarr_api(url=url, apikey_sonarr=apikey_sonarr,
get_episodesFiles_from_sonarr_api(apikey_sonarr=apikey_sonarr,
episode_file_id=episode_data['episodeFileId'])
episode = episodeParser(episode_data)
except Exception:

View File

@ -4,7 +4,7 @@ import requests
import logging
from app.config import settings
from sonarr.info import get_sonarr_info, url_sonarr
from sonarr.info import get_sonarr_info, url_api_sonarr
from constants import headers
@ -14,12 +14,12 @@ def get_profile_list():
# Get profiles data from Sonarr
if get_sonarr_info.is_legacy():
url_sonarr_api_series = f"{url_sonarr()}/api/profile?apikey={apikey_sonarr}"
url_sonarr_api_series = f"{url_api_sonarr()}profile?apikey={apikey_sonarr}"
else:
if not get_sonarr_info.version().startswith('3.'):
# return an empty list when using Sonarr >= v4 that does not support series languages profiles anymore
return profiles_list
url_sonarr_api_series = f"{url_sonarr()}/api/v3/languageprofile?apikey={apikey_sonarr}"
url_sonarr_api_series = f"{url_api_sonarr()}languageprofile?apikey={apikey_sonarr}"
try:
profiles_json = requests.get(url_sonarr_api_series, timeout=int(settings.sonarr.http_timeout), verify=False,
@ -50,10 +50,7 @@ def get_tags():
tagsDict = []
# Get tags data from Sonarr
if get_sonarr_info.is_legacy():
url_sonarr_api_series = f"{url_sonarr()}/api/tag?apikey={apikey_sonarr}"
else:
url_sonarr_api_series = f"{url_sonarr()}/api/v3/tag?apikey={apikey_sonarr}"
url_sonarr_api_series = f"{url_api_sonarr()}tag?apikey={apikey_sonarr}"
try:
tagsDict = requests.get(url_sonarr_api_series, timeout=int(settings.sonarr.http_timeout), verify=False, headers=headers)
@ -71,8 +68,8 @@ def get_tags():
def get_series_from_sonarr_api(url, apikey_sonarr, sonarr_series_id=None):
url_sonarr_api_series = (f"{url}/api/{'' if get_sonarr_info.is_legacy() else 'v3/'}series/"
f"{sonarr_series_id if sonarr_series_id else ''}?apikey={apikey_sonarr}")
url_sonarr_api_series = (f"{url_api_sonarr()}series/{sonarr_series_id if sonarr_series_id else ''}?"
f"apikey={apikey_sonarr}")
try:
r = requests.get(url_sonarr_api_series, timeout=int(settings.sonarr.http_timeout), verify=False, headers=headers)
r.raise_for_status()
@ -98,13 +95,11 @@ def get_series_from_sonarr_api(url, apikey_sonarr, sonarr_series_id=None):
return r.json()
def get_episodes_from_sonarr_api(url, apikey_sonarr, series_id=None, episode_id=None):
def get_episodes_from_sonarr_api(apikey_sonarr, series_id=None, episode_id=None):
if series_id:
url_sonarr_api_episode = (f"{url}/api/{'' if get_sonarr_info.is_legacy() else 'v3/'}episode?"
f"seriesId={series_id}&apikey={apikey_sonarr}")
url_sonarr_api_episode = f"{url_api_sonarr()}episode?seriesId={series_id}&apikey={apikey_sonarr}"
elif episode_id:
url_sonarr_api_episode = (f"{url}/api/{'' if get_sonarr_info.is_legacy() else 'v3/'}episode/{episode_id}?"
f"apikey={apikey_sonarr}")
url_sonarr_api_episode = f"{url_api_sonarr()}episode/{episode_id}?apikey={apikey_sonarr}"
else:
return
@ -127,11 +122,11 @@ def get_episodes_from_sonarr_api(url, apikey_sonarr, series_id=None, episode_id=
return r.json()
def get_episodesFiles_from_sonarr_api(url, apikey_sonarr, series_id=None, episode_file_id=None):
def get_episodesFiles_from_sonarr_api(apikey_sonarr, series_id=None, episode_file_id=None):
if series_id:
url_sonarr_api_episodeFiles = f"{url}/api/v3/episodeFile?seriesId={series_id}&apikey={apikey_sonarr}"
url_sonarr_api_episodeFiles = f"{url_api_sonarr}episodeFile?seriesId={series_id}&apikey={apikey_sonarr}"
elif episode_file_id:
url_sonarr_api_episodeFiles = f"{url}/api/v3/episodeFile/{episode_file_id}?apikey={apikey_sonarr}"
url_sonarr_api_episodeFiles = f"{url_api_sonarr}episodeFile/{episode_file_id}?apikey={apikey_sonarr}"
else:
return