Merged the series and episodes sync process. Episodes are only synced if series sizeOnDisk reported by Sonarr changes.

pull/1371/head
morpheus65535 4 years ago
parent a99c4d5438
commit 5aadcea83a

@ -77,8 +77,7 @@ defaults = {
'full_update_day': '6', 'full_update_day': '6',
'full_update_hour': '4', 'full_update_hour': '4',
'only_monitored': 'False', 'only_monitored': 'False',
'series_sync': '1', 'series_sync': '5',
'episodes_sync': '5',
'excluded_tags': '[]', 'excluded_tags': '[]',
'excluded_series_types': '[]' 'excluded_series_types': '[]'
}, },

@ -102,6 +102,7 @@ def db_upgrade():
['table_shows', 'seriesType', 'text', ''], ['table_shows', 'seriesType', 'text', ''],
['table_shows', 'imdbId', 'text', ''], ['table_shows', 'imdbId', 'text', ''],
['table_shows', 'profileId', 'integer'], ['table_shows', 'profileId', 'integer'],
['table_shows', 'sizeOnDisk', 'integer'],
['table_episodes', 'format', 'text'], ['table_episodes', 'format', 'text'],
['table_episodes', 'resolution', 'text'], ['table_episodes', 'resolution', 'text'],
['table_episodes', 'video_codec', 'text'], ['table_episodes', 'video_codec', 'text'],

@ -16,22 +16,30 @@ def update_all_episodes():
logging.info('BAZARR All existing episode subtitles indexed from disk.') logging.info('BAZARR All existing episode subtitles indexed from disk.')
def sync_episodes(): def sync_episodes(series_id=None):
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
# Get current episodes id in DB # Get current episodes id in DB
current_episodes_db = database.execute("SELECT sonarrEpisodeId, path, sonarrSeriesId FROM table_episodes") current_episodes_db = database.execute("SELECT sonarrEpisodeId, path, sonarrSeriesId FROM table_episodes")
current_episodes_db_list = [x['sonarrEpisodeId'] for x in current_episodes_db] if series_id:
current_episodes_db_list = [x['sonarrEpisodeId'] for x in current_episodes_db if x['sonarrSeriesId'] == series_id]
else:
current_episodes_db_list = [x['sonarrEpisodeId'] for x in current_episodes_db]
current_episodes_sonarr = [] current_episodes_sonarr = []
episodes_to_update = [] episodes_to_update = []
episodes_to_add = [] episodes_to_add = []
altered_episodes = [] altered_episodes = []
# Get sonarrId for each series from database if series_id and isinstance(series_id, int):
seriesIdList = database.execute("SELECT sonarrSeriesId, title FROM table_shows") # Get sonarrId for each series from database
seriesIdList = database.execute("SELECT sonarrSeriesId, title FROM table_shows WHERE sonarrSeriesId = ?",
(series_id,))
else:
# Get sonarrId for each series from database
seriesIdList = database.execute("SELECT sonarrSeriesId, title FROM table_shows")
for i, seriesId in enumerate(seriesIdList): for i, seriesId in enumerate(seriesIdList):
# Get episodes data for a series from Sonarr # Get episodes data for a series from Sonarr

@ -11,6 +11,7 @@ from database import database, dict_converter
from utils import get_sonarr_version from utils import get_sonarr_version
from helper import path_mappings from helper import path_mappings
from event_handler import event_stream from event_handler import event_stream
from get_episodes import sync_episodes
def update_series(): def update_series():
@ -56,6 +57,7 @@ def update_series():
current_shows_sonarr = [] current_shows_sonarr = []
series_to_update = [] series_to_update = []
series_to_add = [] series_to_add = []
episodes_to_sync = []
series_list_length = len(r.json()) series_list_length = len(r.json())
for i, show in enumerate(r.json(), 1): for i, show in enumerate(r.json(), 1):
@ -87,6 +89,13 @@ def update_series():
# Add shows in Sonarr to current shows list # Add shows in Sonarr to current shows list
current_shows_sonarr.append(show['id']) current_shows_sonarr.append(show['id'])
# Get sizeOnDisk for show
sizeOnDisk = show['sizeOnDisk'] if 'sizeOnDisk' in show else 0
show_size_in_db = database.execute('SELECT sizeOnDisk FROM table_shows WHERE sonarrSeriesId = ?', (show['id'],))
if len(show_size_in_db):
if sizeOnDisk != show_size_in_db[0]['sizeOnDisk']:
episodes_to_sync.append(show['id'])
if show['id'] in current_shows_db_list: if show['id'] in current_shows_db_list:
series_to_update.append({'title': show["title"], series_to_update.append({'title': show["title"],
'path': show["path"], 'path': show["path"],
@ -101,7 +110,8 @@ def update_series():
'alternateTitles': alternate_titles, 'alternateTitles': alternate_titles,
'tags': str(tags), 'tags': str(tags),
'seriesType': show['seriesType'], 'seriesType': show['seriesType'],
'imdbId': imdbId}) 'imdbId': imdbId,
'sizeOnDisk': sizeOnDisk})
else: else:
series_to_add.append({'title': show["title"], series_to_add.append({'title': show["title"],
'path': show["path"], 'path': show["path"],
@ -117,19 +127,22 @@ def update_series():
'tags': str(tags), 'tags': str(tags),
'seriesType': show['seriesType'], 'seriesType': show['seriesType'],
'imdbId': imdbId, 'imdbId': imdbId,
'profileId': serie_default_profile}) 'profileId': serie_default_profile,
'sizeOnDisk': sizeOnDisk})
# Remove old series from DB # Remove old series from DB
removed_series = list(set(current_shows_db_list) - set(current_shows_sonarr)) removed_series = list(set(current_shows_db_list) - set(current_shows_sonarr))
for series in removed_series: for series in removed_series:
database.execute("DELETE FROM table_shows WHERE sonarrSeriesId=?",(series,)) database.execute("DELETE FROM table_shows WHERE sonarrSeriesId=?", (series,))
database.execute("DELETE FROM table_episodes WHERE sonarrSeriesId=?", (series,))
event_stream(type='series', action='delete', series=series) event_stream(type='series', action='delete', series=series)
# Update existing series in DB # Update existing series in DB
series_in_db_list = [] series_in_db_list = []
series_in_db = database.execute("SELECT title, path, tvdbId, sonarrSeriesId, overview, poster, fanart, " series_in_db = database.execute("SELECT title, path, tvdbId, sonarrSeriesId, overview, poster, fanart, "
"audio_language, sortTitle, year, alternateTitles, tags, seriesType, imdbId FROM table_shows") "audio_language, sortTitle, year, alternateTitles, tags, seriesType, imdbId, "
"sizeOnDisk FROM table_shows")
for item in series_in_db: for item in series_in_db:
series_in_db_list.append(item) series_in_db_list.append(item)
@ -142,6 +155,9 @@ def update_series():
query.values + (updated_series['sonarrSeriesId'],)) query.values + (updated_series['sonarrSeriesId'],))
event_stream(type='series', action='update', series=updated_series['sonarrSeriesId']) event_stream(type='series', action='update', series=updated_series['sonarrSeriesId'])
if updated_series['sonarrSeriesId'] in episodes_to_sync:
sync_episodes(series_id=updated_series['sonarrSeriesId'])
# Insert new series in DB # Insert new series in DB
for added_series in series_to_add: for added_series in series_to_add:
query = dict_converter.convert(added_series) query = dict_converter.convert(added_series)
@ -150,13 +166,15 @@ def update_series():
query.question_marks + ''')''', query.values) query.question_marks + ''')''', query.values)
if result: if result:
list_missing_subtitles(no=added_series['sonarrSeriesId']) list_missing_subtitles(no=added_series['sonarrSeriesId'])
event_stream(type='series', action='insert', id=added_series['sonarrSeriesId'])
if added_series['sonarrSeriesId'] in episodes_to_sync:
sync_episodes(series_id=added_series['sonarrSeriesId'])
else: else:
logging.debug('BAZARR unable to insert this series into the database:', logging.debug('BAZARR unable to insert this series into the database:',
path_mappings.path_replace(added_series['path'])) path_mappings.path_replace(added_series['path']))
event_stream(type='series', action='insert', series=added_series['sonarrSeriesId']) logging.debug('BAZARR All series synced from Sonarr into database.')
logging.debug('BAZARR All series synced from Sonarr into database.')
def get_profile_list(): def get_profile_list():

@ -163,6 +163,9 @@ if settings.analytics.visitor:
with open(os.path.normpath(os.path.join(args.config_dir, 'config', 'config.ini')), 'w+') as handle: with open(os.path.normpath(os.path.join(args.config_dir, 'config', 'config.ini')), 'w+') as handle:
settings.remove_option('general', 'throtteled_providers') settings.remove_option('general', 'throtteled_providers')
settings.remove_option('general', 'update_restart') settings.remove_option('general', 'update_restart')
settings.remove_option('sonarr', 'episodes_sync')
if settings.sonarr.series_sync == '1':
settings.sonarr.series_sync = '5'
settings.write(handle) settings.write(handle)

@ -1,6 +1,6 @@
# coding=utf-8 # coding=utf-8
from get_episodes import sync_episodes, update_all_episodes from get_episodes import update_all_episodes
from get_movies import update_movies, update_all_movies from get_movies import update_movies, update_all_movies
from get_series import update_series from get_series import update_series
from config import settings from config import settings
@ -143,18 +143,14 @@ class Scheduler:
if settings.general.getboolean('use_sonarr'): if settings.general.getboolean('use_sonarr'):
self.aps_scheduler.add_job( self.aps_scheduler.add_job(
update_series, IntervalTrigger(minutes=int(settings.sonarr.series_sync)), max_instances=1, update_series, IntervalTrigger(minutes=int(settings.sonarr.series_sync)), max_instances=1,
coalesce=True, misfire_grace_time=15, id='update_series', name='Update Series list from Sonarr', coalesce=True, misfire_grace_time=15, id='update_series', name='Sync with Sonarr',
replace_existing=True)
self.aps_scheduler.add_job(
sync_episodes, IntervalTrigger(minutes=int(settings.sonarr.episodes_sync)), max_instances=1,
coalesce=True, misfire_grace_time=15, id='sync_episodes', name='Sync episodes with Sonarr',
replace_existing=True) replace_existing=True)
def __radarr_update_task(self): def __radarr_update_task(self):
if settings.general.getboolean('use_radarr'): if settings.general.getboolean('use_radarr'):
self.aps_scheduler.add_job( self.aps_scheduler.add_job(
update_movies, IntervalTrigger(minutes=int(settings.radarr.movies_sync)), max_instances=1, update_movies, IntervalTrigger(minutes=int(settings.radarr.movies_sync)), max_instances=1,
coalesce=True, misfire_grace_time=15, id='update_movies', name='Update Movie list from Radarr', coalesce=True, misfire_grace_time=15, id='update_movies', name='Sync with Radarr',
replace_existing=True) replace_existing=True)
def __cache_cleanup_task(self): def __cache_cleanup_task(self):
@ -257,7 +253,6 @@ scheduler = Scheduler()
if 'BAZARR_AUDIO_PROFILES_MIGRATION' in os.environ: if 'BAZARR_AUDIO_PROFILES_MIGRATION' in os.environ:
if settings.general.getboolean('use_sonarr'): if settings.general.getboolean('use_sonarr'):
scheduler.aps_scheduler.modify_job('update_series', next_run_time=datetime.now()) scheduler.aps_scheduler.modify_job('update_series', next_run_time=datetime.now())
scheduler.aps_scheduler.modify_job('sync_episodes', next_run_time=datetime.now())
if settings.general.getboolean('use_radarr'): if settings.general.getboolean('use_radarr'):
scheduler.aps_scheduler.modify_job('update_movies', next_run_time=datetime.now()) scheduler.aps_scheduler.modify_job('update_movies', next_run_time=datetime.now())
del os.environ['BAZARR_AUDIO_PROFILES_MIGRATION'] del os.environ['BAZARR_AUDIO_PROFILES_MIGRATION']

@ -128,7 +128,6 @@ namespace Settings {
full_update_hour: number; full_update_hour: number;
only_monitored: boolean; only_monitored: boolean;
series_sync: number; series_sync: number;
episodes_sync: number;
excluded_tags: string[]; excluded_tags: string[];
excluded_series_types: SonarrSeriesType[]; excluded_series_types: SonarrSeriesType[];
} }

@ -9,7 +9,6 @@ import {
import { import {
dayOptions, dayOptions,
diskUpdateOptions, diskUpdateOptions,
episodesSyncOptions,
moviesSyncOptions, moviesSyncOptions,
seriesSyncOptions, seriesSyncOptions,
upgradeOptions, upgradeOptions,
@ -28,19 +27,13 @@ const SettingsSchedulerView: FunctionComponent = () => {
return ( return (
<SettingsProvider title="Scheduler - Bazarr (Settings)"> <SettingsProvider title="Scheduler - Bazarr (Settings)">
<Group header="Sonarr/Radarr Sync"> <Group header="Sonarr/Radarr Sync">
<Input name="Update Series List from Sonarr"> <Input name="Sync with Sonarr">
<Selector <Selector
options={seriesSyncOptions} options={seriesSyncOptions}
settingKey="settings-sonarr-series_sync" settingKey="settings-sonarr-series_sync"
></Selector> ></Selector>
</Input> </Input>
<Input name="Update Episodes List from Sonarr"> <Input name="Sync with Radarr">
<Selector
options={episodesSyncOptions}
settingKey="settings-sonarr-episodes_sync"
></Selector>
</Input>
<Input name="Update Movies List from Radarr">
<Selector <Selector
options={moviesSyncOptions} options={moviesSyncOptions}
settingKey="settings-radarr-movies_sync" settingKey="settings-radarr-movies_sync"

@ -1,12 +1,12 @@
export const seriesSyncOptions: SelectorOption<number>[] = [ export const seriesSyncOptions: SelectorOption<number>[] = [
{ label: "1 Minute", value: 1 },
{ label: "5 Minutes", value: 5 }, { label: "5 Minutes", value: 5 },
{ label: "15 Minutes", value: 15 }, { label: "15 Minutes", value: 15 },
{ label: "1 Hour", value: 60 }, { label: "1 Hour", value: 60 },
{ label: "3 Hours", value: 180 }, { label: "3 Hours", value: 180 },
{ label: "6 Hours", value: 360 },
]; ];
export const episodesSyncOptions: SelectorOption<number>[] = [ export const moviesSyncOptions: SelectorOption<number>[] = [
{ label: "5 Minutes", value: 5 }, { label: "5 Minutes", value: 5 },
{ label: "15 Minutes", value: 15 }, { label: "15 Minutes", value: 15 },
{ label: "1 Hour", value: 60 }, { label: "1 Hour", value: 60 },
@ -14,8 +14,6 @@ export const episodesSyncOptions: SelectorOption<number>[] = [
{ label: "6 Hours", value: 360 }, { label: "6 Hours", value: 360 },
]; ];
export const moviesSyncOptions = episodesSyncOptions;
export const diskUpdateOptions: SelectorOption<string>[] = [ export const diskUpdateOptions: SelectorOption<string>[] = [
{ label: "Manually", value: "Manually" }, { label: "Manually", value: "Manually" },
{ label: "Daily", value: "Daily" }, { label: "Daily", value: "Daily" },

Loading…
Cancel
Save