File size: 2,233 Bytes
8a93ca3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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,
        },
    )