diff --git a/core/spotify_client.py b/core/spotify_client.py index 9a55579b..2e21afeb 100644 --- a/core/spotify_client.py +++ b/core/spotify_client.py @@ -417,7 +417,7 @@ class SpotifyClient: self._auth_cache_lock = threading.Lock() self._auth_cached_result: Optional[bool] = None self._auth_cache_time: float = 0 - self._AUTH_CACHE_TTL = 300 # 5 minutes — auth status rarely changes, no need to probe often + self._AUTH_CACHE_TTL = 900 # 15 minutes — auth status doesn't change mid-session self._setup_client() def _is_spotify_id(self, id_str: str) -> bool: diff --git a/web_server.py b/web_server.py index 3644c8d2..e1b55c0f 100644 --- a/web_server.py +++ b/web_server.py @@ -30425,14 +30425,10 @@ def _search_spotify_for_tidal_track(tidal_track, use_spotify=True, itunes_client print(f"🔍 Tidal query {query_idx + 1}/{len(search_queries)}: {search_query} ({source_name})") if use_spotify and not _spotify_rate_limited(): - 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']: - continue results = spotify_client.search_tracks(search_query, limit=10) if not results: continue else: - raw_results = None results = itunes_client.search_tracks(search_query, limit=10) if not results: continue @@ -30445,8 +30441,11 @@ def _search_spotify_for_tidal_track(tidal_track, use_spotify=True, itunes_client if match and confidence > best_confidence and confidence >= min_confidence: best_confidence = confidence best_match = match - if use_spotify and raw_results: - best_match_raw = raw_results['tracks']['items'][match_idx] if match_idx < len(raw_results['tracks']['items']) else None + if use_spotify and match.id: + _cache = get_metadata_cache() + best_match_raw = _cache.get_entity('spotify', 'track', match.id) + else: + best_match_raw = None print(f"✅ New best Tidal match: {match.artists[0]} - {match.name} (confidence: {confidence:.3f})") if best_confidence >= 0.9: @@ -32727,13 +32726,9 @@ def _run_youtube_discovery_worker(url_hash): try: print(f"🔍 YouTube query {query_idx + 1}/{len(search_queries)}: {search_query}") - raw_results = None search_results = None if use_spotify and not _spotify_rate_limited(): - 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']: - continue search_results = spotify_client.search_tracks(search_query, limit=10) else: search_results = itunes_client.search_tracks(search_query, limit=10) @@ -32749,8 +32744,9 @@ def _run_youtube_discovery_worker(url_hash): if match and confidence > best_confidence and confidence >= min_confidence: best_confidence = confidence matched_track = match - if use_spotify and raw_results: - best_raw_track = raw_results['tracks']['items'][match_idx] if match_idx < len(raw_results['tracks']['items']) else None + if use_spotify and match.id: + _cache = get_metadata_cache() + best_raw_track = _cache.get_entity('spotify', 'track', match.id) else: best_raw_track = None print(f"✅ New best YouTube match: {match.artists[0]} - {match.name} (confidence: {confidence:.3f})") @@ -33042,13 +33038,9 @@ def _run_listenbrainz_discovery_worker(state_key): try: print(f"🔍 ListenBrainz query {query_idx + 1}/{len(search_queries)}: {search_query}") - raw_results = None search_results = None if use_spotify and not _spotify_rate_limited(): - 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']: - continue search_results = spotify_client.search_tracks(search_query, limit=10) else: search_results = itunes_client.search_tracks(search_query, limit=10) @@ -33064,8 +33056,9 @@ def _run_listenbrainz_discovery_worker(state_key): if match and confidence > best_confidence and confidence >= min_confidence: best_confidence = confidence matched_track = match - if use_spotify and raw_results: - best_raw_track = raw_results['tracks']['items'][match_idx] if match_idx < len(raw_results['tracks']['items']) else None + if use_spotify and match.id: + _cache = get_metadata_cache() + best_raw_track = _cache.get_entity('spotify', 'track', match.id) else: best_raw_track = None print(f"✅ New best ListenBrainz match: {match.artists[0]} - {match.name} (confidence: {confidence:.3f})") @@ -38738,15 +38731,13 @@ def search_artists_for_playlist(): # Try Spotify first, fall back to iTunes if spotify_client.sp and not _spotify_rate_limited(): try: - search_query = f'artist:{query}' if len(query.strip()) <= 4 else query - results = spotify_client.sp.search(q=search_query, type='artist', limit=10) - if results and 'artists' in results and 'items' in results['artists']: - for artist in results['artists']['items']: - artists.append({ - 'id': artist['id'], - 'name': artist['name'], - 'image_url': artist['images'][0]['url'] if artist.get('images') else None - }) + artist_results = spotify_client.search_artists(query, limit=10) + for artist in artist_results: + artists.append({ + 'id': artist.id, + 'name': artist.name, + 'image_url': artist.image_url + }) except Exception as e: logger.warning(f"Spotify artist search failed, falling back to iTunes: {e}") @@ -41708,13 +41699,9 @@ def _run_beatport_discovery_worker(url_hash): try: print(f"🔍 Query {query_idx + 1}/{len(search_queries)}: {search_query} ({discovery_source.upper()})") - raw_results = None search_results = None if use_spotify and not _spotify_rate_limited(): - 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']: - continue search_results = spotify_client.search_tracks(search_query, limit=10) else: search_results = itunes_client_instance.search_tracks(search_query, limit=10) @@ -41730,8 +41717,9 @@ def _run_beatport_discovery_worker(url_hash): if match and confidence > best_confidence and confidence >= min_confidence: best_confidence = confidence found_track = match - if use_spotify and raw_results: - best_raw_track = raw_results['tracks']['items'][match_idx] if match_idx < len(raw_results['tracks']['items']) else None + if use_spotify and match.id: + _cache = get_metadata_cache() + best_raw_track = _cache.get_entity('spotify', 'track', match.id) else: best_raw_track = None print(f"✅ New best Beatport match: {match.artists[0]} - {match.name} (confidence: {confidence:.3f})")