| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
 | -- show chapters and their time at the bottom left corner
-- the timings get proportionally adjusted at different speeds
----------------------------------------
CHAPTERS_TO_SHOW = 10
HOTKEY = 'c'
FONT_SCALE = 80         -- in % from osd-font-size
FONT_SCALE_inactive_chapters = 75
FONT_ALPHA_inactive_chapters = 60
AUTOSTART_IN_PATHS = {
    "^edl://",
    "/med/p/podcasts",
    "/abooks/"
}
----------------------------------------
local assdraw = require('mp.assdraw')
function disp_time(time)
    local hours = math.floor(time/3600)
    local minutes = math.floor((time % 3600)/60)
    local seconds = math.floor(time % 60)
    
    return string.format("%02d:%02d:%02d", hours, minutes, seconds)
end
function time_2_seconds(time)
    h,m,s = time:match('(.*):(.*):(.*)$')
    
    return h*3600 + m*60 + s
end
function show_chapters()
    if observation_active == false then
        observation_active = true
        mp.observe_property("chapter", "number", show_chapters)
        mp.observe_property("speed", "number", show_chapters)
    end
    local osd_w, osd_h, aspect = mp.get_osd_size()
    local ass = assdraw:ass_new()
    ass:new_event()
    ass:an(1)
    -- font scale
    ass:append('{\\fscx' .. tostring(FONT_SCALE) .. '}')
    ass:append('{\\fscy' .. tostring(FONT_SCALE) .. '}')
    local ch_index = mp.get_property_number("chapter")
    local ch_total = mp.get_property_osd("chapter-list/count")
    if ch_index and ch_index >= 0 then
        ass:append("(" .. tostring(ch_index + 1) .. "/" .. tostring(ch_total) .. ")")
        shift = 1
        if ch_index == 0 then
            start_from = 0
        else
            shift = ch_total - CHAPTERS_TO_SHOW - ch_index - 1
            start_from = -1
        end
        if shift < 0 then
            start_from = shift
        end
        for i_ch = start_from, CHAPTERS_TO_SHOW + start_from do
            if tonumber(ch_total) == ch_index + i_ch then
                break
            end
            
            -- from overshooting backwards
            if ch_index + i_ch < 0 then
                goto continue
            end
            title = mp.get_property_osd("chapter-list/" .. tostring(ch_index + i_ch) .. "/title")
            time = mp.get_property_osd("chapter-list/" .. tostring(ch_index + i_ch) .. "/time")
            ass:append("\\N")
            if i_ch == 0 then
                ass:append("{\\alpha&H" .. '00' .. "}")
                ass:append('{\\fscx' .. tostring(FONT_SCALE) .. '}')
                ass:append('{\\fscy' .. tostring(FONT_SCALE) .. '}')
            else
                ass:append("{\\alpha&H" .. tostring(FONT_ALPHA_inactive_chapters) .. "}")
                ass:append('{\\fscx' .. tostring(FONT_SCALE_inactive_chapters) .. '}')
                ass:append('{\\fscy' .. tostring(FONT_SCALE_inactive_chapters) .. '}')
            end
            -- removing paths
            if string.sub(title, 1, 1) == '/' then
                title = title:match('.+/(.*)$')
            end
            speed = mp.get_property_number("speed")
            if speed ~= 1.0 then
                time = disp_time(time_2_seconds(time) / speed)
            end
            ass:append('[' .. time .. "]  " .. title)
            
            ::continue::
        end
    end
    mp.set_osd_ass(osd_w, osd_h, ass.text)
end
function started()
    local pth = mp.get_property("path")
    
    if pth == nil then
        return
    end
    for i, i_path in pairs(AUTOSTART_IN_PATHS) do
		if pth:find(i_path) then
            running = true
            show_chapters()
			return
		end
    end
end
function show_hide()
	if running == true then
        running = false
        observation_active = false
        mp.set_osd_ass(0, 0, "{}")
        mp.unobserve_property(show_chapters)
	else
		running = true
        show_chapters()
	end
end
observation_active = false
mp.register_event("file-loaded", started)
mp.add_forced_key_binding(HOTKEY, 'show_hide', show_hide, {repeatable=true})
 |