diff --git a/AUTHORS.rst b/AUTHORS.rst index e8c7f224..fc4b5611 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -7,8 +7,3 @@ Contributors to Mopidy in the order of appearance: - Johannes Knutsen - Thomas Adamcik - Kristian Klette - -Also, we would like to thank: - -- Jørgen P. Tjernø for his work on the Python wrapper for Despotify. -- Doug Winter for his work on the Python wrapper for libspotify. diff --git a/docs/changes.rst b/docs/changes.rst index a0a02ce7..d3ed3db2 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -47,12 +47,16 @@ greatly improved MPD client support. - Fixed delete current playing track from playlist, which crashed several clients. - Implement ``seek`` and ``seekid``. + - Fix ``playlistfind`` output so the correct song is played when playing + songs directly from search results in GMPC. - Backends: - Rename :mod:`mopidy.backends.gstreamer` to :mod:`mopidy.backends.local`. - Remove :mod:`mopidy.backends.despotify`, as Despotify is little maintained and the Libspotify backend is working much better. + - Rename ``mopidy.frontends.mpd.{serializer => translator}`` to match naming + in backends. - Backend API: diff --git a/docs/installation/libspotify.rst b/docs/installation/libspotify.rst index 635c0495..911bf39e 100644 --- a/docs/installation/libspotify.rst +++ b/docs/installation/libspotify.rst @@ -63,4 +63,12 @@ Check out the pyspotify code, and install it:: git clone git://github.com/jodal/pyspotify.git cd pyspotify/pyspotify/ + sudo rm -rf build/ # If you are upgrading pyspotify sudo python setup.py install + +.. note:: + + The ``sudo rm -rf build/`` step is needed if you are upgrading pyspotify. + Simply running ``python setup.py clean`` will *not* clean out the C parts + of the ``build/`` directory, and you will thus not get any changes to the C + code included in your installation. diff --git a/mopidy/backends/base/__init__.py b/mopidy/backends/base/__init__.py index 7a178160..80c4d0c0 100644 --- a/mopidy/backends/base/__init__.py +++ b/mopidy/backends/base/__init__.py @@ -8,7 +8,7 @@ from mopidy.backends.base.current_playlist import BaseCurrentPlaylistController from mopidy.backends.base.library import BaseLibraryController from mopidy.backends.base.playback import BasePlaybackController from mopidy.backends.base.stored_playlists import BaseStoredPlaylistsController -from mopidy.frontends.mpd import serializer +from mopidy.frontends.mpd import translator from mopidy.models import Playlist from mopidy.utils import get_class diff --git a/mopidy/backends/base/current_playlist.py b/mopidy/backends/base/current_playlist.py index 1eee8d0c..fc17bbee 100644 --- a/mopidy/backends/base/current_playlist.py +++ b/mopidy/backends/base/current_playlist.py @@ -2,7 +2,7 @@ from copy import copy import logging import random -from mopidy.frontends.mpd import serializer +from mopidy.frontends.mpd import translator logger = logging.getLogger('mopidy.backends.base') @@ -196,4 +196,4 @@ class BaseCurrentPlaylistController(object): def mpd_format(self, *args, **kwargs): """Not a part of the generic backend API.""" kwargs['cpids'] = [ct[0] for ct in self._cp_tracks] - return serializer.tracks_to_mpd_format(self.tracks, *args, **kwargs) + return translator.tracks_to_mpd_format(self.tracks, *args, **kwargs) diff --git a/mopidy/frontends/mpd/protocol/current_playlist.py b/mopidy/frontends/mpd/protocol/current_playlist.py index 30acbe89..c10d1dad 100644 --- a/mopidy/frontends/mpd/protocol/current_playlist.py +++ b/mopidy/frontends/mpd/protocol/current_playlist.py @@ -173,7 +173,10 @@ def playlistfind(frontend, tag, needle): if tag == 'filename': try: cp_track = frontend.backend.current_playlist.get(uri=needle) - return cp_track[1].mpd_format() + (cpid, track) = cp_track + position = frontend.backend.current_playlist.cp_tracks.index( + cp_track) + return track.mpd_format(cpid=cpid, position=position) except LookupError: return None raise MpdNotImplemented # TODO diff --git a/mopidy/frontends/mpd/serializer.py b/mopidy/frontends/mpd/translator.py similarity index 100% rename from mopidy/frontends/mpd/serializer.py rename to mopidy/frontends/mpd/translator.py diff --git a/mopidy/models.py b/mopidy/models.py index e4281360..c5877657 100644 --- a/mopidy/models.py +++ b/mopidy/models.py @@ -1,6 +1,6 @@ from copy import copy -from mopidy.frontends.mpd import serializer +from mopidy.frontends.mpd import translator class ImmutableObject(object): """ @@ -136,7 +136,7 @@ class Track(ImmutableObject): return list(self._artists) def mpd_format(self, *args, **kwargs): - return serializer.track_to_mpd_format(self, *args, **kwargs) + return translator.track_to_mpd_format(self, *args, **kwargs) class Playlist(ImmutableObject): @@ -177,7 +177,7 @@ class Playlist(ImmutableObject): return len(self._tracks) def mpd_format(self, *args, **kwargs): - return serializer.playlist_to_mpd_format(self, *args, **kwargs) + return translator.playlist_to_mpd_format(self, *args, **kwargs) def with_(self, uri=None, name=None, tracks=None, last_modified=None): """ diff --git a/tests/frontends/mpd/current_playlist_test.py b/tests/frontends/mpd/current_playlist_test.py index e42077df..6b5c822e 100644 --- a/tests/frontends/mpd/current_playlist_test.py +++ b/tests/frontends/mpd/current_playlist_test.py @@ -195,14 +195,16 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): result = self.h.handle_request(u'playlistfind "tag" "needle"') self.assert_(u'ACK [0@0] {} Not implemented' in result) - def test_playlistfind_by_filename(self): + def test_playlistfind_by_filename_not_in_current_playlist(self): result = self.h.handle_request( u'playlistfind "filename" "file:///dev/null"') + self.assertEqual(len(result), 1) self.assert_(u'OK' in result) def test_playlistfind_by_filename_without_quotes(self): result = self.h.handle_request( u'playlistfind filename "file:///dev/null"') + self.assertEqual(len(result), 1) self.assert_(u'OK' in result) def test_playlistfind_by_filename_in_current_playlist(self): @@ -211,6 +213,8 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): result = self.h.handle_request( u'playlistfind filename "file:///exists"') self.assert_(u'file: file:///exists' in result) + self.assert_(u'Id: 1' in result) + self.assert_(u'Pos: 0' in result) self.assert_(u'OK' in result) def test_playlistid_without_songid(self): diff --git a/tests/frontends/mpd/serializer_test.py b/tests/frontends/mpd/serializer_test.py index e2fda8fa..0e0f8183 100644 --- a/tests/frontends/mpd/serializer_test.py +++ b/tests/frontends/mpd/serializer_test.py @@ -1,12 +1,12 @@ import datetime as dt import unittest -from mopidy.frontends.mpd import serializer +from mopidy.frontends.mpd import translator from mopidy.models import Album, Artist, Playlist, Track class TrackMpdFormatTest(unittest.TestCase): def test_mpd_format_for_empty_track(self): - result = serializer.track_to_mpd_format(Track()) + result = translator.track_to_mpd_format(Track()) self.assert_(('file', '') in result) self.assert_(('Time', 0) in result) self.assert_(('Artist', '') in result) @@ -25,7 +25,7 @@ class TrackMpdFormatTest(unittest.TestCase): date=dt.date(1977, 1, 1), length=137000, ) - result = serializer.track_to_mpd_format(track, position=9, cpid=122) + result = translator.track_to_mpd_format(track, position=9, cpid=122) self.assert_(('file', 'a uri') in result) self.assert_(('Time', 137) in result) self.assert_(('Artist', 'an artist') in result) @@ -38,7 +38,7 @@ class TrackMpdFormatTest(unittest.TestCase): def test_mpd_format_artists(self): track = Track(artists=[Artist(name=u'ABBA'), Artist(name=u'Beatles')]) - self.assertEqual(serializer.track_artists_to_mpd_format(track), + self.assertEqual(translator.track_artists_to_mpd_format(track), u'ABBA, Beatles') @@ -46,12 +46,12 @@ class PlaylistMpdFormatTest(unittest.TestCase): def test_mpd_format(self): playlist = Playlist(tracks=[ Track(track_no=1), Track(track_no=2), Track(track_no=3)]) - result = serializer.playlist_to_mpd_format(playlist) + result = translator.playlist_to_mpd_format(playlist) self.assertEqual(len(result), 3) def test_mpd_format_with_range(self): playlist = Playlist(tracks=[ Track(track_no=1), Track(track_no=2), Track(track_no=3)]) - result = serializer.playlist_to_mpd_format(playlist, 1, 2) + result = translator.playlist_to_mpd_format(playlist, 1, 2) self.assertEqual(len(result), 1) self.assertEqual(dict(result[0])['Track'], 2)