@@ -314,6 +314,7 @@ local state = {
314314 no_video = false ,
315315 playlist_count = 0 ,
316316 playlist_pos_1 = 0 ,
317+ duration = nil ,
317318 pause = false ,
318319 volume = 0 ,
319320 mute = false ,
@@ -948,9 +949,8 @@ local function render_elements(master_ass)
948949 state .forced_title = nil
949950 local se , ae = state .slider_element , elements [state .active_element ]
950951 if user_opts .chapter_fmt ~= " no" and se and (ae == se or (not ae and mouse_hit (se ))) then
951- local dur = mp .get_property_number (" duration" , 0 )
952- if dur > 0 then
953- local possec = get_slider_value (se ) * dur / 100 -- of mouse pos
952+ if state .duration then
953+ local possec = get_slider_value (se ) * state .duration / 100 -- of mouse pos
954954 local ch = get_chapter (possec )
955955 if ch and ch .title and ch .title ~= " " then
956956 state .forced_title = string.format (user_opts .chapter_fmt , ch .title )
@@ -1192,7 +1192,7 @@ local function render_elements(master_ass)
11921192 ass_append_alpha (elem_ass , slider_lo .alpha , 0 )
11931193 elem_ass :append (tooltiplabel )
11941194
1195- local hover_sec = mp . get_property_number ( " duration" , 0 ) * (sliderpos / 100 )
1195+ local hover_sec = ( state . duration or 0 ) * (sliderpos / 100 )
11961196 mp .set_property_number (" user-data/osc/hover-sec" , hover_sec )
11971197
11981198 -- thumbnail
@@ -2486,11 +2486,10 @@ local function osc_init()
24862486 and user_opts .layout ~= " slimtopbar"
24872487 state .slider_element = ne .enabled and ne or nil -- used for forced_title
24882488 ne .slider .markerF = function ()
2489- local duration = mp .get_property_number (" duration" )
2490- if duration ~= nil then
2489+ if state .duration then
24912490 local markers = {}
24922491 for n = 1 , # state .chapter_list do
2493- markers [n ] = (state .chapter_list [n ].time / duration * 100 )
2492+ markers [n ] = (state .chapter_list [n ].time / state . duration * 100 )
24942493 end
24952494 return markers
24962495 else
@@ -2500,9 +2499,8 @@ local function osc_init()
25002499 ne .slider .posF =
25012500 function () return mp .get_property_number (" percent-pos" ) end
25022501 ne .slider .tooltipF = function (pos )
2503- local duration = mp .get_property_number (" duration" )
2504- if duration ~= nil and pos ~= nil then
2505- local possec = duration * (pos / 100 )
2502+ if state .duration and pos then
2503+ local possec = state .duration * (pos / 100 )
25062504 return mp .format_time (possec )
25072505 else
25082506 return " "
@@ -2512,15 +2510,14 @@ local function osc_init()
25122510 if user_opts .seekrangestyle == " none" or not cache_enabled () then
25132511 return nil
25142512 end
2515- local duration = mp .get_property_number (" duration" )
2516- if duration == nil or duration <= 0 then
2513+ if state .duration == nil then
25172514 return nil
25182515 end
25192516 local nranges = {}
25202517 for _ , range in pairs (state .demuxer_cache_state [" seekable-ranges" ]) do
25212518 nranges [# nranges + 1 ] = {
2522- [" start" ] = 100 * range [" start" ] / duration ,
2523- [" end" ] = 100 * range [" end" ] / duration ,
2519+ [" start" ] = 100 * range [" start" ] / state . duration ,
2520+ [" end" ] = 100 * range [" end" ] / state . duration ,
25242521 }
25252522 end
25262523 return nranges
@@ -2598,7 +2595,7 @@ local function osc_init()
25982595 -- tc_right (total/remaining time)
25992596 ne = new_element (" tc_right" , " button" )
26002597
2601- ne .visible = ( mp . get_property_number ( " duration" , 0 ) > 0 )
2598+ ne .visible = state . duration ~= nil
26022599 ne .content = function ()
26032600 if state .rightTC_trem then
26042601 local minus = user_opts .unicodeminus and UNICODE_MINUS or " -"
@@ -2609,13 +2606,9 @@ local function osc_init()
26092606 else
26102607 return (minus .. mp .get_property_osd (property ))
26112608 end
2612- else
2613- if state .tc_ms then
2614- return (mp .get_property_osd (" duration/full" ))
2615- else
2616- return (mp .get_property_osd (" duration" ))
2617- end
26182609 end
2610+
2611+ return mp .format_time (state .duration or 0 , state .tc_ms and " %H:%M:%S.%T" or " %H:%M:%S" )
26192612 end
26202613 ne .eventresponder [" mbtn_left_up" ] =
26212614 function () state .rightTC_trem = not state .rightTC_trem end
@@ -3150,28 +3143,6 @@ local function shutdown()
31503143 mp .del_property (" user-data/osc" )
31513144end
31523145
3153- -- duration is observed for the sole purpose of updating chapter markers
3154- -- positions. live streams with chapters are very rare, and the update is also
3155- -- expensive (with request_init), so it's only observed when we have chapters
3156- -- and the user didn't disable the livemarkers option (update_duration_watch).
3157- local function on_duration () request_init () end
3158-
3159- local duration_watched = false
3160- local function update_duration_watch ()
3161- local want_watch = user_opts .livemarkers and
3162- (mp .get_property_number (" chapters" , 0 ) or 0 ) > 0 and
3163- true or false -- ensure it's a boolean
3164-
3165- if want_watch ~= duration_watched then
3166- if want_watch then
3167- mp .observe_property (" duration" , " native" , on_duration )
3168- else
3169- mp .unobserve_property (on_duration )
3170- end
3171- duration_watched = want_watch
3172- end
3173- end
3174-
31753146local function set_tick_delay (_ , display_fps )
31763147 -- may be nil if unavailable or 0 fps is reported
31773148 if not display_fps or not user_opts .tick_delay_follow_display_fps then
@@ -3188,9 +3159,13 @@ observe_cached("playlist-count", request_init)
31883159observe_cached (" playlist-pos-1" , request_init )
31893160observe_cached (" chapter-list" , function ()
31903161 table.sort (state .chapter_list , function (a , b ) return a .time < b .time end )
3191- update_duration_watch ()
31923162 request_init ()
31933163end )
3164+ observe_cached (" duration" , function ()
3165+ if user_opts .livemarkers and state .chapter_list [1 ] then
3166+ request_init ()
3167+ end
3168+ end )
31943169
31953170-- These are for backwards compatibility only.
31963171mp .register_script_message (" osc-message" , function (message , dur )
@@ -3467,7 +3442,6 @@ opt.read_options(user_opts, "osc", function(changed)
34673442 end
34683443 request_tick ()
34693444 visibility_mode (user_opts .visibility , true )
3470- update_duration_watch ()
34713445 request_init ()
34723446end )
34733447
@@ -3477,7 +3451,6 @@ set_osc_styles()
34773451set_time_styles (true , true )
34783452set_tick_delay ()
34793453visibility_mode (user_opts .visibility , true )
3480- update_duration_watch ()
34813454
34823455set_virt_mouse_area (0 , 0 , 0 , 0 , " input" )
34833456set_virt_mouse_area (0 , 0 , 0 , 0 , " window-controls" )
0 commit comments