From fadf80273064ab970d11ee040189a66975e5f6f4 Mon Sep 17 00:00:00 2001 From: xdev23 Date: Fri, 6 Mar 2026 20:24:32 +0530 Subject: [PATCH 1/6] Display hover time on seekbar for thumbnail script Add functionality to show position in seconds when hovering over the seekbar, useful for thumbnail creation. --- player/lua/osc.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/player/lua/osc.lua b/player/lua/osc.lua index 944de4a455110..9431a92e73288 100644 --- a/player/lua/osc.lua +++ b/player/lua/osc.lua @@ -838,6 +838,20 @@ local function render_elements(master_ass) -- render iterations because the title may be rendered before the slider. state.forced_title = nil local se, ae = state.slider_element, elements[state.active_element] + + -- show posssec time when mouse is hoverd on seekbar helpful for + -- creating thumbnail script, it's a property, can used by other scripts + if se and (ae == se or (not ae and mouse_hit(se))) then + local dur = mp.get_property_number("duration", 0) + if dur > 0 then + local possec = get_slider_value(se) * dur / 100 + mp.set_property_number("user-data/osc/hover_mouse_time", possec) + end + else + mp.set_property("user-data/osc/hover_mouse_time", "none") + end + + if user_opts.chapter_fmt ~= "no" and se and (ae == se or (not ae and mouse_hit(se))) then local dur = mp.get_property_number("duration", 0) if dur > 0 then From f1f23666feab200123efff57a74f322fa021800c Mon Sep 17 00:00:00 2001 From: xdev23 Date: Fri, 6 Mar 2026 21:40:01 +0530 Subject: [PATCH 2/6] Improve comments in osc.lua for better understanding Correct comments for clarity and fix minor typos. --- player/lua/osc.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/player/lua/osc.lua b/player/lua/osc.lua index 9431a92e73288..94d088512722d 100644 --- a/player/lua/osc.lua +++ b/player/lua/osc.lua @@ -840,8 +840,8 @@ local function render_elements(master_ass) local se, ae = state.slider_element, elements[state.active_element] -- show posssec time when mouse is hoverd on seekbar helpful for - -- creating thumbnail script, it's a property, can used by other scripts - if se and (ae == se or (not ae and mouse_hit(se))) then + -- creating thumbnail script, it's a property, can used by other scripts. + if se and (ae == se or (not ae and mouse_hit(se))) then local dur = mp.get_property_number("duration", 0) if dur > 0 then local possec = get_slider_value(se) * dur / 100 @@ -851,7 +851,6 @@ local function render_elements(master_ass) mp.set_property("user-data/osc/hover_mouse_time", "none") end - if user_opts.chapter_fmt ~= "no" and se and (ae == se or (not ae and mouse_hit(se))) then local dur = mp.get_property_number("duration", 0) if dur > 0 then From 141430148f23d3bb7da723a8ccfd107f38b6dada Mon Sep 17 00:00:00 2001 From: xdev23 Date: Fri, 6 Mar 2026 22:20:17 +0530 Subject: [PATCH 3/6] Fix typo in comment about seekbar time display --- player/lua/osc.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/player/lua/osc.lua b/player/lua/osc.lua index 94d088512722d..c7423c126b68b 100644 --- a/player/lua/osc.lua +++ b/player/lua/osc.lua @@ -839,7 +839,7 @@ local function render_elements(master_ass) state.forced_title = nil local se, ae = state.slider_element, elements[state.active_element] - -- show posssec time when mouse is hoverd on seekbar helpful for + -- show time when mouse is hoverd on seekbar helpful for -- creating thumbnail script, it's a property, can used by other scripts. if se and (ae == se or (not ae and mouse_hit(se))) then local dur = mp.get_property_number("duration", 0) From e9de185663736e73886f83f9f161cf5f3597d629 Mon Sep 17 00:00:00 2001 From: xdev23 Date: Fri, 6 Mar 2026 23:20:31 +0530 Subject: [PATCH 4/6] Update comment for seekbar thumbnail script Clarified comment about the seekbar's functionality. --- player/lua/osc.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/player/lua/osc.lua b/player/lua/osc.lua index c7423c126b68b..b9737eca4971d 100644 --- a/player/lua/osc.lua +++ b/player/lua/osc.lua @@ -840,7 +840,7 @@ local function render_elements(master_ass) local se, ae = state.slider_element, elements[state.active_element] -- show time when mouse is hoverd on seekbar helpful for - -- creating thumbnail script, it's a property, can used by other scripts. + -- creating thumbnail script, it's a property and can used by other scripts. if se and (ae == se or (not ae and mouse_hit(se))) then local dur = mp.get_property_number("duration", 0) if dur > 0 then From 34ed88a3708c3b05a19f07bacecd98d2d0580d03 Mon Sep 17 00:00:00 2001 From: xdev23 Date: Sat, 7 Mar 2026 07:31:00 +0530 Subject: [PATCH 5/6] Add last_hover_possec to track hover time changes fixed maintainers raised issues --- player/lua/osc.lua | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/player/lua/osc.lua b/player/lua/osc.lua index b9737eca4971d..1ac7291bdf81e 100644 --- a/player/lua/osc.lua +++ b/player/lua/osc.lua @@ -272,6 +272,7 @@ local state = { osc_chapterlist_warned = false, osc_playlist_warned = false, osc_tracklist_warned = false, + last_hover_possec = nil, } local logo_lines = { @@ -845,20 +846,26 @@ local function render_elements(master_ass) local dur = mp.get_property_number("duration", 0) if dur > 0 then local possec = get_slider_value(se) * dur / 100 - mp.set_property_number("user-data/osc/hover_mouse_time", possec) - end - else - mp.set_property("user-data/osc/hover_mouse_time", "none") - end - if user_opts.chapter_fmt ~= "no" and se and (ae == se or (not ae and mouse_hit(se))) then - local dur = mp.get_property_number("duration", 0) - if dur > 0 then - local possec = get_slider_value(se) * dur / 100 -- of mouse pos - local ch = get_chapter(possec) - if ch and ch.title and ch.title ~= "" then - state.forced_title = string.format(user_opts.chapter_fmt, ch.title) + -- update hover time only if changed by >0.1s to prevent render lag + if not state.last_hover_possec or math.abs(state.last_hover_possec - possec) > 0.1 then + mp.set_property_number("user-data/osc/hover_mouse_time", possec) + state.last_hover_possec = possec end + + -- original chapter title logic is now implemented/combined here + if user_opts.chapter_fmt ~= "no" then + local ch = get_chapter(possec) + if ch and ch.title and ch.title ~= "" then + state.forced_title = string.format(user_opts.chapter_fmt, ch.title) + end + end + end + else + -- clear the property when the mouse leaves sets to none + if state.last_hover_possec ~= nil then + mp.set_property("user-data/osc/hover_mouse_time", "none") + state.last_hover_possec = nil end end @@ -3037,6 +3044,7 @@ set_time_styles(true, true) set_tick_delay("display_fps", mp.get_property_number("display_fps")) visibility_mode(user_opts.visibility, true) update_duration_watch() +mp.set_property("user-data/osc/hover_mouse_time", "none") set_virt_mouse_area(0, 0, 0, 0, "input") set_virt_mouse_area(0, 0, 0, 0, "window-controls") From 3bf83c56a7ec91f5c5e66b62544de824c687119c Mon Sep 17 00:00:00 2001 From: xdev23 Date: Sat, 7 Mar 2026 13:55:28 +0530 Subject: [PATCH 6/6] Refactor hover time handling for seekbar --- player/lua/osc.lua | 49 +++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/player/lua/osc.lua b/player/lua/osc.lua index 1ac7291bdf81e..6ae4c0b23dce6 100644 --- a/player/lua/osc.lua +++ b/player/lua/osc.lua @@ -839,33 +839,14 @@ local function render_elements(master_ass) -- render iterations because the title may be rendered before the slider. state.forced_title = nil local se, ae = state.slider_element, elements[state.active_element] - - -- show time when mouse is hoverd on seekbar helpful for - -- creating thumbnail script, it's a property and can used by other scripts. - if se and (ae == se or (not ae and mouse_hit(se))) then + if user_opts.chapter_fmt ~= "no" and se and (ae == se or (not ae and mouse_hit(se))) then local dur = mp.get_property_number("duration", 0) if dur > 0 then - local possec = get_slider_value(se) * dur / 100 - - -- update hover time only if changed by >0.1s to prevent render lag - if not state.last_hover_possec or math.abs(state.last_hover_possec - possec) > 0.1 then - mp.set_property_number("user-data/osc/hover_mouse_time", possec) - state.last_hover_possec = possec + local possec = get_slider_value(se) * dur / 100 -- of mouse pos + local ch = get_chapter(possec) + if ch and ch.title and ch.title ~= "" then + state.forced_title = string.format(user_opts.chapter_fmt, ch.title) end - - -- original chapter title logic is now implemented/combined here - if user_opts.chapter_fmt ~= "no" then - local ch = get_chapter(possec) - if ch and ch.title and ch.title ~= "" then - state.forced_title = string.format(user_opts.chapter_fmt, ch.title) - end - end - end - else - -- clear the property when the mouse leaves sets to none - if state.last_hover_possec ~= nil then - mp.set_property("user-data/osc/hover_mouse_time", "none") - state.last_hover_possec = nil end end @@ -1048,6 +1029,18 @@ local function render_elements(master_ass) local sliderpos = get_slider_value(element) local tooltiplabel = element.slider.tooltipF(sliderpos) + if element == state.slider_element then + local dur = mp.get_property_number("duration", 0) + if dur > 0 then + local possec = sliderpos * dur / 100 + -- Only update if it changed by more than 0.1s to prevent lag + if not state.last_hover_possec or math.abs(state.last_hover_possec - possec) > 0.1 then + mp.set_property_native("user-data/osc/hovered-time", possec) + state.last_hover_possec = possec + end + end + end + local an = slider_lo.tooltip_an local ty @@ -1083,6 +1076,12 @@ local function render_elements(master_ass) ass_append_alpha(elem_ass, slider_lo.alpha, 0) elem_ass:append(tooltiplabel) + else + -- clear hover time when mouse leaves the slider + if element == state.slider_element and state.last_hover_possec ~= nil then + mp.set_property_native("user-data/osc/hovered-time", nil) + state.last_hover_possec = nil + end end end @@ -3044,7 +3043,7 @@ set_time_styles(true, true) set_tick_delay("display_fps", mp.get_property_number("display_fps")) visibility_mode(user_opts.visibility, true) update_duration_watch() -mp.set_property("user-data/osc/hover_mouse_time", "none") +mp.set_property_native("user-data/osc/hovered-time", nil) set_virt_mouse_area(0, 0, 0, 0, "input") set_virt_mouse_area(0, 0, 0, 0, "window-controls")