from __future__ import unicode_literals import os import uuid from datetime import datetime from urllib.parse import urlparse import youtube_dl from src.exceptions.download_exceptions import SiteNotImplementedException class VideoDownloader: SUPPORTING_WEBSITES = [ "ok.ru", "vk.com", "www.youtube.com", ] BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DOWNLOAD_DIR = os.path.join(BASE_DIR, "downloads") BASE_YOUTUBE_DIR = os.path.join(BASE_DOWNLOAD_DIR, "Youtube") def __init__(self, link: str, ydl_opts: dict = None, username: str = None, password: str = None): self.link = link self.ydl_opts = ydl_opts self.username = username self.password = password @staticmethod def get_unique_video_filename(): prefix = f'vid_{datetime.now().strftime("%Y%m%d%H%M%S")}' random_uuid4 = uuid.uuid4().hex[:8] filename = f"{prefix}_{random_uuid4}" return filename def download(self): domain = urlparse(self.link).netloc if domain not in self.SUPPORTING_WEBSITES: raise SiteNotImplementedException with youtube_dl.YoutubeDL(self.ydl_opts if self.ydl_opts else {}) as ydl: ydl.download([self.link]) result = ydl.extract_info(self.link, download=False) return result