diff options
author | Michaël Ball <michael.ball@gmail.com> | 2017-11-16 21:44:28 +0000 |
---|---|---|
committer | Michaël Ball <michael.ball@gmail.com> | 2017-11-18 18:50:08 +0000 |
commit | 6410a21f5c7ac4a961f63fbc225407748497f0ff (patch) | |
tree | 3a461af2727b3b1d493ac91cb31cccfc9f535333 /lastfm_similarity.py | |
parent | 4dc732c4504eb8a9071cbfe8522aa7aad67f3a2b (diff) |
Ignore artists properly, choose random track when searching just by artist
Diffstat (limited to 'lastfm_similarity.py')
-rw-r--r-- | lastfm_similarity.py | 83 |
1 files changed, 46 insertions, 37 deletions
diff --git a/lastfm_similarity.py b/lastfm_similarity.py index 4e73d9d..5aa3343 100644 --- a/lastfm_similarity.py +++ b/lastfm_similarity.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import json import urllib2 +import random from gi.repository import GLib @@ -13,7 +14,7 @@ from quodlibet.query import Query from quodlibet.util.dprint import print_d -pconfig = PluginConfig("notify") +pconfig = PluginConfig("lastfm_similarity") pconfig.defaults.set("blacklist_track_count", 10) pconfig.defaults.set("blacklist_artist_count", 10) @@ -38,10 +39,11 @@ class LastFMSimilarity(EventPlugin): self._last_artists = [] def _check_artist_played(self, artist): - if artist in self._last_artists: - return True - else: - return False + for played_artist in self._last_artists: + if unicode(artist).upper() == played_artist.upper(): + return True + + return False def _check_track_played(self, track): if track in self._last_tracks: @@ -49,6 +51,11 @@ class LastFMSimilarity(EventPlugin): else: return False + def _add_played_artists(self, artists): + for artist in artists: + if artist not in self._last_artists: + self._last_artists.append(artist) + def _build_uri(self, request): return "".join((self.LAST_FM_API_URI, request, "&api_key=", self.API_KEY, "&format=json")) @@ -58,10 +65,13 @@ class LastFMSimilarity(EventPlugin): self.LAST_FM_API_METHODS["similar_tracks"])) if mbid: + print_d("Trying with mbid {}".format(mbid)) request = "".join((request, "&mbid=", mbid)) else: + print_d("Trying with {} - {}".format(artistname.splitlines()[0], + trackname)) request = "".join((request, "&track=", trackname, "&artist=", - artistname)) + artistname.splitlines()[0])) request = "".join((request, "&limit={}".format(limit))) @@ -87,6 +97,9 @@ class LastFMSimilarity(EventPlugin): return similar_tracks except KeyError: + if mbid: + return self._find_similar_tracks(trackname, artistname) + return [] else: @@ -97,9 +110,12 @@ class LastFMSimilarity(EventPlugin): self.LAST_FM_API_METHODS["similar_artists"])) if mbid: + print_d("Trying with artist mbid {}".format(mbid)) request = "".join((request, "&mbid=", mbid)) else: - request = "".join((request, "&artist=", artistname)) + print_d("Trying with {}".format(artistname.splitlines()[0])) + request = "".join((request, "&artist=", + artistname.splitlines()[0])) request = "".join((request, "&limit={}".format(limit))) @@ -124,13 +140,16 @@ class LastFMSimilarity(EventPlugin): return similar_artists except KeyError: + if mbid: + return self._find_similar_artists(artistname) + return [] else: return [] def on_change(self, song): - artist = song.get("artist") + artist = song.get("artist").splitlines()[0] track = song.get("title") candidates = [] @@ -149,10 +168,6 @@ class LastFMSimilarity(EventPlugin): print_d("[similarity] found track match: %s - %s" % (candidate[0], candidate[1])) - if (len(self._last_tracks) - == pconfig.getint("blacklist_track_count")): - del self._last_tracks[0] - query = Query.StrictQueryMatcher( "&(artist = \"%s\", title = \"%s\")" % (candidate[0], candidate[1])) @@ -165,15 +180,6 @@ class LastFMSimilarity(EventPlugin): if self._check_track_played(song.get("~filename")): continue - self._last_tracks.append(song.get("~filename")) - - if (len(self._last_artists) - == pconfig.getint( - "blacklist_artist_count")): - del self._last_artists[0] - - self._last_artists.append(song.get("artist")) - app.window.playlist.enqueue([song]) return @@ -191,32 +197,35 @@ class LastFMSimilarity(EventPlugin): try: results = filter(query.search, app.library) - for song in results: - if self._check_track_played(song.get("~filename")): - continue - - if (len(self._last_artists) - == pconfig.getint("blacklist_artist_count")): - del self._last_artists[0] + candidate_song_length = len(results) + for dummy in xrange(candidate_song_length): + idx = random.randint(0, (candidate_song_length - 1)) + song = results[idx] - self._last_artists.append(song.get("artist")) - self._last_tracks.append(song.get("~filename")) + if not self._check_track_played(song.get("~filename")): + app.window.playlist.enqueue([song]) + return - app.window.playlist.enqueue([song]) - return except AttributeError: pass def plugin_on_song_started(self, song): self._last_tracks.append(song.get("~filename")) - self._last_artists.append(song.get("artist")) + self._add_played_artists(song.get("artist").splitlines()) GLib.idle_add(self.on_change, song) def plugin_on_song_ended(self, song, stopped): - if len(self._last_tracks) == pconfig.getint("blacklist_track_count"): - del self._last_tracks[0] + track_count = len(self._last_tracks) + artist_count = len(self._last_artists) + max_track_count = pconfig.getint("blacklist_track_count") + max_artist_count = pconfig.getint("blacklist_artist_count") + + if track_count > max_track_count: + self._last_tracks = self._last_tracks[ + (track_count - max_track_count):track_count] - if len(self._last_artists) == pconfig.getint("blacklist_artist_count"): - del self._last_artists[0] + if artist_count > max_artist_count: + self._last_artists = self._last_artists[ + (artist_count - max_artist_count):artist_count] |