Guard all direct Spotify API calls against rate limit ban
This commit is contained in:
parent
f77066f9a7
commit
4d2487db81
1 changed files with 16 additions and 12 deletions
|
|
@ -55,7 +55,7 @@ if not pp_logger.handlers:
|
||||||
_pp_handler.setFormatter(_logging.Formatter("%(asctime)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S"))
|
_pp_handler.setFormatter(_logging.Formatter("%(asctime)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S"))
|
||||||
pp_logger.addHandler(_pp_handler)
|
pp_logger.addHandler(_pp_handler)
|
||||||
pp_logger.propagate = False
|
pp_logger.propagate = False
|
||||||
from core.spotify_client import SpotifyClient, Playlist as SpotifyPlaylist, Track as SpotifyTrack
|
from core.spotify_client import SpotifyClient, Playlist as SpotifyPlaylist, Track as SpotifyTrack, _is_globally_rate_limited as _spotify_rate_limited
|
||||||
from core.plex_client import PlexClient
|
from core.plex_client import PlexClient
|
||||||
from core.jellyfin_client import JellyfinClient
|
from core.jellyfin_client import JellyfinClient
|
||||||
from core.navidrome_client import NavidromeClient
|
from core.navidrome_client import NavidromeClient
|
||||||
|
|
@ -21578,6 +21578,8 @@ def get_playlist_tracks(playlist_id):
|
||||||
offset = 0
|
offset = 0
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
if _spotify_rate_limited():
|
||||||
|
return jsonify({"error": "Spotify is currently rate limited. Please try again later."}), 429
|
||||||
results = spotify_client.sp.current_user_saved_tracks(limit=limit, offset=offset)
|
results = spotify_client.sp.current_user_saved_tracks(limit=limit, offset=offset)
|
||||||
|
|
||||||
if not results or 'items' not in results:
|
if not results or 'items' not in results:
|
||||||
|
|
@ -21617,6 +21619,8 @@ def get_playlist_tracks(playlist_id):
|
||||||
return jsonify(playlist_dict)
|
return jsonify(playlist_dict)
|
||||||
|
|
||||||
# Handle regular playlists
|
# Handle regular playlists
|
||||||
|
if _spotify_rate_limited():
|
||||||
|
return jsonify({"error": "Spotify is currently rate limited. Please try again later."}), 429
|
||||||
# Fetch raw playlist data to preserve full album objects
|
# Fetch raw playlist data to preserve full album objects
|
||||||
playlist_data = spotify_client.sp.playlist(playlist_id)
|
playlist_data = spotify_client.sp.playlist(playlist_id)
|
||||||
|
|
||||||
|
|
@ -23234,7 +23238,7 @@ def _search_spotify_for_tidal_track(tidal_track, use_spotify=True, itunes_client
|
||||||
try:
|
try:
|
||||||
print(f"🔍 Tidal query {query_idx + 1}/{len(search_queries)}: {search_query} ({source_name})")
|
print(f"🔍 Tidal query {query_idx + 1}/{len(search_queries)}: {search_query} ({source_name})")
|
||||||
|
|
||||||
if use_spotify:
|
if use_spotify and not _spotify_rate_limited():
|
||||||
raw_results = spotify_client.sp.search(q=search_query, type='track', limit=10)
|
raw_results = spotify_client.sp.search(q=search_query, type='track', limit=10)
|
||||||
if not raw_results or 'tracks' not in raw_results or not raw_results['tracks']['items']:
|
if not raw_results or 'tracks' not in raw_results or not raw_results['tracks']['items']:
|
||||||
continue
|
continue
|
||||||
|
|
@ -23822,7 +23826,7 @@ def _run_youtube_discovery_worker(url_hash):
|
||||||
raw_results = None
|
raw_results = None
|
||||||
search_results = None
|
search_results = None
|
||||||
|
|
||||||
if use_spotify:
|
if use_spotify and not _spotify_rate_limited():
|
||||||
raw_results = spotify_client.sp.search(q=search_query, type='track', limit=10)
|
raw_results = spotify_client.sp.search(q=search_query, type='track', limit=10)
|
||||||
if not raw_results or 'tracks' not in raw_results or not raw_results['tracks']['items']:
|
if not raw_results or 'tracks' not in raw_results or not raw_results['tracks']['items']:
|
||||||
continue
|
continue
|
||||||
|
|
@ -24131,7 +24135,7 @@ def _run_listenbrainz_discovery_worker(playlist_mbid):
|
||||||
raw_results = None
|
raw_results = None
|
||||||
search_results = None
|
search_results = None
|
||||||
|
|
||||||
if use_spotify:
|
if use_spotify and not _spotify_rate_limited():
|
||||||
raw_results = spotify_client.sp.search(q=search_query, type='track', limit=10)
|
raw_results = spotify_client.sp.search(q=search_query, type='track', limit=10)
|
||||||
if not raw_results or 'tracks' not in raw_results or not raw_results['tracks']['items']:
|
if not raw_results or 'tracks' not in raw_results or not raw_results['tracks']['items']:
|
||||||
continue
|
continue
|
||||||
|
|
@ -26765,7 +26769,7 @@ def watchlist_artist_config(artist_id):
|
||||||
|
|
||||||
# Get artist info from Spotify (only for Spotify artists)
|
# Get artist info from Spotify (only for Spotify artists)
|
||||||
artist_info = None
|
artist_info = None
|
||||||
if not is_itunes_artist and spotify_client and spotify_client.is_authenticated() and spotify_id:
|
if not is_itunes_artist and spotify_client and spotify_client.is_authenticated() and spotify_id and not _spotify_rate_limited():
|
||||||
try:
|
try:
|
||||||
artist_data = spotify_client.sp.artist(spotify_id)
|
artist_data = spotify_client.sp.artist(spotify_id)
|
||||||
if artist_data:
|
if artist_data:
|
||||||
|
|
@ -27820,7 +27824,7 @@ def enrich_similar_artists():
|
||||||
|
|
||||||
enriched = {}
|
enriched = {}
|
||||||
|
|
||||||
if source == 'spotify' and spotify_client and spotify_client.is_authenticated():
|
if source == 'spotify' and spotify_client and spotify_client.is_authenticated() and not _spotify_rate_limited():
|
||||||
try:
|
try:
|
||||||
batch_result = spotify_client.sp.artists(artist_ids[:50])
|
batch_result = spotify_client.sp.artists(artist_ids[:50])
|
||||||
if batch_result and 'artists' in batch_result:
|
if batch_result and 'artists' in batch_result:
|
||||||
|
|
@ -28538,7 +28542,7 @@ def search_artists_for_playlist():
|
||||||
hydrabase_worker.enqueue(query, 'artists')
|
hydrabase_worker.enqueue(query, 'artists')
|
||||||
|
|
||||||
# Try Spotify first, fall back to iTunes
|
# Try Spotify first, fall back to iTunes
|
||||||
if spotify_client.sp:
|
if spotify_client.sp and not _spotify_rate_limited():
|
||||||
try:
|
try:
|
||||||
search_query = f'artist:{query}' if len(query.strip()) <= 4 else query
|
search_query = f'artist:{query}' if len(query.strip()) <= 4 else query
|
||||||
results = spotify_client.sp.search(q=search_query, type='artist', limit=10)
|
results = spotify_client.sp.search(q=search_query, type='artist', limit=10)
|
||||||
|
|
@ -31333,7 +31337,7 @@ def _run_beatport_discovery_worker(url_hash):
|
||||||
raw_results = None
|
raw_results = None
|
||||||
search_results = None
|
search_results = None
|
||||||
|
|
||||||
if use_spotify:
|
if use_spotify and not _spotify_rate_limited():
|
||||||
raw_results = spotify_client.sp.search(q=search_query, type='track', limit=10)
|
raw_results = spotify_client.sp.search(q=search_query, type='track', limit=10)
|
||||||
if not raw_results or 'tracks' not in raw_results or not raw_results['tracks']['items']:
|
if not raw_results or 'tracks' not in raw_results or not raw_results['tracks']['items']:
|
||||||
continue
|
continue
|
||||||
|
|
@ -34521,7 +34525,7 @@ def import_album_process():
|
||||||
|
|
||||||
# Get artist genres from Spotify if possible
|
# Get artist genres from Spotify if possible
|
||||||
artist_genres = album.get('genres', [])
|
artist_genres = album.get('genres', [])
|
||||||
if not artist_genres and artist_id:
|
if not artist_genres and artist_id and not _spotify_rate_limited():
|
||||||
try:
|
try:
|
||||||
sp_artist = spotify_client.sp.artist(artist_id) if hasattr(spotify_client, 'sp') and spotify_client.sp else None
|
sp_artist = spotify_client.sp.artist(artist_id) if hasattr(spotify_client, 'sp') and spotify_client.sp else None
|
||||||
if sp_artist:
|
if sp_artist:
|
||||||
|
|
@ -34701,7 +34705,7 @@ def import_singles_process():
|
||||||
if spotify_override and spotify_override.get('id'):
|
if spotify_override and spotify_override.get('id'):
|
||||||
try:
|
try:
|
||||||
override_id = spotify_override['id']
|
override_id = spotify_override['id']
|
||||||
sp_track = spotify_client.sp.track(override_id) if hasattr(spotify_client, 'sp') and spotify_client.sp else None
|
sp_track = (spotify_client.sp.track(override_id) if hasattr(spotify_client, 'sp') and spotify_client.sp and not _spotify_rate_limited() else None)
|
||||||
if sp_track:
|
if sp_track:
|
||||||
sp_track_artists = sp_track.get('artists', [])
|
sp_track_artists = sp_track.get('artists', [])
|
||||||
spotify_track_data = {
|
spotify_track_data = {
|
||||||
|
|
@ -34733,7 +34737,7 @@ def import_singles_process():
|
||||||
'genres': []
|
'genres': []
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
sp_a = spotify_client.sp.artist(album_artists[0]['id']) if hasattr(spotify_client, 'sp') and spotify_client.sp else None
|
sp_a = (spotify_client.sp.artist(album_artists[0]['id']) if hasattr(spotify_client, 'sp') and spotify_client.sp and not _spotify_rate_limited() else None)
|
||||||
if sp_a:
|
if sp_a:
|
||||||
spotify_artist_data['genres'] = sp_a.get('genres', [])
|
spotify_artist_data['genres'] = sp_a.get('genres', [])
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|
@ -34776,7 +34780,7 @@ def import_singles_process():
|
||||||
'genres': []
|
'genres': []
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
sp_a = spotify_client.sp.artist(sp_artists[0]['id']) if hasattr(spotify_client, 'sp') and spotify_client.sp else None
|
sp_a = (spotify_client.sp.artist(sp_artists[0]['id']) if hasattr(spotify_client, 'sp') and spotify_client.sp and not _spotify_rate_limited() else None)
|
||||||
if sp_a:
|
if sp_a:
|
||||||
spotify_artist_data['genres'] = sp_a.get('genres', [])
|
spotify_artist_data['genres'] = sp_a.get('genres', [])
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue