from fastapi import FastAPI, Request, UploadFile, File, Form from fastapi.responses import HTMLResponse, JSONResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from starlette.datastructures import UploadFile as StarletteUploadFile import os, uuid, shutil from typing import Optional app = FastAPI(title="FlexCut — تدوین هوشمند ویدیو (وب)") # mount static and templates app.mount("/static", StaticFiles(directory="app/static"), name="static") templates = Jinja2Templates(directory="app/templates") JOBS_DIR = "/app/jobs" if os.path.exists("/app/jobs") else os.path.join(os.getcwd(), "jobs") os.makedirs(JOBS_DIR, exist_ok=True) @app.get("/", response_class=HTMLResponse) async def index(request: Request): return templates.TemplateResponse("index.html", {"request": request}) def _save_upload(dst_dir: str, name: str, file: Optional[StarletteUploadFile]) -> Optional[str]: if not file: return None path = os.path.join(dst_dir, name) with open(path, "wb") as f: shutil.copyfileobj(file.file, f) return path @app.post("/create") async def create( request: Request, preset: str = Form(...), music: Optional[UploadFile] = File(None), video: Optional[UploadFile] = File(None), logo: Optional[UploadFile] = File(None), ): job_id = str(uuid.uuid4())[:8] job_dir = os.path.join(JOBS_DIR, job_id) os.makedirs(job_dir, exist_ok=True) # save files if provided saved = {} if music: saved["music"] = _save_upload(job_dir, f"music_{music.filename}", music) if video: saved["video"] = _save_upload(job_dir, f"video_{video.filename}", video) if logo: saved["logo"] = _save_upload(job_dir, f"logo_{logo.filename}", logo) # NOTE: این نسخه‌ی ساده فقط فایل‌ها را ذخیره می‌کند تا Space بالا بیاید. # بعداً می‌توانیم مرحله‌های پردازش ویدیو (librosa/moviepy) را اضافه کنیم. return templates.TemplateResponse( "done.html", { "request": request, "job_id": job_id, "preset": preset, "saved": saved, }, )