Bonjour,
voilà je voulais vous présenter un petit script que je viens de faire (mon 1er en python 😉), qui permet simplement de prendre une image au hasard sur deviantArt, parmi les catégories de son choix, et de l'appliquer en fond d'écran. Celà fonctionne sous Gnome.
Historique des versions
* 0.22 : Encore une correction due à un changement sur deviantArt :rolleyes: (merci tiblebaro !)
* 0.21 : Correction due à un changement de structure du site deviantArt
* 0.2 : Création du répertoire de destination s'il n'existe pas
Installation
On commence par faire un copier-coller du code (plus bas dans ce post) afin de l'enregistrer sur le disque disque, par example dans un fichier que l'on appelle
deviantArt.py.
Utilisation
On lance le script avec la commande
./devantArt.py
et la fenêtre suivante apparait :
- On clique sur "Rafraichir les catégories", et hop, on obtient la listes des catégories de fonds d'écran disponibles.
- On décoche les catégories qui ne nous interessent pas.
- Et enfin, un clic sur "Télécharger un fond d'écran" pour télécharger et appliquer un fond au hasard parmis les catégories sélectionnées.
Les fichiers sont téléchargés par défaut dans le répertoire
~/wallpapers, mais ça se change facilement dans le script. A noter que le nom original des images est conservé, et que le fichier ne sont
pas supprimés par le script, donc à vous de faire le ménage de temps en temps 😉
En ligne de commande
Il est également possible de lancer le script avec le paramètre "-set" :
./deviantArt.py -set
Là, deux possibilités :
- Soit on a fais une sélection de catégories auparavent => une images est téléchargée dans une de ces catégorie, au hasard
- Soit on a pas fait de sélection; dans ce cas, la catégorie est aléatoire parmis toutes celles disponibles
Et un fond est automatiquement téléchargé et appliqué.
Automatisation
Il y a plusieurs manières d'automatiser le changement automatique de fond d'écran.
Par example, je me suis créer un raccourci sur un de mes panel, comme ceci :
Ensuite, un clique sur l'icône, et un nouveau fond est appliqué 😉
Pour vraiment automatiser le changement, on peut utiliser cron, avec la commande
crontab -e
Par example, moi j'ai ajouté la ligne suivante, qui appel le script toute les 15 minutes :
0/15 * * * * /home/ludo/workspace/deviantArt/src/deviantArt.py -set
Et voilà ! Toute les 15 min j'ai un nouveau fond, et si un ne me plait vraiment pas, je clic sur l'icône de mon panel pour rechanger !
Le script
deviantArt.py :
#! /usr/bin/python
# -*- coding: UTF-8 -*-
from sgmllib import SGMLParser
import random
import gobject
import sys
import urllib
import urllib2
import os
import commands
import re
if not '-set' in sys.argv:
import gtk
version = '0.22'
path = os.path.expanduser( '~/wallpapers/' )
retries = 3
class URLLister( SGMLParser ):
def reset( self ):
SGMLParser.reset( self )
self.urls = []
def start_a( self, attrs ):
href = [v for k, v in attrs if k == "href"]
if href:
self.urls.extend( href )
class Error( Exception ):
def __init__( self, value ):
self.value = value
def __str__( self ):
return `self.value`
class WPManager:
def get_urls( self, url ):
parser = URLLister()
parser.feed( self.open_url( url ) )
return parser.urls
def open_url( self, url ):
print 'Ouverture de %s' % url
try:
sock = urllib2.urlopen( url )
except:
raise Error( "Erreur d'ouverture de %s " % url )
html = sock.read()
sock.close()
return html
def get_categories_list( self ):
print 'Lecture des catégories'
html = self.open_url( 'http://browse.deviantart.com/customization/wallpaper/' )
p = re.compile('customization/wallpaper/\w+')
return [cat.split('/')[-1] for cat in p.findall(html)]
def get_images_list( self, cat ):
print 'Lecture de la liste des images disponibles'
urls = self.get_urls( 'http://browse.deviantart.com/customization/wallpaper/%s/' % cat )
return [url.split( '/' )[-2] for url in urls if url.startswith( 'http://www.deviantart.com/deviation/' ) and url.split( '/' )[-2] not in locals()['_[1]'] ]
def download_image( self, index ):
if not os.path.exists( path ):
try:
os.makedirs(path)
except OSError:
raise Error("Impossible de créer le répertoire %s. Vérifier vos droits d'écriture" % path)
html = self.open_url('http://www.deviantart.com/view/%s/' % index)
pos = html.find( '"src"' )
pos2 = html.find( 'http', pos )
pos3 = html.find( '.jpg', pos2 )
image_url_temp = html[pos2:pos3+4]
image_url = image_url_temp.replace( '\/' ,'/')
image_name = image_url.split( '/' )[-1]
print 'Téléchargement du fichier %s' % image_url
try:
urllib.urlretrieve( image_url, path + image_name )
except:
raise Error ( "Erreur de téléchargement du fichier %s" % image_url )
print 'Fichier enregitré dans %s' % path
return image_name
def set_image_as_background( self, image_name ):
commands.getstatusoutput( "gconftool-2 -t string -s /desktop/gnome/background/picture_filename '%s%s'" % ( path, image_name ) )
def apply_random_image( self, categorie=None ):
ret = False
try:
if categorie == None:
categories_list = categories_list = self.get_categories_list()
rnd = random.randint( 0, len( categories_list ) - 1 )
categorie = categories_list[rnd]
images_list = self.get_images_list( categorie )
rnd = random.randint( 0, len( images_list ) - 1 )
image_name = self.download_image( images_list[rnd] )
except Error, e:
print e.value
#except:
# print 'Erreur inconnue'
else:
ret = True
self.set_image_as_background( image_name )
return ret
class MainWindow:
def delete_event( self, widget, event, data=None ):
try:
f = open( '%s.wallpaper' % path, 'w' )
f.write ( ";".join( ["%s=%s" % ( k, v ) for k, v in self.store] ) )
f.close()
except:
print "Erreur lors de l'écriture du fichier %s.wallpaper" % path
gtk.main_quit()
return False
def __init__( self ):
window = gtk.Window( gtk.WINDOW_TOPLEVEL )
window.set_default_size( 300, 500 )
window.set_title( "Wallpaper %s" % version )
window.connect( "destroy", lambda w:gtk.main_quit() )
window.connect( "delete_event", self.delete_event )
self.store = gtk.ListStore( gobject.TYPE_STRING, gobject.TYPE_BOOLEAN )
self.store.set_sort_column_id( 0, gtk.SORT_ASCENDING )
column1 = gtk.TreeViewColumn( 'Catégories', gtk.CellRendererText(), text=0 )
column2 = gtk.TreeViewColumn( 'Inclure', gtk.CellRendererToggle(), active=1 )
list = gtk.TreeView( self.store )
list.set_rules_hint( 1 )
list.set_vadjustment( gtk.Adjustment() )
list.append_column( column1 )
list.append_column( column2 )
column2.get_cell_renderers()[0].set_property( "activatable", True )
column2.get_cell_renderers()[0].connect( 'toggled', self.toggle_value, list.get_model() )
ok_button = gtk.Button( "Télécharger un fond d'écran" )
ok_button.connect( "clicked", self.ok, None )
refresh_button = gtk.Button( 'Rafraichir les catégories' )
refresh_button.connect( "clicked", self.refresh_categories, None )
scrollwindow = gtk.ScrolledWindow()
scrollwindow.set_policy( gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC )
scrollwindow.add( list )
box = gtk.VBox( False, 0 )
box.pack_start( refresh_button, False, True )
box.pack_start( scrollwindow, True, True )
box.pack_start( ok_button, False, True )
window.add( box )
window.show_all()
self.wp_manager = WPManager()
data = read_data_file()
for cat in data:
self.store.append( cat )
gtk.main()
def refresh_categories( self, widget, data=None ):
self.store.clear()
try:
categories_list = self.wp_manager.get_categories_list()
except Error, e:
print e.value
except :
print 'Erreur inconnue'
else:
for cat in categories_list:
self.store.append( [cat, True] )
def ok( self, widget, data=None ):
selected_categories = [row[0] for row in self.store if row[1]]
if len( selected_categories ) > 0:
rnd = random.randint( 0, len( selected_categories ) - 1 )
categorie = selected_categories[rnd]
i = 0
while not self.wp_manager.apply_random_image( categorie ) and i < retries:
print 'Retrying...'
i += 1
def toggle_value( self, cell, path, model ):
model[path][1] = not model[path][1]
def read_data_file():
try:
f = open( '%s.wallpaper' % path, 'r' )
data = [(lambda k: [k[0], k[1] == 'True'])(cat.split('=')) for cat in f.read().split( ';' )]
f.close()
return data
except:
return []
if __name__ == '__main__':
if '-set' in sys.argv:
categorie = None
data = read_data_file()
categories_list = [cat[0] for cat in data if cat[1]]
if len( categories_list ) > 0:
rnd = random.randint( 0, len( categories_list ) - 1 )
categorie = categories_list[rnd]
i = 0
while not WPManager().apply_random_image( categorie ) and i < retries:
print 'Retrying...'
i += 1
sys.exit()
MainWindow()