summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/input.rst15
-rw-r--r--input/cmd_list.c5
-rw-r--r--input/cmd_list.h2
-rw-r--r--player/command.c18
-rw-r--r--player/core.h3
-rw-r--r--player/loadfile.c7
6 files changed, 46 insertions, 4 deletions
diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst
index 80b4b253e9..8a6ac915ba 100644
--- a/DOCS/man/input.rst
+++ b/DOCS/man/input.rst
@@ -400,6 +400,21 @@ List of Input Commands
``audio_reload [<id>]``
Reload the given audio tracks. See ``sub_reload`` command.
+``rescan_external_files [<mode>]``
+ Rescan external files according to the current ``--sub-auto`` and
+ ``--audio-file-auto`` settings. This can be used to auto-load external
+ files *after* the file was loaded.
+
+ The ``mode`` argument is one of the following:
+
+ <keep-selection> (default)
+ Do not change current track selections.
+
+ <reselect>
+ Select the default audio and video streams, which typically selects
+ external files with highest preference. (The implementation is not
+ perfect, and could be improved on request.)
+
Input Commands that are Possibly Subject to Change
--------------------------------------------------
diff --git a/input/cmd_list.c b/input/cmd_list.c
index 28c89884e7..380e241b60 100644
--- a/input/cmd_list.c
+++ b/input/cmd_list.c
@@ -199,6 +199,11 @@ const struct mp_cmd_def mp_cmds[] = {
{ MP_CMD_AUDIO_REMOVE, "audio_remove", { OARG_INT(-1) } },
{ MP_CMD_AUDIO_RELOAD, "audio_reload", { OARG_INT(-1) } },
+ { MP_CMD_RESCAN_EXTERNAL_FILES, "rescan_external_files", {
+ OARG_CHOICE(0, ({"keep-selection", 0},
+ {"reselect", 1})),
+ }},
+
{0}
};
diff --git a/input/cmd_list.h b/input/cmd_list.h
index c761be98ee..d57da46d06 100644
--- a/input/cmd_list.h
+++ b/input/cmd_list.h
@@ -111,6 +111,8 @@ enum mp_command_type {
MP_CMD_HOOK_ADD,
MP_CMD_HOOK_ACK,
+ MP_CMD_RESCAN_EXTERNAL_FILES,
+
// Internal
MP_CMD_COMMAND_LIST, // list of sub-commands in args[0].v.p
};
diff --git a/player/command.c b/player/command.c
index 484b8d7aad..e2a69fe808 100644
--- a/player/command.c
+++ b/player/command.c
@@ -4636,6 +4636,24 @@ int run_command(MPContext *mpctx, mp_cmd_t *cmd)
return -1;
}
+ case MP_CMD_RESCAN_EXTERNAL_FILES: {
+ if (!mpctx->playing)
+ return -1;
+ autoload_external_files(mpctx);
+ if (cmd->args[0].v.i) {
+ // somewhat fuzzy and not ideal
+ struct track *a = select_track(mpctx, STREAM_AUDIO, opts->audio_id,
+ opts->audio_id_ff, opts->audio_lang);
+ if (a && a->is_external)
+ mp_switch_track(mpctx, STREAM_AUDIO, a);
+ struct track *s = select_track(mpctx, STREAM_SUB, opts->sub_id,
+ opts->sub_id_ff, opts->sub_lang);
+ if (s && s->is_external)
+ mp_switch_track(mpctx, STREAM_SUB, s);
+ }
+ break;
+ }
+
case MP_CMD_SCREENSHOT:
screenshot_request(mpctx, cmd->args[0].v.i, cmd->args[1].v.i, msg_osd);
break;
diff --git a/player/core.h b/player/core.h
index d6475eb385..5b69541d24 100644
--- a/player/core.h
+++ b/player/core.h
@@ -394,6 +394,9 @@ void mp_play_files(struct MPContext *mpctx);
void update_demuxer_properties(struct MPContext *mpctx);
void reselect_demux_streams(struct MPContext *mpctx);
void prepare_playlist(struct MPContext *mpctx, struct playlist *pl);
+void autoload_external_files(struct MPContext *mpctx);
+struct track *select_track(struct MPContext *mpctx, enum stream_type type,
+ int tid, int ffid, char **langs);
// main.c
int mpv_main(int argc, char *argv[]);
diff --git a/player/loadfile.c b/player/loadfile.c
index 472304d5f0..9148050c6a 100644
--- a/player/loadfile.c
+++ b/player/loadfile.c
@@ -441,9 +441,8 @@ static bool compare_track(struct track *t1, struct track *t2, char **langs,
}
return t1->user_tid <= t2->user_tid;
}
-static struct track *select_track(struct MPContext *mpctx,
- enum stream_type type, int tid, int ffid,
- char **langs)
+struct track *select_track(struct MPContext *mpctx, enum stream_type type,
+ int tid, int ffid, char **langs)
{
if (ffid != -1)
tid = -1; // prefer selecting ffid
@@ -727,7 +726,7 @@ static void open_subtitles_from_options(struct MPContext *mpctx)
mp_add_external_file(mpctx, opts->sub_name[i], STREAM_SUB);
}
-static void autoload_external_files(struct MPContext *mpctx)
+void autoload_external_files(struct MPContext *mpctx)
{
if (mpctx->opts->sub_auto < 0 && mpctx->opts->audiofile_auto < 0)
return;