#1 Le 20/05/2010, à 11:27
- tahec
Script de téléchargement de fonds d'écrans (Interfacelift)
Bonjour,
Je me suis fait un petit script python pour télécharger automatiquement les nouveaux fonds d'écran disponibles sur InterfaceLift.
Je me sers du fil rss disponible a cette adresse: http://feeds.feedburner.com/Interfaceli … format=xml
Donc déja, le script:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
########## REGLAGES
# Résolutions à télécharger
resolutions=('1680x1050','1280x1024')
# Dossier du téléchargement
dossier='/home/bruno/Images/Wallpapers'
# bavard (0,1 ou 2: O=silencieux)
verbose=1
########## REGLAGES
from xml.dom.minidom import parse
import os
def printv(texte, v):
if v<=verbose:
print(texte)
def wgetv(url, v=verbose):
if v==0:
quiet='-q '
elif v==1:
quiet='-nv '
else:
quiet=''
os.system('wget --user-agent="cmon" '+quiet+url)
try:#On essaye d'acceder au dossier
if not os.path.isdir(dossier):
os.mkdir(dossier)
os.chdir(dossier)
except:#Si le dossier est inaccessible
printv("Impossible d'acceder ou de créer le dossier '"+dossier+"'",0)
else:#On est desormais dans le dossier
printv("Téléchargement de la liste des fichiers",2)
if os.path.isfile('InterfaceliftNewestWallpaper?format=xml'):
os.remove('InterfaceliftNewestWallpaper?format=xml')#On supprime l'ancien xml si besoin
wgetv('http://feeds.feedburner.com/InterfaceliftNewestWallpaper?format=xml',0)#Téléchargement du xml
doc = parse('InterfaceliftNewestWallpaper?format=xml')#'Ouverture' du xml
items = doc.getElementsByTagName('item')
for reso in resolutions:#Pour chaque résolution demandée
os.chdir(dossier)#On se (re)place dans le dossier
try:#On essaye d'acceder au dossier de la resolution
if not os.path.isdir(reso):
os.mkdir(reso)
os.chdir(reso)
except:#Si le dossier est inaccessible
printv("Impossible d'acceder ou de créer le dossier '"+reso+"'",0)
else:#On est desormais dans le dossier
printv('Resolution: '+reso,1)
nb=0
for item in items:#Pour chaque élement item
descri = item.getElementsByTagName('description')[0].firstChild.data# Le champ qui nous interesse est description
if descri.count(reso)>0:#Si ce fichier existe dans la resolution voulue
src = [c for c in descri.split() if c.count('src="http://interfacelift.com/wallpaper_beta/previews/')][0]
src = src.strip('src="http://interfacelift.com/wallpaper_beta/previews/')
src = src.strip('"')#On recupere le nom du fichier d'apercu
(nom, ext) = src.split('.')
nom = nom+'_'+reso
fichier = '.'.join((nom, ext))#On ajoute la résolution au nom du fichier
if not os.path.isfile(fichier):#Si le fichier n'existe pas
wgetv('http://interfacelift.com/wallpaper_beta/grab/'+fichier,2)
printv(fichier+u': téléchargé',1)#On télécharge l'image
nb += 1
else:#Le fichier existe déja
printv(fichier+u': passé (le fichier existe déjà)',2)
printv(str(nb)+' image(s) téléchargée(s)',1)
os.chdir(dossier)#On se (re)place dans le dossier
os.remove('InterfaceliftNewestWallpaper?format=xml')#On supprime le xml
A vous de régler le dossier cible, les résolutions souhaitées, etc
Maintenant, les précisions:
- Je ne suis expert ni en python, ni en bash. Ce script n'est pas parfait, n'a surement rien de parfait. Tout conseil ou remarque constructive sont donc les bienvenus
- A propos, je ne garantis qu'une chose: chez moi, sur ma machine, il fonctionne. Venez vous faire payer un café si vous voulez en être sûr, ou invitez moi pour me montrer si il fonctionne chez vous
- Blague à part, j'aimerais des retours, histoire d'en faire quelque chose d'utile
Veuillez agréer etc,
moi
PS: après toutes ces années à pomper ce forum, j'apporte mon gravillon à l'édifice... perso, je trouve ça émouvant
Hors ligne
#2 Le 20/05/2010, à 19:12
- Kanor
Re : Script de téléchargement de fonds d'écrans (Interfacelift)
Euh j'étais partie pour faire quelque motiv dans ton code mais au final j'ai changé pas mal de chose
#!/usr/bin/env python
# -*- coding: utf-8 -*-
########## REGLAGES
# Résolutions à télécharger
resolutions=('1680x1050','1280x1024')
########## REGLAGES
from xml.dom.minidom import parse
import os
import urllib
def get_value_tag(name_tag,root_tag):
tag = root_tag.getElementsByTagName(name_tag)
if tag:
tag = tag[0]
first_child = tag.firstChild
return None if not first_child else first_child.data
else:
return None
if __name__ == '__main__':
#Préparation des dossier
home_path = os.getenv("HOME")
dossier = os.path.join(home_path, "Images")
if not os.path.exists(dossier):
os.mkdir(dossier)
dossier = os.path.join(dossier, "Wallpapers")
if not os.path.exists(dossier):
os.mkdir(dossier)
for reso in resolutions:#Pour chaque résolution demandée
reso_path = os.path.join(dossier, reso)
if not os.path.isdir(reso_path):
os.mkdir(reso_path)
page = urllib.urlopen('http://feeds.feedburner.com/InterfaceliftNewestWallpaper?format=xml')
doc = parse(page)#'Ouverture' du xml
items = doc.getElementsByTagName('item')
nb=0
for item in items:
descri = get_value_tag('description', item )
if not descri:
continue
check_reso = [reso for reso in resolutions if reso in descri]
if check_reso:
title = get_value_tag('title', item)
guid = get_value_tag('guid', item)
print guid
if not(title and guid):
continu
title = title.lower().replace(' ','').replace('-','')
for reso in check_reso:
filename = '%s_%s_%s.jpg' %( [node for node in guid.split('/') if node][-1].rjust(5, '0'),
title,
reso)
file_path_save = os.path.join(dossier,reso, filename)
if not os.path.isfile(file_path_save):
url = 'http://interfacelift.com/wallpaper_beta/grab/%s' % filename
print url
img_obj = urllib.urlopen(url)
img_data = img_obj.read()
if img_data :
file_obj = open(file_path_save, 'w')
file_obj.write(img_data)
file_obj.close()
print "Image %s enregistré pour la résolution %s" %(filename, reso)
Je te laisse regarder
Dernière modification par Kanor (Le 20/05/2010, à 19:16)
Hors ligne
#3 Le 21/05/2010, à 06:05
- tahec
Re : Script de téléchargement de fonds d'écrans (Interfacelift)
merci beaucoup!
Histoire que mince-c'était-mon-script-quand-même-a-la-base, j'ai changé 2 lignes:
title = title.lower().replace(' ','').replace('-','').replace('.','')
...
print u"Image %s enregistrée pour la résolution %s" %(filename, reso)
La première à cause de ce genre d'image:http://interfacelift.com/wallpaper_beta … light.html
La deuxième en rajoutant le 'e' à enregistré...allez steuplait on dirait que je participe utilement... et en mettant le u devant la chaine, sans quoi j'ai une vilaine erreur chez moi
Sinon, encore merci, j'ai appris plein de trucs en lisant ton code
#!/usr/bin/env python
# -*- coding: utf-8 -*-
########## REGLAGES
# Résolutions à télécharger
resolutions=('1680x1050','1280x1024')
########## REGLAGES
from xml.dom.minidom import parse
import os
import urllib
def get_value_tag(name_tag,root_tag):
tag = root_tag.getElementsByTagName(name_tag)
if tag:
tag = tag[0]
first_child = tag.firstChild
return None if not first_child else first_child.data
else:
return None
if __name__ == '__main__':
#Préparation des dossier
home_path = os.getenv("HOME")
dossier = os.path.join(home_path, "Images")
if not os.path.exists(dossier):
os.mkdir(dossier)
dossier = os.path.join(dossier, "Wallpapers")
if not os.path.exists(dossier):
os.mkdir(dossier)
for reso in resolutions:#Pour chaque résolution demandée
reso_path = os.path.join(dossier, reso)
if not os.path.isdir(reso_path):
os.mkdir(reso_path)
page = urllib.urlopen('http://feeds.feedburner.com/InterfaceliftNewestWallpaper?format=xml')
doc = parse(page)#'Ouverture' du xml
items = doc.getElementsByTagName('item')
nb=0
for item in items:
descri = get_value_tag('description', item )
if not descri:
continue
check_reso = [reso for reso in resolutions if reso in descri]
if check_reso:
title = get_value_tag('title', item)
guid = get_value_tag('guid', item)
print title
if not(title and guid):
continu
title = title.lower().replace(' ','').replace('-','').replace('.','')
for reso in check_reso:
filename = '%s_%s_%s.jpg' %( [node for node in guid.split('/') if node][-1].rjust(5, '0'),
title,
reso)
file_path_save = os.path.join(dossier,reso,filename)
if not os.path.isfile(file_path_save):
url = 'http://interfacelift.com/wallpaper_beta/grab/%s' % filename
print url
img_obj = urllib.urlopen(url)
img_data = img_obj.read()
if img_data :
file_obj = open(file_path_save, 'w')
file_obj.write(img_data)
file_obj.close()
print u"Image %s enregistrée pour la résolution %s" %(filename, reso)
Hors ligne
#4 Le 21/05/2010, à 06:59
- redo_fr
Re : Script de téléchargement de fonds d'écrans (Interfacelift)
Salut,
je me permets d'apporter ma petite pierre à l'édifice ^_^
Remplacer ce bout de code
home_path = os.getenv("HOME")
dossier = os.path.join(home_path, "Images")
if not os.path.exists(dossier):
os.mkdir(dossier)
dossier = os.path.join(dossier, "Wallpapers")
if not os.path.exists(dossier):
os.mkdir(dossier)
for reso in resolutions:#Pour chaque résolution demandée
reso_path = os.path.join(dossier, reso)
if not os.path.isdir(reso_path):
os.mkdir(reso_path)
par
for reso in resolutions:
dossier = os.path.join(os.environ["HOME"], 'Images', 'Wallpapers', reso)
try:
os.makedirs(dossier)
except OSError:
pass # les répertoires existent déjà
Ne pas oublier que la philosophie du python, c'est: Il vaut mieux demander pardon que permission ^_^
Il n'y a pas de mauvais outils, il n'y a que de mauvais ouvriers
- papy -
Personnellement, je crois que faire des procès est un signe que les affaires vont mal. Je ne dis pas que Microsoft va mal, ce n'est qu'un signe, pas un indicateur...
- Linus Torvalds -
Hors ligne
#5 Le 21/05/2010, à 08:09
- tahec
Re : Script de téléchargement de fonds d'écrans (Interfacelift)
for reso in resolutions: dossier = os.path.join(os.environ["HOME"], 'Images', 'Wallpapers', reso) try: os.makedirs(dossier) except OSError: pass # les répertoires existent déjà
Ne pas oublier que la philosophie du python, c'est: Il vaut mieux demander pardon que permission ^_^
merci à toi
dans la suite du script de kanor, $dossier doit etre le '~/Images/Wallpapers/'. Avec ton code je finis avec $dossier='~/Images/Wallpapers/1680x1050/1280x1024/', et donc une erreur à l'écriture du fichier.
[mode=trop facile] tu es pardonné [/mode]
Ce qui suit serait un bon compromis dans le sens pas trop laid et respectueux de la 'philosophie'? (j'aime bien l'idée)
for reso in resolutions:
dossier = os.path.join(os.environ["HOME"], 'Images', 'Wallpapers')
try:
os.makedirs(os.path.join(dossier,reso))
except OSError:
pass # les répertoires existent déjà
Hors ligne
#6 Le 31/05/2010, à 18:21
- tahec
Re : Script de téléchargement de fonds d'écrans (Interfacelift)
Bonjour,
Juste pour info, j'ai fait quelques modifs sur le script (pour re-télécharger les images si on ajoute une nouvelle résolution par exemple)
Sinon, le script ne fonctionne pas avec l'image du jour, donc j'ai aussi un peu modifié pour ça.
Le nouveau est là : http://github.com/bpaulin/bp_interfacelift
Hors ligne