Commit: fc7e71af42e5feccd6b0b0d4b5fa587aab0e77cd
Parent: 969881237c88b1d6a5acd3bbcdd38739e1167995
Author: Ren Tatsumoto
Date:   Mon, 21 Dec 2020 22:41:37 +0300
new action: sub replay
Diffstat:
2 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
@@ -275,6 +275,7 @@ Default bindings:
 Ctrl+c       script-binding mpvacious-copy-sub-to-clipboard
 Ctrl+e       script-binding mpvacious-export-note
 Ctrl+h       script-binding mpvacious-sub-rewind
+Ctrl+Shift+h script-binding mpvacious-sub-replay
 a            script-binding mpvacious-menu-open
 H            script-binding mpvacious-sub-seek-back
 L            script-binding mpvacious-sub-seek-forward
@@ -299,6 +300,7 @@ These bindings work everywhere, even if the menu (covered later) is closed.
 * `Shift+h` and `Shift+l` - Seek to the previous or the next subtitle.
 * `Alt+h` and `Alt+l` - Seek to the previous or the next subtitle, and pause.
 * `Ctrl+h` - Seek to the start of the currently visible subtitle. Use it if you missed something.
+* `Ctrl+Shift+h` - Replay current subtitle line, and pause.
 * `Ctrl+e` - Export a card with the currently visible subtitle line on the front.
 Use this when your subs are perfectly timed and the target sentence doesn't span multiple subs.
 * `Ctrl+c` - Copy current subtitle string to the system clipboard. For automatic copying see
diff --git a/subs2srs.lua b/subs2srs.lua
@@ -544,23 +544,58 @@ local function update_last_note(overwrite)
 end
 
 ------------------------------------------------------------
--- seeking: sub seek, sub rewind
+-- seeking: sub replay, sub seek, sub rewind
 
 local function _(params)
     local unpack = unpack and unpack or table.unpack
     return function() return pcall(unpack(params)) end
 end
 
+local pause_timer = (function()
+    local stop_time = -1
+    local check_stop
+    local set_stop_time = function(time)
+        stop_time = time
+    end
+    local stop = function()
+        mp.unobserve_property(check_stop)
+        stop_time = -1
+    end
+    check_stop = function(_, time)
+        if time > stop_time then
+            stop()
+            mp.set_property("pause", "yes")
+        else
+            notify('Timer: ' .. human_readable_time(stop_time - time))
+        end
+    end
+    return {
+        set_stop_time = set_stop_time,
+        check_stop = check_stop,
+        stop = stop,
+    }
+end)()
+
+local function sub_replay()
+    local sub = subs.get_current()
+    pause_timer.set_stop_time(sub['end'] - 0.050)
+    mp.commandv('seek', sub['start'], 'absolute')
+    mp.set_property("pause", "no")
+    mp.observe_property("time-pos", "number", pause_timer.check_stop)
+end
+
 local function sub_seek(direction, pause)
     mp.commandv("sub_seek", direction == 'backward' and '-1' or '1')
     mp.commandv("seek", "0.015", "relative+exact")
     if pause then
         mp.set_property("pause", "yes")
     end
+    pause_timer.stop()
 end
 
 local function sub_rewind()
     mp.commandv('seek', subs.get_current()['start'] + 0.015, 'absolute')
+    pause_timer.stop()
 end
 
 ------------------------------------------------------------
@@ -1255,6 +1290,7 @@ menu.update = function()
         osd:submenu('Global bindings'):newline()
         osd:tab():item('ctrl+c: '):text('Copy current subtitle to clipboard'):newline()
         osd:tab():item('ctrl+h: '):text('Seek to the start of the line'):newline()
+        osd:tab():item('ctrl+shift+h: '):text('Replay current subtitle'):newline()
         osd:tab():item('shift+h/l: '):text('Seek to the previous/next subtitle'):newline()
         osd:tab():item('alt+h/l: '):text('Seek to the previous/next subtitle and pause'):newline()
         osd:italics("Press "):item('i'):italics(" to hide bindings."):newline()
@@ -1398,9 +1434,12 @@ do
         -- Vim-like seeking between subtitle lines
         mp.add_key_binding("H", "mpvacious-sub-seek-back", _ { sub_seek, 'backward' })
         mp.add_key_binding("L", "mpvacious-sub-seek-forward", _ { sub_seek, 'forward' })
+
         mp.add_key_binding("Alt+h", "mpvacious-sub-seek-back-pause", _ { sub_seek, 'backward', true })
         mp.add_key_binding("Alt+l", "mpvacious-sub-seek-forward-pause", _ { sub_seek, 'forward', true })
+
         mp.add_key_binding("ctrl+h", "mpvacious-sub-rewind", _ { sub_rewind })
+        mp.add_key_binding("ctrl+H", "mpvacious-sub-replay", _ { sub_replay })
 
         -- Unset by default
         mp.add_key_binding(nil, "mpvacious-set-starting-line", subs.set_starting_line)