Fix: ensure Spotify token is fresh when retrieving streamdetails
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 15 Sep 2024 10:41:53 +0000 (12:41 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 15 Sep 2024 10:41:53 +0000 (12:41 +0200)
music_assistant/server/helpers/throttle_retry.py
music_assistant/server/providers/spotify/__init__.py

index 962ba7b95d02e2cd297ce31e6d77d9930f03a2b7..59bd9fb0b88c25a8166cc56a23626f5f442ecb52 100644 (file)
@@ -117,7 +117,7 @@ def throttle_with_retries(
                 try:
                     return await func(self, *args, **kwargs)
                 except ResourceTemporarilyUnavailable as e:
-                    backoff_time += e.backoff_time
+                    backoff_time = e.backoff_time or backoff_time
                     self.logger.info(
                         f"Attempt {attempt + 1}/{throttler.retry_attempts} failed: {e}"
                     )
index 910fe80d7936bc0d6d52ff2515a3d94eef99325b..de8f8a32a9b6dd37e8b7e082e731bf4075186a09 100644 (file)
@@ -543,6 +543,7 @@ class SpotifyProvider(MusicProvider):
 
     async def get_stream_details(self, item_id: str) -> StreamDetails:
         """Return the content details for the given track when it will be streamed."""
+        await self.login(force_fresh=True)
         # fetch full track details
         # this will also check if the track is available for streaming
         # and use spotify's track linking feature to serve a substitute track
@@ -788,7 +789,7 @@ class SpotifyProvider(MusicProvider):
         """Log-in Spotify and return Auth/token info."""
         # return existing token if we have one in memory
         if self._auth_info and (
-            self._auth_info["expires_at"] > (time.time() - 1800 if force_fresh else 300)
+            self._auth_info["expires_at"] > (time.time() - 600 if force_fresh else 300)
         ):
             return self._auth_info
         # request new access token using the refresh token
@@ -911,7 +912,7 @@ class SpotifyProvider(MusicProvider):
             # so it will be retried (and the token refreshed)
             if response.status == 401:
                 self._auth_info = None
-                raise ResourceTemporarilyUnavailable("Token expired", backoff_time=1)
+                raise ResourceTemporarilyUnavailable("Token expired", backoff_time=0.1)
             # handle temporary server error
             if response.status in (502, 503):
                 raise ResourceTemporarilyUnavailable(backoff_time=30)
@@ -936,7 +937,7 @@ class SpotifyProvider(MusicProvider):
             # so it will be retried (and the token refreshed)
             if response.status == 401:
                 self._auth_info = None
-                raise ResourceTemporarilyUnavailable("Token expired", backoff_time=1)
+                raise ResourceTemporarilyUnavailable("Token expired", backoff_time=0.1)
 
             # handle temporary server error
             if response.status in (502, 503):
@@ -962,7 +963,7 @@ class SpotifyProvider(MusicProvider):
             # so it will be retried (and the token refreshed)
             if response.status == 401:
                 self._auth_info = None
-                raise ResourceTemporarilyUnavailable("Token expired", backoff_time=1)
+                raise ResourceTemporarilyUnavailable("Token expired", backoff_time=0.1)
             # handle temporary server error
             if response.status in (502, 503):
                 raise ResourceTemporarilyUnavailable(backoff_time=30)