summaryrefslogtreecommitdiff
path: root/mpv/scripts/cycle-profiles.lua
diff options
context:
space:
mode:
Diffstat (limited to 'mpv/scripts/cycle-profiles.lua')
-rw-r--r--mpv/scripts/cycle-profiles.lua103
1 files changed, 103 insertions, 0 deletions
diff --git a/mpv/scripts/cycle-profiles.lua b/mpv/scripts/cycle-profiles.lua
new file mode 100644
index 0000000..da846c5
--- /dev/null
+++ b/mpv/scripts/cycle-profiles.lua
@@ -0,0 +1,103 @@
+--[[
+ 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)