SAMI 자막 파일을 SRT 파일로 변환하는 python source code (동영상 자막 변환, 비디오 자막 포맷 변환, 자막 파일 포맷 변경 방법)
"""
Convert SMI file to SRT file
"""
import argparse
import os
from bs4 import BeautifulSoup
import re
import chardet
def get_encoding(file_path):
with open(file_path, "rb") as f:
result = chardet.detect(f.read())
return result["encoding"]
def change_file_extension(srt_file_path, new_ext="srt"):
root, ext = os.path.splitext(srt_file_path)
smi_file_path = f"{root}.{new_ext}"
return smi_file_path
# -----------------------------------------------------------------------------
def convert_time_format(ms):
ms = int(ms)
s, ms = divmod(ms, 1000)
m, s = divmod(s, 60)
h, m = divmod(m, 60)
return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"
def html_to_plain_text(html):
soup = BeautifulSoup(html, "html.parser")
# 줄바꿈 유지
for br in soup.find_all("br"):
br.replace_with("\n")
for p in soup.find_all("p"):
p.append("\n")
# 빈 줄 제거
text = soup.get_text().strip()
lines = text.split("\n")
non_blank_lines = [line for line in lines if line.strip()]
result = "\n".join(non_blank_lines)
# 문자열이 "<" 로 시작하면 srt에서 에러가 발생함
if result.startswith("<"):
return ""
return result
# -----------------------------------------------------------------------------
def convert_smi_to_srt(smi_file, srt_file):
#
encoding_str = get_encoding(smi_file)
with open(smi_file, "r", encoding=encoding_str) as file:
smi = file.readlines()
#
subtitle_count = 1
body = False
start_time = ""
text = ""
srt_sub = ""
for i, line in enumerate(smi):
line = line.strip()
if body == False and line.upper().startswith("<SYNC START=") == False:
continue
body = True
if line.upper().startswith("<SYNC START="):
match = re.match(r"^(\d+)", line[12:])
time = convert_time_format(match.group(1))
if text.strip() != "":
# 유닛 종료
text = html_to_plain_text(text)
sub = f"{subtitle_count}\n{start_time} --> {time}\n{text.strip()}\n\n"
srt_sub += sub
subtitle_count += 1
start_time = time # 자막 파일 내용중에 에러난 부분이 있을 수 있어서 유지가 필요
text = ""
else:
start_time = time
text = html_to_plain_text(line)
elif line.upper().startswith("</BODY>"):
break
else:
text += html_to_plain_text(line) + "\n"
#
with open(srt_file, "w", encoding="utf-8") as srt:
srt.write(srt_sub)
print("srt_file", srt_file)
# -----------------------------------------------------------------------------
def main():
parser = argparse.ArgumentParser(
description="Convert SMI file to SRT file.",
usage="%(prog)s <file_path>",
)
parser.add_argument("file_path", metavar="FILE", type=str, help="The target file")
args = parser.parse_args()
target_file = args.file_path
#
root, ext = os.path.splitext(target_file)
if ext != ".smi":
print("smi 파일이 아닙니다.")
return
srt_file_path = change_file_extension(target_file, "srt")
convert_smi_to_srt(target_file, srt_file_path)
if __name__ == "__main__":
main()
//
반응형
'Code > Python' 카테고리의 다른 글
python 패키지 의존성 검사 방법 (패키지 관리 방법) (0) | 2024.06.30 |
---|---|
SRT 자막 파일을 SMI 파일로 변환 시키는 소스 코드 (0) | 2024.06.18 |
python tray 아이콘 처리 (0) | 2024.04.17 |
python 키 입력 처리 - pynput 사용 (0) | 2024.04.17 |
파이썬 사용자 모듈 import 방법 (0) | 2023.09.16 |