From aa40c82bd75aa0fa106becc6e1e64d83ede2e23b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:16:03 +0200 Subject: [PATCH 01/16] Add named logger to MediaFactory --- plextraktsync/media/MediaFactory.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/plextraktsync/media/MediaFactory.py b/plextraktsync/media/MediaFactory.py index b17bbdcf0d..b553263608 100644 --- a/plextraktsync/media/MediaFactory.py +++ b/plextraktsync/media/MediaFactory.py @@ -6,7 +6,7 @@ from requests import RequestException from trakt.errors import TraktException -from plextraktsync.factory import logger +from plextraktsync.factory import logging from plextraktsync.media.Media import Media if TYPE_CHECKING: @@ -25,18 +25,19 @@ class MediaFactory: def __init__(self, plex: PlexApi, trakt: TraktApi): self.plex = plex self.trakt = trakt + self.logger = logging.getLogger(__name__) def resolve_any(self, pm: PlexLibraryItem, show: Media = None) -> Media | None: try: guids = pm.guids except (PlexApiException, RequestException) as e: - logger.error(f"Skipping {pm}: {e}") + self.logger.error(f"Skipping {pm}: {e}") return None for guid in guids: m = self.resolve_guid(guid, show) if m: - logger.debug(f"Resolved {guid} of {guid.pm} to {m}") + self.logger.debug(f"Resolved {guid} of {guid.pm} to {m}") return m return None @@ -55,7 +56,7 @@ def resolve_guid(self, guid: PlexGuid, show: Media = None): level = "error" reason = "is not a valid provider" - getattr(logger, level)(f"{error} {reason}", extra={"markup": True}) + getattr(self.logger, level)(f"{error} {reason}", extra={"markup": True}) return None @@ -65,11 +66,11 @@ def resolve_guid(self, guid: PlexGuid, show: Media = None): else: tm = self.trakt.find_by_guid(guid) except (TraktException, RequestException) as e: - logger.warning(f"{guid.title_link}: Skipping {guid}: Trakt errors: {e}", extra={"markup": True}) + self.logger.warning(f"{guid.title_link}: Skipping {guid}: Trakt errors: {e}", extra={"markup": True}) return None if tm is None: - logger.warning(f"{guid.title_link}: Skipping {guid} not found on Trakt", extra={"markup": True}) + self.logger.warning(f"{guid.title_link}: Skipping {guid} not found on Trakt", extra={"markup": True}) return None return self.make_media(guid.pm, tm) From 52e8dd623fc00fa8432ecc0d7e70e505bf4c8a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:20:24 +0200 Subject: [PATCH 02/16] Use automatic logger name --- plextraktsync/plan/Walker.py | 2 +- plextraktsync/plex/PlexPlaylist.py | 2 +- plextraktsync/plex/PlexServerConnection.py | 2 +- plextraktsync/queue/BackgroundTask.py | 2 +- plextraktsync/queue/TraktBatchWorker.py | 2 +- plextraktsync/queue/TraktMarkWatchedWorker.py | 2 +- plextraktsync/queue/TraktScrobbleWorker.py | 2 +- plextraktsync/trakt/ScrobblerProxy.py | 2 +- plextraktsync/trakt/TraktUserList.py | 2 +- plextraktsync/trakt/TraktUserListCollection.py | 2 +- plextraktsync/util/Timer.py | 2 +- plextraktsync/watch/EventDispatcher.py | 2 +- plextraktsync/watch/WatchStateUpdater.py | 2 +- plextraktsync/watch/WebSocketListener.py | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/plextraktsync/plan/Walker.py b/plextraktsync/plan/Walker.py index aa587275ce..4cada83587 100644 --- a/plextraktsync/plan/Walker.py +++ b/plextraktsync/plan/Walker.py @@ -41,7 +41,7 @@ def __init__( self.trakt = trakt self.mf = mf self.config = config - self.logger = logging.getLogger("PlexTraktSync.Walker") + self.logger = logging.getLogger(__name__) @cached_property def plan(self): diff --git a/plextraktsync/plex/PlexPlaylist.py b/plextraktsync/plex/PlexPlaylist.py index efbbe0a9ee..d4741ce1ea 100644 --- a/plextraktsync/plex/PlexPlaylist.py +++ b/plextraktsync/plex/PlexPlaylist.py @@ -19,7 +19,7 @@ class PlexPlaylist(RichMarkup): def __init__(self, server: PlexServer, name: str): self.server = server self.name = name - self.logger = logging.getLogger("PlexTraktSync.PlexPlaylist") + self.logger = logging.getLogger(__name__) def __iter__(self): return iter(self.items) diff --git a/plextraktsync/plex/PlexServerConnection.py b/plextraktsync/plex/PlexServerConnection.py index b082427dd2..8cc735a420 100644 --- a/plextraktsync/plex/PlexServerConnection.py +++ b/plextraktsync/plex/PlexServerConnection.py @@ -14,7 +14,7 @@ class PlexServerConnection: def __init__(self, factory: Factory): self.factory = factory - self.logger = logging.getLogger("PlexTraktSync.PlexServerConnection") + self.logger = logging.getLogger(__name__) @property def timeout(self): diff --git a/plextraktsync/queue/BackgroundTask.py b/plextraktsync/queue/BackgroundTask.py index 863334ee1b..46116d19c9 100644 --- a/plextraktsync/queue/BackgroundTask.py +++ b/plextraktsync/queue/BackgroundTask.py @@ -22,7 +22,7 @@ def __init__(self, timer: Timer = None, *tasks): self.queues = defaultdict(list) self.timer = timer self.tasks = tasks - self.logger = logging.getLogger("PlexTraktSync.BackgroundTask") + self.logger = logging.getLogger(__name__) def check_timer(self): if not self.timer: diff --git a/plextraktsync/queue/TraktBatchWorker.py b/plextraktsync/queue/TraktBatchWorker.py index 03249f448d..da8288efca 100644 --- a/plextraktsync/queue/TraktBatchWorker.py +++ b/plextraktsync/queue/TraktBatchWorker.py @@ -19,7 +19,7 @@ class TraktBatchWorker: ) def __init__(self): - self.logger = logging.getLogger("PlexTraktSync.TraktBatchWorker") + self.logger = logging.getLogger(__name__) def __call__(self, queues): for name in self.QUEUES: diff --git a/plextraktsync/queue/TraktMarkWatchedWorker.py b/plextraktsync/queue/TraktMarkWatchedWorker.py index 3551dcec3c..e3877b17a4 100644 --- a/plextraktsync/queue/TraktMarkWatchedWorker.py +++ b/plextraktsync/queue/TraktMarkWatchedWorker.py @@ -16,7 +16,7 @@ class TraktMarkWatchedWorker: QUEUE = "add_to_history" def __init__(self): - self.logger = logging.getLogger("PlexTraktSync.TraktMarkWatchedWorker") + self.logger = logging.getLogger(__name__) def __call__(self, queues): items = queues[self.QUEUE] diff --git a/plextraktsync/queue/TraktScrobbleWorker.py b/plextraktsync/queue/TraktScrobbleWorker.py index 8c0e155f3e..3378b88972 100644 --- a/plextraktsync/queue/TraktScrobbleWorker.py +++ b/plextraktsync/queue/TraktScrobbleWorker.py @@ -22,7 +22,7 @@ class TraktScrobbleWorker: ) def __init__(self): - self.logger = logging.getLogger("PlexTraktSync.TraktScrobbleWorker") + self.logger = logging.getLogger(__name__) def __call__(self, queues): for name in self.QUEUES: diff --git a/plextraktsync/trakt/ScrobblerProxy.py b/plextraktsync/trakt/ScrobblerProxy.py index df472b22ef..1a03c224f4 100644 --- a/plextraktsync/trakt/ScrobblerProxy.py +++ b/plextraktsync/trakt/ScrobblerProxy.py @@ -17,7 +17,7 @@ class ScrobblerProxy: def __init__(self, scrobbler: Scrobbler, threshold=80): self.scrobbler = scrobbler self.threshold = threshold - self.logger = logging.getLogger("PlexTraktSync.ScrobblerProxy") + self.logger = logging.getLogger(__name__) def update(self, progress: float): self.logger.debug(f"update({self.scrobbler.media}): {progress}") diff --git a/plextraktsync/trakt/TraktUserList.py b/plextraktsync/trakt/TraktUserList.py index 1121da7139..468fc346d2 100644 --- a/plextraktsync/trakt/TraktUserList.py +++ b/plextraktsync/trakt/TraktUserList.py @@ -25,7 +25,7 @@ def __init__(self, self._items = items self.description = None self.plex_items = [] - self.logger = logging.getLogger("PlexTraktSync.TraktUserList") + self.logger = logging.getLogger(__name__) def __iter__(self): return iter(self.items) diff --git a/plextraktsync/trakt/TraktUserListCollection.py b/plextraktsync/trakt/TraktUserListCollection.py index 1159615a69..63e521fcf2 100644 --- a/plextraktsync/trakt/TraktUserListCollection.py +++ b/plextraktsync/trakt/TraktUserListCollection.py @@ -14,7 +14,7 @@ class TraktUserListCollection(UserList): def __init__(self): super().__init__() - self.logger = logging.getLogger("PlexTraktSync.TraktUserListCollection") + self.logger = logging.getLogger(__name__) def add_to_lists(self, m: Media): # Skip movie editions diff --git a/plextraktsync/util/Timer.py b/plextraktsync/util/Timer.py index 9c5db8eb1a..7b92e53a62 100644 --- a/plextraktsync/util/Timer.py +++ b/plextraktsync/util/Timer.py @@ -13,7 +13,7 @@ def __init__(self, delay: float): raise ValueError(f"Delay must be a positive number: {delay}") self.delay = delay self.last_time = None - self.logger = logging.getLogger("PlexTraktSync.Timer") + self.logger = logging.getLogger(__name__) @property def time_remaining(self): diff --git a/plextraktsync/watch/EventDispatcher.py b/plextraktsync/watch/EventDispatcher.py index 995a6a09a9..e6c6209ef2 100644 --- a/plextraktsync/watch/EventDispatcher.py +++ b/plextraktsync/watch/EventDispatcher.py @@ -7,7 +7,7 @@ class EventDispatcher: def __init__(self): self.event_listeners = [] self.event_factory = EventFactory() - self.logger = logging.getLogger("PlexTraktSync.EventDispatcher") + self.logger = logging.getLogger(__name__) def on(self, event_type, listener, **kwargs): self.event_listeners.append( diff --git a/plextraktsync/watch/WatchStateUpdater.py b/plextraktsync/watch/WatchStateUpdater.py index 56308e6adc..e437af2a0f 100644 --- a/plextraktsync/watch/WatchStateUpdater.py +++ b/plextraktsync/watch/WatchStateUpdater.py @@ -29,7 +29,7 @@ def __init__( self.plex = plex self.trakt = trakt self.mf = mf - self.logger = logging.getLogger("PlexTraktSync.WatchStateUpdater") + self.logger = logging.getLogger(__name__) self.config = config self.remove_collection = config["watch"]["remove_collection"] self.add_collection = config["watch"]["add_collection"] diff --git a/plextraktsync/watch/WebSocketListener.py b/plextraktsync/watch/WebSocketListener.py index 15ccebc632..480ea2e31a 100644 --- a/plextraktsync/watch/WebSocketListener.py +++ b/plextraktsync/watch/WebSocketListener.py @@ -17,7 +17,7 @@ def __init__(self, plex: PlexServer, poll_interval=5, restart_interval=15): self.poll_interval = poll_interval self.restart_interval = restart_interval self.dispatcher = EventDispatcher() - self.logger = logging.getLogger("PlexTraktSync.WebSocketListener") + self.logger = logging.getLogger(__name__) def on(self, event_type, listener, **kwargs): self.dispatcher.on(event_type, listener, **kwargs) From 4fc9dfcb674b1d9f983a69f6edbc1ac957542dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:22:58 +0200 Subject: [PATCH 03/16] Update logger names to filter --- plextraktsync/util/Factory.py | 37 +++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/plextraktsync/util/Factory.py b/plextraktsync/util/Factory.py index ee634995d9..e457440aea 100644 --- a/plextraktsync/util/Factory.py +++ b/plextraktsync/util/Factory.py @@ -228,18 +228,35 @@ def logging(self): @cached_property def logger(self): - logger = self.logging.getLogger("PlexTraktSync") + logger = self.logging.getLogger("plextraktsync") config = self.config loggers = [ - "PlexTraktSync", - "PlexTraktSync.BackgroundTask", - "PlexTraktSync.EventDispatcher", - "PlexTraktSync.PlexServerConnection", - "PlexTraktSync.ScrobblerProxy", - "PlexTraktSync.Timer", - "PlexTraktSync.TraktBatchWorker", - "PlexTraktSync.WatchStateUpdater", - "PlexTraktSync.WebSocketListener", + "plextraktsync", + "plextraktsync.cli", + "plextraktsync.commands.sync", + "plextraktsync.decorators.measure_time", + "plextraktsync.decorators.rate_limit", + "plextraktsync.decorators.retry", + "plextraktsync.media.MediaFactory", + "plextraktsync.plan.Walker", + "plextraktsync.plex.PlexApi", + "plextraktsync.plex.PlexPlaylist", + "plextraktsync.plex.PlexServerConnection", + "plextraktsync.queue.BackgroundTask", + "plextraktsync.queue.TraktBatchWorker", + "plextraktsync.queue.TraktMarkWatchedWorker", + "plextraktsync.queue.TraktScrobbleWorker", + "plextraktsync.sync", + "plextraktsync.trakt.ScrobblerProxy", + "plextraktsync.trakt.TraktApi", + "plextraktsync.trakt.TraktLookup", + "plextraktsync.trakt.TraktUserList", + "plextraktsync.trakt.TraktUserListCollection", + "plextraktsync.util.Factory", + "plextraktsync.util.Timer", + "plextraktsync.watch.EventDispatcher", + "plextraktsync.watch.WatchStateUpdater", + "plextraktsync.watch.WebSocketListener", ] loggers.extend(config["logging"]["filter_loggers"] or []) From 7f93e382d120440b507fb4168f96e4b16c4116b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:25:40 +0200 Subject: [PATCH 04/16] Use named logger in TraktApi --- plextraktsync/trakt/TraktApi.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/plextraktsync/trakt/TraktApi.py b/plextraktsync/trakt/TraktApi.py index a295bc0ff5..7e2ef3b1ff 100644 --- a/plextraktsync/trakt/TraktApi.py +++ b/plextraktsync/trakt/TraktApi.py @@ -17,7 +17,7 @@ from plextraktsync.decorators.rate_limit import rate_limit from plextraktsync.decorators.retry import retry from plextraktsync.decorators.time_limit import time_limit -from plextraktsync.factory import factory, logger +from plextraktsync.factory import factory, logging from plextraktsync.path import pytrakt_file from plextraktsync.trakt.PartialTraktMedia import PartialTraktMedia from plextraktsync.trakt.TraktLookup import TraktLookup @@ -41,6 +41,7 @@ class TraktApi: def __init__(self): trakt.core.CONFIG_PATH = pytrakt_file trakt.core.session = factory.session + self.logger = logging.getLogger(__name__) @staticmethod def device_auth(client_id: str, client_secret: str): @@ -55,7 +56,7 @@ def me(self): try: return trakt.users.User("me") except OAuthRefreshException as e: - logger.error(f"{e.error}: {e.error_description}") + self.logger.error(f"{e.error}: {e.error_description}") raise ClickException("Trakt error: Unable to refresh token") except (OAuthException, ForbiddenException) as e: raise ClickException(f"Trakt authentication error: {str(e)}") @@ -240,7 +241,7 @@ def find_by_guid(self, guid: PlexGuid): tm = self.search_by_id(guid.id, id_type=guid.provider, media_type=guid.type) if tm is None and guid.type == "movie": if self.search_by_id(guid.id, id_type=guid.provider, media_type="show"): - logger.warning(f"Found match using show search: {guid.title_link}", extra={"markup": True}) + self.logger.warning(f"Found match using show search: {guid.title_link}", extra={"markup": True}) return tm @@ -251,16 +252,16 @@ def search_by_id(self, media_id: str, id_type: str, media_type: str) -> TVShow | # Skip invalid search. # The Trakt API states that tvdb is only for shows and episodes: # https://trakt.docs.apiary.io/#reference/search/id-lookup/get-id-lookup-results - logger.debug(f"search_by_id: tvdb does not support movie provider, skip {id_type}/{media_type}/{media_id}") + self.logger.debug(f"search_by_id: tvdb does not support movie provider, skip {id_type}/{media_type}/{media_id}") return None if media_type == "season": # Search by season is missing # https://github.com/Taxel/PlexTraktSync/issues/1117#issuecomment-1286884897 - logger.debug("trakt does not support search by season") + self.logger.debug("trakt does not support search by season") return None if not self.valid_trakt_id(media_id): - logger.error(f"Ignoring invalid id: '{media_id}'") + self.logger.error(f"Ignoring invalid id: '{media_id}'") return None @@ -271,8 +272,8 @@ def search_by_id(self, media_id: str, id_type: str, media_type: str) -> TVShow | return None if len(search) > 1: - logger.debug(f"search_by_id({media_id}, {id_type}, {media_type}) got {len(search)} results, taking first one") - logger.debug([pm.to_json() for pm in search]) + self.logger.debug(f"search_by_id({media_id}, {id_type}, {media_type}) got {len(search)} results, taking first one") + self.logger.debug([pm.to_json() for pm in search]) # TODO: sort by "score"? return search[0] @@ -302,7 +303,7 @@ def find_episode_guid(self, guid: PlexGuid, lookup: TraktLookup): if te: return te - logger.debug(f"Retry using search for specific Plex Episode {guid.guid}") + self.logger.debug(f"Retry using search for specific Plex Episode {guid.guid}") if not guid.is_episode: return self.find_by_guid(guid) return None From a5d1f5102d3c093156c13439f138a17e5a77c08b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:26:59 +0200 Subject: [PATCH 05/16] Use named logger in PlexApi --- plextraktsync/plex/PlexApi.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/plextraktsync/plex/PlexApi.py b/plextraktsync/plex/PlexApi.py index 61d36a2692..d92582a29c 100644 --- a/plextraktsync/plex/PlexApi.py +++ b/plextraktsync/plex/PlexApi.py @@ -12,7 +12,7 @@ from plextraktsync.decorators.flatten import flatten_dict, flatten_list from plextraktsync.decorators.memoize import memoize from plextraktsync.decorators.retry import retry -from plextraktsync.factory import factory, logger +from plextraktsync.factory import factory, logging from plextraktsync.plex.PlexId import PlexId from plextraktsync.plex.PlexLibraryItem import PlexLibraryItem from plextraktsync.plex.PlexLibrarySection import PlexLibrarySection @@ -38,6 +38,7 @@ def __init__( ): self.server = server self.config = config + self.logger = logging.getLogger(__name__) def __str__(self): return str(self.server) @@ -160,7 +161,7 @@ def history(self, m, device=False, account=False): try: history = m.history() except Unauthorized as e: - logger.debug(f"No permission to access play history: {e}") + self.logger.debug(f"No permission to access play history: {e}") return for h in history: @@ -200,17 +201,17 @@ def account(self): plex_owner_account = MyPlexAccount(token=plex_owner_token, session=factory.session) return plex_owner_account.switchHomeUser(plex_username) except BadRequest as e: - logger.error(f"Error during {plex_username} account access: {e}") + self.logger.error(f"Error during {plex_username} account access: {e}") elif plex_account_token: try: return MyPlexAccount(token=plex_account_token, session=factory.session) except BadRequest as e: - logger.error(f"Error during {plex_username} account access: {e}") + self.logger.error(f"Error during {plex_username} account access: {e}") else: try: return self.server.myPlexAccount() except BadRequest as e: - logger.error(f"Error during {plex_username} account access: {e}") + self.logger.error(f"Error during {plex_username} account access: {e}") return None def watchlist(self, libtype=None) -> list[Movie | Show] | None: @@ -225,20 +226,20 @@ def watchlist(self, libtype=None) -> list[Movie | Show] | None: try: return self.account.watchlist(libtype=libtype, **params) except BadRequest as e: - logger.error(f"Error during {self.account.username} watchlist access: {e}") + self.logger.error(f"Error during {self.account.username} watchlist access: {e}") return None def add_to_watchlist(self, item): try: self.account.addToWatchlist(item) except BadRequest as e: - logger.error(f"Error when adding {item.title} to Plex watchlist: {e}") + self.logger.error(f"Error when adding {item.title} to Plex watchlist: {e}") def remove_from_watchlist(self, item): try: self.account.removeFromWatchlist(item) except BadRequest as e: - logger.error(f"Error when removing {item.title} from Plex watchlist: {e}") + self.logger.error(f"Error when removing {item.title} from Plex watchlist: {e}") @retry() def search_online(self, title: str, media_type: str): @@ -247,7 +248,7 @@ def search_online(self, title: str, media_type: str): try: result = self.account.searchDiscover(title, libtype=media_type) except (BadRequest, Unauthorized) as e: - logger.error(f"{title}: Searching Plex Discover error: {e}") + self.logger.error(f"{title}: Searching Plex Discover error: {e}") return None except NotFound: return None @@ -261,6 +262,6 @@ def reset_show(self, show: Show, reset_date: datetime): self.mark_unwatched(ep) reset_count += 1 else: - logger.debug( + self.logger.debug( f"{show.title} {ep.seasonEpisode} watched at {ep.lastViewedAt} after reset date {reset_date}") - logger.debug(f"{show.title}: {reset_count} Plex episode(s) marked as unwatched.") + self.logger.debug(f"{show.title}: {reset_count} Plex episode(s) marked as unwatched.") From 023982013f6bef7f0cfdd2b48f6567e52cbc8050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:27:59 +0200 Subject: [PATCH 06/16] Use named logger in decorators --- plextraktsync/decorators/measure_time.py | 5 +++-- plextraktsync/decorators/rate_limit.py | 4 +++- plextraktsync/decorators/retry.py | 4 +++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/plextraktsync/decorators/measure_time.py b/plextraktsync/decorators/measure_time.py index 8294a87409..fb70b6033e 100644 --- a/plextraktsync/decorators/measure_time.py +++ b/plextraktsync/decorators/measure_time.py @@ -1,8 +1,9 @@ -import logging from contextlib import contextmanager from time import time -from plextraktsync.factory import logger +from plextraktsync.factory import logging + +logger = logging.getLogger(__name__) @contextmanager diff --git a/plextraktsync/decorators/rate_limit.py b/plextraktsync/decorators/rate_limit.py index 5a82d4cc84..30078c7025 100644 --- a/plextraktsync/decorators/rate_limit.py +++ b/plextraktsync/decorators/rate_limit.py @@ -4,7 +4,9 @@ from click import ClickException from trakt.errors import RateLimitException -from plextraktsync.factory import logger +from plextraktsync.factory import logging + +logger = logging.getLogger(__name__) # https://trakt.docs.apiary.io/#introduction/rate-limiting diff --git a/plextraktsync/decorators/retry.py b/plextraktsync/decorators/retry.py index ee01d72e9a..c018089abd 100644 --- a/plextraktsync/decorators/retry.py +++ b/plextraktsync/decorators/retry.py @@ -7,7 +7,9 @@ from trakt.errors import (BadResponseException, TraktBadGateway, TraktInternalException, TraktUnavailable) -from plextraktsync.factory import logger +from plextraktsync.factory import logging + +logger = logging.getLogger(__name__) def retry(retries=5): From 510d33af96b637f6daaf2027b23e3c3050d41989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:33:34 +0200 Subject: [PATCH 07/16] Use named logger in Sync class --- plextraktsync/sync/Sync.py | 39 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/plextraktsync/sync/Sync.py b/plextraktsync/sync/Sync.py index 128aa18b6f..2604e534ca 100644 --- a/plextraktsync/sync/Sync.py +++ b/plextraktsync/sync/Sync.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from plextraktsync.decorators.measure_time import measure_time -from plextraktsync.factory import logger +from plextraktsync.factory import logging from plextraktsync.trakt.TraktUserListCollection import TraktUserListCollection if TYPE_CHECKING: @@ -23,6 +23,7 @@ def __init__(self, config: SyncConfig, plex: PlexApi, trakt: TraktApi): self.config = config self.plex = plex self.trakt = trakt + self.logger = logging.getLogger(__name__) @cached_property def plex_wl(self): @@ -45,17 +46,17 @@ def sync(self, walker: Walker, dry_run=False): is_partial = walker.is_partial and not dry_run if is_partial and self.config.clear_collected: - logger.warning("Running partial library sync. Clear collected will be disabled.") + self.logger.warning("Running partial library sync. Clear collected will be disabled.") if self.config.update_plex_wl_as_pl: if is_partial: - logger.warning("Running partial library sync. Watchlist as playlist won't update because it needs full library sync.") + self.logger.warning("Running partial library sync. Watchlist as playlist won't update because it needs full library sync.") else: trakt_lists.add_watchlist(self.trakt.watchlist_movies) if self.config.sync_liked_lists: if is_partial: - logger.warning("Partial walk, disabling liked lists updating. Liked lists won't update because it needs full library sync.") + self.logger.warning("Partial walk, disabling liked lists updating. Liked lists won't update because it needs full library sync.") else: trakt_lists.load_lists(self.trakt.liked_lists) @@ -96,7 +97,7 @@ def sync(self, walker: Walker, dry_run=False): if self.config.update_plex_wl_as_pl or self.config.sync_liked_lists: if is_partial: - logger.warning("Running partial library sync. Liked lists won't update because it needs full library sync.") + self.logger.warning("Running partial library sync. Liked lists won't update because it needs full library sync.") else: if not dry_run: with measure_time("Updated liked list"): @@ -113,7 +114,7 @@ def sync_collection(self, m: Media, dry_run=False): if m.is_collected: return - logger.info(f"Adding to collection: {m.title_link}", extra={"markup": True}) + self.logger.info(f"Adding to collection: {m.title_link}", extra={"markup": True}) if not dry_run: m.add_to_collection() @@ -154,12 +155,12 @@ def sync_ratings(self, m: Media, dry_run=False): rate = "plex" if rate == "trakt": - logger.info(f"Rating {m.title_link} with {m.plex_rating} on Trakt (was {m.trakt_rating})", extra={"markup": True}) + self.logger.info(f"Rating {m.title_link} with {m.plex_rating} on Trakt (was {m.trakt_rating})", extra={"markup": True}) if not dry_run: m.trakt_rate() elif rate == "plex": - logger.info(f"Rating {m.title_link} with {m.trakt_rating} on Plex (was {m.plex_rating})", extra={"markup": True}) + self.logger.info(f"Rating {m.title_link} with {m.trakt_rating} on Plex (was {m.plex_rating})", extra={"markup": True}) if not dry_run: m.plex_rate() @@ -176,27 +177,27 @@ def sync_watched(self, m: Media, dry_run=False): if m.is_episode and m.watched_before_reset: show = m.plex.item.show() - logger.info(f"Show '{show.title}' has been reset in trakt at {m.show_reset_at}.") - logger.info(f"Marking '{show.title}' as unwatched in Plex.") + self.logger.info(f"Show '{show.title}' has been reset in trakt at {m.show_reset_at}.") + self.logger.info(f"Marking '{show.title}' as unwatched in Plex.") if not dry_run: m.reset_show() else: - logger.info(f"Marking as watched in Trakt: {m.title_link}", extra={"markup": True}) + self.logger.info(f"Marking as watched in Trakt: {m.title_link}", extra={"markup": True}) if not dry_run: m.mark_watched_trakt() elif m.watched_on_trakt: if not self.config.trakt_to_plex["watched_status"]: return - logger.info(f"Marking as watched in Plex: {m.title_link}", extra={"markup": True}) + self.logger.info(f"Marking as watched in Plex: {m.title_link}", extra={"markup": True}) if not dry_run: m.mark_watched_plex() def watchlist_sync_item(self, m: Media, dry_run=False): if m.plex is None: if self.config.update_plex_wl: - logger.info(f"Skipping {m.title_link} from Trakt watchlist because not found in Plex Discover", extra={"markup": True}) + self.logger.info(f"Skipping {m.title_link} from Trakt watchlist because not found in Plex Discover", extra={"markup": True}) elif self.config.update_trakt_wl: - logger.info(f"Removing {m.title_link} from Trakt watchlist", extra={"markup": True}) + self.logger.info(f"Removing {m.title_link} from Trakt watchlist", extra={"markup": True}) if not dry_run: m.remove_from_trakt_watchlist() return @@ -204,11 +205,11 @@ def watchlist_sync_item(self, m: Media, dry_run=False): if m in self.plex_wl: if m not in self.trakt_wl: if self.config.update_trakt_wl: - logger.info(f"Adding {m.title_link} to Trakt watchlist", extra={"markup": True}) + self.logger.info(f"Adding {m.title_link} to Trakt watchlist", extra={"markup": True}) if not dry_run: m.add_to_trakt_watchlist() else: - logger.info(f"Removing {m.title_link} from Plex watchlist", extra={"markup": True}) + self.logger.info(f"Removing {m.title_link} from Plex watchlist", extra={"markup": True}) if not dry_run: m.remove_from_plex_watchlist() else: @@ -220,11 +221,11 @@ def watchlist_sync_item(self, m: Media, dry_run=False): del self.trakt_wl[m] elif m in self.trakt_wl: if self.config.update_plex_wl: - logger.info(f"Adding {m.title_link} to Plex watchlist", extra={"markup": True}) + self.logger.info(f"Adding {m.title_link} to Plex watchlist", extra={"markup": True}) if not dry_run: m.add_to_plex_watchlist() else: - logger.info(f"Removing {m.title_link} from Trakt watchlist", extra={"markup": True}) + self.logger.info(f"Removing {m.title_link} from Trakt watchlist", extra={"markup": True}) if not dry_run: m.remove_from_trakt_watchlist() @@ -248,6 +249,6 @@ def clear_collected(self, existing_items: Iterable[TraktMedia], keep_ids: set[in n = len(delete_ids) for i, tm in enumerate(delete_items, start=1): - logger.info(f"Remove from Trakt collection ({i}/{n}): {tm}") + self.logger.info(f"Remove from Trakt collection ({i}/{n}): {tm}") if not dry_run: self.trakt.remove_from_collection(tm) From bdfeb877d1c90c416ff95775e5004947cbd9bf5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:34:12 +0200 Subject: [PATCH 08/16] Use named logger in TraktLookup class --- plextraktsync/trakt/TraktLookup.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plextraktsync/trakt/TraktLookup.py b/plextraktsync/trakt/TraktLookup.py index e59bc02e2c..0b792ade9a 100644 --- a/plextraktsync/trakt/TraktLookup.py +++ b/plextraktsync/trakt/TraktLookup.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from plextraktsync.decorators.retry import retry -from plextraktsync.factory import logger +from plextraktsync.factory import logging EPISODES_ORDERING_WARNING = "episodes ordering is different in Plex and Trakt. " \ "Check your Plex media source, TMDB is recommended." @@ -24,6 +24,7 @@ def __init__(self, tm: TVShow): self.provider_table = {} self.tm = tm self.same_order = True + self.logger = logging.getLogger(__name__) @cached_property @retry() @@ -53,7 +54,7 @@ def _reverse_lookup(self, provider): for te in self.table[season].values(): table[str(te.ids.get(provider))] = te self.provider_table[provider] = table - logger.debug(f"{self.tm.title}: lookup table build with '{provider}' ids") + self.logger.debug(f"{self.tm.title}: lookup table build with '{provider}' ids") def from_guid(self, guid: PlexGuid): """ @@ -97,6 +98,6 @@ def from_id(self, provider, id): except KeyError: return None if self.same_order: - logger.warning(f"'{self.tm.title}' {EPISODES_ORDERING_WARNING}") + self.logger.warning(f"'{self.tm.title}' {EPISODES_ORDERING_WARNING}") self.same_order = False return ep From ae5f054aa56e8d193de5f5e2d2c5183959c17019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:35:18 +0200 Subject: [PATCH 09/16] Use named logger in cli --- plextraktsync/cli.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plextraktsync/cli.py b/plextraktsync/cli.py index 1dbacbaab3..aeb04644ce 100644 --- a/plextraktsync/cli.py +++ b/plextraktsync/cli.py @@ -27,12 +27,14 @@ def wrap(*args, **kwargs): except EOFError as e: raise ClickException(f"Program requested terminal, No terminal is connected: {e}") except ClickException as e: - from plextraktsync.factory import logger + from plextraktsync.factory import logging + logger = logging.getLogger(__name__) logger.fatal(f"Error running {name} command: {str(e)}") except Exception as e: - from plextraktsync.factory import logger + from plextraktsync.factory import logging + logger = logging.getLogger(__name__) logger.exception(e) raise ClickException(f"Error running {name} command: {str(e)}") From bb1179b2305ee2f01875bf5398f9aacdfb45f504 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:35:49 +0200 Subject: [PATCH 10/16] Use named logger in test_logger --- tests/test_logger.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_logger.py b/tests/test_logger.py index c9aab88fb9..45becf5750 100755 --- a/tests/test_logger.py +++ b/tests/test_logger.py @@ -1,9 +1,10 @@ #!/usr/bin/env python3 -m pytest -from plextraktsync.factory import logger +from plextraktsync.factory import logging def test_logger(): + logger = logging.getLogger(__name__) logger.info("Log plain text") logger.info(["log object"]) logger.info([{"a": "some object"}]) From 9d14b2fac6cd69228e7a2e0dcf011c6802a08295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:37:48 +0200 Subject: [PATCH 11/16] Use named logger in commands/sync --- plextraktsync/commands/sync.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plextraktsync/commands/sync.py b/plextraktsync/commands/sync.py index 23207d500b..e688c29fd1 100644 --- a/plextraktsync/commands/sync.py +++ b/plextraktsync/commands/sync.py @@ -2,7 +2,9 @@ from plextraktsync.commands.login import ensure_login from plextraktsync.decorators.measure_time import measure_time -from plextraktsync.factory import factory, logger +from plextraktsync.factory import factory, logging + +logger = logging.getLogger(__name__) def sync( From 82be6da83c9bb1e72e9258e49ca6f3280be3c625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:45:42 +0200 Subject: [PATCH 12/16] Setup logging filters from logging factory --- plextraktsync/util/Factory.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/plextraktsync/util/Factory.py b/plextraktsync/util/Factory.py index e457440aea..456d5b42f7 100644 --- a/plextraktsync/util/Factory.py +++ b/plextraktsync/util/Factory.py @@ -224,11 +224,16 @@ def logging(self): config = self.config initialize(config) + # Setup log filters + self.logger_filter_apply(logging.getLogger("plextraktsync")) + return logging @cached_property def logger(self): - logger = self.logging.getLogger("plextraktsync") + return self.logging.getLogger("plextraktsync") + + def logger_filter_apply(self, logger): config = self.config loggers = [ "plextraktsync", @@ -264,8 +269,9 @@ def logger(self): filter = LoggerFilter(config["logging"]["filter"], logger) + import logging for name in loggers: - self.logging.getLogger(name).addFilter(filter) + logging.getLogger(name).addFilter(filter) return logger From d84200a500c96cd278c59f66ad5ace20b769fc36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 10:59:46 +0200 Subject: [PATCH 13/16] Extract logger_filter factory --- plextraktsync/util/Factory.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/plextraktsync/util/Factory.py b/plextraktsync/util/Factory.py index 456d5b42f7..7d916b4e17 100644 --- a/plextraktsync/util/Factory.py +++ b/plextraktsync/util/Factory.py @@ -233,6 +233,17 @@ def logging(self): def logger(self): return self.logging.getLogger("plextraktsync") + @cached_property + def logger_filter(self): + import logging + + from plextraktsync.logger.filter import LoggerFilter + + config = self.config + logger = logging.getLogger("plextraktsync") + + return LoggerFilter(config["logging"]["filter"], logger) + def logger_filter_apply(self, logger): config = self.config loggers = [ @@ -265,13 +276,11 @@ def logger_filter_apply(self, logger): ] loggers.extend(config["logging"]["filter_loggers"] or []) - from plextraktsync.logger.filter import LoggerFilter - - filter = LoggerFilter(config["logging"]["filter"], logger) - import logging + + logger_filter = self.logger_filter for name in loggers: - logging.getLogger(name).addFilter(filter) + logging.getLogger(name).addFilter(logger_filter) return logger From 8325ff89991c805c221d83840afe8259eebf36ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 11:09:36 +0200 Subject: [PATCH 14/16] Lazy setup logger filters in first access --- plextraktsync/util/Factory.py | 59 +++++++++++++---------------------- 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/plextraktsync/util/Factory.py b/plextraktsync/util/Factory.py index 7d916b4e17..54e4c368d9 100644 --- a/plextraktsync/util/Factory.py +++ b/plextraktsync/util/Factory.py @@ -219,15 +219,30 @@ def watch_state_updater(self): def logging(self): import logging + from plextraktsync.decorators.memoize import memoize from plextraktsync.logger.init import initialize config = self.config initialize(config) + logger_filter = self.logger_filter + + # Setup log filters for external packages + self.logger_filter_apply(logger_filter) + + class Logging: + @staticmethod + @memoize + def getLogger(name): + """ Wrap getLogger and add our filters """ + logger = logging.getLogger(name) + logger.addFilter(logger_filter) + return logger - # Setup log filters - self.logger_filter_apply(logging.getLogger("plextraktsync")) + def __getattr__(self, name): + """ Wrap log level attributes """ + return getattr(logging, name) - return logging + return Logging() @cached_property def logger(self): @@ -244,46 +259,14 @@ def logger_filter(self): return LoggerFilter(config["logging"]["filter"], logger) - def logger_filter_apply(self, logger): - config = self.config - loggers = [ - "plextraktsync", - "plextraktsync.cli", - "plextraktsync.commands.sync", - "plextraktsync.decorators.measure_time", - "plextraktsync.decorators.rate_limit", - "plextraktsync.decorators.retry", - "plextraktsync.media.MediaFactory", - "plextraktsync.plan.Walker", - "plextraktsync.plex.PlexApi", - "plextraktsync.plex.PlexPlaylist", - "plextraktsync.plex.PlexServerConnection", - "plextraktsync.queue.BackgroundTask", - "plextraktsync.queue.TraktBatchWorker", - "plextraktsync.queue.TraktMarkWatchedWorker", - "plextraktsync.queue.TraktScrobbleWorker", - "plextraktsync.sync", - "plextraktsync.trakt.ScrobblerProxy", - "plextraktsync.trakt.TraktApi", - "plextraktsync.trakt.TraktLookup", - "plextraktsync.trakt.TraktUserList", - "plextraktsync.trakt.TraktUserListCollection", - "plextraktsync.util.Factory", - "plextraktsync.util.Timer", - "plextraktsync.watch.EventDispatcher", - "plextraktsync.watch.WatchStateUpdater", - "plextraktsync.watch.WebSocketListener", - ] - loggers.extend(config["logging"]["filter_loggers"] or []) - + def logger_filter_apply(self, logger_filter): import logging + config = self.config + loggers = config["logging"]["filter_loggers"] or [] - logger_filter = self.logger_filter for name in loggers: logging.getLogger(name).addFilter(logger_filter) - return logger - @cached_property def console_logger(self): from rich.logging import RichHandler From 06f41c3e1654e4d20294fe4a2f3dd074afaab26c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 11:20:09 +0200 Subject: [PATCH 15/16] Move loggers to class properties --- plextraktsync/media/MediaFactory.py | 2 +- plextraktsync/plan/Walker.py | 2 +- plextraktsync/plex/PlexApi.py | 2 +- plextraktsync/plex/PlexPlaylist.py | 3 ++- plextraktsync/plex/PlexServerConnection.py | 3 ++- plextraktsync/queue/BackgroundTask.py | 2 +- plextraktsync/queue/TraktBatchWorker.py | 4 +--- plextraktsync/queue/TraktMarkWatchedWorker.py | 4 +--- plextraktsync/queue/TraktScrobbleWorker.py | 4 +--- plextraktsync/sync/Sync.py | 3 ++- plextraktsync/trakt/ScrobblerProxy.py | 2 +- plextraktsync/trakt/TraktApi.py | 2 +- plextraktsync/trakt/TraktLookup.py | 2 +- plextraktsync/trakt/TraktUserList.py | 2 +- plextraktsync/trakt/TraktUserListCollection.py | 4 +--- plextraktsync/util/Timer.py | 2 +- plextraktsync/watch/EventDispatcher.py | 3 ++- plextraktsync/watch/WatchStateUpdater.py | 3 ++- plextraktsync/watch/WebSocketListener.py | 3 ++- 19 files changed, 25 insertions(+), 27 deletions(-) diff --git a/plextraktsync/media/MediaFactory.py b/plextraktsync/media/MediaFactory.py index b553263608..7c1851488d 100644 --- a/plextraktsync/media/MediaFactory.py +++ b/plextraktsync/media/MediaFactory.py @@ -21,11 +21,11 @@ class MediaFactory: """ Class that is able to resolve Trakt media item from Plex media item and vice versa and return generic Media class """ + logger = logging.getLogger(__name__) def __init__(self, plex: PlexApi, trakt: TraktApi): self.plex = plex self.trakt = trakt - self.logger = logging.getLogger(__name__) def resolve_any(self, pm: PlexLibraryItem, show: Media = None) -> Media | None: try: diff --git a/plextraktsync/plan/Walker.py b/plextraktsync/plan/Walker.py index 4cada83587..d05d988ac6 100644 --- a/plextraktsync/plan/Walker.py +++ b/plextraktsync/plan/Walker.py @@ -27,6 +27,7 @@ class Walker(SetWindowTitle): """ Class dealing with finding and walking library, movies/shows, episodes """ + logger = logging.getLogger(__name__) def __init__( self, @@ -41,7 +42,6 @@ def __init__( self.trakt = trakt self.mf = mf self.config = config - self.logger = logging.getLogger(__name__) @cached_property def plan(self): diff --git a/plextraktsync/plex/PlexApi.py b/plextraktsync/plex/PlexApi.py index d92582a29c..0d484f5866 100644 --- a/plextraktsync/plex/PlexApi.py +++ b/plextraktsync/plex/PlexApi.py @@ -30,6 +30,7 @@ class PlexApi: """ Plex API class abstracting common data access and dealing with requests cache. """ + logger = logging.getLogger(__name__) def __init__( self, @@ -38,7 +39,6 @@ def __init__( ): self.server = server self.config = config - self.logger = logging.getLogger(__name__) def __str__(self): return str(self.server) diff --git a/plextraktsync/plex/PlexPlaylist.py b/plextraktsync/plex/PlexPlaylist.py index d4741ce1ea..4c732d9aab 100644 --- a/plextraktsync/plex/PlexPlaylist.py +++ b/plextraktsync/plex/PlexPlaylist.py @@ -16,10 +16,11 @@ class PlexPlaylist(RichMarkup): + logger = logging.getLogger(__name__) + def __init__(self, server: PlexServer, name: str): self.server = server self.name = name - self.logger = logging.getLogger(__name__) def __iter__(self): return iter(self.items) diff --git a/plextraktsync/plex/PlexServerConnection.py b/plextraktsync/plex/PlexServerConnection.py index 8cc735a420..f7ff7f9486 100644 --- a/plextraktsync/plex/PlexServerConnection.py +++ b/plextraktsync/plex/PlexServerConnection.py @@ -12,9 +12,10 @@ class PlexServerConnection: + logger = logging.getLogger(__name__) + def __init__(self, factory: Factory): self.factory = factory - self.logger = logging.getLogger(__name__) @property def timeout(self): diff --git a/plextraktsync/queue/BackgroundTask.py b/plextraktsync/queue/BackgroundTask.py index 46116d19c9..fe0919a92b 100644 --- a/plextraktsync/queue/BackgroundTask.py +++ b/plextraktsync/queue/BackgroundTask.py @@ -17,12 +17,12 @@ class BackgroundTask: """ Class to read events from queue and invoke them at tasks to flush them at interval set by the timer """ + logger = logging.getLogger(__name__) def __init__(self, timer: Timer = None, *tasks): self.queues = defaultdict(list) self.timer = timer self.tasks = tasks - self.logger = logging.getLogger(__name__) def check_timer(self): if not self.timer: diff --git a/plextraktsync/queue/TraktBatchWorker.py b/plextraktsync/queue/TraktBatchWorker.py index da8288efca..6dd7a0e3dc 100644 --- a/plextraktsync/queue/TraktBatchWorker.py +++ b/plextraktsync/queue/TraktBatchWorker.py @@ -17,9 +17,7 @@ class TraktBatchWorker: "add_to_watchlist", "remove_from_watchlist", ) - - def __init__(self): - self.logger = logging.getLogger(__name__) + logger = logging.getLogger(__name__) def __call__(self, queues): for name in self.QUEUES: diff --git a/plextraktsync/queue/TraktMarkWatchedWorker.py b/plextraktsync/queue/TraktMarkWatchedWorker.py index e3877b17a4..3e697d8395 100644 --- a/plextraktsync/queue/TraktMarkWatchedWorker.py +++ b/plextraktsync/queue/TraktMarkWatchedWorker.py @@ -14,9 +14,7 @@ class TraktMarkWatchedWorker: # Queue this Worker can handle QUEUE = "add_to_history" - - def __init__(self): - self.logger = logging.getLogger(__name__) + logger = logging.getLogger(__name__) def __call__(self, queues): items = queues[self.QUEUE] diff --git a/plextraktsync/queue/TraktScrobbleWorker.py b/plextraktsync/queue/TraktScrobbleWorker.py index 3378b88972..0e1dcabf5b 100644 --- a/plextraktsync/queue/TraktScrobbleWorker.py +++ b/plextraktsync/queue/TraktScrobbleWorker.py @@ -20,9 +20,7 @@ class TraktScrobbleWorker: "scrobble_pause", "scrobble_stop", ) - - def __init__(self): - self.logger = logging.getLogger(__name__) + logger = logging.getLogger(__name__) def __call__(self, queues): for name in self.QUEUES: diff --git a/plextraktsync/sync/Sync.py b/plextraktsync/sync/Sync.py index 2604e534ca..7d341577d4 100644 --- a/plextraktsync/sync/Sync.py +++ b/plextraktsync/sync/Sync.py @@ -19,11 +19,12 @@ class Sync: + logger = logging.getLogger(__name__) + def __init__(self, config: SyncConfig, plex: PlexApi, trakt: TraktApi): self.config = config self.plex = plex self.trakt = trakt - self.logger = logging.getLogger(__name__) @cached_property def plex_wl(self): diff --git a/plextraktsync/trakt/ScrobblerProxy.py b/plextraktsync/trakt/ScrobblerProxy.py index 1a03c224f4..ba07e44b43 100644 --- a/plextraktsync/trakt/ScrobblerProxy.py +++ b/plextraktsync/trakt/ScrobblerProxy.py @@ -13,11 +13,11 @@ class ScrobblerProxy: """ Proxy to Scrobbler that queues requests to update trakt """ + logger = logging.getLogger(__name__) def __init__(self, scrobbler: Scrobbler, threshold=80): self.scrobbler = scrobbler self.threshold = threshold - self.logger = logging.getLogger(__name__) def update(self, progress: float): self.logger.debug(f"update({self.scrobbler.media}): {progress}") diff --git a/plextraktsync/trakt/TraktApi.py b/plextraktsync/trakt/TraktApi.py index 7e2ef3b1ff..9d353c3fb8 100644 --- a/plextraktsync/trakt/TraktApi.py +++ b/plextraktsync/trakt/TraktApi.py @@ -37,11 +37,11 @@ class TraktApi: """ Trakt API class abstracting common data access and dealing with requests cache. """ + logger = logging.getLogger(__name__) def __init__(self): trakt.core.CONFIG_PATH = pytrakt_file trakt.core.session = factory.session - self.logger = logging.getLogger(__name__) @staticmethod def device_auth(client_id: str, client_secret: str): diff --git a/plextraktsync/trakt/TraktLookup.py b/plextraktsync/trakt/TraktLookup.py index 0b792ade9a..a3ffd2b26e 100644 --- a/plextraktsync/trakt/TraktLookup.py +++ b/plextraktsync/trakt/TraktLookup.py @@ -19,12 +19,12 @@ class TraktLookup: """ Trakt lookup table to find all Trakt episodes of a TVShow """ + logger = logging.getLogger(__name__) def __init__(self, tm: TVShow): self.provider_table = {} self.tm = tm self.same_order = True - self.logger = logging.getLogger(__name__) @cached_property @retry() diff --git a/plextraktsync/trakt/TraktUserList.py b/plextraktsync/trakt/TraktUserList.py index 468fc346d2..92b7ff8fcb 100644 --- a/plextraktsync/trakt/TraktUserList.py +++ b/plextraktsync/trakt/TraktUserList.py @@ -14,6 +14,7 @@ class TraktUserList: plex_items: list[tuple[int, PlexLibraryItem]] + logger = logging.getLogger(__name__) def __init__(self, trakt_id: int = None, @@ -25,7 +26,6 @@ def __init__(self, self._items = items self.description = None self.plex_items = [] - self.logger = logging.getLogger(__name__) def __iter__(self): return iter(self.items) diff --git a/plextraktsync/trakt/TraktUserListCollection.py b/plextraktsync/trakt/TraktUserListCollection.py index 63e521fcf2..ba21a80b86 100644 --- a/plextraktsync/trakt/TraktUserListCollection.py +++ b/plextraktsync/trakt/TraktUserListCollection.py @@ -12,9 +12,7 @@ class TraktUserListCollection(UserList): - def __init__(self): - super().__init__() - self.logger = logging.getLogger(__name__) + logger = logging.getLogger(__name__) def add_to_lists(self, m: Media): # Skip movie editions diff --git a/plextraktsync/util/Timer.py b/plextraktsync/util/Timer.py index 7b92e53a62..dc6ea0e57f 100644 --- a/plextraktsync/util/Timer.py +++ b/plextraktsync/util/Timer.py @@ -7,13 +7,13 @@ class Timer: """ Class dealing with limiting that something is not called more often than {delay} """ + logger = logging.getLogger(__name__) def __init__(self, delay: float): if delay <= 0: raise ValueError(f"Delay must be a positive number: {delay}") self.delay = delay self.last_time = None - self.logger = logging.getLogger(__name__) @property def time_remaining(self): diff --git a/plextraktsync/watch/EventDispatcher.py b/plextraktsync/watch/EventDispatcher.py index e6c6209ef2..1537d6c33c 100644 --- a/plextraktsync/watch/EventDispatcher.py +++ b/plextraktsync/watch/EventDispatcher.py @@ -4,10 +4,11 @@ class EventDispatcher: + logger = logging.getLogger(__name__) + def __init__(self): self.event_listeners = [] self.event_factory = EventFactory() - self.logger = logging.getLogger(__name__) def on(self, event_type, listener, **kwargs): self.event_listeners.append( diff --git a/plextraktsync/watch/WatchStateUpdater.py b/plextraktsync/watch/WatchStateUpdater.py index e437af2a0f..140655135e 100644 --- a/plextraktsync/watch/WatchStateUpdater.py +++ b/plextraktsync/watch/WatchStateUpdater.py @@ -19,6 +19,8 @@ class WatchStateUpdater(SetWindowTitle): + logger = logging.getLogger(__name__) + def __init__( self, plex: PlexApi, @@ -29,7 +31,6 @@ def __init__( self.plex = plex self.trakt = trakt self.mf = mf - self.logger = logging.getLogger(__name__) self.config = config self.remove_collection = config["watch"]["remove_collection"] self.add_collection = config["watch"]["add_collection"] diff --git a/plextraktsync/watch/WebSocketListener.py b/plextraktsync/watch/WebSocketListener.py index 480ea2e31a..2acdf85bb0 100644 --- a/plextraktsync/watch/WebSocketListener.py +++ b/plextraktsync/watch/WebSocketListener.py @@ -12,12 +12,13 @@ class WebSocketListener: + logger = logging.getLogger(__name__) + def __init__(self, plex: PlexServer, poll_interval=5, restart_interval=15): self.plex = plex self.poll_interval = poll_interval self.restart_interval = restart_interval self.dispatcher = EventDispatcher() - self.logger = logging.getLogger(__name__) def on(self, event_type, listener, **kwargs): self.dispatcher.on(event_type, listener, **kwargs) From c1bbfc741933fc83996ae4bca76b521a6ebc5be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Fri, 23 Feb 2024 11:24:09 +0200 Subject: [PATCH 16/16] No longer need memoize for getLogger --- plextraktsync/util/Factory.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plextraktsync/util/Factory.py b/plextraktsync/util/Factory.py index 54e4c368d9..88a0c716fe 100644 --- a/plextraktsync/util/Factory.py +++ b/plextraktsync/util/Factory.py @@ -219,7 +219,6 @@ def watch_state_updater(self): def logging(self): import logging - from plextraktsync.decorators.memoize import memoize from plextraktsync.logger.init import initialize config = self.config @@ -231,7 +230,6 @@ def logging(self): class Logging: @staticmethod - @memoize def getLogger(name): """ Wrap getLogger and add our filters """ logger = logging.getLogger(name)