import logging import shutil from pathlib import Path import yt_dlp.postprocessor from yt_dlp import YoutubeDL class YTDownloader: def __init__(self, audiodir: Path, videodir: Path, cache: bool): self.audiodir = audiodir self.videodir = videodir self.cache = cache def download(self, url: str, artist: str, song: str, spotify_uri: str): if (Path(self.videodir) / f"{artist} - {song}.mp4").is_file() and (Path(self.audiodir) / f"{artist} - {song}.mp3").is_file() and self.cache: return ydl_opts = { 'logger': logging.getLogger("usdbdl"), 'format': 'mp4/best', 'outtmpl': f'{str((Path(self.audiodir) / f"{artist} - {song}").resolve())}.%(ext)s', # ℹ️ See help(yt_dlp.postprocessor) for a list of available Postprocessors and their arguments 'keepvideo': True, 'postprocessors': [{ # Extract audio using ffmpeg 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', }] } with YoutubeDL(ydl_opts) as ydl: ydl.download(url) Path(self.videodir).mkdir(parents=True, exist_ok=True) shutil.move(Path(self.audiodir) / f"{artist} - {song}.mp4", Path(self.videodir) / f"{artist} - {song}.mp4")