Improved how Bazarr get Sonarr/Radarr version to use caching and reduce the number of calls made to their respective API.

This commit is contained in:
morpheus65535 2021-08-04 15:29:37 -04:00
parent bf037f1573
commit 842dbf0827
10 changed files with 153 additions and 163 deletions

View File

@ -12,10 +12,10 @@ from pyga.entities import CustomVariable
from get_args import args
from config import settings
from utils import get_sonarr_version, get_radarr_version
from utils import get_sonarr_info, get_radarr_info
sonarr_version = get_sonarr_version()
radarr_version = get_radarr_version()
sonarr_version = get_sonarr_info.version()
radarr_version = get_radarr_info.version()
def track_event(category=None, action=None, label=None):

View File

@ -39,7 +39,7 @@ from notifier import send_notifications, send_notifications_movie
from list_subtitles import store_subtitles, store_subtitles_movie, series_scan_subtitles, movies_scan_subtitles, \
list_missing_subtitles, list_missing_subtitles_movies
from utils import history_log, history_log_movie, blacklist_log, blacklist_delete, blacklist_delete_all, \
blacklist_log_movie, blacklist_delete_movie, blacklist_delete_all_movie, get_sonarr_version, get_radarr_version, \
blacklist_log_movie, blacklist_delete_movie, blacklist_delete_all_movie, get_sonarr_info, get_radarr_info, \
delete_subtitles, subtitles_apply_mods, translate_subtitles_file, check_credentials, get_health_issues
from get_providers import get_providers, get_providers_auth, list_throttled_providers, reset_throttled_providers, \
get_throttled_providers, set_throttled_providers
@ -600,8 +600,8 @@ class SystemStatus(Resource):
def get(self):
system_status = {}
system_status.update({'bazarr_version': os.environ["BAZARR_VERSION"]})
system_status.update({'sonarr_version': get_sonarr_version()})
system_status.update({'radarr_version': get_radarr_version()})
system_status.update({'sonarr_version': get_sonarr_info.version()})
system_status.update({'radarr_version': get_radarr_info.version()})
system_status.update({'operating_system': platform.platform()})
system_status.update({'python_version': platform.python_version()})
system_status.update({'bazarr_directory': os.path.dirname(os.path.dirname(__file__))})

View File

@ -6,7 +6,7 @@ import logging
import string
from config import settings, url_sonarr, url_radarr
from utils import get_sonarr_version, get_radarr_version
from utils import get_sonarr_info, get_radarr_info
headers = {"User-Agent": os.environ["SZ_USER_AGENT"]}
@ -46,10 +46,9 @@ def browse_bazarr_filesystem(path='#'):
def browse_sonarr_filesystem(path='#'):
sonarr_version = get_sonarr_version()
if path == '#':
path = ''
if sonarr_version.startswith(('0.', '2.')):
if get_sonarr_info.is_legacy():
url_sonarr_api_filesystem = url_sonarr() + "/api/filesystem?path=" + path + \
"&allowFoldersWithoutTrailingSlashes=true&includeFiles=false&apikey=" + \
settings.sonarr.apikey
@ -77,11 +76,10 @@ def browse_sonarr_filesystem(path='#'):
def browse_radarr_filesystem(path='#'):
radarr_version = get_radarr_version()
if path == '#':
path = ''
if radarr_version.startswith('0'):
if get_radarr_info.is_legacy():
url_radarr_api_filesystem = url_radarr() + "/api/filesystem?path=" + path + \
"&allowFoldersWithoutTrailingSlashes=true&includeFiles=false&apikey=" + \
settings.radarr.apikey

View File

@ -12,7 +12,7 @@ from helper import path_mappings
from list_subtitles import store_subtitles, series_full_scan_subtitles
from get_subtitle import episode_download_subtitles
from event_handler import event_stream, show_progress, hide_progress
from utils import get_sonarr_version
from utils import get_sonarr_info
headers = {"User-Agent": os.environ["SZ_USER_AGENT"]}
@ -25,7 +25,6 @@ def update_all_episodes():
def sync_episodes(series_id=None, send_event=True):
logging.debug('BAZARR Starting episodes sync from Sonarr.')
apikey_sonarr = settings.sonarr.apikey
sonarr_version = get_sonarr_version()
# Get current episodes id in DB
current_episodes_db = TableEpisodes.select(TableEpisodes.sonarrEpisodeId,
@ -42,8 +41,7 @@ def sync_episodes(series_id=None, send_event=True):
altered_episodes = []
# Get sonarrId for each series from database
seriesIdList = get_series_from_sonarr_api(series_id=series_id, url=url_sonarr(), apikey_sonarr=apikey_sonarr,
sonarr_version=sonarr_version)
seriesIdList = get_series_from_sonarr_api(series_id=series_id, url=url_sonarr(), apikey_sonarr=apikey_sonarr,)
series_count = len(seriesIdList)
for i, seriesId in enumerate(seriesIdList, 1):
@ -57,13 +55,12 @@ def sync_episodes(series_id=None, send_event=True):
# Get episodes data for a series from Sonarr
episodes = get_episodes_from_sonarr_api(url=url_sonarr(), apikey_sonarr=apikey_sonarr,
series_id=seriesId['sonarrSeriesId'],
sonarr_version=sonarr_version)
series_id=seriesId['sonarrSeriesId'])
if not episodes:
continue
else:
# For Sonarr v3, we need to update episodes to integrate the episodeFile API endpoint results
if not sonarr_version.startswith(('0.', '2.')):
if not get_sonarr_info.is_legacy():
episodeFiles = get_episodesFiles_from_sonarr_api(url=url_sonarr(), apikey_sonarr=apikey_sonarr,
series_id=seriesId['sonarrSeriesId'])
for episode in episodes:
@ -166,7 +163,6 @@ def sync_one_episode(episode_id):
logging.debug('BAZARR syncing this specific episode from Sonarr: {}'.format(episode_id))
url = url_sonarr()
apikey_sonarr = settings.sonarr.apikey
sonarr_version = get_sonarr_version()
# Check if there's a row in database for this episode ID
try:
@ -181,13 +177,13 @@ def sync_one_episode(episode_id):
# 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, sonarr_version=sonarr_version)
episode_id=episode_id)
if not episode_data:
return
else:
# For Sonarr v3, we need to update episodes to integrate the episodeFile API endpoint results
if not sonarr_version.startswith(('0.', '2.')):
if not get_sonarr_info.is_legacy():
episodeFile = get_episodesFiles_from_sonarr_api(url=url, apikey_sonarr=apikey_sonarr,
episode_file_id=existing_episode['episode_file_id'])
if episode_data['hasFile']:
@ -336,13 +332,13 @@ def episodeParser(episode):
'file_size': episode['episodeFile']['size']}
def get_series_from_sonarr_api(series_id, url, apikey_sonarr, sonarr_version):
def get_series_from_sonarr_api(series_id, url, apikey_sonarr):
if series_id:
url_sonarr_api_series = url + "/api/{0}series/{1}?apikey={2}".format(
'' if sonarr_version.startswith(('0.', '2.')) else 'v3/', series_id, apikey_sonarr)
'' if get_sonarr_info.is_legacy() else 'v3/', series_id, apikey_sonarr)
else:
url_sonarr_api_series = url + "/api/{0}series?apikey={1}".format(
'' if sonarr_version.startswith(('0.', '2.')) else 'v3/', apikey_sonarr)
'' if get_sonarr_info.is_legacy() else 'v3/', apikey_sonarr)
try:
r = requests.get(url_sonarr_api_series, timeout=60, verify=False, headers=headers)
r.raise_for_status()
@ -372,13 +368,13 @@ def get_series_from_sonarr_api(series_id, url, apikey_sonarr, sonarr_version):
return series_list
def get_episodes_from_sonarr_api(url, apikey_sonarr, sonarr_version, series_id=None, episode_id=None):
def get_episodes_from_sonarr_api(url, apikey_sonarr, series_id=None, episode_id=None):
if series_id:
url_sonarr_api_episode = url + "/api/{0}episode?seriesId={1}&apikey={2}".format(
'' if sonarr_version.startswith(('0.', '2.')) else 'v3/', series_id, apikey_sonarr)
'' if get_sonarr_info.is_legacy() else 'v3/', series_id, apikey_sonarr)
elif episode_id:
url_sonarr_api_episode = url + "/api/{0}episode/{1}?apikey={2}".format(
'' if sonarr_version.startswith(('0.', '2.')) else 'v3/', episode_id, apikey_sonarr)
'' if get_sonarr_info.is_legacy() else 'v3/', episode_id, apikey_sonarr)
else:
return

View File

@ -10,7 +10,7 @@ from peewee import DoesNotExist
from config import settings, url_radarr
from helper import path_mappings
from utils import get_radarr_version
from utils import get_radarr_info
from list_subtitles import store_subtitles_movie, movies_full_scan_subtitles
from get_rootfolder import check_radarr_rootfolder
@ -31,7 +31,6 @@ def update_movies(send_event=True):
logging.debug('BAZARR Starting movie sync from Radarr.')
apikey_radarr = settings.radarr.apikey
radarr_version = get_radarr_version()
movie_default_enabled = settings.general.getboolean('movie_default_enabled')
if movie_default_enabled is True:
@ -45,11 +44,10 @@ def update_movies(send_event=True):
pass
else:
audio_profiles = get_profile_list()
tagsDict = get_tags(radarr_version=radarr_version)
tagsDict = get_tags()
# Get movies data from radarr
movies = get_movies_from_radarr_api(radarr_version=radarr_version, url=url_radarr(),
apikey_radarr=apikey_radarr)
movies = get_movies_from_radarr_api(url=url_radarr(), apikey_radarr=apikey_radarr)
if not movies:
return
else:
@ -82,13 +80,11 @@ def update_movies(send_event=True):
if str(movie['tmdbId']) in current_movies_db_list:
movies_to_update.append(movieParser(movie, action='update',
radarr_version=radarr_version,
tags_dict=tagsDict,
movie_default_profile=movie_default_profile,
audio_profiles=audio_profiles))
else:
movies_to_add.append(movieParser(movie, action='insert',
radarr_version=radarr_version,
tags_dict=tagsDict,
movie_default_profile=movie_default_profile,
audio_profiles=audio_profiles))
@ -190,7 +186,6 @@ def update_one_movie(movie_id, action):
existing_movie['path'])))
return
radarr_version = get_radarr_version()
movie_default_enabled = settings.general.getboolean('movie_default_enabled')
if movie_default_enabled is True:
@ -201,24 +196,22 @@ def update_one_movie(movie_id, action):
movie_default_profile = None
audio_profiles = get_profile_list()
tagsDict = get_tags(radarr_version=radarr_version)
tagsDict = get_tags()
try:
# Get movie data from radarr api
movie = None
movie_data = get_movies_from_radarr_api(radarr_version=radarr_version, url=url_radarr(),
apikey_radarr=settings.radarr.apikey, radarr_id=movie_id)
movie_data = get_movies_from_radarr_api(url=url_radarr(), apikey_radarr=settings.radarr.apikey,
radarr_id=movie_id)
if not movie_data:
return
else:
if action == 'updated' and existing_movie:
movie = movieParser(movie_data, action='update', radarr_version=radarr_version,
tags_dict=tagsDict, movie_default_profile=movie_default_profile,
audio_profiles=audio_profiles)
movie = movieParser(movie_data, action='update', tags_dict=tagsDict,
movie_default_profile=movie_default_profile, audio_profiles=audio_profiles)
elif action == 'updated' and not existing_movie:
movie = movieParser(movie_data, action='insert', radarr_version=radarr_version,
tags_dict=tagsDict, movie_default_profile=movie_default_profile,
audio_profiles=audio_profiles)
movie = movieParser(movie_data, action='insert', tags_dict=tagsDict,
movie_default_profile=movie_default_profile, audio_profiles=audio_profiles)
except Exception:
logging.debug('BAZARR cannot get movie returned by SignalR feed from Radarr API.')
return
@ -262,10 +255,9 @@ def update_one_movie(movie_id, action):
def get_profile_list():
apikey_radarr = settings.radarr.apikey
radarr_version = get_radarr_version()
profiles_list = []
# Get profiles data from radarr
if radarr_version.startswith('0'):
if get_radarr_info.is_legacy():
url_radarr_api_movies = url_radarr() + "/api/profile?apikey=" + apikey_radarr
else:
url_radarr_api_movies = url_radarr() + "/api/v3/qualityprofile?apikey=" + apikey_radarr
@ -280,7 +272,7 @@ def get_profile_list():
logging.exception("BAZARR Error trying to get profiles from Radarr.")
else:
# Parsing data returned from radarr
if radarr_version.startswith('0'):
if get_radarr_info.is_legacy():
for profile in profiles_json.json():
profiles_list.append([profile['id'], profile['language'].capitalize()])
else:
@ -346,12 +338,12 @@ def RadarrFormatVideoCodec(videoFormat, videoCodecID, videoCodecLibrary):
return videoFormat
def get_tags(radarr_version):
def get_tags():
apikey_radarr = settings.radarr.apikey
tagsDict = []
# Get tags data from Radarr
if radarr_version.startswith('0'):
if get_radarr_info.is_legacy():
url_radarr_api_series = url_radarr() + "/api/tag?apikey=" + apikey_radarr
else:
url_radarr_api_series = url_radarr() + "/api/v3/tag?apikey=" + apikey_radarr
@ -371,7 +363,7 @@ def get_tags(radarr_version):
return tagsDict.json()
def movieParser(movie, action, radarr_version, tags_dict, movie_default_profile, audio_profiles):
def movieParser(movie, action, tags_dict, movie_default_profile, audio_profiles):
if 'movieFile' in movie:
# Detect file separator
if movie['path'][0] == "/":
@ -399,7 +391,7 @@ def movieParser(movie, action, radarr_version, tags_dict, movie_default_profile,
sceneName = None
alternativeTitles = None
if radarr_version.startswith('0'):
if get_radarr_info.is_legacy():
if 'alternativeTitles' in movie:
alternativeTitles = str([item['title'] for item in movie['alternativeTitles']])
else:
@ -422,7 +414,7 @@ def movieParser(movie, action, radarr_version, tags_dict, movie_default_profile,
if 'mediaInfo' in movie['movieFile']:
videoFormat = videoCodecID = videoProfile = videoCodecLibrary = None
if radarr_version.startswith('0'):
if get_radarr_info.is_legacy():
if 'videoFormat' in movie['movieFile']['mediaInfo']: videoFormat = \
movie['movieFile']['mediaInfo']['videoFormat']
else:
@ -437,7 +429,7 @@ def movieParser(movie, action, radarr_version, tags_dict, movie_default_profile,
videoCodec = RadarrFormatVideoCodec(videoFormat, videoCodecID, videoCodecLibrary)
audioFormat = audioCodecID = audioProfile = audioAdditionalFeatures = None
if radarr_version.startswith('0'):
if get_radarr_info.is_legacy():
if 'audioFormat' in movie['movieFile']['mediaInfo']: audioFormat = \
movie['movieFile']['mediaInfo']['audioFormat']
else:
@ -456,7 +448,7 @@ def movieParser(movie, action, radarr_version, tags_dict, movie_default_profile,
audioCodec = None
audio_language = []
if radarr_version.startswith('0'):
if get_radarr_info.is_legacy():
if 'mediaInfo' in movie['movieFile']:
if 'audioLanguages' in movie['movieFile']['mediaInfo']:
audio_languages_list = movie['movieFile']['mediaInfo']['audioLanguages'].split('/')
@ -522,8 +514,8 @@ def movieParser(movie, action, radarr_version, tags_dict, movie_default_profile,
'file_size': movie['movieFile']['size']}
def get_movies_from_radarr_api(radarr_version, url, apikey_radarr, radarr_id=None):
if radarr_version.startswith('0'):
def get_movies_from_radarr_api(url, apikey_radarr, radarr_id=None):
if get_radarr_info.is_legacy():
url_radarr_api_movies = url + "/api/movie" + ("/{}".format(radarr_id) if radarr_id else "") + "?apikey=" + \
apikey_radarr
else:

View File

@ -7,7 +7,7 @@ import logging
from config import settings, url_sonarr, url_radarr
from helper import path_mappings
from database import TableShowsRootfolder, TableMoviesRootfolder, TableShows, TableMovies
from utils import get_sonarr_version, get_radarr_version
from utils import get_sonarr_info, get_radarr_info
headers = {"User-Agent": os.environ["SZ_USER_AGENT"]}
@ -15,10 +15,9 @@ headers = {"User-Agent": os.environ["SZ_USER_AGENT"]}
def get_sonarr_rootfolder():
apikey_sonarr = settings.sonarr.apikey
sonarr_rootfolder = []
sonarr_version = get_sonarr_version()
# Get root folder data from Sonarr
if sonarr_version.startswith(('0.', '2.')):
if get_sonarr_info.is_legacy():
url_sonarr_api_rootfolder = url_sonarr() + "/api/rootfolder?apikey=" + apikey_sonarr
else:
url_sonarr_api_rootfolder = url_sonarr() + "/api/v3/rootfolder?apikey=" + apikey_sonarr
@ -90,10 +89,9 @@ def check_sonarr_rootfolder():
def get_radarr_rootfolder():
apikey_radarr = settings.radarr.apikey
radarr_rootfolder = []
radarr_version = get_radarr_version()
# Get root folder data from Radarr
if radarr_version.startswith('0'):
if get_radarr_info.is_legacy():
url_radarr_api_rootfolder = url_radarr() + "/api/rootfolder?apikey=" + apikey_radarr
else:
url_radarr_api_rootfolder = url_radarr() + "/api/v3/rootfolder?apikey=" + apikey_radarr

View File

@ -11,7 +11,7 @@ from list_subtitles import list_missing_subtitles
from get_rootfolder import check_sonarr_rootfolder
from database import TableShows, TableEpisodes
from get_episodes import sync_episodes
from utils import get_sonarr_version
from utils import get_sonarr_info
from helper import path_mappings
from event_handler import event_stream, show_progress, hide_progress
@ -24,7 +24,6 @@ def update_series(send_event=True):
if apikey_sonarr is None:
return
sonarr_version = get_sonarr_version()
serie_default_enabled = settings.general.getboolean('serie_default_enabled')
if serie_default_enabled is True:
@ -38,8 +37,7 @@ def update_series(send_event=True):
tagsDict = get_tags()
# Get shows data from Sonarr
series = get_series_from_sonarr_api(url=url_sonarr(), apikey_sonarr=apikey_sonarr,
sonarr_version=sonarr_version)
series = get_series_from_sonarr_api(url=url_sonarr(), apikey_sonarr=apikey_sonarr)
if not series:
return
else:
@ -65,12 +63,12 @@ def update_series(send_event=True):
current_shows_sonarr.append(show['id'])
if show['id'] in current_shows_db_list:
series_to_update.append(seriesParser(show, action='update', sonarr_version=sonarr_version,
tags_dict=tagsDict, serie_default_profile=serie_default_profile,
series_to_update.append(seriesParser(show, action='update', tags_dict=tagsDict,
serie_default_profile=serie_default_profile,
audio_profiles=audio_profiles))
else:
series_to_add.append(seriesParser(show, action='insert', sonarr_version=sonarr_version,
tags_dict=tagsDict, serie_default_profile=serie_default_profile,
series_to_add.append(seriesParser(show, action='insert', tags_dict=tagsDict,
serie_default_profile=serie_default_profile,
audio_profiles=audio_profiles))
if send_event:
@ -155,7 +153,6 @@ def update_one_series(series_id, action):
event_stream(type='series', action='delete', payload=int(series_id))
return
sonarr_version = get_sonarr_version()
serie_default_enabled = settings.general.getboolean('serie_default_enabled')
if serie_default_enabled is True:
@ -173,18 +170,19 @@ def update_one_series(series_id, action):
series = None
series_data = get_series_from_sonarr_api(url=url_sonarr(), apikey_sonarr=settings.sonarr.apikey,
sonarr_series_id=int(series_id), sonarr_version=get_sonarr_version())
sonarr_series_id=int(series_id),
sonarr_version=get_sonarr_info.version())
if not series_data:
return
else:
if action == 'updated' and existing_series:
series = seriesParser(series_data, action='update', sonarr_version=sonarr_version,
tags_dict=tagsDict, serie_default_profile=serie_default_profile,
series = seriesParser(series_data, action='update', tags_dict=tagsDict,
serie_default_profile=serie_default_profile,
audio_profiles=audio_profiles)
elif action == 'updated' and not existing_series:
series = seriesParser(series_data, action='insert', sonarr_version=sonarr_version,
tags_dict=tagsDict, serie_default_profile=serie_default_profile,
series = seriesParser(series_data, action='insert', tags_dict=tagsDict,
serie_default_profile=serie_default_profile,
audio_profiles=audio_profiles)
except Exception:
logging.debug('BAZARR cannot parse series returned by SignalR feed.')
@ -208,11 +206,10 @@ def update_one_series(series_id, action):
def get_profile_list():
apikey_sonarr = settings.sonarr.apikey
sonarr_version = get_sonarr_version()
profiles_list = []
# Get profiles data from Sonarr
if sonarr_version.startswith(('0.', '2.')):
if get_sonarr_info.is_legacy():
url_sonarr_api_series = url_sonarr() + "/api/profile?apikey=" + apikey_sonarr
else:
url_sonarr_api_series = url_sonarr() + "/api/v3/languageprofile?apikey=" + apikey_sonarr
@ -230,7 +227,7 @@ def get_profile_list():
return None
# Parsing data returned from Sonarr
if sonarr_version.startswith(('0.', '2.')):
if get_sonarr_info.is_legacy():
for profile in profiles_json.json():
profiles_list.append([profile['id'], profile['language'].capitalize()])
else:
@ -250,11 +247,10 @@ def profile_id_to_language(id_, profiles):
def get_tags():
apikey_sonarr = settings.sonarr.apikey
sonarr_version = get_sonarr_version()
tagsDict = []
# Get tags data from Sonarr
if sonarr_version.startswith(('0.', '2.')):
if get_sonarr_info.is_legacy():
url_sonarr_api_series = url_sonarr() + "/api/tag?apikey=" + apikey_sonarr
else:
url_sonarr_api_series = url_sonarr() + "/api/v3/tag?apikey=" + apikey_sonarr
@ -274,7 +270,7 @@ def get_tags():
return tagsDict.json()
def seriesParser(show, action, sonarr_version, tags_dict, serie_default_profile, audio_profiles):
def seriesParser(show, action, tags_dict, serie_default_profile, audio_profiles):
overview = show['overview'] if 'overview' in show else ''
poster = ''
fanart = ''
@ -291,7 +287,7 @@ def seriesParser(show, action, sonarr_version, tags_dict, serie_default_profile,
alternate_titles = str([item['title'] for item in show['alternateTitles']])
audio_language = []
if sonarr_version.startswith(('0.', '2.')):
if get_sonarr_info.is_legacy():
audio_language = profile_id_to_language(show['qualityProfileId'], audio_profiles)
else:
audio_language = profile_id_to_language(show['languageProfileId'], audio_profiles)
@ -333,9 +329,9 @@ def seriesParser(show, action, sonarr_version, tags_dict, serie_default_profile,
'profileId': serie_default_profile}
def get_series_from_sonarr_api(url, apikey_sonarr, sonarr_version, sonarr_series_id=None):
def get_series_from_sonarr_api(url, apikey_sonarr, sonarr_series_id=None):
url_sonarr_api_series = url + "/api/{0}series/{1}?apikey={2}".format(
'' if sonarr_version.startswith(('0.', '2.')) else 'v3/', sonarr_series_id if sonarr_series_id else "", apikey_sonarr)
'' if get_sonarr_info.is_legacy() else 'v3/', sonarr_series_id if sonarr_series_id else "", apikey_sonarr)
try:
r = requests.get(url_sonarr_api_series, timeout=60, verify=False, headers=headers)
r.raise_for_status()

View File

@ -43,7 +43,7 @@ from signalr_client import sonarr_signalr_client, radarr_signalr_client
from check_update import apply_update, check_if_new_update, check_releases
from server import app, webserver
from functools import wraps
from utils import check_credentials, get_sonarr_version, get_radarr_version
from utils import check_credentials, get_sonarr_info, get_radarr_info
# Install downloaded update
if bazarr_version != '':
@ -131,8 +131,7 @@ def series_images(url):
url = url.strip("/")
apikey = settings.sonarr.apikey
baseUrl = settings.sonarr.base_url
sonarr_version = get_sonarr_version()
if sonarr_version.startswith(('0.', '2.')):
if get_sonarr_info.is_legacy():
url_image = (url_sonarr() + '/api/' + url.lstrip(baseUrl) + '?apikey=' +
apikey).replace('poster-250', 'poster-500')
else:
@ -151,8 +150,7 @@ def series_images(url):
def movies_images(url):
apikey = settings.radarr.apikey
baseUrl = settings.radarr.base_url
radarr_version = get_radarr_version()
if radarr_version.startswith('0'):
if get_radarr_info.is_legacy():
url_image = url_radarr() + '/api/' + url.lstrip(baseUrl) + '?apikey=' + apikey
else:
url_image = url_radarr() + '/api/v3/' + url.lstrip(baseUrl) + '?apikey=' + apikey

View File

@ -15,7 +15,7 @@ from get_episodes import sync_episodes, sync_one_episode
from get_series import update_series, update_one_series
from get_movies import update_movies, update_one_movie
from scheduler import scheduler
from utils import get_sonarr_version
from utils import get_sonarr_info
from get_args import args
@ -33,10 +33,9 @@ class SonarrSignalrClient:
self.connection = None
def start(self):
sonarr_version = get_sonarr_version()
if sonarr_version.startswith(('0.', '2.')):
if get_sonarr_info.is_legacy():
logging.warning('BAZARR can only sync from Sonarr v3 SignalR feed to get real-time update. You should '
'consider upgrading your version({}).'.format(sonarr_version))
'consider upgrading your version({}).'.format(get_sonarr_info.version()))
raise gevent.GreenletExit
else:
logging.info('BAZARR trying to connect to Sonarr SignalR feed...')

View File

@ -236,46 +236,52 @@ def cache_maintenance():
remove_expired(fn, pack_cache_validity)
def get_sonarr_version():
sonarr_version = ''
if settings.general.getboolean('use_sonarr'):
try:
sv = url_sonarr() + "/api/system/status?apikey=" + settings.sonarr.apikey
sonarr_json = requests.get(sv, timeout=60, verify=False, headers=headers).json()
if 'version' in sonarr_json:
sonarr_version = sonarr_json['version']
else:
sv = url_sonarr() + "/api/v3/system/status?apikey=" + settings.sonarr.apikey
sonarr_version = requests.get(sv, timeout=60, verify=False, headers=headers).json()['version']
except Exception:
logging.debug('BAZARR cannot get Sonarr version')
sonarr_version = 'unknown'
return sonarr_version
def get_sonarr_platform():
sonarr_platform = ''
sonarr_version = get_sonarr_version()
if settings.general.getboolean('use_sonarr'):
try:
if sonarr_version.startswith(('0.', '2.')):
class GetSonarrInfo:
@staticmethod
def version():
"""
Call system/status API endpoint and get the Sonarr version
@return: str
"""
sonarr_version = region.get("sonarr_version", expiration_time=datetime.timedelta(seconds=60).total_seconds())
if sonarr_version:
region.set("sonarr_version", sonarr_version)
return sonarr_version
else:
sonarr_version = ''
if settings.general.getboolean('use_sonarr'):
try:
sv = url_sonarr() + "/api/system/status?apikey=" + settings.sonarr.apikey
else:
sv = url_sonarr() + "/api/v3/system/status?apikey=" + settings.sonarr.apikey
response = requests.get(sv, timeout=60, verify=False, headers=headers).json()
if response['isLinux'] or response['isOsx']:
sonarr_platform = 'posix'
elif response['isWindows']:
sonarr_platform = 'nt'
except Exception:
logging.debug('BAZARR cannot get Sonarr platform')
return sonarr_platform
sonarr_json = requests.get(sv, timeout=60, verify=False, headers=headers).json()
if 'version' in sonarr_json:
sonarr_version = sonarr_json['version']
else:
sv = url_sonarr() + "/api/v3/system/status?apikey=" + settings.sonarr.apikey
sonarr_version = requests.get(sv, timeout=60, verify=False, headers=headers).json()['version']
except Exception:
logging.debug('BAZARR cannot get Sonarr version')
sonarr_version = 'unknown'
region.set("sonarr_version", sonarr_version)
return sonarr_version
def is_legacy(self):
"""
Call self.version() and parse the result to determine if it's a legacy version of Sonarr API
@return: bool
"""
sonarr_version = self.version()
if sonarr_version.startswith(('0.', '2.')):
return True
else:
return False
get_sonarr_info = GetSonarrInfo()
def notify_sonarr(sonarr_series_id):
sonarr_version = get_sonarr_version()
try:
if sonarr_version.startswith(('0.', '2.')):
if get_sonarr_info.is_legacy():
url = url_sonarr() + "/api/command?apikey=" + settings.sonarr.apikey
else:
url = url_sonarr() + "/api/v3/command?apikey=" + settings.sonarr.apikey
@ -285,47 +291,54 @@ def notify_sonarr(sonarr_series_id):
}
requests.post(url, json=data, timeout=60, verify=False, headers=headers)
except Exception as e:
logging.debug('BAZARR notify Sonarr')
logging.exception('BAZARR cannot notify Sonarr')
def get_radarr_version():
radarr_version = ''
if settings.general.getboolean('use_radarr'):
try:
rv = url_radarr() + "/api/system/status?apikey=" + settings.radarr.apikey
radarr_json = requests.get(rv, timeout=60, verify=False, headers=headers).json()
if 'version' in radarr_json:
radarr_version = radarr_json['version']
else:
rv = url_radarr() + "/api/v3/system/status?apikey=" + settings.radarr.apikey
radarr_version = requests.get(rv, timeout=60, verify=False, headers=headers).json()['version']
except Exception as e:
logging.debug('BAZARR cannot get Radarr version')
radarr_version = 'unknown'
return radarr_version
def get_radarr_platform():
radarr_platform = ''
if settings.general.getboolean('use_radarr'):
try:
if get_radarr_version().startswith('0'):
class GetRadarrInfo:
@staticmethod
def version():
"""
Call system/status API endpoint and get the Radarr version
@return: str
"""
radarr_version = region.get("radarr_version", expiration_time=datetime.timedelta(seconds=60).total_seconds())
if radarr_version:
return radarr_version
else:
radarr_version = ''
if settings.general.getboolean('use_radarr'):
try:
rv = url_radarr() + "/api/system/status?apikey=" + settings.radarr.apikey
else:
rv = url_radarr() + "/api/v3/system/status?apikey=" + settings.radarr.apikey
response = requests.get(rv, timeout=60, verify=False, headers=headers).json()
if response['isLinux'] or response['isOsx']:
radarr_platform = 'posix'
elif response['isWindows']:
radarr_platform = 'nt'
except Exception:
logging.debug('BAZARR cannot get Radarr platform')
return radarr_platform
radarr_json = requests.get(rv, timeout=60, verify=False, headers=headers).json()
if 'version' in radarr_json:
radarr_version = radarr_json['version']
else:
rv = url_radarr() + "/api/v3/system/status?apikey=" + settings.radarr.apikey
radarr_version = requests.get(rv, timeout=60, verify=False, headers=headers).json()['version']
except Exception as e:
logging.debug('BAZARR cannot get Radarr version')
radarr_version = 'unknown'
region.set("radarr_version", radarr_version)
return radarr_version
def is_legacy(self):
"""
Call self.version() and parse the result to determine if it's a legacy version of Radarr
@return: bool
"""
radarr_version = self.version()
if radarr_version.startswith('0.'):
return True
else:
return False
get_radarr_info = GetRadarrInfo()
def notify_radarr(radarr_id):
try:
if get_radarr_version().startswith('0'):
if get_radarr_info.is_legacy():
url = url_radarr() + "/api/command?apikey=" + settings.radarr.apikey
else:
url = url_radarr() + "/api/v3/command?apikey=" + settings.radarr.apikey
@ -335,7 +348,7 @@ def notify_radarr(radarr_id):
}
requests.post(url, json=data, timeout=60, verify=False, headers=headers)
except Exception as e:
logging.debug('BAZARR notify Radarr')
logging.exception('BAZARR cannot notify Radarr')
def delete_subtitles(media_type, language, forced, hi, media_path, subtitles_path, sonarr_series_id=None,