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
|
return result
|
||||||
|
|
||||||
def get_artist_albums(self, artist_id: str, album_type: str = 'album,single', limit: int = 50) -> List[Album]:
|
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', {
|
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'):
|
if not data or not data.get('releases'):
|
||||||
return []
|
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 = []
|
albums = []
|
||||||
seen_titles = set()
|
seen_titles = set()
|
||||||
for item in data['releases']:
|
allowed_types = set(album_type.split(','))
|
||||||
try:
|
|
||||||
# Filter by role (only include releases where artist is main)
|
|
||||||
role = item.get('role', 'Main').lower()
|
|
||||||
if role not in ('main', ''):
|
|
||||||
continue
|
|
||||||
|
|
||||||
|
for item in ordered:
|
||||||
|
try:
|
||||||
album = Album.from_discogs_release(item)
|
album = Album.from_discogs_release(item)
|
||||||
|
|
||||||
# Deduplicate
|
# Deduplicate by normalized title
|
||||||
dedup_key = album.name.lower()
|
dedup_key = album.name.lower().strip()
|
||||||
if dedup_key in seen_titles:
|
if dedup_key in seen_titles:
|
||||||
continue
|
continue
|
||||||
seen_titles.add(dedup_key)
|
seen_titles.add(dedup_key)
|
||||||
|
|
||||||
# Filter by type
|
# Filter by requested type
|
||||||
if album.album_type in album_type.split(','):
|
if album.album_type in allowed_types:
|
||||||
albums.append(album)
|
albums.append(album)
|
||||||
|
|
||||||
if len(albums) >= limit:
|
if len(albums) >= limit:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue