Просмотр исходного кода

视频任务更新数据兼容片段模式

lh 1 месяц назад
Родитель
Сommit
3164267eba
1 измененных файлов с 165 добавлено и 64 удалено
  1. 165 64
      app/Services/AIGeneration/AIVideoGenerationService.php

+ 165 - 64
app/Services/AIGeneration/AIVideoGenerationService.php

@@ -323,8 +323,8 @@ class AIVideoGenerationService
             logDB('generate', 'info', '即梦AI视频生成任务成功', ['id' => $task->id, 'result_url' => $statusInfo['result_url']]);
             $task->updateStatus(MpGenerateVideoTask::STATUS_SUCCESS, $statusInfo);
             
-            // 同步调整分镜视频状态和结果
-            $segment_id = getProp($task, 'alias_segment_id');
+            // 同步调整分镜视频状态和结果(兼容片段模式)
+            $segment_id = $this->getSegmentIdFromTask($task);
             if ($segment_id && isset($statusInfo['result_url'])) {
                 try {
                     DB::beginTransaction();
@@ -346,16 +346,16 @@ class AIVideoGenerationService
                     if (isset($statusInfo['video_duration']) && $statusInfo['video_duration'] > 0) {
                         $segmentUpdateData['video_duration'] = $statusInfo['video_duration'];
                         $segmentUpdateData['video_time_point_start'] = 0;
-                        // $segmentUpdateData['video_time_point_end'] = $statusInfo['video_duration'];
-                        $audio_duration = DB::table('mp_episode_segments')->where('segment_id', $segment_id)->value('audio_duration');
+                        
+                        $audio_duration = $this->getAudioDuration($task, $segment_id, $statusInfo['video_duration'] ?? null);
                         $segmentUpdateData['video_time_point_end'] = $audio_duration ?? 0;
                     }
                     
-                    // 更新分镜表
-                    DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update($segmentUpdateData);
+                    // 更新分镜表(兼容act模式)
+                    $this->updateSegmentTable($task, $segmentUpdateData);
                     
                     // 添加视频生成对话记录
-                    $this->addVideoGenerationRecords($segment_id, $statusInfo['result_url']);
+                    $this->addVideoGenerationRecords($task, $segment_id, $statusInfo['result_url']);
                     
                     DB::commit();
                     
@@ -372,10 +372,10 @@ class AIVideoGenerationService
             logDB('generate', 'error', '即梦AI视频生成任务失败', ['id' => $task->id, 'error' => $statusInfo['error_message']]);
             $task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, $statusInfo);
             
-            // 同步更新分镜表状态为失败
-            $segment_id = getProp($task, 'alias_segment_id');
+            // 同步更新分镜表状态为失败(兼容片段模式)
+            $segment_id = $this->getSegmentIdFromTask($task);
             if ($segment_id) {
-                DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
+                $this->updateSegmentTable($task, [
                     'video_task_status' => '失败',
                     'updated_at' => date('Y-m-d H:i:s')
                 ]);
@@ -391,10 +391,10 @@ class AIVideoGenerationService
                 'error_message' => '任务处理超时(超过12小时)'
             ]);
             
-            // 同步更新分镜表状态为失败
-            $segment_id = getProp($task, 'alias_segment_id');
+            // 同步更新分镜表状态为失败(兼容片段模式)
+            $segment_id = $this->getSegmentIdFromTask($task);
             if ($segment_id) {
-                DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
+                $this->updateSegmentTable($task, [
                     'video_task_status' => '失败',
                     'updated_at' => date('Y-m-d H:i:s')
                 ]);
@@ -587,8 +587,8 @@ class AIVideoGenerationService
             logDB('generate', 'info', 'Seedance视频生成任务成功', ['id' => $task->id, 'result_url' => $statusInfo['result_url']]);
             $task->updateStatus(MpGenerateVideoTask::STATUS_SUCCESS, $statusInfo);
             
-            // 同步调整分镜视频状态和结果
-            $segment_id = getProp($task, 'alias_segment_id');
+            // 同步调整分镜视频状态和结果(兼容片段模式)
+            $segment_id = $this->getSegmentIdFromTask($task);
             if ($segment_id && isset($statusInfo['result_url'])) {
                 try {
                     DB::beginTransaction();
@@ -610,16 +610,17 @@ class AIVideoGenerationService
                     if (isset($statusInfo['video_duration']) && $statusInfo['video_duration'] > 0) {
                         $segmentUpdateData['video_duration'] = $statusInfo['video_duration'];
                         $segmentUpdateData['video_time_point_start'] = 0;
-                        // $segmentUpdateData['video_time_point_end'] = $statusInfo['video_duration'];
-                        $audio_duration = DB::table('mp_episode_segments')->where('segment_id', $segment_id)->value('audio_duration');
+                        
+                        // 获取video_time_point_end(兼容片段模式)
+                        $audio_duration = $this->getAudioDuration($task, $segment_id, $statusInfo['video_duration'] ?? null);
                         $segmentUpdateData['video_time_point_end'] = $audio_duration ?? 0;
                     }
                     
-                    // 更新分镜表
-                    DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update($segmentUpdateData);
+                    // 更新分镜表(兼容act模式)
+                    $this->updateSegmentTable($task, $segmentUpdateData);
                     
                     // 添加视频生成对话记录
-                    $this->addVideoGenerationRecords($segment_id, $statusInfo['result_url']);
+                    $this->addVideoGenerationRecords($task, $segment_id, $statusInfo['result_url']);
                     
                     DB::commit();
                     
@@ -639,10 +640,10 @@ class AIVideoGenerationService
                 'result_json'   => $statusInfo['result_json'] ?? []
             ]);
             
-            // 同步更新分镜表状态为失败
-            $segment_id = getProp($task, 'alias_segment_id');
+            // 同步更新分镜表状态为失败(兼容片段模式)
+            $segment_id = $this->getSegmentIdFromTask($task);
             if ($segment_id) {
-                DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
+                $this->updateSegmentTable($task, [
                     'video_task_status' => '失败',
                     'updated_at' => date('Y-m-d H:i:s')
                 ]);
@@ -658,10 +659,10 @@ class AIVideoGenerationService
                 'error_message' => '任务处理超时(超过48小时)'
             ]);
             
-            // 同步更新分镜表状态为失败
-            $segment_id = getProp($task, 'alias_segment_id');
+            // 同步更新分镜表状态为失败(兼容片段模式)
+            $segment_id = $this->getSegmentIdFromTask($task);
             if ($segment_id) {
-                DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
+                $this->updateSegmentTable($task, [
                     'video_task_status' => '失败',
                     'updated_at' => date('Y-m-d H:i:s')
                 ]);
@@ -1473,8 +1474,8 @@ class AIVideoGenerationService
             logDB('generate', 'info', '可灵AI Omni视频生成任务成功', ['id' => $task->id, 'result_url' => $statusInfo['result_url']]);
             $task->updateStatus(MpGenerateVideoTask::STATUS_SUCCESS, $statusInfo);
             
-            // 同步调整分镜视频状态和结果
-            $segment_id = getProp($task, 'alias_segment_id');
+            // 同步调整分镜视频状态和结果(兼容片段模式)
+            $segment_id = $this->getSegmentIdFromTask($task);
             if ($segment_id && isset($statusInfo['result_url'])) {
                 try {
                     DB::beginTransaction();
@@ -1496,16 +1497,17 @@ class AIVideoGenerationService
                     if (isset($statusInfo['video_duration']) && $statusInfo['video_duration'] > 0) {
                         $segmentUpdateData['video_duration'] = $statusInfo['video_duration'];
                         $segmentUpdateData['video_time_point_start'] = 0;
-                        // $segmentUpdateData['video_time_point_end'] = $statusInfo['video_duration'];
-                        $audio_duration = DB::table('mp_episode_segments')->where('segment_id', $segment_id)->value('audio_duration');
+                        
+                        // 获取video_time_point_end(兼容片段模式)
+                        $audio_duration = $this->getAudioDuration($task, $segment_id, $statusInfo['video_duration']);
                         $segmentUpdateData['video_time_point_end'] = $audio_duration ?? 0;
                     }
                     
-                    // 更新分镜表
-                    DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update($segmentUpdateData);
+                    // 更新分镜表(兼容act模式)
+                    $this->updateSegmentTable($task, $segmentUpdateData);
                     
                     // 添加视频生成对话记录
-                    $this->addVideoGenerationRecords($segment_id, $statusInfo['result_url']);
+                    $this->addVideoGenerationRecords($task, $segment_id, $statusInfo['result_url']);
                     
                     DB::commit();
                     
@@ -1524,10 +1526,10 @@ class AIVideoGenerationService
                 'result_json' => $statusInfo['result_json'] ?? []
             ]);
             
-            // 同步更新分镜表状态为失败
-            $segment_id = getProp($task, 'alias_segment_id');
+            // 同步更新分镜表状态为失败(兼容片段模式)
+            $segment_id = $this->getSegmentIdFromTask($task);
             if ($segment_id) {
-                DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
+                $this->updateSegmentTable($task, [
                     'video_task_status' => '失败',
                     'updated_at' => date('Y-m-d H:i:s')
                 ]);
@@ -1543,10 +1545,10 @@ class AIVideoGenerationService
                 'error_message' => '任务处理超时(超过24小时)'
             ]);
             
-            // 同步更新分镜表状态为失败
-            $segment_id = getProp($task, 'alias_segment_id');
+            // 同步更新分镜表状态为失败(兼容片段模式)
+            $segment_id = $this->getSegmentIdFromTask($task);
             if ($segment_id) {
-                DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
+                $this->updateSegmentTable($task, [
                     'video_task_status' => '失败',
                     'updated_at' => date('Y-m-d H:i:s')
                 ]);
@@ -2026,28 +2028,125 @@ class AIVideoGenerationService
     }
 
     /**
+     * 根据task获取segment_id或act_id(兼容act模式)
+     * 分镜模式:返回segment_id用于查询
+     * 片段模式:返回act_id用于查询(因为segment_id为空)
+     */
+    private function getSegmentIdFromTask($task)
+    {
+        $segment_id = getProp($task, 'alias_segment_id');
+        
+        // 如果有segment_id,直接返回(分镜模式)
+        if ($segment_id) {
+            return $segment_id;
+        }
+        
+        // 如果有alias_act_id,返回act_id(片段模式,segment_id为空)
+        $act_id = getProp($task, 'alias_act_id');
+        if ($act_id) {
+            return $act_id; // 直接返回act_id,不需要查segment_id
+        }
+        
+        return null;
+    }
+
+    /**
+     * 更新分镜表(兼容act模式)
+     * 分镜模式:使用segment_id字段更新
+     * 片段模式:使用id字段更新
+     */
+    private function updateSegmentTable($task, $updateData)
+    {
+        $segment_id = getProp($task, 'alias_segment_id');
+        $act_id = getProp($task, 'alias_act_id');
+        
+        if ($segment_id) {
+            // 分镜模式:使用segment_id更新
+            return DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update($updateData);
+        } elseif ($act_id) {
+            // 片段模式(全能模式):使用id更新
+            return DB::table('mp_episode_segments')->where('id', $act_id)->update($updateData);
+        }
+        
+        return false;
+    }
+
+    /**
+     * 获取audio_duration(兼容act模式)
+     * 分镜模式:使用segment_id查询
+     * 片段模式:使用id查询
+     * @param array $task 任务数据
+     * @param string|int $segmentIdOrActId segment_id或act_id
+     * @param float|null $video_duration 视频时长(如果传入,片段模式直接返回此值)
+     * @return float
+     */
+    private function getAudioDuration($task, $segmentIdOrActId, $video_duration = null)
+    {
+        $segment_id = getProp($task, 'alias_segment_id');
+        $act_id = getProp($task, 'alias_act_id');
+        
+        if ($segment_id) {
+            // 分镜模式:使用segment_id查询
+            return DB::table('mp_episode_segments')->where('segment_id', $segmentIdOrActId)->value('audio_duration');
+        } elseif ($act_id) {
+            // 片段模式(全能模式):如果传入了video_duration直接返回,否则查询audio_duration
+            if ($video_duration !== null && $video_duration > 0) {
+                return $video_duration;
+            }
+            return DB::table('mp_episode_segments')->where('id', $segmentIdOrActId)->value('audio_duration');
+        }
+        
+        return 0;
+    }
+
+    /**
      * 添加视频生成对话记录
-     * 
-     * @param int $segmentId 分镜ID
+     * @param array $task 任务数据
+     * @param string|int $segmentIdOrActId segment_id(分镜模式)或 act_id(片段模式)
      * @param string $videoUrl 视频URL
      * @return void
      */
-    private function addVideoGenerationRecords($segmentId, $videoUrl)
+    private function addVideoGenerationRecords($task, $segmentIdOrActId, $videoUrl)
     {
         try {
-            // 获取分镜信息
-            $segment = DB::table('mp_episode_segments as a')->leftJoin('mp_animes as b', 'a.anime_id', 'b.id')
-                ->where('a.segment_id', $segmentId)
-                ->select('b.user_id as uid', 'a.anime_id', 'a.episode_number', 'a.tail_frame')
-                ->first();
+            $segment_id = getProp($task, 'alias_segment_id');
+            $act_id = getProp($task, 'alias_act_id');
+            
+            if ($segment_id) {
+                // 分镜模式:使用segment_id查询
+                $segment = DB::table('mp_episode_segments as a')->leftJoin('mp_animes as b', 'a.anime_id', 'b.id')
+                    ->where('a.segment_id', $segmentIdOrActId)
+                    ->select('b.user_id as uid', 'a.anime_id', 'a.episode_number', 'a.tail_frame', 'a.segment_id')
+                    ->first();
+            } elseif ($act_id) {
+                // 片段模式:使用id查询
+                $segment = DB::table('mp_episode_segments as a')->leftJoin('mp_animes as b', 'a.anime_id', 'b.id')
+                    ->where('a.id', $segmentIdOrActId)
+                    ->select('b.user_id as uid', 'a.anime_id', 'a.episode_number', 'a.tail_frame', 'a.segment_id', 'a.id')
+                    ->first();
+            } else {
+                dLog('generate')->warning('无法确定查询模式,任务缺少segment_id和act_id', ['segment_id_or_act_id' => $segmentIdOrActId]);
+                return;
+            }
 
             if (!$segment) {
-                dLog('generate')->warning('分镜信息不存在,无法添加对话记录', ['segment_id' => $segmentId]);
+                dLog('generate')->warning('分镜信息不存在,无法添加对话记录', ['segment_id_or_act_id' => $segmentIdOrActId]);
                 return;
             }
 
             $now = date('Y-m-d H:i:s');
             
+            // 根据模式确定保存的字段和值
+            if ($segment_id) {
+                // 分镜模式:保存segment_id字段
+                $recordField = 'segment_id';
+                $recordValue = $segmentIdOrActId;
+            } else {
+                // 片段模式:保存act_id字段
+                $recordField = 'act_id';
+                $recordValue = $segmentIdOrActId;
+            }
+            
             // 保存对话记录
             $records = [
                 [
@@ -2056,7 +2155,7 @@ class AIVideoGenerationService
                     'sequence'      => $segment->episode_number,
                     'role'          => 'user',
                     'content'       => '图片转视频',
-                    'segment_id'    => $segmentId,
+                    $recordField    => $recordValue,
                     'video_url'     => '',
                     'created_at'    => $now,
                     'updated_at'    => $now
@@ -2067,7 +2166,7 @@ class AIVideoGenerationService
                     'sequence'      => $segment->episode_number,
                     'role'          => 'assistant',
                     'content'       => $segment->tail_frame ?: '',
-                    'segment_id'    => $segmentId,
+                    $recordField    => $recordValue,
                     'video_url'     => $videoUrl,
                     'created_at'    => $now,
                     'updated_at'    => $now
@@ -2077,7 +2176,7 @@ class AIVideoGenerationService
             DB::table('mp_anime_records')->insert($records);
             
             dLog('generate')->info('视频生成对话记录添加成功', [
-                'segment_id' => $segmentId,
+                'segment_id_or_act_id' => $segmentIdOrActId,
                 'video_url' => $videoUrl,
                 'uid' => $segment->uid,
                 'anime_id' => $segment->anime_id
@@ -2085,7 +2184,7 @@ class AIVideoGenerationService
 
         } catch (\Exception $e) {
             dLog('generate')->error('添加视频生成对话记录失败: ' . $e->getMessage(), [
-                'segment_id' => $segmentId,
+                'segment_id' => $segmentIdOrActId,
                 'video_url' => $videoUrl,
                 'error' => $e->getMessage()
             ]);
@@ -2418,8 +2517,8 @@ class AIVideoGenerationService
             logDB('generate', 'info', '统一API视频生成任务成功', ['id' => $task->id, 'result_url' => $statusInfo['result_url']]);
             $task->updateStatus(MpGenerateVideoTask::STATUS_SUCCESS, $statusInfo);
             
-            // 同步调整分镜视频状态和结果
-            $segment_id = getProp($task, 'alias_segment_id');
+            // 同步调整分镜视频状态和结果(兼容片段模式)
+            $segment_id = $this->getSegmentIdFromTask($task);
             if ($segment_id && isset($statusInfo['result_url'])) {
                 try {
                     DB::beginTransaction();
@@ -2441,15 +2540,17 @@ class AIVideoGenerationService
                     if (isset($statusInfo['video_duration']) && $statusInfo['video_duration'] > 0) {
                         $segmentUpdateData['video_duration'] = $statusInfo['video_duration'];
                         $segmentUpdateData['video_time_point_start'] = 0;
-                        $audio_duration = DB::table('mp_episode_segments')->where('segment_id', $segment_id)->value('audio_duration');
+                        
+                        // 获取audio_duration(兼容片段模式)
+                        $audio_duration = $this->getAudioDuration($task, $segment_id, $statusInfo['video_duration'] ?? null);
                         $segmentUpdateData['video_time_point_end'] = $audio_duration ?? 0;
                     }
                     
-                    // 更新分镜表
-                    DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update($segmentUpdateData);
+                    // 更新分镜表(兼容act模式)
+                    $this->updateSegmentTable($task, $segmentUpdateData);
                     
                     // 添加视频生成对话记录
-                    $this->addVideoGenerationRecords($segment_id, $statusInfo['result_url']);
+                    $this->addVideoGenerationRecords($task, $segment_id, $statusInfo['result_url']);
                     
                     DB::commit();
                     
@@ -2469,10 +2570,10 @@ class AIVideoGenerationService
                 'result_json' => $statusInfo['result_json'] ?? []
             ]);
             
-            // 同步更新分镜表状态为失败
-            $segment_id = getProp($task, 'alias_segment_id');
+            // 同步更新分镜表状态为失败(兼容片段模式)
+            $segment_id = $this->getSegmentIdFromTask($task);
             if ($segment_id) {
-                DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
+                $this->updateSegmentTable($task, [
                     'video_task_status' => '失败',
                     'updated_at' => date('Y-m-d H:i:s')
                 ]);
@@ -2488,10 +2589,10 @@ class AIVideoGenerationService
                 'error_message' => '任务处理超时(超过48小时)'
             ]);
             
-            // 同步更新分镜表状态为失败
-            $segment_id = getProp($task, 'alias_segment_id');
+            // 同步更新分镜表状态为失败(兼容片段模式)
+            $segment_id = $this->getSegmentIdFromTask($task);
             if ($segment_id) {
-                DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
+                $this->updateSegmentTable($task, [
                     'video_task_status' => '失败',
                     'updated_at' => date('Y-m-d H:i:s')
                 ]);