Archiwa kategorii: Linux

MPD, conky i okładka albumu na pulpicie.

Korzystając z tego, że wersja conky w Ubuntu 10.04 obsługuje wyświetlanie obrazów, postanowiłem zagłębić się w problem wyświetlania okładki słuchanego albumu na pulpicie przez conky.

Szukając na sieci można znaleźć kilka skryptów do ściągania okładek albumów. Niestety jakoś żaden nie wydał mi się atrakcyjny. Postanowiłem sam coś napisać. Jako baza posłużył mi część kodu Sonaty (klienta MPD).

mpd_cover.py

#!/usr/bin/python
#-*- coding: utf-8 -*-
 
import mpdclient2
import urllib
import urllib2
from xml.etree import ElementTree
import threading
import os
import shutil
 
home_dir = os.path.expandvars('$HOME')
m = mpdclient2.connect()
covers_dir = home_dir + '/.covers_conky/'
current_art_alb = covers_dir + 'current'
current_cover = covers_dir + 'current_cover.jpg'
 
def write_current_art_album(artist, album):
	#zapisz aktulany artist album
	file = open(current_art_alb, 'w')
	file.write('%s - %s' % (artist, album))
	file.close()
 
def find_local_artwork(artist, album):
	if os.path.exists(covers_dir + "%s - %s.jpg"):
		return True
	else:
		return False
 
def download_artwork(artist, album, dest_filename, all_images=False):
 
	rhapsody_uri = "http://feeds.rhapsody.com"
	url = "%s/%s/%s/data.xml" % (rhapsody_uri, artist, album)
	url = url.replace(" ", "").replace("'", "").replace("&","")
	request = urllib2.Request(url)
	opener = urllib2.build_opener()
 
	try:
		body = opener.open(request).read()
		xml = ElementTree.fromstring(body)
		imgs = xml.getiterator("img")
	except:
		return False
 
	imglist = [im.attrib['src'] for im in imgs if im.attrib['src']]
	# Couldn't find any images
	if not imglist:
		return False
 
	if not all_images:
		urllib.urlretrieve(imglist[-1], dest_filename)
		return True
 
if m.status()['state'] == 'stop':
	pass
else:
	artist = m.currentsong()['artist']
	album = m.currentsong()['album']
	desc_filename = covers_dir + "%s - %s.jpg" % (artist, album)
 
	if os.path.exists(current_art_alb):
		cur_art_alb = open(current_art_alb, 'r').readline()
		cur_art_alb.strip('\n')
 
		if cur_art_alb == '%s - %s' % (artist, album):
			#ten sam album nic nie rób
			pass
		else:
			#sprawdź czy już istnieje tak okładka
			if find_local_artwork(artist, album):
				#plik już istneje tylko przekopiuj
				shutil.copy(covers_dir + "%s - %s.jpg" % (artist, album), current_cover)
 
				#zapisz aktulany artist album
				write_current_art_album(artist, album)
			else:
				#zapisz aktualny artist album
				write_current_art_album(artist, album)
 
				#ściągnij i przekopiuj
				if download_artwork(artist, album, desc_filename):
					shutil.copy(covers_dir + "%s - %s.jpg" % (artist, album), current_cover)
				else:
					open(current_cover, 'w').write('')
	else:
		#zapisz aktulany artis album
		write_current_art_album(artist, album)
 
		#nie istnieje - ściągnij - przekopuj jako current cover
		if find_local_artwork(artist, album):
			#plik już istneje tylko przekopiuj
			shutil.copy(covers_dir + "%s - %s.jpg" % (artist, album), current_cover)
		else:
			#ściągnij i przekopiuj
			if download_artwork(artist, album, desc_filename):
				shutil.copy(covers_dir + "%s - %s.jpg" % (artist, album), current_cover)
			else:
				open(current_cover, 'w').write('')

Skrypt zapisałem do /usr/local/bin (nadając prawa do uruchamiania). Pamiętajcie o odpowiednich importach dla pythona.
Wykorzystałem dwie instancję conky. Jedna do wyświetlania tylko opisu tego  co jest grane. Druga tylko do wyświetlania okładki album. Chciała uzyskać efekt – opis wyświetlany jest po lewej stronie okładki a samo conky wyświetlane jest w prawym dolnym rogu. Nie znalazłem sposobu na wyświetlenie tego efektu z wykorzystaniem tylko jednej instancji conky, chyba że wykorzystując LUA ale niestety jeszcze nie zgłębiłem tematu.

conkyrc_mpd (wymagany font Engebrechtre)

#opcje

use_xft yes
font Engebrechtre:size=10
override_utf8_locale yes
uppercase no

update_interval 2
music_player_interval 2

text_buffer_size 512

total_run_times 0

background yes
own_window yes
own_window_type override
own_window_transparent yes
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
double_buffer yes

draw_shades no
draw_outline no
draw_borders no
draw_graph_borders no

#minimum_size 300 5

default_color FFFFFF
default_shade_color black
default_outline_color black

alignment bottom_right
gap_x 220
gap_y 65

no_buffers yes

mpd_host localhost

imlib_cache_size 0
#
TEXT
${if_mpd_playing}${font Engebrechtre:size=30}${alignr}${mpd_title}${font}
${font Engebrechtre:size=24}${alignr}${voffset 10}${mpd_artist}${font}
${font Engebrechtre:size=18}${alignr}${voffset 10}${mpd_album}${font}
${font Engebrechtre:size=12}${alignr}${voffset 20}${mpd_status}${font}${endif}

conkyrc_mpd_cover

#opcje 

use_xft yes
font Engebrechtre:size=10
override_utf8_locale yes
uppercase no 

update_interval 2
music_player_interval 2

text_buffer_size 512

total_run_times 0

background yes
own_window yes
own_window_type override
own_window_transparent yes
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
double_buffer yes

draw_shades no
draw_outline no
draw_borders no
draw_graph_borders no

minimum_size 200 200

default_color FFFFFF
default_shade_color black
default_outline_color black

alignment bottom_right
gap_x 10
gap_y 50

no_buffers yes

mpd_host localhost

imlib_cache_size 0
#
TEXT
${if_mpd_playing}
${image /home/daniel/.conky_picture/mpd_conky_back.png -p 1,1 -s 198x198}${image /home/daniel/.covers_conky/current_cover.jpg -p 26,26 -s 150x150}${execpi 10 mpd_cover.py}${endif}

Tworzymy katalog o nazwie .covers_conky, w którym znajdować będą się ściągnięte już okładki oraz aktualna okładka. Katalog .conky_picture z ostatniego pliku konfiguracyjnego przetrzymuje tło dla wyświetlanej okładki.

Następnie uruchamiamy dwie instancje conky podając jako argumenty ścieżki do plików do tych plików konfiguracyjnych (np. conky -c ~/.conkyrc_mpd i conky -c ~/.conkyrc_mpd_cover).

W galerii znajdziecie także tła dla okładek. Przydają się, gdyż może się zdarzyć, że skrypt nie znajdzie okładki album. W takiej sytuacji gadżet wygląda mniej „pusto” :).

Zaktualizowałem skrypt python’a (03.06.2010).

A oto efekt:

Miał być Debian jest Ubuntu…

Wpadłem na pomysł instalacji od zera systemów na dwóch komputerach.  Na stacjonarce Ubuntu 9.04 poczęło zwalniać niemiłosiernie podczas startu (podejrzewałem Gnoma),  innych problemów nie było.  System był aktualizowany od wersji 7.04. Laptop posiadał Ubuntu 8.04 stawiane z alfy o numerze 6. Ogólnie, w użytkowaniu nie było problemów oprócz wolnego startu samego Ubuntu.  Podczas procesu instalacji na stacjonarce postanowiłem także zreorganizować partycję na dysku.

Podczas rozważań na temat wyboru systemu rozważałem tylko Debiana i Ubuntu. Debiana zainstalowałem nawet na stacjonarnym. Pierwsza próba update’u z wersji stabilnej do niestabilnej (sid) nie powiodła się. Druga próba tak. Następnie mała wstępna konfiguracji i … mi się odechciało. Nie wiem czym to było spowodowane (gdybym wtedy wiedział  co mnie czeka z Ubuntu…), może brakiem możliwości usypiania komputera (brak również w out-of-the-box w Ubuntu), dziwnym zachowaniem systemu jako całości (występuje także w Ubuntu). Bałem się także Debiana na laptopie (Toshiba L40) ale pewnie niepotrzebnie (strach też jest w Ubuntu). Tak więc postawiłem wszędzie Ubuntu 10.04 … i się zaczęło szok, płacz, krew i łzy szczęścia jak udało mi się jako tako poskładać ten system do kupy i zmusić do działania tak jak chciałem.

Drugi raz stawiam LTS (raz na laptopie) i drugi raz mam takie jazdy … Teraz trzymam się zasady „NIGDY WIĘCEJ AKTUALNEJ WERSJI UBUNTU – TYLKO – JEDNA WERSJA WSTECZ”.

Chromium i java.

Jeżeli macie problem z javą i chromium na Ubuntu 9.04 (aplety się nie odpalają, w about:plugins jej nie widać), należy dowiązać symbolicznie bibliotekę z libnpjp2.so (oczywiście mając poprawnie zainstalowaną java od sun’a) do katalogu chromium (/usr/lib/chromium-browser/plugins).
W terminalu wydajemy polecenie:

sudo ln -s /usr/lib/jvm/java-6-sun/jre/lib/i386/libnpjp2.so /usr/lib/chromium-browser/plugins/

Teraz możemy cieszyć się java w google chrome.

Porządki …

Dziś postanowiłem zrobić porządki w moich projektach. Zabawa ze starymi ustawieniami Bazaar’u o mało co nie doprowadziła mnie do białej gorączki. No cóż jak człowiek nie wiedział co robi a później próbuje to odkręcić to się męczy.

Paczki w moim repozytorium PPA będą tylko utrzymywane dla ostatniego wydania Ubuntu LTS oraz dla ostatniego normalnego wydania. W sumie to żaden problem bo programy pisane są tylko w Python’ie i spokojnie można mieszać repozytoria.

Pidgin i Conky

Skrypt pidgin_buddies.py, który napisałem, umożliwia wyświetlanie kontaktów online z Pidgin’a w Conky. Skrypt wyświetla aktywne kontakty z podziałem na konta. Kolejność wyświetlania kont można zmienić edytując skrypt – jest to opisane w samym skrypcie.

Najnowszą wersję skryptu, można pobrać z tej strony.

Pobrany skrypt zapisujemy. Edytujemy plik .conkyrc dopisując linijkę:

${texeci 15 /scieżka/do/skryptu/pidgin_buddies.py}

Zamiast texeci możemy użyć dowolnego polecenia Conky do czasowego uruchamiania zewnętrznych programów. Można także zmienić czas co jaki ma być uruchamiany skrypt – tu 15 sekund (pierwsza liczba po texeci). Jeżeli wyświetlane dane były by ucięte należy zwiększyć bufor tekstu dla Conky ustawiając bądź zmieniając parametr text_buffer_size na większy.

Skrypt napisany jest w Python’ie.

UPDATE
Dodano obsługę wyświetlania aktywnych rozmów.

Zrzut z Conky:

pidgin_buddies

XBMC i napisy.

Niestety okazało się, że XBMC – kompilowany z cvs – ma jeszcze jeden mały błąd dotyczący napisów. Nie potrafi wyświetlić naraz 3 lub więcej linijek na ekranie dla napisów w formacie MicroDVD, MPL2(oprócz kompletnego braku obsługi formatu TMPlayer). Natomiast dla formatu SubRIP napisy o trzech lub więcej liniach są wyświetlane poprawnie. Więc jak już konwertować napisy do filmów dla XBMC to na format SubRIP. Oczywiście możecie skorzystać z gKonap aby to osiągnąć :)

gKonap wersja 0.5.0

Dziś udostępniłem paczki deb nowej wersji gKonap. W wersji tej najważniejszą zmianą jest dodanie funkcji ściągania napisów do filmów z wykorzystaniem serwisu Napiprojekt. Dodano możliwość obsługi argumentów z linii poleceń, co ułatwia integracje z np Nautilusem. Dodano obsługę wielu plików, katalogów oraz katalogów wraz z podkatalogami tak dla ściągania napisów jak i dla konwersji napisów.
Więcej informacji znajduje się tu

Instalacja PostgreSQL 8.3 w Ubuntu 8.04

Poradnik ten jest kompilacją trzech anglojęzycznych stron:

  1. Install PostgreSQL on Ubuntu 8.04 at hocuspokus
  2. PostgreSQL – Community Ubuntu Documentation
  3. PostgreSQL

UWAGA:
Jeżeli podczas korzystania z tego przewodnik pojawiają się błędy to spróbujcie zastąpić we wszystkich miejscach frazę

sudo su

tym

su -u

Mi działa w postaci oryginalnej lecz podobno fraza sudo su jest nieprawidłowa i może powodować błędy.

Zaczynamy od instalacji podstawowych pakietów:

$ sudo apt-get update
$ sudo apt-get install postgresql postgresql-client postgresql-contrib
$ sudo apt-get install pgadmin3

Mamy zainstalowaną bazę danych – klient/serwer, kilka przydatnych skryptów oraz pgAdmin z interfejsem graficznym do zarządzania bazą.
Następnie musimy zmienić hasło konta administratora – ‚postgres’ – na serwerze bazy danych. Należy użyć poniższych komend zamieniając ‚hasło’ na hasło jakie chcecie nadać dla tego konta:

$ sudo su postgres -c psql
postgres=# ALTER USER postgres WITH PASSWORD 'hasło';
postgres=# \q

‚postgres=#’ jest to znak zachęty klienta bazy PostgreSQL i nie należy go kopiować i wstawiać do konsoli. Te zmiany wpływają tylko na hasło dostępowe do bazy dla użytkownika ‚postgres’ (administratora). Musimy także zmienić hasło dla użytkownika ‚postgres’ w naszym ulubionym systemie *nix’owym. Najpierw kasujemy hasło użytkownika i następnie nadajemy mu nowe hasło:

$ sudo passwd -d postgres
$ sudo su postgres -c passwd

Hasło może być oczywiście takie samo jak użyte wcześniej.

Od tej pory możemy używać pgAdmin3 z graficznym interfejsem użytkownika bądź konsoli (jako użytkownik postgres) do zarządzania bazą danych. Przed użyciem pgAdmin3 należy ustawić dla bazy PostgreSQL admin pack’a aby cieszyć się lepszym monitorowaniem bazy oraz lepszymi logami:

$ sudo su postgres -c psql < /usr/share/postgresql/8.3/contrib/adminpack.sql

Aby móc używać naszej bazy zdalnie musimy otworzyć nasz serwer na odrobinę świata. Jeżeli chcesz tylko używać serwera lokalnie możesz pominąć te kroki.
Naszym ulubionym edytorem edytujemy plik postgresql.conf:

$ sudo gedit /etc/postgresql/8.3/main/postgresql.conf

W sekcji ‚Connections and Authentication’ zmieniamy:

#listen_addresses = 'localhost'

na

listen_addresses = '*'

oraz

#password_encryption = on

na

password_encryption = on

Zapisujemy i wychodzimy.
Ostatni krok to zdefiniowanie kto może się połączyć z naszym serwerem. Edytujemy plik pg_hba.conf:

$ sudo gedit /etc/postgresql/8.3/main/pg_hba.conf

Zawartość pliku komentujemy bądź usuwamy (ewentualnie zmieniamy) i wklejamy następujący wpis.

# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database
# super user can access the database using some other method.
# Noninteractive
# access to all databases is required during automatic maintenance
# (autovacuum, daily cronjob, replication, and similar tasks).
#
# Database administrative login by UNIX sockets
local   all         postgres                          ident sameuser
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
 
# "local" is for Unix domain socket connections only
local   all         all                               md5
# IPv4 local connections:
host    all         all         127.0.0.1/32          md5
# IPv6 local connections:
host    all         all         ::1/128               md5
 
# Connections for all PCs on the subnet
#
# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD
host    all         all         [adres ip]          [maska podsieci]  md5

W ostatniej linii wpisujemy maskę naszej podsieci (np. 255.255.255.0 – dane możemy uzyskać z naszego rutera) oraz ip komputera np. 192.168.2.4, który będzie mógł korzystać z naszego serwera. Nic nie stoi na przeszkodzie podanie zamiast jednego adresu ip zakresu adresów (dodanie 0 na końcu adresu ip) ip np. 192.168.2.0 pozwoli na połączenia komputerów o ip 192.168.2.X.

Następnie pozostaje nam tylko restart serwera PostgreSQL:

$ sudo /etc/init.d/postgresql-8.3 restart

Całość powinna działać.

Po instalacji baza PostgreSQL będzie startować razem z systemem. Jeżeli to rozwiązanie nam się nie podoba i chcemy wyłączyć start serwer wraz z systemem, należy:
jeżeli mamy zainstalowany program sysv-rc-conf:

sudo sysv-rc-conf

odznaczmy X z poszczególnych poziomów startu systemu. Gdy chcemy aby serwer startował wraz z systemem zaznaczmy X’ami poziomy 2,3,4,5. Jeżeli nie mamy sysv-rc-conf to … polecam jego instalację:

sudo apt-get update
sudo apt-get install sysv-rc-conf

Jeżeli chcemy dokładniej kontroli na startem aplikacji uruchamiamy sysv-rc-conf z parametrem p:

sudo sysv-rc-conf -p

Tworzenie nowej bazy danych:

$ sudo su postgres -c createdb moja_baza

Logowanie do bazy ‚moja_baza':

sudo su postgres -c psql moja_baza

Instalacja dokumentacji dla PostgreSQL 8.3:

sudo apt-get install postgresql-doc-8.3

Aby dotrzeć do dokumentacji wklej do przeglądarki to:

file:///usr/share/doc/postgresql-doc-8.3/html/index.html

Dalsza lektura/zasoby:
Strona PostgreSQL (ang)
Strona PostgreSQL.org.pl
pgAdmin3
PostgreSQL na wikipedii (pl)
PostgreSQL na wikipedii (en)
Practical PostgreSQL (O’Reilly Unix) (en)
PostgreSQL: Introduction and Concepts (en) – dostępna także jako pdf w sieci.
SQL – wikipedia (pl)
SQL – wikipedia (en)