Conky > Lua > MR2 pillanatnyi zene kiíratása

Dap kommentjétől megihletve elkészítettem az MR2(Petőfi) éppen futó zenéjének kiíratását Conkyra, egy X windowra írt rendszermonitorra. Így néz ki a ruby-szkript:


... | ruby -n -ruri -riconv -e 'puts Iconv.conv("UTF-8", "LATIN2", URI.decode($_).tr("+", " "))'

A megfelelő url-t felcsapva a válasz URI-kódolva érkezik ezt ki kell kódolni, a conky utf8 szöveget szeret ezért át kell kódolni, erre alkalmas az iconv.

Na lássuk luával mindez hogy hajtható végre:

Miután a csomagkezelőből feltelepítettük a Conkyt másoljuk az alap beállítás fájlokat a felhasználói beállítás fájlba:
$ cp /etc/conky/conky.conf ~/.conkyrc

Szúrjuk be a következő sort, mondjuk az Uptime alá:


${color grey}MR2:$color ${texeci 10 lua ~/scripts/radio_mr2.lua}

A texeci parancs nyit egy új szálat(t) 10 másodpercenként úgy mintha a terminálban adtuk volna ki.

Hogy ez a beállítás működjön hozzuk létre a /scripts/radio_mr2.lua szkriptet, aminek tartalma legyen.


require "curl"
require "iconv"

function write_callback(t)
	return function(s, len)
		table.insert(t,s)
		return len, nil

	end
end
-- BEGIN http://tassi.web.cs.unibo.it/lua/curl_lua_luadoc.html --


response_t = {}

c = curl.easy_init()
c:setopt(curl.OPT_URL, "http://stream001.radio.hu/xml/mr2.php")
c:setopt(curl.OPT_COOKIE, "WACIDX=efwkopEWFWFWsdwQ")
c:setopt(curl.OPT_WRITEFUNCTION, write_callback(response_t))

c:perform()



-- END --

-- BEGIN from: http://www.lua.org/pil/20.3.html --
function unescape (s)
	s = string.gsub(s, "+", " ")
	s = string.gsub(s, "%%(%x%x)", function (h)
			return string.char(tonumber(h, 16))
	end)
	return s
end
-- END --

resp = response_t[1]


--[[ From: latin2 to utf-8 ----
Example in lua-iconv README or
http://code.google.com/p/scite-ru/source/browse/trunk/lualib/lua-iconv/README?spec=svn854&r=854
--]]

-- Tesztek BEGIN --

test = false

if test == true then

resp = "Corrine+Bailey+Rae+-+I%27d+Like+To"
resp = "mcim=MR2-Pet%F5fi+R%E1di%F3+%96+Nagyon+zene"

end
-- Tesztek END --

resp = string.gsub(resp, "^mcim=", "")
resp = unescape(resp)
cd = iconv.new("UTF8", "latin2")
resp = cd:iconv(resp)

print(resp)

"Kicsit" bonyolultabb mint a rubys verzió :D

P.S.: Frankó kis statisztikákat lehet gyártani, mit hányszor ismételnek...

Hozzászólások

Ennyivel azért nem bonyolultabb szerintem ;)
Pl. a rubys verziód kb. ennyit csinál az egész luás dologból:


require "iconv"
url = require("socket.url")

resp = arg[0]
resp = url.unescape(resp)
resp = string.gsub(resp, "+", " ")
cd = iconv.new("UTF8", "latin2")
resp = cd:iconv(resp)
print(resp)

szerintem nem sokkal bonyolultabb, de ha annyira egy sorba akarsz mindent írni, egymásba ágyazva a dolgokat, erre is van mód:

print(require("iconv").new("UTF8", "latin2"):iconv(string.gsub(require("socket.url").unescape(io.read("*line") or "mcim=MR2-Pet%F5fi+R%E1di%F3+%96+Nagyon+zene"),"+"," ")))

… mondjuk jelen esetben valószínűleg maradnék sima shellscriptnél.

int getRandomNumber() { // ←ez itt már az aláírásom
	return 4;//szabályos kockadobással választva.
}		//garantáltan véletlenszerű. xkcd

Nyertél, nem tudom három sor alá vinni:

lua -e 'results = {}; require("socket.http").request { url = "http://stream001.radio.hu/xml/mr2.php", headers = {["Set-Cookie"] = "WACIDX=efwkopEWFWFWsdwQ"}, sink = require("ltn12").sink.table(results) }; print(require("iconv").new("UTF8", "latin2"):iconv(string.gsub(require("socket.url").unescape(table.concat(results)),"+"," ")))

A Curl-t nem szeretem annyira, utálom az interfészeit, és úgy sejtem, hogy azzal még hosszabb lenne. Mondjuk ez is a socket.http miatt hosszabb, mint egy sor ☺ – sebaj, nem vagyok túl becsvágyó, nem szoktam luázni… Bár most egyre jobban tetszik.

szerk.: egyébként nekem ezzel a sütivel nem működik.

int getRandomNumber() { // ←ez itt már az aláírásom
	return 4;//szabályos kockadobással választva.
}		//garantáltan véletlenszerű. xkcd

Lehet, de nekem valahogy nehézkesnek tűnik a shellscriptekhez képest. Persze megszokás kérdése, de shellscriptben a curl meghívása egy sor. Ezzel szemben a legtöbb más nyelven ennél többet kell vele szórakozni. Én valahogy nehezen mondok le arról, hogy a gépen lévő szoftverek kimenetét könnyedén használhassam, még akkor is, ha egy-egy részfeladatra egy másik programnyelv sokkal kényelmesebb.
Végső esetben meg még mindig indíthatok interpretert, ilyenkor Perl a jellemző, de olykor a JavaScript is befigyel.

int getRandomNumber() { // ←ez itt már az aláírásom
	return 4;//szabályos kockadobással választva.
}		//garantáltan véletlenszerű. xkcd

+1. A shell egyszerűsége (butasága) előny egy egyszerű feladatnál.

Én egyébként régebben már ismertem a shell-t (+awk), perl-t, c-t, php-t, de utáltam, hogy minden feladatra egy adott nyelvet kell elővennem ha nem akarok szívni, ekkor kezdtem keresésbe. Nálam versenyben volt a python, ruby, c#, java, aztán a ruby nyert, főleg amiatt, hogy skálázható az 1 soros shellbe írható scriptektől a Qt GUI programokon át a komplex web alkalmazásokig. Manapság már csak shell + ruby, ez a kettő így olyan mint egy svájcibicska.

én még keresés közben vagyok. Gyakran olyan nyelven írom, ami elsőre beugrik a feladattal szembesülve. Sajnos nem mindig jön be ez a módszer, előfordulnak félbehagyott scriptek. Legutóbb a delicious-hoz akartam interfészt írni, és a jelentős mennyiségű stringkezelésre való tekintettel Perllel mentem neki. Rossz ötlet volt, pont ahhoz nem volt működő library (és nem, miattam se lett… ☺)

int getRandomNumber() { // ←ez itt már az aláírásom
	return 4;//szabályos kockadobással választva.
}		//garantáltan véletlenszerű. xkcd

Az arg[0] a szkript nevét dobja vissza.