Skip to content

Instantly share code, notes, and snippets.

@CyberShadow
Forked from Hakkin/autosave.lua
Last active October 29, 2024 06:29
Show Gist options
  • Save CyberShadow/2f71a97fb85ed42146f6d9f522bc34ef to your computer and use it in GitHub Desktop.
Save CyberShadow/2f71a97fb85ed42146f6d9f522bc34ef to your computer and use it in GitHub Desktop.
-- autosave.lua
--
-- Periodically saves "watch later" data during playback, rather than only saving on quit.
-- This lets you easily recover your position in the case of an ungraceful shutdown of mpv (crash, power failure, etc.).
--
-- You can configure the save period by creating a "lua-settings" directory inside your mpv configuration directory.
-- Inside the "lua-settings" directory, create a file named "autosave.conf".
-- The save period can be set like so:
--
-- save_period=60
--
-- This will set the save period to once every 60 seconds of playback, time while paused is not counted towards the save period timer.
-- The default save period is 30 seconds.
local options = require 'mp.options'
local o = {
save_period = 30
}
options.read_options(o)
local mp = require 'mp'
local function save()
mp.commandv("set", "msg-level", "cplayer=warn")
mp.command("write-watch-later-config")
mp.commandv("set", "msg-level", "cplayer=status")
end
local save_period_timer = mp.add_periodic_timer(o.save_period, save)
local function pause(name, paused)
save()
if paused then
save_period_timer:stop()
else
save_period_timer:resume()
end
end
mp.observe_property("pause", "bool", pause)
mp.register_event("file-loaded", save)
local function end_file(data)
if data.reason == 'eof' or data.reason == 'stop' then
local playlist = mp.get_property_native('playlist')
for i, entry in pairs(playlist) do
if entry.id == data.playlist_entry_id then
mp.commandv("delete-watch-later-config", entry.filename)
return
end
end
end
end
mp.register_event("end-file", end_file)
@dguan4
Copy link

dguan4 commented May 20, 2022

Wanted to ask - how would you implement a matcher to prevent saving for certain file path/names? For instance there's a folder of videos where I always want to start at the beginning regardless of where I end. Thanks for this though - super useful!

@CyberShadow
Copy link
Author

Probably by checking mp.get_property("filename") in the save function?

@dguan4
Copy link

dguan4 commented May 22, 2022

Yep I ended up creating another variable in the o object to store a list of Folder names and calling mp.get_property("working-directory") instead and looping through it for excluded filepath/folder names. One thing I couldn't get working is having an override variable in autosave.conf for the excluded names since it's in format {'Test', 'Test2', ...} but it seems to parse the entire thing as a string instead, though I suppose that's more of a lua question. Thanks!

@CyberShadow
Copy link
Author

Yeah, I think it reads the file with the same parser as for mpv.conf, which doesn't seem to support things like lists.

@KonoVitoDa
Copy link

KonoVitoDa commented Dec 14, 2022

Your fork doesn't work for me, and it even makes the default write-watch-later-config command to not work. I tried the original one and TheDrHax's forks and they worked.

Windows 10 21H2 19044.2251
mpv 0.35.0-30-g4574dd5dc6

@CyberShadow
Copy link
Author

I'm not sure why it doesn't work for you. Note that the critical difference of this fork vs. other versions is supporting playlists - we need to delete the watch_later bookmark when leaving one file and before going to the next one, otherwise resuming playback of the playlist will not work.

Copy link

ghost commented Jan 15, 2023

@CyberShadow does it also save when the video paused? if it does it would be perfect!

@CyberShadow
Copy link
Author

Yes, you can see it calls save() in the pause function.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment