Хотелось бы услышать конструктивную критику. Какие у меня принципиальные ошибки, если таковые имеются. Ну и вообще какие недочеты.
О скрипте. Скачивает картинку с сайта www.wallpapperlinux.com и устанавливает в качестве обоины рабочего стола.
Пока, работает только в среде Gnome. Тестировал на Debian Squeeze и Ubuntu Karmic
Дополнительные пояснения. Опытным путем было установленно что почти все (а может и все) картинки хранятся на сайте по адресу:
http://www.wallpaperlinux.com/main.php?g2_view=core.DownloadItem&g2_itemId= ANY_NUMBER
, где изменяется только парамет g2_itemId. Диапазон значений примерно от 0 до 7000.
Так Хранятся не только сами картинки, но и превьюшки. Логику значений цифр для превьюшек и полных картинок вычислить не удалось, поэтому решил действовать другими методами.
#!/usr/bin/python
# coding: utf-8
import urllib2
import random
import Image
import StringIO
import os
import subprocess
MAX_CONNECT_ATTEMPT = 100 #максимальное количество попыток соединения с хостом
class WallPapper:
def __init__(self):
self.url = "http://www.wallpaperlinux.com/main.php?g2_view=core.DownloadItem&g2_itemId=" #основной урл до обоины. Не хватает только рандомного числа
self.error_url_counter = 0
def get_url(self):
"""отдает урл до изображения"""
self.rand = str(int(random.random()*7000)) #rand потом будет использоваться в имени файла. 7000 - потому что id-шники разбросаны примерно в этом диапазоне
return self.url + self.rand
def image_loader(self):
"""пытается загрузить изображение. return StringIO object"""
flag = False
while not flag: # пытаемся загрузить указанный урл столько раз, сколько указано в MAX_CONNECT_ATTEMPT
try:
url = self.get_url()
print url
str_im = urllib2.urlopen(url);
print "url - OK"
flag = True
except IOError:
print "url - ERROR"
self.error_url_counter +=1
if self.error_url_counter > MAX_CONNECT_ATTEMPT: #чтобы не уходить в бесконечный цикл, если нет соединения с интернетом, то завершаем программу"""
print 'network problem or host is unavailable'
return False
return StringIO.StringIO(str_im.read())
def image_saver(self):
"""сохраняет изображение, if image.size > 1024"""
#пытаемся открыть изображение из объекта StringIO, пока не будут удовлетворены все требования (size>1024, ...)
flag = False
while not flag:
try:
image = self.image_loader()
if not image: return False # если урл адрес так и не был открыт, то прекращаем работу программы
image = Image.open(image)
if image.size > (1024,0): flag = True
except IOError:
print "не удалось открыть изображение"
path = os.getcwd()
os.chdir(path)
try:
os.mkdir('images')
except OSError:
os.chdir('images')
image_name = self.rand + '_img.jpg'
print image_name
image.save(image_name)
# эта стока добавляет скачанную обоину на рабочий стол
# строка для гном. Можно использовать альтернативу, например "feh -bg что то там"
# TODO кроссплатформенность
cmd = "gconftool-2 --type string --set /desktop/gnome/background/picture_filename " + os.getcwd() + "/" + image_name
print cmd
subprocess.Popen(cmd, shell = True)
picture=WallPapper()
picture.image_saver()
Так же добавил кнопку для скрипта на панель gnome. Если обоина не понравилась, то можно легко сменить, нажатием собственно на эту кнопку.
pps. Смена обоины при автозагрузке не работает, если машина смотрит в сеть через WIFI (скрипт запускается раньше, чем успевает подключиться wifi)