commit d616aed5df67413b7033030c112c6c44e3410950 Author: Emmanuel BENOÎT (aider) <tseeker@nocternity.net> Date: Sun Apr 6 10:38:39 2025 +0200 feat: Add merge_srt.py to merge SRT files using COPY commands from a file diff --git a/merge_srt.py b/merge_srt.py new file mode 100644 index 0000000..de4b9b9 --- /dev/null +++ b/merge_srt.py @@ -0,0 +1,82 @@ +import sys + +def parse_srt(filename): + with open(filename, 'r', encoding='utf-8') as f: + content = f.read().strip() + blocks = content.split('\n\n') + entries = [] + for block in blocks: + lines = block.split('\n') + if len(lines) < 3: + continue + index = int(lines[0]) + timestamp = lines[1] + text = '\n'.join(lines[2:]).strip() + entries.append({ + 'index': index, + 'timestamp': timestamp, + 'text': text, + }) + return entries + +def read_commands(filename): + with open(filename, 'r', encoding='utf-8') as f: + lines = f.readlines() + commands = [] + for line in lines: + line = line.strip() + if not line or line.startswith('#'): + continue + parts = line.split() + if len(parts) != 3: + continue + command = parts[0].upper() + if command != 'COPY': + continue + try: + source = int(parts[1]) + if source not in (1, 2): + continue + range_part = parts[2] + start_str, end_str = range_part.split('-') + start = int(start_str) + end = int(end_str) + if start > end: + continue + except (ValueError, AttributeError): + continue + commands.append((source, start, end)) + return commands + +if __name__ == '__main__': + if len(sys.argv) != 5: + print("Usage: python merge_srt.py <srt1> <srt2> <commands> <output>") + sys.exit(1) + srt1_filename = sys.argv[1] + srt2_filename = sys.argv[2] + commands_filename = sys.argv[3] + output_filename = sys.argv[4] + + srt1 = parse_srt(srt1_filename) + srt2 = parse_srt(srt2_filename) + commands = read_commands(commands_filename) + + output = [] + for source, start, end in commands: + source_list = srt1 if source == 1 else srt2 + start_idx = start - 1 + end_idx = end - 1 + if start_idx < 0 or end_idx >= len(source_list) or start_idx > end_idx: + print(f"Skipping invalid command: source {source}, range {start}-{end}") + continue + entries = source_list[start_idx:end_idx + 1] + output.extend(entries) + + with open(output_filename, 'w', encoding='utf-8') as f: + for i, entry in enumerate(output, start=1): + f.write(f"{i}\n") + f.write(entry['timestamp'] + '\n') + text = entry['text'].strip() + for line in text.split('\n'): + f.write(line + '\n') + f.write('\n')