return dequote(disorder_simple(c, cookiep, "make-cookie", (char *)0), cookiep);
}
+int disorder_move(disorder_client *c, const char *track, long delta) {
+ char buf_delta[16];
+ byte_snprintf(buf_delta, sizeof buf_delta, "%ld", delta);
+ return disorder_simple(c, 0, "move", track, buf_delta, (char *)0);
+}
+
+int disorder_moveafter(disorder_client *c, const char *target, char **ids, int nids) {
+ return disorder_simple(c, 0, "moveafter", target, disorder_list, ids, nids, (char *)0);
+}
+
int disorder_nop(disorder_client *c) {
return disorder_simple(c, 0, "nop", (char *)0);
}
return dequote(disorder_simple(c, idp, "play", track, (char *)0), idp);
}
+int disorder_playafter(disorder_client *c, const char *target, char **tracks, int ntracks) {
+ return disorder_simple(c, 0, "playafter", target, disorder_list, tracks, ntracks, (char *)0);
+}
+
int disorder_playlist_delete(disorder_client *c, const char *playlist) {
return disorder_simple(c, 0, "playlist-delete", playlist, (char *)0);
}
*/
int disorder_make_cookie(disorder_client *c, char **cookiep);
+/** @brief Move a track
+ *
+ * Requires one of the 'move mine', 'move random' or 'move any' rights depending on how the track came to be added to the queue.
+ *
+ * @param c Client
+ * @param track Track ID or name
+ * @param delta How far to move the track towards the head of the queue
+ * @return 0 on success, non-0 on error
+ */
+int disorder_move(disorder_client *c, const char *track, long delta);
+
+/** @brief Move multiple tracks
+ *
+ * Requires one of the 'move mine', 'move random' or 'move any' rights depending on how the track came to be added to the queue.
+ *
+ * @param c Client
+ * @param target Move after this track, or to head if ""
+ * @param ids List of tracks to move by ID
+ * @param nids Length of ids
+ * @return 0 on success, non-0 on error
+ */
+int disorder_moveafter(disorder_client *c, const char *target, char **ids, int nids);
+
/** @brief Do nothing
*
* Used as a keepalive. No authentication required.
*/
int disorder_play(disorder_client *c, const char *track, char **idp);
+/** @brief Play multiple tracks
+ *
+ * Requires the 'play' right.
+ *
+ * @param c Client
+ * @param target Insert into queue after this track, or at head if ""
+ * @param tracks List of track names to play
+ * @param ntracks Length of tracks
+ * @return 0 on success, non-0 on error
+ */
+int disorder_playafter(disorder_client *c, const char *target, char **tracks, int ntracks);
+
/** @brief Delete a playlist
*
* Requires the 'play' right and permission to modify the playlist.
/** @brief Marker for a command body */
static const char disorder_body[1];
+/** @brief Marker for a list of args */
+static const char disorder_list[1];
+
/** @brief Issue a command and parse a simple response
* @param c Client
* @param rp Where to store result, or NULL
*
* Put @ref disorder_body in the argument list followed by a char **
* and int giving the body to follow the command. If the int is @c -1
- * then the list is assumed to be NULL-terminated.
+ * then the list is assumed to be NULL-terminated. This may be used
+ * only once.
+ *
+ * Put @ref disorder_list in the argument list followed by a char **
+ * and int giving a list of arguments to include. If the int is @c -1
+ * then the list is assumed to be NULL-terminated. This may be used
+ * any number of times.
*
* Usually you would call this via one of the following interfaces:
* - disorder_simple()
body = va_arg(ap, char **);
nbody = va_arg(ap, int);
has_body = 1;
+ } else if(arg == disorder_list) {
+ char **list = va_arg(ap, char **);
+ int nlist = va_arg(ap, int);
+ if(nlist < 0) {
+ for(nlist = 0; list[nlist]; ++nlist)
+ ;
+ }
+ for(int n = 0; n < nlist; ++n) {
+ dynstr_append(&d, ' ');
+ dynstr_append_string(&d, quoteutf8(arg));
+ }
} else {
dynstr_append(&d, ' ');
dynstr_append_string(&d, quoteutf8(arg));
return ret;
}
-/** @brief Move a track
- * @param c Client
- * @param track Track to move (UTF-8)
- * @param delta Distance to move by
- * @return 0 on success, non-0 on error
- */
-int disorder_move(disorder_client *c, const char *track, int delta) {
- char d[16];
-
- byte_snprintf(d, sizeof d, "%d", delta);
- return disorder_simple(c, 0, "move", track, d, (char *)0);
-}
-
static void client_error(const char *msg,
void attribute((unused)) *u) {
disorder_error(0, "error parsing reply: %s", msg);
const char *password,
const char *cookie);
int disorder_close(disorder_client *c);
-int disorder_version(disorder_client *c, char **versionp);
-int disorder_remove(disorder_client *c, const char *track);
-int disorder_move(disorder_client *c, const char *track, int delta);
-int disorder_enable(disorder_client *c);
-int disorder_disable(disorder_client *c);
-int disorder_scratch(disorder_client *c, const char *id);
-int disorder_shutdown(disorder_client *c);
-int disorder_reconfigure(disorder_client *c);
-int disorder_rescan(disorder_client *c);
int disorder_playing(disorder_client *c, struct queue_entry **qp);
-int disorder_recent(disorder_client *c, struct queue_entry **qp);
-int disorder_queue(disorder_client *c, struct queue_entry **qp);
-int disorder_files(disorder_client *c, const char *dir, const char *re,
- char ***vecp, int *nvecp);
-int disorder_allfiles(disorder_client *c, const char *dir, const char *re,
- char ***vecp, int *nvecp);
char *disorder_user(disorder_client *c);
-int disorder_exists(disorder_client *c, const char *track, int *existsp);
-int disorder_enabled(disorder_client *c, int *enabledp);
-int disorder_set(disorder_client *c, const char *track,
- const char *key, const char *value);
-int disorder_unset(disorder_client *c, const char *track,
- const char *key);
-int disorder_get(disorder_client *c, const char *track, const char *key,
- char **valuep);
int disorder_prefs(disorder_client *c, const char *track,
struct kvp **kp);
-int disorder_length(disorder_client *c, const char *track,
- long *valuep);
-int disorder_search(disorder_client *c, const char *terms,
- char ***vecp, int *nvecp);
-int disorder_random_enable(disorder_client *c);
-int disorder_random_disable(disorder_client *c);
-int disorder_random_enabled(disorder_client *c, int *enabledp);
-int disorder_stats(disorder_client *c,
- char ***vecp, int *nvecp);
int disorder_set_volume(disorder_client *c, int left, int right);
int disorder_get_volume(disorder_client *c, int *left, int *right);
int disorder_log(disorder_client *c, struct sink *s);
-int disorder_pause(disorder_client *c);
-int disorder_resume(disorder_client *c);
-int disorder_tags(disorder_client *c,
- char ***vecp, int *nvecp);
-int disorder_set_global(disorder_client *c,
- const char *key, const char *value);
-int disorder_unset_global(disorder_client *c, const char *key);
-int disorder_get_global(disorder_client *c, const char *key, char **valuep);
int disorder_new_tracks(disorder_client *c,
char ***vecp, int *nvecp,
int max);
int disorder_rtp_address(disorder_client *c, char **addressp, char **portp);
-int disorder_adduser(disorder_client *c,
- const char *user, const char *password,
- const char *rights);
-int disorder_deluser(disorder_client *c, const char *user);
-int disorder_userinfo(disorder_client *c, const char *user, const char *key,
- char **valuep);
-int disorder_edituser(disorder_client *c, const char *user,
- const char *key, const char *value);
-int disorder_users(disorder_client *c,
- char ***vecp, int *nvecp);
-int disorder_register(disorder_client *c, const char *user,
- const char *password, const char *email,
- char **confirmp);
-int disorder_confirm(disorder_client *c, const char *confirm);
-int disorder_make_cookie(disorder_client *c, char **cookiep);
const char *disorder_last(disorder_client *c);
-int disorder_revoke(disorder_client *c);
-int disorder_reminder(disorder_client *c, const char *user);
-int disorder_schedule_list(disorder_client *c, char ***idsp, int *nidsp);
-int disorder_schedule_del(disorder_client *c, const char *id);
int disorder_schedule_get(disorder_client *c, const char *id,
struct kvp **actiondatap);
int disorder_schedule_add(disorder_client *c,
const char *priority,
const char *action,
...);
-int disorder_adopt(disorder_client *c, const char *id);
-int disorder_playlist_delete(disorder_client *c,
- const char *playlist);
-int disorder_playlist_get(disorder_client *c, const char *playlist,
- char ***tracksp, int *ntracksp);
-int disorder_playlists(disorder_client *c,
- char ***playlistsp, int *nplaylists);
-int disorder_playlist_get_share(disorder_client *c, const char *playlist,
- char **sharep);
-int disorder_playlist_set_share(disorder_client *c, const char *playlist,
- const char *share);
-int disorder_playlist_lock(disorder_client *c, const char *playlist);
-int disorder_playlist_unlock(disorder_client *c);
-int disorder_playlist_set(disorder_client *c,
- const char *playlist,
- char **tracks,
- int ntracks);
#include "client-stubs.h"
return "const char *$name";
} elsif($type eq 'integer') {
return "long $name";
- } elsif($type eq 'list') {
+ } elsif($type eq 'list' or $type eq 'body') {
return ("char **$name",
"int n$name");
} else {
my $args = shift;
my @d = ();
for my $arg (@$args) {
- if($arg->[0] eq 'list') {
+ if($arg->[0] eq 'body' or $arg->[0] eq 'list') {
push(@d,
" * \@param $arg->[1] $arg->[2]\n",
" * \@param n$arg->[1] Length of $arg->[1]\n");
if(!defined $return) {
my @cargs = ();
for my $arg (@$args) {
- if($arg->[0] eq 'list') {
- push(@cargs, "disorder_body", $arg->[1], "n$arg->[1]");
- } else {
+ if($arg->[0] eq 'body' or $arg->[0] eq 'list') {
+ push(@cargs, "disorder_$arg->[0]", $arg->[1], "n$arg->[1]");
+ } elsif($arg->[0] eq 'string') {
push(@cargs, $arg->[1]);
+ } elsif($arg->[0] eq 'integer') {
+ push(@cargs, "buf_$arg->[1]");
+ push(@c, " char buf_$arg->[1]\[16];\n",
+ " byte_snprintf(buf_$arg->[1], sizeof buf_$arg->[1], \"%ld\", $arg->[1]);\n");
+ } else {
+ die "$0: unsupported arg type '$arg->[0]' for '$cmd'\n";
}
}
push(@c, " return disorder_simple(",
[],
["string", "cookie", "Newly created cookie"]);
-# TODO move
+simple("move",
+ "Move a track",
+ "Requires one of the 'move mine', 'move random' or 'move any' rights depending on how the track came to be added to the queue.",
+ [["string", "track", "Track ID or name"],
+ ["integer", "delta", "How far to move the track towards the head of the queue"]]);
-# TODO moveafter
+simple("moveafter",
+ "Move multiple tracks",
+ "Requires one of the 'move mine', 'move random' or 'move any' rights depending on how the track came to be added to the queue.",
+ [["string", "target", "Move after this track, or to head if \"\""],
+ ["list", "ids", "List of tracks to move by ID"]]);
# TODO new
[["string", "track", "Track to play"]],
["string", "id", "Queue ID of new track"]);
-# TODO playafter
+simple("playafter",
+ "Play multiple tracks",
+ "Requires the 'play' right.",
+ [["string", "target", "Insert into queue after this track, or at head if \"\""],
+ ["list", "tracks", "List of track names to play"]]);
# TODO playing
"Set the contents of a playlist",
"Requires the 'play' right and permission to modify the playlist, which must be locked.",
[["string", "playlist", "Playlist to modify"],
- ["list", "tracks", "New list of tracks for playlist"]]);
+ ["body", "tracks", "New list of tracks for playlist"]]);
simple("playlist-set-share",
"Set a playlist's sharing status",