X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/9c829662f1940329184744696eb0f6e5fdb0e15a..17079866150227a7a12798ea97961b7f6370574b:/widgets/mpd.lua?ds=sidebyside

diff --git a/widgets/mpd.lua b/widgets/mpd.lua
index 9a9c28e..41233cd 100644
--- a/widgets/mpd.lua
+++ b/widgets/mpd.lua
@@ -7,130 +7,103 @@
                                                   
 --]]
 
-local markup       = require("lain.util.markup")
 local helpers      = require("lain.helpers")
 
-local awful        = require("awful")
-local beautiful    = require("beautiful")
+local escape_f     = require("awful.util").escape
 local naughty      = require("naughty")
 local wibox        = require("wibox")
 
-local io           = io
+local io           = { popen    = io.popen }
 local os           = { execute  = os.execute,
                        getenv   = os.getenv }
-local string       = { gmatch   = string.gmatch }
+local string       = { format   = string.format, 
+                       gmatch   = string.gmatch }
 
 local setmetatable = setmetatable
 
 -- MPD infos
 -- lain.widgets.mpd
-local mpd = { id = nil }
-
-function worker(args)
-    local args = args or {}
-    local password = args.password or ""
-    local host = args.host or "127.0.0.1"
-    local port = args.port or "6600"
-    local music_dir = args.music_dir or os.getenv("HOME") .. "/Music"
-    local refresh_timeout = args.refresh_timeout or 1
-    local header_color = args.header_color or beautiful.fg_normal or "#FFFFFF"
-    local color = args.color or beautiful.fg_focus or "#FFFFFF"
-    local spr = args.spr or " "
-    local app = args.app or "ncmpcpp"
-    local shadow = args.shadow or false
+local mpd = {}
+
+local function worker(args)
+    local args        = args or {}
+    local timeout     = args.timeout or 2
+    local password    = args.password or ""
+    local host        = args.host or "127.0.0.1"
+    local port        = args.port or "6600"
+    local music_dir   = args.music_dir or os.getenv("HOME") .. "/Music"
+    local cover_size  = args.cover_size or 100
+    local default_art = args.default_art or ""
+    local settings    = args.settings or function() end
 
     local mpdcover = helpers.scripts_dir .. "mpdcover"
-    local mpdh = "telnet://"..host..":"..port
-    local echo = "echo 'password "..password.."\nstatus\ncurrentsong\nclose'"
+    local mpdh = "telnet://" .. host .. ":" .. port
+    local echo = "echo 'password " .. password .. "\nstatus\ncurrentsong\nclose'"
 
-    local mympd = wibox.widget.textbox()
+    mpd.widget = wibox.widget.textbox('')
 
-    helpers.set_map("current mpd track", nil)
+    mpd_notification_preset = {
+        title   = "Now playing",
+        timeout = 6
+    }
 
-    local mympdupdate = function()
-        local function set_nompd()
-            if shadow
-            then
-                mympd:set_text('')
-            else
-                mympd:set_markup(markup(header_color, " mpd "), markup(color , "off "))
-            end
-        end
+    helpers.set_map("current mpd track", nil)
 
-        local mpd_state  = {
-            ["{state}"]  = "N/A",
-            ["{file}"]   = "N/A",
-            ["{Artist}"] = "N/A",
-            ["{Title}"]  = "N/A",
-            ["{Album}"]  = "N/A",
-            ["{Date}"]   = "N/A"
+    function mpd.update()
+        mpd_now = {
+            state  = "N/A",
+            file   = "N/A",
+            artist = "N/A",
+            title  = "N/A",
+            album  = "N/A",
+            date   = "N/A"
         }
 
-        -- Get data from MPD server
-        local f = io.popen(echo .. " | curl --connect-timeout 1 -fsm 3 " .. mpdh)
+        local f = io.popen(echo .. " | curl --connect-timeout 1 -fsm 1 " .. mpdh)
 
         for line in f:lines() do
             for k, v in string.gmatch(line, "([%w]+):[%s](.*)$") do
-                if     k == "state"  then mpd_state["{"..k.."}"] = v
-                elseif k == "file"   then mpd_state["{"..k.."}"] = v
-                elseif k == "Artist" then mpd_state["{"..k.."}"] = awful.util.escape(v)
-                elseif k == "Title"  then mpd_state["{"..k.."}"] = awful.util.escape(v)
-                elseif k == "Album"  then mpd_state["{"..k.."}"] = awful.util.escape(v)
-                elseif k == "Date"   then mpd_state["{"..k.."}"] = awful.util.escape(v)
+                if     k == "state"  then mpd_now.state  = v
+                elseif k == "file"   then mpd_now.file   = v
+                elseif k == "Artist" then mpd_now.artist = escape_f(v)
+                elseif k == "Title"  then mpd_now.title  = escape_f(v)
+                elseif k == "Album"  then mpd_now.album  = escape_f(v)
+                elseif k == "Date"   then mpd_now.date   = escape_f(v)
                 end
             end
         end
 
         f:close()
 
-        if mpd_state["{state}"] == "play"
+        mpd_notification_preset.text = string.format("%s (%s) - %s\n%s", mpd_now.artist,
+                                       mpd_now.album, mpd_now.date, mpd_now.title)
+        widget = mpd.widget
+        settings()
+
+        if mpd_now.state == "play"
         then
-            if mpd_state["{Title}"] ~= helpers.get_map("current mpd track")
+            if mpd_now.title ~= helpers.get_map("current mpd track")
             then
-                helpers.set_map("current mpd track", mpd_state["{Title}"])
-                os.execute(mpdcover .. " '" .. music_dir .. "' '"
-                           .. mpd_state["{file}"] .. "'")
+                helpers.set_map("current mpd track", mpd_now.title)
+
+                os.execute(string.format("%s %q %q %d %q", mpdcover, music_dir,
+                           mpd_now.file, cover_size, default_art))
+
                 mpd.id = naughty.notify({
-                    title = "Now playing",
-                    text = mpd_state["{Artist}"] .. " ("   ..
-                           mpd_state["{Album}"]  .. ") - " ..
-                           mpd_state["{Date}"]   .. "\n"   ..
-                           mpd_state["{Title}"],
+                    preset = mpd_notification_preset,
                     icon = "/tmp/mpdcover.png",
-                    fg = color,
-                    timeout = 6, 
                     replaces_id = mpd.id
                 }).id
             end
-            mympd:set_markup(markup(header_color, " " .. mpd_state["{Artist}"])
-                             .. spr ..
-                             markup(color, mpd_state["{Title}"] .. " "))
-        elseif mpd_state["{state}"] == "pause"
+        elseif mpd_now.state ~= "pause"
         then
-            mympd:set_markup(markup(header_color, " mpd")
-                             .. spr ..
-                             markup(color, "paused "))
-        else
             helpers.set_map("current mpd track", nil)
-		        set_nompd()
 	      end
     end
 
-    local mympdtimer = timer({ timeout = refresh_timeout })
-    mympdtimer:connect_signal("timeout", mympdupdate)
-    mympdtimer:start()
-    mympdtimer:emit_signal("timeout")
-
-    mympd:buttons(awful.util.table.join(
-        awful.button({}, 0,
-            function()
-                helpers.run_in_terminal(app)
-            end)
-    ))
-
-    local mpd_out = { widget = mympd, notify = mympdupdate }
+    helpers.newtimer("mpd", timeout, mpd.update)
 
-    return setmetatable(mpd_out, { __index = mpd_out.widget })
+    return setmetatable(mpd, { __index = mpd.widget })
 end
 
 return setmetatable(mpd, { __call = function(_, ...) return worker(...) end })