Explorar o código

1.完成片段一键转视频接口2.优化定时任务脚本针对全能模式的数据处理逻辑

lh hai 1 mes
pai
achega
59f5321283

+ 48 - 19
app/Console/Commands/CheckVideoGenerationTasksCommand.php

@@ -90,7 +90,7 @@ class CheckVideoGenerationTasksCommand extends Command
                 // 查询视频生成任务状态
                 $videoTask = DB::table('mp_generate_video_tasks')
                     ->where('id', $videoTaskId)
-                    ->select('id', 'status', 'result_url', 'compressed_url', 'last_frame_url', 'error_message', 'result_json', 'extra_params')
+                    ->select('id', 'status', 'result_url', 'compressed_url', 'last_frame_url', 'error_message', 'result_json', 'extra_params', 'alias_segment_id', 'alias_act_id')
                     ->first();
 
                 if (!$videoTask) {
@@ -152,7 +152,7 @@ class CheckVideoGenerationTasksCommand extends Command
                     $successCount++;
                     
                     // 更新分镜视频成功后新增对话记录
-                    $this->addVideoGenerationRecords($segmentId, $videoTask->result_url);
+                    $this->addVideoGenerationRecords($videoTask, $segmentId, $videoTask->result_url);
                     
                     dLog('command')->info('分镜视频生成成功', [
                         'segment_id' => $segmentId,
@@ -207,27 +207,56 @@ class CheckVideoGenerationTasksCommand extends Command
 
     /**
      * 添加视频生成对话记录
-     * 
-     * @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')
-                ->where('segment_id', $segmentId)
-                ->select('uid', 'anime_id', 'episode_number', '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('command')->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;
+                $userContent = '图片转视频';
+                $assistantContent = $segment->tail_frame ?: '';
+            } else {
+                // 全能模式:保存act_id字段
+                $recordField = 'act_id';
+                $recordValue = $segmentIdOrActId;
+                $userContent = '片段转视频';
+                $assistantContent = $segment->act_content ?: '';
+            }
+            
             // 保存对话记录
             $records = [
                 [
@@ -235,8 +264,8 @@ class CheckVideoGenerationTasksCommand extends Command
                     'anime_id'      => $segment->anime_id,
                     'sequence'      => $segment->episode_number,
                     'role'          => 'user',
-                    'content'       => '图片转视频',
-                    'segment_id'    => $segmentId,
+                    'content'       => $userContent,
+                    $recordField    => $recordValue,
                     'video_url'     => '',
                     'created_at'    => $now,
                     'updated_at'    => $now
@@ -246,8 +275,8 @@ class CheckVideoGenerationTasksCommand extends Command
                     'anime_id'      => $segment->anime_id,
                     'sequence'      => $segment->episode_number,
                     'role'          => 'assistant',
-                    'content'       => $segment->tail_frame ?: '',
-                    'segment_id'    => $segmentId,
+                    'content'       => $assistantContent,
+                    $recordField    => $recordValue,
                     'video_url'     => $videoUrl,
                     'created_at'    => $now,
                     'updated_at'    => $now
@@ -256,16 +285,16 @@ class CheckVideoGenerationTasksCommand extends Command
 
             DB::table('mp_anime_records')->insert($records);
             
-            dLog('command')->info('视频生成对话记录添加成功', [
-                'segment_id' => $segmentId,
+            dLog('generate')->info('视频生成对话记录添加成功', [
+                'segment_id_or_act_id' => $segmentIdOrActId,
                 'video_url' => $videoUrl,
                 'uid' => $segment->uid,
                 'anime_id' => $segment->anime_id
             ]);
 
         } catch (\Exception $e) {
-            dLog('command')->error('添加视频生成对话记录失败: ' . $e->getMessage(), [
-                'segment_id' => $segmentId,
+            dLog('generate')->error('添加视频生成对话记录失败: ' . $e->getMessage(), [
+                'segment_id' => $segmentIdOrActId,
                 'video_url' => $videoUrl,
                 'error' => $e->getMessage()
             ]);

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 930 - 234
app/Http/Controllers/Anime/AnimeController.php


+ 6 - 2
app/Services/AIGeneration/AIVideoGenerationService.php

@@ -2142,10 +2142,14 @@ class AIVideoGenerationService
                 // 分镜模式:保存segment_id字段
                 $recordField = 'segment_id';
                 $recordValue = $segmentIdOrActId;
+                $userContent = '图片转视频';
+                $assistantContent = $segment->tail_frame ?: '';
             } else {
                 // 全能模式:保存act_id字段
                 $recordField = 'act_id';
                 $recordValue = $segmentIdOrActId;
+                $userContent = '片段转视频';
+                $assistantContent = $segment->act_content ?: '';
             }
             
             // 保存对话记录
@@ -2155,7 +2159,7 @@ class AIVideoGenerationService
                     'anime_id'      => $segment->anime_id,
                     'sequence'      => $segment->episode_number,
                     'role'          => 'user',
-                    'content'       => '图片转视频',
+                    'content'       => $userContent,
                     $recordField    => $recordValue,
                     'video_url'     => '',
                     'created_at'    => $now,
@@ -2166,7 +2170,7 @@ class AIVideoGenerationService
                     'anime_id'      => $segment->anime_id,
                     'sequence'      => $segment->episode_number,
                     'role'          => 'assistant',
-                    'content'       => $segment->tail_frame ?: '',
+                    'content'       => $assistantContent,
                     $recordField    => $recordValue,
                     'video_url'     => $videoUrl,
                     'created_at'    => $now,

+ 6 - 6
app/Services/Anime/AnimeService.php

@@ -131,19 +131,19 @@ class AnimeService
      * @param array $segments 分段数据数组
      * @return array 返回包含acts和total_duration的数组
      */
-    public function buildEpisodeSegmentsStructureForAce($segments) {
+    public function buildEpisodeActsStructureForAce($segments) {
         $acts = [];
         $totalDuration = 0; // 初始化总时长
         
         foreach($segments as $segment) {
             // 计算分镜时长,优先级:video_duration > audio_duration > 默认5秒
             $videoDuration = getProp($segment, 'video_duration');
-            $audioDuration = getProp($segment, 'audio_duration');
+            $actDuration = getProp($segment, 'act_duration');
             
             if (!empty($videoDuration) && is_numeric($videoDuration)) {
                 $totalDuration += floatval($videoDuration);
-            } elseif (!empty($audioDuration) && is_numeric($audioDuration)) {
-                $totalDuration += floatval($audioDuration);
+            } elseif (!empty($actDuration) && is_numeric($actDuration)) {
+                $totalDuration += floatval($actDuration);
             } else {
                 $totalDuration += 5; // 默认5秒
             }
@@ -596,7 +596,7 @@ class AnimeService
             return (array)$value;
         })->toArray();
         
-        $segmentsStructure = $this->buildEpisodeSegmentsStructureForAce($segments);
+        $segmentsStructure = $this->buildEpisodeActsStructureForAce($segments);
         $episode['acts'] = $segmentsStructure['acts'];
         $episode['total_duration'] = $segmentsStructure['total_duration'];
 
@@ -5994,7 +5994,7 @@ class AnimeService
      * @param array $products 产品数组(包含product_name和url)
      * @return array ['content' => 处理后的内容, 'reference_images' => 参考图片数组]
      */
-    private function processActContentWithProducts($actContent, $products) {
+    public function processActContentWithProducts($actContent, $products) {
         if (empty($actContent) || empty($products)) {
             return [
                 'content' => $actContent,

+ 1 - 1
routes/api.php

@@ -158,7 +158,6 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
             Route::post('chat', [DeepSeekController::class, 'chat']);                               // 动漫对话
             Route::get('detail', [AnimeController::class, 'animeDetail']);                          // 动漫大纲
             Route::get('episodeInfo', [AnimeController::class, 'episodeInfo']);                     // 动漫剧集
-            Route::get('episodeInfoForAce', [AnimeController::class, 'episodeInfoForAce']);         // 动漫剧集(全能模式)
             Route::get('segmentInfo', [AnimeController::class, 'segmentInfo']);                     // 分镜信息
             Route::get('copyEpisodeVersion', [AnimeController::class, 'copyEpisodeVersion']);       // 复制动漫剧集
             Route::get('episodeVersions', [AnimeController::class, 'episodeVersions']);             // 剧集版本
@@ -194,6 +193,7 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
             Route::post('addChatForAce', [DeepSeekController::class, 'addChatForAce']);                 // 新增动漫对话
             Route::post('reGenerateAnimeForAce', [DeepSeekController::class, 'reGenerateAnimeForAce']); // 调整动漫大纲
             Route::post('chatForAce', [DeepSeekController::class, 'chatForAce']);                       // 动漫对话(全能模式)
+            Route::get('episodeInfoForAce', [AnimeController::class, 'episodeInfoForAce']);             // 动漫剧集(全能模式)
             Route::get('actChatHistory', [AnimeController::class, 'actChatHistory']);                   // 片段对话历史记录
             Route::get('confirmActs', [AnimeController::class, 'confirmActs']);                         // 确认片段分镜
             Route::post('createActVideoTask', [AnimeController::class, 'createActVideoTask']);          // 片段转视频