diff options
| author | ilotterytea <ilotterytea@proton.me> | 2024-05-26 20:10:26 +0500 |
|---|---|---|
| committer | ilotterytea <ilotterytea@proton.me> | 2024-05-26 20:10:26 +0500 |
| commit | 036c889c4a4f7f59d1e1a592586b54c5c5e93005 (patch) | |
| tree | aa76d678790abc79f24edf83c17a564eb2c6f65d /mpv/scripts/cycle-profiles.lua | |
Diffstat (limited to 'mpv/scripts/cycle-profiles.lua')
| -rw-r--r-- | mpv/scripts/cycle-profiles.lua | 103 |
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) |
