summaryrefslogtreecommitdiff
path: root/config/common
diff options
context:
space:
mode:
Diffstat (limited to 'config/common')
-rw-r--r--config/common/mpv/scripts/cycle-commands.lua80
1 files changed, 80 insertions, 0 deletions
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)