elenapan/config/awesome/evil/mpd.lua
2020-03-28 18:33:14 +02:00

112 lines
3.2 KiB
Lua

-- Provides:
-- evil::mpd
-- artist (string)
-- song (string)
-- paused (boolean)
-- evil::mpd_volume
-- value (integer from 0 to 100)
-- evil::mpd_options
-- loop (boolean)
-- random (boolean)
local awful = require("awful")
local function emit_info()
awful.spawn.easy_async({"mpc", "-f", "[[%artist%@@%title%@]]"},
function(stdout)
local artist = stdout:match('(.*)@@')
local title = stdout:match('@@(.*)@')
local status = stdout:match('%[(.*)%]')
status = string.gsub(status, '^%s*(.-)%s*$', '%1')
local paused
if status == "playing" then
paused = false
else
paused = true
end
awesome.emit_signal("evil::mpd", artist, title, paused)
end
)
end
-- Run once to initialize widgets
emit_info()
-- Sleeps until mpd changes state (pause/play/next/prev)
local mpd_script = [[
sh -c '
mpc idleloop player
']]
-- Kill old mpc idleloop player process
awful.spawn.easy_async_with_shell("ps x | grep \"mpc idleloop player\" | grep -v grep | awk '{print $1}' | xargs kill", function ()
-- Emit song info with each line printed
awful.spawn.with_line_callback(mpd_script, {
stdout = function()
emit_info()
end
})
end)
----------------------------------------------------------
-- MPD Volume
local function emit_volume_info()
awful.spawn.easy_async_with_shell("mpc volume | awk '{print substr($2, 1, length($2)-1)}'",
function(stdout)
awesome.emit_signal("evil::mpd_volume", tonumber(stdout))
end
)
end
-- Run once to initialize widgets
emit_volume_info()
-- Sleeps until mpd volume changes
-- >> We use `sed '1~2d'` to remove every other line since the mixer event
-- is printed twice for every volume update.
-- >> The `-u` option forces sed to work in unbuffered mode in order to print
-- without waiting for `mpc idleloop mixer` to finish
local mpd_volume_script = [[
sh -c "
mpc idleloop mixer | sed -u '1~2d'
"]]
-- Kill old mpc idleloop mixer process
awful.spawn.easy_async_with_shell("ps x | grep \"mpc idleloop mixer\" | grep -v grep | awk '{print $1}' | xargs kill", function ()
-- Emit song info with each line printed
awful.spawn.with_line_callback(mpd_volume_script, {
stdout = function()
emit_volume_info()
end
})
end)
local mpd_options_script = [[
sh -c "
mpc idleloop options
"]]
local function emit_options_info()
awful.spawn.easy_async_with_shell("mpc | tail -1",
function(stdout)
local loop = stdout:match('repeat: (.*)')
local random = stdout:match('random: (.*)')
awesome.emit_signal("evil::mpd_options", loop:sub(1, 2) == "on", random:sub(1, 2) == "on")
end
)
end
-- Run once to initialize widgets
emit_options_info()
-- Kill old mpc idleloop options process
awful.spawn.easy_async_with_shell("ps x | grep \"mpc idleloop options\" | grep -v grep | awk '{print $1}' | xargs kill", function ()
-- Emit song info with each line printed
awful.spawn.with_line_callback(mpd_options_script, {
stdout = function()
emit_options_info()
end
})
end)