From 5b2390597382045a23130f00bc435861fcec2e5a Mon Sep 17 00:00:00 2001 From: Broque Thomas <26755000+Nezreka@users.noreply.github.com> Date: Thu, 2 Apr 2026 17:54:22 -0700 Subject: [PATCH] =?UTF-8?q?Fix=20Discogs=20artist=20albums=20=E2=80=94=20p?= =?UTF-8?q?refer=20masters,=20filter=20features,=20fix=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- core/discogs_client.py | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/core/discogs_client.py b/core/discogs_client.py index 1af00b1f..c15d1b04 100644 --- a/core/discogs_client.py +++ b/core/discogs_client.py @@ -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: