force refetch similar artists when Spotify IDs missing

When Spotify is enabled after populating similar artists with only iTunes IDs, the freshness check now detects missing Spotify IDs and triggers a refetch. This fixes the Discover page not showing data when switching from iTunes-only mode.
This commit is contained in:
Broque Thomas 2026-01-24 23:46:01 -08:00
parent 3cb88669e3
commit 4f1dc2c15f
3 changed files with 26 additions and 4 deletions

View file

@ -685,7 +685,9 @@ class WatchlistScanner:
source_artist_id = watchlist_artist.spotify_artist_id or watchlist_artist.itunes_artist_id or str(watchlist_artist.id) source_artist_id = watchlist_artist.spotify_artist_id or watchlist_artist.itunes_artist_id or str(watchlist_artist.id)
try: try:
# Check if we have fresh similar artists cached (< 30 days old) # Check if we have fresh similar artists cached (< 30 days old)
if self.database.has_fresh_similar_artists(source_artist_id, days_threshold=30): # If Spotify is authenticated, also require Spotify IDs to be present
spotify_authenticated = self.spotify_client and self.spotify_client.is_spotify_authenticated()
if self.database.has_fresh_similar_artists(source_artist_id, days_threshold=30, require_spotify=spotify_authenticated):
logger.info(f"Similar artists for {watchlist_artist.artist_name} are cached and fresh, skipping MusicMap fetch") logger.info(f"Similar artists for {watchlist_artist.artist_name} are cached and fresh, skipping MusicMap fetch")
# Even if cached, backfill missing iTunes IDs (seamless dual-source support) # Even if cached, backfill missing iTunes IDs (seamless dual-source support)
self._backfill_similar_artists_itunes_ids(source_artist_id) self._backfill_similar_artists_itunes_ids(source_artist_id)

View file

@ -3212,15 +3212,16 @@ class MusicDatabase:
logger.error(f"Error updating similar artist iTunes ID: {e}") logger.error(f"Error updating similar artist iTunes ID: {e}")
return False return False
def has_fresh_similar_artists(self, source_artist_id: str, days_threshold: int = 30, require_itunes: bool = True) -> bool: def has_fresh_similar_artists(self, source_artist_id: str, days_threshold: int = 30, require_itunes: bool = True, require_spotify: bool = False) -> bool:
""" """
Check if we have cached similar artists that are still fresh (< days_threshold old). Check if we have cached similar artists that are still fresh (<days_threshold old).
Also checks that similar artists have the required provider IDs. Also checks that similar artists have the required provider IDs.
Args: Args:
source_artist_id: The source artist ID to check source_artist_id: The source artist ID to check
days_threshold: Maximum age in days to consider fresh days_threshold: Maximum age in days to consider fresh
require_itunes: If True, also requires iTunes IDs to be present (for seamless provider switching) require_itunes: If True, also requires iTunes IDs to be present (for seamless provider switching)
require_spotify: If True, also requires Spotify IDs to be present (for Spotify discovery)
Returns True if we have recent data with required IDs, False if data is stale, missing, or incomplete. Returns True if we have recent data with required IDs, False if data is stale, missing, or incomplete.
""" """
@ -3264,6 +3265,23 @@ class MusicDatabase:
logger.debug(f"Similar artists for {source_artist_id} missing iTunes IDs ({id_row['has_itunes']}/{id_row['total']}), will refetch") logger.debug(f"Similar artists for {source_artist_id} missing iTunes IDs ({id_row['has_itunes']}/{id_row['total']}), will refetch")
return False return False
# Check if we have Spotify IDs (for Spotify discovery)
if require_spotify:
cursor.execute("""
SELECT COUNT(*) as total,
SUM(CASE WHEN similar_artist_spotify_id IS NOT NULL AND similar_artist_spotify_id != '' THEN 1 ELSE 0 END) as has_spotify
FROM similar_artists
WHERE source_artist_id = ?
""", (source_artist_id,))
id_row = cursor.fetchone()
if id_row and id_row['total'] > 0:
# If less than 50% have Spotify IDs, consider stale and refetch
spotify_ratio = id_row['has_spotify'] / id_row['total']
if spotify_ratio < 0.5:
logger.debug(f"Similar artists for {source_artist_id} missing Spotify IDs ({id_row['has_spotify']}/{id_row['total']}), will refetch")
return False
return True return True
except Exception as e: except Exception as e:

View file

@ -17724,7 +17724,9 @@ def start_watchlist_scan():
watchlist_scan_state['current_phase'] = 'fetching_similar_artists' watchlist_scan_state['current_phase'] = 'fetching_similar_artists'
source_artist_id = artist.spotify_artist_id or artist.itunes_artist_id or str(artist.id) source_artist_id = artist.spotify_artist_id or artist.itunes_artist_id or str(artist.id)
if database.has_fresh_similar_artists(source_artist_id, days_threshold=30): # If Spotify is authenticated, also require Spotify IDs to be present
spotify_authenticated = spotify_client and spotify_client.is_spotify_authenticated()
if database.has_fresh_similar_artists(source_artist_id, days_threshold=30, require_spotify=spotify_authenticated):
print(f" Similar artists for {artist.artist_name} are cached and fresh") print(f" Similar artists for {artist.artist_name} are cached and fresh")
# Still backfill missing iTunes IDs # Still backfill missing iTunes IDs
scanner._backfill_similar_artists_itunes_ids(source_artist_id) scanner._backfill_similar_artists_itunes_ids(source_artist_id)