105 lines
3.4 KiB
Lua
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)
|