summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDudemanguy <random342@airmail.cc>2024-03-01 17:38:35 -0600
committerDudemanguy <random342@airmail.cc>2024-03-21 14:48:53 +0000
commit91489c946689763c36e4d720d6048037252818f7 (patch)
treed6dcbf5aa8d09f8ff6c572b52ff56114704bcf0e
parent46a35e2edc1905a9cbe4674f454ef056a6d1eef4 (diff)
downloadmpv-91489c946689763c36e4d720d6048037252818f7.tar.bz2
mpv-91489c946689763c36e4d720d6048037252818f7.tar.xz
options: add --input-commands option
Basically a simple way to perform any command/property action from the command line. This takes the exact same syntax as input.conf but not including the key naturally. Potentially useful for weird properties that don't map well to options (like ao-volume). Fixes #12353.
-rw-r--r--DOCS/interface-changes/add-input-commands.txt1
-rw-r--r--DOCS/man/options.rst15
-rw-r--r--options/options.c1
-rw-r--r--options/options.h1
-rw-r--r--player/command.c28
-rw-r--r--player/command.h1
-rw-r--r--player/playloop.c1
7 files changed, 48 insertions, 0 deletions
diff --git a/DOCS/interface-changes/add-input-commands.txt b/DOCS/interface-changes/add-input-commands.txt
new file mode 100644
index 0000000000..3db6bd4055
--- /dev/null
+++ b/DOCS/interface-changes/add-input-commands.txt
@@ -0,0 +1 @@
+add `--input-comands` option
diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst
index 2299e3f14b..1b6e1465de 100644
--- a/DOCS/man/options.rst
+++ b/DOCS/man/options.rst
@@ -4101,6 +4101,21 @@ Input
``--input-cmdlist``
Prints all commands that can be bound to keys.
+``--input-commands=<cmd1,cmd2,...>``
+ Define a list of commands for mpv to run. The syntax is the same as format
+ as ``input.conf`` but without the key binding argument at the beginning.
+ When this option is set at startup, the commands will run after audio and
+ video playback are about to begin if applicable (in idle mode with no file,
+ it will run immediately). When changing values at runtime, the commands will
+ also run as soon as possible.
+
+ This is a string list option. See `List Options`_ for details.
+
+ .. admonition:: Example
+
+ ``--input-commands="playlist-play-index 1,set ao-volume 40"``
+ sets the playlist index to 1 and the ao-volume to 40
+
``--input-doubleclick-time=<milliseconds>``
Time in milliseconds to recognize two consecutive button presses as a
double-click (default: 300).
diff --git a/options/options.c b/options/options.c
index 80e0f6cc28..8640ecb27f 100644
--- a/options/options.c
+++ b/options/options.c
@@ -853,6 +853,7 @@ static const m_option_t mp_opts[] = {
{"idle", OPT_CHOICE(player_idle_mode,
{"no", 0}, {"once", 1}, {"yes", 2})},
+ {"input-commands", OPT_STRINGLIST(input_commands)},
{"input-terminal", OPT_BOOL(consolecontrols), .flags = UPDATE_TERM},
{"input-ipc-server", OPT_STRING(ipc_path), .flags = M_OPT_FILE},
diff --git a/options/options.h b/options/options.h
index 4d3d988789..69a50b3350 100644
--- a/options/options.h
+++ b/options/options.h
@@ -256,6 +256,7 @@ typedef struct MPOpts {
char *osd_status_msg;
char *osd_msg[3];
int player_idle_mode;
+ char **input_commands;
bool consolecontrols;
int playlist_pos;
struct m_rel_time play_start;
diff --git a/player/command.c b/player/command.c
index b5f9ad8065..ed4def2813 100644
--- a/player/command.c
+++ b/player/command.c
@@ -94,6 +94,8 @@ struct command_ctx {
char **warned_deprecated;
int num_warned_deprecated;
+ bool command_opts_processed;
+
struct overlay *overlays;
int num_overlays;
// One of these is in use by the OSD; the other one exists so that the
@@ -7161,6 +7163,27 @@ void handle_command_updates(struct MPContext *mpctx)
// Depends on polling demuxer wakeup callback notifications.
cache_dump_poll(mpctx);
+
+ // Potentially run the commands now (idle) instead of waiting for a file to load.
+ if (mpctx->stop_play == PT_STOP)
+ run_command_opts(mpctx);
+}
+
+void run_command_opts(struct MPContext *mpctx)
+{
+ struct MPOpts *opts = mpctx->opts;
+ struct command_ctx *ctx = mpctx->command_ctx;
+
+ if (!opts->input_commands || ctx->command_opts_processed)
+ return;
+
+ // Take easy way out and add these to the input queue.
+ for (int i = 0; opts->input_commands[i]; i++) {
+ struct mp_cmd *cmd = mp_input_parse_cmd(mpctx->input, bstr0(opts->input_commands[i]),
+ "the command line");
+ mp_input_queue_cmd(mpctx->input, cmd);
+ }
+ ctx->command_opts_processed = true;
}
void mp_notify(struct MPContext *mpctx, int event, void *arg)
@@ -7299,6 +7322,11 @@ void mp_option_change_callback(void *ctx, struct m_config_option *co, int flags,
vo_control(mpctx->video_out, VOCTRL_EXTERNAL_RESIZE, NULL);
}
+ if (opt_ptr == &opts->input_commands) {
+ mpctx->command_ctx->command_opts_processed = false;
+ run_command_opts(mpctx);
+ }
+
if (opt_ptr == &opts->playback_speed) {
update_playback_speed(mpctx);
mp_wakeup_core(mpctx);
diff --git a/player/command.h b/player/command.h
index 185b78fdbe..31e3b32a78 100644
--- a/player/command.h
+++ b/player/command.h
@@ -70,6 +70,7 @@ void run_command(struct MPContext *mpctx, struct mp_cmd *cmd,
struct mp_abort_entry *abort,
void (*on_completion)(struct mp_cmd_ctx *cmd),
void *on_completion_priv);
+void run_command_opts(struct MPContext *mpctx);
void mp_cmd_ctx_complete(struct mp_cmd_ctx *cmd);
PRINTF_ATTRIBUTE(3, 4)
void mp_cmd_msg(struct mp_cmd_ctx *cmd, int status, const char *msg, ...);
diff --git a/player/playloop.c b/player/playloop.c
index eccc432ffe..bf903e54f7 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -1140,6 +1140,7 @@ static void handle_playback_restart(struct MPContext *mpctx)
mpctx->hrseek_active = false;
mpctx->restart_complete = true;
mpctx->current_seek = (struct seek_params){0};
+ run_command_opts(mpctx);
handle_playback_time(mpctx);
mp_notify(mpctx, MPV_EVENT_PLAYBACK_RESTART, NULL);
update_core_idle_state(mpctx);