From 4f421589b70015b1d737290d39aaf9e71e13f757 Mon Sep 17 00:00:00 2001 From: Michaël Ball Date: Thu, 31 May 2018 21:36:16 +0100 Subject: Work with python 3 for Quodlibet 4.x --- lastfm_similarity.py | 63 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/lastfm_similarity.py b/lastfm_similarity.py index af46aa6..1300157 100644 --- a/lastfm_similarity.py +++ b/lastfm_similarity.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- +"""Last.fm similarity plugin for Quod Libet.""" import json -import urllib2 +from urllib.request import urlopen +from urllib.error import URLError import random from gi.repository import GLib, Gtk @@ -13,6 +15,8 @@ from quodlibet.util.dprint import print_d class LastFMSimilarity(EventPlugin): + """Last.fm similarity event plugin.""" + PLUGIN_ID = "Last.fm Similarity" PLUGIN_NAME = _("Last.fm Similarity") PLUGIN_DESC = _("Finds a similar song using Last.fm's track similarity API" @@ -28,37 +32,51 @@ class LastFMSimilarity(EventPlugin): } def __init__(self): - self._blacklist_track_count = config.getint("plugins", "lastfm_similarity_blacklist_tracks", 10) - self._blacklist_artist_count = config.getint("plugins", "lastfm_similarity_blacklist_artists", 10) + """Initialize the plugin.""" + self._blacklist_track_count = config.getint( + "plugins", "lastfm_similarity_blacklist_tracks", 10) + self._blacklist_artist_count = config.getint( + "plugins", "lastfm_similarity_blacklist_artists", 10) self._last_tracks = [] self._last_artists = [] def PluginPreferences(self, parent): + """Plugin Preferences.""" def blacklist_track_changed(entry): self._blacklist_track_count = int(entry.get_value()) - config.set("plugins", "lastfm_similarity_blacklist_tracks", self._blacklist_track_count) + config.set("plugins", "lastfm_similarity_blacklist_tracks", + self._blacklist_track_count) def blacklist_artist_changed(entry): self._blacklist_artist_count = int(entry.get_value()) - config.set("plugins", "lastfm_similarity_blacklist_artist", self._blacklist_artist_count) + config.set("plugins", "lastfm_similarity_blacklist_artist", + self._blacklist_artist_count) table = Gtk.Table(rows=2, columns=2) table.set_row_spacings(6) table.set_col_spacings(6) - table.attach(Gtk.Label(label=_("Number of recently played tracks to blacklist:")), 0, 1, 0, 1) - track_entry = Gtk.SpinButton(adjustment=Gtk.Adjustment.new(self._blacklist_track_count, 0, 1000, 1, 10, 0)) + table.attach( + Gtk.Label( + label=_("Number of recently played tracks to blacklist:")), + 0, 1, 0, 1) + track_entry = Gtk.SpinButton(adjustment=Gtk.Adjustment.new( + self._blacklist_track_count, 0, 1000, 1, 10, 0)) track_entry.connect("value-changed", blacklist_track_changed) table.attach(track_entry, 1, 2, 0, 1) - table.attach(Gtk.Label(label=_("Number of recently played artists to blacklist:")), 0, 1, 1, 2) - artist_entry = Gtk.SpinButton(adjustment=Gtk.Adjustment.new(self._blacklist_artist_count, 0, 1000, 1, 10, 0)) + table.attach( + Gtk.Label( + label=_("Number of recently played artists to blacklist:")), + 0, 1, 1, 2) + artist_entry = Gtk.SpinButton(adjustment=Gtk.Adjustment.new( + self._blacklist_artist_count, 0, 1000, 1, 10, 0)) artist_entry.connect("value-changed", blacklist_artist_changed) table.attach(artist_entry, 1, 2, 1, 2) return table def _check_artist_played(self, artist): for played_artist in self._last_artists: - if unicode(artist).upper() == played_artist.upper(): + if artist.upper() == played_artist.upper(): return True return False @@ -98,15 +116,15 @@ class LastFMSimilarity(EventPlugin): stream = None try: - stream = urllib2.urlopen(uri) - except urllib2.URLError: + stream = urlopen(uri) + except URLError: return [] if stream.getcode() == 200: similar_tracks = [] try: - response = json.load(stream) + response = json.loads(str(stream.read(), "utf-8")) for track in response["similartracks"]["track"]: similar_tracks.append( @@ -142,15 +160,15 @@ class LastFMSimilarity(EventPlugin): stream = None try: - stream = urllib2.urlopen(uri) - except urllib2.URLError: + stream = urlopen(uri) + except URLError: return [] if stream.getcode() == 200: similar_artists = [] try: - response = json.load(stream) + response = json.loads(str(stream.read(), "utf-8")) for artist in response["similarartists"]["artist"]: similar_artists.append(artist["name"]) @@ -167,6 +185,7 @@ class LastFMSimilarity(EventPlugin): return [] def on_change(self, song): + """Find similar track on song change.""" artist = song.get("artist").splitlines()[0] track = song.get("title") @@ -190,7 +209,8 @@ class LastFMSimilarity(EventPlugin): "&(artist = \"%s\", title = \"%s\")" % (candidate[0], candidate[1])) try: - results = filter(query.search, app.library) + results = list(filter(query.search, app.library)) + print_d("results: %s" % results) if results: song = results[0] @@ -213,10 +233,11 @@ class LastFMSimilarity(EventPlugin): query = Query.StrictQueryMatcher( "&(artist = \"%s\", title != \"[silence]\")" % artist) try: - results = filter(query.search, app.library) + results = list(filter(query.search, app.library)) + print_d("results: %s" % results) candidate_song_length = len(results) - for dummy in xrange(candidate_song_length): + for dummy in range(candidate_song_length): idx = random.randint(0, (candidate_song_length - 1)) song = results[idx] @@ -228,13 +249,14 @@ class LastFMSimilarity(EventPlugin): pass def plugin_on_song_started(self, song): + """Append current track to last played tracks and artists.""" self._last_tracks.append(song.get("~filename")) self._add_played_artists(song.get("artist").splitlines()) GLib.idle_add(self.on_change, song) def plugin_on_song_ended(self, song, stopped): - + """Append current track to last played tracks and artists.""" track_count = len(self._last_tracks) artist_count = len(self._last_artists) @@ -245,3 +267,4 @@ class LastFMSimilarity(EventPlugin): if artist_count > self._blacklist_artist_count: self._last_artists = self._last_artists[ (artist_count - self._blacklist_artist_count):artist_count] + -- cgit v1.2.3 From 0ca2ce025817db215e78de297e2bac3380b369ab Mon Sep 17 00:00:00 2001 From: Michaël Ball Date: Thu, 31 May 2018 23:00:46 +0100 Subject: Build URI parameters correctly for artists/tracks with non-latin characters --- lastfm_similarity.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lastfm_similarity.py b/lastfm_similarity.py index 1300157..d2e04ba 100644 --- a/lastfm_similarity.py +++ b/lastfm_similarity.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- """Last.fm similarity plugin for Quod Libet.""" import json +from urllib.parse import quote from urllib.request import urlopen from urllib.error import URLError import random @@ -106,8 +107,8 @@ class LastFMSimilarity(EventPlugin): else: print_d("Trying with {} - {}".format(artistname.splitlines()[0], trackname)) - request = "".join((request, "&track=", trackname, "&artist=", - artistname.splitlines()[0])) + request = "".join((request, "&track=", quote(trackname), "&artist=", + quote(artistname.splitlines()[0]))) request = "".join((request, "&limit={}".format(limit))) @@ -151,7 +152,7 @@ class LastFMSimilarity(EventPlugin): else: print_d("Trying with {}".format(artistname.splitlines()[0])) request = "".join((request, "&artist=", - artistname.splitlines()[0])) + quote(artistname.splitlines()[0]))) request = "".join((request, "&limit={}".format(limit))) @@ -210,7 +211,6 @@ class LastFMSimilarity(EventPlugin): % (candidate[0], candidate[1])) try: results = list(filter(query.search, app.library)) - print_d("results: %s" % results) if results: song = results[0] @@ -234,7 +234,6 @@ class LastFMSimilarity(EventPlugin): "&(artist = \"%s\", title != \"[silence]\")" % artist) try: results = list(filter(query.search, app.library)) - print_d("results: %s" % results) candidate_song_length = len(results) for dummy in range(candidate_song_length): -- cgit v1.2.3