4fee87c5e8
CI/CD Pipeline / Deploy Staging (push) Has been skipped
CI/CD Pipeline / Staging E2E Tests (push) Has been skipped
CI/CD Pipeline / Build Production Runtime Images (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Frontend Lint (push) Failing after 45h56m35s
CI/CD Pipeline / Validate Code Quality And Tests (push) Failing after 45h56m48s
任务1: 素材重复上传检测 - 上传接口支持 file_hash 参数,通过 MD5+素材库ID 去重 - 命中去重直接返回已有 asset_id,不重复存 OSS - file_hash 透传: API → IngestJob → Asset 全链路 - 三条上传路径(表单/直传/分片)均支持去重 - Alembic 031: assets + ingest_jobs 加 file_hash 列+索引 - 6 个单元测试覆盖去重命中/未命中/空hash/透传 任务3: 批量生成视频 - POST /generations 支持 count 参数,一次创建多条生成任务 - 每条任务独立状态跟踪,响应返回 task_ids 列表 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
48 lines
2.3 KiB
Python
48 lines
2.3 KiB
Python
from datetime import datetime
|
||
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
class ChunkedUploadInitRequest(BaseModel):
|
||
filename: str = Field(..., min_length=1, max_length=255, description="Filename")
|
||
file_size: int = Field(..., gt=0, le=2147483648, description="File size in bytes, max 2GB")
|
||
total_chunks: int = Field(..., gt=0, description="Total number of chunks")
|
||
content_type: str = Field(
|
||
default="application/octet-stream", min_length=1, max_length=100, description="Content type"
|
||
)
|
||
project_id: str = Field(..., min_length=1, description="Project ID")
|
||
library_id: str = Field(..., min_length=1, description="Asset library ID")
|
||
|
||
|
||
class ChunkedUploadInitResponse(BaseModel):
|
||
upload_id: str = Field(..., description="Upload ID")
|
||
chunk_size: int = Field(..., description="Chunk size in bytes")
|
||
total_chunks: int = Field(..., description="Total number of chunks")
|
||
filename: str = Field(..., description="Filename")
|
||
expires_at: datetime = Field(..., description="Expiration time")
|
||
|
||
|
||
class ChunkedUploadStatusResponse(BaseModel):
|
||
upload_id: str = Field(..., description="Upload ID")
|
||
filename: str = Field(..., description="Filename")
|
||
file_size: int = Field(..., description="File size")
|
||
total_chunks: int = Field(..., description="Total number of chunks")
|
||
uploaded_chunks: list[int] = Field(..., description="List of uploaded chunk indices")
|
||
status: str = Field(..., description="Upload status: pending/uploading/completed/failed")
|
||
created_at: datetime = Field(..., description="Creation time")
|
||
expires_at: datetime = Field(..., description="Expiration time")
|
||
|
||
|
||
class ChunkedUploadCompleteRequest(BaseModel):
|
||
project_id: str = Field(..., min_length=1, description="Project ID")
|
||
library_id: str = Field(..., min_length=1, description="Asset library ID")
|
||
file_hash: str = Field(default="", max_length=64, description="文件 MD5 哈希,用于去重检测")
|
||
|
||
|
||
class ChunkedUploadCompleteResponse(BaseModel):
|
||
storage_key: str = Field(..., description="Storage key")
|
||
ingest_job_id: str = Field(..., description="Ingest job ID")
|
||
url: str = Field(..., description="File URL")
|
||
duplicated: bool = Field(default=False, description="是否为重复素材(命中去重)")
|
||
asset_id: str = Field(default="", description="重复素材的 asset_id(duplicated=true 时返回)")
|