mpd + conky + okladka

11 sierpnia, 2009

Przy okazji powrotu na pekwm postanowiłem sobie skonfigurować ladnego conkyego na tapetę. Wybór padł na theme royalty. Pomimo iż na screenie znajduje się ładna okładka płyty, autor thema pisze:

The cover is displayed via custom screenlet theme.

Nie widziałem sensu męczenia się z kolejnym screenletem, dlatego postanowiłem skorzystać z możliwości jaką daje najnowsza (nowsza niż 1.7.0) wersja conkyego, tzn wyświetlania obrazków. W tym celu napisałem prosty skrypt, który pobiera aktualnie grany album oraz artystę, a następnie wchodzi na najbardziej oczywisty adres na last.fm i próbuje pobrać okładkę ;). Co by nie mówić o last.fm - różnych niszowych grup jest tam pełno i większość okładek z mojej playlisty skrypt znajduje bez problemów.

Skrypt:

~/scripts/mpd-cover.py
#!/usr/bin/python
import commands, re, urllib2, os
get_art = re.compile('([^\t]+)\t([^\t]+)\t')
get_cover = re.compile('<span class=\"art\"><img [^>]+src=\"([^"]+)\"')
def get_artist():
    a = commands.getoutput('MPD_HOST=kot  mpc --format "\t%artist%\t%album%\t"')
    art = get_art.findall(a)
    try:
        testpl = open('/tmp/cover.album', 'r')
        b = eval(testpl.readline())
        testpl.close()
        if art == b:
            return True
        else:
            open('/tmp/cover.album','w').write("%s" % art)
    except Exception:
        open('/tmp/cover.album','w').write("%s" % art)
 
 
    url= ('http://last.fm/music/%s/%s/' % art[0]).replace(' ','+')
    try:
        stronka = urllib2.urlopen(url)
        cover = get_cover.findall(stronka.read())[0]
        com = commands.getoutput('wget "%s" -O /tmp/cover' % cover)
    except urllib2.HTTPError:
        commands.getoutput('cp %s/cover.png /tmp/cover' % (os.getcwd()))
 
if __name__ == '__main__':
    get_artist()
 

Jak mi się będzie chciało to jakiś cache może dorzucę. Ale na razie nie pobiera aż tak dużo łącza ;).

Sposób osadzenia w conky

.conkyrc
# wazne do skonfigurowania
imlib_cache_size 0

# TEXT
${execi 10 ~/scripts/mpd-cover.py}
${image /tmp/cover -p 22,710 -s 100x100}

cały skonfigurowany conky wygląda tak:

Komentarze do wpisu "mpd + conky + okladka":

1. Grzegorz napisał(a):
11 sierpnia 2009, 23:28:12

Szkoda, że nie lubię mięć sensorów conkiego w pionie, bo bardzo podoba mi się Twój skrypt ;)

2. occulkot napisał(a):
11 sierpnia 2009, 23:36:21

Ja sam sie pierwszy raz przymierzam do trzymania conkyego gdziekolwiek ;P. Poprzednio pisalem sobie zestaw funkcji do pypanelu do wyswietlania np stanu baterii i aktualnego tracka w mpd. Zobaczymy czy nie bedzie mnie za bardzo wnerwiac ;).

3. Grzegorz napisał(a):
11 sierpnia 2009, 23:42:05

occulkot: Ja sobie darowałem tak duże sensory. Raz, że przez większość czasu ich nie widać - są przykryte oknami. Dwa, że poza monitorem CPU/MEM i ruchu w sieci, nie potrzeba mi tak naprawdę niczego. Ostatnio pozbyłem się nawet czujnika CPU, po tym jak w tle działa "cpulimitdaemon":http://grzglo.jogger.pl/2009/08/02/cpulimit-daemon/ to po prostu zbędne. Pozostaje zatem IP i transfer sieciowy.

Przez jakiś czas korzystałem np. z "Conky-Colors":http://www.gnome-look.org/content/show.php/CONKY-colors?content=92328, ale powiem szczerze, że to się nadaje tylko to robienia zrzutów ekranu na bloga :D

Mam pytanie odnośnie Twojego skryptu: monitor obsługuje więcej niż jeden CPU?

4. occulkot napisał(a):
11 sierpnia 2009, 23:49:14

@Grzegorz: widzisz - zasadniczo mam podobne podejscie. Dla mnie to wiekszosc z tych appletow tam to jest dekoracja ktora nie jest mi specjalnie potrzebna ;), ale jak juz ma mi pokazywac co gra mpd(notabene uruchomione na kompie w domu i streamowane icecastem) to niech przynajmniej jakos wyglada ;P.
W sumie wstawilem to sobie dla testu i chcialem do tego dorzucic jakies powiadamianie o nowej wiadomosci w emacs-jabber (poki co xosd w zupelnosci wystarcza), ale spedzilem ~2h na konfigurowaniu samego wyswietlania i powiadomienia odloze do jutra.

monitor wyswietla statsy dla obu core. linia odpowiedzialna za cpu2 wyglada przykladowo tak:
${color 7C96B0}Cpu2:${color 8F8F8F}${alignr}${cpu cpu2}% ${color EE6363}${execi 20 sensors k8temp-pci-00c3 |grep Core1 |awk '{print $3}'}
${color 262626}${cpugraph cpu2 20,145 262626 1E1E1E}

5. Hoppke napisał(a):
13 sierpnia 2009, 18:11:16

Cool. Warto pamiętać, że last.fm ma przyzwoite API (XML over HTTP, jeśli dobrze pamiętam), pozwalające m.in. wyszukiwać okładki. Ale dobrze wiedzieć, że da się też łatwo sam html sparsować.

6. occulkot napisał(a):
13 sierpnia 2009, 18:12:37

@Hoppke: kurde - na pomysl ze sprawdzeniem api to nawet nie wpadlem :D. Zawsze poruszam sie po urlach w lascie i to byla pierwsza rzecz jaka mi do glowy przyszla ;). Ciekawe czy API potrafi skorygowac literowki w nazwach - trza by sprawdzic

7. mrk napisał(a):
13 sierpnia 2009, 21:56:38

Hej. Pewnie się czepiam, ale zamiast ''.join([i for i in stronka.readlines()]) nie wystarczy po prostu stronka.read() ? :)

8. occulkot napisał(a):
13 sierpnia 2009, 21:59:13

hehehe - no nawet na pewno wystarczy. Nie wiem czemu w ogole nigdy nie sprawdzilem ze cos takiego istnieje... thx

9. mrk napisał(a):
13 sierpnia 2009, 22:09:06

:) Tak na przyszłość - join'owi jako parametr możesz przekazać bezpośrednio generator, nie trzeba tworzyć tej pomocniczej listy, wystarczy ''.join(x for x in ...),

10. occulkot napisał(a):
13 sierpnia 2009, 22:10:02

@mrk: to tez nie wiedzialem ;) - thx

Dodaj komentarz: