Use album artists for wishlist track grouping

Add album.artists to the album data when adding wishlist tracks and change the missing-tracks processing to prefer album-level artists for constructing artist context. The code now uses spotify_data.get('album') or {} and picks artist_ctx from album.artists first, falls back to source_info.artist_name (with safe JSON parsing if source_info is a string), then to track-level artists, and finally to a generic Unknown Artist. This ensures tracks from compilations or albums where the album artist differs from track artists are grouped consistently.
pull/165/head
Broque Thomas 3 months ago
parent f3a397fc74
commit a2cff3f16f

@ -12844,6 +12844,7 @@ def add_album_track_to_wishlist():
'album': {
'id': album.get('id'),
'name': album.get('name'),
'artists': album.get('artists', []),
'images': album_images,
'album_type': album.get('album_type', 'album'),
'release_date': album.get('release_date', ''),
@ -14624,21 +14625,44 @@ def _run_full_missing_tracks_process(batch_id, playlist_id, tracks_json):
if not spotify_data:
spotify_data = {}
s_album = spotify_data.get('album')
s_album = spotify_data.get('album') or {}
s_artists = spotify_data.get('artists', [])
# We need at least an album name and artist
if s_album and s_album.get('name'):
# Construct minimal artist context
# Construct artist context using ALBUM artist (not track artist)
# For compilations, track artists differ per track but the album artist
# (e.g. "Bon Jovi") must be consistent so all tracks land in one folder.
# Priority: 1) album.artists 2) source_info.artist_name 3) track artists
artist_ctx = {}
if s_artists and len(s_artists) > 0:
s_album_artists = s_album.get('artists', [])
source_info = track_info.get('source_info') or {}
if isinstance(source_info, str):
try:
import json
source_info = json.loads(source_info)
except:
source_info = {}
if s_album_artists and len(s_album_artists) > 0:
# Best: album-level artists stored in spotify_data.album.artists
first_artist = s_album_artists[0]
if isinstance(first_artist, dict):
artist_ctx = first_artist
else:
artist_ctx = {'name': str(first_artist)}
elif source_info.get('artist_name'):
# Fallback: album artist name from source_info (set at wishlist add time)
artist_ctx = {'name': source_info['artist_name']}
elif s_artists and len(s_artists) > 0:
# Last resort: track-level artist (old wishlist entries without album artist data)
first_artist = s_artists[0]
if isinstance(first_artist, dict):
artist_ctx = first_artist
else:
artist_ctx = {'name': str(first_artist)}
else:
# Fallback if no artist in spotify_data
# Fallback if no artist at all
artist_ctx = {'name': track_info.get('artist', 'Unknown Artist')}
# Construct minimal album context

Loading…
Cancel
Save