为了自动给自己nas上的电影和美剧下字幕,测试了以下让chatgpt编写代码。经过不断提出要求,并针对运行的错误反馈过去,最后历经半天,终于写出来一个基本能用的字幕下载代码。总体感觉来说,他写的代码,并不是特别好读。在修改过程中,他也是经常不知道所以然在乱改。是否能改正确,取决于你交互指出问题的方式。而是否能发现并指出某些问题,需要能读懂代码。所以现阶段,至少chatgpt还没有到能让普通人变成程序员的可能。但是其确实能提高码农生产力,特别是技术过硬的,一眼能看出问题,指导低级码农的那种人。
特别说明,这个代码可能存在某些bug,我没有一行的审查,并不确保能真正用来下载字幕。
需要支持库的安装
pip install subliminal
pip install chardet
使用方法
sudo python3 getsub.py ./
代码如下:
import os
import sys
import glob
from subliminal import download_best_subtitles, region, Video
from subliminal import save_subtitles
def load_downloaded_files(downloaded_files_path):
if os.path.exists(downloaded_files_path):
with open(downloaded_files_path, 'r') as f:
return set(line.strip() for line in f)
else:
return set()
def save_downloaded_file(downloaded_files_path, file_path):
with open(downloaded_files_path, 'a') as f:
f.write(f"{file_path}\n")
def get_subtitle_name_with_index(subtitle_filename, index):
return f"{subtitle_filename[:-4]}_{index}.srt"
from subliminal import save_subtitles
def save_subtitle(subtitle, subtitle_filename):
new_subtitle_content = subtitle.content
detected_encoding = chardet.detect(new_subtitle_content)['encoding']
new_subtitle_text = new_subtitle_content.decode(detected_encoding, errors='ignore')
if os.path.exists(subtitle_filename):
with open(subtitle_filename, 'r', encoding=detected_encoding) as f:
existing_subtitle = f.read()
if existing_subtitle == new_subtitle_text:
print(f"Skipping {subtitle_filename} (already exists)")
return
else:
index = 1
while os.path.exists(get_subtitle_name_with_index(subtitle_filename, index)):
index += 1
subtitle_filename = get_subtitle_name_with_index(subtitle_filename, index)
with open(subtitle_filename, "w", encoding=detected_encoding) as f:
f.write(new_subtitle_text)
print(f"Downloaded subtitle saved as {subtitle_filename}")
def download_subtitles(folder_path, languages, downloaded_files_path):
region.configure("dogpile.cache.dbm", arguments={"filename": "cachefile.dbm"})
video_exts = ["*.mkv", "*.mp4", "*.avi", "*.mov", "*.wmv"]
video_files = []
for video_ext in video_exts:
all_files = glob.glob(os.path.join(folder_path, f"**/{video_ext}"), recursive=True)
valid_files = [file for file in all_files if "@eaDir" not in file]
video_files.extend(valid_files)
downloaded_files = load_downloaded_files(downloaded_files_path)
total_files = len(video_files)
processed_files = 0
for video_file in video_files:
if video_file in downloaded_files:
print(f"Skipping {video_file} (already downloaded)")
continue
try:
video = Video.fromname(video_file)
print(f"Downloading subtitles for {video_file}")
best_subtitles = download_best_subtitles([video], languages)
downloaded_subtitles = False
for subtitle in best_subtitles[video]:
file_name, file_extension = os.path.splitext(video_file)
subtitle_filename = f"{file_name}.{subtitle.language.alpha3}.srt"
save_subtitle(subtitle, subtitle_filename)
downloaded_subtitles = True
if not downloaded_subtitles:
print(f"No subtitles found for {video_file}")
else:
save_downloaded_file(downloaded_files_path, video_file)
except Exception as e:
print(f"Error processing {video_file}: {e}")
processed_files += 1
progress = (processed_files / total_files) * 100
print(f"Progress: {processed_files}/{total_files} ({progress:.2f}%)")
if __name__ == '__main__':
if len(sys.argv) < 2:
folder_path = "./"
else:
folder_path = sys.argv[1]
languages = {"zho", "eng"}
downloaded_files_path = "downloaded_files.txt"
download_subtitles(folder_path, languages, downloaded_files_path)