mirror of
https://github.com/owntone/owntone-server.git
synced 2024-12-28 16:15:57 -05:00
[mpd] Implement mpd command 'move'
This commit is contained in:
parent
29dbc6bd9d
commit
494a936caa
46
src/mpd.c
46
src/mpd.c
@ -1773,9 +1773,55 @@ mpd_command_deleteid(struct evbuffer *evbuf, int argc, char **argv, char **errms
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Moves the song at FROM or range of songs at START:END to TO in the playlist.
|
||||||
static int
|
static int
|
||||||
mpd_command_move(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
|
mpd_command_move(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
|
||||||
{
|
{
|
||||||
|
int start_pos;
|
||||||
|
int end_pos;
|
||||||
|
int count;
|
||||||
|
uint32_t to_pos;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (argc < 3)
|
||||||
|
{
|
||||||
|
ret = asprintf(errmsg, "Missing argument for command 'move'");
|
||||||
|
if (ret < 0)
|
||||||
|
DPRINTF(E_LOG, L_MPD, "Out of memory\n");
|
||||||
|
return ACK_ERROR_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = mpd_pars_range_arg(argv[1], &start_pos, &end_pos);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
ret = asprintf(errmsg, "Argument doesn't convert to integer or range: '%s'", argv[1]);
|
||||||
|
if (ret < 0)
|
||||||
|
DPRINTF(E_LOG, L_MPD, "Out of memory\n");
|
||||||
|
return ACK_ERROR_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = end_pos - start_pos;
|
||||||
|
if (count > 1)
|
||||||
|
DPRINTF(E_WARN, L_MPD, "Moving ranges is not supported, only the first item will be moved\n");
|
||||||
|
|
||||||
|
ret = safe_atou32(argv[2], &to_pos);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
ret = asprintf(errmsg, "Argument doesn't convert to integer: '%s'", argv[2]);
|
||||||
|
if (ret < 0)
|
||||||
|
DPRINTF(E_LOG, L_MPD, "Out of memory\n");
|
||||||
|
return ACK_ERROR_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = player_queue_move_byindex(start_pos, to_pos);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
ret = asprintf(errmsg, "Failed to move song at position %d to %d", start_pos, to_pos);
|
||||||
|
if (ret < 0)
|
||||||
|
DPRINTF(E_LOG, L_MPD, "Out of memory\n");
|
||||||
|
return ACK_ERROR_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
35
src/player.c
35
src/player.c
@ -3448,6 +3448,21 @@ playerqueue_move_bypos(struct player_command *cmd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
playerqueue_move_byindex(struct player_command *cmd)
|
||||||
|
{
|
||||||
|
DPRINTF(E_DBG, L_PLAYER, "Moving song from index %d to be the next song after %d\n",
|
||||||
|
cmd->arg.queue_move_param.from_pos, cmd->arg.queue_move_param.to_pos);
|
||||||
|
|
||||||
|
queue_move_byindex(queue, cmd->arg.queue_move_param.from_pos, cmd->arg.queue_move_param.to_pos, 0);
|
||||||
|
|
||||||
|
cur_plversion++;
|
||||||
|
|
||||||
|
listener_notify(LISTENER_PLAYLIST);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
playerqueue_move_byitemid(struct player_command *cmd)
|
playerqueue_move_byitemid(struct player_command *cmd)
|
||||||
{
|
{
|
||||||
@ -4265,6 +4280,26 @@ player_queue_move_bypos(int pos_from, int pos_to)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
player_queue_move_byindex(int pos_from, int pos_to)
|
||||||
|
{
|
||||||
|
struct player_command cmd;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
command_init(&cmd);
|
||||||
|
|
||||||
|
cmd.func = playerqueue_move_byindex;
|
||||||
|
cmd.func_bh = NULL;
|
||||||
|
cmd.arg.queue_move_param.from_pos = pos_from;
|
||||||
|
cmd.arg.queue_move_param.to_pos = pos_to;
|
||||||
|
|
||||||
|
ret = sync_command(&cmd);
|
||||||
|
|
||||||
|
command_deinit(&cmd);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
player_queue_move_byitemid(uint32_t item_id, int pos_to)
|
player_queue_move_byitemid(uint32_t item_id, int pos_to)
|
||||||
{
|
{
|
||||||
|
@ -169,6 +169,9 @@ player_queue_add_next(struct queue_item *items);
|
|||||||
int
|
int
|
||||||
player_queue_move_bypos(int ps_pos_from, int ps_pos_to);
|
player_queue_move_bypos(int ps_pos_from, int ps_pos_to);
|
||||||
|
|
||||||
|
int
|
||||||
|
player_queue_move_byindex(int pos_from, int pos_to);
|
||||||
|
|
||||||
int
|
int
|
||||||
player_queue_move_byitemid(uint32_t item_id, int pos_to);
|
player_queue_move_byitemid(uint32_t item_id, int pos_to);
|
||||||
|
|
||||||
|
59
src/queue.c
59
src/queue.c
@ -763,6 +763,65 @@ queue_move_bypos(struct queue *queue, unsigned int item_id, unsigned int from_po
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
queue_move_byindex(struct queue *queue, unsigned int from_pos, unsigned int to_pos, char shuffle)
|
||||||
|
{
|
||||||
|
struct queue_item *item;
|
||||||
|
struct queue_item *itemnext;
|
||||||
|
|
||||||
|
if (from_pos == to_pos)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Get the item to be moved
|
||||||
|
item = queueitem_get_byindex(queue, from_pos, shuffle);
|
||||||
|
if (!item)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_PLAYER, "Invalid position given to move items\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the item at the target position
|
||||||
|
itemnext = queueitem_get_byindex(queue, to_pos, shuffle);
|
||||||
|
if (!itemnext)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_PLAYER, "Invalid position given to move items\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (to_pos > from_pos)
|
||||||
|
itemnext = item_next(itemnext, shuffle);
|
||||||
|
|
||||||
|
// Remove item from the queue
|
||||||
|
if (shuffle)
|
||||||
|
{
|
||||||
|
item->shuffle_prev->shuffle_next = item->shuffle_next;
|
||||||
|
item->shuffle_next->shuffle_prev = item->shuffle_prev;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item->prev->next = item->next;
|
||||||
|
item->next->prev = item->prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert item into the queue before the item at the target postion
|
||||||
|
if (shuffle)
|
||||||
|
{
|
||||||
|
itemnext->shuffle_prev->shuffle_next = item;
|
||||||
|
item->shuffle_prev = itemnext->shuffle_prev;
|
||||||
|
|
||||||
|
itemnext->shuffle_prev = item;
|
||||||
|
item->shuffle_next = itemnext;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
itemnext->prev->next = item;
|
||||||
|
item->prev = itemnext->prev;
|
||||||
|
|
||||||
|
itemnext->prev = item;
|
||||||
|
item->next = itemnext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Moves the item with the given item-id to the index to_pos in the play-queue (shuffle = 0)
|
* Moves the item with the given item-id to the index to_pos in the play-queue (shuffle = 0)
|
||||||
* or shuffle-queue (shuffle = 1)
|
* or shuffle-queue (shuffle = 1)
|
||||||
|
@ -83,6 +83,9 @@ queue_add_after(struct queue *queue, struct queue_item *item, unsigned int item_
|
|||||||
void
|
void
|
||||||
queue_move_bypos(struct queue *queue, unsigned int item_id, unsigned int from_pos, unsigned int to_offset, char shuffle);
|
queue_move_bypos(struct queue *queue, unsigned int item_id, unsigned int from_pos, unsigned int to_offset, char shuffle);
|
||||||
|
|
||||||
|
void
|
||||||
|
queue_move_byindex(struct queue *queue, unsigned int from_pos, unsigned int to_pos, char shuffle);
|
||||||
|
|
||||||
void
|
void
|
||||||
queue_move_byitemid(struct queue *queue, unsigned int item_id, unsigned int to_pos, char shuffle);
|
queue_move_byitemid(struct queue *queue, unsigned int item_id, unsigned int to_pos, char shuffle);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user