summaryrefslogtreecommitdiffstats
path: root/.config/mpv/scripts/show_chapters.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/mpv/scripts/show_chapters.lua')
-rw-r--r--.config/mpv/scripts/show_chapters.lua145
1 files changed, 145 insertions, 0 deletions
diff --git a/.config/mpv/scripts/show_chapters.lua b/.config/mpv/scripts/show_chapters.lua
new file mode 100644
index 0000000..643a51f
--- /dev/null
+++ b/.config/mpv/scripts/show_chapters.lua
@@ -0,0 +1,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})
+