35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
# Импортируем необходимые модули
|
|
from fastapi import APIRouter, HTTPException, Query
|
|
from pydantic import BaseModel
|
|
import yt_dlp
|
|
import tempfile
|
|
from fastapi.responses import FileResponse
|
|
import os
|
|
|
|
router = APIRouter(prefix="/yt-dlp", tags=["yt-dlp"])
|
|
|
|
class DownloadRequest(BaseModel):
|
|
url: str
|
|
format: str = "best"
|
|
|
|
@router.post("/download")
|
|
async def download_video(data: DownloadRequest):
|
|
"""
|
|
Скачать видео по ссылке через yt-dlp и вернуть файл пользователю.
|
|
"""
|
|
save_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../data'))
|
|
os.makedirs(save_dir, exist_ok=True)
|
|
ydl_opts = {
|
|
'outtmpl': os.path.join(save_dir, '%(title)s.%(ext)s'),
|
|
'format': data.format,
|
|
}
|
|
try:
|
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
info = ydl.extract_info(data.url, download=True)
|
|
filename = ydl.prepare_filename(info)
|
|
except Exception as e:
|
|
raise HTTPException(status_code=400, detail=f"Ошибка загрузки: {e}")
|
|
if not os.path.exists(filename):
|
|
raise HTTPException(status_code=404, detail="Файл не найден после загрузки")
|
|
return FileResponse(filename, filename=os.path.basename(filename), media_type='application/octet-stream')
|