Доделал до рабочего концепта

This commit is contained in:
Viner Abubakirov
2026-02-23 13:21:56 +05:00
parent a5c608674b
commit 76138dbc02
9 changed files with 38 additions and 23 deletions

View File

@@ -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)

View File

@@ -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",

View File

@@ -7,8 +7,8 @@ class DownloadRequest(BaseModel):
class DownloadResponse(BaseModel):
video: HttpUrl
audio: HttpUrl
video: str
audio: str
class TaskCreateResponse(BaseModel):

View File

@@ -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)

View File

@@ -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()

View File

@@ -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 = []

View File

@@ -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 видео"""

View File

@@ -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
View File

@@ -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" },
]