From f60ba73081839969db74527c85c0aea5d57117aa Mon Sep 17 00:00:00 2001 From: modem <62859+modem@users.noreply.github.com> Date: Tue, 2 Sep 2025 17:46:59 +0100 Subject: [PATCH 1/2] Fix: Trakt refresh token after expiry --- trakt/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trakt/api.py b/trakt/api.py index cb06a75..1158e8c 100644 --- a/trakt/api.py +++ b/trakt/api.py @@ -204,7 +204,7 @@ def get_token(self): self.config.load() # Check token validity and refresh token if needed - if not self.OAUTH_TOKEN_VALID and self.config.have_refresh_token(): + if self.config.have_refresh_token(): self.validate_token() return [ From 719f0e36f7a0e12a99893460f0dbc4984c68af50 Mon Sep 17 00:00:00 2001 From: modem <62859+modem@users.noreply.github.com> Date: Tue, 2 Sep 2025 19:54:40 +0100 Subject: [PATCH 2/2] Tentative to avoid token refresh race condition In case there's 2 simultaneous token refresh attempts --- trakt/api.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/trakt/api.py b/trakt/api.py index 1158e8c..3c09cab 100644 --- a/trakt/api.py +++ b/trakt/api.py @@ -180,6 +180,7 @@ def __init__(self, client: HttpClient, config: AuthConfig): # OAuth token validity checked self.OAUTH_TOKEN_VALID = None self.refresh_attempts = 0 + self.TOKEN_UNDER_REFRESH = False def __call__(self, r): # Skip oauth requests @@ -204,7 +205,8 @@ def get_token(self): self.config.load() # Check token validity and refresh token if needed - if self.config.have_refresh_token(): + if not self.TOKEN_UNDER_REFRESH and self.config.have_refresh_token(): + self.TOKEN_UNDER_REFRESH = True self.validate_token() return [ @@ -229,6 +231,8 @@ def validate_token(self): self.logger.debug("Token expires in %s, refreshing (margin: %s)", margin, self.TOKEN_REFRESH_MARGIN) self.refresh_token() + self.TOKEN_UNDER_REFRESH = False + def refresh_token(self): """Request Trakt API for a new valid OAuth token using refresh_token"""