diff --git a/CHANGELOG.md b/CHANGELOG.md index bfd50612..59a127ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * Bug修复:用户登录过期之后聊天页面出现大量报错,需要刷新页面才能正常 * 功能优化:优化聊天页面 Websocket 断线重连代码,提高用户体验 * 功能优化:给算力增减服务全部加上数据库事务和同步锁 +* 功能优化:支持用户在前端对话界面选择插件 * 功能新增:支持 Luma 文生视频功能 ## v4.1.2 diff --git a/api/service/suno/service.go b/api/service/suno/service.go index 26c545c9..e3e502dd 100644 --- a/api/service/suno/service.go +++ b/api/service/suno/service.go @@ -429,11 +429,11 @@ type QueryRespVo struct { func (s *Service) QueryTask(taskId string, channel string) (QueryRespVo, error) { // 读取 API KEY var apiKey model.ApiKey - tx := s.db.Session(&gorm.Session{}).Where("type", "suno"). + err := s.db.Session(&gorm.Session{}).Where("type", "suno"). Where("api_url", channel). Where("enabled", true). - Order("last_used_at DESC").First(&apiKey) - if tx.Error != nil { + Order("last_used_at DESC").First(&apiKey).Error + if err != nil { return QueryRespVo{}, errors.New("no available API KEY for Suno") } diff --git a/api/service/video/luma.go b/api/service/video/luma.go index 3bea43a9..8d71b3e4 100644 --- a/api/service/video/luma.go +++ b/api/service/video/luma.go @@ -95,11 +95,15 @@ func (s *Service) Run() { } // 更新任务信息 - s.db.Model(&model.SunoJob{Id: task.Id}).UpdateColumns(map[string]interface{}{ + err = s.db.Model(&model.VideoJob{Id: task.Id}).UpdateColumns(map[string]interface{}{ "task_id": r.Id, "channel": r.Channel, "prompt_ext": r.Prompt, - }) + }).Error + if err != nil { + logger.Errorf("update task with error: %v", err) + s.PushTask(task) + } } }() } @@ -145,7 +149,7 @@ func (s *Service) LumaCreate(task types.VideoTask) (LumaRespVo, error) { return LumaRespVo{}, fmt.Errorf("请求 API 出错:%v", err) } - if r.StatusCode != 200 { + if r.StatusCode != 200 && r.StatusCode != 201 { return LumaRespVo{}, fmt.Errorf("请求 API 出错:%d, %s", r.StatusCode, r.String()) } @@ -193,12 +197,28 @@ func (s *Service) DownloadFiles() { } for _, v := range items { - logger.Infof("try download video: %s", v.VideoURL) - videoURL, err := s.uploadManager.GetUploadHandler().PutUrlFile(v.VideoURL, true) - if err != nil { - logger.Errorf("download audio with error: %v", err) + if v.WaterURL == "" { continue } + + logger.Infof("try download video: %s", v.WaterURL) + videoURL, err := s.uploadManager.GetUploadHandler().PutUrlFile(v.WaterURL, true) + if err != nil { + logger.Errorf("download video with error: %v", err) + continue + } + logger.Infof("download video success: %s", videoURL) + v.WaterURL = videoURL + + if v.VideoURL != "" { + logger.Infof("try download no water video: %s", v.VideoURL) + videoURL, err = s.uploadManager.GetUploadHandler().PutUrlFile(v.VideoURL, true) + if err != nil { + logger.Errorf("download video with error: %v", err) + continue + } + } + logger.Info("download no water video success: %s", videoURL) v.VideoURL = videoURL v.Progress = 100 s.db.Updates(&v) @@ -224,10 +244,31 @@ func (s *Service) SyncTaskProgress() { task, err := s.QueryLumaTask(job.TaskId, job.Channel) if err != nil { logger.Errorf("query task with error: %v", err) + // 更新任务信息 + s.db.Model(&model.VideoJob{Id: job.Id}).UpdateColumns(map[string]interface{}{ + "progress": service.FailTaskProgress, // 102 表示资源未下载完成, + "err_msg": err.Error(), + }) continue } logger.Debugf("task: %+v", task) + if task.State == "completed" { // 更新任务信息 + data := map[string]interface{}{ + "progress": 102, // 102 表示资源未下载完成, + "water_url": task.Video.Url, + "raw_data": utils.JsonEncode(task), + "prompt_ext": task.Prompt, + } + if task.Video.DownloadUrl != "" { + data["video_url"] = task.Video.DownloadUrl + } + err = s.db.Model(&model.VideoJob{Id: job.Id}).UpdateColumns(data).Error + if err != nil { + logger.Errorf("更新数据库失败:%v", err) + continue + } + } } @@ -254,12 +295,12 @@ type LumaTaskVo struct { func (s *Service) QueryLumaTask(taskId string, channel string) (LumaTaskVo, error) { // 读取 API KEY var apiKey model.ApiKey - tx := s.db.Session(&gorm.Session{}).Where("type", "suno"). + err := s.db.Session(&gorm.Session{}).Where("type", "luma"). Where("api_url", channel). Where("enabled", true). - Order("last_used_at DESC").First(&apiKey) - if tx.Error != nil { - return LumaTaskVo{}, errors.New("no available API KEY for Suno") + Order("last_used_at DESC").First(&apiKey).Error + if err != nil { + return LumaTaskVo{}, errors.New("no available API KEY for Luma") } apiURL := fmt.Sprintf("%s/luma/generations/%s", apiKey.ApiURL, taskId) @@ -269,8 +310,12 @@ func (s *Service) QueryLumaTask(taskId string, channel string) (LumaTaskVo, erro if err != nil { return LumaTaskVo{}, fmt.Errorf("请求 API 失败:%v", err) } - defer r.Body.Close() + + if r.StatusCode != 200 { + return LumaTaskVo{}, fmt.Errorf("API 返回失败:%v", r.String()) + } + body, _ := io.ReadAll(r.Body) err = json.Unmarshal(body, &res) if err != nil {