Cache Deezer enrichment worker API calls in metadata cache
The Deezer enrichment worker's 5 raw API methods (search_artist, search_album, search_track, get_album_raw, get_track_raw) were bypassing the metadata cache — every enrichment cycle hit the Deezer API fresh for every item. Spotify and iTunes workers properly cached all results. Now all 5 methods store results via store_entity(). get_album_raw and get_track_raw also check cache first (verified by presence of full-detail fields like 'label' and 'bpm' to distinguish from search stubs). Cache failures are silently ignored to never block enrichment. This eliminates redundant API calls and automatically populates genre data for the genre explorer.
This commit is contained in:
parent
d248c36da1
commit
cb008a2e61
1 changed files with 59 additions and 3 deletions
|
|
@ -683,8 +683,15 @@ class DeezerClient:
|
|||
|
||||
results = data.get('data', [])
|
||||
if results and len(results) > 0:
|
||||
result = results[0]
|
||||
# Cache the artist entity
|
||||
try:
|
||||
cache = get_metadata_cache()
|
||||
cache.store_entity('deezer', 'artist', str(result.get('id', '')), result)
|
||||
except Exception:
|
||||
pass
|
||||
logger.debug(f"Found artist for query: {artist_name}")
|
||||
return results[0]
|
||||
return result
|
||||
|
||||
logger.debug(f"No artist found for query: {artist_name}")
|
||||
return None
|
||||
|
|
@ -721,8 +728,15 @@ class DeezerClient:
|
|||
|
||||
results = data.get('data', [])
|
||||
if results and len(results) > 0:
|
||||
result = results[0]
|
||||
# Cache the album entity
|
||||
try:
|
||||
cache = get_metadata_cache()
|
||||
cache.store_entity('deezer', 'album', str(result.get('id', '')), result)
|
||||
except Exception:
|
||||
pass
|
||||
logger.debug(f"Found album for query: {artist_name} - {album_title}")
|
||||
return results[0]
|
||||
return result
|
||||
|
||||
logger.debug(f"No album found for query: {artist_name} - {album_title}")
|
||||
return None
|
||||
|
|
@ -759,8 +773,15 @@ class DeezerClient:
|
|||
|
||||
results = data.get('data', [])
|
||||
if results and len(results) > 0:
|
||||
result = results[0]
|
||||
# Cache the track entity
|
||||
try:
|
||||
cache = get_metadata_cache()
|
||||
cache.store_entity('deezer', 'track', str(result.get('id', '')), result)
|
||||
except Exception:
|
||||
pass
|
||||
logger.debug(f"Found track for query: {artist_name} - {track_title}")
|
||||
return results[0]
|
||||
return result
|
||||
|
||||
logger.debug(f"No track found for query: {artist_name} - {track_title}")
|
||||
return None
|
||||
|
|
@ -774,6 +795,7 @@ class DeezerClient:
|
|||
"""
|
||||
Get full album details by ID — raw Deezer format (enrichment interface).
|
||||
Used by deezer_worker.py for label/genre/explicit enrichment.
|
||||
Checks metadata cache first to avoid redundant API calls.
|
||||
|
||||
Args:
|
||||
album_id: Deezer album ID
|
||||
|
|
@ -781,6 +803,17 @@ class DeezerClient:
|
|||
Returns:
|
||||
Full album dict with label, genres, explicit flag or None
|
||||
"""
|
||||
# Check cache first — get_album_raw is called on every enrichment cycle
|
||||
try:
|
||||
cache = get_metadata_cache()
|
||||
cached = cache.get_entity('deezer', 'album', str(album_id))
|
||||
if cached and cached.get('label'):
|
||||
# Cache hit with full details (has label = was a get_album response, not just search)
|
||||
logger.debug(f"Cache hit for album {album_id}")
|
||||
return cached
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
try:
|
||||
response = self.session.get(
|
||||
f"{self.BASE_URL}/album/{album_id}",
|
||||
|
|
@ -793,6 +826,12 @@ class DeezerClient:
|
|||
logger.error(f"Deezer API error getting album {album_id}: {data['error']}")
|
||||
return None
|
||||
|
||||
# Cache the full album (includes genres, label, explicit)
|
||||
try:
|
||||
cache = get_metadata_cache()
|
||||
cache.store_entity('deezer', 'album', str(album_id), data)
|
||||
except Exception:
|
||||
pass
|
||||
logger.debug(f"Got full album details for ID: {album_id}")
|
||||
return data
|
||||
|
||||
|
|
@ -805,6 +844,7 @@ class DeezerClient:
|
|||
"""
|
||||
Get full track details by ID — raw Deezer format (enrichment interface, includes BPM).
|
||||
Used by deezer_worker.py for BPM enrichment.
|
||||
Checks metadata cache first to avoid redundant API calls.
|
||||
|
||||
Args:
|
||||
track_id: Deezer track ID
|
||||
|
|
@ -812,6 +852,16 @@ class DeezerClient:
|
|||
Returns:
|
||||
Full track dict with BPM or None
|
||||
"""
|
||||
# Check cache first
|
||||
try:
|
||||
cache = get_metadata_cache()
|
||||
cached = cache.get_entity('deezer', 'track', str(track_id))
|
||||
if cached and cached.get('bpm'):
|
||||
logger.debug(f"Cache hit for track {track_id}")
|
||||
return cached
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
try:
|
||||
response = self.session.get(
|
||||
f"{self.BASE_URL}/track/{track_id}",
|
||||
|
|
@ -824,6 +874,12 @@ class DeezerClient:
|
|||
logger.error(f"Deezer API error getting track {track_id}: {data['error']}")
|
||||
return None
|
||||
|
||||
# Cache the full track (includes BPM, ISRC, etc.)
|
||||
try:
|
||||
cache = get_metadata_cache()
|
||||
cache.store_entity('deezer', 'track', str(track_id), data)
|
||||
except Exception:
|
||||
pass
|
||||
logger.debug(f"Got full track details for ID: {track_id}")
|
||||
return data
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue