diff options
-rw-r--r-- | DOCS/man/input.rst | 7 | ||||
-rw-r--r-- | player/loadfile.c | 15 | ||||
-rw-r--r-- | player/lua/ytdl_hook.lua | 2 |
3 files changed, 19 insertions, 5 deletions
diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst index 2294197368..16d8ecb45d 100644 --- a/DOCS/man/input.rst +++ b/DOCS/man/input.rst @@ -790,6 +790,13 @@ The following hooks are currently defined: ``file-local-options/<option name>``. The player will wait until all hooks are run. +``on_load_fail`` + Called after after a file has been opened, but failed to. This can be + used to provide a fallback in case native demuxers failed to recognize + the file, instead of always running before the native demuxers like + ``on_load``. Demux will only be retried if ``stream-open-filename`` + was changed. + ``on_preloaded`` Called after a file has been opened, and before tracks are selected and decoders are created. This has some usefulness if an API users wants diff --git a/player/loadfile.c b/player/loadfile.c index ca782f88d8..c54204db0b 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -734,12 +734,12 @@ static void transfer_playlist(struct MPContext *mpctx, struct playlist *pl) } } -static int process_open_hooks(struct MPContext *mpctx) +static int process_open_hooks(struct MPContext *mpctx, char *name) { - mp_hook_run(mpctx, NULL, "on_load"); + mp_hook_run(mpctx, NULL, name); - while (!mp_hook_test_completion(mpctx, "on_load")) { + while (!mp_hook_test_completion(mpctx, name)) { mp_idle(mpctx); if (mpctx->stop_play) { // Can't exit immediately, the script would interfere with the @@ -1214,7 +1214,7 @@ reopen_file: assert(mpctx->demuxer == NULL); - if (process_open_hooks(mpctx) < 0) + if (process_open_hooks(mpctx, "on_load") < 0) goto terminate_playback; if (opts->stream_dump && opts->stream_dump[0]) { @@ -1224,6 +1224,13 @@ reopen_file: } open_demux_reentrant(mpctx); + if (!mpctx->stop_play && !mpctx->demuxer && + process_open_hooks(mpctx, "on_load_fail") >= 0 && + strcmp(mpctx->stream_open_filename, mpctx->filename) != 0) + { + mpctx->error_playing = MPV_ERROR_LOADING_FAILED; + open_demux_reentrant(mpctx); + } if (!mpctx->demuxer || mpctx->stop_play) goto terminate_playback; diff --git a/player/lua/ytdl_hook.lua b/player/lua/ytdl_hook.lua index f20eed70d1..8a75fa7e3d 100644 --- a/player/lua/ytdl_hook.lua +++ b/player/lua/ytdl_hook.lua @@ -301,7 +301,7 @@ local function add_single_video(json) end end -mp.add_hook("on_load", 10, function () +mp.add_hook("on_load_fail", 10, function () local url = mp.get_property("stream-open-filename") local start_time = os.clock() if (url:find("ytdl://") == 1) or |