Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 6, 2011 00:05:19

RMNX.rc
От:
Зарегистрирован: 2011-01-05
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Рандомные обои с сайта www.wallpapperlinux.com

Мой первый скрипт на python.
Хотелось бы услышать конструктивную критику. Какие у меня принципиальные ошибки, если таковые имеются. Ну и вообще какие недочеты.

О скрипте. Скачивает картинку с сайта 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()
ps. добавил себе этот скрипт в автозагрузку, теперь при загрузке системы всегда новая обоина.
Так же добавил кнопку для скрипта на панель gnome. Если обоина не понравилась, то можно легко сменить, нажатием собственно на эту кнопку.
pps. Смена обоины при автозагрузке не работает, если машина смотрит в сеть через WIFI (скрипт запускается раньше, чем успевает подключиться wifi)



Отредактировано (Янв. 6, 2011 00:10:07)

Офлайн

#2 Янв. 6, 2011 08:27:53

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Рандомные обои с сайта www.wallpapperlinux.com

Денис, ты? :))))



Офлайн

#3 Янв. 6, 2011 11:33:45

RMNX.rc
От:
Зарегистрирован: 2011-01-05
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Рандомные обои с сайта www.wallpapperlinux.com

igor.kaist
Денис, ты? :))))
нет не я.
То бишь это не Денис :)



Офлайн

#4 Янв. 6, 2011 21:31:20

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Рандомные обои с сайта www.wallpapperlinux.com

RMNX.rc
нет не я.
То бишь это не Денис :)
Сорри, вырвалось…. Нескучные обои, ubuntu…. :)



Офлайн

#5 Янв. 7, 2011 10:03:41

RMNX.rc
От:
Зарегистрирован: 2011-01-05
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Рандомные обои с сайта www.wallpapperlinux.com

Шутку понял. Но всеж таки Debian. (Ubuntu на работе).



Офлайн

#6 Янв. 7, 2011 20:04:28

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Рандомные обои с сайта www.wallpapperlinux.com

RMNX.rc
Хотелось бы услышать конструктивную критику.
Для начала читайте здесь http://www.python.org/dev/peps/pep-0008/ и здесь: http://www.artima.com/weblogs/viewpost.jsp?thread=4829
Делайте apt-get install pylint и доведите его оценку вашего кода до 9 хотя бы.

Теперь по коду:
- Присваивание и использование self.rand выглядит непонятно. Если он вам нужен, то просто верните его из get_url.
- self.url выглядит как константа - шаблон для подстановки туда некоего значения. Такому не место в __init__
- выкрутасы с flag = False, while not flag - это не Питон. Используйте while True и break. Кода будет меньше и он будет понятнее.
- Функционал даунлоадинга и установки обоев неплохо бы разнести по разным классам/функциям.
- StringIO - оверкил. Просто возвращайте ваш файловый объект str_im - это то, что хочет Image.open.
- Попробуйте убрать зависимость на конкретный сайт с обоями. По крайней мере постарайтесь сделать так, чтобы при смене сайта не нужно было бы менять много кода.

Будут вопросы - спрашивайте

PS:
try:
os.mkdir('images')
except OSError:
os.chdir('images')

читается так: Если не смогли создать ‘images’, то переходим в него, что логически неверно. Для проверки существования дирьки лучше использовать os.path.isdir.

Как-то очень мудрено все с сохранением. По идее нужно просто позвать image.save с нужным именем в существующем месте. Зачем все эти getcwd и chdir непонятно.

Вообще такое ощущение, что это все можно написать намного короче и понятнее. Если найдете в себе силы последовать рекомендациям, то так в результате и будет. Я помогу.

Удачи!



Отредактировано (Янв. 7, 2011 20:15:22)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version