]> 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:

9a9c28ee2191e99d83d566d22e362584ebe9a327
[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 app = args.app or "ncmpcpp"
40     local shadow = args.shadow or false
41
42     local mpdcover = helpers.scripts_dir .. "mpdcover"
43     local mpdh = "telnet://"..host..":"..port
44     local echo = "echo 'password "..password.."\nstatus\ncurrentsong\nclose'"
45
46     local mympd = wibox.widget.textbox()
47
48     helpers.set_map("current mpd track", nil)
49
50     local mympdupdate = function()
51         local function set_nompd()
52             if shadow
53             then
54                 mympd:set_text('')
55             else
56                 mympd:set_markup(markup(header_color, " mpd "), markup(color , "off "))
57             end
58         end
59
60         local mpd_state  = {
61             ["{state}"]  = "N/A",
62             ["{file}"]   = "N/A",
63             ["{Artist}"] = "N/A",
64             ["{Title}"]  = "N/A",
65             ["{Album}"]  = "N/A",
66             ["{Date}"]   = "N/A"
67         }
68
69         -- Get data from MPD server
70         local f = io.popen(echo .. " | curl --connect-timeout 1 -fsm 3 " .. mpdh)
71
72         for line in f:lines() do
73             for k, v in string.gmatch(line, "([%w]+):[%s](.*)$") do
74                 if     k == "state"  then mpd_state["{"..k.."}"] = v
75                 elseif k == "file"   then mpd_state["{"..k.."}"] = v
76                 elseif k == "Artist" then mpd_state["{"..k.."}"] = awful.util.escape(v)
77                 elseif k == "Title"  then mpd_state["{"..k.."}"] = awful.util.escape(v)
78                 elseif k == "Album"  then mpd_state["{"..k.."}"] = awful.util.escape(v)
79                 elseif k == "Date"   then mpd_state["{"..k.."}"] = awful.util.escape(v)
80                 end
81             end
82         end
83
84         f:close()
85
86         if mpd_state["{state}"] == "play"
87         then
88             if mpd_state["{Title}"] ~= helpers.get_map("current mpd track")
89             then
90                 helpers.set_map("current mpd track", mpd_state["{Title}"])
91                 os.execute(mpdcover .. " '" .. music_dir .. "' '"
92                            .. mpd_state["{file}"] .. "'")
93                 mpd.id = naughty.notify({
94                     title = "Now playing",
95                     text = mpd_state["{Artist}"] .. " ("   ..
96                            mpd_state["{Album}"]  .. ") - " ..
97                            mpd_state["{Date}"]   .. "\n"   ..
98                            mpd_state["{Title}"],
99                     icon = "/tmp/mpdcover.png",
100                     fg = color,
101                     timeout = 6, 
102                     replaces_id = mpd.id
103                 }).id
104             end
105             mympd:set_markup(markup(header_color, " " .. mpd_state["{Artist}"])
106                              .. spr ..
107                              markup(color, mpd_state["{Title}"] .. " "))
108         elseif mpd_state["{state}"] == "pause"
109         then
110             mympd:set_markup(markup(header_color, " mpd")
111                              .. spr ..
112                              markup(color, "paused "))
113         else
114             helpers.set_map("current mpd track", nil)
115                         set_nompd()
116               end
117     end
118
119     local mympdtimer = timer({ timeout = refresh_timeout })
120     mympdtimer:connect_signal("timeout", mympdupdate)
121     mympdtimer:start()
122     mympdtimer:emit_signal("timeout")
123
124     mympd:buttons(awful.util.table.join(
125         awful.button({}, 0,
126             function()
127                 helpers.run_in_terminal(app)
128             end)
129     ))
130
131     local mpd_out = { widget = mympd, notify = mympdupdate }
132
133     return setmetatable(mpd_out, { __index = mpd_out.widget })
134 end
135
136 return setmetatable(mpd, { __call = function(_, ...) return worker(...) end })