diff --git a/docs/changes.rst b/docs/changes.rst index 4a8548bf..624f7ef4 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -21,6 +21,13 @@ No description yet. - Support high bitrate (320k) audio. See :attr:`mopidy.settings.SPOTIFY_HIGH_BITRATE` for details. +- Last.fm frontend: + + - If you use the Last.fm frontend, you need to upgrade to pylast 0.5. + + - Update to use Last.fm's new Scrobbling 2.0 API, as the old Submissions + Protocol 1.2.1 is deprecated. (Fixes: :issue:`33`) + **Changes** diff --git a/mopidy/frontends/lastfm.py b/mopidy/frontends/lastfm.py index ddd621f8..8d912f64 100644 --- a/mopidy/frontends/lastfm.py +++ b/mopidy/frontends/lastfm.py @@ -15,8 +15,8 @@ from mopidy.utils.process import BaseThread logger = logging.getLogger('mopidy.frontends.lastfm') -CLIENT_ID = u'mop' -CLIENT_VERSION = get_version() +API_KEY = '2236babefa8ebb3d93ea467560d00d04' +API_SECRET = '94d9a09c0cd5be955c4afaeaffcaefcd' # pylast raises UnicodeEncodeError on conversion from unicode objects to # ascii-encoded bytestrings, so we explicitly encode as utf-8 before passing @@ -34,7 +34,7 @@ class LastfmFrontend(BaseFrontend): **Dependencies:** - - `pylast `_ >= 0.4.30 + - `pylast `_ >= 0.5 **Settings:** @@ -64,12 +64,11 @@ class LastfmFrontendThread(BaseThread): self.name = u'LastfmFrontendThread' self.connection = connection self.lastfm = None - self.scrobbler = None self.last_start_time = None def run_inside_try(self): self.setup() - while self.scrobbler is not None: + while self.lastfm is not None: self.connection.poll(None) message = self.connection.recv() self.process_message(message) @@ -78,10 +77,9 @@ class LastfmFrontendThread(BaseThread): try: username = settings.LASTFM_USERNAME password_hash = pylast.md5(settings.LASTFM_PASSWORD) - self.lastfm = pylast.get_lastfm_network( + self.lastfm = pylast.LastFMNetwork( + api_key=API_KEY, api_secret=API_SECRET, username=username, password_hash=password_hash) - self.scrobbler = self.lastfm.get_scrobbler( - CLIENT_ID, CLIENT_VERSION) logger.info(u'Connected to Last.fm') except SettingsError as e: logger.info(u'Last.fm scrobbler not started') @@ -103,12 +101,13 @@ class LastfmFrontendThread(BaseThread): self.last_start_time = int(time.time()) logger.debug(u'Now playing track: %s - %s', artists, track.name) try: - self.scrobbler.report_now_playing( + self.lastfm.update_now_playing( artists.encode(ENCODING), track.name.encode(ENCODING), album=track.album.name.encode(ENCODING), - duration=duration, - track_number=track.track_no) + duration=str(duration), + track_number=str(track.track_no), + mbid=(track.musicbrainz_id or '').encode(ENCODING)) except (pylast.ScrobblingError, socket.error) as e: logger.warning(u'Last.fm now playing error: %s', e) @@ -127,14 +126,13 @@ class LastfmFrontendThread(BaseThread): self.last_start_time = int(time.time()) - duration logger.debug(u'Scrobbling track: %s - %s', artists, track.name) try: - self.scrobbler.scrobble( + self.lastfm.scrobble( artists.encode(ENCODING), track.name.encode(ENCODING), - time_started=self.last_start_time, - source=pylast.SCROBBLE_SOURCE_USER, - mode=pylast.SCROBBLE_MODE_PLAYED, - duration=duration, + str(self.last_start_time), album=track.album.name.encode(ENCODING), - track_number=track.track_no) + track_number=str(track.track_no), + duration=str(duration), + mbid=(track.musicbrainz_id or '').encode(ENCODING)) except (pylast.ScrobblingError, socket.error) as e: logger.warning(u'Last.fm scrobbling error: %s', e)