Skip to content

Commit 796a3bf

Browse files
committed
Refactor keep/new genres combination
- Handle genre combintation logic in a well documented helper function that. Also include type hints while we are at it. - Throughout the _get_genre function rename the result variable to new_genres to make it clearly descriptive. - Rewrite thze _get_genre function's docstring.
1 parent 675fd44 commit 796a3bf

File tree

1 file changed

+54
-28
lines changed

1 file changed

+54
-28
lines changed

beetsplug/lastgenre/__init__.py

Lines changed: 54 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -322,16 +322,51 @@ def _dedup_genres(self, genres, whitelist_only=True):
322322
else:
323323
return deduplicate([g for g in genres])
324324

325+
def _combine_and_label_genres(
326+
self, new_genres: str, keep_genres: list, separator: str, log_label: str
327+
) -> tuple:
328+
"""Combines genres and returns them with a logging label.
329+
330+
Parameters:
331+
new_genres (str): The new genre string result to process.
332+
keep_genres (list): Existing genres to combine with new ones
333+
separator (str): Separator used to split and join genre strings.
334+
log_label (str): A label (like "track", "album") we possibly
335+
combine with a prefix. For example resulting in something like
336+
"keep + track" or just "track".
337+
338+
Returns:
339+
tuple: A tuple containing the combined genre string and the "logging
340+
label".
341+
"""
342+
if new_genres and keep_genres:
343+
split_genres = new_genres.split(separator)
344+
combined_genres = deduplicate(keep_genres + split_genres)
345+
return separator.join(combined_genres), f"keep + {log_label}"
346+
elif new_genres:
347+
return new_genres, log_label
348+
return "", log_label
349+
325350
def _get_genre(self, obj):
326-
"""Get the genre string for an Album or Item object based on
327-
self.sources. Return a `(genre, source)` pair. The
328-
prioritization order is:
351+
"""Get the final genre string for an Album or Item object
352+
353+
`self.sources` specifies allowed genre sources, prioritized as follows:
329354
- track (for Items only)
330355
- album
331356
- artist
332357
- original
333358
- fallback
334359
- None
360+
361+
Parameters:
362+
obj: Either an Album or Item object.
363+
364+
Returns:
365+
tuple: A `(genre, label)` pair, where `label` is a string used for
366+
logging that describes the result. For example, "keep + artist"
367+
indicates that existing genres were combined with new last.fm
368+
genres, while "artist" means only new last.fm genres are
369+
included.
335370
"""
336371

337372
separator = self.config["separator"].get()
@@ -359,31 +394,25 @@ def _get_genre(self, obj):
359394

360395
# Track genre (for Items only).
361396
if isinstance(obj, library.Item) and "track" in self.sources:
362-
result = self.fetch_track_genre(obj)
363-
if result and keep_genres:
364-
results = result.split(separator)
365-
combined_genres = deduplicate(keep_genres + results)
366-
return separator.join(combined_genres), "keep + track"
367-
elif result:
368-
return result, "track"
397+
new_genres = self.fetch_track_genre(obj)
398+
return self._combine_and_label_genres(
399+
new_genres, keep_genres, separator, "track"
400+
)
369401

370402
# Album genre.
371403
if "album" in self.sources:
372-
result = self.fetch_album_genre(obj)
373-
if result and keep_genres:
374-
results = result.split(separator)
375-
combined_genres = deduplicate(keep_genres + results)
376-
return separator.join(combined_genres), "keep + album"
377-
elif result:
378-
return result, "album"
404+
new_genres = self.fetch_album_genre(obj)
405+
return self._combine_and_label_genres(
406+
new_genres, keep_genres, separator, "album"
407+
)
379408

380409
# Artist (or album artist) genre.
381410
if "artist" in self.sources:
382-
result = None
411+
new_genres = None
383412
if isinstance(obj, library.Item):
384-
result = self.fetch_artist_genre(obj)
413+
new_genres = self.fetch_artist_genre(obj)
385414
elif obj.albumartist != config["va_name"].as_str():
386-
result = self.fetch_album_artist_genre(obj)
415+
new_genres = self.fetch_album_artist_genre(obj)
387416
else:
388417
# For "Various Artists", pick the most popular track genre.
389418
item_genres = []
@@ -396,14 +425,11 @@ def _get_genre(self, obj):
396425
if item_genre:
397426
item_genres.append(item_genre)
398427
if item_genres:
399-
result, _ = plurality(item_genres)
400-
401-
if result and keep_genres:
402-
results = result.split(separator)
403-
combined_genres = deduplicate(keep_genres + results)
404-
return separator.join(combined_genres), "keep + artist"
405-
elif result:
406-
return result, "artist"
428+
new_genres, _ = plurality(item_genres)
429+
430+
return self._combine_and_label_genres(
431+
new_genres, keep_genres, separator, "artist"
432+
)
407433

408434
# Filter the existing genre.
409435
if obj.genre:

0 commit comments

Comments
 (0)