| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- from pathlib import Path
- from uuid import uuid4
- import aiofiles
- from fastapi import APIRouter, BackgroundTasks, File, HTTPException, UploadFile
- from fastapi.responses import FileResponse
- from sorawm.server.schemas import WMRemoveResults
- from sorawm.server.worker import worker
- router = APIRouter()
- async def process_upload_and_queue(
- task_id: str, video_content: bytes, video_path: Path
- ):
- try:
- async with aiofiles.open(video_path, "wb") as f:
- await f.write(video_content)
- await worker.queue_task(task_id, video_path)
- except Exception as e:
- await worker.mark_task_error(task_id, str(e))
- @router.post("/submit_remove_task")
- async def submit_remove_task(
- background_tasks: BackgroundTasks, video: UploadFile = File(...)
- ):
- task_id = await worker.create_task()
- content = await video.read()
- upload_filename = f"{uuid4()}_{video.filename}"
- video_path = worker.upload_dir / upload_filename
- background_tasks.add_task(process_upload_and_queue, task_id, content, video_path)
- return {"task_id": task_id, "message": "Task submitted."}
- @router.get("/get_results")
- async def get_results(remove_task_id: str) -> WMRemoveResults:
- result = await worker.get_task_status(remove_task_id)
- if result is None:
- raise HTTPException(status_code=404, detail="Task does not exist.")
- return result
- @router.get("/download/{task_id}")
- async def download_video(task_id: str):
- result = await worker.get_task_status(task_id)
- if result is None:
- raise HTTPException(status_code=404, detail="Task does not exist.")
- if result.status != "FINISHED":
- raise HTTPException(
- status_code=400, detail=f"Task not finish yet: {result.status}"
- )
- output_path = await worker.get_output_path(task_id)
- if output_path is None or not output_path.exists():
- raise HTTPException(status_code=404, detail="Output file does not exits")
- return FileResponse(
- path=output_path, filename=output_path.name, media_type="video/mp4"
- )
|