2023-09-15 01:29:43 +03:00
|
|
|
import errno
|
|
|
|
import os
|
|
|
|
|
|
|
|
from fastapi import HTTPException
|
|
|
|
|
|
|
|
from src.core.result import ResultTypeEnum, Result
|
|
|
|
from src.core.ydl import VideoDownloader
|
|
|
|
from src.exceptions.download_exceptions import SiteNotImplementedException
|
|
|
|
|
|
|
|
|
|
|
|
class BaseParser:
|
|
|
|
BASE_ENCODING = 'utf-8'
|
|
|
|
BASE_DIR = None
|
|
|
|
|
|
|
|
def __init__(self, params: dict):
|
|
|
|
self.params = params
|
|
|
|
|
|
|
|
def video_download(self):
|
|
|
|
ydl_opts = {
|
|
|
|
"format": self.params["format"],
|
|
|
|
"merge_output_format": self.params["merge_output_format"],
|
|
|
|
'outtmpl': self.params["outtmpl"],
|
|
|
|
"quiet": True
|
|
|
|
}
|
|
|
|
downloader = VideoDownloader(link=self.params["link"], ydl_opts=ydl_opts)
|
|
|
|
video_info = downloader.get_info()
|
2023-09-20 14:43:59 +03:00
|
|
|
#TODO Добавить динамеческое имя директории сервиса для проверки дублирования
|
2023-09-15 01:29:43 +03:00
|
|
|
if os.path.exists(
|
|
|
|
os.path.join(os.getcwd() + f"Youtube/{video_info['id']}_{video_info['width']}.{video_info['ext']}")
|
|
|
|
):
|
|
|
|
return Result(result_type=ResultTypeEnum.EXIST)
|
|
|
|
try:
|
|
|
|
downloader.ydl_opts["quiet"] = False
|
|
|
|
result = downloader.download()
|
2023-09-20 14:43:59 +03:00
|
|
|
return f"{video_info['extractor_key']}/{result['id']}_{result['width']}p.{result['ext']}"
|
2023-09-15 01:29:43 +03:00
|
|
|
except SiteNotImplementedException as ex:
|
|
|
|
raise HTTPException(
|
|
|
|
status_code=400,
|
|
|
|
detail=ex.message
|
|
|
|
)
|
|
|
|
|
|
|
|
def make_sure_path_exists(self,):
|
|
|
|
try:
|
|
|
|
os.makedirs(self.BASE_DIR)
|
|
|
|
except OSError as exception:
|
|
|
|
if exception.errno != errno.EEXIST:
|
|
|
|
raise
|
2023-09-21 00:21:03 +03:00
|
|
|
|
|
|
|
'''
|
|
|
|
TODO: скорее всего добавить процедуру для конвертации итогого файла через ffmpeg, используя
|
|
|
|
'''
|