diff --git a/streamrip/metadata/album.py b/streamrip/metadata/album.py index 01b48ed2..fa15bb70 100644 --- a/streamrip/metadata/album.py +++ b/streamrip/metadata/album.py @@ -84,7 +84,16 @@ def format_folder_path(self, formatter: str) -> str: def from_qobuz(cls, resp: dict) -> AlbumMetadata: album = resp.get("title", "Unknown Album") tracktotal = resp.get("tracks_count", 1) - genre = [safe_get(resp, "genre", "name")] or resp.get("genre") or [] + # `genres_list` is the genre hierarchy returned by Qobuz, e.g. + # ["Pop/Rock", "Pop/Rock→Rock"], which expands to ["Pop", "Rock"]. + # For some accounts it is a flat, localised list of leaf names instead, + # in which case `genre.name` carries the canonical genre (see #618). + raw_genres = [g for g in (resp.get("genres_list") or []) if isinstance(g, str)] + if any("/" in g or "\u2192" in g for g in raw_genres): + genre = raw_genres + else: + genre_name = safe_get(resp, "genre", "name") + genre = [genre_name] if genre_name else raw_genres genres = list(set(genre_clean.findall("/".join(genre)))) date = resp.get("release_date_original") or resp.get("release_date") year = date[:4] if date is not None else "Unknown" diff --git a/tests/test_meta.py b/tests/test_meta.py index 01032baa..2c04e236 100644 --- a/tests/test_meta.py +++ b/tests/test_meta.py @@ -61,3 +61,12 @@ def test_track_metadata_qobuz(): assert t.tracknumber == 9 assert t.discnumber == 1 assert t.composer == "John Darnielle" + + +def test_album_metadata_qobuz_without_genre(): + """An album response without `genre`/`genres_list` must not raise.""" + resp = { + k: v for k, v in qobuz_album_resp.items() if k not in ("genre", "genres_list") + } + m = AlbumMetadata.from_qobuz(resp) + assert m.genre == []