Files
2026-03-27 07:06:16 +01:00

218 lines
4.6 KiB
Lua

-- Copyright (c) 2021, Eisa AlAwadhi
-- License: BSD 2-Clause License
-- Creator: Eisa AlAwadhi
-- Project: UndoRedo
-- Version: 2.2
local utils = require 'mp.utils'
local msg = require 'mp.msg'
local seconds = 0
local countTimer = -1
local seekTime = 0
local seekNumber = 0
local currentIndex = 0
local seekTable = {}
local seeking = 0
local undoRedo = 0
local pause = false
seekTable[0] = 0
----------------------------USER CUSTOMIZATION SETTINGS-----------------------------------
--These settings are for users to manually change some options in the script.
--Keybinds can be defined in the bottom of the script.
local osd_messages = true --true is for displaying osd messages when actions occur, Change to false will disable all osd messages generated from this script
---------------------------END OF USER CUSTOMIZATION SETTINGS---------------------
local function prepareUndoRedo()
if (pause == true) then
seconds = seconds
else
seconds = seconds - 0.5
end
seekTable[currentIndex] = seekTable[currentIndex] + seconds
seconds = 0
end
local function getUndoRedo()
if (seeking == 0) then
prepareUndoRedo()
seekNumber = currentIndex + 1
currentIndex = seekNumber
seekTime = math.floor(mp.get_property_number('time-pos'))
table.insert(seekTable, seekNumber, seekTime)
undoRedo = 0
elseif (seeking == 1) then
seeking = 0
end
end
mp.register_event('file-loaded', function()
filePath = mp.get_property('path')
timer = mp.add_periodic_timer(0.1, function()
seconds = seconds + 0.1
end)
if (pause == true) then
timer:stop()
else
timer:resume()
end
timer2 = mp.add_periodic_timer(0.1, function()
countTimer = countTimer + 0.1
if (countTimer == 0.6) then
timer:resume()
getUndoRedo()
end
end)
timer2:stop()
end)
mp.register_event('seek', function()
countTimer = 0
timer2:resume()
timer:stop()
end)
mp.observe_property('pause', 'bool', function(name, value)
if value then
if timer ~= nil then
timer:stop()
end
pause = true
else
if timer ~= nil then
timer:resume()
end
pause = false
end
end)
mp.register_event('end-file', function()
if timer ~= nil then
timer:kill()
end
if timer2 ~= nil then
timer2:kill()
end
seekNumber = 0
currentIndex = 0
undoRedo = 0
seconds = 0
countTimer = -1
seekTable[0] = 0
end)
local function undo()
if (filePath ~= nil) and (countTimer >= 0) and (countTimer < 0.6) and (seeking == 0) then
timer2:stop()
getUndoRedo()
currentIndex = currentIndex - 1
if (currentIndex < 0) then
if (osd_messages == true) then
mp.osd_message('No Undo Found')
end
currentIndex = 0
msg.info('No undo found')
else
if (seekTable[currentIndex] < 0) then
seekTable[currentIndex] = 0
end
seeking = 1
mp.commandv('seek', seekTable[currentIndex], 'absolute', 'exact')
undoRedo = 1
if (osd_messages == true) then
mp.osd_message('Undo')
end
msg.info('Seeked using undo')
end
elseif (filePath ~= nil) and (currentIndex > 0) then
prepareUndoRedo()
currentIndex = currentIndex - 1
if (seekTable[currentIndex] < 0) then
seekTable[currentIndex] = 0
end
seeking = 1
mp.commandv('seek', seekTable[currentIndex], 'absolute', 'exact')
undoRedo = 1
if (osd_messages == true) then
mp.osd_message('Undo')
end
msg.info('Seeked using undo')
elseif (filePath ~= nil) and (currentIndex == 0) then
if (osd_messages == true) then
mp.osd_message('No Undo Found')
end
msg.info('No undo found')
end
end
local function redo()
if (filePath ~= nil) and (currentIndex < seekNumber) then
prepareUndoRedo()
currentIndex = currentIndex + 1
if (seekTable[currentIndex] < 0) then
seekTable[currentIndex] = 0
end
seeking = 1
mp.commandv('seek', seekTable[currentIndex], 'absolute', 'exact')
undoRedo = 0
if (osd_messages == true) then
mp.osd_message('Redo')
end
msg.info('Seeked using redo')
elseif (filePath ~= nil) and (currentIndex == seekNumber) then
if (osd_messages == true) then
mp.osd_message('No Redo Found')
end
msg.info('No redo found')
end
end
local function undoLoop()
if (filePath ~= nil) and (undoRedo == 0) then
undo()
elseif (filePath ~= nil) and (undoRedo == 1) then
redo()
elseif (filePath ~= nil) and (countTimer == -1) then
if (osd_messages == true) then
mp.osd_message('No Undo Found')
end
msg.info('No undo found')
end
end
mp.add_key_binding("ctrl+z", "undo", undo)
mp.add_key_binding("ctrl+Z", "undoCaps", undo)
mp.add_key_binding("ctrl+y", "redo", redo)
mp.add_key_binding("ctrl+Y", "redoCaps", redo)
mp.add_key_binding("ctrl+alt+z", "undoLoop", undoLoop)
mp.add_key_binding("ctrl+alt+Z", "undoLoopCaps", undoLoop)