From 4ded242e6628f9b2864b3caef4ab6b92e95d9c46 Mon Sep 17 00:00:00 2001 From: lmk <1095689763@qq.com> Date: Wed, 24 Jun 2026 15:51:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BC=82=E5=B8=B8=E8=A2=AB?= =?UTF-8?q?=E5=90=9E=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 4 --- go.sum | 2 -- service/asr/task_service.go | 50 ++++++++++++++++++++++------ service/video/analysis_service.go | 32 +++++++++++++++--- service/video/caption_service.go | 34 +++++++++++++++---- service/video/concat_service.go | 29 +++++++++++++--- service/video/cut_service.go | 32 ++++++++++++++---- service/video/merge_service.go | 42 ++++++++++++++++++----- service/video/scene_split_service.go | 32 ++++++++++++++---- 9 files changed, 205 insertions(+), 52 deletions(-) diff --git a/go.mod b/go.mod index 39473ef..e2018a1 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,6 @@ require ( github.com/goccy/go-json v0.10.6 // indirect github.com/gogf/gf/contrib/nosql/redis/v2 v2.10.2 // indirect github.com/gogf/gf/contrib/registry/consul/v2 v2.9.5 // indirect - github.com/gogf/gf/contrib/trace/otlphttp/v2 v2.9.5 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v5 v5.3.1 // indirect github.com/golang/glog v1.2.5 // indirect @@ -50,17 +49,14 @@ require ( github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-version v1.9.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/serf v0.10.1 // indirect github.com/klauspost/compress v1.18.6 // indirect - github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/lib/pq v1.12.3 // indirect github.com/magiconair/properties v1.8.10 // indirect github.com/mattn/go-colorable v0.1.15 // indirect github.com/mattn/go-isatty v0.0.22 // indirect github.com/mattn/go-runewidth v0.0.24 // indirect - github.com/miekg/dns v1.1.72 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 // indirect github.com/olekukonko/errors v1.3.0 // indirect diff --git a/go.sum b/go.sum index bcc112b..ed2a303 100644 --- a/go.sum +++ b/go.sum @@ -89,8 +89,6 @@ github.com/gogf/gf/contrib/nosql/redis/v2 v2.10.2 h1:iTQegT+lEg/wDKvj2mi3W1wrdrw github.com/gogf/gf/contrib/nosql/redis/v2 v2.10.2/go.mod h1:ZRw3GNz5cq4uYrW4TPSVyrYWaoqzujKdWro/AOcGBaE= github.com/gogf/gf/contrib/registry/consul/v2 v2.9.5 h1:eUqwJ/qNH8lJ6yssiqskazgp1ACQuNU6zXlLOZVuXTQ= github.com/gogf/gf/contrib/registry/consul/v2 v2.9.5/go.mod h1:sjQyMry9+0POYZCA6lHXBxO77WoNKkruJpRB4xKqk5k= -github.com/gogf/gf/contrib/trace/otlphttp/v2 v2.9.5 h1:tHUEZYB5GTqEYYVDYnlGobf1xISARKDE4KHVlgjwTec= -github.com/gogf/gf/contrib/trace/otlphttp/v2 v2.9.5/go.mod h1:cfzTn2HS9RDX8f5pUVkbGxUWcSosouqfNQ1G6cY0V88= github.com/gogf/gf/v2 v2.10.2 h1:46IO0Uc8e85/FqdftJFskfDejJLBL0JBnGS5qOftUu8= github.com/gogf/gf/v2 v2.10.2/go.mod h1:Svl1N+E8G/QshU2DUbh/3J/AJauqCgUnxHurXWR4Qx0= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= diff --git a/service/asr/task_service.go b/service/asr/task_service.go index 32e55b9..400d16e 100644 --- a/service/asr/task_service.go +++ b/service/asr/task_service.go @@ -53,8 +53,14 @@ func (s *audioTaskService) Create(ctx context.Context, params *CreateTaskParams) params.Threshold = 0.3 } - inputBytes, _ := json.Marshal(params.InputData) - fnBytes, _ := json.Marshal(params.FileNames) + inputBytes, err := json.Marshal(params.InputData) + if err != nil { + return nil, fmt.Errorf("序列化输入数据失败: %v", err) + } + fnBytes, err := json.Marshal(params.FileNames) + if err != nil { + return nil, fmt.Errorf("序列化文件名列表失败: %v", err) + } now := time.Now() task := &entity.TranscribeTask{ @@ -229,18 +235,30 @@ func (s *audioTaskService) callback(ctx context.Context, taskID, status, errMsg, DetailList: detailItems, } - body, _ := json.Marshal(payload) + body, err := json.Marshal(payload) + if err != nil { + g.Log().Errorf(ctx, "[回调 %s] 序列化payload失败: %v", taskID, err) + return + } g.Log().Infof(ctx, "[回调 %s] 触发回调, 状态=%s, 成功=%d 失败=%d, 错误=%s, 目标=%s", taskID, taskInfo.Status, taskInfo.SuccessFiles, taskInfo.FailFiles, errMsg, callbackURL) g.Log().Debugf(ctx, "[回调 %s] 回调载荷长度=%d字节, 明细条数=%d", taskID, len(body), len(detailItems)) // 透传调用方的用户信息,供回调方 GetUserInfo 从 X-User-Info 头获取 cbUser := getUserFromCtx(ctx) - userJSON, _ := json.Marshal(cbUser) + userJSON, je := json.Marshal(cbUser) + if je != nil { + g.Log().Errorf(ctx, "[回调 %s] 序列化用户信息失败: %v", taskID, je) + return + } g.Log().Infof(ctx, "[回调 %s] curl -X POST '%s' -H 'Content-Type: application/json' -H 'X-User-Info: %s' -d '%s'", taskID, callbackURL, string(userJSON), strings.ReplaceAll(string(body), "'", "'\\''")) - req, _ := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + req, reqErr := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + if reqErr != nil { + g.Log().Errorf(ctx, "[回调 %s] 创建请求失败: %v", taskID, reqErr) + return + } req.Header.Set("Content-Type", "application/json") req.Header.Set("X-User-Info", string(userJSON)) @@ -251,7 +269,11 @@ func (s *audioTaskService) callback(ctx context.Context, taskID, status, errMsg, } defer resp.Body.Close() - respBody, _ := io.ReadAll(resp.Body) + respBody, readErr := io.ReadAll(resp.Body) + if readErr != nil { + g.Log().Errorf(ctx, "[回调 %s] 读取响应失败: %v", taskID, readErr) + return + } g.Log().Infof(ctx, "[回调 %s] 响应 status=%d, body=%s", taskID, resp.StatusCode, string(respBody)) } @@ -300,8 +322,12 @@ func (s *audioTaskService) processSingleVideo(ctx context.Context, taskID, saveP var scenesJSON string if scenes != nil { - sb, _ := json.Marshal(scenes) - scenesJSON = string(sb) + sb, je := json.Marshal(scenes) + if je != nil { + g.Log().Warningf(ctx, "[任务 %s] 序列化场景信息失败: %v", taskID, je) + } else { + scenesJSON = string(sb) + } } s.saveDetail(ctx, taskID, fileIndex, fileName, @@ -414,8 +440,12 @@ func enrichDetailsFromResult(resultJSON string, details []dto.TranscribeTaskDeta continue } if r.FileName == d.FileName { - sb, _ := json.Marshal(r.Result.Scenes) - details[i].Scenes = string(sb) + sb, je := json.Marshal(r.Result.Scenes) + if je != nil { + g.Log().Warningf(context.TODO(), "[回调] 序列化场景信息失败: %v", je) + } else { + details[i].Scenes = string(sb) + } // 同时补全其他可能缺失的字段 if d.AudioDuration == "" { details[i].AudioDuration = r.Result.AudioDuration diff --git a/service/video/analysis_service.go b/service/video/analysis_service.go index cfa9338..2d8db25 100644 --- a/service/video/analysis_service.go +++ b/service/video/analysis_service.go @@ -137,7 +137,13 @@ func (s *analysisService) processAsyncTask(user *beans.User, taskID string, vide g.Log().Infof(bgCtx, "[视频分析 %s] Caption接口调用成功: %s", taskID, videoURL) // 3. 保存结果到数据库(视频不删除,永久保留) - captionJSON, _ := json.Marshal(captionResult) + captionJSON, je := json.Marshal(captionResult) + if je != nil { + g.Log().Errorf(bgCtx, "[视频分析 %s] 序列化结果失败: %v", taskID, je) + failedCount++ + analysisDao.AnalysisTask.UpdateProgress(bgCtx, taskID, successCount, failedCount) + continue + } analysisDao.AnalysisTaskDetail.UpdateSuccess(bgCtx, taskID, videoURL, savePath, string(captionJSON)) successCount++ analysisDao.AnalysisTask.UpdateProgress(bgCtx, taskID, successCount, failedCount) @@ -364,14 +370,26 @@ func (s *analysisService) analysisCallback(ctx context.Context, taskID, callback "results": results, } - body, _ := json.Marshal(payload) + body, err := json.Marshal(payload) + if err != nil { + g.Log().Errorf(ctx, "[视频分析回调 %s] 序列化payload失败: %v", taskID, err) + return + } g.Log().Infof(ctx, "[视频分析回调 %s] 状态=%s, 目标=%s", taskID, task.Status, callbackURL) - cbReq, _ := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + cbReq, reqErr := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + if reqErr != nil { + g.Log().Errorf(ctx, "[视频分析回调 %s] 创建请求失败: %v", taskID, reqErr) + return + } cbReq.Header.Set("Content-Type", "application/json") // 透传调用方用户信息 cbUser := getUserFromCtx(ctx) - userJSON, _ := json.Marshal(cbUser) + userJSON, je := json.Marshal(cbUser) + if je != nil { + g.Log().Errorf(ctx, "[视频分析回调 %s] 序列化用户信息失败: %v", taskID, je) + return + } cbReq.Header.Set("X-User-Info", string(userJSON)) // 打印 curl 命令方便调试 @@ -386,6 +404,10 @@ func (s *analysisService) analysisCallback(ctx context.Context, taskID, callback return } defer resp.Body.Close() - respBody, _ := io.ReadAll(resp.Body) + respBody, readErr := io.ReadAll(resp.Body) + if readErr != nil { + g.Log().Errorf(ctx, "[视频分析回调 %s] 读取响应失败: %v", taskID, readErr) + return + } g.Log().Infof(ctx, "[视频分析回调 %s] 响应 status=%d, body=%s", taskID, resp.StatusCode, string(respBody)) } diff --git a/service/video/caption_service.go b/service/video/caption_service.go index 2756ce8..0376475 100644 --- a/service/video/caption_service.go +++ b/service/video/caption_service.go @@ -46,8 +46,14 @@ func (s *captionService) CreateAsyncTask(ctx context.Context, videoURLs []string subtitles = []dto.SubtitleSegment{} } - videoURLsJSON, _ := json.Marshal(videoURLs) - elementsJSON, _ := json.Marshal(elements) + videoURLsJSON, err := json.Marshal(videoURLs) + if err != nil { + return "", fmt.Errorf("序列化视频URL失败: %v", err) + } + elementsJSON, err := json.Marshal(elements) + if err != nil { + return "", fmt.Errorf("序列化元素失败: %v", err) + } taskID := "cap_" + guid.S() task := &entity.VideoCaptionTask{ @@ -827,13 +833,25 @@ func (s *captionService) callback(ctx context.Context, taskID, callbackURL strin } } - body, _ := json.Marshal(payload) + body, err := json.Marshal(payload) + if err != nil { + g.Log().Errorf(ctx, "[字幕回调 %s] 序列化回调payload失败: %v", taskID, err) + return + } g.Log().Infof(ctx, "[字幕回调 %s] 状态=%s, 目标=%s, body=%s", taskID, task.Status, callbackURL, string(body)) - req, _ := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + req, reqErr := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + if reqErr != nil { + g.Log().Errorf(ctx, "[字幕回调 %s] 创建请求失败: %v", taskID, reqErr) + return + } req.Header.Set("Content-Type", "application/json") cbUser := getUserFromCtx(ctx) - userJSON, _ := json.Marshal(cbUser) + userJSON, je := json.Marshal(cbUser) + if je != nil { + g.Log().Errorf(ctx, "[字幕回调 %s] 序列化用户信息失败: %v", taskID, je) + return + } req.Header.Set("X-User-Info", string(userJSON)) client := &http.Client{Timeout: 2 * time.Minute} @@ -843,7 +861,11 @@ func (s *captionService) callback(ctx context.Context, taskID, callbackURL strin return } defer resp.Body.Close() - respBody, _ := io.ReadAll(resp.Body) + respBody, readErr := io.ReadAll(resp.Body) + if readErr != nil { + g.Log().Errorf(ctx, "[字幕回调 %s] 读取响应失败: %v", taskID, readErr) + return + } g.Log().Infof(ctx, "[字幕回调 %s] 响应 status=%d, body=%s", taskID, resp.StatusCode, string(respBody)) } diff --git a/service/video/concat_service.go b/service/video/concat_service.go index a8745bd..bcfe0ed 100644 --- a/service/video/concat_service.go +++ b/service/video/concat_service.go @@ -702,14 +702,26 @@ func (s *concatService) concatCallback(ctx context.Context, taskID, callbackURL payload["errorMessage"] = task.ErrorMessage } - body, _ := json.Marshal(payload) + body, err := json.Marshal(payload) + if err != nil { + g.Log().Errorf(ctx, "[异步拼接回调 %s] 序列化payload失败: %v", taskID, err) + return + } g.Log().Infof(ctx, "[异步拼接回调 %s] 状态=%s, 目标=%s", taskID, task.Status, callbackURL) - req, _ := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + req, reqErr := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + if reqErr != nil { + g.Log().Errorf(ctx, "[异步拼接回调 %s] 创建请求失败: %v", taskID, reqErr) + return + } req.Header.Set("Content-Type", "application/json") // 透传调用方用户信息 cbUser := getUserFromCtx(ctx) - userJSON, _ := json.Marshal(cbUser) + userJSON, je := json.Marshal(cbUser) + if je != nil { + g.Log().Errorf(ctx, "[异步拼接回调 %s] 序列化用户信息失败: %v", taskID, je) + return + } req.Header.Set("X-User-Info", string(userJSON)) client := &http.Client{Timeout: 2 * time.Minute} @@ -719,7 +731,11 @@ func (s *concatService) concatCallback(ctx context.Context, taskID, callbackURL return } defer resp.Body.Close() - respBody, _ := io.ReadAll(resp.Body) + respBody, readErr := io.ReadAll(resp.Body) + if readErr != nil { + g.Log().Errorf(ctx, "[异步拼接回调 %s] 读取响应失败: %v", taskID, readErr) + return + } g.Log().Infof(ctx, "[异步拼接回调 %s] 响应 status=%d, body=%s", taskID, resp.StatusCode, string(respBody)) } @@ -757,7 +773,10 @@ func downloadFile(ctx context.Context, rawURL, tempDir string) (string, error) { if resp.StatusCode != http.StatusOK { // 读取响应体用于错误诊断 - bodyBytes, _ := io.ReadAll(io.LimitReader(resp.Body, 1024)) + bodyBytes, readErr := io.ReadAll(io.LimitReader(resp.Body, 1024)) + if readErr != nil { + g.Log().Warningf(ctx, "[下载] 读取HTTP错误响应失败: %v", readErr) + } // 尝试检测签名 URL 是否过期 if parsedURL.Query().Get("x-expires") != "" || parsedURL.Query().Get("expires") != "" { return "", fmt.Errorf("HTTP %d (签名URL可能已过期,请使用新鲜地址) body=%s", resp.StatusCode, string(bodyBytes)) diff --git a/service/video/cut_service.go b/service/video/cut_service.go index 026d287..20323f7 100644 --- a/service/video/cut_service.go +++ b/service/video/cut_service.go @@ -442,8 +442,12 @@ func (s *cutService) UploadToMinIO(ctx context.Context, localFilePath string) (* // 无 HTTP 请求时(异步 goroutine),从 context 的用户信息构造 header if !hasAuthHeader { uploadUser := getUserFromCtx(ctx) - userJSON, _ := json.Marshal(uploadUser) - client.SetHeader("X-User-Info", string(userJSON)) + userJSON, je := json.Marshal(uploadUser) + if je != nil { + g.Log().Errorf(ctx, "[UploadToMinIO] 序列化用户信息失败: %v", je) + } else { + client.SetHeader("X-User-Info", string(userJSON)) + } } // 设置 multipart Content-Type(含 boundary) @@ -650,14 +654,26 @@ func (s *cutService) cutCallback(ctx context.Context, taskID, callbackURL string payload["errorMessage"] = task.ErrorMessage } - body, _ := json.Marshal(payload) + body, err := json.Marshal(payload) + if err != nil { + g.Log().Errorf(ctx, "[异步剪切回调 %s] 序列化payload失败: %v", taskID, err) + return + } g.Log().Infof(ctx, "[异步剪切回调 %s] 状态=%s, 目标=%s", taskID, task.Status, callbackURL) - req, _ := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + req, reqErr := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + if reqErr != nil { + g.Log().Errorf(ctx, "[异步剪切回调 %s] 创建请求失败: %v", taskID, reqErr) + return + } req.Header.Set("Content-Type", "application/json") // 透传调用方用户信息 cbUser := getUserFromCtx(ctx) - userJSON, _ := json.Marshal(cbUser) + userJSON, je := json.Marshal(cbUser) + if je != nil { + g.Log().Errorf(ctx, "[异步剪切回调 %s] 序列化用户信息失败: %v", taskID, je) + return + } req.Header.Set("X-User-Info", string(userJSON)) client := &http.Client{Timeout: 2 * time.Minute} @@ -667,6 +683,10 @@ func (s *cutService) cutCallback(ctx context.Context, taskID, callbackURL string return } defer resp.Body.Close() - respBody, _ := io.ReadAll(resp.Body) + respBody, readErr := io.ReadAll(resp.Body) + if readErr != nil { + g.Log().Errorf(ctx, "[异步剪切回调 %s] 读取响应失败: %v", taskID, readErr) + return + } g.Log().Infof(ctx, "[异步剪切回调 %s] 响应 status=%d, body=%s", taskID, resp.StatusCode, string(respBody)) } diff --git a/service/video/merge_service.go b/service/video/merge_service.go index 0249ff5..4b9d972 100644 --- a/service/video/merge_service.go +++ b/service/video/merge_service.go @@ -47,8 +47,14 @@ func (s *mergeService) CreateAsyncTask(ctx context.Context, videoURLs, audioURLs } // 将 videoURLs/audioURLs 序列化为 JSON 存入数据库 - videoURLsJSON, _ := json.Marshal(videoURLs) - audioURLsJSON, _ := json.Marshal(audioURLs) + videoURLsJSON, err := json.Marshal(videoURLs) + if err != nil { + return "", fmt.Errorf("序列化视频URL失败: %v", err) + } + audioURLsJSON, err := json.Marshal(audioURLs) + if err != nil { + return "", fmt.Errorf("序列化音频URL失败: %v", err) + } taskID := "merge_" + guid.S() task := &entity.VideoAudioMergeTask{ @@ -314,13 +320,25 @@ func (s *mergeService) callback(ctx context.Context, taskID, callbackURL string) payload["errorMessage"] = task.ErrorMessage } - body, _ := json.Marshal(payload) + body, err := json.Marshal(payload) + if err != nil { + g.Log().Errorf(ctx, "[拼接混音回调 %s] 序列化payload失败: %v", taskID, err) + return + } g.Log().Infof(ctx, "[拼接混音回调 %s] 状态=%s, 目标=%s", taskID, task.Status, callbackURL) - req, _ := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + req, reqErr := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + if reqErr != nil { + g.Log().Errorf(ctx, "[拼接混音回调 %s] 创建请求失败: %v", taskID, reqErr) + return + } req.Header.Set("Content-Type", "application/json") cbUser := getUserFromCtx(ctx) - userJSON, _ := json.Marshal(cbUser) + userJSON, je := json.Marshal(cbUser) + if je != nil { + g.Log().Errorf(ctx, "[拼接混音回调 %s] 序列化用户信息失败: %v", taskID, je) + return + } req.Header.Set("X-User-Info", string(userJSON)) client := &http.Client{Timeout: 2 * time.Minute} @@ -330,7 +348,11 @@ func (s *mergeService) callback(ctx context.Context, taskID, callbackURL string) return } defer resp.Body.Close() - respBody, _ := io.ReadAll(resp.Body) + respBody, readErr := io.ReadAll(resp.Body) + if readErr != nil { + g.Log().Errorf(ctx, "[拼接混音回调 %s] 读取响应失败: %v", taskID, readErr) + return + } g.Log().Infof(ctx, "[拼接混音回调 %s] 响应 status=%d, body=%s", taskID, resp.StatusCode, string(respBody)) } @@ -373,8 +395,12 @@ func uploadToMinIO(ctx context.Context, localFilePath string) (*uploadFileRes, e } if !hasAuthHeader { uploadUser := getUserFromCtx(ctx) - userJSON, _ := json.Marshal(uploadUser) - client.SetHeader("X-User-Info", string(userJSON)) + userJSON, je := json.Marshal(uploadUser) + if je != nil { + g.Log().Errorf(ctx, "[上传MinIO] 序列化用户信息失败: %v", je) + } else { + client.SetHeader("X-User-Info", string(userJSON)) + } } contentType := mw.FormDataContentType() diff --git a/service/video/scene_split_service.go b/service/video/scene_split_service.go index 6f823dd..202aaef 100644 --- a/service/video/scene_split_service.go +++ b/service/video/scene_split_service.go @@ -190,8 +190,12 @@ func (s *sceneSplitService) processTask(user *beans.User, taskID, videoURL strin } // 9. 更新数据库为成功 - segmentsJSON, _ := json.Marshal(segments) - dao.SceneSplitTask.UpdateSuccess(bgCtx, taskID, string(segmentsJSON), audioURL, len(segments), audioDuration, videoDuration) + segmentsJSON, je := json.Marshal(segments) + if je != nil { + g.Log().Errorf(bgCtx, "[场景分割 %s] 序列化分片信息失败: %v", taskID, je) + } else { + dao.SceneSplitTask.UpdateSuccess(bgCtx, taskID, string(segmentsJSON), audioURL, len(segments), audioDuration, videoDuration) + } g.Log().Infof(bgCtx, "[场景分割 %s] 完成! 分片数=%d, 音频=%s", taskID, len(segments), audioURL) @@ -427,15 +431,27 @@ func (s *sceneSplitService) callback(ctx context.Context, taskID, callbackURL st payload["errorMessage"] = task.ErrorMessage } - body, _ := json.Marshal(payload) + body, err := json.Marshal(payload) + if err != nil { + g.Log().Errorf(ctx, "[场景分割回调 %s] 序列化payload失败: %v", taskID, err) + return + } cbUser := getUserFromCtx(ctx) - userJSON, _ := json.Marshal(cbUser) + userJSON, je := json.Marshal(cbUser) + if je != nil { + g.Log().Errorf(ctx, "[场景分割回调 %s] 序列化用户信息失败: %v", taskID, je) + return + } g.Log().Infof(ctx, "[场景分割回调 %s] 状态=%s, 目标=%s", taskID, task.Status, callbackURL) g.Log().Infof(ctx, "[场景分割回调 %s] curl: curl -X POST '%s' -H 'Content-Type: application/json' -H 'X-User-Info: %s' -d '%s'", taskID, callbackURL, string(userJSON), string(body)) - req, _ := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + req, reqErr := http.NewRequest("POST", callbackURL, bytes.NewReader(body)) + if reqErr != nil { + g.Log().Errorf(ctx, "[场景分割回调 %s] 创建请求失败: %v", taskID, reqErr) + return + } req.Header.Set("Content-Type", "application/json") req.Header.Set("X-User-Info", string(userJSON)) @@ -446,6 +462,10 @@ func (s *sceneSplitService) callback(ctx context.Context, taskID, callbackURL st return } defer resp.Body.Close() - respBody, _ := io.ReadAll(resp.Body) + respBody, readErr := io.ReadAll(resp.Body) + if readErr != nil { + g.Log().Errorf(ctx, "[场景分割回调 %s] 读取响应失败: %v", taskID, readErr) + return + } g.Log().Infof(ctx, "[场景分割回调 %s] 响应 status=%d, body=%s", taskID, resp.StatusCode, string(respBody)) }