Files
vplatform/backend/app/main.py
2026-04-09 08:47:37 +00:00

72 lines
2.4 KiB
Python

from typing import Dict, List
from fastapi import FastAPI, File, HTTPException, UploadFile
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from app.config import COVER_DIR, HLS_DIR, PROCESSED_DIR, STORAGE_DIR, UPLOAD_DIR
from app.schemas import TaskCreateRequest, TaskResponse, UploadResponse
from app.services.storage import get_upload_path, save_upload
from app.services.tasks import task_manager
app = FastAPI(title="VPlatform API", version="0.1.0")
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:5173"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.mount("/media/uploads", StaticFiles(directory=UPLOAD_DIR), name="uploads")
app.mount("/media/processed", StaticFiles(directory=PROCESSED_DIR), name="processed")
app.mount("/media/hls", StaticFiles(directory=HLS_DIR), name="hls")
app.mount("/media/covers", StaticFiles(directory=COVER_DIR), name="covers")
app.mount("/media", StaticFiles(directory=STORAGE_DIR), name="media")
@app.on_event("startup")
def start_worker() -> None:
task_manager.start()
@app.get("/api/health")
def health() -> Dict[str, str]:
return {"status": "ok"}
@app.post("/api/upload", response_model=UploadResponse)
async def upload_video(file: UploadFile = File(...)) -> UploadResponse:
if not file.filename:
raise HTTPException(status_code=400, detail="missing filename")
file_id, original_name = save_upload(file)
return UploadResponse(
file_id=file_id,
original_name=original_name,
file_url=f"/media/uploads/{file_id}",
)
@app.post("/api/tasks", response_model=TaskResponse)
def create_task(payload: TaskCreateRequest) -> TaskResponse:
if not get_upload_path(payload.file_id).exists():
raise HTTPException(status_code=404, detail="uploaded file not found")
record = task_manager.create_task(payload)
return TaskResponse(**record.__dict__)
@app.get("/api/tasks", response_model=List[TaskResponse])
def list_tasks() -> List[TaskResponse]:
return [TaskResponse(**task.__dict__) for task in task_manager.list_tasks()]
@app.get("/api/tasks/{task_id}", response_model=TaskResponse)
def get_task(task_id: str) -> TaskResponse:
task = task_manager.get_task(task_id)
if task is None:
raise HTTPException(status_code=404, detail="task not found")
return TaskResponse(**task.__dict__)