Files
media/controller/video/cut_controller.go
2026-05-25 15:08:47 +08:00

93 lines
2.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}