-- 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)