From e117cb75e0b83b3332a6b69921efc8db084e6599 Mon Sep 17 00:00:00 2001 From: Skullheadx <94652084+Skullheadx@users.noreply.github.com> Date: Mon, 14 Oct 2024 02:09:23 -0400 Subject: [PATCH] caption --- ytdl/__pycache__/funcmodule.cpython-312.pyc | Bin 1731 -> 4611 bytes ytdl/funcmodule.py | 91 ++++++++++++-------- 2 files changed, 57 insertions(+), 34 deletions(-) diff --git a/ytdl/__pycache__/funcmodule.cpython-312.pyc b/ytdl/__pycache__/funcmodule.cpython-312.pyc index ca8b44a2d96b38f7a434c9bb262f6543bea4ec1e..f0891d8d30b073321d920d525a3b92dca624be12 100644 GIT binary patch literal 4611 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 diff --git a/ytdl/funcmodule.py b/ytdl/funcmodule.py index bb45b47..81f8319 100644 --- a/ytdl/funcmodule.py +++ b/ytdl/funcmodule.py @@ -36,42 +36,65 @@ def get_and_download(link): # print(f"{yt.title} is already downloaded") # return - # yt.check_availability() - # print(f"Fetching stream for {yt.title}") - # - # assert len(yt.streams.filter(only_audio=True)) > 0, "No available audio streams" - # audio_stream = yt.streams.filter(only_audio=True).order_by("abr").last() + yt.check_availability() + print(f"Fetching stream for {yt.title}") + + assert len(yt.streams.filter(only_audio=True)) > 0, "No available audio streams" + audio_stream = yt.streams.filter(only_audio=True).order_by("abr").last() # hierarchy: caption_hierarchy = ["ko", "ja", "zh", "en", "a.ko", "a.en"] + caption_exists = False + lang = None if len(yt.captions) > 0: - for caption in yt.captions: - print(yt.title, caption.lang_code) - # print(f"Downloading audio stream for {yt.title}") - # audio_stream.download(filename=fix_filename(audio_stream.default_filename), skip_existing=True) - # - # # create thumbnail file - # data = requests.get(yt.thumbnail_url).content - # thumbnail_filename = f'{fix_filename(audio_stream.title)}.jpg' - # with open(thumbnail_filename, 'wb') as f: - # f.write(data) - # - # command = [ - # 'ffmpeg', - # '-i', fix_filename(audio_stream.default_filename), - # '-i', thumbnail_filename, - # '-map', '0', - # '-map', '1', - # '-metadata', f'title={fix_filename(audio_stream.title)}', - # '-metadata', f'artist={yt.author}', - # '-metadata', f'date={yt.publish_date}', - # '-metadata', f'comment={big_num_format(yt.views) + " views"}', - # fix_filename(audio_stream.title) + ".mp4", - # '-y' - # ] - # subprocess.run(command) - # - # # clean up tmp files - # os.remove(thumbnail_filename) - # os.remove(fix_filename(audio_stream.default_filename)) + for c in caption_hierarchy: + if c in yt.captions.keys(): + yt.captions[c].download(title=fix_filename(yt.title)) + lang = c + caption_exists = True + break + print(f"Downloading audio stream for {yt.title}") + audio_stream.download(filename=fix_filename(audio_stream.default_filename), skip_existing=True) + + # create thumbnail file + data = requests.get(yt.thumbnail_url).content + thumbnail_filename = f'{fix_filename(audio_stream.title)}.jpg' + with open(thumbnail_filename, 'wb') as f: + f.write(data) + + if caption_exists: + command = [ + 'ffmpeg', + '-loop', '1', + '-i', thumbnail_filename, + '-i', fix_filename(audio_stream.default_filename), + '-vf', f'subtitles={fix_filename(yt.title) + f" ({lang}).srt"}', + '-metadata', f'title={fix_filename(audio_stream.title)}', + '-metadata', f'artist={yt.author}', + '-metadata', f'date={yt.publish_date}', + '-metadata', f'comment={big_num_format(yt.views) + " views"}', + '-shortest', + fix_filename(audio_stream.title) + ".mp4", + '-y' + ] + else: + command = [ + 'ffmpeg', + '-i', fix_filename(audio_stream.default_filename), + '-i', thumbnail_filename, + '-map', '0', + '-map', '1', + '-metadata', f'title={fix_filename(audio_stream.title)}', + '-metadata', f'artist={yt.author}', + '-metadata', f'date={yt.publish_date}', + '-metadata', f'comment={big_num_format(yt.views) + " views"}', + fix_filename(audio_stream.title) + ".mp4", + '-y' + ] + subprocess.run(command) + + # clean up tmp files + os.remove(thumbnail_filename) + os.remove(fix_filename(audio_stream.default_filename)) + os.remove(fix_filename(yt.title) + f" ({lang}).srt") -- 2.54.0