Доделал до рабочего концепта
This commit is contained in:
@@ -8,5 +8,7 @@ router = APIRouter()
|
||||
|
||||
@router.post("/", response_model=TaskCreateResponse)
|
||||
async def download_video(data: DownloadRequest):
|
||||
task = download_youtube.delay(data.url, data.quality)
|
||||
print("Get Request. Try to set task")
|
||||
task = download_youtube.delay(url=str(data.url), quality=data.quality)
|
||||
print("Set task. Return task response")
|
||||
return TaskCreateResponse(task_id=task.id, status=task.status)
|
||||
|
||||
@@ -11,10 +11,10 @@ celery_app = Celery(
|
||||
|
||||
|
||||
celery_app.conf.update(
|
||||
broker_use_ssl=ssl_options,
|
||||
redis_backend_use_ssl=ssl_options,
|
||||
task_serializer=["json"],
|
||||
result_serializer=["json"],
|
||||
# broker_use_ssl=ssl_options,
|
||||
# redis_backend_use_ssl=ssl_options,
|
||||
task_serializer="json",
|
||||
result_serializer="json",
|
||||
accept_content=["json"],
|
||||
enable_utc=True,
|
||||
timezone="UTC",
|
||||
|
||||
@@ -7,8 +7,8 @@ class DownloadRequest(BaseModel):
|
||||
|
||||
|
||||
class DownloadResponse(BaseModel):
|
||||
video: HttpUrl
|
||||
audio: HttpUrl
|
||||
video: str
|
||||
audio: str
|
||||
|
||||
|
||||
class TaskCreateResponse(BaseModel):
|
||||
|
||||
@@ -5,9 +5,9 @@ from app.schemas import DownloadRequest, DownloadResponse
|
||||
class YouTubeService:
|
||||
@staticmethod
|
||||
def download(data: DownloadRequest):
|
||||
key_prefix = f"{data.url}@{data.quality}@"
|
||||
s3 = S3ChunkUploadBackend(key_prefix)
|
||||
manager = YtDlpManager(data.url, s3)
|
||||
s3 = S3ChunkUploadBackend("")
|
||||
manager = YtDlpManager(str(data.url), s3)
|
||||
s3.key_prefix = f"{manager.id}@{data.quality}@"
|
||||
video_url = manager.download_video(data.quality)
|
||||
audio_url = manager.download_audio()
|
||||
return DownloadResponse(video=video_url, audio=audio_url)
|
||||
|
||||
@@ -11,6 +11,8 @@ from app.schemas import DownloadRequest
|
||||
retry_backoff=True,
|
||||
)
|
||||
def download_youtube(self, url: str, quality: int) -> dict:
|
||||
print("Get Task. Try to make them")
|
||||
request = DownloadRequest(url=url, quality=quality)
|
||||
response = YouTubeService.download(request)
|
||||
print("Task make successfully. Return response")
|
||||
return response.model_dump()
|
||||
|
||||
@@ -4,6 +4,8 @@ from abc import ABC, abstractmethod
|
||||
import boto3
|
||||
from botocore.client import Config
|
||||
|
||||
from app.core.config import settings
|
||||
|
||||
|
||||
class ChunkUploadBackend(ABC):
|
||||
@abstractmethod
|
||||
@@ -49,20 +51,16 @@ class DiskChunkUploadBackend(ChunkUploadBackend):
|
||||
|
||||
class S3ChunkUploadBackend(ChunkUploadBackend):
|
||||
def __init__(self, key_prefix: str = ""):
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv(".env")
|
||||
|
||||
self.s3 = boto3.client(
|
||||
service_name="s3",
|
||||
aws_access_key_id=os.getenv("S3_ACCESS_KEY"),
|
||||
aws_secret_access_key=os.getenv("S3_SECRET_KEY"),
|
||||
endpoint_url=os.getenv("S3_ENDPOINT_URL"),
|
||||
region_name=os.getenv("S3_REGION_NAME"),
|
||||
aws_access_key_id=settings.S3_ACCESS_KEY,
|
||||
aws_secret_access_key=settings.S3_SECRET_KEY,
|
||||
endpoint_url=settings.S3_ENDPOINT_URL,
|
||||
region_name=settings.S3_REGION_NAME,
|
||||
use_ssl=True,
|
||||
config=Config(signature_version=os.getenv("S3_SIGNATURE_VERSION")),
|
||||
config=Config(signature_version=settings.S3_SIGNATURE_VERSION),
|
||||
)
|
||||
self.bucket = os.getenv("S3_BUCKET_NAME")
|
||||
self.bucket = settings.S3_BUCKET_NAME
|
||||
self.key_prefix = key_prefix
|
||||
self.upload_id = None
|
||||
self.parts = []
|
||||
|
||||
@@ -34,6 +34,10 @@ class YtDlpManager:
|
||||
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
||||
self.info = ydl.extract_info(self.url, download=False)
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
return self.info.get("id")
|
||||
|
||||
@property
|
||||
def title(self) -> str:
|
||||
"""Возвращает title видео"""
|
||||
|
||||
@@ -9,7 +9,7 @@ dependencies = [
|
||||
"celery>=5.6.2",
|
||||
"fastapi[standard]>=0.129.0",
|
||||
"httpx[http2]>=0.28.1",
|
||||
"python-dotenv>=1.2.1",
|
||||
"redis>=7.2.0",
|
||||
"tqdm>=4.67.3",
|
||||
"yt-dlp[default]>=2026.2.4",
|
||||
]
|
||||
|
||||
13
uv.lock
generated
13
uv.lock
generated
@@ -780,6 +780,15 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redis"
|
||||
version = "7.2.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/9f/32/6fac13a11e73e1bc67a2ae821a72bfe4c2d8c4c48f0267e4a952be0f1bae/redis-7.2.0.tar.gz", hash = "sha256:4dd5bf4bd4ae80510267f14185a15cba2a38666b941aff68cccf0256b51c1f26", size = 4901247, upload-time = "2026-02-16T17:16:22.797Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/86/cf/f6180b67f99688d83e15c84c5beda831d1d341e95872d224f87ccafafe61/redis-7.2.0-py3-none-any.whl", hash = "sha256:01f591f8598e483f1842d429e8ae3a820804566f1c73dca1b80e23af9fba0497", size = 394898, upload-time = "2026-02-16T17:16:20.693Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "requests"
|
||||
version = "2.32.5"
|
||||
@@ -1125,7 +1134,7 @@ dependencies = [
|
||||
{ name = "celery" },
|
||||
{ name = "fastapi", extra = ["standard"] },
|
||||
{ name = "httpx", extra = ["http2"] },
|
||||
{ name = "python-dotenv" },
|
||||
{ name = "redis" },
|
||||
{ name = "tqdm" },
|
||||
{ name = "yt-dlp", extra = ["default"] },
|
||||
]
|
||||
@@ -1136,7 +1145,7 @@ requires-dist = [
|
||||
{ name = "celery", specifier = ">=5.6.2" },
|
||||
{ name = "fastapi", extras = ["standard"], specifier = ">=0.129.0" },
|
||||
{ name = "httpx", extras = ["http2"], specifier = ">=0.28.1" },
|
||||
{ name = "python-dotenv", specifier = ">=1.2.1" },
|
||||
{ name = "redis", specifier = ">=7.2.0" },
|
||||
{ name = "tqdm", specifier = ">=4.67.3" },
|
||||
{ name = "yt-dlp", extras = ["default"], specifier = ">=2026.2.4" },
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user