Пример #1
0
    def insertCompletion(self, completion):

        """Slot qui insère la completion quand une suggestion est choisie"""

        #Le nbr de caractères à rajouter
        extra = len(completion) - len(self.completer.completionPrefix())

        #On traite le cas où l'user a tapé la suggestion en entier
        if extra != 0:
            extra_text = completion[-extra:]
        else:
            extra_text = ""

        #On rajoute un espace si on doit le faire
        if self.addSpaceAfterCompleting:
            extra_text += ' '

        #Passage pr gérer la completion indépendamment de la casse
        current_comp = self.completer.currentCompletion()

        current_text = self.text() + extra_text
        current_text = current_text.split(' ')
        current_text = [ word for word in current_text if word ]

        if current_comp != current_text[-1] and simpleChar(current_text[-1]) == simpleChar(current_comp):
            current_text[-1] = current_comp

        self.setText(" ".join(current_text) + " ")
Пример #2
0
def addActor(list_vids, name_actor, logger):

    """Fct pour ajouter un acteur en bdd. Un seul acteur à la fois."""

    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

    #On vérifie que l'acteur n'est pas déjà en bdd
    c.execute("SELECT * FROM actors WHERE name_simple = ? ", (simpleChar(name_actor),))
    if c.fetchone() is None:
        name_actor = [ each_word.capitalize() for each_word in name_actor.split(" ") ]
        name_actor = " ".join(name_actor)
        c.execute("INSERT INTO actors (name, name_simple) VALUES (?, ?) ", (name_actor, simpleChar(name_actor)))

    bdd.commit()

    #À chaque vid s'électionnée, on ajoute l'acteur
    for each_video in list_vids:
        #On récupère l'id de l'acteur pour s'en servir après
        c.execute("SELECT id, name FROM actors WHERE name_simple= ?", (simpleChar(name_actor),))
        data = c.fetchone()
        id_actor = data["id"]

        #On vérifie que l'acteur à stocker n'est pas déjà associé à la vidéo 
        c.execute("SELECT * FROM videos_actors WHERE id_video = ? AND id_actor = ?", (each_video, id_actor))
        if c.fetchone() is None:
            logger.info("{0} associé à la vidéo {1}".format(data["name"], each_video))
            c.execute("INSERT INTO videos_actors (id_video, id_actor) VALUES (?, ?)", (each_video, id_actor))
        else:
            print("Cette vidéo est déjà associée à cet acteur")

    bdd.commit()
    c.close()
    bdd.close()
Пример #3
0
    def keyPressEvent(self, event):

        """Méthode qui gère l'appui sur les touches du clavier"""

        super(SearchPerso, self).keyPressEvent(event)

        #Les propositions valables sont ts les tags et ts les acteurs
        self.propositions = listeTags() + listeActors()

        #On récupère le texte entré
        text = self.text()

        #Les propositions valables sont celles qui matchent le texte entré
        self.propositions = [ case for case in self.propositions if simpleChar(self.text()) in simpleChar(case) ]

        #Si le texte des boutons à droite ne matche pas ds la liste
        #des propositions, on cache le bouton, sinon on le montre
        for button in self.parent.liste_pressoirs_tags:
            if button.text() not in self.propositions:
                button.hide()
            else:
                button.show()

        for button in self.parent.liste_pressoirs_actors:
            if button.text() not in self.propositions:
                button.hide()
            else:
                button.show()

        if event.key() == QtCore.Qt.Key_Return and self.hasFocus() and len(self.propositions) == 1:
            for button in self.parent.liste_pressoirs_tags:
                if button.text() == self.propositions[0]:
                    button.setChecked(True)
                    button.clicked.emit(True)
                    self.clear()
                    self.parent.reshowButtons()
            for button in self.parent.liste_pressoirs_actors:
                if button.text() == self.propositions[0]:
                    button.setChecked(True)
                    button.clicked.emit(True)
                    self.clear()
                    self.parent.reshowButtons()
Пример #4
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
Пример #5
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()
Пример #6
0
def renameFile(ancien_nom, nouveau_nom, parent_bdd):

    """Fct qui renomme un fichier, en bdd d'abord, ac la
    mise à jour de name, name_simple et du path, puis physiquement
    si le fichier est accessible.
    ATTENTION : le nom du fichier n'est pas encore mis à jour dans
    la bdd  à l'appel de la fct."""

    #On ferme ici la connexion à la bdd de la fenêtre principale
    #car on ne peut pas le faire ailleurs
    parent_bdd.close()

    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 id, path FROM videos WHERE name = ?", [ancien_nom])

    path = c.fetchone()['path']

    if path is not None and os.path.exists(path):

        #TODO: extension .mpeg
        allowed_types = ['avi', 'mkv', 'wmv', 'mov', 'mp4', 'm4v', 'mpeg', 'mpg', 'flv']

        if nouveau_nom[-3:] not in allowed_types:
            extension = ancien_nom.split(".")[-1]
            if extension in allowed_types:
                nouveau_nom = nouveau_nom + "." + extension
            else:
                nouveau_nom = ancien_nom


        #On modifie la dernière partie du path, soit le nom du fichier
        new_path = path.split("/")[:-1]
        new_path = "/".join(new_path) + "/" + nouveau_nom

        try:
            #On renomme le fichier physiquement
            os.renames(path, new_path)

            #On change le nom, le nom simple, et le path en bdd
            c.execute("UPDATE videos SET name = ?, path = ?, name_simple = ? WHERE name = ?", (nouveau_nom, new_path, simpleChar(nouveau_nom), ancien_nom))
            print("Nom modifié dans la bdd")
        except:
            print("Erreur : aucun changement effectué")

    else:
        print("Erreur : nom non modifié en bdd")

    bdd.commit()

    c.close()
    bdd.close()

    parent_bdd.open()