TIMBOVILL's picture
Upload 5 files
f5799e7 verified
"""YouTube Downloader"""
import io
import os
import yt_dlp
from PIL import Image
from modules.console_colors import ULTRASINGER_HEAD
from modules.Image.image_helper import crop_image_to_square
def get_youtube_title(url: str) -> tuple[str, str]:
"""Get the title of the YouTube video"""
ydl_opts = {}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
result = ydl.extract_info(
url, download=False # We just want to extract the info
)
if "artist" in result:
return result["artist"].strip(), result["track"].strip()
if "-" in result["title"]:
return result["title"].split("-")[0].strip(), result["title"].split("-")[1].strip()
return result["channel"].strip(), result["title"].strip()
def download_youtube_audio(url: str, clear_filename: str, output_path: str):
"""Download audio from YouTube"""
print(f"{ULTRASINGER_HEAD} Downloading Audio")
ydl_opts = {
"format": "bestaudio/best",
"outtmpl": output_path + "/" + clear_filename,
"postprocessors": [
{"key": "FFmpegExtractAudio", "preferredcodec": "mp3"}
],
}
start_download(ydl_opts, url)
def download_youtube_thumbnail(url: str, clear_filename: str, output_path: str):
"""Download thumbnail from YouTube"""
print(f"{ULTRASINGER_HEAD} Downloading thumbnail")
ydl_opts = {
"skip_download": True,
"writethumbnail": True,
}
download_and_convert_thumbnail(ydl_opts, url, clear_filename, output_path)
def download_and_convert_thumbnail(ydl_opts, url: str, clear_filename: str, output_path: str) -> None:
"""Download and convert thumbnail from YouTube"""
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(url, download=False)
thumbnail_url = info_dict.get("thumbnail")
if thumbnail_url:
response = ydl.urlopen(thumbnail_url)
image_data = response.read()
image = Image.open(io.BytesIO(image_data))
image = image.convert('RGB') # Convert to RGB to avoid transparency or RGBA issues
image_path = os.path.join(output_path, clear_filename + " [CO].jpg")
image.save(image_path, "JPEG")
crop_image_to_square(image_path)
def download_youtube_video(url: str, clear_filename: str, output_path: str) -> None:
"""Download video from YouTube"""
print(f"{ULTRASINGER_HEAD} Downloading Video")
ydl_opts = {
"format": "bestvideo[ext=mp4]/mp4",
"outtmpl": output_path + "/" + clear_filename + ".mp4",
}
start_download(ydl_opts, url)
def start_download(ydl_opts, url: str) -> None:
"""Start the download the ydl_opts"""
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
errors = ydl.download(url)
if errors:
raise Exception("Download failed with error: " + str(errors))