package video import ( "context" "fmt" "os" dto "media/model/dto/video" service "media/service/video" "github.com/gogf/gf/v2/frame/g" ) type cut struct{} var Cut = new(cut) // Cut 视频分镜剪切(URL模式) POST /video/cut func (c *cut) Cut(ctx context.Context, req *dto.CutReq) (res *dto.CutRes, err error) { ctx = withUser(ctx) g.Log().Infof(ctx, "[视频分镜剪切] 收到请求 入参: video_url=%s, total_scenes=%d, upload=%v", req.VideoURL, len(req.Scenes), req.Upload) // 下载视频到临时目录 tempDir := getTempDir(ctx) os.MkdirAll(tempDir, 0755) savePath, err := downloadFromURL(ctx, req.VideoURL, tempDir) if err != nil { return nil, fmt.Errorf("下载视频失败: %v", err) } defer os.Remove(savePath) // 转换分镜为 service 层类型(解析时间字符串为秒) serviceShots, err := service.ConvertScenes(req.Scenes) if err != nil { return nil, fmt.Errorf("解析分镜失败: %v", err) } if len(serviceShots) == 0 { return nil, fmt.Errorf("没有有效的分镜片段") } // 调用服务层 svcRes, err := service.Cut.Cut(ctx, &service.CutReq{ VideoPath: savePath, Shots: serviceShots, Upload: req.Upload, }) if err != nil { return nil, err } defer os.Remove(svcRes.OutputPath) return &dto.CutRes{ OutputPath: svcRes.OutputPath, FileSize: svcRes.FileSize, Duration: svcRes.Duration, DurationStr: svcRes.DurationStr, ShotsCount: svcRes.ShotsCount, FileURL: svcRes.FileURL, }, nil } // CutAsync 视频分镜剪切-异步(URL模式) POST /video/cut/async func (c *cut) CutAsync(ctx context.Context, req *dto.CutAsyncReq) (res *dto.CreateCutTaskRes, err error) { ctx = withUser(ctx) g.Log().Infof(ctx, "[视频分镜剪切-异步] 收到请求 入参: video_url=%s, total_scenes=%d, upload=%v, callback=%s", req.VideoURL, len(req.Scenes), req.Upload, req.CallbackURL) // 转换分镜为 service 层类型(解析时间字符串为秒) serviceShots, err := service.ConvertScenes(req.Scenes) if err != nil { return nil, fmt.Errorf("解析分镜失败: %v", err) } if len(serviceShots) == 0 { return nil, fmt.Errorf("没有有效的分镜片段") } taskID, taskErr := service.Cut.CreateAsyncTask(ctx, req.VideoURL, serviceShots, req.Upload, req.CallbackURL) if taskErr != nil { return nil, taskErr } return &dto.CreateCutTaskRes{TaskID: taskID}, nil } // GetCutTask 查询异步剪切任务结果 GET /video/cut/task/{taskId} func (c *cut) GetCutTask(ctx context.Context, req *dto.GetCutTaskReq) (res *dto.GetCutTaskRes, err error) { ctx = withUser(ctx) return service.Cut.GetTaskResult(ctx, req.TaskID) }