@@ -322,16 +322,51 @@ def _dedup_genres(self, genres, whitelist_only=True):
322
322
else :
323
323
return deduplicate ([g for g in genres ])
324
324
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
+
325
350
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 :
329
354
- track (for Items only)
330
355
- album
331
356
- artist
332
357
- original
333
358
- fallback
334
359
- 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.
335
370
"""
336
371
337
372
separator = self .config ["separator" ].get ()
@@ -359,31 +394,25 @@ def _get_genre(self, obj):
359
394
360
395
# Track genre (for Items only).
361
396
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
+ )
369
401
370
402
# Album genre.
371
403
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
+ )
379
408
380
409
# Artist (or album artist) genre.
381
410
if "artist" in self .sources :
382
- result = None
411
+ new_genres = None
383
412
if isinstance (obj , library .Item ):
384
- result = self .fetch_artist_genre (obj )
413
+ new_genres = self .fetch_artist_genre (obj )
385
414
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 )
387
416
else :
388
417
# For "Various Artists", pick the most popular track genre.
389
418
item_genres = []
@@ -396,14 +425,11 @@ def _get_genre(self, obj):
396
425
if item_genre :
397
426
item_genres .append (item_genre )
398
427
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
+ )
407
433
408
434
# Filter the existing genre.
409
435
if obj .genre :
0 commit comments