diff options
| -rw-r--r-- | lastfm_similarity.py | 63 | 
1 files 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] +  | 
