diff --git a/src/core/master_service.py b/src/core/master_service.py index 8267945..20cee2f 100644 --- a/src/core/master_service.py +++ b/src/core/master_service.py @@ -15,6 +15,7 @@ from src.parsers.MyMail.my_mail_parser import MyMailParser from src.parsers.Yappy.yappy_parser import YappyParser from src.parsers.base_parser import BaseParser +# TODO: добавить логгер с временными метками в yt-dlp class MasterService: def __init__(self): diff --git a/src/core/ydl.py b/src/core/ydl.py index 7147769..5f083a4 100644 --- a/src/core/ydl.py +++ b/src/core/ydl.py @@ -19,17 +19,14 @@ class VideoDownloader: self.ydl_opts = ydl_opts self.username = username self.password = password + self.info = None def get_info(self): with YoutubeDL(self.ydl_opts if self.ydl_opts else {}) as ydl: - return ydl.extract_info(self.link, download=False) + self.info = ydl.extract_info(self.link, download=False) def download(self): - domain = urlparse(self.link).netloc - # if domain not in self.SUPPORTING_WEBSITES: - # raise SiteNotImplementedException - + # TODO: удалить все файлы связанные с текущим видео, которые сейчас остались with 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 + return self.info diff --git a/src/parsers/base_parser.py b/src/parsers/base_parser.py index 38ea0f2..78bb6b6 100644 --- a/src/parsers/base_parser.py +++ b/src/parsers/base_parser.py @@ -20,8 +20,8 @@ class BaseParser: "quiet": True } downloader = VideoDownloader(link=self.params["link"], ydl_opts=ydl_opts) - video_info = downloader.get_info() - path_to_video = f"{video_info['extractor_key']}/{video_info['id']}_{video_info['width']}p.{video_info['ext']}" + downloader.get_info() + path_to_video = f"{downloader.info['extractor_key']}/{downloader.info['id']}_{downloader.info['width']}p.{downloader.info['ext']}" if os.path.exists(os.path.join(os.getcwd() + "/downloads/" + path_to_video)): raise FileAlreadyExistException(message=path_to_video) downloader.ydl_opts["quiet"] = False diff --git a/src/web/main.py b/src/web/main.py index 71552ff..45ac821 100644 --- a/src/web/main.py +++ b/src/web/main.py @@ -47,20 +47,33 @@ async def is_task_already_done_or_exist(redis: RedisClient, link: str): async def index(request: Request): return templates.TemplateResponse("index.html", {"request": request}) - @app.post('/submit/') async def get_url_for_download_video(request: Request, data: SubmitIn = Depends()): + ''' + TODO: + Сабмит должен проверить что задача может быть уже выполненой (отдать ссылку в ответе) + или ещё в работе (сообщить об этом в ответе, можно вывести на форму, что такая ссылка уже скачивается, ожидайте) + Если условия выше провалены, то мы делаем новую задачу в очередь с переданными параметрами и сообщаем об этом клиенту с кодом (200 или 201) + + Дополнительно, нужен отдельный метод (ури), который позволит получать статус задачи. Опрашиваться примерно раз в 5с, + возможны увелечения тайминга в зависимости от ответа апи (на будущее) + Варианты ответа + 1) такой задачи нет (404) + 2) такая задача есть и выполняется (200 ли?) + 3) такая задача есть и завершена (200 и выдать ссылку на загрузку) + 4) такая задача есть и завершена, но с ошибкой (500 и сообщение о том, что можно попробовать выполнить задачу занов, + попутно удалив задачу из выполненых, с очисткой мусора за ней) + ''' red = RedisClient() task_done = await is_task_already_done_or_exist(red, data.link) if task_done: link_to_download_video = str(request.base_url) + "get/?file_path=" + task_done["result"] return JSONResponse({"result": link_to_download_video}) - + # TODO: учесть, что если делать запрос CURL\urllib3\etc, в теле может быть несколько ссылок -> должно быть создано несколько задач async with await connect("amqp://guest:guest@localhost/") as connection: # Creating a channel channel = await connection.channel() body = [ - { "link": data.link, "format": f"bestvideo[ext={data.format.value}]+bestaudio[ext={data.format.value}]/best[ext={data.format.value}]/best", @@ -91,6 +104,7 @@ async def get_url_for_download_video(request: Request, data: SubmitIn = Depends( if literal_eval(message.decode('utf-8'))["link"] == link["link"] ] error_tasks = [tasks.pop(tasks.index(error_task)) for error_task in tasks if error_task["status"] == "error"] + # TODO: если уже была попытка сделать задачу и в редисе она с ошибкой, то переташить её в очередь на выполнение с очисткой состояние об ошибке if len(error_tasks) > 0: return JSONResponse({"result": f"STATUS: ERROR {error_tasks[-1]['result']}"}) if len(tasks) > 0: @@ -103,6 +117,7 @@ async def get_url_for_download_video(request: Request, data: SubmitIn = Depends( continue link_to_download_video = str(request.base_url) + "get/?file_path=" + task["result"] + # TODO: возможно возвращать идентификаторы задач aka куски ссылок return JSONResponse({"result": link_to_download_video}) diff --git a/src/web/schemes/submit.py b/src/web/schemes/submit.py index 2da27b4..0915935 100644 --- a/src/web/schemes/submit.py +++ b/src/web/schemes/submit.py @@ -4,14 +4,26 @@ from enum import Enum from fastapi import Form -class FormatEnum(Enum): +''' +vext: Video Extension (mp4 > mov > webm > flv > other). If --prefer-free-formats is used, webm is preferred. +aext: Audio Extension (m4a > aac > mp3 > ogg > opus > webm > other). If --prefer-free-formats is used, the order changes to ogg > opus > webm > mp3 > m4a > aac +''' + +class VideoFormatEnum(Enum): format_3gp = "3gp" - format_aac = "aac" format_flv = "flv" + format_mp4 = "mp4" + format_mov = "mov" + format_webm = "webm" + +class AudioFormatEnum(Enum): + format_aac = "aac" format_m4a = "m4a" format_mp3 = "mp3" - format_mp4 = "mp4" format_ogg = "ogg" + format_opus = "opus" + format_webm = "webm" + format_wav = "wav" class MergeOutputFormatEnum(Enum): @@ -25,6 +37,7 @@ class MergeOutputFormatEnum(Enum): @dataclass class SubmitIn: link: str = Form(...) - format: FormatEnum = Form(...) + video_format: VideoFormatEnum = Form(...) + audio_format: AudioFormatEnum = Form(...) merge_output_format: MergeOutputFormatEnum = Form(...) diff --git a/src/web/templates/index.html b/src/web/templates/index.html index 254a48a..fdc8d7a 100644 --- a/src/web/templates/index.html +++ b/src/web/templates/index.html @@ -72,7 +72,8 @@