import requests
import subprocess
import os
+import glob
def check_playlist(links):
return links
-def get_audio_metadata_stream(link):
- yt = YouTube(link)
- yt.check_availability()
- print(f"Fetching stream for {yt.title}")
- assert len(yt.streams.filter(only_audio=True)) > 0, "No available audio streams"
- yield yt.streams.filter(only_audio=True).order_by("abr").last()
- yield {
- "title": yt.title,
- "artist": yt.author,
- "thumbnail_url": yt.thumbnail_url,
- "publish_date": yt.publish_date,
- "views": yt.views
- }
-
def big_num_format(num): # https://stackoverflow.com/a/579376
magnitude = 0
while abs(num) >= 1000:
return '%.1f%s' % (num, ['', 'K', 'M', 'B'][magnitude])
-def download_audio_stream(audio_stream, metadata):
- print(f"Downloading audio stream for {audio_stream.title}")
- audio_stream.download()
-
- # create thumbnail file
- data = requests.get(metadata["thumbnail_url"]).content
- thumbnail_filename = f'{audio_stream.title}.jpg'
- with open(thumbnail_filename, 'wb') as f:
- f.write(data)
-
- command = [
- 'ffmpeg',
- '-i', audio_stream.default_filename,
- '-i', thumbnail_filename,
- '-map', '0',
- '-map', '1',
- '-metadata', f'title={audio_stream.title}',
- '-metadata', f'artist={metadata["artist"]}',
- '-metadata', f'date={metadata["publish_date"]}',
- '-metadata', f'comment={big_num_format(metadata["views"]) + " views"}',
- audio_stream.title + ".mp4",
- '-y'
- ]
- subprocess.run(command)
-
- # clean up tmp files
- os.remove(thumbnail_filename)
- os.remove(audio_stream.default_filename)
+def fix_filename(filename):
+ for i in ['/', ':', '*', '?', '"', '<', '>', '|']:
+ filename = filename.replace(i, '')
+ return filename
def get_and_download(link):
yt = YouTube(link)
+ if fix_filename(yt.title) + '.mp4' in glob.glob("*.mp4"):
+ 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()
- metadata = {
- "title": yt.title,
- "artist": yt.author,
- "thumbnail_url": yt.thumbnail_url,
- "publish_date": yt.publish_date,
- "views": yt.views
- }
- print(f"Downloading audio stream for {audio_stream.title}")
- audio_stream.download()
+ 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(metadata["thumbnail_url"]).content
- thumbnail_filename = f'{audio_stream.title}.jpg'
+ 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', audio_stream.default_filename,
+ '-i', fix_filename(audio_stream.default_filename),
'-i', thumbnail_filename,
'-map', '0',
'-map', '1',
- '-metadata', f'title={audio_stream.title}',
- '-metadata', f'artist={metadata["artist"]}',
- '-metadata', f'date={metadata["publish_date"]}',
- '-metadata', f'comment={big_num_format(metadata["views"]) + " views"}',
- audio_stream.title + ".mp4",
- '-y'
+ '-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",
+ '-n'
]
subprocess.run(command)
# clean up tmp files
os.remove(thumbnail_filename)
- os.remove(audio_stream.default_filename)
\ No newline at end of file
+ os.remove(fix_filename(audio_stream.default_filename))