Skip to content

Instantly share code, notes, and snippets.

@CyberShadow
Forked from Hakkin/autosave.lua
Last active June 24, 2025 03:57
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.

@josch
Copy link

josch commented Jun 23, 2025

@Hakkin @CyberShadow what are the conditions for modifying and sharing your work, i.e. what license are you putting your work under and who would I write down as the copy right holder?

@Hakkin
Copy link

Hakkin commented Jun 23, 2025

@josch I wrote the original script this was forked from. My code can be licensed under Zero-Clause BSD.

@CyberShadow
Copy link
Author

My code can be licensed under Zero-Clause BSD.

Same.

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