Files
media/controller/video/cut_controller.go

93 lines
2.6 KiB
Go
Raw Permalink Normal View History

2026-05-25 15:08:47 +08:00
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)
}