Décaler les temps d'affichage des sous titres

Soyez le premier à donner votre avis sur cette source.

Vue 8 911 fois - Téléchargée 352 fois

Description

Ce code décale tous les temps d'un fichier sous-titres srt d'une valeur introduite par l'utilisateur et enregistre un nouveau srt.

C'est en fait une première partie d'une application complète, que je vais essayer de développer quand j'aurai le temps, dont la fonction sera de créer et éditer des fichers sous-titres.

Dans le zip il y a deux fichiers. srtUp.py peut se lancer seul ou via l'autre fichier, srt.py, qui est une interface graphique pour ce module srtUp.

Source / Exemple :


# -*- coding:cp1252 -*-

"""Crée un fichier srt copie d'un autre mais où les temps ont été décalés selon les entrées de l'utilisateur"""

def changeTime(time):
    """Additionne les temps et les ajustes au format du temps (minute et secondes entre 0 et 60)\nRenvoie le nouveau temps"""
    global sign, modify
    
    time = [float(i.replace(",",".")) for i in time]
    if sign == 1:
        for i in range(3): time[i] += modify[i]
        if time[2]>60:
            time[2]-=60
            time[1]+=1
        if time[1]>60:
            time[1]-=60
            time[0]+=1
    if sign == 0:
        for i in range(3): time[i] -= modify[i]
        if time[2]<0:
            time[2]+=60
            time[1]-=1
        if time[1]<0:
            time[1]+=60
            time[0]-=1
        if time[0]<0:
            return ["00","00","00.000"]
    return [addZ(str(int(time[0]))),addZ(str(int(time[1]))),addZ(str(time[2]))]

def addZ (nb):
    """Ajoute autant de "0" que nécessaire pour arriver au format srt, à savoir [hh:mm:ss.sss]\nRenvoie le nouveau temps"""
    
    if nb[0]!=0 and float(nb)<10 and len(nb)==2: nb = "0" + nb[1:]
    if len(nb)==1: nb = "0" + nb
    
    while len(nb)>2 and len(nb)<6:
        if len(nb[:nb.index(".")])!=2: nb = "0" + nb
        if len(nb[nb.index("."):])!=4: nb = nb + "0"
    return nb

def process(ligne):
    """Modifie la ligne si elle contient des indications de temps et les envoie à la modification par changeTime\nRenvoie la ligne"""

    if len(ligne.split("-->")) == 2: ligne = ":".join(changeTime(ligne[0:12].split(":"))) + " --> " + ":".join(changeTime(ligne[17:29].split(":"))) + "\n"
        
    return ligne

def srtUp(adress):
    """Ouvre le fichier, le lit, appelle la fonction "process" pour chaque ligne\nRenvoie le nouveau srt sous forme de liste"""

    srt=  open(adress,"r").readlines()
    return [process(i) for i in srt]

def write(srt2, adress2):
    """Inscrit le contenu d'une liste dans un fichier, ici le nouveau fichier srt"""
    
    file = open(adress2, "w")
    for i in srt2: file.write(i)
    file.close()
    
if __name__== "__main__":
    
    adress = raw_input("Entrer l'adresse du fichier de type srt à traiter : ")
    adress2 = raw_input("Entrer l'adresse du fichier résultat : ")
    sign = int(raw_input("Entrer '1' pour ajouter du temps ou '0' pour en retirer. NB: En ajouter engendrera un affichage modify tardif des sous-titres : "))
    modify = [float(i.replace(",",".")) for i in raw_input("Entrer le décalage temporel à appliquer sous la forme hh:mm:ss.ssss : ").split(":")]
    write(srtUp(adress), adress2)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
5
Date d'inscription
vendredi 3 février 2006
Statut
Membre
Dernière intervention
29 octobre 2007

Quand je modifi mon .srt, il me remplace les "." des valeur de temps par des "," par conséquant j'ai du faire un "tout remplacer" :)
Messages postés
35
Date d'inscription
lundi 28 juillet 2003
Statut
Membre
Dernière intervention
29 octobre 2007

Merci pour le commentaire.

Par contre je viens de tester et je n'ai pas ce problème de virgule. Pourriez-vous me donner plus de détails?
Messages postés
5
Date d'inscription
vendredi 3 février 2006
Statut
Membre
Dernière intervention
29 octobre 2007

Jolie code,
le problème est par contre, il transphoremes les virgules en points :/
Alors certe un coup de KWrite et ça refonctionne mais ça pourri le texte aussi :)

Y'aurai juste ça a revoir ! sinon, très bon boulot !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.