added link
This commit is contained in:
parent
3a6eccebb5
commit
4d6ba5e6db
@ -1,6 +1,8 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
from fastapi import APIRouter, Form, HTTPException
|
from fastapi import APIRouter, Form, HTTPException
|
||||||
from starlette.requests import Request
|
from starlette.requests import Request
|
||||||
from starlette.responses import HTMLResponse
|
from starlette.responses import HTMLResponse, FileResponse
|
||||||
from starlette.templating import Jinja2Templates
|
from starlette.templating import Jinja2Templates
|
||||||
|
|
||||||
from src.core.ydl import VideoDownloader
|
from src.core.ydl import VideoDownloader
|
||||||
@ -18,17 +20,30 @@ async def index(request: Request):
|
|||||||
|
|
||||||
|
|
||||||
@main_router.post('/submit')
|
@main_router.post('/submit')
|
||||||
def disable_cat(request: Request, link: str = Form(...)):
|
async def get_url_for_download_video(request: Request, link: str = Form(...)):
|
||||||
downloader = VideoDownloader(link=link, ydl_opts={
|
file_name = VideoDownloader.get_unique_video_filename()
|
||||||
|
ydl_opts = {
|
||||||
"forceurl": True,
|
"forceurl": True,
|
||||||
"username": "garick.badalov@yandex.ru",
|
'outtmpl': f'downloads/%(extractor_key)s/{file_name}.%(ext)s'
|
||||||
"password": "garik876.",
|
# "username": "garick.badalov@yandex.ru",
|
||||||
})
|
# "password": "garik876.",
|
||||||
|
}
|
||||||
|
|
||||||
|
downloader = VideoDownloader(link=link, ydl_opts=ydl_opts)
|
||||||
try:
|
try:
|
||||||
result = downloader.download()
|
result = downloader.download()
|
||||||
|
file_path = str(request.base_url) + f"{file_name}.mp4"
|
||||||
except SiteNotImplementedException as ex:
|
except SiteNotImplementedException as ex:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=400,
|
status_code=400,
|
||||||
detail=ex.message
|
detail=ex.message
|
||||||
)
|
)
|
||||||
return templates.TemplateResponse("index.html", {"request": request, "result": result["url"]})
|
return templates.TemplateResponse("index.html", {"request": request, "result": file_path})
|
||||||
|
|
||||||
|
|
||||||
|
@main_router.get('/{file_path}', response_class=FileResponse)
|
||||||
|
async def download_video(request: Request, file_path):
|
||||||
|
base = os.path.dirname(os.path.dirname(os.path.abspath(file_path)))
|
||||||
|
BASE_DOWNLOAD_DIR = os.path.join(base, "src", "downloads")
|
||||||
|
BASE_YOUTUBE_DIR = os.path.join(BASE_DOWNLOAD_DIR, "Youtube")
|
||||||
|
return BASE_YOUTUBE_DIR + f'/{file_path}'
|
||||||
|
@ -1,4 +1,8 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import os
|
||||||
|
import uuid
|
||||||
|
from datetime import datetime
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
import youtube_dl
|
import youtube_dl
|
||||||
@ -7,15 +11,25 @@ from src.exceptions.download_exceptions import SiteNotImplementedException
|
|||||||
|
|
||||||
|
|
||||||
class VideoDownloader:
|
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):
|
def __init__(self, link: str, ydl_opts: dict = None, username: str = None, password: str = None):
|
||||||
self.link = link
|
self.link = link
|
||||||
self.ydl_opts = ydl_opts
|
self.ydl_opts = ydl_opts
|
||||||
self.username = username
|
self.username = username
|
||||||
self.password = password
|
self.password = password
|
||||||
|
|
||||||
self.SUPPORTING_WEBSITES = [
|
@staticmethod
|
||||||
"ok.ru", "vk.com", "www.youtube.com"
|
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):
|
def download(self):
|
||||||
domain = urlparse(self.link).netloc
|
domain = urlparse(self.link).netloc
|
||||||
@ -25,5 +39,4 @@ class VideoDownloader:
|
|||||||
with youtube_dl.YoutubeDL(self.ydl_opts if self.ydl_opts else {}) as ydl:
|
with youtube_dl.YoutubeDL(self.ydl_opts if self.ydl_opts else {}) as ydl:
|
||||||
ydl.download([self.link])
|
ydl.download([self.link])
|
||||||
result = ydl.extract_info(self.link, download=False)
|
result = ydl.extract_info(self.link, download=False)
|
||||||
url = result['formats'][-1]
|
return result
|
||||||
return url
|
|
||||||
|
@ -13,5 +13,7 @@ app.include_router(
|
|||||||
main_router,
|
main_router,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
app.mount("/downloads", StaticFiles(directory="downloads"), name="downloads")
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
uvicorn.run("src.main:app", host="localhost", log_level="info")
|
uvicorn.run("src.main:app", host="localhost", log_level="info")
|
||||||
|
Loading…
Reference in New Issue
Block a user