Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Force updating of shows that are marked for a show update, but not ma… #10330

Merged
merged 3 commits into from
Feb 14, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#### New Features

#### Improvements
- Improve show updates. Update the complete show when marked updated by indexer, without an indication to update a season. ([10330](https://github.com/pymedusa/Medusa/pull/10330))

#### Fixes

Expand Down
80 changes: 43 additions & 37 deletions medusa/schedulers/show_updater.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def run(self, force=False):
# Refresh the exceptions_cache from db.
refresh_exceptions_cache()

logger.info(u'Started periodic show updates')
logger.info('Started periodic show updates')

# Cache for the indexers list of updated show
indexer_updated_shows = {}
Expand All @@ -48,16 +48,16 @@ def run(self, force=False):
# Loop through the list of shows, and per show evaluate if we can use the .get_last_updated_seasons()
for show in app.showList:
if show.paused:
logger.info(u'The show {show} is paused, not updating it.', show=show.name)
logger.info('The show {show} is paused, not updating it.', show=show.name)
continue

indexer_name = indexerApi(show.indexer).name
indexer_api_params = indexerApi(show.indexer).api_params.copy()
try:
indexer_api = indexerApi(show.indexer).indexer(**indexer_api_params)
except IndexerUnavailable:
logger.warning(u'Problem running show_updater, Indexer {indexer_name} seems to be having '
u'connectivity issues. While trying to look for show updates on show: {show}',
logger.warning('Problem running show_updater, Indexer {indexer_name} seems to be having '
'connectivity issues. While trying to look for show updates on show: {show}',
indexer_name=indexer_name, show=show.name)
continue

Expand All @@ -78,46 +78,46 @@ def run(self, force=False):
last_updates[indexer_name], update_max_weeks
)
except IndexerUnavailable:
logger.warning(u'Problem running show_updater, Indexer {indexer_name} seems to be having '
u'connectivity issues while trying to look for show updates on show: {show}',
logger.warning('Problem running show_updater, Indexer {indexer_name} seems to be having '
'connectivity issues while trying to look for show updates on show: {show}',
indexer_name=indexer_name, show=show.name)
continue
except IndexerException as error:
logger.warning(u'Problem running show_updater, Indexer {indexer_name} seems to be having '
u'issues while trying to get updates for show {show}. Cause: {cause!r}',
logger.warning('Problem running show_updater, Indexer {indexer_name} seems to be having '
'issues while trying to get updates for show {show}. Cause: {cause!r}',
indexer_name=indexer_name, show=show.name, cause=error)
continue
except RequestException as error:
logger.warning(u'Problem running show_updater, Indexer {indexer_name} seems to be having '
u'issues while trying to get updates for show {show}. Cause: {cause!r}',
logger.warning('Problem running show_updater, Indexer {indexer_name} seems to be having '
'issues while trying to get updates for show {show}. Cause: {cause!r}',
indexer_name=indexer_name, show=show.name, cause=error)

if isinstance(error, HTTPError):
if error.response.status_code == 503:
logger.warning(u'API Service offline: '
u'This service is temporarily offline, try again later.')
logger.warning('API Service offline: '
'This service is temporarily offline, try again later.')
elif error.response.status_code == 429:
logger.warning(u'Your request count (#) is over the allowed limit of (40).')
logger.warning('Your request count (#) is over the allowed limit of (40).')
continue
except Exception as error:
logger.exception(u'Problem running show_updater, Indexer {indexer_name} seems to be having '
u'issues while trying to get updates for show {show}. Cause: {cause!r}.',
logger.exception('Problem running show_updater, Indexer {indexer_name} seems to be having '
'issues while trying to get updates for show {show}. Cause: {cause!r}.',
indexer_name=indexer_name, show=show.name, cause=error)
continue

# Update shows that were updated in the last X weeks
# or were not updated within the last X weeks
if show.indexerid not in indexer_updated_shows.get(show.indexer, []):
if show.last_update_indexer > time.time() - 604800 * update_max_weeks:
logger.debug(u'Skipping show update for {show}. Show was not in the '
u'indexers {indexer_name} list with updated shows and it '
u'was updated within the last {weeks} weeks.', show=show.name,
logger.debug('Skipping show update for {show}. Show was not in the '
'indexers {indexer_name} list with updated shows and it '
'was updated within the last {weeks} weeks.', show=show.name,
indexer_name=indexer_name, weeks=update_max_weeks)
continue

# If indexer doesn't have season updates.
if not hasattr(indexer_api, 'get_last_updated_seasons'):
logger.debug(u'Adding the following show for full update to queue: {show}', show=show.name)
logger.debug('Adding the following show for full update to queue: {show}', show=show.name)
refresh_shows.append(show)

# Else fall back to per season updates.
Expand All @@ -127,46 +127,52 @@ def run(self, force=False):
updated_seasons = indexer_api.get_last_updated_seasons(
[show.indexerid], show.last_update_indexer, update_max_weeks)
except IndexerUnavailable:
logger.warning(u'Problem running show_updater, Indexer {indexer_name} seems to be having '
u'connectivity issues while trying to look for show updates for show: {show}',
logger.warning('Problem running show_updater, Indexer {indexer_name} seems to be having '
'connectivity issues while trying to look for show updates for show: {show}',
indexer_name=indexer_name, show=show.name)
continue
except IndexerException as error:
logger.warning(u'Problem running show_updater, Indexer {indexer_name} seems to be having '
u'issues while trying to get updates for show {show}. Cause: {cause!r}',
logger.warning('Problem running show_updater, Indexer {indexer_name} seems to be having '
'issues while trying to get updates for show {show}. Cause: {cause!r}',
indexer_name=indexer_name, show=show.name, cause=error)
continue
except Exception as error:
logger.exception(u'Problem running show_updater, Indexer {indexer_name} seems to be having '
u'issues while trying to get updates for show {show}. Cause: {cause!r}',
logger.exception('Problem running show_updater, Indexer {indexer_name} seems to be having '
'issues while trying to get updates for show {show}. Cause: {cause!r}',
indexer_name=indexer_name, show=show.name, cause=error)
continue

if updated_seasons[show.indexerid]:
logger.info(u'{show_name}: Adding the following seasons for update to queue: {seasons}',
logger.info('{show_name}: Adding the following seasons for update to queue: {seasons}',
show_name=show.name, seasons=updated_seasons[show.indexerid])
season_updates.append((show.indexer, show, updated_seasons[show.indexerid]))
elif show.indexerid in indexer_updated_shows.get(show.indexer, []):
# This show was marked to have an update, but it didn't get a season update. Let's fully
# update the show anyway.
logger.debug('Could not detect a season update, but an update is required. \n'
'Adding the following show for full update to queue: {show}', show=show.name)
refresh_shows.append(show)

pi_list = []
# Full refreshes
for show in refresh_shows:
logger.info(u'Full update on show: {show}', show=show.name)
logger.info('Full update on show: {show}', show=show.name)
try:
pi_list.append(app.show_queue_scheduler.action.updateShow(show))
except (CantUpdateShowException, CantRefreshShowException) as e:
logger.warning(u'Automatic update failed. Error: {error}', error=e)
logger.warning('Automatic update failed. Error: {error}', error=e)
except Exception as e:
logger.error(u'Automatic update failed: Error: {error}', error=e)
logger.error('Automatic update failed: Error: {error}', error=e)

# Only update expired season
for show in season_updates:
logger.info(u'Updating season {season} for show: {show}.', season=show[2], show=show[1].name)
logger.info('Updating season {season} for show: {show}.', season=show[2], show=show[1].name)
try:
pi_list.append(app.show_queue_scheduler.action.updateShow(show[1], season=show[2]))
except CantUpdateShowException as e:
logger.warning(u'Automatic update failed. Error: {error}', error=e)
logger.warning('Automatic update failed. Error: {error}', error=e)
except Exception as e:
logger.error(u'Automatic update failed: Error: {error}', error=e)
logger.error('Automatic update failed: Error: {error}', error=e)

ui.ProgressIndicators.setIndicator('dailyUpdate', ui.QueueProgressIndicator('Daily Update', pi_list))

Expand All @@ -176,20 +182,20 @@ def run(self, force=False):
try:
app.show_queue_scheduler.action.refreshShow(show, True)
except CantRefreshShowException as e:
logger.warning(u'Show refresh on show {show_name} failed. Error: {error}',
logger.warning('Show refresh on show {show_name} failed. Error: {error}',
show_name=show.name, error=e)
except Exception as e:
logger.error(u'Show refresh on show {show_name} failed: Unexpected Error: {error}',
logger.error('Show refresh on show {show_name} failed: Unexpected Error: {error}',
show_name=show.name, error=e)

if refresh_shows or season_updates:
for indexer in set([s.indexer for s in refresh_shows] + [s[1].indexer for s in season_updates]):
indexer_api = indexerApi(indexer)
self.update_cache.set_last_indexer_update(indexer_api.name)
logger.info(u'Updated lastUpdate timestamp for {indexer_name}', indexer_name=indexer_api.name)
logger.info(u'Completed scheduling updates on shows')
logger.info('Updated lastUpdate timestamp for {indexer_name}', indexer_name=indexer_api.name)
logger.info('Completed scheduling updates on shows')
else:
logger.info(u'Completed scheduling updates on shows, but there was nothing to update')
logger.info('Completed scheduling updates on shows, but there was nothing to update')

self.amActive = False

Expand Down