Fix slow Tidal playlist loading — metadata only, no track fetching
get_user_playlists_metadata_only() was fetching full track lists for every playlist sequentially (1+ API calls per playlist with 1s sleep between pagination pages). For 20+ playlists this took 30-60 seconds. Now returns only metadata (name, ID, track count, image) from a single V2 API call. Track count comes from the numberOfTracks attribute. Tracks are fetched on-demand when the user selects a specific playlist to sync/mirror via the existing get_playlist() endpoint.
This commit is contained in:
parent
03298afac1
commit
3154d16cf3
2 changed files with 25 additions and 17 deletions
|
|
@ -619,33 +619,41 @@ class TidalClient:
|
||||||
playlists = []
|
playlists = []
|
||||||
|
|
||||||
# Step 3: Process the playlists from the main 'data' array.
|
# Step 3: Process the playlists from the main 'data' array.
|
||||||
|
# Only extract metadata — tracks are fetched on-demand when the user
|
||||||
|
# selects a playlist to sync/mirror, not during the listing step.
|
||||||
for playlist_data in data.get('data', []):
|
for playlist_data in data.get('data', []):
|
||||||
attributes = playlist_data.get('attributes', {})
|
attributes = playlist_data.get('attributes', {})
|
||||||
playlist_id = playlist_data.get('id')
|
playlist_id = playlist_data.get('id')
|
||||||
|
|
||||||
# Create playlist with basic metadata first
|
# Extract image URL from relationships if available
|
||||||
|
image_url = None
|
||||||
|
try:
|
||||||
|
relationships = playlist_data.get('relationships', {})
|
||||||
|
image_rel = relationships.get('image', {}).get('data', {})
|
||||||
|
if image_rel:
|
||||||
|
# Image URL may be in included resources or constructed from ID
|
||||||
|
image_id = image_rel.get('id', '')
|
||||||
|
if image_id:
|
||||||
|
image_url = f"https://resources.tidal.com/images/{image_id.replace('-', '/')}/640x640.jpg"
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
new_playlist = Playlist(
|
new_playlist = Playlist(
|
||||||
id=str(playlist_id),
|
id=str(playlist_id),
|
||||||
name=attributes.get('name', 'Unknown Playlist'),
|
name=attributes.get('name', 'Unknown Playlist'),
|
||||||
description=attributes.get('description', ''),
|
description=attributes.get('description', ''),
|
||||||
external_urls={'tidal': f"https://listen.tidal.com/playlist/{playlist_id}"},
|
external_urls={'tidal': f"https://listen.tidal.com/playlist/{playlist_id}"},
|
||||||
public=attributes.get('accessType') == 'PUBLIC'
|
public=attributes.get('accessType') == 'PUBLIC',
|
||||||
|
tracks=[], # Empty — fetched on-demand via get_playlist()
|
||||||
)
|
)
|
||||||
|
# Store track count from metadata (no API call needed)
|
||||||
# Step 4: Fetch ALL tracks for this playlist using the paginated get_playlist() method
|
new_playlist.track_count = attributes.get('numberOfTracks', 0)
|
||||||
# This ensures we get all tracks, not just the first ~20
|
if image_url:
|
||||||
logger.info(f"Fetching full track list for playlist: {new_playlist.name} ({playlist_id})")
|
new_playlist.image_url = image_url
|
||||||
full_playlist = self.get_playlist(playlist_id)
|
|
||||||
|
|
||||||
if full_playlist and full_playlist.tracks:
|
|
||||||
new_playlist.tracks = full_playlist.tracks
|
|
||||||
logger.info(f"Added {len(full_playlist.tracks)} tracks to playlist {new_playlist.name}")
|
|
||||||
else:
|
|
||||||
logger.warning(f"Could not fetch tracks for playlist {playlist_id}, it will have 0 tracks")
|
|
||||||
|
|
||||||
playlists.append(new_playlist)
|
playlists.append(new_playlist)
|
||||||
|
|
||||||
logger.info(f"Successfully retrieved {len(playlists)} playlists with the V2 filter method.")
|
logger.info(f"Successfully retrieved {len(playlists)} playlists (metadata only) with the V2 filter method.")
|
||||||
return playlists
|
return playlists
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
|
||||||
|
|
@ -28485,8 +28485,8 @@ def get_tidal_playlists():
|
||||||
|
|
||||||
playlist_data = []
|
playlist_data = []
|
||||||
for p in playlists:
|
for p in playlists:
|
||||||
# Get track count from actual tracks if available
|
# Get track count from metadata (set during listing) or actual tracks
|
||||||
track_count = len(p.tracks) if hasattr(p, 'tracks') and p.tracks else 0
|
track_count = getattr(p, 'track_count', 0) or (len(p.tracks) if hasattr(p, 'tracks') and p.tracks else 0)
|
||||||
|
|
||||||
playlist_dict = {
|
playlist_dict = {
|
||||||
"id": p.id,
|
"id": p.id,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue