From d667fca02e8ed55f1bb154ee27168e304ea55335 Mon Sep 17 00:00:00 2001 From: Peter Schnebel Date: Wed, 6 Feb 2013 08:04:58 +0100 Subject: [PATCH 1/4] Do not write track-level genres if source is not 'track'. For 'Various Artist' compilations without a usefull 'album' genre, pick the most used track / track-artist genre. --- beetsplug/lastgenre/__init__.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/beetsplug/lastgenre/__init__.py b/beetsplug/lastgenre/__init__.py index 7d2bf8517..544289f1f 100644 --- a/beetsplug/lastgenre/__init__.py +++ b/beetsplug/lastgenre/__init__.py @@ -281,6 +281,18 @@ class LastGenrePlugin(plugins.BeetsPlugin): result = fetch_artist_genre(obj) elif obj.albumartist != 'Various Artists': result = fetch_album_artist_genre(obj) + else: + # For 'Various Artists' pick the most used common tag as + # album_tag + artist_genres = {} + for item in obj.items(): + tmp_genre = fetch_artist_genre(item) + if tmp_genre: + artist_genres[tmp_genre] = \ + artist_genres.get(tmp_genre, 0) + 1 + if len(artist_genres) > 0: + result = filter(lambda k:artist_genres[k] == + max(artist_genres.values()), artist_genres)[0] if result: return result, 'artist' @@ -316,11 +328,13 @@ class LastGenrePlugin(plugins.BeetsPlugin): )) for item in album.items(): - item.genre, src = self._get_genre(item) - lib.store(item) - log.info(u'genre for track {0} - {1} ({2}): {3}'.format( - item.artist, item.title, src, item.genre - )) + if 'track' in self.sources: + # Fetch track genre only if source is 'track' + item.genre, src = self._get_genre(item) + lib.store(item) + log.info(u'genre for track {0} - {1} ({2}): {3}'.format( + item.artist, item.title, src, item.genre + )) if write: item.write() From 9f1e9031b6062463499c89a9e22bae3872dd42af Mon Sep 17 00:00:00 2001 From: Peter Schnebel Date: Wed, 6 Feb 2013 08:15:29 +0100 Subject: [PATCH 2/4] Try to guess 'Various Artists' genre based on track genres if source is 'track'. --- beetsplug/lastgenre/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/beetsplug/lastgenre/__init__.py b/beetsplug/lastgenre/__init__.py index 544289f1f..20c93d109 100644 --- a/beetsplug/lastgenre/__init__.py +++ b/beetsplug/lastgenre/__init__.py @@ -286,7 +286,11 @@ class LastGenrePlugin(plugins.BeetsPlugin): # album_tag artist_genres = {} for item in obj.items(): - tmp_genre = fetch_artist_genre(item) + tmp_genre = None + if 'track' in self.sources: + tmp_genre = fetch_track_genre(item) + if not tmp_genre: + tmp_genre = fetch_artist_genre(item) if tmp_genre: artist_genres[tmp_genre] = \ artist_genres.get(tmp_genre, 0) + 1 From 7193f4e8636752791b5bd2eb3b199cdbbeb16ed6 Mon Sep 17 00:00:00 2001 From: Peter Schnebel Date: Wed, 6 Feb 2013 08:41:20 +0100 Subject: [PATCH 3/4] Do not write track-level genres if source is not 'track'. --- beetsplug/lastgenre/__init__.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/beetsplug/lastgenre/__init__.py b/beetsplug/lastgenre/__init__.py index 20c93d109..a1a29e8f7 100644 --- a/beetsplug/lastgenre/__init__.py +++ b/beetsplug/lastgenre/__init__.py @@ -357,10 +357,11 @@ class LastGenrePlugin(plugins.BeetsPlugin): log.debug(u'added last.fm album genre ({0}): {1}'.format( src, album.genre)) for item in album.items(): - item.genre, src = self._get_genre(item) - log.debug(u'added last.fm item genre ({0}): {1}'.format( - src, item.genre)) - session.lib.store(item) + if 'track' in self.sources: + item.genre, src = self._get_genre(item) + log.debug(u'added last.fm item genre ({0}): {1}'.format( + src, item.genre)) + session.lib.store(item) else: item = task.item From e5e3eda676bac547bc98b73e59866a4ecc60aafc Mon Sep 17 00:00:00 2001 From: Peter Schnebel Date: Wed, 6 Feb 2013 09:37:07 +0100 Subject: [PATCH 4/4] Fixed error message for invalid config option. --- beets/util/confit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beets/util/confit.py b/beets/util/confit.py index e552ba9fd..7af3bf733 100644 --- a/beets/util/confit.py +++ b/beets/util/confit.py @@ -357,7 +357,7 @@ class ConfigView(object): if value not in choices: raise ConfigValueError( '{0} must be one of {1}, not {2}'.format( - self.name, repr(value), repr(list(choices)) + self.name, repr(list(choices)), repr(value) ) )