mpd and yawn widget are now asynchronous

This commit is contained in:
luke bonham 2014-08-07 13:37:24 +02:00
parent 823659d83d
commit 6714db710a
3 changed files with 133 additions and 128 deletions

View File

@ -13,6 +13,8 @@
-- ...synchronously
-- wwidget.text = asyncshell.demand('wscript -Kiev', 5):read("*l") or "Error"
-- This makes things faster, but puts weight on sysload and is more cpu demanding.
local spawn = require('awful.util').spawn
asyncshell = {}

View File

@ -8,6 +8,7 @@
--]]
local helpers = require("lain.helpers")
local async = require("lain.asyncshell")
local escape_f = require("awful.util").escape
local naughty = require("naughty")
@ -50,56 +51,54 @@ local function worker(args)
helpers.set_map("current mpd track", nil)
function mpd.update()
mpd_now = {
state = "N/A",
file = "N/A",
artist = "N/A",
title = "N/A",
album = "N/A",
date = "N/A"
}
async.request(echo .. " | curl --connect-timeout 1 -fsm 3 " .. mpdh, function (f)
mpd_now = {
state = "N/A",
file = "N/A",
artist = "N/A",
title = "N/A",
album = "N/A",
date = "N/A"
}
local f = io.popen(echo .. " | curl --connect-timeout 1 -fsm 3 " .. mpdh)
for line in f:lines() do
for k, v in string.gmatch(line, "([%w]+):[%s](.*)$") do
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)
for line in f:lines() do
for k, v in string.gmatch(line, "([%w]+):[%s](.*)$") do
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
end
f:close()
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()
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_now.title ~= helpers.get_map("current mpd track")
if mpd_now.state == "play"
then
helpers.set_map("current mpd track", mpd_now.title)
if mpd_now.title ~= helpers.get_map("current mpd track")
then
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))
os.execute(string.format("%s %q %q %d %q", mpdcover, music_dir,
mpd_now.file, cover_size, default_art))
mpd.id = naughty.notify({
preset = mpd_notification_preset,
icon = "/tmp/mpdcover.png",
replaces_id = mpd.id,
screen = client.focus and client.focus.screen or 1
}).id
mpd.id = naughty.notify({
preset = mpd_notification_preset,
icon = "/tmp/mpdcover.png",
replaces_id = mpd.id,
screen = client.focus and client.focus.screen or 1
}).id
end
elseif mpd_now.state ~= "pause"
then
helpers.set_map("current mpd track", nil)
end
elseif mpd_now.state ~= "pause"
then
helpers.set_map("current mpd track", nil)
end
end)
end
helpers.newtimer("mpd", timeout, mpd.update)

View File

@ -7,6 +7,7 @@
--]]
local newtimer = require("lain.helpers").newtimer
local async = require("lain.asyncshell")
local naughty = require("naughty")
local wibox = require("wibox")
@ -47,99 +48,102 @@ yawn_notification_preset = {}
local function fetch_weather()
local url = api_url .. units_set .. city_id
local f = io.popen("curl --connect-timeout 1 -fsm 3 '" .. url .. "'" )
local text = f:read("*a")
f:close()
local cmd = "curl --connect-timeout 1 -fsm 3 '" .. url .. "'"
-- In case of no connection or invalid city ID
-- widgets won't display
if text == "" or text:match("City not found")
then
yawn.icon:set_image(icon_path .. "na.png")
if text == "" then
weather_data = "Service not available at the moment."
yawn.widget:set_text(" N/A ")
else
weather_data = "City not found!\n" ..
"Are you sure " .. city_id ..
" is your Yahoo city ID?"
yawn.widget:set_text(" ? ")
end
return
end
-- Processing raw data
weather_data = text:gsub("<.->", "")
weather_data = weather_data:match("Current Conditions:.-Full") or ""
-- may still happens in case of bad connectivity
if weather_data == "" then
yawn.icon:set_image(icon_path .. "na.png")
yawn.widget:set_text(" ? ")
return
end
weather_data = weather_data:gsub("Current Conditions:.-\n", "Now: ")
weather_data = weather_data:gsub("Forecast:.-\n", "")
weather_data = weather_data:gsub("\nFull", "")
weather_data = weather_data:gsub("[\n]$", "")
weather_data = weather_data:gsub(" [-] " , ": ")
weather_data = weather_data:gsub("[.]", ",")
weather_data = weather_data:gsub("High: ", "")
weather_data = weather_data:gsub(" Low: ", " - ")
-- Getting info for text widget
local now = weather_data:sub(weather_data:find("Now:")+5,
weather_data:find("\n")-1)
forecast = now:sub(1, now:find(",")-1)
units = now:sub(now:find(",")+2, -2)
-- Day/Night icon change
local hour = tonumber(os.date("%H"))
sky = icon_path
if forecast == "Clear" or
forecast == "Fair" or
forecast == "Partly Cloudy" or
forecast == "Mostly Cloudy"
then
if hour >= 6 and hour <= 18
then
sky = sky .. "Day"
else
sky = sky .. "Night"
end
end
sky = sky .. forecast:gsub(" ", ""):gsub("/", "") .. ".png"
-- In case there's no defined icon for current forecast
if io.open(sky) == nil then
sky = icon_path .. "na.png"
end
-- Localization
local f = io.open(localizations_path .. language, "r")
if language:find("en_") == nil and f ~= nil
then
async.request(cmd, function(f)
local text = f:read("*a")
f:close()
for line in io.lines(localizations_path .. language)
do
word = string.sub(line, 1, line:find("|")-1)
translation = string.sub(line, line:find("|")+1)
weather_data = string.gsub(weather_data, word, translation)
-- In case of no connection or invalid city ID
-- widgets won't display
if text == "" or text:match("City not found")
then
yawn.icon:set_image(icon_path .. "na.png")
if text == "" then
weather_data = "Service not available at the moment."
yawn.widget:set_text(" N/A ")
else
weather_data = "City not found!\n" ..
"Are you sure " .. city_id ..
" is your Yahoo city ID?"
yawn.widget:set_text(" ? ")
end
return
end
end
-- Finally setting infos
yawn.icon:set_image(sky)
widget = yawn.widget
-- Processing raw data
weather_data = text:gsub("<.->", "")
weather_data = weather_data:match("Current Conditions:.-Full") or ""
_data = weather_data:match(": %S.-,") or weather_data
forecast = _data:gsub(": ", ""):gsub(",", "")
units = units:gsub(" ", "")
-- may still happens in case of bad connectivity
if weather_data == "" then
yawn.icon:set_image(icon_path .. "na.png")
yawn.widget:set_text(" ? ")
return
end
settings()
weather_data = weather_data:gsub("Current Conditions:.-\n", "Now: ")
weather_data = weather_data:gsub("Forecast:.-\n", "")
weather_data = weather_data:gsub("\nFull", "")
weather_data = weather_data:gsub("[\n]$", "")
weather_data = weather_data:gsub(" [-] " , ": ")
weather_data = weather_data:gsub("[.]", ",")
weather_data = weather_data:gsub("High: ", "")
weather_data = weather_data:gsub(" Low: ", " - ")
-- Getting info for text widget
local now = weather_data:sub(weather_data:find("Now:")+5,
weather_data:find("\n")-1)
forecast = now:sub(1, now:find(",")-1)
units = now:sub(now:find(",")+2, -2)
-- Day/Night icon change
local hour = tonumber(os.date("%H"))
sky = icon_path
if forecast == "Clear" or
forecast == "Fair" or
forecast == "Partly Cloudy" or
forecast == "Mostly Cloudy"
then
if hour >= 6 and hour <= 18
then
sky = sky .. "Day"
else
sky = sky .. "Night"
end
end
sky = sky .. forecast:gsub(" ", ""):gsub("/", "") .. ".png"
-- In case there's no defined icon for current forecast
if io.open(sky) == nil then
sky = icon_path .. "na.png"
end
-- Localization
local f = io.open(localizations_path .. language, "r")
if language:find("en_") == nil and f ~= nil
then
f:close()
for line in io.lines(localizations_path .. language)
do
word = string.sub(line, 1, line:find("|")-1)
translation = string.sub(line, line:find("|")+1)
weather_data = string.gsub(weather_data, word, translation)
end
end
-- Finally setting infos
yawn.icon:set_image(sky)
widget = yawn.widget
_data = weather_data:match(": %S.-,") or weather_data
forecast = _data:gsub(": ", ""):gsub(",", "")
units = units:gsub(" ", "")
settings()
end)
end
function yawn.hide()