begin process at 2012 05 24 05:28:08
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier & Disque

 > TRIER SES FILMS PAR GENRE - INTERFACE ZENITY OU LIGNE DE COMMANDE

TRIER SES FILMS PAR GENRE - INTERFACE ZENITY OU LIGNE DE COMMANDE


 Information sur la source

Note :
6 / 10 - par 1 personne
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichier & Disque Classé sous :Tri, Fichier, Film, recherche, zenity Niveau :Débutant Date de création :26/05/2011 Date de mise à jour :15/01/2012 16:09:59 Vu :3 956

Auteur : sarathai

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Après avoir pendant plusieurs années collecté des centaines de films, ma bibliothèque devenait trop importante pour tenir "à l'arrache" dans un seul dossier. Je voulais les trier par genre, mais quelle tâche fastidieuse...
Alors j'ai programmé en Python ce script dans le but de trier mes films par genre.

Le programme liste tous les films contenus dans le dossier à traiter, puis un par un effectue une recherche sur allociné pour en trouver le genre, puis créé le dossier du genre et enfin le déplace dedans.

Interface Zenity, les fonctions ont étés trouvées dans le module PyZenity dispo sur le net

Modifications
Prise en charge totale de l'interface graphique
Choix du genre si plusieurs sont disponibles
Choix du genre parmi ceux déjà existant si le film n'a pas pu être trouvé

Pour l'utiliser (ligne de commande) : python film_ordener.py /dossier/a/traiter
ou : python film_ordener.py /dossier/a/traiter debug=1 #Pour avoir le debug

Pour l'utiliser (interface) on peut aussi créer un lanceur : python film_ordener.py

Source

  • #! /usr/bin/python
  • # -*- coding: utf-8 -*-
  • ################################################################################
  • # Name: film_ordener.py
  • # Author: Hugo Rodde
  • # Created: 15/01/2012
  • ################################################################################
  • # Zenity fonctions
  • # Licence: MIT Licence
  • #
  • # Copyright (c) 2005 Brian Ramos
  • # Permission is hereby granted, free of charge, to any person obtaining a copy
  • # of this software and associated documentation files (the "Software"), to
  • # deal in the Software without restriction, including without limitation the
  • # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  • # sell copies of the Software, and to permit persons to whom the Software is
  • # furnished to do so, subject to the following conditions:
  • #
  • # The above copyright notice and this permission notice shall be included in
  • # all copies or substantial portions of the Software.
  • #
  • # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  • # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  • # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  • # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  • # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  • # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  • # IN THE SOFTWARE.
  • ################################################################################
  • import glob
  • import urllib2
  • import os
  • import sys
  • import re
  • from subprocess import Popen, PIPE
  • __author__="hugo"
  • __date__ ="$25 mai 2011 19:14:28$"
  • zen_exec = 'zenity'
  • def run_zenity(type, *args):
  • """#Lance une commande zenity avec des arguments"""
  • return Popen([zen_exec, type] + list(args), stdin=PIPE, stdout=PIPE)
  • def get_folder():
  • """#Affiche à user une boite de dialogue pour selectionner un repertoire"""
  • args = ['--directory']
  • p = run_zenity('--file-selection', *args)
  • if p.wait() == 0:
  • return p.stdout.read().strip().split('|')[0]
  • def info(text):
  • """#Affiche une boite de dialogue avec un texte
  • text - texte à afficher"""
  • run_zenity('--info', '--text=%s' % text).wait()
  • def question(text):
  • """#Affiche une boite de dialogue avec une question
  • text - question à afficher"""
  • return run_zenity('--question', '--text={0}'.format(text)).wait() == 0
  • def process(text='', percentage=0, auto_close=False, pulsate=False):
  • """Show a progress dialog to the user.
  • This will raise a Zenity Progress Dialog. It returns a callback that
  • accepts two arguments. The first is a numeric value of the percent
  • complete. The second is a message about the progress.
  • NOTE: This function sends the SIGHUP signal if the user hits the cancel
  • button. You must connect to this signal if you do not want your
  • application to exit.
  • text - The initial message about the progress.
  • percentage - The initial percentage to set the progress bar to.
  • auto_close - True if the dialog should close automatically if it reaches
  • 100%.
  • pulsate - True is the status should pulsate instead of progress."""
  • args = []
  • if text:
  • args.append('--text=%s' % text)
  • if percentage:
  • args.append('--percentage=%s' % percentage)
  • if auto_close:
  • args.append('--auto-close=%s' % auto_close)
  • if pulsate:
  • args.append('--pulsate=%s' % pulsate)
  • p = Popen([zen_exec, '--progress'] + args, stdin=PIPE, stdout=PIPE)
  • def update(percent, message=''):
  • if type(percent) == float:
  • percent = int(percent * 100)
  • p.stdin.write(str(percent) + '\n')
  • if message:
  • p.stdin.write('# %s\n' % message)
  • return p.returncode
  • return update
  • def selection(column_names, title=None, boolstyle=None, editable=False,
  • select_col=None, sep='|', data=[]):
  • """Present a list of items to select.
  • This will raise a Zenity List Dialog populated with the colomns and rows
  • specified and return either the cell or row that was selected or None if
  • the user hit cancel.
  • column_names - A tuple or list containing the names of the columns.
  • title - The title of the dialog box.
  • boolstyle - Whether the first columns should be a bool option ("checklist",
  • "radiolist") or None if it should be a text field.
  • editable - True if the user can edit the cells.
  • select_col - The column number of the selected cell to return or "ALL" to
  • return the entire row.
  • sep - Token to use as the row separator when parsing Zenity's return.
  • Cells should not contain this token.
  • data - A list or tuple of tuples that contain the cells in the row. The
  • size of the row's tuple must be equal to the number of columns."""
  • args = []
  • for column in column_names:
  • args.append('--column=%s' % column)
  • if title:
  • args.append('--title=%s' % title)
  • args.append('--text=%s' % title)
  • if boolstyle:
  • if boolstyle != 'checklist' or boolstyle != 'radiolist':
  • raise ValueError('"%s" is not a proper boolean column style.'
  • % boolstyle)
  • args.append('--' + boolstyle)
  • if editable:
  • args.append('--editable')
  • if select_col:
  • args.append('--print-column=%s' % select_col)
  • if sep != '|':
  • args.append('--separator=%s' % sep)
  • for datum in data:
  • args.append(str(datum))
  • p = run_zenity('--list', *args)
  • if p.wait() == 0:
  • return p.stdout.read().strip().split(sep)
  • def search(path,dir,i,taille):
  • """ Fonction principale. Paramètres : chemin du fichier, dossier de travail, iteration n°, nombre de films.
  • Cette fonction traite le chemin pour récupérer le nom du film, le formatte pour une recherche sur allociné.
  • Puis récupère le film sur allociné et ouvre la page de ce film pour en tirer le genre du film."""
  • name = path.replace(dir,"").lower() #Enleve le chemin absolue et le met en minuscules
  • string = name_regexp1.sub("",name) #Retire l'extension du nom du fichier
  • string = name_regexp2.sub("+",string) #Remplace les [.-_| ] par des '+' dans le nom de fichier
  • if debug==True:
  • print string
  • the_url = "http://www.allocine.fr/recherche/?q={0}".format(string) #Lance la recherche sur Allociné
  • req = urllib2.Request(the_url)
  • try:
  • handle = urllib2.urlopen(req)
  • except IOError, e:
  • if hasattr(e, 'reason'):
  • print 'Nous avons échoué à joindre le serveur.'
  • print 'Raison: ', e.reason
  • elif hasattr(e, 'code'):
  • print 'Le serveur n\'a pu satisfaire la demande. Niveau search(film)'
  • print 'Code d\' erreur : ', e.code
  • else:
  • result = handle.read()
  • if "<a href='/film/fichefilm_gen_cfilm" in result:
  • id = result.split("<a href='/film/fichefilm_gen_cfilm=")[1].split(".html")[0]
  • #Recupere le 'id' du film sur Allociné
  • lien = "http://www.allocine.fr/film/fichefilm_gen_cfilm={0}.html".format(id)
  • if debug == True:
  • print lien
  • req = urllib2.Request(lien)
  • try:
  • handle = urllib2.urlopen(req)
  • except IOError, e:
  • if hasattr(e, 'reason'):
  • print 'Nous avons échoué à joindre le serveur.'
  • print 'Raison: ', e.reason
  • elif hasattr(e, 'code'):
  • print 'Le serveur n\'a pu satisfaire la demande. Niveau search(genre)'
  • print 'Code d\' erreur : ', e.code
  • else:
  • result = handle.read()
  • if '<span itemprop="genre">' in result:
  • #genre = result.split("<span itemprop=\"genre\">")[1].split("</span>")[0]
  • genres = genre_regexp.findall(result) #Recupere tous les genres proposés par Allociné
  • if automatique ==False and display==0 and len(genres) > 1:
  • genre = selection(['Genre'],"Genres pour "+name,data=genres)[0] #Demande à user de choisir le genre correspondant pour le film
  • else:
  • genre = genres[0]
  • if debug == True:
  • print genre
  • print i
  • if display == 0:
  • processus(float(i)/float(taille),"({0} / {1}) Ajouté à la liste {2}".format(i,taille,path+" ("+genre+")")) #Change le statut de la barre de progression
  • else:
  • print "({0} / {1}) Ajouté à la liste {2}".format(i,taille,path+" ("+genre+")")
  • ordonner(dir,path,genre,name)
  • else:
  • if display == 0:
  • processus(float(i)/float(taille),"({0} / {1}) Impossible de trouver le genre pour {2}".format(i,taille,name))
  • else:
  • print "({0} / {1}) Impossible de trouver le genre pour {2}".format(i,taille,name)
  • else:
  • if display == 0:
  • processus(float(i)/float(taille),"({0} / {1}) Impossible de trouver le film {2}".format(i,taille,name))
  • answ = question("({0} / {1}) Impossible de trouver le film {2}.\nChoisir un genre parmi ceux existant ?".format(i,taille,name))
  • if answ==True:
  • dirs = os.listdir(dir)
  • for indval in enumerate(dirs):
  • print indval
  • if os.path.isfile(dir+dirs[indval[0]]):
  • del dirs[indval[0]]
  • print dirs
  • genre = selection(['Genre'],"Genre pour "+name,data=dirs)[0] #Demande à user de choisir le genre correspondant pour le film
  • else:
  • print "({0} / {1}) Impossible de trouver le genre pour {2}".format(i,taille,name)
  • def ordonner(dir,path,genre,name):
  • """ En paramètres : dossier de travail, chemin du fichier, genre du film, nom du film.
  • Effectue le tri en fonction du genre du film """
  • if genre not in os.listdir(dir):
  • os.mkdir(dir+genre, 0775) #Créer le dossier du genre s'il n'éxiste pas
  • os.rename(path,dir+genre+os.sep+name) #Déplace le fichier dans le dossier du genre
  • if display == 0:
  • info("Fichier %s déplacé avec succes" %name)
  • else:
  • print "Fichier %s déplacé avec succes" %name
  • if __name__ == "__main__":
  • """ Fonction Main : recupere les arguments, liste les fichiers dans le repertoire choisi. Créer la liste des extensions. Et lance le traitement"""
  • display = 0 #0: fenetre, 1: console
  • debug = False
  • extensions = ("avi","mp4","mpeg","divx","mkv","flv")
  • extension_regexp = ""
  • liste = []
  • automatique = True
  • if (len(sys.argv) >= 2) and (sys.argv[2] == "debug=1" or sys.argv[2] == "debug=True"):
  • debug = True
  • display = 1
  • automatique = True
  • if display == 0:
  • dir = get_folder()
  • dir += os.sep
  • else:
  • dir = sys.argv[1]
  • try:
  • j=0
  • while j<len(extensions):
  • liste += glob.glob(dir+'*.'+extensions[j])
  • if j < len(extensions)-1:
  • extension_regexp += extensions[j]+"|"
  • else:
  • extension_regexp += extensions[j]
  • j += 1
  • if debug==True:
  • print extension_regexp
  • print liste
  • except IOError, e:
  • if hasattr(e, 'reason'):
  • print 'Le chemin est faux ou n\'existe pas.'
  • print 'Raison: ', e.reason
  • elif hasattr(e, 'code'):
  • print 'Le serveur n\'a pu satisfaire la demande. Niveau main'
  • print 'Code d\' erreur : ', e.code
  • taille = len(liste)
  • i = 0
  • genre_regexp = re.compile("\<span itemprop=\"genre\"\>([\w\séèà-]+)\</span\>")
  • name_regexp1 = re.compile(".("+extension_regexp+")")
  • name_regexp2 = re.compile("[-_\|\.\s]")
  • if display == 0:
  • string = "Auteur : Hugo Rodde\nIl y a {0} films à traiter dans le dossier {1}.\nVoulez-vous procéder au rangement de vos films par Genre d'après Allociné ?".format(taille,dir)
  • continuer = question(string)
  • if continuer==True:
  • mode = question("Le traitement est par défaut automatique. Voulez-vous passer en manuel ? C'est-à-dire choisir le genre de chaque film si plusieurs genres sont trouvés")
  • if mode == True:
  • automatique = False
  • processus = process("Le traitement va commencer...",0,True)
  • for file in liste:
  • i = i+1
  • search(file,dir,i,taille)
  • info("Le travail est fini")
  • else:
  • info("Comme tu veux ...")
  • else:
  • print "Auteur : {0} <{1}>".format("Hugo Rodde","rodde.hugo@gmail.com")
  • print "Il y a {0} films à traiter dans le dossier {1}. Voulez-vous procéder au rangement de vos films par Genre d'après Allociné ? (O/n)".format(taille,dir)
  • continuer = raw_input()
  • if continuer=="o" or continuer=="O":
  • for file in liste:
  • i = i+1
  • search(file,dir,i,taille)
  • print "Done !"
  • else:
  • print "Comme tu veux ..."
#! /usr/bin/python
# -*- coding: utf-8 -*-

################################################################################
# Name: film_ordener.py
# Author:   Hugo Rodde
# Created: 15/01/2012
################################################################################
# Zenity fonctions
# Licence: MIT Licence
# 
# Copyright (c) 2005 Brian Ramos
# Permission is hereby granted, free of charge, to any person obtaining a copy 
# of this software and associated documentation files (the "Software"), to 
# deal in the Software without restriction, including without limitation the 
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 
# sell copies of the Software, and to permit persons to whom the Software is 
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in 
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.
################################################################################

import glob
import urllib2
import os
import sys
import re
from subprocess import Popen, PIPE

__author__="hugo"
__date__ ="$25 mai 2011 19:14:28$"

zen_exec = 'zenity'

def run_zenity(type, *args): 
    """#Lance une commande zenity avec des arguments"""
    return Popen([zen_exec, type] + list(args), stdin=PIPE, stdout=PIPE)

def get_folder(): 
    """#Affiche à user une boite de dialogue pour selectionner un repertoire"""
    args = ['--directory']
    p = run_zenity('--file-selection', *args)

    if p.wait() == 0:
        return p.stdout.read().strip().split('|')[0]

def info(text): 
    """#Affiche une boite de dialogue avec un texte
    text - texte à afficher"""
    run_zenity('--info', '--text=%s' % text).wait()

def question(text):
    """#Affiche une boite de dialogue avec une question
    text - question à afficher"""
    return run_zenity('--question', '--text={0}'.format(text)).wait() == 0



def process(text='', percentage=0, auto_close=False, pulsate=False):
    """Show a progress dialog to the user.

    This will raise a Zenity Progress Dialog.  It returns a callback that 
    accepts two arguments.  The first is a numeric value of the percent 
    complete.  The second is a message about the progress.

    NOTE: This function sends the SIGHUP signal if the user hits the cancel 
          button.  You must connect to this signal if you do not want your 
          application to exit.

    text - The initial message about the progress.
    percentage - The initial percentage to set the progress bar to.
    auto_close - True if the dialog should close automatically if it reaches 
                 100%.
    pulsate - True is the status should pulsate instead of progress."""

    args = []
    if text:
        args.append('--text=%s' % text)
    if percentage:
        args.append('--percentage=%s' % percentage)
    if auto_close:
        args.append('--auto-close=%s' % auto_close)
    if pulsate:
        args.append('--pulsate=%s' % pulsate)

    p = Popen([zen_exec, '--progress'] + args, stdin=PIPE, stdout=PIPE)

    def update(percent, message=''):
        if type(percent) == float:
            percent = int(percent * 100)
        p.stdin.write(str(percent) + '\n')
        if message:
            p.stdin.write('# %s\n' % message)
        return p.returncode

    return update

def selection(column_names, title=None, boolstyle=None, editable=False, 
         select_col=None, sep='|', data=[]):
    """Present a list of items to select.
    
    This will raise a Zenity List Dialog populated with the colomns and rows 
    specified and return either the cell or row that was selected or None if 
    the user hit cancel.
    
    column_names - A tuple or list containing the names of the columns.
    title - The title of the dialog box.
    boolstyle - Whether the first columns should be a bool option ("checklist",
                "radiolist") or None if it should be a text field.
    editable - True if the user can edit the cells.
    select_col - The column number of the selected cell to return or "ALL" to 
                 return the entire row.
    sep - Token to use as the row separator when parsing Zenity's return. 
          Cells should not contain this token.
    data - A list or tuple of tuples that contain the cells in the row.  The 
           size of the row's tuple must be equal to the number of columns."""

    args = []
    for column in column_names:
        args.append('--column=%s' % column)
    
    if title:
        args.append('--title=%s' % title)
        args.append('--text=%s' % title)
    
    if boolstyle:
        if boolstyle != 'checklist' or boolstyle != 'radiolist':
            raise ValueError('"%s" is not a proper boolean column style.'
                             % boolstyle)
        args.append('--' + boolstyle)
    if editable:
        args.append('--editable')
    if select_col:
        args.append('--print-column=%s' % select_col)
    if sep != '|':
        args.append('--separator=%s' % sep)
    
    for datum in data:
        args.append(str(datum))
    
    p = run_zenity('--list', *args)

    if p.wait() == 0:
        return p.stdout.read().strip().split(sep)


def search(path,dir,i,taille):
    """ Fonction principale. Paramètres : chemin du fichier, dossier de travail, iteration n°, nombre de films.
         Cette fonction traite le chemin pour récupérer le nom du film, le formatte pour une recherche sur allociné.
         Puis récupère le film sur allociné et ouvre la page de ce film pour en tirer le genre du film."""
    name = path.replace(dir,"").lower() #Enleve le chemin absolue et le met en minuscules
    string = name_regexp1.sub("",name) #Retire l'extension du nom du fichier
    string = name_regexp2.sub("+",string) #Remplace les [.-_| ] par des '+' dans le nom de fichier
    
    if debug==True:
        print string
    the_url = "http://www.allocine.fr/recherche/?q={0}".format(string) #Lance la recherche sur Allociné
    req = urllib2.Request(the_url)

    try:
        handle = urllib2.urlopen(req)
    except IOError, e:
        if hasattr(e, 'reason'):
            print 'Nous avons échoué à joindre le serveur.'
            print 'Raison: ', e.reason
        elif hasattr(e, 'code'):
            print 'Le serveur n\'a pu satisfaire la demande. Niveau search(film)'
            print 'Code d\' erreur : ', e.code
    else:
        result = handle.read()

        if "<a href='/film/fichefilm_gen_cfilm" in result:
            id = result.split("<a href='/film/fichefilm_gen_cfilm=")[1].split(".html")[0] 
            #Recupere le 'id' du film sur Allociné

            lien = "http://www.allocine.fr/film/fichefilm_gen_cfilm={0}.html".format(id)
            if debug == True:
                print lien
            req = urllib2.Request(lien)

            try:
                handle = urllib2.urlopen(req)
            except IOError, e:
                if hasattr(e, 'reason'):
                    print 'Nous avons échoué à joindre le serveur.'
                    print 'Raison: ', e.reason
                elif hasattr(e, 'code'):
                    print 'Le serveur n\'a pu satisfaire la demande. Niveau search(genre)'
                    print 'Code d\' erreur : ', e.code
            else:
                result = handle.read()
                if '<span itemprop="genre">' in result:
                    #genre = result.split("<span itemprop=\"genre\">")[1].split("</span>")[0]
                    genres = genre_regexp.findall(result) #Recupere tous les genres proposés par Allociné
                    if automatique ==False and display==0 and len(genres) > 1:
                        genre = selection(['Genre'],"Genres pour "+name,data=genres)[0] #Demande à user de choisir le genre correspondant pour le film
                    else:
                        genre = genres[0]

                    if debug == True:
                        print genre
                        print i

                    if display == 0:
                        processus(float(i)/float(taille),"({0} / {1}) Ajouté à la liste {2}".format(i,taille,path+" ("+genre+")")) #Change le statut de la barre de progression
                    else:
                        print "({0} / {1}) Ajouté à la liste {2}".format(i,taille,path+" ("+genre+")")
                    ordonner(dir,path,genre,name)
                else:
                    if display == 0:
                         processus(float(i)/float(taille),"({0} / {1}) Impossible de trouver le genre pour {2}".format(i,taille,name))
                    else:
                        print "({0} / {1}) Impossible de trouver le genre pour {2}".format(i,taille,name)
        else:
            if display == 0:
                processus(float(i)/float(taille),"({0} / {1}) Impossible de trouver le film {2}".format(i,taille,name))
                answ = question("({0} / {1}) Impossible de trouver le film {2}.\nChoisir un genre parmi ceux existant ?".format(i,taille,name))
                if answ==True:
                    dirs = os.listdir(dir)
                    for indval in enumerate(dirs):
                        print indval
                        if os.path.isfile(dir+dirs[indval[0]]):
                            del dirs[indval[0]]
                    print dirs
                    genre = selection(['Genre'],"Genre pour "+name,data=dirs)[0] #Demande à user de choisir le genre correspondant pour le film
            else:
                print "({0} / {1}) Impossible de trouver le genre pour {2}".format(i,taille,name)

def ordonner(dir,path,genre,name):
    """ En paramètres : dossier de travail, chemin du fichier, genre du film, nom du film.
        Effectue le tri en fonction du genre du film """
    if genre not in os.listdir(dir):
        os.mkdir(dir+genre, 0775) #Créer le dossier du genre s'il n'éxiste pas
    os.rename(path,dir+genre+os.sep+name) #Déplace le fichier dans le dossier du genre
    if display == 0:
        info("Fichier %s déplacé avec succes" %name)
    else:
        print "Fichier %s déplacé avec succes" %name


if __name__ == "__main__":
    """ Fonction Main : recupere les arguments, liste les fichiers dans le repertoire choisi. Créer la liste des extensions. Et lance le traitement"""
    display = 0 #0: fenetre, 1: console
    debug = False
    extensions = ("avi","mp4","mpeg","divx","mkv","flv")
    extension_regexp = ""
    liste = []
    automatique = True

    if (len(sys.argv) >= 2) and (sys.argv[2] == "debug=1" or sys.argv[2] == "debug=True"):
        debug = True
        display = 1
        automatique = True

    if display == 0:
        dir = get_folder()
        dir += os.sep
    else:
        dir = sys.argv[1]

    try:
        j=0
        while j<len(extensions):
            liste += glob.glob(dir+'*.'+extensions[j])
            if j < len(extensions)-1:
                extension_regexp += extensions[j]+"|"
            else:
                extension_regexp += extensions[j]
            j += 1
        if debug==True:
            print extension_regexp
            print liste

    except IOError, e:
        if hasattr(e, 'reason'):
            print 'Le chemin est faux ou n\'existe pas.'
            print 'Raison: ', e.reason
        elif hasattr(e, 'code'):
            print 'Le serveur n\'a pu satisfaire la demande. Niveau main'
            print 'Code d\' erreur : ', e.code
    
    taille = len(liste)
    i = 0
    genre_regexp = re.compile("\<span itemprop=\"genre\"\>([\w\séèà-]+)\</span\>")
    name_regexp1 = re.compile(".("+extension_regexp+")")
    name_regexp2 = re.compile("[-_\|\.\s]")

    if display == 0:
        string = "Auteur : Hugo Rodde\nIl y a {0} films à traiter dans le dossier {1}.\nVoulez-vous procéder au rangement de vos films par Genre d'après Allociné ?".format(taille,dir)
        continuer = question(string)
        if continuer==True:
            mode = question("Le traitement est par défaut automatique. Voulez-vous passer en manuel ? C'est-à-dire choisir le genre de chaque film si plusieurs genres sont trouvés")
            if mode == True:
                automatique = False
            processus = process("Le traitement va commencer...",0,True)
            for file in liste:
                i = i+1
                search(file,dir,i,taille)
            info("Le travail est fini")
        else:
            info("Comme tu veux ...")
    else:
        print "Auteur : {0} <{1}>".format("Hugo Rodde","rodde.hugo@gmail.com")
        print "Il y a {0} films à traiter dans le dossier {1}. Voulez-vous procéder au rangement de vos films par Genre d'après Allociné ? (O/n)".format(taille,dir)

        continuer = raw_input()
        if continuer=="o" or continuer=="O":
            for file in liste:
                i = i+1
                search(file,dir,i,taille)
            print "Done !"
        else:
            print "Comme tu veux ..."

 Conclusion

Petite programme fort simple mais fort utile !


 Historique

26 mai 2011 19:35:51 :
Ajout de l'image
15 janvier 2012 02:19:56 :
Ajout de l'interface zenity pour plus de confort
15 janvier 2012 16:09:59 :
Modifications Prise en charge totale de l'interface graphique Choix du genre si plusieurs sont disponibles Choix du genre parmi ceux déjà existant si le film n'a pas pu être trouvé

 Sources de la même categorie

ENLEVER LES ACCENTS DE TOUS LES FICHIERS par Averell
LE GLOUTON ! [MANGE ET RECRACHE LES FICHIERS QU IL TROUVE D... par saigneurdushi
PYSCANLOG SCANNER DE FICHIER LOG par Guillamue06
Source avec Zip RÉPLICATOR par dhuyp
[BASH] ALERTE ESPACE DISQUE par zaggash

 Sources en rapport avec celle ci

TRANSFERT DE FICHIER PAR SOCKET par Guillamue06
PYSCANLOG SCANNER DE FICHIER LOG par Guillamue06
RECHERCHE DE CHAINES DANS UN REPERTOIRE AVEC IGU par guillaume_pays_cevenol
RECHERCHE D'UNE CHAINE DANS DES FICHIERS par guillaume_pays_cevenol
LISTE FICHIER AVEC EXTENSION PRÉSISE ET LANCEMENT DE PROC PA... par MHI

Commentaires et avis

Commentaire de sparko_dutos le 01/06/2011 10:00:26 6/10

Bonjour

L'idée est pas mal, et le code tient la route.
Cependant, permet moi de faire quelques critiques :
- Il aurait pu être opportun de lister plus d'extensions de fichiers. Tu te limites au format "avi", ton script ne traite pas les "mkv", "divx", "mpeg", "mp4" ...
- Surtout il existe un réel problème quand la fonction recherche soit ne trouve pas de résultat, soit en trouve plusieurs ! Dans le premier cas, si tu avais externalisé la fonction qui s'occupe des requêtes html, tu aurais pu demander à l'utilisateur de préciser/reformuler le titre du film, dans le second choix, plutôt que de choisir par défaut la première réponse (souvent triée par date) tu devrais permettre à l'utilisateur de choisir celle qu'il veut
- Peut être serait il opportun de supprimer certains caractères dans la recherche du film (- . _ etc)

Sinon c'est un code qui fonctionne (c'est déjà bien ... il y en a tellement qui ne le sont pas ...), qui est relativement bien écrit, commenté (encore plus rare) mais perfectible :)

Commentaire de sarathai le 01/06/2011 14:33:14

J'ai bien conscience de la perfectibilité de mon code, mais je voulais un premier jet fonctionnel pour trier mes films, ça devenait lourd. Et comme tu le dis, je n'ai pas trouvé de script qui fonctionnait bien.
Je suis en pleines révisions du Bac, dès que j'aurai le temps, je compte bien l'améliorer, et pourquoi pas sortir une application fenêtrée etc...
Mais au moins il y a une base fonctionnelle et simple pour aller plus loin.
En tout cas, merci pour ton commentaire !

Commentaire de sarathai le 15/01/2012 16:10:59

Voilà les modifications ont été apporté ! Qu'en pensez-vous ?

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Développement particulier [ par davidoff73 ] Bonjour,   <p class="MsoNormal" st Recherche de mots dans un fichier [ par Malrod ] Bonjour. Je débute en python et j'aimerais me faire un "moteur de recherche" pour fouiller dans des fichiers. J'aimerais ici demander la recherche comparer les valeurs d'un tableau [ par basmaber ] bonjour, je suis débutante en phyton et je dois faire un programme qui permet d'ouvrir un fichier txt de ce genre : "I1";15.;100.;120.;80. .... et ap lire et comparer les valeurs d'un fichier [ par basmaber ] Bonjour, j'ai crée une boucle qui lit et compare les valeur d'un fichier , mais le problème ma boucle fonctionne pour toute les valeurs sauf une je ne recherche google map [ par gaillus ] Bonjour, Ma question porte sur la recherche dans google map. Par exemple si je vais sur google map et que je tape la recherche suivante "bar toulous Descripteur de fichier (ioctl) Linux [ par iAure5974 ] Bonjour je cherche un équivalent de la fonction ioctl du module "socket" sous Linux pour passer ma carte en mode promiscuous (vous devinerez assez fac probleme avec os.path.getctime() [ par Bl0tCh ] Voilà, Donc cette fonction est censée me donner la date de creation du fichier (en secondes) mais le probleme c ke elle me donne la premiere date de c ecrire un dico dans un fichier texte [ par airod ] je cherche depuis un bout de temps mais rien y fait! Mon prob: je pars d'un fichier de config (*.cfg), et j'en cr&#233;e un dico dans mon appli, ceci menu contextuel au clic de souris [ par frankystadore ] Bonjour &#224; tous, chers programmeurs!! Je suis actuellement en train de cr&#233;er une interface en Python, et j'aimerai savoir comment faire une s Fichiers en python [ par darfeuille ] Salut, &nbsp; Etant novice en python, je bloque sur un truc : &nbsp; Dans un de mes programmes, a un moment, je dois recopier un fichier (en le modi


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,919 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales