Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

command: make playlist-play-index accept file-local-options #15608

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions DOCS/interface-changes/playlist-play-index-options.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
add an options argument to `playlist-play-index`
9 changes: 8 additions & 1 deletion DOCS/man/input.rst
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,7 @@ Playlist Manipulation
Go to the first of the previous entries on the playlist with a different
``playlist-path``.

``playlist-play-index <integer|current|none>``
``playlist-play-index <integer|current|none> [<options>]``
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if options were added with loadfile already? Why we need to duplicate it in play command?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They are just merged with any previous file-local-options. The use case for this was that I wrote a format quality selector, then realized it's useless since you can set --script-opt=ytdl_hook-all_formats=yes and use regular track selection much more quickly without rerunning yt-dlp, but still in that selector I would do playlist-play-index current start=${time-pos} to restart the stream from the same position. Hackier alternatives are write-watch-later-config; playlist-play-index current, or using this temporary event listener https://github.com/christoph-heinrich/mpv-quality-menu/blob/6e4dc5ee8d41b422239ae504c52647a1478675b7/quality-menu.lua#L245. Again I don't know if this is worth adding regardless. Though maybe we can bind ctrl+r to a builtin script using this for general purpose refresh of the current URL, if that's worth it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually I did not think of this because I use --watch-later-options=start, but write-watch-later-config; playlist-play-index current will also preserve --watch-later-options other than start. So maybe it's better to just use that.

Start (or restart) playback of the given playlist index. In addition to the
0-based playlist entry index, it supports the following values:

Expand All @@ -488,6 +488,13 @@ Playlist Manipulation
Playback is stopped. If idle mode (``--idle``) is enabled, the player
will enter idle mode, otherwise it will exit.

The second argument is a list of options and values which should be set
while the file is playing. It is of the form ``opt1=value1,opt2=value2,..``.
When using the client API, this can be a ``MPV_FORMAT_NODE_MAP`` (or a Lua
table), however the values themselves must be strings currently. These
options are set during playback, and restored to the previous value at end
of playback (see `Per-File Options`_).

This command is similar to ``loadfile`` in that it only manipulates the
state of what to play next, without waiting until the current file is
unloaded, and the next one is loaded.
Expand Down
11 changes: 10 additions & 1 deletion player/command.c
Original file line number Diff line number Diff line change
Expand Up @@ -5792,7 +5792,15 @@ static void cmd_playlist_play_index(void *p)
if (pos == -2)
pos = playlist_entry_to_index(pl, pl->current);

mp_set_playlist_entry(mpctx, playlist_entry_from_index(pl, pos));
struct playlist_entry *entry = playlist_entry_from_index(pl, pos);

if (entry && cmd->args[1].v.str_list) {
char **pairs = cmd->args[1].v.str_list;
for (int i = 0; pairs[i] && pairs[i + 1]; i += 2)
playlist_entry_add_param(entry, bstr0(pairs[i]), bstr0(pairs[i + 1]));
}

mp_set_playlist_entry(mpctx, entry);
if (cmd->on_osd & MP_ON_OSD_MSG)
mpctx->add_osd_seek_info |= OSD_SEEK_INFO_CURRENT_FILE;
}
Expand Down Expand Up @@ -7016,6 +7024,7 @@ const struct mp_cmd_def mp_cmds[] = {
{
{"index", OPT_CHOICE(v.i, {"current", -2}, {"none", -1}),
M_RANGE(-1, INT_MAX)},
{"options", OPT_KEYVALUELIST(v.str_list), .flags = MP_CMD_OPT_ARG},
}
},
{ "playlist-shuffle", cmd_playlist_shuffle, },
Expand Down
Loading