Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/05/2010, à 12: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 smile
- 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, à 20: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, à 20:16)

Hors ligne

#3 Le 21/05/2010, à 07: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 smile

#!/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, à 07: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, à 09:09

tahec

Re : Script de téléchargement de fonds d'écrans (Interfacelift)

redo_fr a écrit :
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 smile
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, à 19: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