Fix Discogs artist albums — prefer masters, filter features, fix types
- Prefer master releases over individual pressings to avoid duplicates (multiple pressings of same album showing separately) - Individual releases only included if no master exists for that title - Skip non-main roles (appearances, features, remixes by others) - Better album type detection from format string: catches LP, Album, EP, Single, Compilation from comma-separated format field - Fetch more results (3x limit) to compensate for filtering
This commit is contained in:
parent
a9eccfe1c5
commit
5b23905973
1 changed files with 29 additions and 12 deletions
|
|
@ -463,32 +463,49 @@ class DiscogsClient:
|
|||
return result
|
||||
|
||||
def get_artist_albums(self, artist_id: str, album_type: str = 'album,single', limit: int = 50) -> List[Album]:
|
||||
"""Get releases by an artist."""
|
||||
"""Get releases by an artist. Prefers master releases over individual pressings."""
|
||||
data = self._api_get(f'/artists/{artist_id}/releases', {
|
||||
'sort': 'year', 'sort_order': 'desc', 'per_page': min(limit, 100),
|
||||
'sort': 'year', 'sort_order': 'desc', 'per_page': min(limit * 3, 200),
|
||||
})
|
||||
if not data or not data.get('releases'):
|
||||
return []
|
||||
|
||||
# Separate masters from individual releases — prefer masters (canonical versions)
|
||||
masters = []
|
||||
releases_no_master = []
|
||||
master_titles = set()
|
||||
|
||||
for item in data['releases']:
|
||||
# Skip non-main roles (appearances, features, remixes by others)
|
||||
role = item.get('role', 'Main').lower()
|
||||
if role not in ('main', ''):
|
||||
continue
|
||||
|
||||
if item.get('type') == 'master':
|
||||
masters.append(item)
|
||||
master_titles.add(item.get('title', '').lower())
|
||||
else:
|
||||
releases_no_master.append(item)
|
||||
|
||||
# Use masters first, then add releases that don't have a master
|
||||
ordered = masters + [r for r in releases_no_master if r.get('title', '').lower() not in master_titles]
|
||||
|
||||
albums = []
|
||||
seen_titles = set()
|
||||
for item in data['releases']:
|
||||
try:
|
||||
# Filter by role (only include releases where artist is main)
|
||||
role = item.get('role', 'Main').lower()
|
||||
if role not in ('main', ''):
|
||||
continue
|
||||
allowed_types = set(album_type.split(','))
|
||||
|
||||
for item in ordered:
|
||||
try:
|
||||
album = Album.from_discogs_release(item)
|
||||
|
||||
# Deduplicate
|
||||
dedup_key = album.name.lower()
|
||||
# Deduplicate by normalized title
|
||||
dedup_key = album.name.lower().strip()
|
||||
if dedup_key in seen_titles:
|
||||
continue
|
||||
seen_titles.add(dedup_key)
|
||||
|
||||
# Filter by type
|
||||
if album.album_type in album_type.split(','):
|
||||
# Filter by requested type
|
||||
if album.album_type in allowed_types:
|
||||
albums.append(album)
|
||||
|
||||
if len(albums) >= limit:
|
||||
|
|
|
|||
Loading…
Reference in a new issue