#1 Le 31/07/2006, à 21:36
- tinkywinky
Téléchargement automatique de fonds d'écran sur deviantArt
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 (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()
Dernière modification par tinkywinky (Le 08/08/2006, à 19:20)
Dell XPS M1710, Core 2 Duo 2.16 Ghz, 1 Go RAM, NVidia 7900 GTX 512Mo (1.0.9755)
Debian Unstable, Kernel 2.6.21, KDE 3.5.6, Beryl SVN
Hors ligne
#2 Le 01/08/2006, à 02:28
- 109
Re : Téléchargement automatique de fonds d'écran sur deviantArt
En voilà une idée qu'elle est bonne ! Merci pour le script !
Lorsque vous avez la solution, n'oubliez pas de passer votre sujet en [Résolu]
Dernier blogbutiement : Brad Sucks sur Jamendo !
Hors ligne
#3 Le 01/08/2006, à 07:43
- tiblebaro
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Je vais tester ça. Un grand merci, c'est mon bureau qui va être content
Hors ligne
#4 Le 01/08/2006, à 08:21
- sidney_v
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Rho la bonne idée Merci, je prend
ps : il existe le même type de logiciel pour art.gnome.org
Membre de l'April - « promouvoir et défendre le logiciel libre » - www.april.org
Hors ligne
#5 Le 01/08/2006, à 08:49
- bbtgv
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Escusez mon ignorance, mais comment fait on pour le faire fonctionner ?
Edit, à trouvé en fesant une petite recherche rapide, pour les autres:
sudo python ./deviantArt.py
Dernière modification par bbtgv (Le 01/08/2006, à 08:55)
Portable: HP Compaq NX6110 avec Ubuntu Edgy.
Process: Intel Celeron 360 (1,4 GHz) - Mémoire: 256Mo DD-SDRAM -
Carte Graphique: Media Accelerator 900 (Chipset: Intel)
Koi de plus ..... Vive Linuxxxx
Hors ligne
#6 Le 01/08/2006, à 09:27
- ganlhi
Re : Téléchargement automatique de fonds d'écran sur deviantArt
pourquoi sudo ? ça doit marcher sans...
en tout cas très bonne idée
-- Ganlhi --
Hors ligne
#7 Le 01/08/2006, à 11:06
- tinkywinky
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Escusez mon ignorance, mais comment fait on pour le faire fonctionner ?
Ta commande est juste sauf que, comme l'a dit ganlhi, le "sudo" est inutile.
Sinon, oui je sais qu'il existe plein plein plein de script de changement de fond, cependant :
1) J'ai décidé de me mettre au python avant hier, et il fallait bien que je commence par quelque chose. Je me suis donc dit autant en faire profiter ceux que ça interesse
2) Mon script permet de choisir ses catégories préférées
Dernière modification par tinkywinky (Le 01/08/2006, à 11:10)
Dell XPS M1710, Core 2 Duo 2.16 Ghz, 1 Go RAM, NVidia 7900 GTX 512Mo (1.0.9755)
Debian Unstable, Kernel 2.6.21, KDE 3.5.6, Beryl SVN
Hors ligne
#8 Le 01/08/2006, à 11:17
- kezar
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Moi j'ai ce genre d'erreurs :
Erreur de téléchargement du fichier http://ic1.deviantart.com/fs11/i/2006/213/d/c/Soda_Shop_Romance_by_purplecowstudios.jpg
Erreur de téléchargement du fichier http://ic3.deviantart.com/fs11/i/2006/212/b/f/Flower_Box_by_DWALKER1047.jpg
Pas de wall chez moi pour le moment
Hors ligne
#9 Le 01/08/2006, à 11:38
- YS
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Dans le même cas que kezar.
En tout cas, très très bonne idée.
Aspirant couche-tard, à tendance otageek.
Hors ligne
#10 Le 01/08/2006, à 11:43
- tsensei
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Ce qui serait encore mieux ca serait de pouvoir choisir les dimensions du Wall
Hors ligne
#11 Le 01/08/2006, à 11:50
- tinkywinky
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Vous avez créer le rep "wallpapers" ? le script de le fait pas tout seul...
Dernière modification par tinkywinky (Le 01/08/2006, à 13:28)
Dell XPS M1710, Core 2 Duo 2.16 Ghz, 1 Go RAM, NVidia 7900 GTX 512Mo (1.0.9755)
Debian Unstable, Kernel 2.6.21, KDE 3.5.6, Beryl SVN
Hors ligne
#12 Le 01/08/2006, à 11:51
- hells_dark
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Interressant le script en tout cas,
Moi aussi, je commence le python.
L'apprentissage du langage en lui même n'est pas bien difficile.
Ce qui est plus dur, c'est de trouver les fonctions qui nous interesse dans les bibliothéques...:/
Comment as tu fait pour étudier les bibliothéques dont tu te sers ?
"You caught me at a strange time in my life."
devianArt - site perso
Hors ligne
#13 Le 01/08/2006, à 12:24
- bbtgv
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Vous avez créer le rep "wallpaper" ? le script de le fait pas tout seul...
Je l'ai fait avec un S à la fin, vu que dans ton script je l'ai vu avec un S.
Bref je retesterais dans la journée.
Portable: HP Compaq NX6110 avec Ubuntu Edgy.
Process: Intel Celeron 360 (1,4 GHz) - Mémoire: 256Mo DD-SDRAM -
Carte Graphique: Media Accelerator 900 (Chipset: Intel)
Koi de plus ..... Vive Linuxxxx
Hors ligne
#14 Le 01/08/2006, à 12:26
- tinkywinky
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Ben disons lorsque je commence un language, généralement je ne suis pas de tutoriaux Mais je me fixe un but. Là, c'était télécharger une image et l'appliquer.
Donc je procède par étape : je cherche sur google comment récupérer un fichier à partir d'une URL, ensuite comment parser un fichier HTML, ensuite comment gérer les arrays, etc.
Après j'ai voulu aujouter une fenêtre, donc j'ai cherché sur google, j'ai trouvé cette page : http://www.moeraki.com/pygtktutorial/pygtk2tutorial, et j'ai cherché parmi les examples ce dont j'avais besoin (créer une fenêtre, un bouton, une liste...).
ET voilà
En gros, mon tutorial, c'est google, en fonction de ce que je souhaite faire
Dell XPS M1710, Core 2 Duo 2.16 Ghz, 1 Go RAM, NVidia 7900 GTX 512Mo (1.0.9755)
Debian Unstable, Kernel 2.6.21, KDE 3.5.6, Beryl SVN
Hors ligne
#15 Le 01/08/2006, à 12:29
- kezar
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Nickel en effet, je n'avais pas le répertoire
Hors ligne
#16 Le 01/08/2006, à 12:55
- tinkywinky
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Ce qui serait encore mieux ca serait de pouvoir choisir les dimensions du Wall
Tu dis ne télécharger QUE ceux d'une certaine dimension, ou alors les redimensionner après le téléchargement ??
Dell XPS M1710, Core 2 Duo 2.16 Ghz, 1 Go RAM, NVidia 7900 GTX 512Mo (1.0.9755)
Debian Unstable, Kernel 2.6.21, KDE 3.5.6, Beryl SVN
Hors ligne
#17 Le 01/08/2006, à 13:16
- hells_dark
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Ben disons lorsque je commence un language, généralement je ne suis pas de tutoriaux Mais je me fixe un but.
Ouais, la meilleure façon de ne pas abandonner en route ça
"You caught me at a strange time in my life."
devianArt - site perso
Hors ligne
#18 Le 01/08/2006, à 14:01
- SamheG
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Très bonne idée en effet !
Hors ligne
#19 Le 01/08/2006, à 19:54
- Saelynh
Re : Téléchargement automatique de fonds d'écran sur deviantArt
ben pour les pythomanes ya sa si sa vous dit : http://www.cifen.ulg.ac.be/inforef/swi/python.htm
sa selection une taille de wall aussi ?
[ http://www.dogmazic.net/saelynh _ http://www.jamendo.com/fr/artist/saelynh/ ]
Hors ligne
#20 Le 01/08/2006, à 22:55
- hells_dark
Re : Téléchargement automatique de fonds d'écran sur deviantArt
ben pour les pythomanes ya sa si sa vous dit : http://www.cifen.ulg.ac.be/inforef/swi/python.htm
Yep, je l'ai déjà. Très bien d'ailleurs.
"You caught me at a strange time in my life."
devianArt - site perso
Hors ligne
#21 Le 02/08/2006, à 00:25
- SamheG
Re : Téléchargement automatique de fonds d'écran sur deviantArt
J'aime bien le :
Vous trouverez ci-dessous :
* une version librement téléchargeable de l'ouvrage "Apprendre à programmer avec Python"
de Gérard Swinnen, deuxième édition, publié aux éditions O'Reilly (ISBN 2-84177-299-3 )
* le code source des exemples et exercices proposés dans le livre
* Les diapositives et le code source des exemples présentés par G.Swinnen au colloque "Libr'East of Paris" (IUT de Marne-la-vallée) les 23 & 24 Avril 2004.
* Les diapositives de la conférence sur Python présentée à l'IUT de Vannes (Université de Bretagne Sud), le 15 Avril 2005.
* La traduction du livre en hongrois (miroir du site web du traducteur).
Hors ligne
#22 Le 02/08/2006, à 00:35
- SamheG
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Le programme me renvoie :
Erreur d'ouverture de http://wallpaper.deviantart.com/
Edit : Apparemment y'a un problème sur leur site
Dernière modification par SamheG (Le 02/08/2006, à 00:40)
Hors ligne
#23 Le 02/08/2006, à 00:56
- YS
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Ils ont peut-être une hausse de la consommation de BP en provenance des pays francophones depuis quelques heures dans les sections wallpapers.
Aspirant couche-tard, à tendance otageek.
Hors ligne
#24 Le 02/08/2006, à 01:29
- kezar
Re : Téléchargement automatique de fonds d'écran sur deviantArt
while [ ./deviantart_wallset.py ]; do ./deviantart_wallset.py -set;sleep 5; done
100Mo de récupérés tout à l'heure, après j'en ai eu marre
Hors ligne
#25 Le 02/08/2006, à 08:01
- bbtgv
Re : Téléchargement automatique de fonds d'écran sur deviantArt
Tiens ton script ne marche plus ???
quoi j'ai mal fait.
Hier il marchait tellement bien sur mon PC fixe, que j'ai voulu le mettre sur mon portable et là la deception, la nouvelle version ne marche plus
Voilà ce que j'obtiens:
python ./deviantArt.py -set
Erreur inconnue
Retrying...
Erreur inconnue
Retrying...
Erreur inconnue
Retrying...
Erreur inconnue
Retrying...
Erreur inconnue
Retrying...
Erreur inconnue
ça vient certainement de Deviant je vais attendre un peu avant de devenir fou.
Dernière modification par bbtgv (Le 02/08/2006, à 08:03)
Portable: HP Compaq NX6110 avec Ubuntu Edgy.
Process: Intel Celeron 360 (1,4 GHz) - Mémoire: 256Mo DD-SDRAM -
Carte Graphique: Media Accelerator 900 (Chipset: Intel)
Koi de plus ..... Vive Linuxxxx
Hors ligne