Пример #1
0
def regeneratePictures(logger, list_vids=None):

    """Fct qui régénére les images d'une liste de vids passée en paramètre,
    ou de tte la bdd si rien n'est passé en paramètre. ATTENTION, 
    on supprime ttes les images du dossier screens/ ."""

    bdd = sqlite3.connect("fichiers.sqlite") # ouverture de la base
    bdd.row_factory = sqlite3.Row # accès aux colonnes par leur nom, pas par leur index

    c = bdd.cursor() # obtention d'un curseur

    if list_vids:
        for each_video in list_vids:
            c.execute("SELECT path, thumb FROM videos WHERE id = ?", (each_video,))
            data = c.fetchone()

            thumb_path = data["thumb"]
            mosaic_path = thumb_path.replace("_thumb.png", "_mosaic.png")

            #On génère la miniature et la mosaïque
            logger.info("Régénération des images pour {0}".format(data['path']))
            screen.thumb(data['path'], md4Function(data['path']))
            screen.caps(data['path'], md4Function(data['path']))
    else:
        
        #On vide le dossier des screenshots
        logger.info("Effacement du dossier des screens")
        os.chdir('./screens')
        for picture in os.listdir('.'):
            os.remove(os.path.abspath(picture))
        os.chdir(os.path.dirname(sys.argv[0]))

        c.execute("SELECT path FROM videos")

        logger.info("Régénération de toutes les images")

        for ligne_bdd in c.fetchall():
            #On génère la miniature et la mosaïque
            screen.thumb(ligne_bdd['path'], md4Function(ligne_bdd['path']))
            screen.caps(ligne_bdd['path'], md4Function(ligne_bdd['path']))

        logger.info("Régénération terminée")

    c.close()
    bdd.close()
Пример #2
0
def importation(dossier, logger, callback=None):

    """On remplit la bdd avec les listes liste et liste_chemins.
    On vérifie que le fichier à ajouter n'est pas déjà en bdd. Sinon, on l'ajoute.
    Accepte aussi un callback en option, pour mettre à jour la progress bar du gui 
    lors de l'import"""

    #On récupère la liste des fichiers et leur emplacement
    #Uniquement des vidéos avec un type autorisé, la fct de listing
    #s'occupe de vérifier
    logger.info("Importation du dossier {0}".format(dossier))
    liste, liste_chemins = listing(dossier)

    bdd = sqlite3.connect("fichiers.sqlite") # ouverture de la base
    bdd.row_factory = sqlite3.Row # accès aux colonnes par leur nom, pas par leur index

    c = bdd.cursor() # obtention d'un curseur

    nbr_videos_added = 0

    #On récupère le nbr de fichiers à importer, pr la progress bar
    nbr_max = len(liste)

    for name, path in zip(liste, liste_chemins):

        md4 = md4Function(path) 

        # On vérifie que le fichier n'existe pas déjà. Plus d'infos :
        # http://stackoverflow.com/questions/2440147/how-to-check-the-existence-of-a-row-in-sqlite-with-python
        c.execute("SELECT md4 FROM videos WHERE md4= ?", (md4,))

        #Si le fichier n'est pas présent, on l'ajoute à la bdd
        #avec ttes les opérations qui vont avec
        if c.fetchone() is None:
            nbr_videos_added += 1

            #On génère la miniature et la mosaïque
            screen.thumb(path, md4)
            screen.caps(path, md4)

            #On crée des variables, plus lisibles, pr la requête sql
            date_modif = datetime.datetime.fromtimestamp(int(os.path.getmtime(path))).strftime('%Y-%m-%d %H:%M:%S')
            path_thumb = os.getcwd() + "/screens/{0}_thumb.png".format(md4)
            today = datetime.datetime.today().strftime('%Y-%m-%d %H:%M:%S') 

            size = os.path.getsize(path)

            #On insère aussi le nom sans accent, sans majuscule, dans un champ prévu pour faire les recherches
            logger.info("Insertion de {0} dans la bdd".format(path)) 
            c.execute("INSERT INTO videos(name, name_simple, path, thumb, date, md4, size, date_add) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", 
                       (name, simpleChar(name), path, path_thumb, date_modif, md4, size, today))
        else:
            logger.debug("Fichier {0} déjà présent en bdd, rien à faire".format(name))

        #On appelle le callback pr mettre à jour le pourcentage
        #de la progress bar de la gui, au besoin
        if callback != None:
            callback((liste.index(name) + 1) * 100 / nbr_max, "({0}/{1})".format(liste.index(name) + 1, nbr_max), name, os.path.dirname(path))

    # On place le commit en dehors de la boucle, ça va plus vite
    #EN TEST, sorti le 18/03/12 de la boucle
    bdd.commit()
    c.close()
    bdd.close()

    return nbr_videos_added
Пример #3
0
def verification(options, logger, callback=None):

    """Vérifie que les fichiers en bdd sont toujours présents dans
    le répertoire d'où ils ont été recensés. Sinon, on update le path
    en bdd. Si tous les répertoires surveillés existent et qu'un fichier
    en bdd n'est stocké nul part, on le supprime."""

    #Liste ts les dossiers surveillés dans les préfs
    list_to_check = list()

    #On se met ds le group de conf 'Watching'
    options.beginGroup("Watching")
    #On fait la liste de ttes les clés pr les pathes
    pathes = options.allKeys()
    if pathes:
        for each_key in pathes:
            #On récupère le path associé à chaque clé, et on l'ajoute à la liste
            list_to_check.append(options.value(each_key))
    options.endGroup()

    #On ne peut effacer que si tous les dossiers
    #surveillés existent
    effacer = True
    nbr_videos_added = 0
    for each_dossier in list_to_check:
        if not os.path.exists(each_dossier):
            effacer = False
            logger.info("Un des répertoires surveillés n'est pas accessible")
        nbr_videos_added += importation(each_dossier, logger, callback)

    liste, liste_chemins = listing(list_to_check)

    #On crée un dico ac en clé les md4 des fichiers, en value les paths.
    #comme ça, on a pas besoin de parcourir les listes, on peut accéder aux
    #nouveaux paths grâce aux noms des fichiers
    dico_path = dict()

    for each_path in liste_chemins:
        dico_path[md4Function(each_path)] = each_path

    # On se connecte à la bdd, elle existe forcément
    bdd = sqlite3.connect("fichiers.sqlite") # ouverture de la base
    bdd.row_factory = sqlite3.Row # accès aux colonnes par leur nom, pas par leur index

    c = bdd.cursor() # obtention d'un curseur

    c.execute("SELECT md4, path FROM videos")

    fichiers_del = 0
    fichiers_updated = 0

    #Pour chaque ligne de la bdd, on vérifie que le path écrit en bdd correspond
    #à un fichier existant. Sinon, on efface l'entrée de la bdd
    for ligne_bdd in c.fetchall():

        if effacer and ligne_bdd["md4"] not in dico_path.keys():
            c.execute("DELETE FROM videos WHERE md4= ?", (ligne_bdd["md4"],))
            logger.info("{0} effacé de la bdd".format(ligne_bdd['path']))
            fichiers_del += 1
        elif ligne_bdd["md4"] in dico_path.keys() and os.path.exists(ligne_bdd["path"]) == False:
            new_name = dico_path[ligne_bdd["md4"]].split("/")[-1]
            c.execute("UPDATE videos SET name= ?, name_simple = ?, path= ? WHERE md4= ?",
                    (new_name, simpleChar(new_name), dico_path[ligne_bdd["md4"]], ligne_bdd["md4"]))
            logger.info("{0} updaté dans la bdd. Dorénavant localisé: {1}".format(ligne_bdd['path'], dico_path[ligne_bdd["md4"]]))
            fichiers_updated += 1

    logger.info("{0} fichiers ajoutés à la bdd".format(nbr_videos_added))
    logger.info("{0} fichier(s) effacé(s)".format(fichiers_del))
    logger.info("{0} fichier(s) updaté(s)".format(fichiers_updated))

    bdd.commit()
    c.close()
    bdd.close()