]> git.madduck.net Git - etc/awesome.git/blob - widgets/mpd.lua

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

8db62ae365af9561bc9fc3e20189127e37beb4c6
[etc/awesome.git] / widgets / mpd.lua
1
2 --[[
3                                                   
4      Licensed under GNU General Public License v2 
5       * (c) 2013, Luke Bonham                     
6       * (c) 2010, Adrian C. <anrxc@sysphere.org>  
7                                                   
8 --]]
9
10 local markup       = require("lain.util.markup")
11 local helpers      = require("lain.helpers")
12
13 local awful        = require("awful")
14 local beautiful    = require("beautiful")
15 local naughty      = require("naughty")
16 local wibox        = require("wibox")
17
18 local io           = io
19 local os           = { execute  = os.execute,
20                        getenv   = os.getenv }
21 local string       = { gmatch   = string.gmatch }
22
23 local setmetatable = setmetatable
24
25 -- MPD infos
26 -- lain.widgets.mpd
27 local mpd = { id = nil }
28
29 function worker(args)
30     local args = args or {}
31     local password = args.password or ""
32     local host = args.host or "127.0.0.1"
33     local port = args.port or "6600"
34     local music_dir = args.music_dir or os.getenv("HOME") .. "/Music"
35     local refresh_timeout = args.refresh_timeout or 1
36     local header_color = args.header_color or beautiful.fg_normal or "#FFFFFF"
37     local color = args.color or beautiful.fg_focus or "#FFFFFF"
38     local spr = args.spr or " "
39     local footer = args.footer or ""
40     local app = args.app or "ncmpcpp"
41     local shadow = args.shadow or false
42
43     local mpdcover = helpers.scripts_dir .. "mpdcover"
44     local mpdh = "telnet://"..host..":"..port
45     local echo = "echo 'password "..password.."\nstatus\ncurrentsong\nclose'"
46
47     local mympd = wibox.widget.textbox()
48
49     helpers.set_map("current mpd track", nil)
50
51     local mympdupdate = function()
52         local function set_nompd()
53             if shadow
54             then
55                 mympd:set_text('')
56             else
57                 mympd:set_markup(markup(header_color, "mpd ") .. markup(color , "off") .. footer)
58             end
59         end
60
61         local mpd_state  = {
62             ["{state}"]  = "N/A",
63             ["{file}"]   = "N/A",
64             ["{Artist}"] = "N/A",
65             ["{Title}"]  = "N/A",
66             ["{Album}"]  = "N/A",
67             ["{Date}"]   = "N/A"
68         }
69
70         -- Get data from MPD server
71         local f = io.popen(echo .. " | curl --connect-timeout 1 -fsm 3 " .. mpdh)
72
73         for line in f:lines() do
74             for k, v in string.gmatch(line, "([%w]+):[%s](.*)$") do
75                 if     k == "state"  then mpd_state["{"..k.."}"] = v
76                 elseif k == "file"   then mpd_state["{"..k.."}"] = v
77                 elseif k == "Artist" then mpd_state["{"..k.."}"] = awful.util.escape(v)
78                 elseif k == "Title"  then mpd_state["{"..k.."}"] = awful.util.escape(v)
79                 elseif k == "Album"  then mpd_state["{"..k.."}"] = awful.util.escape(v)
80                 elseif k == "Date"   then mpd_state["{"..k.."}"] = awful.util.escape(v)
81                 end
82             end
83         end
84
85         f:close()
86
87         if mpd_state["{state}"] == "play"
88         then
89             if mpd_state["{Title}"] ~= helpers.get_map("current mpd track")
90             then
91                 helpers.set_map("current mpd track", mpd_state["{Title}"])
92                 os.execute(mpdcover .. " '" .. music_dir .. "' '"
93                            .. mpd_state["{file}"] .. "'")
94                 mpd.id = naughty.notify({
95                     title = "Now playing",
96                     text = mpd_state["{Artist}"] .. " ("   ..
97                            mpd_state["{Album}"]  .. ") - " ..
98                            mpd_state["{Date}"]   .. "\n"   ..
99                            mpd_state["{Title}"],
100                     icon = "/tmp/mpdcover.png",
101                     fg = color,
102                     timeout = 6, 
103                     replaces_id = mpd.id
104                 }).id
105             end
106             mympd:set_markup(markup(header_color, mpd_state["{Artist}"])
107                              .. spr ..
108                              markup(color, mpd_state["{Title}"]) .. footer)
109         elseif mpd_state["{state}"] == "pause"
110         then
111             mympd:set_markup(markup(header_color, "mpd")
112                              .. spr ..
113                              markup(color, "paused") .. footer)
114         else
115             helpers.set_map("current mpd track", nil)
116                         set_nompd()
117               end
118     end
119
120     local mympdtimer = timer({ timeout = refresh_timeout })
121     mympdtimer:connect_signal("timeout", mympdupdate)
122     mympdtimer:start()
123     mympdtimer:emit_signal("timeout")
124
125     mympd:buttons(awful.util.table.join(
126         awful.button({}, 0,
127             function()
128                 helpers.run_in_terminal(app)
129             end)
130     ))
131
132     local mpd_out = { widget = mympd, notify = mympdupdate }
133
134     return setmetatable(mpd_out, { __index = mpd_out.widget })
135 end
136
137 return setmetatable(mpd, { __call = function(_, ...) return worker(...) end })