diff --git a/changes/overlay-playlist-visible-state.md b/changes/overlay-playlist-visible-state.md new file mode 100644 index 00000000..76764550 --- /dev/null +++ b/changes/overlay-playlist-visible-state.md @@ -0,0 +1,4 @@ +type: fixed +area: overlay + +- Kept the visible overlay active while mpv advances to the next playlist item, even when the next episode loads after the warm transition delay. diff --git a/plugin/subminer/lifecycle.lua b/plugin/subminer/lifecycle.lua index eb967e37..18f001ef 100644 --- a/plugin/subminer/lifecycle.lua +++ b/plugin/subminer/lifecycle.lua @@ -51,6 +51,15 @@ function M.create(ctx) return reason == "reload" or reason == "redirect" end + local function has_next_playlist_item() + local playlist_count = mp.get_property_number("playlist-count") + local playlist_pos = mp.get_property_number("playlist-pos") + if type(playlist_count) ~= "number" or type(playlist_pos) ~= "number" then + return false + end + return playlist_count > 0 and playlist_pos >= 0 and playlist_pos < playlist_count - 1 + end + local function clear_pending_visible_overlay_hide() local timer = state.pending_visible_overlay_hide_timer if timer and timer.kill then @@ -63,6 +72,9 @@ function M.create(ctx) local resolve_auto_start_visible_overlay_enabled local function hide_visible_overlay_after_end_file() + if has_next_playlist_item() then + return + end if state.visible_overlay_requested == true and not resolve_auto_start_visible_overlay_enabled() then return end diff --git a/scripts/test-plugin-start-gate.lua b/scripts/test-plugin-start-gate.lua index 5967b991..adf93d93 100644 --- a/scripts/test-plugin-start-gate.lua +++ b/scripts/test-plugin-start-gate.lua @@ -69,6 +69,12 @@ local function run_plugin_scenario(config) if name == "osd-height" then return config.osd_height or 720 end + if name == "playlist-count" then + return config.playlist_count + end + if name == "playlist-pos" then + return config.playlist_pos + end return nil end @@ -627,6 +633,46 @@ do ) end +do + local scenario = { + process_list = "", + defer_timeouts = true, + option_overrides = { + binary_path = binary_path, + auto_start = "yes", + auto_start_visible_overlay = "yes", + auto_start_pause_until_ready = "yes", + socket_path = "/tmp/subminer-socket", + }, + input_ipc_server = "/tmp/subminer-socket", + path = "/media/slow-episode-01.mkv", + media_title = "Slow Episode 1", + playlist_count = 2, + playlist_pos = 0, + files = { + [binary_path] = true, + }, + } + local recorded, err = run_plugin_scenario(scenario) + assert_true(recorded ~= nil, "plugin failed to load for slow warm playlist visibility scenario: " .. tostring(err)) + fire_event(recorded, "file-loaded") + recorded.script_messages["subminer-autoplay-ready"]() + fire_event(recorded, "end-file", { reason = "eof" }) + fire_pending_timeouts(recorded) + scenario.path = "/media/slow-episode-02.mkv" + scenario.media_title = "Slow Episode 2" + scenario.playlist_pos = 1 + fire_event(recorded, "file-loaded") + assert_true( + count_control_calls(recorded.async_calls, "--hide-visible-overlay") == 0, + "slow playlist advance should preserve visible overlay state while the next episode is pending" + ) + assert_true( + count_start_calls(recorded.async_calls) == 1, + "slow playlist visibility reuse should not issue another --start command" + ) +end + do local scenario = { process_list = "",