aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2015-10-27 20:35:40 +0100
committerMax Kellermann <max@duempel.org>2015-10-27 20:35:40 +0100
commit8acf996d90e3be551ebffc98de7248a5bee5b69c (patch)
tree9e38e0b05fa274814c0bbc112bfcef38ecdd1137
parent15e432204e62dd5a1c873af13a679195b9645b0c (diff)
downloadmpd-8acf996d90e3be551ebffc98de7248a5bee5b69c.tar.gz
mpd-8acf996d90e3be551ebffc98de7248a5bee5b69c.tar.xz
mpd-8acf996d90e3be551ebffc98de7248a5bee5b69c.zip
command/queue: add range parameter to plchanges and plchangesposid
-rw-r--r--NEWS1
-rw-r--r--doc/protocol.xml6
-rw-r--r--src/PlaylistPrint.cxx12
-rw-r--r--src/PlaylistPrint.hxx6
-rw-r--r--src/command/AllCommands.cxx4
-rw-r--r--src/command/QueueCommands.cxx14
-rw-r--r--src/queue/QueuePrint.cxx27
-rw-r--r--src/queue/QueuePrint.hxx6
8 files changed, 58 insertions, 18 deletions
diff --git a/NEWS b/NEWS
index d3888be38..e9418889d 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,7 @@ ver 0.20 (not yet released)
- report song duration with milliseconds precision
- "sticker find" can match sticker values
- drop the "file:///" prefix for absolute file paths
+ - add range parameter to command "plchanges" and "plchangesposid"
* tags
- ape, ogg: drop support for non-standard tag "album artist"
affected filetypes: vorbis, flac, opus & all files with ape2 tags
diff --git a/doc/protocol.xml b/doc/protocol.xml
index 5427156d0..db9f47e3f 100644
--- a/doc/protocol.xml
+++ b/doc/protocol.xml
@@ -1161,12 +1161,15 @@ OK
<cmdsynopsis>
<command>plchanges</command>
<arg choice="req"><replaceable>VERSION</replaceable></arg>
+ <arg><replaceable>START:END</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Displays changed songs currently in the playlist since
- <varname>VERSION</varname>.
+ <varname>VERSION</varname>. Start and end positions may
+ be given to limit the output to changes in the given
+ range.
</para>
<para>
To detect songs that were deleted at the end of the
@@ -1179,6 +1182,7 @@ OK
<cmdsynopsis>
<command>plchangesposid</command>
<arg choice="req"><replaceable>VERSION</replaceable></arg>
+ <arg><replaceable>START:END</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
diff --git a/src/PlaylistPrint.cxx b/src/PlaylistPrint.cxx
index 80f348710..c8abd89be 100644
--- a/src/PlaylistPrint.cxx
+++ b/src/PlaylistPrint.cxx
@@ -104,17 +104,21 @@ playlist_print_find(Response &r, Partition &partition,
void
playlist_print_changes_info(Response &r, Partition &partition,
const playlist &playlist,
- uint32_t version)
+ uint32_t version,
+ unsigned start, unsigned end)
{
- queue_print_changes_info(r, partition, playlist.queue, version);
+ queue_print_changes_info(r, partition, playlist.queue, version,
+ start, end);
}
void
playlist_print_changes_position(Response &r,
const playlist &playlist,
- uint32_t version)
+ uint32_t version,
+ unsigned start, unsigned end)
{
- queue_print_changes_position(r, playlist.queue, version);
+ queue_print_changes_position(r, playlist.queue, version,
+ start, end);
}
#ifdef ENABLE_DATABASE
diff --git a/src/PlaylistPrint.hxx b/src/PlaylistPrint.hxx
index bc4c2cb47..b12162262 100644
--- a/src/PlaylistPrint.hxx
+++ b/src/PlaylistPrint.hxx
@@ -79,7 +79,8 @@ playlist_print_find(Response &r, Partition &partition,
void
playlist_print_changes_info(Response &r, Partition &partition,
const playlist &playlist,
- uint32_t version);
+ uint32_t version,
+ unsigned start, unsigned end);
/**
* Print changes since the specified playlist version, position only.
@@ -87,7 +88,8 @@ playlist_print_changes_info(Response &r, Partition &partition,
void
playlist_print_changes_position(Response &r,
const playlist &playlist,
- uint32_t version);
+ uint32_t version,
+ unsigned start, unsigned end);
/**
* Send the stored playlist to the client.
diff --git a/src/command/AllCommands.cxx b/src/command/AllCommands.cxx
index 8e8865ff3..87ed7a1dc 100644
--- a/src/command/AllCommands.cxx
+++ b/src/command/AllCommands.cxx
@@ -148,8 +148,8 @@ static constexpr struct command commands[] = {
{ "playlistinfo", PERMISSION_READ, 0, 1, handle_playlistinfo },
{ "playlistmove", PERMISSION_CONTROL, 3, 3, handle_playlistmove },
{ "playlistsearch", PERMISSION_READ, 2, -1, handle_playlistsearch },
- { "plchanges", PERMISSION_READ, 1, 1, handle_plchanges },
- { "plchangesposid", PERMISSION_READ, 1, 1, handle_plchangesposid },
+ { "plchanges", PERMISSION_READ, 1, 2, handle_plchanges },
+ { "plchangesposid", PERMISSION_READ, 1, 2, handle_plchangesposid },
{ "previous", PERMISSION_CONTROL, 0, 0, handle_previous },
{ "prio", PERMISSION_CONTROL, 2, -1, handle_prio },
{ "prioid", PERMISSION_CONTROL, 2, -1, handle_prioid },
diff --git a/src/command/QueueCommands.cxx b/src/command/QueueCommands.cxx
index 7751aa26d..141c5170a 100644
--- a/src/command/QueueCommands.cxx
+++ b/src/command/QueueCommands.cxx
@@ -251,8 +251,13 @@ handle_plchanges(Client &client, Request args, Response &r)
if (!ParseCommandArg32(r, version, args.front()))
return CommandResult::ERROR;
+ RangeArg range = RangeArg::All();
+ if (!args.ParseOptional(1, range, r))
+ return CommandResult::ERROR;
+
playlist_print_changes_info(r, client.partition,
- client.playlist, version);
+ client.playlist, version,
+ range.start, range.end);
return CommandResult::OK;
}
@@ -263,7 +268,12 @@ handle_plchangesposid(Client &client, Request args, Response &r)
if (!ParseCommandArg32(r, version, args.front()))
return CommandResult::ERROR;
- playlist_print_changes_position(r, client.playlist, version);
+ RangeArg range = RangeArg::All();
+ if (!args.ParseOptional(1, range, r))
+ return CommandResult::ERROR;
+
+ playlist_print_changes_position(r, client.playlist, version,
+ range.start, range.end);
return CommandResult::OK;
}
diff --git a/src/queue/QueuePrint.cxx b/src/queue/QueuePrint.cxx
index 5ae1a3036..a7298c81f 100644
--- a/src/queue/QueuePrint.cxx
+++ b/src/queue/QueuePrint.cxx
@@ -71,19 +71,36 @@ queue_print_uris(Response &r, Partition &partition, const Queue &queue,
void
queue_print_changes_info(Response &r, Partition &partition, const Queue &queue,
- uint32_t version)
+ uint32_t version,
+ unsigned start, unsigned end)
{
- for (unsigned i = 0; i < queue.GetLength(); i++) {
+ assert(start <= end);
+
+ if (start >= queue.GetLength())
+ return;
+
+ if (end > queue.GetLength())
+ end = queue.GetLength();
+
+ for (unsigned i = start; i < end; i++)
if (queue.IsNewerAtPosition(i, version))
queue_print_song_info(r, partition, queue, i);
- }
}
void
queue_print_changes_position(Response &r, const Queue &queue,
- uint32_t version)
+ uint32_t version,
+ unsigned start, unsigned end)
{
- for (unsigned i = 0; i < queue.GetLength(); i++)
+ assert(start <= end);
+
+ if (start >= queue.GetLength())
+ return;
+
+ if (end > queue.GetLength())
+ end = queue.GetLength();
+
+ for (unsigned i = start; i < end; i++)
if (queue.IsNewerAtPosition(i, version))
r.Format("cpos: %i\nId: %i\n",
i, queue.PositionToId(i));
diff --git a/src/queue/QueuePrint.hxx b/src/queue/QueuePrint.hxx
index 88d28e8ca..461987520 100644
--- a/src/queue/QueuePrint.hxx
+++ b/src/queue/QueuePrint.hxx
@@ -42,11 +42,13 @@ queue_print_uris(Response &r, Partition &partition, const Queue &queue,
void
queue_print_changes_info(Response &r, Partition &partition, const Queue &queue,
- uint32_t version);
+ uint32_t version,
+ unsigned start, unsigned end);
void
queue_print_changes_position(Response &r, const Queue &queue,
- uint32_t version);
+ uint32_t version,
+ unsigned start, unsigned end);
void
queue_find(Response &response, Partition &partition, const Queue &queue,