| | 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 — تدوین هوشمند ویدیو (وب)") |
| |
|
| | |
| | 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) |
| |
|
| | |
| | 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) |
| |
|
| | |
| | |
| |
|
| | return templates.TemplateResponse( |
| | "done.html", |
| | { |
| | "request": request, |
| | "job_id": job_id, |
| | "preset": preset, |
| | "saved": saved, |
| | }, |
| | ) |
| |
|