diff options
| author | Raymaekers Luca <raymaekers.luca@gmail.com> | 2024-03-01 11:23:15 +0100 | 
|---|---|---|
| committer | Raymaekers Luca <raymaekers.luca@gmail.com> | 2024-03-01 11:23:15 +0100 | 
| commit | c5a7668cb2e704092ec45854d79f9c5833128c22 (patch) | |
| tree | 8e4347d00f60e197f231de3bd6fdca70d450b917 /config/common/mpv | |
| parent | 8ab76a9ebf8414c720f13bd0aaaa2e6452ff753b (diff) | |
[mpv] added cycle-commands script
Diffstat (limited to 'config/common/mpv')
| -rw-r--r-- | config/common/mpv/scripts/cycle-commands.lua | 80 | 
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)  | 
