diff --git a/.gitignore b/.gitignore index aafecaa..07f7319 100644 --- a/.gitignore +++ b/.gitignore @@ -176,4 +176,5 @@ cython_debug/ # My dirs and files -trash_holder/ \ No newline at end of file +trash_holder/ +media/ \ No newline at end of file diff --git a/app/api/v1/endpoints/media.py b/app/api/v1/endpoints/media.py new file mode 100644 index 0000000..1e4b984 --- /dev/null +++ b/app/api/v1/endpoints/media.py @@ -0,0 +1,11 @@ +from fastapi import APIRouter + +from app.services import Files + + +router = APIRouter() + + +@router.get("/") +def get_files() -> list[str]: + return Files.list() diff --git a/app/api/v1/router.py b/app/api/v1/router.py index f4b91df..042d49f 100644 --- a/app/api/v1/router.py +++ b/app/api/v1/router.py @@ -1,6 +1,7 @@ from fastapi import APIRouter from app.api.v1.endpoints import youtube from app.api.v1.endpoints import tasks +from app.api.v1.endpoints import media router = APIRouter() @@ -8,3 +9,4 @@ router = APIRouter() router.include_router(youtube.router, prefix="/youtube", tags=["YouTube"]) router.include_router(tasks.router, prefix="/tasks", tags=["Tasks"]) +router.include_router(media.router, prefix="/media", tags=["Media"]) diff --git a/app/core/config.py b/app/core/config.py index a03a68d..489a8a8 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -20,6 +20,8 @@ class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=BASE_DIR / ".env") + MEDIA_DIR: Path = BASE_DIR / "media" + settings = Settings() diff --git a/app/core/uploader.py b/app/core/uploader.py new file mode 100644 index 0000000..508bec8 --- /dev/null +++ b/app/core/uploader.py @@ -0,0 +1,5 @@ +# from app.utils.uploader import S3ChunkUploadBackend Используется для подключения S3 +from app.utils.uploader import DiskChunkUploadBackend + + +uploader_backend = DiskChunkUploadBackend() diff --git a/app/services.py b/app/services.py index 52dbbf7..b8eba71 100644 --- a/app/services.py +++ b/app/services.py @@ -1,13 +1,22 @@ +import os + +from app.core.config import settings +from app.core.uploader import uploader_backend from app.utils.youtube import YtDlpManager -from app.utils.uploader import S3ChunkUploadBackend from app.schemas import DownloadRequest, DownloadResponse + class YouTubeService: @staticmethod def download(data: DownloadRequest): - s3 = S3ChunkUploadBackend("") - manager = YtDlpManager(str(data.url), s3) - s3.key_prefix = f"{manager.id}@{data.quality}@" + manager = YtDlpManager(str(data.url), uploader_backend) + uploader_backend.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) + + +class Files: + @staticmethod + def list(): + return [f for f in os.listdir(settings.MEDIA_DIR) if os.path.isfile(f)] diff --git a/app/utils/uploader.py b/app/utils/uploader.py index 2ea3893..bea7d17 100644 --- a/app/utils/uploader.py +++ b/app/utils/uploader.py @@ -26,13 +26,15 @@ class ChunkUploadBackend(ABC): class DiskChunkUploadBackend(ChunkUploadBackend): - def __init__(self, base_path: str): - self.base_path = base_path + def __init__(self, key_prefix: str = ""): + self.base_path = str(settings.MEDIA_DIR) os.makedirs(self.base_path, exist_ok=True) + self.key_prefix = key_prefix self._file = None def start(self, filename): - self._file = open(os.path.join(self.base_path, filename), "wb") + name = f"{self.key_prefix}{filename}" + self._file = open(os.path.join(self.base_path, name), "wb") def upload_chunk(self, chunk: bytes): self._file.write(chunk) @@ -41,7 +43,8 @@ class DiskChunkUploadBackend(ChunkUploadBackend): if self._file is None: return self._file.close() - return os.path.join(self.base_path, self._file.name) + relative_path = settings.MEDIA_DIR.relative_to(settings.BASE_DIR) + return os.path.join(relative_path, self._file.name) def abort(self): if self._file: