Conky > Lua > Radio 1 pillanatnyi zene kiíratása

A Radio 1 érdekes a többi rádióhoz képest, mert xml-t ad vissza. Lua esetében van olyan könyvtár, ami az xml-ből egyből lua táblát csinál, de luarocks-szal nem telepíthető. Így a megoldásom kicsit bonyolultabb, mert az xmllibre épülő xmlreadert használja. Persze teljesen feleslegen, hiszen a memóriafelhasználás miatt ilyen kicsi xml-nél természetesen nem kell aggódni.

A fájlból vagy sztringból(from_string) beolvasott xml egy xmlreader példányt ad vissza, aminek van egy iterátora(:read), ami köré épül a szkript. Az iterátor mindig a soron következő node-ot olvassa be, tehát egyfajta kurzor.

Ha az aktuális node-ba belépünk a típusa 'element', ha kilépünk belőle 'element end'. Ha belelépünk az 'artist' elembe, rögtön meghívódik az olvasó read iterátora, hogy hozzáférjünk a szöveghez. A szkript meg messze nincs kész, az artist és songtitle függvény nagyon hasonlítanak egymásra, erősen sértve a DRY-elvet. :D
És hol van a hibakezelés, teszt, doksi?...

A latin2-ről utf8-ra alakítást kihagytam hiszen az előző bejegyzések valamelyikében már be lett mutatva.

$ wget http://www.radio1.hu/mosthallhatoNew.xml
$ luarocks install xmlreader

Ez a szkript azért jó, mert offline is működik. :D

radio_radio1_offline.lua:


require 'xmlreader'

local r = xmlreader.from_file('mosthallhatoNew.xml')
coll = {}

function artist(r, coll)

	name = r:name()
	r:read()
	print(r:value())
	coll[name] = r:value()
end

function songtitle(r, coll)

	name = r:name()
	r:read()
	print(r:value())
	coll[name] = r:value()
end

callback_table = {
	artistelement = artist,
	songtitleelement = songtitle
}

function parse_xml_rec(reader)
	
	if reader:read() then
	
		cb = callback_table[reader:name()..reader:node_type()]
		if cb then cb(reader, coll) end		
		parse_xml_rec(reader)
 
	end	
end


parse_xml_rec(r)


print(coll["artist"].." - "..coll["songtitle"])

Példa XML:


<?xml version="1.0" encoding="iso-8859-2" standalone="yes"?>

< response >
      < artist >Taio Cruz-Ludacris< /artist >		 
      < songtitle>Break Your Heart< /songtitle>
      < refreshTime>30< /refreshTime>
		
< /response >

Dokumentáció:
[1] http://asbradbury.org/projects/lua-xmlreader/doc/

Hozzászólások

Miért nem használsz awesome ablakkezelőt? A konfigfájlja lényegében egy lua-kód, és amit meg tudsz csinálni lua-ban, azt az awesome fel is dolgozza...

Egyszerű. Egy másik ablakkezelőt indítasz :)
Mit használsz most? Egyébként nem egy nagy durranás, főleg ha már érted a lua-t. A példa konfig-fájlból érdemes kiindulni, de a wiki-ben is lehet találni nem kevés példát. De ha bármi kérdésed van, kérdezz, próbálok válaszolni...