mirror of
https://github.com/beetbox/beets.git
synced 2026-01-06 07:53:40 +01:00
resolve sorucery issue....make it thread safe
This commit is contained in:
parent
e6c70f06c1
commit
4302ca97eb
1 changed files with 26 additions and 8 deletions
|
|
@ -24,6 +24,7 @@ import re
|
|||
import time
|
||||
import webbrowser
|
||||
from typing import TYPE_CHECKING, Any, Literal, Sequence, Union
|
||||
import threading
|
||||
|
||||
import confuse
|
||||
import requests
|
||||
|
|
@ -145,6 +146,7 @@ class SpotifyPlugin(
|
|||
self.config["client_secret"].redact = True
|
||||
|
||||
self.audio_features_available = True # Track if audio features API is available
|
||||
self._audio_features_lock = threading.Lock() # Protects audio_features_available
|
||||
self.setup()
|
||||
|
||||
def setup(self):
|
||||
|
|
@ -251,7 +253,7 @@ class SpotifyPlugin(
|
|||
)
|
||||
elif e.response.status_code == 403:
|
||||
# Check if this is the audio features endpoint
|
||||
if self.audio_features_url in url:
|
||||
if url.startswith(self.audio_features_url):
|
||||
raise AudioFeaturesUnavailableError(
|
||||
"Audio features API returned 403 (deprecated or unavailable)"
|
||||
)
|
||||
|
|
@ -742,17 +744,33 @@ class SpotifyPlugin(
|
|||
)
|
||||
|
||||
def track_audio_features(self, track_id: str):
|
||||
"""Fetch track audio features by its Spotify ID."""
|
||||
"""Fetch track audio features by its Spotify ID.
|
||||
|
||||
Thread-safe: avoids redundant API calls and logs the 403 warning only
|
||||
once.
|
||||
|
||||
"""
|
||||
# Fast path: if we've already detected unavailability, skip the call.
|
||||
with self._audio_features_lock:
|
||||
if not self.audio_features_available:
|
||||
return None
|
||||
|
||||
try:
|
||||
return self._handle_response(
|
||||
"get", f"{self.audio_features_url}{track_id}"
|
||||
)
|
||||
except AudioFeaturesUnavailableError as e:
|
||||
self._log.warning(
|
||||
"Audio features API is unavailable (403 error). "
|
||||
"Skipping audio features for remaining tracks."
|
||||
)
|
||||
self.audio_features_available = False
|
||||
except AudioFeaturesUnavailableError:
|
||||
# Disable globally in a thread-safe manner and warn once.
|
||||
should_log = False
|
||||
with self._audio_features_lock:
|
||||
if self.audio_features_available:
|
||||
self.audio_features_available = False
|
||||
should_log = True
|
||||
if should_log:
|
||||
self._log.warning(
|
||||
"Audio features API is unavailable (403 error). "
|
||||
"Skipping audio features for remaining tracks."
|
||||
)
|
||||
return None
|
||||
except APIError as e:
|
||||
self._log.debug("Spotify API error: {}", e)
|
||||
|
|
|
|||
Loading…
Reference in a new issue