Archiwa kategorii: Python

Nowe paczki dla Ubuntu 12.04 plus nowe repo dla precise

Dziś w moim PPA wylądowały nowe paczki dla gKonap, burnX360 oraz NSCheckd dla Ubuntu 12.04. Tym samym w PPA znalazło się nowe repozytorium dla Precise’a. Soft nawet działa :).
W burnX360 został wyeliminowany śmieszny bug polegający na zostawieniu #!/usr/bin/env python2.6, no cóż nikt nie jest idealny.

Miłego użytkowania. Jak podoba Ci się moje oprogramowanie, nie zapominaj, możesz przekazać darowiznę :) . Z góry dziękuję.

Nowe repozytoria, GIT, nowy burnX360 …

Nowe repozytoria dla Ubuntu.

Dziś wyszły paczki gKoNap, Nscheckd orz burnX360 dla nowych wersji Ubuntu do 11.04. Dodawanie repozytoriów opisane jest tu.

GIT

Postanowiłem zmienić system kontroli wersji z Bazaar na GIT. Powoli będę przenosił hostowanie kodu z Lauchpad.net(Bazaar) na GitHub’a. Mój profil na GitHub’ie – yp2. Pomimo zalet Lauchpad.net – bugtracker, tłumaczenia, prywatne repozytoria – muszę zrezygnować z hostowania w nim kodu. Git jest o wiele bardziej przyjemny, przyjazny i zabawniejszy w pracy niż Bazaar.

Nowa wersja burnX360

Pojawiła się także nowa wersja 0.2 programu burnX360 do nagrywania kopi zapasowych dla konsoli Xbox 360. Dodano obsługę kopi w formacie XGD3 na razie tylko z wykorzystaniem przycinania obrazu (truncate) – nie wymagana jest nagrywarka z fw. LT-MAX. Planuje także wprowadzić obsługę nagrywarek z LT-MAX dla XGD3.

Daemon NSCheckd.

Z potrzeby chwili napisałem małego daemona odpowiedzialnego za montowanie bądź odmontowywanie zasobów sieciowych w oparciu o dostępność hostów. Program obsługuje nfs, nfs4, smb(samba), cifs. Wszystkie zdalne zasoby muszą mieć wpisy w pliku /etc/fstab. Zapraszam do zapoznania się z programem. Dokładny opis i sposób instalacji można znaleźć tu.

Nowa wersja gKonap.

W nowej wersji gKonap poprawiłem mechanizm odczytywania framerate’u plików wideo – użyłem modułu kaa.metadata. Teraz gKonap odczytuje listy fps z plików mkv.

Dodałem także, na prośbę użytkownika, zamianę znaczników odpowiadających za kursywę w wyświetlanych napisach na format zrozumiały dla XBMC. Na razie opcja ta działa tylko przy konwersji z jednego formatu na drugi. W planach mam przepisanie konwersji formatów napisów, tak by pozwala na zamianę znaczników, nawet wtedy gdy format plików docelowego jest taki sam jak format pliku wejściowego. Oczywiście tylko przy zaznaczonej odpowiedniej opcji.

Zapraszam do testowania.

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:

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