diff --git a/app/api/v1/endpoints/youtube.py b/app/api/v1/endpoints/youtube.py index 36d3b81..76533ad 100644 --- a/app/api/v1/endpoints/youtube.py +++ b/app/api/v1/endpoints/youtube.py @@ -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) diff --git a/app/core/celery.py b/app/core/celery.py index 1feb24a..f3f5c44 100644 --- a/app/core/celery.py +++ b/app/core/celery.py @@ -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", diff --git a/app/schemas.py b/app/schemas.py index a8c7fb1..86d6a34 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -7,8 +7,8 @@ class DownloadRequest(BaseModel): class DownloadResponse(BaseModel): - video: HttpUrl - audio: HttpUrl + video: str + audio: str class TaskCreateResponse(BaseModel): diff --git a/app/services.py b/app/services.py index 329290d..52dbbf7 100644 --- a/app/services.py +++ b/app/services.py @@ -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) diff --git a/app/tasks.py b/app/tasks.py index a4516f8..3c4b9c5 100644 --- a/app/tasks.py +++ b/app/tasks.py @@ -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() diff --git a/app/utils/uploader.py b/app/utils/uploader.py index 0dea822..2ea3893 100644 --- a/app/utils/uploader.py +++ b/app/utils/uploader.py @@ -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 = [] diff --git a/app/utils/youtube.py b/app/utils/youtube.py index af7a6f8..00e913c 100644 --- a/app/utils/youtube.py +++ b/app/utils/youtube.py @@ -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 видео""" diff --git a/pyproject.toml b/pyproject.toml index dd7ae71..c24e7d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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", ] diff --git a/uv.lock b/uv.lock index 72818c0..7dd3448 100644 --- a/uv.lock +++ b/uv.lock @@ -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" }, ]