Add widget for cmus (follow mpd conventions) (#46)

* Add widget for cmus (follow mpd conventions)

* Add widget for cmus (follow mpd conventions)

* Add default socket address when XDG_RUNTIME_DIR is not set

* cmus: use on/off instead of true/false

- default value was a boolean which is not valid in our format function
  and would lead to a crash
- on/off seems more human readable

* cmus: shell-escape user supplied variables

* Add default socket address when XDG_RUNTIME_DIR is not set
This commit is contained in:
Juan Carlos Menonita 2017-11-22 15:01:30 -06:00 committed by Jörg Thalheim
parent f3d69142c6
commit 5f6acea35c
2 changed files with 97 additions and 2 deletions

View File

@ -13,8 +13,10 @@ To use contrib widgets uncomment the line that loads them in
init.lua. Or you can load them in your rc.lua after you require init.lua. Or you can load them in your rc.lua after you require
Vicious: Vicious:
vicious = require("vicious") ```lua
vicious.contrib = require("vicious.contrib") vicious = require("vicious")
vicious.contrib = require("vicious.contrib")
```
Widget types Widget types
@ -60,6 +62,18 @@ Supported platforms: Linux (required tools: `sysfs`)
**vicious.contrib.countfiles** **vicious.contrib.countfiles**
**vicious.widgets.cmus**
Provides cmus player information using `cmus-remote`.
Supported platforms: platform independent.
- Arguments:
* Takes a table as an argument, 1st field should be the socket including host
(or nil).
- Returns:
* Returns a table with string keys: `{status}`, `{artist}`, `{title}`,
`{duration}`, `{file}`, `{continue}`, `{shuffle}`, `{repeat}`.
**vicious.contrib.dio** **vicious.contrib.dio**
Provides I/O statistics for requested storage devices Provides I/O statistics for requested storage devices
@ -166,6 +180,8 @@ Supported Platforms: platform independent
Usage examples Usage examples
--------------------------------- ---------------------------------
```lua
Pulse Audio widget Pulse Audio widget
vol = wibox.widget.textbox() vol = wibox.widget.textbox()
vicious.register(vol, vicious.contrib.pulse, " $1%", 2, "alsa_output.pci-0000_00_1b.0.analog-stereo") vicious.register(vol, vicious.contrib.pulse, " $1%", 2, "alsa_output.pci-0000_00_1b.0.analog-stereo")
@ -182,3 +198,4 @@ Buildbot widget
{builder="tarball-slave", url="http://buildbot.buildbot.net"} {builder="tarball-slave", url="http://buildbot.buildbot.net"}
} }
vicious.register(buildbotwidget, vicious.contrib.buildbot, "$1,", 3600, buildbotwidget_warg) vicious.register(buildbotwidget, vicious.contrib.buildbot, "$1,", 3600, buildbotwidget_warg)
```

78
contrib/cmus_all.lua Normal file
View File

@ -0,0 +1,78 @@
-----------------------------------------------------------
-- Licensed under the GNU General Public License v2
-- * (c) 2017, JuanKman94 <juan.carlos.menonita@gmail.com>
-----------------------------------------------------------
-- {{{ Grab environment
local tonumber = tonumber
local io = { popen = io.popen }
local setmetatable = setmetatable
local string = { gmatch = string.gmatch, format = string.format }
local helpers = require("vicious.helpers")
-- }}}
-- Cmus: provides CMUS information
-- vicious.widgets.cmus
local cmus_all = {}
-- {{{ CMUS widget type
local function worker(format, warg)
local cmus_state = {
["{duration}"] = 0,
["{file}"] = "N/A",
["{status}"] = "N/A",
["{title}"] = "N/A",
["{artist}"] = "N/A",
["{continue}"] = "off",
["{shuffle}"] = "off",
["{repeat}"] = "off",
}
-- Fallback to CMUS defaults
local host = warg and (warg.host or warg[1]) or os.getenv("CMUS_SOCKET")
if not host then
if os.getenv("XDG_RUNTIME_DIR") then
host = os.getenv("XDG_RUNTIME_DIR") .. "/cmus-socket"
else
host = os.getenv("HOME") .. "/.config/cmus/socket"
end
end
-- Get data from CMUS server
local f = io.popen("cmus-remote --query --server " .. helpers.escape(host))
for line in f:lines() do
for module, value in string.gmatch(line, "([%w]+) (.*)$") do
if module == "file" then
cmus_state["{"..module.."}"] = helpers.escape(value)
elseif module == "duration" then
cmus_state["{"..module.."}"] = tonumber(value)
elseif module == "status" then
cmus_state["{"..module.."}"] = value
else
for k, v in string.gmatch(value, "([%w]+) (.*)$") do
if module == "tag" then
if k == "title" or k == "artist" then
cmus_state["{"..k.."}"] = v
end
elseif module == "set" then
if k == "continue" or k == "shuffle" or k == "repeat" then
if v == "true" then
cmus_state["{"..k.."}"] = "on"
end
end
end
end
end
end
end
f:close()
return cmus_state
end
-- }}}
return setmetatable(cmus_all, { __call = function(_, ...) return worker(...) end })