diff --git a/modules/plex.py b/modules/plex.py index c734ef29..00afd21c 100644 --- a/modules/plex.py +++ b/modules/plex.py @@ -362,47 +362,51 @@ class PlexAPI: def get_all_collections(self): return self.search(libtype="collection") - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def search(self, title=None, libtype=None, sort=None, maxresults=None, **kwargs): return self.Plex.search(title=title, sort=sort, maxresults=maxresults, libtype=libtype, **kwargs) - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) + def exact_search(self, title, libtype=None): + return self.Plex.search(libtype=libtype, **{"title=": title}) + + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def get_labeled_items(self, label): return self.Plex.search(label=label) - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def fetchItem(self, data): return self.PlexServer.fetchItem(data) - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def get_all(self): return self.Plex.all() - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def server_search(self, data): return self.PlexServer.search(data) - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def query(self, method): return method() - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def query_data(self, method, data): return method(data) - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def collection_mode_query(self, collection, data): collection.modeUpdate(mode=data) - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def collection_order_query(self, collection, data): collection.sortUpdate(sort=data) - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def get_guids(self, item): return item.guids - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def edit_query(self, item, edits, advanced=False): if advanced: item.editAdvanced(**edits) @@ -410,7 +414,7 @@ class PlexAPI: item.edit(**edits) item.reload() - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def upload_image(self, item, location, poster=True, url=True): if poster and url: item.uploadPoster(url=location) @@ -432,11 +436,11 @@ class PlexAPI: except NotFound: raise Failed(f"Collection Error: plex search attribute: {search_name} only supported with Plex's New TV Agent") - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def get_labels(self): return {label.title: label.key for label in self.Plex.listFilterChoices(field="label")} - @retry(stop_max_attempt_number=6, wait_fixed=10000) + @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_plex) def _query(self, key, post=False, put=False): if post: method = self.Plex._server._session.post elif put: method = self.Plex._server._session.put @@ -707,8 +711,8 @@ class PlexAPI: elif method_name == "filepath": jailbreak = False for location in current.locations: - for location_prefix in filter_data: - if location.startswith(location_prefix): + for check_text in filter_data: + if check_text.lower() in location.lower(): jailbreak = True break if jailbreak: break diff --git a/modules/tautulli.py b/modules/tautulli.py index 252a20bc..5e2f2441 100644 --- a/modules/tautulli.py +++ b/modules/tautulli.py @@ -1,6 +1,8 @@ import logging, requests from modules import util from modules.util import Failed +from plexapi.exceptions import BadRequest, NotFound +from plexapi.video import Movie, Show from retrying import retry logger = logging.getLogger("Plex Meta Manager") @@ -37,7 +39,18 @@ class TautulliAPI: count = 0 for item in items: if item["section_id"] == section_id and count < int(stats_count): - rating_keys.append(item["rating_key"]) + rk = None + try: + library.fetchItem(int(item["rating_key"])) + rk = item["rating_key"] + except (BadRequest, NotFound): + new_item = library.exact_search(item["title"]) + if new_item: + rk = new_item[0].ratingKey + else: + logger.error(f"Plex Error: Item {item} not found") + continue + rating_keys.append(rk) count += 1 return rating_keys diff --git a/modules/util.py b/modules/util.py index dbb6e77c..ad65760d 100644 --- a/modules/util.py +++ b/modules/util.py @@ -1,5 +1,6 @@ import logging, re, signal, sys, time, traceback from datetime import datetime +from plexapi.exceptions import BadRequest, NotFound, Unauthorized try: import msvcrt @@ -19,6 +20,9 @@ class Failed(Exception): def retry_if_not_failed(exception): return not isinstance(exception, Failed) +def retry_if_not_plex(exception): + return not isinstance(exception, (BadRequest, NotFound, Unauthorized)) + separating_character = "=" screen_width = 100