diff --git a/app/config.py b/app/config.py index 4c9f011..36674b0 100644 --- a/app/config.py +++ b/app/config.py @@ -3,6 +3,7 @@ from pydantic_settings import BaseSettings class Settings(BaseSettings): max_upload_size_mb: int = 500 + yt_dlp_cookies_file: str = "" @property def max_upload_size_bytes(self) -> int: diff --git a/app/downloader.py b/app/downloader.py index 24d2cbb..04ce646 100644 --- a/app/downloader.py +++ b/app/downloader.py @@ -2,6 +2,7 @@ import asyncio import uuid import os from pathlib import Path +from app.config import settings AUDIO_TMP_DIR = "/tmp/apoena-audio" @@ -21,9 +22,13 @@ async def extract_audio(url: str) -> Path: "--audio-quality", "128K", "--format", "bestaudio/best", "--output", outtmpl, - url, ] + if settings.yt_dlp_cookies_file: + cmd += ["--cookies", settings.yt_dlp_cookies_file] + + cmd.append(url) + proc = await asyncio.create_subprocess_exec( *cmd, stdout=asyncio.subprocess.PIPE, diff --git a/app/main.py b/app/main.py index 704373f..3e587ad 100644 --- a/app/main.py +++ b/app/main.py @@ -2,11 +2,12 @@ import os from contextlib import asynccontextmanager from pathlib import Path -from fastapi import FastAPI, HTTPException, BackgroundTasks +from fastapi import FastAPI, HTTPException, BackgroundTasks, UploadFile from fastapi.responses import FileResponse from pydantic import BaseModel from app import downloader +from app.config import settings STATIC_DIR = Path(__file__).parent / "static" @@ -74,6 +75,25 @@ def _delete_file(path): pass +@app.post("/admin/cookies") +async def upload_cookies(file: UploadFile): + if not settings.yt_dlp_cookies_file: + raise HTTPException(status_code=500, detail="YT_DLP_COOKIES_FILE not configured") + cookies_path = Path(settings.yt_dlp_cookies_file) + cookies_path.parent.mkdir(parents=True, exist_ok=True) + content = await file.read() + cookies_path.write_bytes(content) + return {"status": "ok", "path": str(cookies_path)} + + +@app.get("/admin/cookies/status") +async def cookies_status(): + if not settings.yt_dlp_cookies_file: + return {"present": False} + path = Path(settings.yt_dlp_cookies_file) + return {"present": path.exists(), "size": path.stat().st_size if path.exists() else 0} + + @app.get("/") async def index(): return FileResponse(STATIC_DIR / "index.html") diff --git a/app/static/index.html b/app/static/index.html index 437ba01..55aaaa6 100644 --- a/app/static/index.html +++ b/app/static/index.html @@ -255,9 +255,23 @@