package video import "github.com/gogf/gf/v2/frame/g" // CutScene 单个分镜场景 // 同时兼容两种格式: // 1. 完整格式: {"sceneIndex":1,"startTimeStr":"00:00:00.000","endTimeStr":"00:00:03.115", ...} // 2. 简化格式: {"start": 1.5, "end": 5.0} type CutScene struct { SceneIndex int `json:"sceneIndex" dc:"场景序号"` StartTimeStr string `json:"startTimeStr" dc:"起始时间 HH:MM:SS.mmm"` EndTimeStr string `json:"endTimeStr" dc:"结束时间 HH:MM:SS.mmm"` Start float64 `json:"start" dc:"起始时间(秒)"` End float64 `json:"end" dc:"结束时间(秒)"` DurationStr string `json:"durationStr" dc:"时长"` ShotType string `json:"shotType" dc:"镜头类型"` Composition string `json:"composition" dc:"构图"` NarrativePos string `json:"narrativePos" dc:"叙事位置"` Description string `json:"description" dc:"描述"` } // CutReq 视频分镜剪切请求(URL 方式) type CutReq struct { g.Meta `path:"/video/cut" method:"post" tags:"视频剪切" summary:"视频分镜剪切(URL模式)" dc:"根据分镜JSON从视频中剪切多个片段并拼接输出"` VideoURL string `json:"video_url" v:"required#视频URL不能为空" dc:"原始视频URL"` Scenes []CutScene `json:"scenes" v:"required#分镜片段不能为空" dc:"分镜片段数组"` TotalScenes int `json:"totalScenes" dc:"总分镜数"` DurationStr string `json:"durationStr" dc:"总时长"` Upload bool `json:"upload" dc:"是否上传到MinIO" d:"false"` } // CutAsyncReq 视频分镜剪切-异步请求(URL方式) type CutAsyncReq struct { g.Meta `path:"/video/cut/async" method:"post" tags:"视频剪切" summary:"视频分镜剪切-异步(URL模式)" dc:"异步根据分镜JSON剪切视频,立即返回taskId,完成后通过callback_url通知结果"` VideoURL string `json:"video_url" v:"required#视频URL不能为空" dc:"原始视频URL"` Scenes []CutScene `json:"scenes" v:"required#分镜片段不能为空" dc:"分镜片段数组"` TotalScenes int `json:"totalScenes" dc:"总分镜数"` DurationStr string `json:"durationStr" dc:"总时长"` Upload bool `json:"upload" dc:"是否上传到MinIO" d:"false"` CallbackURL string `json:"callback_url" v:"required#回调地址不能为空" dc:"回调地址,剪切完成后POST结果到该地址"` } // CutRes 视频分镜剪切响应 type CutRes struct { OutputPath string `json:"outputPath" dc:"输出文件路径"` FileSize int64 `json:"fileSize" dc:"文件大小(字节)"` Duration float64 `json:"duration" dc:"总时长(秒)"` DurationStr string `json:"durationStr" dc:"可读时长"` ShotsCount int `json:"shotsCount" dc:"输出片段数"` FileURL string `json:"fileURL" dc:"MinIO访问地址(上传后返回)"` } // ---------- 异步剪切任务 ---------- // CreateCutTaskRes 创建异步剪切任务响应 type CreateCutTaskRes struct { TaskID string `json:"taskId" dc:"任务ID"` } // GetCutTaskReq 查询异步剪切任务请求 type GetCutTaskReq struct { g.Meta `path:"/video/cut/task/{taskId}" method:"get" tags:"视频剪切" summary:"查询剪切任务结果" dc:"根据taskId查询异步剪切任务的结果"` TaskID string `json:"taskId" dc:"任务ID"` } // GetCutTaskRes 查询异步剪切任务响应 type GetCutTaskRes struct { TaskID string `json:"taskId" dc:"任务ID"` Status string `json:"status" dc:"状态: pending/running/success/failed"` FileURL string `json:"fileURL,omitempty" dc:"MinIO文件访问路径"` FileSize int64 `json:"fileSize,omitempty" dc:"文件大小(字节)"` FileName string `json:"fileName,omitempty" dc:"文件名"` FileFormat string `json:"fileFormat,omitempty" dc:"文件格式"` FileAddressPrefix string `json:"fileAddressPrefix,omitempty" dc:"MinIO地址前缀"` DurationStr string `json:"durationStr,omitempty" dc:"剪切后时长"` ErrorMessage string `json:"errorMessage,omitempty" dc:"错误信息"` CreatedAt int64 `json:"createdAt" dc:"创建时间戳"` }