flake/flakes/home-manager/guanranwang/common/dotfiles/config/mpv/scripts/cycle-profile.lua
2023-09-19 08:17:43 +08:00

105 lines
3.4 KiB
Lua

--[[
script to cycle profiles with a keybind, accomplished through script messages
available at: https://github.com/CogentRedTester/mpv-scripts
syntax:
script-message cycle-profiles "profile1;profile2;profile3"
You must use semicolons to separate the profiles, do not include any spaces that are not part of the profile name.
The script will print the profile description to the screen when switching, if there is no profile description, then it just prints the name
]]--
--change this to change what character separates the profile names
seperator = ";"
msg = require 'mp.msg'
--splits the profiles string into an array of profile names
--function taken from: https://stackoverflow.com/questions/1426954/split-string-in-lua/7615129#7615129
function mysplit (inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={}
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
table.insert(t, str)
end
return t
end
--table of all available profiles and options
profileList = mp.get_property_native('profile-list')
--keeps track of current profile for every unique cycle
iterator = {}
--stores descriptions for profiles
--once requested a description is stored here so it does not need to be found again
profilesDescs = {}
--if trying to cycle to an unknown profile this function is run to find a description to print
function findDesc(profile)
msg.verbose('unknown profile ' .. profile .. ', searching for description')
for i = 1, #profileList, 1 do
if profileList[i]['name'] == profile then
msg.verbose('profile found')
local desc = profileList[i]['profile-desc']
if desc ~= nil then
msg.verbose('description found')
profilesDescs[profile] = desc
else
msg.verbose('no description, will use name')
profilesDescs[profile] = profile
end
return
end
end
msg.verbose('profile not found')
profilesDescs[profile] = "no profile '" .. profile .. "'"
end
--prints the profile description to the OSD
--if the profile has not been requested before during the session then it runs findDesc()
function printProfileDesc(profile)
local desc = profilesDescs[profile]
if desc == nil then
findDesc(profile)
desc = profilesDescs[profile]
end
msg.verbose('profile description: ' .. desc)
mp.osd_message(desc)
end
function main(profileStr)
--if there is not already an iterator for this cycle then it creates one
if iterator[profileStr] == nil then
msg.verbose('unknown cycle, creating new iterator')
iterator[profileStr] = 1
end
local i = iterator[profileStr]
--converts the string into an array of profile names
local profiles = mysplit(profileStr, seperator)
msg.verbose('cycling ' .. tostring(profiles))
msg.verbose("number of profiles: " .. tostring(#profiles))
--sends the command to apply the profile
msg.info("applying profile " .. profiles[i])
mp.commandv('apply-profile', profiles[i])
--prints the profile description to the OSD
printProfileDesc(profiles[i])
--moves the iterator
iterator[profileStr] = iterator[profileStr] + 1
if iterator[profileStr] > #profiles then
msg.verbose('reached end of profiles, wrapping back to start')
iterator[profileStr] = 1
end
end
mp.register_script_message('cycle-profiles', main)