From d97e9ab4f76e41406e51faad9ac833bbac672635 Mon Sep 17 00:00:00 2001 From: Skullheadx <94652084+Skullheadx@users.noreply.github.com> Date: Mon, 14 Oct 2024 14:00:18 -0400 Subject: [PATCH] `-av' works now --- ytdl/__main__.py | 4 +- ytdl/__pycache__/__main__.cpython-312.pyc | Bin 1914 -> 1904 bytes ytdl/__pycache__/funcmodule.cpython-312.pyc | Bin 4007 -> 6610 bytes ytdl/funcmodule.py | 58 ++++++++++++++++++-- 4 files changed, 56 insertions(+), 6 deletions(-) diff --git a/ytdl/__main__.py b/ytdl/__main__.py index 8c7b198..bc86369 100644 --- a/ytdl/__main__.py +++ b/ytdl/__main__.py @@ -1,5 +1,5 @@ import sys -from .funcmodule import check_playlist, get_and_download +from .funcmodule import check_playlist, download import concurrent.futures @@ -32,7 +32,7 @@ def main(): # Use ThreadPoolExecutor to run downloads concurrently with concurrent.futures.ThreadPoolExecutor() as executor: # Schedule the download_audio_stream function for each audio stream - futures = {executor.submit(get_and_download, link, mode, force): link for link in links} + futures = {executor.submit(download, link, mode, force): link for link in links} if __name__ == '__main__': diff --git a/ytdl/__pycache__/__main__.cpython-312.pyc b/ytdl/__pycache__/__main__.cpython-312.pyc index 500e48998f4c7f9e96dca406be80ceaf58a9cef1..0a297c4dd31c12fa39efaaabe4bbf139438379f6 100644 GIT binary patch delta 105 zcmeyx_koZ1G%qg~0|NuY=Sbf4#}j!Q896pi-^0QfyE%kanb9OD{IXEQ#h~yLDibWG z+fTG#VzDA*gUJrj%fj{tL@o-uUI+^BV80*~@tu`{%kToH!OurR5tG-lt>iSg%^>-S MO_nioay+{<0IItsV*mgE delta 138 zcmeys_luABG%qg~0|Ns?Zvb!l=ZUGl)tuP7UD2-#tBK=iV(`w5YY!oC-x;yc(c2qk=HW#BTrz-jRFkx;_q t#cV58EN(MMeqxhlOl17vz{tSD(@}MaS@I?eN2}WhW(F3iB2@+k1^`YtFCqW{ diff --git a/ytdl/__pycache__/funcmodule.cpython-312.pyc b/ytdl/__pycache__/funcmodule.cpython-312.pyc index 8d42a165efac31556f9e183f8406eb9620c507fb..58dc6300ea2845b9197da7e2fb4f9647fbdbdb5f 100644 GIT binary patch literal 6610 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 delta 1474 zcmca)yj-5|G%qg~0|Ns?X$WunA5{!Nm)jhb`Q`lMts2$a{?utPzi<fT8ySRli64WbW%i9#A?`5 z#A-NF#8V_v#8V_wq*A0)WKv{Pd+SfU9xn>kAh zI;bmFUBCXBog)2)YKIC>R+^ zjA7zgCNLI)uHk^i6ROI|^*nNu#aM-SdS+KJM>3Q%YO4BGP3~b=)e~_`ElJME%u81& zE-6Y)%vDIsFH)#t(oGD}WW2?dpO;e^pIDlbnO_8old8#Tyb8iqOuA)o$+FCp)cmT+ zQM?+$!g=`$x%nxn3Yo;wy^2XUvx-GGH?iOrqv0(^gDNK7?RG&zz_E#Q_wN@`kSX--LeT4qjaUSe+QEsm7@^1Ph<#FSecMX80Qsl_G5 zx0usYOK$O&WR&J6a~%;%hcYxE9%hm4F;SIiFS3jxh~nU~X<=UP>`Yw*mqb@qv^I zq^Fj|C+4NZ!<<(X%)r2)$iTo*oWnG^mLrVu$z(15TkIwmc9Fx5TmK%K6W#H1dz^VSLn1_LZ;kbg37Z39(9#$_=c1=b% zP3|I71_p*AFA(7YBJ3xdN@_3$PtKK;;tFG6U;w55VvWfYCDpjT@E9;E6bUdeFaQAP C!8zjq diff --git a/ytdl/funcmodule.py b/ytdl/funcmodule.py index bc52f5e..8135523 100644 --- a/ytdl/funcmodule.py +++ b/ytdl/funcmodule.py @@ -35,7 +35,8 @@ def download_thumbnail(thumbnail_url, thumbnail_filename): with open(thumbnail_filename, 'wb') as f: f.write(data) -def get_and_download(link, mode, force=False): + +def download(link, mode, force=False): yt = YouTube(link) filename = fix_filename(yt.title) if (filename + '.mp4' in glob.glob("*.mp4")) and not force: @@ -43,6 +44,16 @@ def get_and_download(link, mode, force=False): return yt.check_availability() + thumbnail_filename = f'{filename}.jpg' + download_thumbnail(yt.thumbnail_url, thumbnail_filename) + + if mode == '-a' or mode == '-v': + download_single_stream(yt, filename,thumbnail_filename, mode) + elif mode == '-av' or mode == '-d': + download_double_stream(yt, filename, thumbnail_filename, mode) + + +def download_single_stream(yt, filename, thumbnail_filename, mode): print(f"Fetching stream for {yt.title}") stream = None if mode == "-a": @@ -57,9 +68,6 @@ def get_and_download(link, mode, force=False): default_filename = "default " + fix_filename(stream.default_filename) stream.download(filename=default_filename, skip_existing=True) - thumbnail_filename = f'{filename}.jpg' - download_thumbnail(yt.thumbnail_url, thumbnail_filename) - command = [ 'ffmpeg', '-i', default_filename, @@ -80,3 +88,45 @@ def get_and_download(link, mode, force=False): # clean up tmp files os.remove(thumbnail_filename) os.remove(default_filename) + + +def download_double_stream(yt, filename,thumbnail_filename, mode): + print(f"Fetching streams 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() + assert len(yt.streams.filter(only_video=True)) > 0, "No available video streams" + video_stream = yt.streams.filter(only_video=True).order_by("resolution").last() + + print(f"Downloading streams for {yt.title}") + audio_default_filename = "default audio " + fix_filename(audio_stream.default_filename) + video_default_filename = "default video " + fix_filename(video_stream.default_filename) + + audio_stream.download(filename=audio_default_filename, skip_existing=True) + video_stream.download(filename=video_default_filename, skip_existing=True) + + if mode == '-av': + for suffix, stream in [(" (audio only)", audio_default_filename), (" (video only)", video_default_filename)]: + print(suffix, stream, "jahdnfjlkahwejklfaw") + + command = [ + 'ffmpeg', + '-i', stream, + '-i', thumbnail_filename, + '-map', '1', + '-map', '0', + '-c', 'copy', + '-disposition:v:0', 'attached_pic', + '-metadata', f'title={filename}', + '-metadata', f'artist={yt.author}', + '-metadata', f'comment={big_num_format(yt.views) + " views"}', + '-metadata', f'date={yt.publish_date}', + filename + suffix + ".mp4", + '-y' + ] + subprocess.run(command) + + # clean up tmp files + os.remove(thumbnail_filename) + os.remove(audio_default_filename) + os.remove(video_default_filename) + -- 2.54.0