# type: ignore # pylint: skip-file import io import os import re import sys import getopt DEBUG = False def fileopen(input_file): encodings = ["utf-32", "utf-16", "utf-8", "cp1252", "gb2312", "gbk", "big5"] tmp = "" for enc in encodings: try: with io.open(input_file, mode="r", encoding=enc) as fd: tmp = fd.read() break except: if DEBUG: print(enc + " failed") continue return [tmp, enc] def srt2ass(input_file, out_file, sub_type): if ".ass" in input_file: return input_file src = fileopen(input_file) tmp = src[0] encoding = src[1] src = "" utf8bom = "" if "\ufeff" in tmp: tmp = tmp.replace("\ufeff", "") utf8bom = "\ufeff" tmp = tmp.replace("\r", "") lines = [x.strip() for x in tmp.split("\n") if x.strip()] subLines = "" tmpLines = "" lineCount = 0 output_file = out_file for ln in range(len(lines)): line = lines[ln] if ( line.isdigit() and ln + 1 < len(lines) and re.match("-?\d\d:\d\d:\d\d", lines[(ln + 1)]) ): if tmpLines: subLines += tmpLines + "\n" tmpLines = "" lineCount = 0 continue else: if re.match("-?\d\d:\d\d:\d\d", line): line = line.replace("-0", "0").replace(",", ".") tmpLines += "Dialogue: 0," + line + ",Default,,0,0,0,," else: if lineCount < 2: tmpLines += line else: tmpLines += "\\N" + line lineCount += 1 ln += 1 subLines += tmpLines + "\n" subLines = re.sub(r"\d(\d:\d{2}:\d{2}),(\d{2})\d", "\\1.\\2", subLines) subLines = re.sub(r"\s+-->\s+", ",", subLines) # replace style subLines = re.sub(r"<([ubi])>", "{\\\\\g<1>1}", subLines) subLines = re.sub(r"", "{\\\\\g<1>0}", subLines) subLines = re.sub( r'', "{\\\\c&H\\3\\2\\1&}", subLines ) subLines = re.sub(r"", "", subLines) if sub_type == "movie" or sub_type == "serie": head_str = """[Script Info] ; This is an Advanced Sub Station Alpha v4+ script. Title: Default Aegisub file ScriptType: v4.00+ Collisions: Normal PlayDepth: 0 PlayResX: 1920 PlayResY: 1080 [V4+ Styles] Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding Style: Default,Verdana,60,&H00FFFFFF,&H000000FF,&H00282828,&H00000000,-1,0,0,0,100,100,0,0,1,3.75,0,2,0,0,70,1 [Events] Format: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text""" if sub_type == "anime": head_str = """[Script Info] ; This is an Advanced Sub Station Alpha v4+ script. Title: Default Aegisub file ScriptType: v4.00+ WrapStyle: 0 ScaledBorderAndShadow: yes YCbCr Matrix: TV.709 PlayResX: 1920 PlayResY: 1080 [V4+ Styles] Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding Style: Default,Verdana,60,&H00FFFFFF,&H000000FF,&H00282828,&H00000000,-1,0,0,0,100.2,100,0,0,1,3.75,0,2,0,0,79,1 Style: BottomRight,Arial,30,&H00FFFFFF,&H000000FF,&H00282828,&H00000000,0,0,0,0,100,100,0,0,1,2,2,3,10,10,10,1 Style: TopLeft,Arial,30,&H00FFFFFF,&H000000FF,&H00282828,&H00000000,0,0,0,0,100,100,0,0,1,2,2,7,10,10,10,1 Style: TopRight,Arial,30,&H00FFFFFF,&H000000FF,&H00282828,&H00000000,0,0,0,0,100,100,0,0,1,2,2,9,10,10,10,1 [Events] Format: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text""" output_str = utf8bom + head_str + "\n" + subLines # output_str = output_str.encode(encoding) with io.open(output_file, "w", encoding="utf8") as output: output.write(output_str) output_file = output_file.replace("\\", "\\\\") output_file = output_file.replace("/", "//") return output_file def print_helper(): print("str2ass.py -t -i inputfile") print("Available types: anime, serie, movie") if __name__ == "__main__": try: opts, args = getopt.getopt(sys.argv[1:], "t:i:", ["type=", "input="]) except getopt.GetoptError: print_helper() sys.exit(2) sub_type = "anime" input_file = None for opt, arg in opts: if opt in ("-t", "--type"): sub_type = arg elif opt in ("-i", "--input"): input_file = arg if not input_file: print_helper() sys.exit(2) filenameOutput = srt2ass(input_file, sub_type) print("Output: " + filenameOutput)