diff --git a/bazarr/analytics.py b/bazarr/analytics.py index 59947f1ec..b8df668b7 100644 --- a/bazarr/analytics.py +++ b/bazarr/analytics.py @@ -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): diff --git a/bazarr/api.py b/bazarr/api.py index 4d9ec796b..04df0b11b 100644 --- a/bazarr/api.py +++ b/bazarr/api.py @@ -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__))}) diff --git a/bazarr/filesystem.py b/bazarr/filesystem.py index 1c439afc0..db6ccc782 100644 --- a/bazarr/filesystem.py +++ b/bazarr/filesystem.py @@ -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 diff --git a/bazarr/get_episodes.py b/bazarr/get_episodes.py index d5328f346..f26c2f545 100644 --- a/bazarr/get_episodes.py +++ b/bazarr/get_episodes.py @@ -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 diff --git a/bazarr/get_movies.py b/bazarr/get_movies.py index 1aeeb5c54..322a948a5 100644 --- a/bazarr/get_movies.py +++ b/bazarr/get_movies.py @@ -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: diff --git a/bazarr/get_rootfolder.py b/bazarr/get_rootfolder.py index c7d7770ec..fb33e0d85 100644 --- a/bazarr/get_rootfolder.py +++ b/bazarr/get_rootfolder.py @@ -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 diff --git a/bazarr/get_series.py b/bazarr/get_series.py index 45c68d6ee..0f3165dfa 100644 --- a/bazarr/get_series.py +++ b/bazarr/get_series.py @@ -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() diff --git a/bazarr/main.py b/bazarr/main.py index 77772e79e..c579c4979 100644 --- a/bazarr/main.py +++ b/bazarr/main.py @@ -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 diff --git a/bazarr/signalr_client.py b/bazarr/signalr_client.py index ba7d8b4e2..a5dc8df8f 100644 --- a/bazarr/signalr_client.py +++ b/bazarr/signalr_client.py @@ -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...') diff --git a/bazarr/utils.py b/bazarr/utils.py index 4ccd3bacb..98f6ec4b6 100644 --- a/bazarr/utils.py +++ b/bazarr/utils.py @@ -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 +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 + 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 -def get_sonarr_platform(): - sonarr_platform = '' - sonarr_version = get_sonarr_version() - if settings.general.getboolean('use_sonarr'): - try: - if sonarr_version.startswith(('0.', '2.')): - 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 +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') - - -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 + logging.exception('BAZARR cannot notify Sonarr') + + +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 + 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 -def get_radarr_platform(): - radarr_platform = '' - if settings.general.getboolean('use_radarr'): - try: - if get_radarr_version().startswith('0'): - 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 +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,