mpd: Convert almost all of protocol.current_playlist

This commit is contained in:
Thomas Adamcik 2014-01-23 00:40:46 +01:00
parent e7017f3ccb
commit 442d9d4b1e

View File

@ -1,12 +1,9 @@
from __future__ import unicode_literals
from mopidy.mpd import translator
from mopidy.mpd.exceptions import (
MpdArgError, MpdNoExistError, MpdNotImplemented)
from mopidy.mpd.protocol import handle_request
from mopidy.mpd import exceptions, protocol, translator
@handle_request(r'add\ "(?P<uri>[^"]*)"$')
@protocol.commands.add('add')
def add(context, uri):
"""
*musicpd.org, current playlist section:*
@ -29,8 +26,7 @@ def add(context, uri):
try:
uri = context.directory_path_to_uri(translator.normalize_path(uri))
except MpdNoExistError as e:
e.command = 'add'
except exceptions.MpdNoExistError as e:
e.message = 'directory or file not found'
raise
@ -48,12 +44,12 @@ def add(context, uri):
tracks.extend(future.get())
if not tracks:
raise MpdNoExistError('directory or file not found')
raise exceptions.MpdNoExistError('directory or file not found')
context.core.tracklist.add(tracks=tracks)
@handle_request(r'addid\ "(?P<uri>[^"]*)"(\ "(?P<songpos>\d+)")*$')
@protocol.commands.add('addid', songpos=protocol.integer)
def addid(context, uri, songpos=None):
"""
*musicpd.org, current playlist section:*
@ -72,20 +68,19 @@ def addid(context, uri, songpos=None):
- ``addid ""`` should return an error.
"""
# TODO: check that songpos is positive
if not uri:
raise MpdNoExistError('No such song')
if songpos is not None:
songpos = int(songpos)
if songpos and songpos > context.core.tracklist.length.get():
raise MpdArgError('Bad song index')
raise exceptions.MpdNoExistError('No such song')
if songpos is not None and songpos > context.core.tracklist.length.get():
raise exceptions.MpdArgError('Bad song index')
tl_tracks = context.core.tracklist.add(uri=uri, at_position=songpos).get()
if not tl_tracks:
raise MpdNoExistError('No such song')
raise exceptions.MpdNoExistError('No such song')
return ('Id', tl_tracks[0].tlid)
@handle_request(r'delete\ "(?P<start>\d+):(?P<end>\d+)*"$')
def delete_range(context, start, end=None):
@protocol.commands.add('delete', position=protocol.position_or_range)
def delete(context, position):
"""
*musicpd.org, current playlist section:*
@ -93,31 +88,18 @@ def delete_range(context, start, end=None):
Deletes a song from the playlist.
"""
start = int(start)
if end is not None:
end = int(end)
else:
start = position.start
end = position.stop
if end is None:
end = context.core.tracklist.length.get()
tl_tracks = context.core.tracklist.slice(start, end).get()
if not tl_tracks:
raise MpdArgError('Bad song index', command='delete')
raise exceptions.MpdArgError('Bad song index', command='delete')
for (tlid, _) in tl_tracks:
context.core.tracklist.remove(tlid=[tlid])
@handle_request(r'delete\ "(?P<songpos>\d+)"$')
def delete_songpos(context, songpos):
"""See :meth:`delete_range`"""
try:
songpos = int(songpos)
(tlid, _) = context.core.tracklist.slice(
songpos, songpos + 1).get()[0]
context.core.tracklist.remove(tlid=[tlid])
except IndexError:
raise MpdArgError('Bad song index', command='delete')
@handle_request(r'deleteid\ "(?P<tlid>\d+)"$')
@protocol.commands.add('deleteid', tlid=protocol.integer)
def deleteid(context, tlid):
"""
*musicpd.org, current playlist section:*
@ -126,13 +108,13 @@ def deleteid(context, tlid):
Deletes the song ``SONGID`` from the playlist
"""
tlid = int(tlid)
# TODO: check that tlid is positive
tl_tracks = context.core.tracklist.remove(tlid=[tlid]).get()
if not tl_tracks:
raise MpdNoExistError('No such song')
raise exceptions.MpdNoExistError('No such song')
@handle_request(r'clear$')
@protocol.commands.add('clear')
def clear(context):
"""
*musicpd.org, current playlist section:*
@ -144,8 +126,9 @@ def clear(context):
context.core.tracklist.clear()
@handle_request(r'move\ "(?P<start>\d+):(?P<end>\d+)*"\ "(?P<to>\d+)"$')
def move_range(context, start, to, end=None):
@protocol.commands.add(
'move', position=protocol.position_or_range, to=protocol.integer)
def move_range(context, position, to):
"""
*musicpd.org, current playlist section:*
@ -154,23 +137,15 @@ def move_range(context, start, to, end=None):
Moves the song at ``FROM`` or range of songs at ``START:END`` to
``TO`` in the playlist.
"""
# TODO: check that to is positive
start = position.start
end = position.stop
if end is None:
end = context.core.tracklist.length.get()
start = int(start)
end = int(end)
to = int(to)
context.core.tracklist.move(start, end, to)
@handle_request(r'move\ "(?P<songpos>\d+)"\ "(?P<to>\d+)"$')
def move_songpos(context, songpos, to):
"""See :meth:`move_range`."""
songpos = int(songpos)
to = int(to)
context.core.tracklist.move(songpos, songpos + 1, to)
@handle_request(r'moveid\ "(?P<tlid>\d+)"\ "(?P<to>\d+)"$')
@protocol.commands.add('moveid', tlid=protocol.integer, to=protocol.integer)
def moveid(context, tlid, to):
"""
*musicpd.org, current playlist section:*
@ -181,16 +156,15 @@ def moveid(context, tlid, to):
the playlist. If ``TO`` is negative, it is relative to the current
song in the playlist (if there is one).
"""
tlid = int(tlid)
to = int(to)
# TODO: check that tlid and to are positive
tl_tracks = context.core.tracklist.filter(tlid=[tlid]).get()
if not tl_tracks:
raise MpdNoExistError('No such song')
raise exceptions.MpdNoExistError('No such song')
position = context.core.tracklist.index(tl_tracks[0]).get()
context.core.tracklist.move(position, position + 1, to)
@handle_request(r'playlist$')
@protocol.commands.add('playlist')
def playlist(context):
"""
*musicpd.org, current playlist section:*
@ -206,7 +180,7 @@ def playlist(context):
return playlistinfo(context)
@handle_request(r'playlistfind\ ("?)(?P<tag>[^"]+)\1\ "(?P<needle>[^"]+)"$')
@protocol.commands.add('playlistfind')
def playlistfind(context, tag, needle):
"""
*musicpd.org, current playlist section:*
@ -225,11 +199,10 @@ def playlistfind(context, tag, needle):
return None
position = context.core.tracklist.index(tl_tracks[0]).get()
return translator.track_to_mpd_format(tl_tracks[0], position=position)
raise MpdNotImplemented # TODO
raise exceptions.MpdNotImplemented # TODO
@handle_request(r'playlistid$')
@handle_request(r'playlistid\ "(?P<tlid>\d+)"$')
@protocol.commands.add('playlistid', tlid=protocol.integer)
def playlistid(context, tlid=None):
"""
*musicpd.org, current playlist section:*
@ -239,11 +212,11 @@ def playlistid(context, tlid=None):
Displays a list of songs in the playlist. ``SONGID`` is optional
and specifies a single song to display info for.
"""
# TODO: check that tlid is positive if not none
if tlid is not None:
tlid = int(tlid)
tl_tracks = context.core.tracklist.filter(tlid=[tlid]).get()
if not tl_tracks:
raise MpdNoExistError('No such song')
raise exceptions.MpdNoExistError('No such song')
position = context.core.tracklist.index(tl_tracks[0]).get()
return translator.track_to_mpd_format(tl_tracks[0], position=position)
else:
@ -251,9 +224,10 @@ def playlistid(context, tlid=None):
context.core.tracklist.tl_tracks.get())
@handle_request(r'playlistinfo$')
@handle_request(r'playlistinfo\ "(?P<songpos>-?\d+)"$')
@handle_request(r'playlistinfo\ "(?P<start>\d+):(?P<end>\d+)*"$')
# TODO: convert
@protocol.handle_request(r'playlistinfo$')
@protocol.handle_request(r'playlistinfo\ "(?P<songpos>-?\d+)"$')
@protocol.handle_request(r'playlistinfo\ "(?P<start>\d+):(?P<end>\d+)*"$')
def playlistinfo(context, songpos=None, start=None, end=None):
"""
*musicpd.org, current playlist section:*
@ -280,7 +254,7 @@ def playlistinfo(context, songpos=None, start=None, end=None):
start = 0
start = int(start)
if not (0 <= start <= context.core.tracklist.length.get()):
raise MpdArgError('Bad song index')
raise exceptions.MpdArgError('Bad song index')
if end is not None:
end = int(end)
if end > context.core.tracklist.length.get():
@ -289,7 +263,7 @@ def playlistinfo(context, songpos=None, start=None, end=None):
return translator.tracks_to_mpd_format(tl_tracks, start, end)
@handle_request(r'playlistsearch\ ("?)(?P<tag>\w+)\1\ "(?P<needle>[^"]+)"$')
@protocol.commands.add('playlistsearch')
def playlistsearch(context, tag, needle):
"""
*musicpd.org, current playlist section:*
@ -304,10 +278,10 @@ def playlistsearch(context, tag, needle):
- does not add quotes around the tag
- uses ``filename`` and ``any`` as tags
"""
raise MpdNotImplemented # TODO
raise exceptions.MpdNotImplemented # TODO
@handle_request(r'plchanges\ ("?)(?P<version>-?\d+)\1$')
@protocol.commands.add('plchanges', version=protocol.integer)
def plchanges(context, version):
"""
*musicpd.org, current playlist section:*
@ -329,7 +303,7 @@ def plchanges(context, version):
context.core.tracklist.tl_tracks.get())
@handle_request(r'plchangesposid\ "(?P<version>\d+)"$')
@protocol.commands.add('plchangesposid', version=protocol.integer)
def plchangesposid(context, version):
"""
*musicpd.org, current playlist section:*
@ -353,9 +327,8 @@ def plchangesposid(context, version):
return result
@handle_request(r'shuffle$')
@handle_request(r'shuffle\ "(?P<start>\d+):(?P<end>\d+)*"$')
def shuffle(context, start=None, end=None):
@protocol.commands.add('shuffle', position=protocol.position_or_range)
def shuffle(context, position=None):
"""
*musicpd.org, current playlist section:*
@ -364,14 +337,15 @@ def shuffle(context, start=None, end=None):
Shuffles the current playlist. ``START:END`` is optional and
specifies a range of songs.
"""
if start is not None:
start = int(start)
if end is not None:
end = int(end)
if position is None:
start, end = None, None
else:
start, end = position.start, position.stop
context.core.tracklist.shuffle(start, end)
@handle_request(r'swap\ "(?P<songpos1>\d+)"\ "(?P<songpos2>\d+)"$')
@protocol.commands.add(
'swap', songpos1=protocol.integer, songpos2=protocol.integer)
def swap(context, songpos1, songpos2):
"""
*musicpd.org, current playlist section:*
@ -380,8 +354,7 @@ def swap(context, songpos1, songpos2):
Swaps the positions of ``SONG1`` and ``SONG2``.
"""
songpos1 = int(songpos1)
songpos2 = int(songpos2)
# TODO: check that songpos is positive
tracks = context.core.tracklist.tracks.get()
song1 = tracks[songpos1]
song2 = tracks[songpos2]
@ -393,7 +366,8 @@ def swap(context, songpos1, songpos2):
context.core.tracklist.add(tracks)
@handle_request(r'swapid\ "(?P<tlid1>\d+)"\ "(?P<tlid2>\d+)"$')
@protocol.commands.add(
'swapid', tlid1=protocol.integer, tlid2=protocol.integer)
def swapid(context, tlid1, tlid2):
"""
*musicpd.org, current playlist section:*
@ -402,12 +376,11 @@ def swapid(context, tlid1, tlid2):
Swaps the positions of ``SONG1`` and ``SONG2`` (both song ids).
"""
tlid1 = int(tlid1)
tlid2 = int(tlid2)
# TODO: check that tlid is positive
tl_tracks1 = context.core.tracklist.filter(tlid=[tlid1]).get()
tl_tracks2 = context.core.tracklist.filter(tlid=[tlid2]).get()
if not tl_tracks1 or not tl_tracks2:
raise MpdNoExistError('No such song')
raise exceptions.MpdNoExistError('No such song')
position1 = context.core.tracklist.index(tl_tracks1[0]).get()
position2 = context.core.tracklist.index(tl_tracks2[0]).get()
swap(context, position1, position2)