50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
from fastapi import APIRouter, Depends, File, Form, UploadFile
|
|
from uuid import uuid4
|
|
|
|
from app.core.celery_app import celery_app
|
|
from app.core.storage import MinIOService, get_minio_service
|
|
from app.dependencies import get_ingest_job_repository
|
|
from app.schemas.upload import UploadAssetResponse
|
|
from typing import Any
|
|
from packages.application import SubmitIngestJobCommand, SubmitIngestJobUseCase
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("", response_model=UploadAssetResponse)
|
|
async def upload_asset(
|
|
file: UploadFile = File(..., description="要上传的文件(视频、音频、图片等)"),
|
|
workspace_id: str = Form(..., description="工作空间 ID"),
|
|
project_id: str = Form(..., description="项目 ID"),
|
|
library_id: str = Form(..., description="素材库 ID"),
|
|
ingest_job_repository: Any = Depends(get_ingest_job_repository),
|
|
storage_service: MinIOService = Depends(get_minio_service),
|
|
) -> UploadAssetResponse:
|
|
"""上传素材文件并触发导入流水线。"""
|
|
file_id = uuid4().hex[:8]
|
|
storage_key = f"uploads/{file_id}/{file.filename}"
|
|
|
|
file_url = storage_service.upload_file(
|
|
file.file,
|
|
storage_key,
|
|
content_type=file.content_type or "application/octet-stream",
|
|
)
|
|
|
|
use_case = SubmitIngestJobUseCase(ingest_job_repository)
|
|
job = use_case.execute(
|
|
SubmitIngestJobCommand(
|
|
workspace_id=workspace_id,
|
|
project_id=project_id,
|
|
library_id=library_id,
|
|
storage_key=storage_key,
|
|
)
|
|
)
|
|
|
|
celery_app.send_task("worker.ingest_asset", args=[job.id])
|
|
|
|
return UploadAssetResponse(
|
|
storage_key=storage_key,
|
|
ingest_job_id=job.id,
|
|
url=file_url,
|
|
)
|