116 lines
3.1 KiB
Lua
116 lines
3.1 KiB
Lua
-- Script home: https://github.com/d87/mpv-persist-properties
|
|
local utils = require "mp.utils"
|
|
local msg = require "mp.msg"
|
|
|
|
local opts = {
|
|
properties = "volume,sub-scale",
|
|
properties_path = 'persistent_config.json'
|
|
}
|
|
(require 'mp.options').read_options(opts, "persist_properties")
|
|
|
|
local CONFIG_ROOT = mp.find_config_file(".")
|
|
if not utils.file_info(CONFIG_ROOT) then
|
|
-- On Windows if using portable_config dir, APPDATA mpv folder isn't auto-created
|
|
-- In more recent mpv versions there's a mp.get_script_directory function, but i'm not using it for compatiblity
|
|
local mpv_conf_path = mp.find_config_file("scripts") -- finds where the scripts folder is located
|
|
local mpv_conf_dir = utils.split_path(mpv_conf_path)
|
|
CONFIG_ROOT = mpv_conf_dir
|
|
end
|
|
local PCONFIG = utils.join_path(CONFIG_ROOT, opts.properties_path);
|
|
|
|
local function split(input)
|
|
local ret = {}
|
|
for str in string.gmatch(input, "([^,]+)") do
|
|
table.insert(ret, str)
|
|
end
|
|
return ret
|
|
end
|
|
local persisted_properties = split(opts.properties)
|
|
|
|
local print = function(...)
|
|
-- return msg.log("info", ...)
|
|
end
|
|
|
|
-- print("Config Root is "..CONFIG_ROOT)
|
|
|
|
local isInitialized = false
|
|
|
|
local properties
|
|
|
|
local function load_config(file)
|
|
local f = io.open(file, "r")
|
|
if f then
|
|
local jsonString = f:read()
|
|
f:close()
|
|
|
|
if jsonString == nil then
|
|
return {}
|
|
end
|
|
|
|
local props = utils.parse_json(jsonString)
|
|
if props then
|
|
return props
|
|
end
|
|
end
|
|
return {}
|
|
end
|
|
|
|
local function save_config(file, properties)
|
|
local serialized_props = utils.format_json(properties)
|
|
|
|
local f = io.open(file, 'w+')
|
|
if f then
|
|
f:write(serialized_props)
|
|
f:close()
|
|
else
|
|
msg.log("error", string.format("Couldn't open file: %s", file))
|
|
end
|
|
end
|
|
|
|
local save_timer = nil
|
|
local got_unsaved_changed = false
|
|
|
|
local function onInitialLoad()
|
|
properties = load_config(PCONFIG)
|
|
|
|
for i, property in ipairs(persisted_properties) do
|
|
local name = property
|
|
local value = properties[name]
|
|
if value ~= nil then
|
|
mp.set_property_native(name, value)
|
|
end
|
|
end
|
|
|
|
for i, property in ipairs(persisted_properties) do
|
|
local property_type = nil
|
|
mp.observe_property(property, property_type, function(name)
|
|
if isInitialized then
|
|
local value = mp.get_property_native(name)
|
|
-- print(string.format("%s changed to %s at %s", name, value, os.time()))
|
|
|
|
properties[name] = value
|
|
|
|
if save_timer then
|
|
save_timer:kill()
|
|
save_timer:resume()
|
|
got_unsaved_changed = true
|
|
else
|
|
save_timer = mp.add_timeout(5, function()
|
|
save_config(PCONFIG, properties)
|
|
got_unsaved_changed = false
|
|
end)
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
isInitialized = true
|
|
end
|
|
|
|
onInitialLoad()
|
|
mp.register_event("shutdown", function()
|
|
if got_unsaved_changed then
|
|
save_config(PCONFIG, properties)
|
|
end
|
|
end)
|