Merge branch 'gstreamer' of git://github.com/jodal/mopidy into gstreamer
This commit is contained in:
commit
6346e07ad5
@ -7,8 +7,3 @@ Contributors to Mopidy in the order of appearance:
|
|||||||
- Johannes Knutsen <johannes@knutseninfo.no>
|
- Johannes Knutsen <johannes@knutseninfo.no>
|
||||||
- Thomas Adamcik <adamcik@samfundet.no>
|
- Thomas Adamcik <adamcik@samfundet.no>
|
||||||
- Kristian Klette <klette@klette.us>
|
- Kristian Klette <klette@klette.us>
|
||||||
|
|
||||||
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.
|
|
||||||
|
|||||||
@ -47,12 +47,16 @@ greatly improved MPD client support.
|
|||||||
- Fixed delete current playing track from playlist, which crashed several
|
- Fixed delete current playing track from playlist, which crashed several
|
||||||
clients.
|
clients.
|
||||||
- Implement ``seek`` and ``seekid``.
|
- Implement ``seek`` and ``seekid``.
|
||||||
|
- Fix ``playlistfind`` output so the correct song is played when playing
|
||||||
|
songs directly from search results in GMPC.
|
||||||
|
|
||||||
- Backends:
|
- Backends:
|
||||||
|
|
||||||
- Rename :mod:`mopidy.backends.gstreamer` to :mod:`mopidy.backends.local`.
|
- Rename :mod:`mopidy.backends.gstreamer` to :mod:`mopidy.backends.local`.
|
||||||
- Remove :mod:`mopidy.backends.despotify`, as Despotify is little maintained
|
- Remove :mod:`mopidy.backends.despotify`, as Despotify is little maintained
|
||||||
and the Libspotify backend is working much better.
|
and the Libspotify backend is working much better.
|
||||||
|
- Rename ``mopidy.frontends.mpd.{serializer => translator}`` to match naming
|
||||||
|
in backends.
|
||||||
|
|
||||||
- Backend API:
|
- Backend API:
|
||||||
|
|
||||||
|
|||||||
@ -63,4 +63,12 @@ Check out the pyspotify code, and install it::
|
|||||||
|
|
||||||
git clone git://github.com/jodal/pyspotify.git
|
git clone git://github.com/jodal/pyspotify.git
|
||||||
cd pyspotify/pyspotify/
|
cd pyspotify/pyspotify/
|
||||||
|
sudo rm -rf build/ # If you are upgrading pyspotify
|
||||||
sudo python setup.py install
|
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.
|
||||||
|
|||||||
@ -8,7 +8,7 @@ from mopidy.backends.base.current_playlist import BaseCurrentPlaylistController
|
|||||||
from mopidy.backends.base.library import BaseLibraryController
|
from mopidy.backends.base.library import BaseLibraryController
|
||||||
from mopidy.backends.base.playback import BasePlaybackController
|
from mopidy.backends.base.playback import BasePlaybackController
|
||||||
from mopidy.backends.base.stored_playlists import BaseStoredPlaylistsController
|
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.models import Playlist
|
||||||
from mopidy.utils import get_class
|
from mopidy.utils import get_class
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ from copy import copy
|
|||||||
import logging
|
import logging
|
||||||
import random
|
import random
|
||||||
|
|
||||||
from mopidy.frontends.mpd import serializer
|
from mopidy.frontends.mpd import translator
|
||||||
|
|
||||||
logger = logging.getLogger('mopidy.backends.base')
|
logger = logging.getLogger('mopidy.backends.base')
|
||||||
|
|
||||||
@ -196,4 +196,4 @@ class BaseCurrentPlaylistController(object):
|
|||||||
def mpd_format(self, *args, **kwargs):
|
def mpd_format(self, *args, **kwargs):
|
||||||
"""Not a part of the generic backend API."""
|
"""Not a part of the generic backend API."""
|
||||||
kwargs['cpids'] = [ct[0] for ct in self._cp_tracks]
|
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)
|
||||||
|
|||||||
@ -173,7 +173,10 @@ def playlistfind(frontend, tag, needle):
|
|||||||
if tag == 'filename':
|
if tag == 'filename':
|
||||||
try:
|
try:
|
||||||
cp_track = frontend.backend.current_playlist.get(uri=needle)
|
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:
|
except LookupError:
|
||||||
return None
|
return None
|
||||||
raise MpdNotImplemented # TODO
|
raise MpdNotImplemented # TODO
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
from copy import copy
|
from copy import copy
|
||||||
|
|
||||||
from mopidy.frontends.mpd import serializer
|
from mopidy.frontends.mpd import translator
|
||||||
|
|
||||||
class ImmutableObject(object):
|
class ImmutableObject(object):
|
||||||
"""
|
"""
|
||||||
@ -136,7 +136,7 @@ class Track(ImmutableObject):
|
|||||||
return list(self._artists)
|
return list(self._artists)
|
||||||
|
|
||||||
def mpd_format(self, *args, **kwargs):
|
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):
|
class Playlist(ImmutableObject):
|
||||||
@ -177,7 +177,7 @@ class Playlist(ImmutableObject):
|
|||||||
return len(self._tracks)
|
return len(self._tracks)
|
||||||
|
|
||||||
def mpd_format(self, *args, **kwargs):
|
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):
|
def with_(self, uri=None, name=None, tracks=None, last_modified=None):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -195,14 +195,16 @@ class CurrentPlaylistHandlerTest(unittest.TestCase):
|
|||||||
result = self.h.handle_request(u'playlistfind "tag" "needle"')
|
result = self.h.handle_request(u'playlistfind "tag" "needle"')
|
||||||
self.assert_(u'ACK [0@0] {} Not implemented' in result)
|
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(
|
result = self.h.handle_request(
|
||||||
u'playlistfind "filename" "file:///dev/null"')
|
u'playlistfind "filename" "file:///dev/null"')
|
||||||
|
self.assertEqual(len(result), 1)
|
||||||
self.assert_(u'OK' in result)
|
self.assert_(u'OK' in result)
|
||||||
|
|
||||||
def test_playlistfind_by_filename_without_quotes(self):
|
def test_playlistfind_by_filename_without_quotes(self):
|
||||||
result = self.h.handle_request(
|
result = self.h.handle_request(
|
||||||
u'playlistfind filename "file:///dev/null"')
|
u'playlistfind filename "file:///dev/null"')
|
||||||
|
self.assertEqual(len(result), 1)
|
||||||
self.assert_(u'OK' in result)
|
self.assert_(u'OK' in result)
|
||||||
|
|
||||||
def test_playlistfind_by_filename_in_current_playlist(self):
|
def test_playlistfind_by_filename_in_current_playlist(self):
|
||||||
@ -211,6 +213,8 @@ class CurrentPlaylistHandlerTest(unittest.TestCase):
|
|||||||
result = self.h.handle_request(
|
result = self.h.handle_request(
|
||||||
u'playlistfind filename "file:///exists"')
|
u'playlistfind filename "file:///exists"')
|
||||||
self.assert_(u'file: file:///exists' in result)
|
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)
|
self.assert_(u'OK' in result)
|
||||||
|
|
||||||
def test_playlistid_without_songid(self):
|
def test_playlistid_without_songid(self):
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
import datetime as dt
|
import datetime as dt
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from mopidy.frontends.mpd import serializer
|
from mopidy.frontends.mpd import translator
|
||||||
from mopidy.models import Album, Artist, Playlist, Track
|
from mopidy.models import Album, Artist, Playlist, Track
|
||||||
|
|
||||||
class TrackMpdFormatTest(unittest.TestCase):
|
class TrackMpdFormatTest(unittest.TestCase):
|
||||||
def test_mpd_format_for_empty_track(self):
|
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_(('file', '') in result)
|
||||||
self.assert_(('Time', 0) in result)
|
self.assert_(('Time', 0) in result)
|
||||||
self.assert_(('Artist', '') in result)
|
self.assert_(('Artist', '') in result)
|
||||||
@ -25,7 +25,7 @@ class TrackMpdFormatTest(unittest.TestCase):
|
|||||||
date=dt.date(1977, 1, 1),
|
date=dt.date(1977, 1, 1),
|
||||||
length=137000,
|
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_(('file', 'a uri') in result)
|
||||||
self.assert_(('Time', 137) in result)
|
self.assert_(('Time', 137) in result)
|
||||||
self.assert_(('Artist', 'an artist') in result)
|
self.assert_(('Artist', 'an artist') in result)
|
||||||
@ -38,7 +38,7 @@ class TrackMpdFormatTest(unittest.TestCase):
|
|||||||
|
|
||||||
def test_mpd_format_artists(self):
|
def test_mpd_format_artists(self):
|
||||||
track = Track(artists=[Artist(name=u'ABBA'), Artist(name=u'Beatles')])
|
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')
|
u'ABBA, Beatles')
|
||||||
|
|
||||||
|
|
||||||
@ -46,12 +46,12 @@ class PlaylistMpdFormatTest(unittest.TestCase):
|
|||||||
def test_mpd_format(self):
|
def test_mpd_format(self):
|
||||||
playlist = Playlist(tracks=[
|
playlist = Playlist(tracks=[
|
||||||
Track(track_no=1), Track(track_no=2), Track(track_no=3)])
|
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)
|
self.assertEqual(len(result), 3)
|
||||||
|
|
||||||
def test_mpd_format_with_range(self):
|
def test_mpd_format_with_range(self):
|
||||||
playlist = Playlist(tracks=[
|
playlist = Playlist(tracks=[
|
||||||
Track(track_no=1), Track(track_no=2), Track(track_no=3)])
|
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(len(result), 1)
|
||||||
self.assertEqual(dict(result[0])['Track'], 2)
|
self.assertEqual(dict(result[0])['Track'], 2)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user