From 4276e1f90b0604053e9e1e6a8876c65fd9a8b5c9 Mon Sep 17 00:00:00 2001 From: Skullheadx <94652084+Skullheadx@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:33:45 -0400 Subject: [PATCH] add force --- README.md | 8 ++-- requirements.txt | 3 +- ytdl/__main__.py | 20 ++++----- ytdl/__pycache__/__main__.cpython-312.pyc | Bin 1963 -> 1914 bytes ytdl/__pycache__/funcmodule.cpython-312.pyc | Bin 3731 -> 4007 bytes ytdl/funcmodule.py | 43 ++++++++++++-------- 6 files changed, 39 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index ce4731c..e366830 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,11 @@ downloads the audio and video and stitches it together in the current directory. - `-a` - audio only - `-v` - video only - `-av` - audio + video separate - +- `-f` - force replace if file exists # TODO: -- [ ] add video only +- [x] add video only - [ ] add audio + video separate - [ ] add stitched together -- [ ] add force replace -- [ ] add album \ No newline at end of file +- [x] add force replace +- [ ] add album name diff --git a/requirements.txt b/requirements.txt index 4b5e95b..e287554 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ pytubefix~=8.0.0 -ffmpeg-python +requests~=2.32.3 +ffmpeg \ No newline at end of file diff --git a/ytdl/__main__.py b/ytdl/__main__.py index 5f29931..8c7b198 100644 --- a/ytdl/__main__.py +++ b/ytdl/__main__.py @@ -9,11 +9,13 @@ def main(): links = [] mode = "-d" + force = False assert len(args) > 0, "no args :(" for arg in args: if arg in modes: mode = arg - + if arg == '-f': # force + force = True if "youtube" in arg or "youtu.be" in arg: links.extend(arg.split(" ")) @@ -27,18 +29,10 @@ def main(): links = check_playlist(links) assert len(links) > 0, "Should be at least one song in playlist" - if mode == "-d": - pass - elif mode == "-a": - # 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): link for link in links} - - elif mode == "-v": - pass - elif mode == "-av": - pass + # 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} if __name__ == '__main__': diff --git a/ytdl/__pycache__/__main__.cpython-312.pyc b/ytdl/__pycache__/__main__.cpython-312.pyc index 446f645b253662be92cb07d522982f0eee3aa86d..500e48998f4c7f9e96dca406be80ceaf58a9cef1 100644 GIT binary patch delta 786 zcmZ3@|BH|BG%qg~0|Ns?Zvb!lXO@Y4^SD45xRJp%(n6Jrg73q!0014Auq4QmZ!8AB0M4QnlP4QmQ}wgv-35mO3BElUb# z4Qm-gF>4AJm}cyetYOMxhZ=!I)v#u9B5|S26z@C? z3@He=@gTX48RVj3E-!`@-pP9zr5X7q-(>VuM5yIQs4d|JnFzuu0+XGYOhpl@1QDtx zFJ`h8WvgLwVd!U1X3AtpW{Q<&V5nuUVVnGwN#2;fhPj4iH4DfT28J5;$xJ=6EDW_A zwd^SjAh??D9H|wl$)zRvMYmXT zGV`*Fgc%qZib27tFj<||j!T|_fq@Mq6hAqiRhjh$k6?rAdMA^L`=bzk?n{XlPeqZQAUu+Q8rdre)d}&@$tEd9GQ9X@tPb(T$3f)^-_fx z7#NB`{s2klCFZ8a$FF4g3<}aBkb$>2Y;yBcN^?@}iqsew7(i*JSd)Q);R7=xBjarb suKNrYw;3cqvB@$fGJbGiWMJXxsJg@~d6R{s)$Ic_1B+CVDgy%p0F#}zSO5S3 delta 829 zcmeyxx0;{tG%qg~0|NuYs(C!=rmPeB=5cW_FfcGPFfe@HH*uSFeF-Z_7KCdURx^TV z28I-tY!?QGVs(u?U_Uwc_)W5nQ9|M`H)RWVb0cIU?^g&WT;_I;RmyQCeLTG z6=khqa$)FaOJ>SsNM?$aWMHUet6`n|kxAZ@Z8a0b%{6S3nR=vI7;4#T*-{ul5GKRO z05(qmY#zjHK^VJ|A(@GhA(^R`ZL%}7hVm~a-Nau^x@EtZbrZ{qK*3c6GQNr{FJB?C zD7{$0N@MaA<|F(?pvWo$1zZs*7AHrr6fts4KFuO6$DCM{ev2cuA~m_RB){kuOHO89 zc99qZ14A)L%VZu_J1#{A1_m~eNZI5NR^`bxtZIx8Ca-5zX5(fM5c$G4`37r8{R4LH zj*_OD8yq}0IC&?Cbjdv76~E3af00-II!XcQQYN1U|5Iy1+nn&tPFgn7kEuRa4>N3fsBG0D%vG`gM;S-GXt0S z&rh5T;t`B6mA{G&5{!Nm)jhb`Q`lM!ONN@1`1xT zDh39ITDBV2EXm1=jKZvJDQs(mCa+=BWM8Rxu%(FAaHNQ*NTi6TNTx`oNT%&*$uaf3r(g4sn5 z$vGkOBWFe~D8DSLf009fr|2CH-U&j}B_>Kt;JP4XaDmV83Ww1R4!#>KY}Z*NFS1Bp zVUd2q!g+y5VS&(ciG>mixGr#MUt!U?!7JF{c7vU}qols6<_^Em1f%Iz6RoZbt6UUT z*}!r^Smm;?>1BSi9fFtmtuAmxT(F6_%n@;c-|B{-@N}t(Qr88QE($8GNVy=WbXm~& zx}eQPL7N?+mj#`#3wm4>^tdeO)xicfov`8cM4BFRS>ZFdl@~ZI_gLt$!0G~*-W3-88{&#fd^U((H}tq@=y6%a^P;%t z1s0JTEL`pWjs6#8b$5g`X!&1Zar(l+z$4Oc(`hq<>AHl*MG1||+?v<94KH#VHn`l7 zQJG=2AmoCi*5vOz8q62?#(WvGa*^Sg|J4YhAB%NsuPJq@&;3u1jrlA ztZTR@?_$?vX3UbCe1Jo05{D>1Gm0{hZ>7{`GoS_DPm+u;Y;C1F&pdzRsI^56oC}M6oC|>6yX$+6wws16!8=Z zB$bdbm*SbtFqbJsJVmmGF-vU{tB4SoCsm>eaRoRM_HoDxN>?#3FhJGH)G%i0Okx!g zn9GD@AQL1Kxfww!Q)JV{YuP3XaLO~XO*Y`vWMr9az^TE9q8#K>DK&)GDjAd+3>k_U z%b6G%A{iJN7#Vt=S1?C1lrw6|Ow30&W$IZ~i1ZV9BMrX`l%*DjQfX2&-HcHoY!vcTw1G zN9ko@*XzPw7lpkp3;Q(qJONpyxk72Z#!8J9QWv;PuCSQiU=e^gWr@uOp6dp_7Y%$b zEBjrDOS%AZUGf(;1|E@qo5@0aqGESsG*-x5*R;N 0, "No available audio streams" - audio_stream = yt.streams.filter(only_audio=True).order_by("abr").last() + print(f"Fetching stream for {yt.title}") + stream = None + if mode == "-a": + assert len(yt.streams.filter(only_audio=True)) > 0, "No available audio streams" + stream = yt.streams.filter(only_audio=True).order_by("abr").last() + if mode == "-v": + assert len(yt.streams.filter(only_video=True)) > 0, "No available video streams" + stream = yt.streams.filter(only_video=True).order_by("resolution").last() - print(f"Downloading audio stream for {yt.title}") - audio_stream.download(filename=fix_filename(audio_stream.default_filename), skip_existing=True) + assert stream is not None, "mode is not valid" + print(f"Downloading stream for {yt.title}") + default_filename = "default " + fix_filename(stream.default_filename) + stream.download(filename=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) + thumbnail_filename = f'{filename}.jpg' + download_thumbnail(yt.thumbnail_url, thumbnail_filename) command = [ 'ffmpeg', - '-i', fix_filename(audio_stream.default_filename), + '-i', default_filename, '-i', thumbnail_filename, '-map', '1', '-map', '0', '-c', 'copy', '-disposition:v:0', 'attached_pic', - '-metadata', f'title={fix_filename(yt.title)}', + '-metadata', f'title={filename}', '-metadata', f'artist={yt.author}', '-metadata', f'comment={big_num_format(yt.views) + " views"}', '-metadata', f'date={yt.publish_date}', - fix_filename(audio_stream.title) + ".mp4", + filename + ".mp4", '-y' ] subprocess.run(command) # clean up tmp files os.remove(thumbnail_filename) - os.remove(fix_filename(audio_stream.default_filename)) + os.remove(default_filename) -- 2.54.0