diff --git a/mopidy/mpd/__init__.py b/mopidy/mpd/__init__.py index a88f4ab0..8cf244da 100644 --- a/mopidy/mpd/__init__.py +++ b/mopidy/mpd/__init__.py @@ -33,6 +33,11 @@ class MpdAckError(MopidyException): return u'ACK [%i@%i] {%s} %s' % ( self.error_code, self.position, self.command, self.message) +class MpdArgError(MpdAckError): + def __init__(self, *args, **kwargs): + super(MpdArgError, self).__init__(*args, **kwargs) + self.error_code = 2 # ACK_ERROR_ARG + class MpdUnknownCommand(MpdAckError): def __init__(self, *args, **kwargs): super(MpdUnknownCommand, self).__init__(*args, **kwargs) @@ -40,6 +45,11 @@ class MpdUnknownCommand(MpdAckError): self.command = u'' self.error_code = 5 # ACK_ERROR_UNKNOWN +class MpdNoExistError(MpdAckError): + def __init__(self, *args, **kwargs): + super(MpdNoExistError, self).__init__(*args, **kwargs) + self.error_code = 50 # ACK_ERROR_NO_EXIST + class MpdNotImplemented(MpdAckError): def __init__(self, *args, **kwargs): super(MpdNotImplemented, self).__init__(*args, **kwargs) diff --git a/mopidy/mpd/frontend.py b/mopidy/mpd/frontend.py index 240b8740..511b7c15 100644 --- a/mopidy/mpd/frontend.py +++ b/mopidy/mpd/frontend.py @@ -14,7 +14,8 @@ import datetime as dt import logging import re -from mopidy.mpd import MpdAckError, MpdUnknownCommand, MpdNotImplemented +from mopidy.mpd import (MpdAckError, MpdArgError, MpdUnknownCommand, + MpdNoExistError, MpdNotImplemented) from mopidy.utils import flatten logger = logging.getLogger('mopidy.mpd.frontend') @@ -238,7 +239,11 @@ class MpdFrontend(object): Adds the file ``URI`` to the playlist (directories add recursively). ``URI`` can also be a single file. """ - self._current_playlist_addid(uri) + track = self.backend.library.lookup(uri) + if track is None: + raise MpdNoExistError( + u'directory or file not found', command=u'add') + self.backend.current_playlist.add(track) @handle_pattern(r'^addid "(?P[^"]*)"( "(?P\d+)")*$') def _current_playlist_addid(self, uri, songpos=None): @@ -259,9 +264,9 @@ class MpdFrontend(object): songpos = int(songpos) track = self.backend.library.lookup(uri) if track is None: - raise MpdAckError(u'No such song') + raise MpdNoExistError(u'No such song', command=u'addid') if songpos and songpos > self.backend.current_playlist.playlist.length: - raise MpdAckError(u'Position out of bounds') + raise MpdArgError(u'Bad song index', command=u'addid') self.backend.current_playlist.add(track, at_position=songpos) return ('Id', track.id) @@ -281,7 +286,7 @@ class MpdFrontend(object): end = self.backend.current_playlist.playlist.length tracks = self.backend.current_playlist.playlist.tracks[start:end] if not tracks: - raise MpdAckError(u'Position out of bounds') + raise MpdArgError(u'Bad song index', command=u'delete') for track in tracks: self.backend.current_playlist.remove(track) @@ -293,7 +298,7 @@ class MpdFrontend(object): track = self.backend.current_playlist.playlist.tracks[songpos] self.backend.current_playlist.remove(track) except IndexError: - raise MpdAckError(u'Position out of bounds') + raise MpdArgError(u'Bad song index', command=u'delete') @handle_pattern(r'^deleteid "(?P\d+)"$') def _current_playlist_deleteid(self, songid): @@ -308,8 +313,8 @@ class MpdFrontend(object): try: track = self.backend.current_playlist.get(id=songid) return self.backend.current_playlist.remove(track) - except LookupError as e: - raise MpdAckError(e[0]) + except LookupError: + raise MpdNoExistError(u'No such song', command=u'deleteid') @handle_pattern(r'^clear$') def _current_playlist_clear(self): @@ -415,8 +420,8 @@ class MpdFrontend(object): songid = int(songid) track = self.backend.current_playlist.get(id=songid) return track.mpd_format() - except LookupError as e: - raise MpdAckError(e[0]) + except LookupError: + raise MpdNoExistError(u'No such song', command=u'playlistid') else: return self.backend.current_playlist.playlist.mpd_format() @@ -889,8 +894,8 @@ class MpdFrontend(object): else: track = self.backend.current_playlist.get(id=songid) return self.backend.playback.play(track) - except LookupError as e: - raise MpdAckError(e[0]) + except LookupError: + raise MpdNoExistError(u'No such song', command=u'playid') @handle_pattern(r'^play "(?P\d+)"$') @handle_pattern(r'^play "(?P-1)"$') @@ -914,7 +919,7 @@ class MpdFrontend(object): track = self.backend.current_playlist.playlist.tracks[songpos] return self.backend.playback.play(track) except IndexError: - raise MpdAckError(u'Position out of bounds') + raise MpdArgError(u'Bad song index', command=u'play') @handle_pattern(r'^previous$') def _playback_previous(self): @@ -1452,8 +1457,8 @@ class MpdFrontend(object): try: return ['file: %s' % t.uri for t in self.backend.stored_playlists.get(name=name).tracks] - except LookupError as e: - raise MpdAckError(e[0]) + except LookupError: + raise MpdNoExistError(u'No such playlist', command=u'listplaylist') @handle_pattern(r'^listplaylistinfo "(?P[^"]+)"$') def _stored_playlists_listplaylistinfo(self, name): @@ -1472,8 +1477,9 @@ class MpdFrontend(object): try: return self.backend.stored_playlists.get(name=name).mpd_format( search_result=True) - except LookupError as e: - raise MpdAckError(e[0]) + except LookupError: + raise MpdNoExistError( + u'No such playlist', command=u'listplaylistinfo') @handle_pattern(r'^listplaylists$') def _stored_playlists_listplaylists(self): diff --git a/tests/mpd/frontend_test.py b/tests/mpd/frontend_test.py index ddcbb6c6..6cb77415 100644 --- a/tests/mpd/frontend_test.py +++ b/tests/mpd/frontend_test.py @@ -539,6 +539,7 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): result = self.h.handle_request(u'add "dummy://foo"') self.assertEqual(self.b.current_playlist.playlist.length, 6) self.assertEqual(self.b.current_playlist.playlist.tracks[5], needle) + self.assertEqual(len(result), 1) self.assert_(u'OK' in result) def test_add_with_uri_not_found_in_library_should_ack(self): @@ -890,7 +891,7 @@ class StoredPlaylistsHandlerTest(unittest.TestCase): def test_listplaylistinfo_fails_if_no_playlist_is_found(self): result = self.h.handle_request(u'listplaylistinfo "name"') self.assertEqual(result[0], - u'ACK [50@0] {listplaylist} No such playlist') + u'ACK [50@0] {listplaylistinfo} No such playlist') def test_listplaylists(self): last_modified = dt.datetime(2001, 3, 17, 13, 41, 17)