diff options
Diffstat (limited to 'subsync.py')
-rw-r--r-- | subsync.py | 54 |
1 files changed, 39 insertions, 15 deletions
@@ -15,21 +15,26 @@ import chardet os.chdir(os.path.dirname(os.path.realpath(__file__))) os.chdir('..') + class mopen: def __init__(self, filename, mode='r', **kwargs): self.real_encoding = chardet.detect(open(filename, 'rb').read())['encoding'].lower() self.file_o = open(filename, mode, encoding=self.real_encoding) + def __getattr__(self, name): return getattr(self.file_o, name) + def __enter__(self): - return self.file_o + return self.file_o + def __exit__(self, type, value, traceback): - self.file_o.close() + self.file_o.close() def get_lib_folder(): return "auto-sub-retimer" + def remove_styles(lines, styles): res = [] for line in lines: @@ -40,6 +45,7 @@ def remove_styles(lines, styles): res.append(line) return res + def count_style_occurences(lines, style): res = 0 for line in lines: @@ -49,6 +55,7 @@ def count_style_occurences(lines, style): res += 1 return res + def get_example_lines(lines, style, sample=5): res = [] for line in lines: @@ -61,6 +68,7 @@ def get_example_lines(lines, style, sample=5): return res return res + def get_styles(lines): res = [] for line in lines: @@ -68,6 +76,7 @@ def get_styles(lines): res.append(line[7:].split(',')[0]) return res + def select_keep_styles(all_styles, lines): styles_occ = sorted([(s, count_style_occurences(lines, s)) for s in all_styles], key=lambda x: x[1], reverse=True) for i, s in enumerate(styles_occ): @@ -79,6 +88,7 @@ def select_keep_styles(all_styles, lines): return all_styles return [s[0] for i, s in enumerate(styles_occ) if str(i) in keep_indices] + def extract_eng_subs(mkv, index=None): print("\nExtracting english subtitles, this may take a while...\n") mkv_json = json.loads(subprocess.check_output([ @@ -120,15 +130,17 @@ def extract_eng_subs(mkv, index=None): if codec_name == "subrip": codec_name = "srt" if codec_name not in ("srt", "ssa", "ass", "idx"): print("\n\n") - print("#"*20) + print("#" * 20) print("Embedded subtitle stream is an image based subtitle file.") print("These are not supported by Alass and cannot be used.") - print("#"*20) + print("#" * 20) sys.exit(1) extracted = mkv.replace(".mkv", f".EXTRACTED.{codec_name}") - subprocess.run([os.path.join(get_lib_folder(), "mkvtoolnix\\mkvextract.exe"), "tracks", mkv, f"{index}:{extracted}"]) + subprocess.run( + [os.path.join(get_lib_folder(), "mkvtoolnix\\mkvextract.exe"), "tracks", mkv, f"{index}:{extracted}"]) return index + def fix_styling(): extracted_subs = [f for f in os.listdir() if '.EXTRACTED.' in f] if extracted_subs[0].split('.')[-1] != 'ass': @@ -144,35 +156,46 @@ def fix_styling(): with open(sub, 'w', encoding="utf-8") as ass: ass.write('\r\n'.join(lines)) + def retime_based_on_audio(mkv, srt, conf): retimed = mkv.replace(".mkv", ".ja.RETIMED.{}".format(conf['ext'])) - subprocess.run([os.path.join(get_lib_folder(), "alass\\alass.bat"), "--split-penalty", conf['split_pen'], mkv, srt, retimed]) + subprocess.run( + [os.path.join(get_lib_folder(), "alass\\alass.bat"), "--split-penalty", conf['split_pen'], mkv, srt, retimed]) os.remove(srt) os.rename(retimed, mkv.replace(".mkv", ".ja.{}".format(conf['ext']))) + def retime(mkv, srt, conf): retimed = mkv.replace(".mkv", ".ja.RETIMED.{}".format(conf['ext'])) extracted = [f for f in os.listdir() if mkv.replace(".mkv", ".EXTRACTED.") in f][0] - print([os.path.join(get_lib_folder(), "alass\\alass.bat"), "--split-penalty", conf['split_pen'], extracted, srt, retimed]) - subprocess.run([os.path.join(get_lib_folder(), "alass\\alass.bat"), "--split-penalty", conf['split_pen'], extracted, srt, retimed]) + print([os.path.join(get_lib_folder(), "alass\\alass.bat"), "--split-penalty", conf['split_pen'], extracted, srt, + retimed]) + subprocess.run( + [os.path.join(get_lib_folder(), "alass\\alass.bat"), "--split-penalty", conf['split_pen'], extracted, srt, + retimed]) os.remove(srt) os.rename(retimed, mkv.replace(".mkv", ".ja.{}".format(conf['ext']))) os.remove(extracted) + def fix_common_errors(srt): lines = mopen(srt, encoding='utf-8').readlines() - lines = [x for i, x in enumerate(lines) if not (x.strip() == "" and i+1 < len(lines) and not lines[i+1].strip().isdigit())] + lines = [x for i, x in enumerate(lines) if + not (x.strip() == "" and i + 1 < len(lines) and not lines[i + 1].strip().isdigit())] with open(srt, 'w', encoding="utf-8") as subfile: subfile.write(''.join(lines)) + def tryint(s): try: return int(s) except: return s + def alphanum_key(s): - return [ tryint(c) for c in re.split('([0-9]+)', s) ] + return [tryint(c) for c in re.split('([0-9]+)', s)] + if __name__ == '__main__': # Guess the local mkv/srt pairs that need syncing @@ -187,7 +210,8 @@ if __name__ == '__main__': srts = sorted([f for f in files if f.endswith(f".{CONF['ext']}")], key=alphanum_key) mkvs = [f for f in files if f.endswith(".mkv")] while len(mkvs) > len(srts): - print(f"Found more .mkv files than .{CONF['ext']} files. This can occur when OP/ED/extras are in the same folder as episodes.") + print( + f"Found more .mkv files than .{CONF['ext']} files. This can occur when OP/ED/extras are in the same folder as episodes.") print("Please enter a pattern to filter out of mkv results. (e.g. OP)") pattern = input(">>> Pattern: ") removed = [m for m in mkvs if pattern in m] @@ -217,15 +241,15 @@ if __name__ == '__main__': for srt in srts: fix_common_errors(srt) if "2" in retime_choice: - pool.starmap(retime_based_on_audio, zip(mkvs, srts, [CONF]*len(mkvs))) + pool.starmap(retime_based_on_audio, zip(mkvs, srts, [CONF] * len(mkvs))) else: index = None for mkv in mkvs: index = extract_eng_subs(mkv, index) - #index = extract_eng_subs(mkvs[0]) - #pool.starmap(extract_eng_subs, [(x, index) for x in mkvs]) + # index = extract_eng_subs(mkvs[0]) + # pool.starmap(extract_eng_subs, [(x, index) for x in mkvs]) print("English Sub Extraction Complete.") fix_styling() - pool.starmap(retime, zip(mkvs, srts, [CONF]*len(mkvs))) + pool.starmap(retime, zip(mkvs, srts, [CONF] * len(mkvs))) print("\nSuccess!\n") time.sleep(3) |