Explorar o código

新增定时任务检查分镜音频生成状态

lh hai 2 meses
pai
achega
d48e69a9cd

+ 20 - 20
app/Console/Anime/AnimeCheckImgUrlCommand.php

@@ -36,7 +36,7 @@ class AnimeCheckImgUrlCommand extends Command
      */
     public function handle()
     {
-        dLog('generate')->info('====================开始检查动漫对话角色和场景图片生成状态====================');
+        dLog('command')->info('====================开始检查动漫对话角色和场景图片生成状态====================');
         $time_start = microtime(true);
         $timeout = 50; // 超时时间50秒
         $check_interval = 3; // 每3秒检查一次
@@ -45,7 +45,7 @@ class AnimeCheckImgUrlCommand extends Command
             // 检查是否超时
             $elapsed_time = microtime(true) - $time_start;
             if ($elapsed_time >= $timeout) {
-                dLog('generate')->info('检查超时,退出循环');
+                dLog('command')->info('检查超时,退出循环');
                 break;
             }
 
@@ -55,7 +55,7 @@ class AnimeCheckImgUrlCommand extends Command
 
             // 如果没有需要检查的内容,直接跳出循环
             if (!$has_pending_animes && !$has_pending_episodes) {
-                dLog('generate')->info('没有需要检查的内容,退出循环');
+                dLog('command')->info('没有需要检查的内容,退出循环');
                 break;
             }
 
@@ -74,8 +74,8 @@ class AnimeCheckImgUrlCommand extends Command
         }
 
         $time_end = microtime(true);
-        dLog('generate')->info('脚本执行时间: '.round($time_end-$time_start, 2).'秒');
-        dLog('generate')->info('====================结束检查动漫对话角色和场景图片生成状态====================');
+        dLog('command')->info('脚本执行时间: '.round($time_end-$time_start, 2).'秒');
+        dLog('command')->info('====================结束检查动漫对话角色和场景图片生成状态====================');
     }
 
     // 检查动漫全局执行中的任务
@@ -102,7 +102,7 @@ class AnimeCheckImgUrlCommand extends Command
 
     // 检查全局
     private function checkAnimes() {
-        dLog('generate')->info('====================开始检查动漫全局====================');
+        dLog('command')->info('====================开始检查动漫全局====================');
 
         // 获取待执行的动漫对话数据
         $data = DB::table('mp_animes')->where('generate_status', '执行中')->select('id', 'roles', 'scenes')->get();
@@ -126,7 +126,7 @@ class AnimeCheckImgUrlCommand extends Command
             }
         }
 
-        dLog('generate')->info('====================结束检查动漫全局====================');
+        dLog('command')->info('====================结束检查动漫全局====================');
     }
 
 
@@ -201,7 +201,7 @@ class AnimeCheckImgUrlCommand extends Command
         $episodes = DB::table('mp_anime_episodes')->where('anime_id', $id)->get();
         
         if ($episodes->isEmpty()) {
-            dLog('generate')->info("动漫对话ID:{$id} 没有关联的剧集");
+            dLog('command')->info("动漫对话ID:{$id} 没有关联的剧集");
             return;
         }
 
@@ -246,7 +246,7 @@ class AnimeCheckImgUrlCommand extends Command
                         $episode_role['url'] = $role_url;
                         $roles_updated = true;
                         $url_inherited = true;
-                        dLog('generate')->info("剧集ID:{$episode_id} 角色:{$role_name} 继承全局数据 (task_id:{$role_task_id}, task_status:{$role_task_status}, url:{$role_url})");
+                        dLog('command')->info("剧集ID:{$episode_id} 角色:{$role_name} 继承全局数据 (task_id:{$role_task_id}, task_status:{$role_task_status}, url:{$role_url})");
                         break;
                     }
                 }
@@ -273,10 +273,10 @@ class AnimeCheckImgUrlCommand extends Command
                             $episode_role['task_id'] = $task_id;
                             $episode_role['task_status'] = 'processing';
                             $roles_updated = true;
-                            dLog('generate')->info("剧集ID:{$episode_id} 角色:{$episode_role_name} 创建图片生成任务,任务ID:{$task_id}");
+                            dLog('command')->info("剧集ID:{$episode_id} 角色:{$episode_role_name} 创建图片生成任务,任务ID:{$task_id}");
                         }
                     } catch (\Exception $e) {
-                        dLog('generate')->error("剧集ID:{$episode_id} 角色:{$episode_role_name} 创建图片生成任务失败: " . $e->getMessage());
+                        dLog('command')->error("剧集ID:{$episode_id} 角色:{$episode_role_name} 创建图片生成任务失败: " . $e->getMessage());
                     }
                 }
             }
@@ -314,7 +314,7 @@ class AnimeCheckImgUrlCommand extends Command
                         $episode_scene['url'] = $scene_url;
                         $scenes_updated = true;
                         $url_inherited = true;
-                        dLog('generate')->info("剧集ID:{$episode_id} 场景:{$scene_name} 继承全局数据 (task_id:{$scene_task_id}, task_status:{$scene_task_status}, url:{$scene_url})");
+                        dLog('command')->info("剧集ID:{$episode_id} 场景:{$scene_name} 继承全局数据 (task_id:{$scene_task_id}, task_status:{$scene_task_status}, url:{$scene_url})");
                         break;
                     }
                 }
@@ -341,10 +341,10 @@ class AnimeCheckImgUrlCommand extends Command
                             $episode_scene['task_id'] = $task_id;
                             $episode_scene['task_status'] = 'processing';
                             $scenes_updated = true;
-                            dLog('generate')->info("剧集ID:{$episode_id} 场景:{$episode_scene_name} 创建图片生成任务,任务ID:{$task_id}");
+                            dLog('command')->info("剧集ID:{$episode_id} 场景:{$episode_scene_name} 创建图片生成任务,任务ID:{$task_id}");
                         }
                     } catch (\Exception $e) {
-                        dLog('generate')->error("剧集ID:{$episode_id} 场景:{$episode_scene_name} 创建图片生成任务失败: " . $e->getMessage());
+                        dLog('command')->error("剧集ID:{$episode_id} 场景:{$episode_scene_name} 创建图片生成任务失败: " . $e->getMessage());
                     }
                 }
             }
@@ -366,19 +366,19 @@ class AnimeCheckImgUrlCommand extends Command
                 $update_data['generate_at'] = date('Y-m-d H:i:s');
 
                 DB::table('mp_anime_episodes')->where('id', $episode_id)->update($update_data);
-                dLog('generate')->info("剧集ID:{$episode_id} 数据已同步更新,状态改为待执行");
+                dLog('command')->info("剧集ID:{$episode_id} 数据已同步更新,状态改为待执行");
             }
         }
 
         // 更新状态为已完成
         DB::table('mp_animes')->where('id', $id)->update(['generate_status' => '已完成', 'updated_at'=>date('Y-m-d H:i:s')]);
-        dLog('generate')->info('动漫对话图片已全部生成完毕');
+        dLog('command')->info('动漫对话图片已全部生成完毕');
     }
 
 
     // 检查剧集
     private function checkEpisodes() {
-        dLog('generate')->info('====================开始检查剧集====================');
+        dLog('command')->info('====================开始检查剧集====================');
 
         // 获取待执行和执行中的剧集数据
         $data = DB::table('mp_anime_episodes')->whereIn('generate_status', ['待执行', '执行中'])->select('id', 'roles', 'scenes', 'generate_status')->get();
@@ -398,7 +398,7 @@ class AnimeCheckImgUrlCommand extends Command
                     'generate_at' => date('Y-m-d H:i:s'),
                     'updated_at' => date('Y-m-d H:i:s')
                 ]);
-                dLog('generate')->info("剧集ID:{$id} 状态从待执行改为执行中");
+                dLog('command')->info("剧集ID:{$id} 状态从待执行改为执行中");
             }
 
             // 处理角色图片状态
@@ -410,11 +410,11 @@ class AnimeCheckImgUrlCommand extends Command
             if ($role_result['success_count'] == $role_count && $scene_result['success_count'] == $scene_count) {
                 // 更新状态为已完成
                 DB::table('mp_anime_episodes')->where('id', $id)->update(['generate_status' => '已完成', 'updated_at'=>date('Y-m-d H:i:s')]);
-                dLog('generate')->info("剧集ID:{$id} 图片已全部生成完毕,状态改为已完成");
+                dLog('command')->info("剧集ID:{$id} 图片已全部生成完毕,状态改为已完成");
             }
         }
 
-        dLog('generate')->info('====================结束检查剧集====================');
+        dLog('command')->info('====================结束检查剧集====================');
     }
 
     // 检查剧集角色

+ 17 - 17
app/Console/Anime/SegmentCheckAudioCommand.php

@@ -33,7 +33,7 @@ class SegmentCheckAudioCommand extends Command
      */
     public function handle()
     {
-        dLog('generate')->info('====================开始检查分镜音频信息====================');
+        dLog('command')->info('====================开始检查分镜音频信息====================');
         $time_start = microtime(true);
         $timeout = 50; // 超时时间50秒
         $check_interval = 3; // 每3秒检查一次
@@ -42,7 +42,7 @@ class SegmentCheckAudioCommand extends Command
             // 检查是否超时
             $elapsed_time = microtime(true) - $time_start;
             if ($elapsed_time >= $timeout) {
-                dLog('generate')->info('检查超时,退出循环');
+                dLog('command')->info('检查超时,退出循环');
                 break;
             }
 
@@ -55,7 +55,7 @@ class SegmentCheckAudioCommand extends Command
                 ->get();
             
             if ($pendingTasks->isNotEmpty()) {
-                dLog('generate')->info('找到待重试的音频任务', ['count' => $pendingTasks->count()]);
+                dLog('command')->info('找到待重试的音频任务', ['count' => $pendingTasks->count()]);
                 
                 foreach ($pendingTasks as $task) {
                     sleep(1);
@@ -70,8 +70,8 @@ class SegmentCheckAudioCommand extends Command
                         
                         if (!isset($response_arr['code']) || (int)$response_arr['code'] !== 0) {
                             $error_msg = isset($response_arr['msg']) ? $response_arr['msg'] : '未知错误';
-                            dLog('anime')->error('火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId]);
-                            logDB('anime', 'error', '火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId]);
+                            dLog('command')->error('火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId]);
+                            logDB('command', 'error', '火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId]);
                             
                             // 标记任务为失败
                             DB::table('mp_dub_video_tasks')
@@ -81,10 +81,10 @@ class SegmentCheckAudioCommand extends Command
                                     'updated_at' => date('Y-m-d H:i:s')
                                 ]);
                         } else {
-                            dLog('generate')->info('音频任务重试成功', ['task_id' => $dubTaskId]);
+                            dLog('command')->info('音频任务重试成功', ['task_id' => $dubTaskId]);
                         }
                     } catch (\Exception $e) {
-                        dLog('anime')->error('重试音频任务异常', [
+                        dLog('command')->error('重试音频任务异常', [
                             'task_id' => $task->id,
                             'error' => $e->getMessage()
                         ]);
@@ -104,7 +104,7 @@ class SegmentCheckAudioCommand extends Command
                 ->get();
             
             if ($segmentsNeedAudio->isNotEmpty()) {
-                dLog('generate')->info('找到需要生成音频的分镜', ['count' => $segmentsNeedAudio->count()]);
+                dLog('command')->info('找到需要生成音频的分镜', ['count' => $segmentsNeedAudio->count()]);
                 
                 foreach ($segmentsNeedAudio as $segment) {
                     sleep(1);
@@ -140,7 +140,7 @@ class SegmentCheckAudioCommand extends Command
                             ]);
                             
                             if (!$dubTaskId) {
-                                dLog('anime')->error('创建配音任务失败', ['segment_id' => $segment_id]);
+                                dLog('command')->error('创建配音任务失败', ['segment_id' => $segment_id]);
                                 continue;
                             }
                             
@@ -152,10 +152,10 @@ class SegmentCheckAudioCommand extends Command
                             
                             if (!isset($response_arr['code']) || (int)$response_arr['code'] !== 0) {
                                 $error_msg = isset($response_arr['msg']) ? $response_arr['msg'] : '未知错误';
-                                dLog('anime')->error('火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId, 'segment_id' => $segment_id]);
-                                logDB('anime', 'error', '火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId, 'segment_id' => $segment_id]);
+                                dLog('command')->error('火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId, 'segment_id' => $segment_id]);
+                                logDB('command', 'error', '火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId, 'segment_id' => $segment_id]);
                             } else {
-                                dLog('generate')->info('音频任务创建成功', ['task_id' => $dubTaskId, 'segment_id' => $segment_id]);
+                                dLog('command')->info('音频任务创建成功', ['task_id' => $dubTaskId, 'segment_id' => $segment_id]);
                                 
                                 // 更新分镜表,标记音频正在生成
                                 DB::table('mp_episode_segments')
@@ -176,10 +176,10 @@ class SegmentCheckAudioCommand extends Command
                                     'updated_at' => $now
                                 ]);
                             
-                            dLog('generate')->info('分镜无对话,写入默认音频', ['segment_id' => $segment_id]);
+                            dLog('command')->info('分镜无对话,写入默认音频', ['segment_id' => $segment_id]);
                         }
                     } catch (\Exception $e) {
-                        dLog('anime')->error('处理分镜音频异常', [
+                        dLog('command')->error('处理分镜音频异常', [
                             'segment_id' => $segment->segment_id,
                             'error' => $e->getMessage()
                         ]);
@@ -189,7 +189,7 @@ class SegmentCheckAudioCommand extends Command
 
             // 如果没有待处理的任务,退出循环
             if ($pendingTasks->isEmpty() && $segmentsNeedAudio->isEmpty()) {
-                dLog('generate')->info('没有待处理的音频任务,退出循环');
+                dLog('command')->info('没有待处理的音频任务,退出循环');
                 break;
             }
 
@@ -199,8 +199,8 @@ class SegmentCheckAudioCommand extends Command
 
         $time_end = microtime(true);
         $execution_time = round($time_end - $time_start, 2);
-        dLog('generate')->info('脚本执行时间: '.round($time_end-$time_start, 2).'秒');
-        dLog('generate')->info('====================结束检查分镜音频信息====================');
+        dLog('command')->info('脚本执行时间: '.round($time_end-$time_start, 2).'秒');
+        dLog('command')->info('====================结束检查分镜音频信息====================');
     }
     
 }

+ 13 - 13
app/Console/Commands/CheckImageGenerationTasksCommand.php

@@ -31,7 +31,7 @@ class CheckImageGenerationTasksCommand extends Command
      */
     public function handle(AIImageGenerationService $aiImageGenerationService)
     {
-        dLog('generate')->info('开始检查图片生成任务状态...');
+        dLog('command')->info('开始检查图片生成任务状态...');
 
         // 执行50s
         $time_start = time();
@@ -49,12 +49,12 @@ class CheckImageGenerationTasksCommand extends Command
             
             $totalCount = $jimengProcessingCount + $volcPendingCount;
             
-            dLog('generate')->info("待处理任务统计 - 即梦AI处理中: {$jimengProcessingCount}, 火山API待处理: {$volcPendingCount}");
+            dLog('command')->info("待处理任务统计 - 即梦AI处理中: {$jimengProcessingCount}, 火山API待处理: {$volcPendingCount}");
             
             while ($totalCount > 0) {
                 $time_diff = time() - $time_start;
                 if ($time_diff > 50) {
-                    dLog('generate')->info('定时任务执行超过50秒,退出循环');
+                    dLog('command')->info('定时任务执行超过50秒,退出循环');
                     break;
                 }
                 
@@ -77,13 +77,13 @@ class CheckImageGenerationTasksCommand extends Command
                 $totalCount = $jimengProcessingCount + $volcPendingCount;
             }
             
-            dLog('generate')->info('任务状态检查完成');
+            dLog('command')->info('任务状态检查完成');
             
             // 更新分镜表中的图片任务状态
             $this->updateSegmentPicStatus();
             
         } catch (\Exception $e) {
-            dLog('generate')->error('任务状态检查失败: ' . $e->getMessage());
+            dLog('command')->error('任务状态检查失败: ' . $e->getMessage());
             return 1;
         }
 
@@ -110,7 +110,7 @@ class CheckImageGenerationTasksCommand extends Command
                 return;
             }
 
-            dLog('generate')->info('开始更新分镜图片任务状态', ['count' => $segments->count()]);
+            dLog('command')->info('开始更新分镜图片任务状态', ['count' => $segments->count()]);
 
             $successCount = 0;
             $failedCount = 0;
@@ -127,7 +127,7 @@ class CheckImageGenerationTasksCommand extends Command
                     ->first();
 
                 if (!$picTask) {
-                    dLog('generate')->warning('分镜关联的图片任务不存在', [
+                    dLog('command')->warning('分镜关联的图片任务不存在', [
                         'segment_id' => $segmentId,
                         'pic_task_id' => $picTaskId
                     ]);
@@ -151,7 +151,7 @@ class CheckImageGenerationTasksCommand extends Command
                     
                     $successCount++;
                     
-                    dLog('generate')->info('分镜图片生成成功', [
+                    dLog('command')->info('分镜图片生成成功', [
                         'segment_id' => $segmentId,
                         'pic_task_id' => $picTaskId,
                         'img_url' => $updateData['img_url']
@@ -162,12 +162,12 @@ class CheckImageGenerationTasksCommand extends Command
                     
                     $failedCount++;
                     
-                    dLog('generate')->error('分镜图片生成失败', [
+                    dLog('command')->error('分镜图片生成失败', [
                         'segment_id' => $segmentId,
                         'pic_task_id' => $picTaskId,
                         'error' => $picTask->error_message
                     ]);
-                    logDB('generate', 'error', '分镜图片生成失败', [
+                    logDB('command', 'error', '分镜图片生成失败', [
                         'segment_id' => $segmentId,
                         'pic_task_id' => $picTaskId,
                         'error' => $picTask->error_message
@@ -185,7 +185,7 @@ class CheckImageGenerationTasksCommand extends Command
                     ->update($updateData);
             }
 
-            dLog('generate')->info('分镜图片任务状态更新完成', [
+            dLog('command')->info('分镜图片任务状态更新完成', [
                 'total' => $segments->count(),
                 'success' => $successCount,
                 'failed' => $failedCount,
@@ -193,8 +193,8 @@ class CheckImageGenerationTasksCommand extends Command
             ]);
 
         } catch (\Exception $e) {
-            dLog('generate')->error('更新分镜图片任务状态异常: ' . $e->getMessage());
-            logDB('generate', 'error', '更新分镜图片任务状态异常', [
+            dLog('command')->error('更新分镜图片任务状态异常: ' . $e->getMessage());
+            logDB('command', 'error', '更新分镜图片任务状态异常', [
                 'error' => $e->getMessage(),
                 'trace' => $e->getTraceAsString()
             ]);

+ 12 - 12
app/Console/Commands/CheckVideoGenerationTasksCommand.php

@@ -30,7 +30,7 @@ class CheckVideoGenerationTasksCommand extends Command
      */
     public function handle(AIVideoGenerationService $videoGenerationService)
     {
-        dLog('generate')->info('开始检查视频生成任务状态...');
+        dLog('command')->info('开始检查视频生成任务状态...');
 
         // 执行50s
         $time_start = time();
@@ -47,10 +47,10 @@ class CheckVideoGenerationTasksCommand extends Command
             // 更新分镜表中的视频任务状态
             $this->updateSegmentVideoStatus();
             
-            dLog('generate')->info('视频任务状态检查完成');
+            dLog('command')->info('视频任务状态检查完成');
         } catch (\Exception $e) {
-            dLog('generate')->error('视频任务状态检查失败: ' . $e->getMessage());
-            logDB('generate', 'error', '定时任务:视频生成任务状态检查失败', ['error' => $e->getMessage()]);
+            dLog('command')->error('视频任务状态检查失败: ' . $e->getMessage());
+            logDB('command', 'error', '定时任务:视频生成任务状态检查失败', ['error' => $e->getMessage()]);
             return 1;
         }
 
@@ -77,7 +77,7 @@ class CheckVideoGenerationTasksCommand extends Command
                 return;
             }
 
-            dLog('generate')->info('开始更新分镜视频任务状态', ['count' => $segments->count()]);
+            dLog('command')->info('开始更新分镜视频任务状态', ['count' => $segments->count()]);
 
             $successCount = 0;
             $failedCount = 0;
@@ -94,7 +94,7 @@ class CheckVideoGenerationTasksCommand extends Command
                     ->first();
 
                 if (!$videoTask) {
-                    dLog('generate')->warning('分镜关联的视频任务不存在', [
+                    dLog('command')->warning('分镜关联的视频任务不存在', [
                         'segment_id' => $segmentId,
                         'video_task_id' => $videoTaskId
                     ]);
@@ -115,7 +115,7 @@ class CheckVideoGenerationTasksCommand extends Command
                     
                     $successCount++;
                     
-                    dLog('generate')->info('分镜视频生成成功', [
+                    dLog('command')->info('分镜视频生成成功', [
                         'segment_id' => $segmentId,
                         'video_task_id' => $videoTaskId,
                         'video_url' => $videoTask->result_url
@@ -126,12 +126,12 @@ class CheckVideoGenerationTasksCommand extends Command
                     
                     $failedCount++;
                     
-                    dLog('generate')->error('分镜视频生成失败', [
+                    dLog('command')->error('分镜视频生成失败', [
                         'segment_id' => $segmentId,
                         'video_task_id' => $videoTaskId,
                         'error' => $videoTask->error_message
                     ]);
-                    logDB('generate', 'error', '分镜视频生成失败', [
+                    logDB('command', 'error', '分镜视频生成失败', [
                         'segment_id' => $segmentId,
                         'video_task_id' => $videoTaskId,
                         'error' => $videoTask->error_message
@@ -149,7 +149,7 @@ class CheckVideoGenerationTasksCommand extends Command
                     ->update($updateData);
             }
 
-            dLog('generate')->info('分镜视频任务状态更新完成', [
+            dLog('command')->info('分镜视频任务状态更新完成', [
                 'total' => $segments->count(),
                 'success' => $successCount,
                 'failed' => $failedCount,
@@ -157,8 +157,8 @@ class CheckVideoGenerationTasksCommand extends Command
             ]);
 
         } catch (\Exception $e) {
-            dLog('generate')->error('更新分镜视频任务状态异常: ' . $e->getMessage());
-            logDB('generate', 'error', '更新分镜视频任务状态异常', [
+            dLog('command')->error('更新分镜视频任务状态异常: ' . $e->getMessage());
+            logDB('command', 'error', '更新分镜视频任务状态异常', [
                 'error' => $e->getMessage(),
                 'trace' => $e->getTraceAsString()
             ]);

+ 9 - 4
app/Console/Kernel.php

@@ -3,6 +3,7 @@
 namespace App\Console;
 
 use App\Console\Anime\AnimeCheckImgUrlCommand;
+use App\Console\Anime\SegmentCheckAudioCommand;
 use App\Console\Test\RegisterUserCommand;
 use Illuminate\Console\Scheduling\Schedule;
 use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
@@ -14,6 +15,7 @@ class Kernel extends ConsoleKernel
         RegisterUserCommand::class,
         AnimeCheckImgUrlCommand::class,
         Commands\ProcessImageGenerationQueueCommand::class,
+        SegmentCheckAudioCommand::class
     ];
 
 
@@ -25,16 +27,19 @@ class Kernel extends ConsoleKernel
      */
     protected function schedule(Schedule $schedule)
     {
-        // 每分钟检查一次图片生成任务状态
+        // 检查图片生成任务状态
         $schedule->command('AIGeneration:checkImgTasks')->everyMinute();
         
-        // 每分钟检查一次视频生成任务状态
+        // 检查视频生成任务状态
         $schedule->command('AIGeneration:checkVideoTasks')->everyMinute();
 
-        // 没分钟检查一次动漫对话图片生成状态
+        // 检查动漫对话图片生成状态
         $schedule->command('Anime:checkImgUrl')->everyMinute();
+
+        // 检查分镜音频生成状态
+        // $schedule->command('Segment:checkAudio')->everyMinute();
         
-        // 每30秒处理一次图片生成任务队列
+        // 处理图片生成任务队列
         $schedule->command('image-generation:process-queue')->everyMinute();
     }
 

+ 0 - 2
app/Services/AIGeneration/AIImageGenerationService.php

@@ -538,7 +538,6 @@ class AIImageGenerationService
     public function updatePendingTasks(): void
     {
         dLog('generate')->info('更新图片状态ing');
-        logDB('generate', 'info', '开始更新图片生成任务状态', []);
         
         // 1. 处理火山API的pending任务(批量提交到队列)
         $volcPendingTasks = MpGeneratePicTask::where('status', MpGeneratePicTask::STATUS_PENDING)
@@ -549,7 +548,6 @@ class AIImageGenerationService
 
         foreach ($volcPendingTasks as $task) {
             dLog('generate')->info('开始分发火山API任务到队列: ' . $task->task_id);
-            logDB('generate', 'info', '分发火山API任务到队列', ['task_id' => $task->task_id]);
             
             // 分发到队列
             \App\Jobs\ProcessVolcImageGenerationJob::dispatch($task->id)->onConnection('redis');

+ 28 - 2
app/Services/Anime/AnimeService.php

@@ -2977,6 +2977,8 @@ class AnimeService
     public function createSegmentVideoTask($data) {
         $segment_id = getProp($data, 'segment_id');
         $tail_frame = getProp($data, 'tail_frame');
+        $first_frame_url = getProp($data, 'first_frame_url');
+        $tail_frame_url = getProp($data, 'tail_frame_url');
         
         if (!$segment_id) {
             Utils::throwError('1002:分镜ID不能为空');
@@ -3047,11 +3049,16 @@ class AnimeService
         ];
         
         // 如果分镜有图片,作为首帧
-        $hasImage = !empty(getProp($segment, 'img_url'));
+        $hasImage = !empty(getProp($segment, 'img_url')) || $first_frame_url;
         $hasVideo = !empty(getProp($segment, 'video_url'));
         
         if ($hasImage) {
-            $videoParams['first_frame_url'] = getProp($segment, 'img_url');
+            if ($first_frame_url) {
+                $videoParams['first_frame_url'] = $first_frame_url;
+            }else {
+                $videoParams['first_frame_url'] = getProp($segment, 'img_url');
+            }
+            if ($tail_frame_url) $videoParams['tail_frame_url'] = $tail_frame_url;
         }
         
         // 构建content数组
@@ -3072,6 +3079,15 @@ class AnimeService
                     ],
                     'role' => 'reference_image',
                 ];
+                if (isset($videoParams['tail_frame_url'])) {
+                    $videoParams['content'][] = [
+                        'type' => 'image_url',
+                        'image_url' => [
+                            'url' => $videoParams['tail_frame_url'],
+                        ],
+                        'role' => 'reference_image',
+                    ];
+                }
             }else {
                 $videoParams['content'][] = [
                     'type' => 'image_url',
@@ -3080,6 +3096,16 @@ class AnimeService
                     ],
                     'role' => 'first_frame',
                 ];
+
+                if (isset($videoParams['tail_frame_url'])) {
+                    $videoParams['content'][] = [
+                        'type' => 'image_url',
+                        'image_url' => [
+                            'url' => $videoParams['tail_frame_url'],
+                        ],
+                        'role' => 'last_frame',
+                    ];
+                }
             }
         }