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

pull/1500/head v0.9.7-beta.10
morpheus65535 3 years ago
parent bf037f1573
commit 842dbf0827

@ -12,10 +12,10 @@ from pyga.entities import CustomVariable
from get_args import args from get_args import args
from config import settings 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() sonarr_version = get_sonarr_info.version()
radarr_version = get_radarr_version() radarr_version = get_radarr_info.version()
def track_event(category=None, action=None, label=None): def track_event(category=None, action=None, label=None):

@ -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, \ from list_subtitles import store_subtitles, store_subtitles_movie, series_scan_subtitles, movies_scan_subtitles, \
list_missing_subtitles, list_missing_subtitles_movies list_missing_subtitles, list_missing_subtitles_movies
from utils import history_log, history_log_movie, blacklist_log, blacklist_delete, blacklist_delete_all, \ 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 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, \ from get_providers import get_providers, get_providers_auth, list_throttled_providers, reset_throttled_providers, \
get_throttled_providers, set_throttled_providers get_throttled_providers, set_throttled_providers
@ -600,8 +600,8 @@ class SystemStatus(Resource):
def get(self): def get(self):
system_status = {} system_status = {}
system_status.update({'bazarr_version': os.environ["BAZARR_VERSION"]}) system_status.update({'bazarr_version': os.environ["BAZARR_VERSION"]})
system_status.update({'sonarr_version': get_sonarr_version()}) system_status.update({'sonarr_version': get_sonarr_info.version()})
system_status.update({'radarr_version': get_radarr_version()}) system_status.update({'radarr_version': get_radarr_info.version()})
system_status.update({'operating_system': platform.platform()}) system_status.update({'operating_system': platform.platform()})
system_status.update({'python_version': platform.python_version()}) system_status.update({'python_version': platform.python_version()})
system_status.update({'bazarr_directory': os.path.dirname(os.path.dirname(__file__))}) system_status.update({'bazarr_directory': os.path.dirname(os.path.dirname(__file__))})

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

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

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

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

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

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

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

@ -236,46 +236,52 @@ def cache_maintenance():
remove_expired(fn, pack_cache_validity) remove_expired(fn, pack_cache_validity)
def get_sonarr_version(): class GetSonarrInfo:
sonarr_version = '' @staticmethod
if settings.general.getboolean('use_sonarr'): def version():
try: """
sv = url_sonarr() + "/api/system/status?apikey=" + settings.sonarr.apikey Call system/status API endpoint and get the Sonarr version
sonarr_json = requests.get(sv, timeout=60, verify=False, headers=headers).json() @return: str
if 'version' in sonarr_json: """
sonarr_version = sonarr_json['version'] sonarr_version = region.get("sonarr_version", expiration_time=datetime.timedelta(seconds=60).total_seconds())
else: if sonarr_version:
sv = url_sonarr() + "/api/v3/system/status?apikey=" + settings.sonarr.apikey region.set("sonarr_version", sonarr_version)
sonarr_version = requests.get(sv, timeout=60, verify=False, headers=headers).json()['version'] return sonarr_version
except Exception: else:
logging.debug('BAZARR cannot get Sonarr version') sonarr_version = ''
sonarr_version = 'unknown' if settings.general.getboolean('use_sonarr'):
return sonarr_version 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(): get_sonarr_info = GetSonarrInfo()
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
def notify_sonarr(sonarr_series_id): def notify_sonarr(sonarr_series_id):
sonarr_version = get_sonarr_version()
try: try:
if sonarr_version.startswith(('0.', '2.')): if get_sonarr_info.is_legacy():
url = url_sonarr() + "/api/command?apikey=" + settings.sonarr.apikey url = url_sonarr() + "/api/command?apikey=" + settings.sonarr.apikey
else: else:
url = url_sonarr() + "/api/v3/command?apikey=" + settings.sonarr.apikey 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) requests.post(url, json=data, timeout=60, verify=False, headers=headers)
except Exception as e: except Exception as e:
logging.debug('BAZARR notify Sonarr') logging.exception('BAZARR cannot notify Sonarr')
def get_radarr_version(): class GetRadarrInfo:
radarr_version = '' @staticmethod
if settings.general.getboolean('use_radarr'): def version():
try: """
rv = url_radarr() + "/api/system/status?apikey=" + settings.radarr.apikey Call system/status API endpoint and get the Radarr version
radarr_json = requests.get(rv, timeout=60, verify=False, headers=headers).json() @return: str
if 'version' in radarr_json: """
radarr_version = radarr_json['version'] radarr_version = region.get("radarr_version", expiration_time=datetime.timedelta(seconds=60).total_seconds())
else: if radarr_version:
rv = url_radarr() + "/api/v3/system/status?apikey=" + settings.radarr.apikey return radarr_version
radarr_version = requests.get(rv, timeout=60, verify=False, headers=headers).json()['version'] else:
except Exception as e: radarr_version = ''
logging.debug('BAZARR cannot get Radarr version') if settings.general.getboolean('use_radarr'):
radarr_version = 'unknown' try:
return radarr_version 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(): get_radarr_info = GetRadarrInfo()
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
def notify_radarr(radarr_id): def notify_radarr(radarr_id):
try: try:
if get_radarr_version().startswith('0'): if get_radarr_info.is_legacy():
url = url_radarr() + "/api/command?apikey=" + settings.radarr.apikey url = url_radarr() + "/api/command?apikey=" + settings.radarr.apikey
else: else:
url = url_radarr() + "/api/v3/command?apikey=" + settings.radarr.apikey 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) requests.post(url, json=data, timeout=60, verify=False, headers=headers)
except Exception as e: 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, def delete_subtitles(media_type, language, forced, hi, media_path, subtitles_path, sonarr_series_id=None,

Loading…
Cancel
Save