mirror of
https://github.com/mpv-player/mpv
synced 2025-03-25 04:38:01 +00:00
command: add some playlist manipulation commands
playlist_remove and playlist_move.
This commit is contained in:
parent
0b77649c0b
commit
451f6788ce
@ -164,6 +164,17 @@ loadlist "<playlist>" [replace|append]
|
||||
playlist_clear
|
||||
Clear the playlist, except the currently played file.
|
||||
|
||||
playlist_remove <index>
|
||||
Remove the playlist entry at the given index. Index values start counting
|
||||
with 0. You can't remove the entry for the currently played file.
|
||||
|
||||
playlist_move <index1> <index2>
|
||||
Move the playlist entry at index1, so that it takes the place of the
|
||||
entry index2. (Paradoxically, the moved playlist entry will not have
|
||||
the index value index2 after moving if index1 was lower than index2,
|
||||
because index2 refers to the target entry, not the index the entry
|
||||
will have after moving.)
|
||||
|
||||
run "<command>"
|
||||
Run the given command with ``/bin/sh -c``. The string is expanded like in
|
||||
property_expansion_.
|
||||
|
@ -2180,6 +2180,29 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
|
||||
break;
|
||||
}
|
||||
|
||||
case MP_CMD_PLAYLIST_REMOVE: {
|
||||
struct playlist_entry *e = playlist_entry_from_index(mpctx->playlist,
|
||||
cmd->args[0].v.i);
|
||||
if (e) {
|
||||
// Can't play a removed entry
|
||||
if (mpctx->playlist->current == e)
|
||||
mpctx->stop_play = PT_CURRENT_ENTRY;
|
||||
playlist_remove(mpctx->playlist, e);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case MP_CMD_PLAYLIST_MOVE: {
|
||||
struct playlist_entry *e1 = playlist_entry_from_index(mpctx->playlist,
|
||||
cmd->args[0].v.i);
|
||||
struct playlist_entry *e2 = playlist_entry_from_index(mpctx->playlist,
|
||||
cmd->args[1].v.i);
|
||||
if (e1) {
|
||||
playlist_move(mpctx->playlist, e1, e2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case MP_CMD_STOP:
|
||||
// Go back to the starting point.
|
||||
mpctx->stop_play = PT_STOP;
|
||||
|
@ -183,6 +183,8 @@ static const mp_cmd_t mp_cmds[] = {
|
||||
{"append", 1}, {"1", 1})),
|
||||
}},
|
||||
{ MP_CMD_PLAYLIST_CLEAR, "playlist_clear", },
|
||||
{ MP_CMD_PLAYLIST_REMOVE, "playlist_remove", { ARG_INT } },
|
||||
{ MP_CMD_PLAYLIST_MOVE, "playlist_move", { ARG_INT, ARG_INT } },
|
||||
{ MP_CMD_RUN, "run", { ARG_STRING } },
|
||||
|
||||
{ MP_CMD_KEYDOWN_EVENTS, "key_down_event", { ARG_INT } },
|
||||
|
@ -39,6 +39,8 @@ enum mp_command_type {
|
||||
MP_CMD_LOADFILE,
|
||||
MP_CMD_LOADLIST,
|
||||
MP_CMD_PLAYLIST_CLEAR,
|
||||
MP_CMD_PLAYLIST_REMOVE,
|
||||
MP_CMD_PLAYLIST_MOVE,
|
||||
MP_CMD_SUB_STEP,
|
||||
MP_CMD_TV_SET_CHANNEL,
|
||||
MP_CMD_TV_LAST_CHANNEL,
|
||||
|
@ -114,6 +114,20 @@ void playlist_clear(struct playlist *pl)
|
||||
pl->current_was_replaced = false;
|
||||
}
|
||||
|
||||
// Moves entry such that entry->prev = at (even if at is NULL)
|
||||
void playlist_move(struct playlist *pl, struct playlist_entry *entry,
|
||||
struct playlist_entry *at)
|
||||
{
|
||||
struct playlist_entry *save_current = pl->current;
|
||||
bool save_replaced = pl->current_was_replaced;
|
||||
|
||||
playlist_unlink(pl, entry);
|
||||
playlist_insert(pl, at ? at->prev : pl->last, entry);
|
||||
|
||||
pl->current = save_current;
|
||||
pl->current_was_replaced = save_replaced;
|
||||
}
|
||||
|
||||
void playlist_add_file(struct playlist *pl, const char *filename)
|
||||
{
|
||||
playlist_add(pl, playlist_entry_new(filename));
|
||||
|
@ -58,6 +58,9 @@ void playlist_add(struct playlist *pl, struct playlist_entry *add);
|
||||
void playlist_remove(struct playlist *pl, struct playlist_entry *entry);
|
||||
void playlist_clear(struct playlist *pl);
|
||||
|
||||
void playlist_move(struct playlist *pl, struct playlist_entry *entry,
|
||||
struct playlist_entry *at);
|
||||
|
||||
void playlist_add_file(struct playlist *pl, const char *filename);
|
||||
void playlist_shuffle(struct playlist *pl);
|
||||
struct playlist_entry *playlist_get_next(struct playlist *pl, int direction);
|
||||
|
Loading…
Reference in New Issue
Block a user