The MusicBrainzClient class handles all interactions with the MusicBrainz API:
# From tagqt/core/musicbrainz.py - API setupimport musicbrainzngsmusicbrainzngs.set_useragent("TagQt", "1.0", "https://github.com/example/tagqt")musicbrainzngs.set_rate_limit(limit_or_interval=1.0, new_requests=1)
# From tagqt/core/musicbrainz.py - Searching releases@classmethoddef search_release(cls, artist, album, track_title=None): if not artist and not album: return None def do_search(): return musicbrainzngs.search_releases( artist=artist, release=album, limit=10 ) data = cls._retry(do_search) if not data: return None releases = data.get("release-list", []) if not releases: return None # Prioritize official releases official = [r for r in releases if r.get("status") == "Official"] best = official[0] if official else releases[0]
# From tagqt/core/musicbrainz.py - Genre fallback# 1. Try release-level genrestags = best.get("tag-list", [])if tags: sorted_tags = sorted(tags, key=lambda x: int(x.get("count", 0)), reverse=True) result["genres"] = [t.get("name", "") for t in sorted_tags[:3]]# 2. Fallback to release group genresif not result["genres"] and result.get("release_group_id"): rg_genres = cls.lookup_release_group(result["release_group_id"]) if rg_genres: result["genres"] = rg_genres# 3. Fallback to artist genresif not result["genres"] and result.get("artist_id"): artist_genres = cls.lookup_artist(result["artist_id"]) if artist_genres: result["genres"] = artist_genres
# From tagqt/core/musicbrainz.py@classmethoddef lookup_release_group(cls, rg_id): if not rg_id: return [] def do_lookup(): return musicbrainzngs.get_release_group_by_id(rg_id, includes=["tags"]) data = cls._retry(do_lookup) if not data: return [] rg = data.get("release-group", {}) tags = rg.get("tag-list", []) if tags: sorted_tags = sorted(tags, key=lambda x: int(x.get("count", 0)), reverse=True) return [t.get("name", "") for t in sorted_tags[:3]] return []
# From tagqt/core/musicbrainz.py@classmethoddef lookup_artist(cls, artist_id): if not artist_id: return [] def do_lookup(): return musicbrainzngs.get_artist_by_id(artist_id, includes=["tags"]) data = cls._retry(do_lookup) if not data: return [] artist = data.get("artist", {}) tags = artist.get("tag-list", []) if tags: sorted_tags = sorted(tags, key=lambda x: int(x.get("count", 0)), reverse=True) return [t.get("name", "") for t in sorted_tags[:3]] return []