為了自動(dòng)給自己nas上的電影和美劇下字幕,測(cè)試了以下讓chatgpt編寫(xiě)代碼。經(jīng)過(guò)不斷提出要求漩氨,并針對(duì)運(yùn)行的錯(cuò)誤反饋過(guò)去,最后歷經(jīng)半天遗增,終于寫(xiě)出來(lái)一個(gè)基本能用的字幕下載代碼叫惊。總體感覺(jué)來(lái)說(shuō)做修,他寫(xiě)的代碼霍狰,并不是特別好讀。在修改過(guò)程中饰及,他也是經(jīng)常不知道所以然在亂改蔗坯。是否能改正確,取決于你交互指出問(wèn)題的方式旋炒。而是否能發(fā)現(xiàn)并指出某些問(wèn)題步悠,需要能讀懂代碼签杈。所以現(xiàn)階段瘫镇,至少chatgpt還沒(méi)有到能讓普通人變成程序員的可能。但是其確實(shí)能提高碼農(nóng)生產(chǎn)力答姥,特別是技術(shù)過(guò)硬的铣除,一眼能看出問(wèn)題,指導(dǎo)低級(jí)碼農(nóng)的那種人鹦付。
特別說(shuō)明尚粘,這個(gè)代碼可能存在某些bug,我沒(méi)有一行的審查敲长,并不確保能真正用來(lái)下載字幕郎嫁。
需要支持庫(kù)的安裝
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)