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

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) @router.post("/", response_model=TaskCreateResponse)
async def download_video(data: DownloadRequest): 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) return TaskCreateResponse(task_id=task.id, status=task.status)

View File

@@ -11,10 +11,10 @@ celery_app = Celery(
celery_app.conf.update( celery_app.conf.update(
broker_use_ssl=ssl_options, # broker_use_ssl=ssl_options,
redis_backend_use_ssl=ssl_options, # redis_backend_use_ssl=ssl_options,
task_serializer=["json"], task_serializer="json",
result_serializer=["json"], result_serializer="json",
accept_content=["json"], accept_content=["json"],
enable_utc=True, enable_utc=True,
timezone="UTC", timezone="UTC",

View File

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

View File

@@ -5,9 +5,9 @@ from app.schemas import DownloadRequest, DownloadResponse
class YouTubeService: class YouTubeService:
@staticmethod @staticmethod
def download(data: DownloadRequest): def download(data: DownloadRequest):
key_prefix = f"{data.url}@{data.quality}@" s3 = S3ChunkUploadBackend("")
s3 = S3ChunkUploadBackend(key_prefix) manager = YtDlpManager(str(data.url), s3)
manager = YtDlpManager(data.url, s3) s3.key_prefix = f"{manager.id}@{data.quality}@"
video_url = manager.download_video(data.quality) video_url = manager.download_video(data.quality)
audio_url = manager.download_audio() audio_url = manager.download_audio()
return DownloadResponse(video=video_url, audio=audio_url) return DownloadResponse(video=video_url, audio=audio_url)

View File

@@ -11,6 +11,8 @@ from app.schemas import DownloadRequest
retry_backoff=True, retry_backoff=True,
) )
def download_youtube(self, url: str, quality: int) -> dict: def download_youtube(self, url: str, quality: int) -> dict:
print("Get Task. Try to make them")
request = DownloadRequest(url=url, quality=quality) request = DownloadRequest(url=url, quality=quality)
response = YouTubeService.download(request) response = YouTubeService.download(request)
print("Task make successfully. Return response")
return response.model_dump() return response.model_dump()

View File

@@ -4,6 +4,8 @@ from abc import ABC, abstractmethod
import boto3 import boto3
from botocore.client import Config from botocore.client import Config
from app.core.config import settings
class ChunkUploadBackend(ABC): class ChunkUploadBackend(ABC):
@abstractmethod @abstractmethod
@@ -49,20 +51,16 @@ class DiskChunkUploadBackend(ChunkUploadBackend):
class S3ChunkUploadBackend(ChunkUploadBackend): class S3ChunkUploadBackend(ChunkUploadBackend):
def __init__(self, key_prefix: str = ""): def __init__(self, key_prefix: str = ""):
from dotenv import load_dotenv
load_dotenv(".env")
self.s3 = boto3.client( self.s3 = boto3.client(
service_name="s3", service_name="s3",
aws_access_key_id=os.getenv("S3_ACCESS_KEY"), aws_access_key_id=settings.S3_ACCESS_KEY,
aws_secret_access_key=os.getenv("S3_SECRET_KEY"), aws_secret_access_key=settings.S3_SECRET_KEY,
endpoint_url=os.getenv("S3_ENDPOINT_URL"), endpoint_url=settings.S3_ENDPOINT_URL,
region_name=os.getenv("S3_REGION_NAME"), region_name=settings.S3_REGION_NAME,
use_ssl=True, 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.key_prefix = key_prefix
self.upload_id = None self.upload_id = None
self.parts = [] self.parts = []

View File

@@ -34,6 +34,10 @@ class YtDlpManager:
with yt_dlp.YoutubeDL(ydl_opts) as ydl: with yt_dlp.YoutubeDL(ydl_opts) as ydl:
self.info = ydl.extract_info(self.url, download=False) self.info = ydl.extract_info(self.url, download=False)
@property
def id(self):
return self.info.get("id")
@property @property
def title(self) -> str: def title(self) -> str:
"""Возвращает title видео""" """Возвращает title видео"""

View File

@@ -9,7 +9,7 @@ dependencies = [
"celery>=5.6.2", "celery>=5.6.2",
"fastapi[standard]>=0.129.0", "fastapi[standard]>=0.129.0",
"httpx[http2]>=0.28.1", "httpx[http2]>=0.28.1",
"python-dotenv>=1.2.1", "redis>=7.2.0",
"tqdm>=4.67.3", "tqdm>=4.67.3",
"yt-dlp[default]>=2026.2.4", "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" }, { 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]] [[package]]
name = "requests" name = "requests"
version = "2.32.5" version = "2.32.5"
@@ -1125,7 +1134,7 @@ dependencies = [
{ name = "celery" }, { name = "celery" },
{ name = "fastapi", extra = ["standard"] }, { name = "fastapi", extra = ["standard"] },
{ name = "httpx", extra = ["http2"] }, { name = "httpx", extra = ["http2"] },
{ name = "python-dotenv" }, { name = "redis" },
{ name = "tqdm" }, { name = "tqdm" },
{ name = "yt-dlp", extra = ["default"] }, { name = "yt-dlp", extra = ["default"] },
] ]
@@ -1136,7 +1145,7 @@ requires-dist = [
{ name = "celery", specifier = ">=5.6.2" }, { name = "celery", specifier = ">=5.6.2" },
{ name = "fastapi", extras = ["standard"], specifier = ">=0.129.0" }, { name = "fastapi", extras = ["standard"], specifier = ">=0.129.0" },
{ name = "httpx", extras = ["http2"], specifier = ">=0.28.1" }, { 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 = "tqdm", specifier = ">=4.67.3" },
{ name = "yt-dlp", extras = ["default"], specifier = ">=2026.2.4" }, { name = "yt-dlp", extras = ["default"], specifier = ">=2026.2.4" },
] ]