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 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 wink), 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 roll (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 :

screenshotzv9.png

- 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 wink

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 :

screenshot2jl3.png

Ensuite, un clique sur l'icône, et un nouveau fond est appliqué wink

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 ! smile


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 roll

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 tongue 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 big_smile


-- Ganlhi --

Hors ligne

#7 Le 01/08/2006, à 11:06

tinkywinky

Re : Téléchargement automatique de fonds d'écran sur deviantArt

bbtgv a écrit :

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 wink
2) Mon script permet de choisir ses catégories préférées tongue

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 sad

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. hmm

En tout cas, très très bonne idée. wink


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 big_smile

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

tinkywinky a écrit :

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 wink 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à wink
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 big_smile

Hors ligne

#16 Le 01/08/2006, à 12:55

tinkywinky

Re : Téléchargement automatique de fonds d'écran sur deviantArt

tsensei a écrit :

Ce qui serait encore mieux ca serait de pouvoir choisir les dimensions du Wall big_smile

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

tinkywinky a écrit :

Ben disons lorsque je commence un language, généralement je ne suis pas de tutoriaux wink Mais je me fixe un but.

Ouais, la meilleure façon de ne pas abandonner en route ça smile


"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 ? smile


[ 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

Saelynh a écrit :

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).

lol

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. big_smile


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

big_smile 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 sad

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