lastgenre: Better existing genres and fallback code

- Respect existing possibly different genre separators in
  _get_existing_genres.
- Use that genre list in a new "original fallback" step in _get_genre.
This commit is contained in:
J0J0 Todos 2025-08-13 11:02:40 +02:00
parent f24beca085
commit d539b16453

View file

@ -316,12 +316,34 @@ class LastGenrePlugin(plugins.BeetsPlugin):
are removed."""
separator = self.config["separator"].get()
if isinstance(obj, library.Item):
item_genre = obj.get("genre", with_album=False).split(separator)
genre_string = obj.get("genre", with_album=False)
else:
item_genre = obj.get("genre").split(separator)
genre_string = obj.get("genre")
# Filter out empty strings
return [g for g in item_genre if g]
# Check if any separators are present before attempting to split
if separator in genre_string:
item_genre = genre_string.split(separator)
else:
# Check for alternative separators
split_separator = None
# Intentionally keep whitespace (trim later)
for alt_sep in [";", "/", ","]:
if alt_sep in genre_string:
split_separator = alt_sep
break
if split_separator:
item_genre = genre_string.split(split_separator)
else:
# No separators found, return an empty or single genre list
item_genre = [genre_string] if genre_string else []
# Filter out empty strings and strip whitespace
final_keep = [g.strip() for g in item_genre if g.strip()]
self._log.debug(
f"Existing genres gathered: {final_keep}"
)
return final_keep
def _combine_resolve_and_log(
self, old: list[str], new: list[str]
@ -435,11 +457,20 @@ class LastGenrePlugin(plugins.BeetsPlugin):
):
return result
# Nothing found, leave original if configured and valid.
# Nothing found, leave original (split up) genres if configured and valid.
if keep_genres and self.config["keep_existing"]:
resolved_keep = self._resolve_genres(keep_genres)
self._log.debug("Resolved keep genres: {}", resolved_keep)
return self._format_and_stringify(
resolved_keep
), "original fallback (split and resolved)"
# Nothing found, leave original (single) genre if configured and valid.
if obj.genre and self.config["keep_existing"]:
if not self.whitelist or self._is_valid(obj.genre.lower()):
return obj.genre, "original fallback"
return obj.genre, "original fallback (as-is)"
self._log.debug("Pretend: No genre found. obj.genre is: {}", obj.genre)
# Return fallback string.
if fallback := self.config["fallback"].get():
return fallback, "fallback"