lastgenre: Apply blacklist in final resolve loop

since due to canonicalization blacklisted genres might have been added
again (even though they were kicked already right after last.fm
fetching.
This commit is contained in:
J0J0 Todos 2025-09-10 20:19:01 +02:00
parent a5fd548f6e
commit d67ffa487d

View file

@ -266,7 +266,7 @@ class LastGenrePlugin(plugins.BeetsPlugin):
depth_tag_pairs.sort(reverse=True) depth_tag_pairs.sort(reverse=True)
return [p[1] for p in depth_tag_pairs] return [p[1] for p in depth_tag_pairs]
def _resolve_genres(self, tags: list[str]) -> list[str]: def _resolve_genres(self, tags: list[str], artist: str = None) -> list[str]:
"""Canonicalize, sort and filter a list of genres. """Canonicalize, sort and filter a list of genres.
- Returns an empty list if the input tags list is empty. - Returns an empty list if the input tags list is empty.
@ -322,7 +322,11 @@ class LastGenrePlugin(plugins.BeetsPlugin):
# c14n only adds allowed genres but we may have had forbidden genres in # c14n only adds allowed genres but we may have had forbidden genres in
# the original tags list # the original tags list
valid_tags = [t for t in tags if self._is_valid(t)] valid_tags = [
t
for t in tags
if self._is_valid(t) and not self._is_forbidden(t, artist=artist)
]
return valid_tags[:count] return valid_tags[:count]
def fetch_genre(self, lastfm_obj): def fetch_genre(self, lastfm_obj):
@ -453,13 +457,13 @@ class LastGenrePlugin(plugins.BeetsPlugin):
return [g for g in item_genre if g] return [g for g in item_genre if g]
def _combine_resolve_and_log( def _combine_resolve_and_log(
self, old: list[str], new: list[str] self, old: list[str], new: list[str], artist: str = None
) -> list[str]: ) -> list[str]:
"""Combine old and new genres and process via _resolve_genres.""" """Combine old and new genres and process via _resolve_genres."""
self._log.debug("raw last.fm tags: {}", new) self._log.debug("raw last.fm tags: {}", new)
self._log.debug("existing genres taken into account: {}", old) self._log.debug("existing genres taken into account: {}", old)
combined = old + new combined = old + new
return self._resolve_genres(combined) return self._resolve_genres(combined, artist=artist)
def _get_genre( def _get_genre(
self, obj: Union[Album, Item] self, obj: Union[Album, Item]
@ -485,8 +489,9 @@ class LastGenrePlugin(plugins.BeetsPlugin):
def _try_resolve_stage(stage_label: str, keep_genres, new_genres): def _try_resolve_stage(stage_label: str, keep_genres, new_genres):
"""Try to resolve genres for a given stage and log the result.""" """Try to resolve genres for a given stage and log the result."""
artist = getattr(obj, 'albumartist', None) or getattr(obj, 'artist', None)
resolved_genres = self._combine_resolve_and_log( resolved_genres = self._combine_resolve_and_log(
keep_genres, new_genres keep_genres, new_genres, artist=artist
) )
if resolved_genres: if resolved_genres:
suffix = "whitelist" if self.whitelist else "any" suffix = "whitelist" if self.whitelist else "any"