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

1.优化单一和批量生成视频的逻辑,只查询不更新防止重复2.对话历史新增参考图记录3.全能模式单一生成视频增加资产记录

lh 3 недель назад
Родитель
Сommit
e27f1519de

+ 7 - 2
app/Console/Commands/CheckVideoGenerationTasksCommand.php

@@ -217,6 +217,8 @@ class CheckVideoGenerationTasksCommand extends Command
         try {
             $segment_id = getProp($task, 'alias_segment_id');
             $act_id = getProp($task, 'alias_act_id');
+            $reference_images = getProp($task, 'ref_image_url');
+            if (!$reference_images) $reference_images = json_encode([], 256);
             
             if ($segment_id) {
                 // 分镜模式:使用segment_id查询
@@ -228,7 +230,7 @@ class CheckVideoGenerationTasksCommand extends Command
                 // 全能模式:使用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.act_content', 'a.id as act_id')
+                    ->select('b.user_id as uid', 'a.anime_id', 'a.episode_number', 'a.act_content', 'a.act_show_content', 'a.id as act_id')
                     ->first();
             } else {
                 dLog('generate')->warning('无法确定查询模式,任务缺少segment_id和act_id', ['segment_id_or_act_id' => $segmentIdOrActId]);
@@ -254,7 +256,8 @@ class CheckVideoGenerationTasksCommand extends Command
                 $recordField = 'act_id';
                 $recordValue = $segmentIdOrActId;
                 $userContent = '片段转视频';
-                $assistantContent = $segment->act_content ?: '';
+                $assistantContent = $segment->act_show_content ? $segment->act_show_content : $segment->act_content;
+                if (!$assistantContent) $assistantContent = '';
             }
             
             // 保存对话记录
@@ -267,6 +270,7 @@ class CheckVideoGenerationTasksCommand extends Command
                     'content'       => $userContent,
                     $recordField    => $recordValue,
                     'video_url'     => '',
+                    'reference_images' => json_encode([], 256),
                     'created_at'    => $now,
                     'updated_at'    => $now
                 ],
@@ -278,6 +282,7 @@ class CheckVideoGenerationTasksCommand extends Command
                     'content'       => $assistantContent,
                     $recordField    => $recordValue,
                     'video_url'     => $videoUrl,
+                    'reference_images' => $reference_images,
                     'created_at'    => $now,
                     'updated_at'    => $now
                 ]

+ 250 - 241
app/Http/Controllers/Anime/AnimeController.php

@@ -2390,144 +2390,148 @@ class AnimeController extends BaseController
                         break;
                     }
                     
-                    // 如果任务还在处理中,查询最新状态
-                    if ($task->status === 'processing') {
-                        // 根据任务类型查询不同的状态
-                        if ($task->api_type === 'jimeng') {
-                            $statusResult = $this->AIVideoGenerationService->queryJimengTaskStatus($task);
-                        } elseif ($task->api_type === 'keling') {
-                            $statusResult = $this->AIVideoGenerationService->queryKelingOmniTaskStatus($task);
-                        } elseif ($task->api_type === 'zzengine') {
-                            $statusResult = $this->AIVideoGenerationService->queryUnifiedApiTaskStatus($task);
-                        } else {
-                            $statusResult = $this->AIVideoGenerationService->querySeedanceTaskStatus($task);
-                        }
-                        if (isset($statusResult['status'])) {
-                            // 更新任务状态
-                            $task->update([
-                                'status' => $statusResult['status'],
-                                'result_url' => $statusResult['result_url'] ?? null,
-                                'compressed_url' => $statusResult['compressed_url'] ?? null,
-                                'last_frame_url' => $statusResult['last_frame_url'] ?? '',
-                                'error_message' => $statusResult['error_message'] ?? null,
-                                'completed_at' => in_array($statusResult['status'], [
-                                    'success',
-                                    'failed'
-                                ]) ? now() : null
-                            ]);
+                    // // 如果任务还在处理中,查询最新状态
+                    // if ($task->status === 'processing') {
+                    //     // 根据任务类型查询不同的状态
+                    //     if ($task->api_type === 'jimeng') {
+                    //         $statusResult = $this->AIVideoGenerationService->queryJimengTaskStatus($task);
+                    //     } elseif ($task->api_type === 'keling') {
+                    //         $statusResult = $this->AIVideoGenerationService->queryKelingOmniTaskStatus($task);
+                    //     } elseif ($task->api_type === 'zzengine') {
+                    //         $statusResult = $this->AIVideoGenerationService->queryUnifiedApiTaskStatus($task);
+                    //     } else {
+                    //         $statusResult = $this->AIVideoGenerationService->querySeedanceTaskStatus($task);
+                    //     }
+                    //     if (isset($statusResult['status'])) {
+                    //         // 更新任务状态
+                    //         $task->update([
+                    //             'status' => $statusResult['status'],
+                    //             'result_url' => $statusResult['result_url'] ?? null,
+                    //             'compressed_url' => $statusResult['compressed_url'] ?? null,
+                    //             'last_frame_url' => $statusResult['last_frame_url'] ?? '',
+                    //             'error_message' => $statusResult['error_message'] ?? null,
+                    //             'completed_at' => in_array($statusResult['status'], [
+                    //                 'success',
+                    //                 'failed'
+                    //             ]) ? now() : null
+                    //         ]);
                             
-                            // 如果任务成功,更新分镜表
-                            if ($statusResult['status'] === 'success' && isset($statusResult['result_url'])) {
-                                try {
-                                    DB::beginTransaction();
+                    //         // 如果任务成功,更新分镜表
+                    //         if ($statusResult['status'] === 'success' && isset($statusResult['result_url'])) {
+                    //             try {
+                    //                 DB::beginTransaction();
                                     
-                                    $now = date('Y-m-d H:i:s');
+                    //                 $now = date('Y-m-d H:i:s');
                                     
-                                    // 获取分镜ID
-                                    $act = DB::table('mp_episode_segments')
-                                        ->where('video_task_id', $taskId)
-                                        ->first();
+                    //                 // 获取分镜ID
+                    //                 $act = DB::table('mp_episode_segments')
+                    //                     ->where('video_task_id', $taskId)
+                    //                     ->first();
                                     
-                                    if (!$act) {
-                                        throw new \Exception('未找到对应的片段记录');
-                                    }
+                    //                 if (!$act) {
+                    //                     throw new \Exception('未找到对应的片段记录');
+                    //                 }
                                     
-                                    $act_id = $act->id;
-                                    $anime_id = $act->anime_id;
-                                    $episode_number = $act->episode_number;
-                                    $act_content = $act->act_content;
+                    //                 $act_id = $act->id;
+                    //                 $anime_id = $act->anime_id;
+                    //                 $episode_number = $act->episode_number;
+                    //                 $act_content = $act->act_content;
                                     
-                                    // 更新分镜表
-                                    $segmentUpdateData = [
-                                        'origin_video_url' => $statusResult['result_url'],
-                                        'video_task_status' => '已完成',
-                                        'last_frame_url' => $statusResult['last_frame_url'] ?? '',
-                                        'current_type' => 2,
-                                        'updated_at' => $now
-                                    ];
-                                    $compressed_video_url = compressVideo($statusResult['result_url']);
-                                    $segmentUpdateData['video_url'] = $compressed_video_url ?: $statusResult['result_url'];
+                    //                 // 更新分镜表
+                    //                 $segmentUpdateData = [
+                    //                     'origin_video_url' => $statusResult['result_url'],
+                    //                     'video_task_status' => '已完成',
+                    //                     'last_frame_url' => $statusResult['last_frame_url'] ?? '',
+                    //                     'current_type' => 2,
+                    //                     'updated_at' => $now
+                    //                 ];
+                    //                 $compressed_video_url = compressVideo($statusResult['result_url']);
+                    //                 $segmentUpdateData['video_url'] = $compressed_video_url ?: $statusResult['result_url'];
                                     
-                                    // 只有当video_duration存在且大于0时才更新
-                                    if (isset($statusResult['video_duration']) && $statusResult['video_duration'] > 0) {
-                                        $segmentUpdateData['video_duration'] = $statusResult['video_duration'];
-                                        $segmentUpdateData['video_time_point_start'] = 0;
-                                        $segmentUpdateData['video_time_point_end'] = $statusResult['video_duration'];
-                                    }
+                    //                 // 只有当video_duration存在且大于0时才更新
+                    //                 if (isset($statusResult['video_duration']) && $statusResult['video_duration'] > 0) {
+                    //                     $segmentUpdateData['video_duration'] = $statusResult['video_duration'];
+                    //                     $segmentUpdateData['video_time_point_start'] = 0;
+                    //                     $segmentUpdateData['video_time_point_end'] = $statusResult['video_duration'];
+                    //                 }
                                     
-                                    $updateResult = DB::table('mp_episode_segments')
-                                        ->where('id', $act_id)
-                                        ->update($segmentUpdateData);
+                    //                 $updateResult = DB::table('mp_episode_segments')
+                    //                     ->where('id', $act_id)
+                    //                     ->update($segmentUpdateData);
                                     
-                                    if (!$updateResult) {
-                                        Utils::throwError('20003:更新分镜表失败');
-                                    }
-
-                                    // 更新分镜视频成功后新增对话记录
-                                    // 保存对话记录
-                                    $records = [
-                                        [
-                                            'uid'           => $uid,
-                                            'anime_id'      => $anime_id,
-                                            'sequence'      => $episode_number,
-                                            'role'          => 'user',
-                                            'content'       => '片段转视频',
-                                            'act_id'        => $act_id,
-                                            'video_url'     => '',
-                                            'created_at'    => $now,
-                                            'updated_at'    => $now
-                                        ],
-                                        [
-                                            'uid'           => $uid,
-                                            'anime_id'      => $anime_id,
-                                            'sequence'      => $episode_number,
-                                            'role'          => 'assistant',
-                                            'content'       => $act_content,
-                                            'act_id'        => $act_id,
-                                            'video_url'     => $statusResult['result_url'],
-                                            'created_at'    => $now,
-                                            'updated_at'    => $now
-                                        ]
-                                    ];
-
-                                    DB::table('mp_anime_records')->insert($records);
+                    //                 if (!$updateResult) {
+                    //                     Utils::throwError('20003:更新分镜表失败');
+                    //                 }
+
+                    //                 // 更新分镜视频成功后新增对话记录
+                    //                 // 获取参考图记录
+                    //                 $reference_images = getProp($task, 'ref_image_url');
+                    //                 if (!$reference_images) $reference_images = json_encode([], 256);
+                    //                 // 保存对话记录
+                    //                 $records = [
+                    //                     [
+                    //                         'uid'           => $uid,
+                    //                         'anime_id'      => $anime_id,
+                    //                         'sequence'      => $episode_number,
+                    //                         'role'          => 'user',
+                    //                         'content'       => '片段转视频',
+                    //                         'act_id'        => $act_id,
+                    //                         'video_url'     => '',
+                    //                         'created_at'    => $now,
+                    //                         'updated_at'    => $now
+                    //                     ],
+                    //                     [
+                    //                         'uid'           => $uid,
+                    //                         'anime_id'      => $anime_id,
+                    //                         'sequence'      => $episode_number,
+                    //                         'role'          => 'assistant',
+                    //                         'content'       => $act_content,
+                    //                         'act_id'        => $act_id,
+                    //                         'video_url'     => $statusResult['result_url'],
+                    //                         'reference_images' => $reference_images,
+                    //                         'created_at'    => $now,
+                    //                         'updated_at'    => $now
+                    //                     ]
+                    //                 ];
+
+                    //                 DB::table('mp_anime_records')->insert($records);
                                     
-                                    DB::commit();
+                    //                 DB::commit();
                                     
-                                } catch (\Exception $e) {
-                                    DB::rollBack();
+                    //             } catch (\Exception $e) {
+                    //                 DB::rollBack();
                                     
-                                    $logData = [
-                                        'task_id' => $taskId,
-                                        'error' => $e->getMessage()
-                                    ];
-                                    dLog('anime')->error('视频任务处理失败', $logData);
-                                    logDB('anime', 'error', '视频任务处理失败', $logData);
-                                }
-                            } elseif ($statusResult['status'] === 'failed') {
-                                DB::table('mp_episode_segments')
-                                    ->where('video_task_id', $taskId)
-                                    ->update([
-                                        'video_task_status' => '失败',
-                                        'updated_at' => date('Y-m-d H:i:s')
-                                    ]);
-                            }
-                        }
-                    }
-                    
-                    // 发送当前状态
-                    echo "data: " . json_encode([
-                        'type' => 'update',
-                        'data' => [
-                            'task_id' => $task->id,
-                            'status' => $task->status,
-                            'result_url' => $task->result_url,
-                            'error_message' => $task->error_message,
-                            'elapsed_time' => time() - $startTime
-                        ]
-                    ]) . "\n\n";
-                    ob_flush();
-                    flush();
+                    //                 $logData = [
+                    //                     'task_id' => $taskId,
+                    //                     'error' => $e->getMessage()
+                    //                 ];
+                    //                 dLog('anime')->error('视频任务处理失败', $logData);
+                    //                 logDB('anime', 'error', '视频任务处理失败', $logData);
+                    //             }
+                    //         } elseif ($statusResult['status'] === 'failed') {
+                    //             DB::table('mp_episode_segments')
+                    //                 ->where('video_task_id', $taskId)
+                    //                 ->update([
+                    //                     'video_task_status' => '失败',
+                    //                     'updated_at' => date('Y-m-d H:i:s')
+                    //                 ]);
+                    //         }
+                    //     }
+                    // }
+                    // 
+                    // // 发送当前状态
+                    // echo "data: " . json_encode([
+                    //     'type' => 'update',
+                    //     'data' => [
+                    //         'task_id' => $task->id,
+                    //         'status' => $task->status,
+                    //         'result_url' => $task->result_url,
+                    //         'error_message' => $task->error_message,
+                    //         'elapsed_time' => time() - $startTime
+                    //     ]
+                    // ]) . "\n\n";
+                    // ob_flush();
+                    // flush();
                     
                     // 如果任务完成(成功或失败),结束连接
                     if (in_array($task->status, [
@@ -2867,6 +2871,7 @@ class AnimeController extends BaseController
                     }
 
                     if ($reference_images) {
+                        $unifiedParams['ref_image_url'] = json_encode($reference_images, 256);
                         $reference_images = $this->AIImageGenerationService->processReferenceImagesToAssets($reference_images, $unifiedParams['prompt']);
                         $parameters['reference_images'] = $reference_images;
                         $parameters['video_mode'] = 'multi_image';
@@ -3052,134 +3057,138 @@ class AnimeController extends BaseController
                             continue;
                         }
                         
-                        // 如果任务还在处理中,查询最新状态
-                        if ($task->status === 'processing') {
-                            // 根据任务类型查询不同的状态
-                            if ($task->api_type === 'jimeng') {
-                                $statusResult = $this->AIVideoGenerationService->queryJimengTaskStatus($task);
-                            } elseif ($task->api_type === 'keling') {
-                                $statusResult = $this->AIVideoGenerationService->queryKelingOmniTaskStatus($task);
-                            } elseif ($task->api_type === 'zzengine') {
-                                $statusResult = $this->AIVideoGenerationService->queryUnifiedApiTaskStatus($task);
-                            } else {
-                                $statusResult = $this->AIVideoGenerationService->querySeedanceTaskStatus($task);
-                            }
+                        // // 如果任务还在处理中,查询最新状态
+                        // if ($task->status === 'processing') {
+                        //     // 根据任务类型查询不同的状态
+                        //     if ($task->api_type === 'jimeng') {
+                        //         $statusResult = $this->AIVideoGenerationService->queryJimengTaskStatus($task);
+                        //     } elseif ($task->api_type === 'keling') {
+                        //         $statusResult = $this->AIVideoGenerationService->queryKelingOmniTaskStatus($task);
+                        //     } elseif ($task->api_type === 'zzengine') {
+                        //         $statusResult = $this->AIVideoGenerationService->queryUnifiedApiTaskStatus($task);
+                        //     } else {
+                        //         $statusResult = $this->AIVideoGenerationService->querySeedanceTaskStatus($task);
+                        //     }
                             
-                            if (isset($statusResult['status'])) {
-                                // 更新任务状态
-                                $task->update([
-                                    'status' => $statusResult['status'],
-                                    'result_json' => $statusResult['result_json'] ?? [],
-                                    'result_url' => $statusResult['result_url'] ?? null,
-                                    'last_frame_url' => $statusResult['last_frame_url'] ?? '',
-                                    'error_message' => $statusResult['error_message'] ?? null,
-                                    'completed_at' => in_array($statusResult['status'], [
-                                        'success',
-                                        'failed'
-                                    ]) ? now() : null
-                                ]);
+                        //     if (isset($statusResult['status'])) {
+                        //         // 更新任务状态
+                        //         $task->update([
+                        //             'status' => $statusResult['status'],
+                        //             'result_json' => $statusResult['result_json'] ?? [],
+                        //             'result_url' => $statusResult['result_url'] ?? null,
+                        //             'last_frame_url' => $statusResult['last_frame_url'] ?? '',
+                        //             'error_message' => $statusResult['error_message'] ?? null,
+                        //             'completed_at' => in_array($statusResult['status'], [
+                        //                 'success',
+                        //                 'failed'
+                        //             ]) ? now() : null
+                        //         ]);
                                 
-                                // 如果任务成功,更新分镜表
-                                if ($statusResult['status'] === 'success' && isset($statusResult['result_url'])) {
-                                    try {
-                                        DB::beginTransaction();
+                        //         // 如果任务成功,更新分镜表
+                        //         if ($statusResult['status'] === 'success' && isset($statusResult['result_url'])) {
+                        //             try {
+                        //                 DB::beginTransaction();
                                         
-                                        $now = date('Y-m-d H:i:s');
+                        //                 $now = date('Y-m-d H:i:s');
                                         
-                                        // 获取分镜ID
-                                        $actId = null;
-                                        foreach ($actTasks as $actTask) {
-                                            if ($actTask['task_id'] == $taskId) {
-                                                $actId = $actTask['act_id'];
-                                                $content = $actTask['content'];
-                                                $audio_duration = $actTask['audio_duration'];
-                                                break;
-                                            }
-                                        }
+                        //                 // 获取分镜ID
+                        //                 $actId = null;
+                        //                 foreach ($actTasks as $actTask) {
+                        //                     if ($actTask['task_id'] == $taskId) {
+                        //                         $actId = $actTask['act_id'];
+                        //                         $content = $actTask['content'];
+                        //                         $audio_duration = $actTask['audio_duration'];
+                        //                         break;
+                        //                     }
+                        //                 }
                                         
-                                        if ($actId) {
-                                            // 更新分镜表
-                                            $actUpdateData = [
-                                                'origin_video_url' => $statusResult['result_url'],
-                                                'video_task_status' => '已完成',
-                                                'last_frame_url' => $statusResult['last_frame_url'] ?? '',
-                                                'current_type' => 2,
-                                                'updated_at' => $now
-                                            ];
-                                            $compressed_video_url = compressVideo($statusResult['result_url']);
-                                            $actUpdateData['video_url'] = $compressed_video_url ?: $statusResult['result_url'];
+                        //                 if ($actId) {
+                        //                     // 更新分镜表
+                        //                     $actUpdateData = [
+                        //                         'origin_video_url' => $statusResult['result_url'],
+                        //                         'video_task_status' => '已完成',
+                        //                         'last_frame_url' => $statusResult['last_frame_url'] ?? '',
+                        //                         'current_type' => 2,
+                        //                         'updated_at' => $now
+                        //                     ];
+                        //                     $compressed_video_url = compressVideo($statusResult['result_url']);
+                        //                     $actUpdateData['video_url'] = $compressed_video_url ?: $statusResult['result_url'];
                                             
-                                            // 只有当video_duration存在且大于0时才更新
-                                            if (isset($statusResult['video_duration']) && $statusResult['video_duration'] > 0) {
-                                                $actUpdateData['video_duration'] = $statusResult['video_duration'];
-                                                $actUpdateData['video_time_point_start'] = 0;
-                                                $actUpdateData['video_time_point_end'] = $statusResult['video_duration'];
-                                            }
+                        //                     // 只有当video_duration存在且大于0时才更新
+                        //                     if (isset($statusResult['video_duration']) && $statusResult['video_duration'] > 0) {
+                        //                         $actUpdateData['video_duration'] = $statusResult['video_duration'];
+                        //                         $actUpdateData['video_time_point_start'] = 0;
+                        //                         $actUpdateData['video_time_point_end'] = $statusResult['video_duration'];
+                        //                     }
                                             
-                                            $updateResult = DB::table('mp_episode_segments')
-                                                ->where('id', $actId)
-                                                ->update($actUpdateData);
+                        //                     $updateResult = DB::table('mp_episode_segments')
+                        //                         ->where('id', $actId)
+                        //                         ->update($actUpdateData);
                                             
-                                            if ($updateResult) {
-                                                // 更新分镜视频成功后新增对话记录
-                                                $records = [
-                                                    [
-                                                        'uid'           => $uid,
-                                                        'anime_id'      => $animeId,
-                                                        'sequence'      => $episodeNumber,
-                                                        'role'          => 'user',
-                                                        'content'       => '片段转视频',
-                                                        'act_id'        => $actId,
-                                                        'video_url'     => '',
-                                                        'created_at'    => $now,
-                                                        'updated_at'    => $now
-                                                    ],
-                                                    [
-                                                        'uid'           => $uid,
-                                                        'anime_id'      => $animeId,
-                                                        'sequence'      => $episodeNumber,
-                                                        'role'          => 'assistant',
-                                                        'content'       => $content ?? '',
-                                                        'act_id'        => $actId,
-                                                        'video_url'     => $statusResult['result_url'],
-                                                        'created_at'    => $now,
-                                                        'updated_at'    => $now
-                                                    ]
-                                                ];
+                        //                     if ($updateResult) {
+                        //                         // 更新分镜视频成功后新增对话记录
+                        //                         // 获取参考图记录
+                        //                         $reference_images = getProp($task, 'ref_image_url');
+                        //                         if (!$reference_images) $reference_images = json_encode([], 256);
+                        //                         $records = [
+                        //                             [
+                        //                                 'uid'           => $uid,
+                        //                                 'anime_id'      => $animeId,
+                        //                                 'sequence'      => $episodeNumber,
+                        //                                 'role'          => 'user',
+                        //                                 'content'       => '片段转视频',
+                        //                                 'act_id'        => $actId,
+                        //                                 'video_url'     => '',
+                        //                                 'created_at'    => $now,
+                        //                                 'updated_at'    => $now
+                        //                             ],
+                        //                             [
+                        //                                 'uid'           => $uid,
+                        //                                 'anime_id'      => $animeId,
+                        //                                 'sequence'      => $episodeNumber,
+                        //                                 'role'          => 'assistant',
+                        //                                 'content'       => $content ?? '',
+                        //                                 'act_id'        => $actId,
+                        //                                 'video_url'     => $statusResult['result_url'],
+                        //                                 'reference_images' => $reference_images,
+                        //                                 'created_at'    => $now,
+                        //                                 'updated_at'    => $now
+                        //                             ]
+                        //                         ];
                                                 
-                                                DB::table('mp_anime_records')->insert($records);
-                                            }
-                                        }
+                        //                         DB::table('mp_anime_records')->insert($records);
+                        //                     }
+                        //                 }
                                         
-                                        DB::commit();
+                        //                 DB::commit();
                                         
-                                    } catch (\Exception $e) {
-                                        DB::rollBack();
+                        //             } catch (\Exception $e) {
+                        //                 DB::rollBack();
                                         
-                                        $logData = [
-                                            'task_id' => $taskId,
-                                            'error' => $e->getMessage()
-                                        ];
-                                        dLog('anime')->error('视频任务处理失败', $logData);
-                                        logDB('anime', 'error', '视频任务处理失败', $logData);
-                                    }
+                        //                 $logData = [
+                        //                     'task_id' => $taskId,
+                        //                     'error' => $e->getMessage()
+                        //                 ];
+                        //                 dLog('anime')->error('视频任务处理失败', $logData);
+                        //                 logDB('anime', 'error', '视频任务处理失败', $logData);
+                        //             }
                                     
-                                } elseif ($statusResult['status'] === 'failed') {
-                                    // 获取分镜ID并更新失败状态
-                                    foreach ($actTasks as $actTask) {
-                                        if ($actTask['task_id'] == $taskId) {
-                                            DB::table('mp_episode_segments')
-                                                ->where('id', $actTask['act_id'])
-                                                ->update([
-                                                    'video_task_status' => '失败',
-                                                    'updated_at' => date('Y-m-d H:i:s')
-                                                ]);
-                                            break;
-                                        }
-                                    }
-                                }
-                            }
-                        }
+                        //         } elseif ($statusResult['status'] === 'failed') {
+                        //             // 获取分镜ID并更新失败状态
+                        //             foreach ($actTasks as $actTask) {
+                        //                 if ($actTask['task_id'] == $taskId) {
+                        //                     DB::table('mp_episode_segments')
+                        //                         ->where('id', $actTask['act_id'])
+                        //                         ->update([
+                        //                             'video_task_status' => '失败',
+                        //                             'updated_at' => date('Y-m-d H:i:s')
+                        //                         ]);
+                        //                     break;
+                        //                 }
+                        //             }
+                        //         }
+                        //     }
+                        // }
                         
                         // 检查任务是否完成(成功或失败)
                         if (in_array($task->status, ['success', 'failed'])) {

+ 2 - 0
app/Libs/Helpers.php

@@ -991,6 +991,8 @@ function filterIntro($content)
  */
 function compressVideo($videoUrl, $prefix = 'videos')
 {
+    if (env('APP_ENV') == 'local') return $videoUrl;
+
     try {
         // 创建临时目录
         $tempDir = storage_path('app/temp/videos');

+ 1 - 0
app/Models/MpGenerateVideoTask.php

@@ -19,6 +19,7 @@ class MpGenerateVideoTask extends Model
         'prompt',
         'first_frame_url',
         'tail_frame_url',
+        'ref_image_url',
         'seed',
         'frames',
         'status',

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

@@ -2112,6 +2112,8 @@ class AIVideoGenerationService
         try {
             $segment_id = getProp($task, 'alias_segment_id');
             $act_id = getProp($task, 'alias_act_id');
+            $reference_images = getProp($task, 'ref_image_url');
+            if (!$reference_images) $reference_images = json_encode([], 256);
             
             if ($segment_id) {
                 // 分镜模式:使用segment_id查询
@@ -2123,7 +2125,7 @@ class AIVideoGenerationService
                 // 全能模式:使用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.act_content', 'a.id as act_id')
+                    ->select('b.user_id as uid', 'a.anime_id', 'a.episode_number', 'a.act_content', 'a.act_show_content', 'a.id as act_id')
                     ->first();
             } else {
                 dLog('generate')->warning('无法确定查询模式,任务缺少segment_id和act_id', ['segment_id_or_act_id' => $segmentIdOrActId]);
@@ -2149,7 +2151,8 @@ class AIVideoGenerationService
                 $recordField = 'act_id';
                 $recordValue = $segmentIdOrActId;
                 $userContent = '片段转视频';
-                $assistantContent = $segment->act_content ?: '';
+                $assistantContent = $segment->act_show_content ? $segment->act_show_content : $segment->act_content;
+                if (!$assistantContent) $assistantContent = '';
             }
             
             // 保存对话记录
@@ -2162,6 +2165,7 @@ class AIVideoGenerationService
                     'content'       => $userContent,
                     $recordField    => $recordValue,
                     'video_url'     => '',
+                    'reference_images' => json_encode([], 256),
                     'created_at'    => $now,
                     'updated_at'    => $now
                 ],
@@ -2173,6 +2177,7 @@ class AIVideoGenerationService
                     'content'       => $assistantContent,
                     $recordField    => $recordValue,
                     'video_url'     => $videoUrl,
+                    'reference_images' => $reference_images,
                     'created_at'    => $now,
                     'updated_at'    => $now
                 ]
@@ -2215,6 +2220,7 @@ class AIVideoGenerationService
             'prompt' => $params['prompt'] ?? '',
             'first_frame_url' => $params['first_frame_url'] ?? '',
             'tail_frame_url' => $params['last_frame_url'] ?? '',
+            'ref_image_url' => $params['ref_image_url'] ?? json_encode([], 256),
             'seed' => $params['seed'] ?? -1,
             'frames' => $params['video_duration'] ? ($params['video_duration'] * 24 + 1) : null,
             'video_resolution' => $params['video_resolution'] ?? '720p',

+ 55 - 5
app/Services/Anime/AnimeService.php

@@ -4082,7 +4082,7 @@ class AnimeService
         $tail_frame_url = getProp($data, 'tail_frame_url');
         $generate_audio = getProp($data, 'generate_audio', 1);
         $products = getProp($data, 'products', []);
-        $reference_images = getProp($data, 'reference_images', []);
+        $reference_images = array_unique(getProp($data, 'reference_images', []));
         if (!is_array($reference_images) || !is_array($products)) {
             Utils::throwError('20003:传入的参考图或资产格式不正确');
         }
@@ -4100,8 +4100,58 @@ class AnimeService
         $act = (array)$act;
 
         $episode_id = getProp($act, 'episode_id');
-        $ratio = DB::table('mp_anime_episodes')->where('id', $episode_id)->value('ratio');
-        if (!$ratio) $ratio = '9:16';
+        $episode = DB::table('mp_anime_episodes')->where('id', $episode_id)->first();
+        $ratio = '9:16';
+        if (!$episode) $ratio = getProp($episode, 'ratio', '9:16');
+
+        // 将资产中新出现的资产放到extra_products中
+        // 满足以下要求: 遍历传入的$products,将product_name与$episode中的roles和scenes做比对,如果不在其中,则与$episode中的extra_products做比对,如果有同名的则覆盖,没有则新增后存入$episode中的extra_products字段中
+        if (!empty($products) && $episode) {
+            // 获取剧集中的角色和场景列表
+            $roles = json_decode(getProp($episode, 'roles', '[]'), true) ?: [];
+            $scenes = json_decode(getProp($episode, 'scenes', '[]'), true) ?: [];
+            $extra_products = json_decode(getProp($episode, 'extra_products', '[]'), true) ?: [];
+            
+            // 构建角色名称列表
+            $role_names = array_column($roles, 'role');
+            // 构建场景名称列表
+            $scene_names = array_column($scenes, 'scene');
+            
+            // 遍历传入的products
+            foreach ($products as $product) {
+                $product_name = getProp($product, 'product_name');
+                
+                // 如果product_name不在roles和scenes中
+                if (!in_array($product_name, $role_names) && !in_array($product_name, $scene_names)) {
+                    // 查找是否在extra_products中存在同名的
+                    $found = false;
+                    foreach ($extra_products as $key => $extra_product) {
+                        if (getProp($extra_product, 'product_name') === $product_name) {
+                            // 有同名的则覆盖
+                            $extra_products[$key] = $product;
+                            $found = true;
+                            break;
+                        }
+                    }
+                    
+                    // 没有则新增
+                    if (!$found) {
+                        $extra_products[] = $product;
+                    }
+                }
+            }
+            
+            if ($extra_products) {
+                // 保存到数据库
+                DB::table('mp_anime_episodes')
+                    ->where('id', $episode_id)
+                    ->update([
+                        'extra_products' => json_encode($extra_products, 256),
+                        'updated_at' => date('Y-m-d H:i:s')
+                    ]);
+            }
+            
+        }
         
         // 获取分镜内容
         $actContent = getProp($act, 'act_show_content', '');
@@ -4119,8 +4169,6 @@ class AnimeService
         // 处理视频模型
         $model = getProp($data, 'model');
         if (!$model) {
-            // 用户没有输入,从episode表获取
-            $episode = DB::table('mp_anime_episodes')->where('id', $episode_id)->first();
             $model = getProp($episode, 'video_model');
             if (!$model) {
                 // episode表也没有,使用默认值
@@ -4266,6 +4314,8 @@ class AnimeService
             }
 
             if ($reference_images) {
+                // 在处理之前先保存原始reference_images到任务参数中
+                $unifiedParams['ref_image_url'] = json_encode($reference_images, 256);
                 $reference_images = $this->aiImageGenerationService->processReferenceImagesToAssets($reference_images, $unifiedParams['prompt']);
                 $parameters['reference_images'] = $reference_images;
                 $parameters['video_mode'] = 'multi_image';