rice/mpv/scripts/tv.lua

84 lines
2.7 KiB
Lua
Raw Permalink Normal View History

2022-02-13 14:34:37 -08:00
-- Simple script for configurable TV out activation and/or deactivation on mpv playback
--
-- Intended to activate TV on mpv startup and deactivate TV on mpv close if TV is connected.
-- The script executes fully configurable shell sequences (e.g. xrandr on linux)
-- Can also be used for activating ambient lighting while watching etc ...
--
-- Note: There are implicit security issues due to a nature of direct execution
-- of command line tools without any sanitization ...
--
-- TV configurable options:
-- test ... check if TV is connected (result is non empty, exitcode 0)
-- on ... executed once on mpv player startup (TV ON)
-- off ... executed once on mpv player shutdown (TV OFF)
--
-- Note: xrandr seems to have problem turning off and on devices on single execution.
-- Therefore it is wise to split execution to multiple commands, for example:
-- problem : xrandr --output LVDS1 --off --output TV1 --auto
-- works ok: xrandr --output LVDS1 --off && xrandr --output TV1 --auto
--
-- To customize configuration place tv.conf into ~/.config/mpv/lua-settings/ and edit
--
-- Place script into ~/.config/mpv/scripts/ for autoload
--
-- GitHub: https://github.com/blue-sky-r/mpv/tree/master/scripts
local options = require("mp.options")
local utils = require("mp.utils")
-- defaults
local cfg = {
test = "xrandr | grep 'VGA1 connected'",
on = 'xrandr --output LVDS1 --off && xrandr --output VGA1 --mode 720x400 --output TV1 --auto',
off = 'xrandr --output LVDS1 --auto'
}
-- string v is empty
local function empty(v)
return not v or v == '' or string.find(v,"^%s*$")
end
-- evaluate shell condition by executing cmd
local function test(cmd)
-- return success if there is nothing to test
if empty(cmd) then return true end
-- get only exitcode
local exitcode = io.popen(cmd..' >/dev/null 2>&1; echo $?'):read('*n')
-- log
mp.msg.info("test '" .. cmd .. "' returned exitcode:"..exitcode)
-- success if exitcode is zero
return exitcode == 0
end
-- execute shell cmd
local function exec(cmd)
-- return if there is nothing to execute
if empty(cmd) then return end
-- get stdout and stderr combined
local stdcom = io.popen(cmd..' 2>&1'):read('*all')
-- log
mp.msg.info("exec '" .. cmd .. "'")
if stdcom then mp.msg.verbose(stdcom) end
end
-- read lua-settings/tv.conf
options.read_options(cfg, 'tv')
-- log active config
mp.msg.verbose('cfg = '..utils.to_string(cfg))
-- execute only if test condition
if test(cfg.test) then
-- optional TV.ON execute now
if not empty(cfg.on) then exec(cfg.on) end
-- optional TV.OFF execute on shutdown
if not empty(cfg.off) then
mp.register_event("shutdown",
function()
exec(cfg.off)
end
)
end
end