From 47bb77ac6f229afb366e40af4e8233933d23ebd2 Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Wed, 26 May 2021 10:36:26 -0400 Subject: [PATCH] Added series' episodes sync when required by Sonarr (ex.: episodes monitored status change) --- bazarr/get_episodes.py | 23 +++++++++++++++++------ bazarr/signalr_client.py | 6 ++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/bazarr/get_episodes.py b/bazarr/get_episodes.py index b0e6c16d3..02b5e7c57 100644 --- a/bazarr/get_episodes.py +++ b/bazarr/get_episodes.py @@ -19,12 +19,16 @@ def update_all_episodes(): logging.info('BAZARR All existing episode subtitles indexed from disk.') -def sync_episodes(send_event=True): +def sync_episodes(series_id=None, send_event=True): logging.debug('BAZARR Starting episodes sync from Sonarr.') apikey_sonarr = settings.sonarr.apikey # Get current episodes id in DB - current_episodes_db = database.execute("SELECT sonarrEpisodeId, path, sonarrSeriesId FROM table_episodes") + if series_id: + current_episodes_db = database.execute("SELECT sonarrEpisodeId, path, sonarrSeriesId FROM table_episodes WHERE " + "sonarrSeriesId = ?", (series_id,)) + else: + current_episodes_db = database.execute("SELECT sonarrEpisodeId, path, sonarrSeriesId FROM table_episodes") current_episodes_db_list = [x['sonarrEpisodeId'] for x in current_episodes_db] @@ -34,7 +38,7 @@ def sync_episodes(send_event=True): altered_episodes = [] # Get sonarrId for each series from database - seriesIdList = get_series_from_sonarr_api(url=url_sonarr(), apikey_sonarr=apikey_sonarr) + 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): @@ -290,8 +294,11 @@ def episodeParser(episode): 'file_size': episode['episodeFile']['size']} -def get_series_from_sonarr_api(url, apikey_sonarr): - url_sonarr_api_series = url + "/api/series?apikey=" + apikey_sonarr +def get_series_from_sonarr_api(series_id, url, apikey_sonarr): + if series_id: + url_sonarr_api_series = url + "/api/series/{0}?apikey={1}".format(series_id, apikey_sonarr) + else: + url_sonarr_api_series = url + "/api/series?apikey={}".format(apikey_sonarr) try: r = requests.get(url_sonarr_api_series, timeout=60, verify=False, headers=headers) r.raise_for_status() @@ -310,8 +317,12 @@ def get_series_from_sonarr_api(url, apikey_sonarr): logging.exception("BAZARR Error trying to get series from Sonarr.") return else: + if series_id: + series_json = list(r.json()) + else: + series_json = r.json() series_list = [] - for series in r.json(): + for series in series_json: series_list.append({'sonarrSeriesId': series['id'], 'title': series['title']}) return series_list diff --git a/bazarr/signalr_client.py b/bazarr/signalr_client.py index 5657281db..eb027ca19 100644 --- a/bazarr/signalr_client.py +++ b/bazarr/signalr_client.py @@ -132,11 +132,14 @@ class RadarrSignalrClient: def dispatcher(data): topic = media_id = action = None + episodesChanged = None if isinstance(data, dict): topic = data['name'] try: media_id = data['body']['resource']['id'] action = data['body']['action'] + if 'episodesChanged' in data['body']['resource']: + episodesChanged = data['body']['resource']['episodesChanged'] except KeyError: return elif isinstance(data, list): @@ -149,6 +152,9 @@ def dispatcher(data): if topic == 'series': update_one_series(series_id=media_id, action=action) + if episodesChanged: + # this will happen if an episode monitored status is changed. + sync_episodes(series_id=media_id, send_event=True) elif topic == 'episode': sync_one_episode(episode_id=media_id) elif topic == 'movie':