93 lines
2.6 KiB
Go
93 lines
2.6 KiB
Go
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)
|
||
}
|