From c5a7668cb2e704092ec45854d79f9c5833128c22 Mon Sep 17 00:00:00 2001 From: Raymaekers Luca Date: Fri, 1 Mar 2024 11:23:15 +0100 Subject: [mpv] added cycle-commands script --- config/common/mpv/scripts/cycle-commands.lua | 80 ++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 config/common/mpv/scripts/cycle-commands.lua (limited to 'config/common/mpv/scripts') diff --git a/config/common/mpv/scripts/cycle-commands.lua b/config/common/mpv/scripts/cycle-commands.lua new file mode 100644 index 0000000..2c50f72 --- /dev/null +++ b/config/common/mpv/scripts/cycle-commands.lua @@ -0,0 +1,80 @@ +--[[ + script to cycle commands with a keybind, accomplished through script messages + available at: https://github.com/CogentRedTester/mpv-scripts + + syntax: + script-message cycle-commands "command1 args" "command2 args" "command3 args" + + The syntax of each command is identical to the standard input.conf syntax, but each command must be + a quoted string. Note that this may require you to nest (and potentially escape) quotes for the arguments. + Read the mpv documentation for how to do this: https://mpv.io/manual/master/#flat-command-syntax. + + Semicolons also work exactly like they do normally, so you can easily send multiple commands each cycle. + + Here are some examples of the same command using different quotes: + script-message cycle-commands "show-text one 1000 ; print-text two" "show-text \"three four\"" + script-message cycle-commands 'show-text one 1000 ; print-text two' 'show-text "three four"' + script-message cycle-commands ``show-text one 1000 ; print-text two`` ``show-text "three four"`` + + This would, on keypress one, print 'one' to the OSD for 1 second and 'two' to the console, + and on keypress two 'three four' would be printed to the OSD. + Note that single (') and backtick (`) quoting was only added in mpv v0.34. + + There are no limits to the number of commands, and the script message can be used as often as one wants. + The script stores the current iteration position for each unique set of command strings, + so there should be no overlap unless one binds the exact same set of strings (including spacing). + + If the first command is `!reverse`, then the commands are cycled in the opposite direction. + If every subsequent command string is identical to a non-reversed cycle, then they share + their iteration position, making it possible to 'seek' forwards or backwards in the cycle: + script-message cycle-commands 'apply-profile profile1' 'apply-profile profile2' 'apply-profile profile3' + script-message cycle-commands !reverse 'apply-profile profile1' 'apply-profile profile2' 'apply-profile profile3' + + Most commands should print messages to the OSD automatically, this can be controlled + by adding input prefixes to the commands: https://mpv.io/manual/master/#input-command-prefixes. + Some commands will not print an osd message even when told to, in this case you have two options: + you can add a show-text command to the cycle, or you can use the cycle-commands/osd script message + which will print the command string to the osd. For example: + script-message cycle-commands 'apply-profile profile1;show-text "applying profile1"' 'apply-profile profile2;show-text "applying profile2"' + script-message cycle-commands/osd 'apply-profile profile1' 'apply-profile profile2' + + Any osd messages printed by the command will override the message sent by cycle-commands/osd. +]]-- + +local mp = require 'mp' +local msg = require 'mp.msg' + +--keeps track of the current position for a specific cycle +local iterators = {} + +--main function to identify and run the cycles +local function main(osd, ...) + local commands = {...} + + local reverse = commands[1] == '!reverse' + if reverse then table.remove(commands, 1) end + + --to identify the specific cycle we'll concatenate all the strings together to use as our table key + local str = ("%d> %s"):format(#commands, table.concat(commands, '|')) + msg.trace('recieved:', str) + + -- we'll initialise the iterator at 0 (an invalid position) to support forward or backwards iteration + if iterators[str] == nil then + msg.debug('unknown cycle, creating iterator') + iterators[str] = 0 + end + + iterators[str] = iterators[str] + (reverse and -1 or 1) + if iterators[str] > #commands then iterators[str] = 1 end + if iterators[str] < 1 then iterators[str] = #commands end + + --mp.command should run the commands exactly as if they were entered in input.conf. + --This should provide universal support for all input.conf command syntax + local cmd = commands[ iterators[str] ] + msg.verbose('sending command:', cmd) + if osd then mp.osd_message(cmd) end + mp.command(cmd) +end + +mp.register_script_message('cycle-commands', function(...) main(false, ...) end) +mp.register_script_message('cycle-commands/osd', function(...) main(true, ...) end) -- cgit v1.2.3