Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
srt2ass [Le 11/12/2011, 19:15]
Crazyfaboo créée
srt2ass [Le 06/09/2012, 12:11] (Version actuelle)
Crazyfaboo Amélioration du script, correction de bugs, liste d'exclusions.
Ligne 27: Ligne 27:
 </​code>​ </​code>​
  
 +<​note>​note : il est en fait possible de mettre du texte en italique mot par mot via les balise {\i1} et {\i0}</​note>​
 ====== Conversion en ligne de commande ====== ====== Conversion en ligne de commande ======
  
 Téléchargez le fichier ci-dessous et rendez-le exécutable. Téléchargez le fichier ci-dessous et rendez-le exécutable.
 +
 Pour obtenir de l'aide : srt2ass.py -h ou srt2ass.py --help Pour obtenir de l'aide : srt2ass.py -h ou srt2ass.py --help
 +
 Supporte les fichiers SRT encodés en ISO-8859-1, UTF-8, UTF-16 (LE/BE), UTF-32 (LE/BE) Supporte les fichiers SRT encodés en ISO-8859-1, UTF-8, UTF-16 (LE/BE), UTF-32 (LE/BE)
 +
 Converti les fichiers SRT en ASS et les encodes en UTF-8. Converti les fichiers SRT en ASS et les encodes en UTF-8.
 +
 Correction des erreurs de caractères les plus fréquentes. Correction des erreurs de caractères les plus fréquentes.
 +
 Comportement par défaut : srt2ass.py executé sans arguments convertira tous les fichiers SRT du dossier courant. Les fichiers SRT ne seront pas supprimés. Comportement par défaut : srt2ass.py executé sans arguments convertira tous les fichiers SRT du dossier courant. Les fichiers SRT ne seront pas supprimés.
  
Ligne 42: Ligne 48:
 import codecs import codecs
 import argparse import argparse
-import os, glob+import ​sys, os, glob 
 + 
 +# Use this list to delete automatically subs containing one of the following words. All in lower case. 
 +exclusion = ["​subtitles by", "sync by", "<​font",​ "​synchro:",​ "​sync:",​ "​transcript:",​ "​subtitles:",​ "​subtitle:",​ "sync and corrections"​]
  
 class Console: class Console:
Ligne 48: Ligne 57:
   ​   ​
   @classmethod   @classmethod
-  def l(c, message): +  def l(c, message, linefeed = True): 
-    ​print message+    ​sys.stdout.write(message
 +    if linefeed: 
 +      sys.stdout.write("​\n"​)
   ​   ​
   @classmethod   @classmethod
-  def v(c, message):+  def v(c, message, linefeed = True):
     if c.verbose:     if c.verbose:
-      c.l(message)+      c.l(message, linefeed)
   ​   ​
   @classmethod   @classmethod
-  def w(c, message): +  def w(c, message, linefeed = True): 
-    c.v("##​ Warning ## " + message)+    c.v("##​ Warning ## " + message, linefeed) 
 +   
 +  @classmethod 
 +  def nl(c): 
 +    if c.verbose:​ 
 +      sys.stdout.write("​\n"​)
  
 class SubElement: class SubElement:
Ligne 79: Ligne 95:
 class AdvancedSubStationAlphaWriter:​ class AdvancedSubStationAlphaWriter:​
   ​   ​
-  def __init__(self,​ filename, subElements,​ regular, italic, size):+  def __init__(self,​ filename, subElements,​ regular, size):
     Console.v('​Writing "'​ + filename + '"'​)     Console.v('​Writing "'​ + filename + '"'​)
     self.fontRegular = regular     self.fontRegular = regular
-    self.fontItalic = italic 
     self.fontSize = size     self.fontSize = size
     self.filename = filename     self.filename = filename
Ligne 102: Ligne 117:
     font = "​Regular"​     font = "​Regular"​
     ​     ​
-    ​isItalic = text.find('<​i>'​) != -1 +    text = text.replace("<​i>",​ "{\\i1}"​).replace("</​i>",​ "{\\i0}") 
-    if isItalic: +    # Fixes the subtitle 
-      font = "​Italic"​ +    if text.find("​{\\i1}"​) != -1 and text.find("​{\\i0}"​) == -1: 
-      ​text = text.replace("<​i>",​ ""​).replace("</​i>",​ ""​)+      text += "​{\\i0}"​
     ​     ​
     return "​Dialogue:​ 0,​{0},​{1},​{2},,​0000,​0000,​0000,,​{3}\n"​.format(start,​ end, font, text)     return "​Dialogue:​ 0,​{0},​{1},​{2},,​0000,​0000,​0000,,​{3}\n"​.format(start,​ end, font, text)
Ligne 127: Ligne 142:
         + "​Format:​ Name, Fontname, Fontsize, PrimaryColour,​ SecondaryColour,​ OutlineColour,​ BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle,​ Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n"​ \         + "​Format:​ Name, Fontname, Fontsize, PrimaryColour,​ SecondaryColour,​ OutlineColour,​ BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle,​ Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n"​ \
         + "​Style:​ Regular,"​ + self.fontRegular + ","​ + self.fontSize + ",&​H00FFFFFF,&​H0000FFFF,&​H00000000,&​H00000000,​-1,​0,​0,​0,​100,​100,​0,​0,​1,​1,​1,​2,​20,​20,​20,​0\n"​ \         + "​Style:​ Regular,"​ + self.fontRegular + ","​ + self.fontSize + ",&​H00FFFFFF,&​H0000FFFF,&​H00000000,&​H00000000,​-1,​0,​0,​0,​100,​100,​0,​0,​1,​1,​1,​2,​20,​20,​20,​0\n"​ \
-        + "​Style:​ Italic,"​ + self.fontItalic + ","​ + self.fontSize + ",&​H00FFFFFF,&​H0000FFFF,&​H00000000,&​H00000000,​-1,​-1,​0,​0,​100,​100,​0,​0,​1,​1,​1,​2,​20,​20,​20,​0\n"​ \ 
         + "​\n"​ \         + "​\n"​ \
         + "​[Events]\n"​ \         + "​[Events]\n"​ \
         + "​Format:​ Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text\n"​         + "​Format:​ Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text\n"​
 +
 +#+ "​Style:​ Italic,"​ + self.fontItalic + ","​ + self.fontSize + ",&​H00FFFFFF,&​H0000FFFF,&​H00000000,&​H00000000,​-1,​-1,​0,​0,​100,​100,​0,​0,​1,​1,​1,​2,​20,​20,​20,​0\n"​ \
 +        ​
  
 class SubRipReader:​ class SubRipReader:​
Ligne 193: Ligne 210:
     count = 0     count = 0
     emptySub = []     emptySub = []
 +    skip = False
     for line in self.lines:     for line in self.lines:
       l = line.encode('​utf-8'​) ​   \       l = line.encode('​utf-8'​) ​   \
Ligne 198: Ligne 216:
         .replace("​\r",​ ""​)         .replace("​\r",​ ""​)
       if isJustNew:       if isJustNew:
 +        skip = False
         isJustNew = False         isJustNew = False
         nextCountReady = False         nextCountReady = False
Ligne 205: Ligne 224:
       elif nextCountReady and l.isdigit():​       elif nextCountReady and l.isdigit():​
         count += 1         count += 1
-        Console.v("​Reading SRT # " + l + "​\r"​)+        Console.v("​Reading SRT #" + str(l+ "​\r"​, False)
         if int(l) != count:         if int(l) != count:
-          Console.w("​Bad SRT number! Found: #" + l + ", but should be #" + count)+          ​Console.nl() 
 +          ​Console.w("​Bad SRT number! Found: #" + str(l+ ", but should be #" + str(count))
         if el != None:         if el != None:
           if el.text == '':​           if el.text == '':​
Ligne 216: Ligne 236:
         isJustNew = True         isJustNew = True
       else:       else:
-        l = l.replace("​œ",​ "​œ"​) ​  \ +        ​if not skip: 
-          .replace("​’",​ "​’"​) ​     \ +          skip = self.exclude(l) 
-          .replace("​“",​ "​“"​) ​     \ +        if skip: 
-          .replace("​”",​ "​”"​) ​     \ +          Console.nl() 
-          .replace("​´´",​ '"'​) ​     \ +          Console.w("​Skipping SRT '"​ + l + "'"​) 
-          .replace("​´",​ "'"​) ​      \ +        elif len(l) > 0: 
-          .replace("​....",​ "​…"​) ​   \ +          ​l = l.replace("​œ",​ "​œ"​) ​  \ 
-          .replace("​...",​ "​…"​) ​    \ +            .replace("​’",​ "​’"​) ​     \ 
-          .replace("​. . .", "​…"​) +            .replace("​“",​ "​“"​) ​     \ 
-        l = self.applyLanguageOnLine(l) +            .replace("​”",​ "​”"​) ​     \ 
-        el.appendLine(l)+            ​.replace("​€",​ "​€"​) ​     \ 
 +            ​.replace("​´´",​ '"'​) ​     \ 
 +            .replace("​´",​ "'"​) ​      \ 
 +            .replace("​....",​ "​…"​) ​   \ 
 +            .replace("​...",​ "​…"​) ​    \ 
 +            .replace("​. . .", "​…"​) 
 +          l = self.applyLanguageOnLine(l) 
 +          el.appendLine(l)
         nextCountReady = True         nextCountReady = True
     ​     ​
-    if (el != None):+    if el != None and len(str(el)> 0:
       self.elements.append(el)       self.elements.append(el)
     ​     ​
Ligne 246: Ligne 273:
   def applyLanguageOnLine(self,​ line):   def applyLanguageOnLine(self,​ line):
     return line     return line
 +  ​
 +  def exclude(self,​ line):
 +    l = line.lower()
 +    for x in exclusion:
 +      if l.find(x) != -1:
 +        return True
 +    return False
  
 class Srt2Ass: class Srt2Ass:
   ​   ​
-  def __init__(self,​ srt, fregular, fitalic, fsize, delete):+  def __init__(self,​ srt, fregular, fsize, delete):
     ass = srt.replace('​.srt',​ '​.ass'​)     ass = srt.replace('​.srt',​ '​.ass'​)
     subs = SubRipReader(srt)     subs = SubRipReader(srt)
-    AdvancedSubStationAlphaWriter(ass,​ subs.elements,​ fregular, fitalic, fsize)+    AdvancedSubStationAlphaWriter(ass,​ subs.elements,​ fregular, fsize)
     if delete:     if delete:
       Console.l("​Removing " + srt + "​…"​)       Console.l("​Removing " + srt + "​…"​)
Ligne 262: Ligne 296:
   parser.add_argument('​file',​ metavar='​file',​ nargs='​*',​ help='​the SubRip (srt) file')   parser.add_argument('​file',​ metavar='​file',​ nargs='​*',​ help='​the SubRip (srt) file')
   parser.add_argument('​--font-regular',​ metavar='​fontr',​ nargs='?',​ help='​Name of the font to use for regular text. Default is "​Cronos Pro"​.',​ default="​Cronos Pro")   parser.add_argument('​--font-regular',​ metavar='​fontr',​ nargs='?',​ help='​Name of the font to use for regular text. Default is "​Cronos Pro"​.',​ default="​Cronos Pro")
-  parser.add_argument('​--font-italic',​ metavar='​fonti',​ nargs='?',​ help='​Name of the font to use for italic text. Default is "​Cronos Pro"​.',​ default="​Cronos Pro") 
   parser.add_argument('​--font-size',​ metavar='​fonts',​ nargs='?',​ help='​Font\'​s size for both regular and italic fonts. Default is 24.', default="​24"​)   parser.add_argument('​--font-size',​ metavar='​fonts',​ nargs='?',​ help='​Font\'​s size for both regular and italic fonts. Default is 24.', default="​24"​)
   parser.add_argument('​--delete',​ '​-d',​ action='​store_true',​ help='​delete the original SubRip (srt) file')   parser.add_argument('​--delete',​ '​-d',​ action='​store_true',​ help='​delete the original SubRip (srt) file')
Ligne 281: Ligne 314:
   ​   ​
   for srt in srtfiles:   for srt in srtfiles:
-    Srt2Ass(srt,​ args.font_regular, args.font_italic, args.font_size,​ args.delete)+    Srt2Ass(srt,​ args.font_regular,​ args.font_size,​ args.delete) 
 </​file>​ </​file>​
  
 +<​note>​Les erreurs d'​encodage du fichier SRT ne sont pas gérées par ce script. En cas de problème de conversion, ouvrez le fichier SRT avec Subtitle Editor et faites Enregistrer. La conversion fonctionnera alors parfaitement.</​note>​
  • srt2ass.1323627335.txt.gz
  • Dernière modification: Le 15/12/2011, 15:20
  • (modification externe)