import re import sys import os from datetime import timedelta def format_timestamp(timestamp): hours, remainder = divmod(timestamp.total_seconds(), 3600) minutes, seconds = divmod(remainder, 60) milliseconds = timestamp.microseconds // 1000 return f"{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d},{int(milliseconds):03d}" def lrc_to_srt(lrc_filename, srt_filename): with open(lrc_filename, 'r', encoding='utf-8') as lrc_file: lrc_content = lrc_file.readlines() srt_content = [] subtitle_counter = 1 previous_end_time = None for i, line in enumerate(lrc_content): match = re.match(r'\[(\d{2}):(\d{2})\.(\d{2})\](.*)', line) ## Explanation to the regex: ## \[ (\d{2}) : (\d{2}) \. (\d{2}) \] (.*) ## bracket minutes (2 digits) colon seconds (2 digits) dot millisecs (2 digits) bracket lyrical line (can be blank) if match: print(f'debug: matched line {line.strip()}') start_minutes = int(match.group(1)) start_seconds = int(match.group(2)) start_milliseconds = int(match.group(3)) * 10 print(f'matched text: {match.group(4)}') start_time = timedelta(minutes=start_minutes, seconds=start_seconds, milliseconds=start_milliseconds) if len(srt_content) > 0: # srt_content[-1] += f"{format_timestamp(start_time - timedelta(milliseconds=1))}\n" srt_content[-1] += f"{format_timestamp(start_time)}\n" srt_content.append(f"{subtitle_text}\n\n") srt_content.append(f"{subtitle_counter}\n") srt_content.append(f"{format_timestamp(start_time)} --> ") subtitle_text = match.group(4).strip() subtitle_counter += 1 previous_end_time = start_time if previous_end_time is not None: srt_content[-1] += f"{format_timestamp(previous_end_time)}\n" srt_content.append(f"{subtitle_text}\n\n") with open(srt_filename, 'w', encoding='utf-8') as srt_file: srt_file.writelines(srt_content) print(f"Conversion from LRC to SRT completed. SRT file saved as '{srt_filename}'.") if __name__ == "__main__": if not(len(sys.argv) == 3 or len(sys.argv) == 2): print("Usage: python lrc2srt.py ") print("or: python lrc2srt.py ") print("If no output file name is supplied, the input file name will be used by default.") else: lrc_filename = sys.argv[1] if len(sys.argv) == 3: srt_filename = sys.argv[2] else: raw_filename, ext = os.path.splitext(lrc_filename) srt_filename = raw_filename + '.srt' lrc_to_srt(lrc_filename, srt_filename)