Update MpdHandler to use new backend API

This commit is contained in:
Stein Magnus Jodal 2010-02-08 00:12:05 +01:00
parent 98e333bafa
commit 46af63ab7e
2 changed files with 113 additions and 33 deletions

View File

@ -132,7 +132,8 @@ class MpdHandler(object):
@register(r'^currentsong$')
def _currentsong(self):
return self.backend.current_song()
if self.backend.playback.current_track is not None:
return self.backend.playback.current_track.mpd_format()
@register(r'^delete "(?P<songpos>\d+)"$')
@register(r'^delete "(?P<start>\d+):(?P<end>\d+)*"$')
@ -217,7 +218,7 @@ class MpdHandler(object):
@register(r'^next$')
def _next(self):
return self.backend.next()
return self.backend.playback.next()
@register(r'^password "(?P<password>[^"]+)"$')
def _password(self, password):
@ -226,9 +227,9 @@ class MpdHandler(object):
@register(r'^pause "(?P<state>[01])"$')
def _pause(self, state):
if int(state):
self.backend.pause()
self.backend.playback.pause()
else:
self.backend.resume()
self.backend.playback.resume()
@register(r'^ping$')
def _ping(self):
@ -236,15 +237,25 @@ class MpdHandler(object):
@register(r'^play$')
def _play(self):
return self.backend.play()
return self.backend.playback.play()
@register(r'^play "(?P<songpos>\d+)"$')
def _playpos(self, songpos):
return self.backend.play(songpos=int(songpos))
songpos = int(songpos)
try:
track = self.backend.current_playlist.playlist.tracks[songpos]
return self.backend.playback.play(track)
except IndexError:
raise MpdAckError(u'Position out of bounds')
@register(r'^playid "(?P<songid>\d+)"$')
def _playid(self, songid):
return self.backend.play(songid=int(songid))
songid = int(songid)
try:
track = self.backend.current_playlist.get_by_id(songid)
return self.backend.playback.play(track)
except KeyError, e:
raise MpdAckError(unicode(e))
@register(r'^playlist$')
def _playlist(self):
@ -275,6 +286,7 @@ class MpdHandler(object):
@register(r'^playlistinfo "(?P<start>\d+):(?P<end>\d+)*"$')
def _playlistinfo(self, songpos=None, start=None, end=None):
if songpos is not None:
songpos = int(songpos)
return self.backend.current_playlist.playlist.mpd_format(
songpos, songpos + 1)
else:
@ -304,7 +316,7 @@ class MpdHandler(object):
@register(r'^previous$')
def _previous(self):
return self.backend.previous()
return self.backend.playback.previous()
@register(r'^rename "(?P<old_name>[^"]+)" "(?P<new_name>[^"]+)"$')
def _rename(self, old_name, new_name):
@ -348,7 +360,7 @@ class MpdHandler(object):
@register(r'^search "(?P<type>(album|artist|filename|title))" "(?P<what>[^"]+)"$')
def _search(self, type, what):
return self.backend.search(type, what)
return self.backend.library.search(type, what)
@register(r'^seek "(?P<songpos>\d+)" "(?P<seconds>\d+)"$')
def _seek(self, songpos, seconds):
@ -395,29 +407,78 @@ class MpdHandler(object):
@register(r'^stop$')
def _stop(self):
self.backend.stop()
self.backend.playback.stop()
@register(r'^status$')
def _status(self):
result = [
('volume', self.backend.status_volume()),
('repeat', self.backend.status_repeat()),
('random', self.backend.status_random()),
('single', self.backend.status_single()),
('consume', self.backend.status_consume()),
('playlist', self.backend.status_playlist()),
('playlistlength', self.backend.status_playlist_length()),
('xfade', self.backend.status_xfade()),
('state', self.backend.status_state()),
('volume', self._status_volume()),
('repeat', self._status_repeat()),
('random', self._status_random()),
('single', self._status_single()),
('consume', self._status_consume()),
('playlist', self._status_playlist_version()),
('playlistlength', self._status_playlist_length()),
('xfade', self._status_xfade()),
('state', self._status_state()),
]
if self.backend.status_playlist_length() > 0:
result.append(('song', self.backend.status_song_id()))
result.append(('songid', self.backend.status_song_id()))
if self.backend.state in (self.backend.PLAY, self.backend.PAUSE):
if self.backend.playback.current_track is not None:
result.append(('song', self._status_songpos()))
result.append(('songid', self._status_songid()))
if self.backend.playback.state in (
self.backend.playback.PLAYING, self.backend.playback.PAUSED):
result.append(('time', self._status_time()))
result.append(('bitrate', self.backend.status_bitrate()))
result.append(('bitrate', self._status_bitrate()))
return result
def _status_bitrate(self):
if self.backend.playback.current_track is not None:
return self.backend.playback.current_track.bitrate
def _status_consume(self):
if self.backend.playback.consume:
return 1
else:
return 0
def _status_playlist_length(self):
return self.backend.current_playlist.playlist.length
def _status_playlist_version(self):
return self.backend.current_playlist.version
def _status_random(self):
if self.backend.playback.random:
return 1
else:
return 0
def _status_repeat(self):
if self.backend.playback.repeat:
return 1
else:
return 0
def _status_single(self):
return 0 # TODO
def _status_songid(self):
if self.backend.playback.current_track.id is not None:
return self.backend.playback.current_track.id
else:
return self._status_songpos()
def _status_songpos(self):
return self.backend.playback.playlist_position
def _status_state(self):
if self.backend.playback.state == self.backend.playback.PLAYING:
return u'play'
elif self.backend.playback.state == self.backend.playback.STOPPED:
return u'stop'
elif self.backend.playback.state == self.backend.playback.PAUSED:
return u'pause'
def _status_time(self):
return u'%s:%s' % (
self._status_time_elapsed(), self._status_time_total())
@ -431,6 +492,15 @@ class MpdHandler(object):
else:
return 0
def _status_volume(self):
if self.backend.playback.volume is not None:
return self.backend.playback.volume
else:
return 0
def _status_xfade(self):
return 0 # TODO
@register(r'^swap "(?P<songpos1>\d+)" "(?P<songpos2>\d+)"$')
def _swap(self, songpos1, songpos2):
raise MpdNotImplemented # TODO
@ -445,4 +515,4 @@ class MpdHandler(object):
@register(r'^urlhandlers$')
def _urlhandlers(self):
return self.backend.url_handlers()
return self.backend.uri_handlers

View File

@ -152,7 +152,9 @@ class StatusHandlerTest(unittest.TestCase):
self.assert_(result['state'] in ('play', 'stop', 'pause'))
def test_status_method_when_playlist_loaded(self):
self.b._current_playlist = Playlist(tracks=[Track()])
track = Track()
self.b.current_playlist.load(Playlist(tracks=[track]))
self.b.playback.current_track = track
result = dict(self.h._status())
self.assert_('song' in result)
self.assert_(int(result['song']) >= 0)
@ -160,7 +162,7 @@ class StatusHandlerTest(unittest.TestCase):
self.assert_(int(result['songid']) >= 0)
def test_status_method_when_playing(self):
self.b.state = self.b.PLAY
self.b.playback.state = self.b.playback.PLAYING
result = dict(self.h._status())
self.assert_('time' in result)
(position, total) = result['time'].split(':')
@ -283,28 +285,36 @@ class PlaybackControlHandlerTest(unittest.TestCase):
self.h.handle_request(u'pause "1"')
result = self.h.handle_request(u'pause "0"')
self.assert_(u'OK' in result)
self.assertEquals(self.b.PLAY, self.b.state)
self.assertEquals(self.b.playback.PLAYING, self.b.playback.state)
def test_pause_on(self):
self.h.handle_request(u'play')
result = self.h.handle_request(u'pause "1"')
self.assert_(u'OK' in result)
self.assertEquals(self.b.PAUSE, self.b.state)
self.assertEquals(self.b.playback.PAUSED, self.b.playback.state)
def test_play_without_pos(self):
result = self.h.handle_request(u'play')
self.assert_(u'OK' in result)
self.assertEquals(self.b.PLAY, self.b.state)
self.assertEquals(self.b.playback.PLAYING, self.b.playback.state)
def test_play_with_pos(self):
self.b.current_playlist.load(Playlist(tracks=[Track()]))
result = self.h.handle_request(u'play "0"')
self.assert_(u'OK' in result)
self.assertEquals(self.b.PLAY, self.b.state)
self.assertEquals(self.b.playback.PLAYING, self.b.playback.state)
def test_play_with_pos_out_of_bounds(self):
self.b.current_playlist.load(Playlist())
result = self.h.handle_request(u'play "0"')
self.assert_(u'ACK Position out of bounds' in result)
self.assertEquals(self.b.playback.STOPPED, self.b.playback.state)
def test_playid(self):
self.b.current_playlist.load(Playlist(tracks=[Track(id=0)]))
result = self.h.handle_request(u'playid "0"')
self.assert_(u'OK' in result)
self.assertEquals(self.b.PLAY, self.b.state)
self.assertEquals(self.b.playback.PLAYING, self.b.playback.state)
def test_previous(self):
result = self.h.handle_request(u'previous')
@ -321,7 +331,7 @@ class PlaybackControlHandlerTest(unittest.TestCase):
def test_stop(self):
result = self.h.handle_request(u'stop')
self.assert_(u'OK' in result)
self.assertEquals(self.b.STOP, self.b.state)
self.assertEquals(self.b.playback.STOPPED, self.b.playback.state)
class CurrentPlaylistHandlerTest(unittest.TestCase):