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

新增裁剪视频、修改剧本名和删除剧本的接口

lh 2 месяцев назад
Родитель
Сommit
be584e174d

+ 206 - 0
app/Console/Anime/SegmentCheckAudioCommand.php

@@ -0,0 +1,206 @@
+<?php
+
+namespace App\Console\Anime;
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\DB;
+use GuzzleHttp\Client;
+
+class SegmentCheckAudioCommand extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'Segment:checkAudio';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '检查分镜音频信息';
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        dLog('generate')->info('====================开始检查分镜音频信息====================');
+        $time_start = microtime(true);
+        $timeout = 50; // 超时时间50秒
+        $check_interval = 3; // 每3秒检查一次
+        
+        while (true) {
+            // 检查是否超时
+            $elapsed_time = microtime(true) - $time_start;
+            if ($elapsed_time >= $timeout) {
+                dLog('generate')->info('检查超时,退出循环');
+                break;
+            }
+
+            // 1. 查询mp_dub_video_tasks表中1分钟之前创建的generate_status=执行中的任务,并重新调用API
+            $oneMinuteAgo = date('Y-m-d H:i:s', strtotime('-1 minute'));
+            $pendingTasks = DB::table('mp_dub_video_tasks')
+                ->where('generate_status', '执行中')
+                ->where('created_at', '<=', $oneMinuteAgo)
+                ->limit(10) // 每次处理10个任务
+                ->get();
+            
+            if ($pendingTasks->isNotEmpty()) {
+                dLog('generate')->info('找到待重试的音频任务', ['count' => $pendingTasks->count()]);
+                
+                foreach ($pendingTasks as $task) {
+                    sleep(1);
+                    try {
+                        $dubTaskId = $task->id;
+                        
+                        // 请求远程服务器执行生成
+                        $client = new Client(['timeout' => 300, 'verify' => false]);
+                        $result = $client->get("http://122.9.129.83:5000/api/anime/genAudio?taskId={$dubTaskId}");
+                        $response = $result->getBody()->getContents();
+                        $response_arr = json_decode($response, true);
+                        
+                        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]);
+                            
+                            // 标记任务为失败
+                            DB::table('mp_dub_video_tasks')
+                                ->where('id', $dubTaskId)
+                                ->update([
+                                    'generate_status' => '失败',
+                                    'updated_at' => date('Y-m-d H:i:s')
+                                ]);
+                        } else {
+                            dLog('generate')->info('音频任务重试成功', ['task_id' => $dubTaskId]);
+                        }
+                    } catch (\Exception $e) {
+                        dLog('anime')->error('重试音频任务异常', [
+                            'task_id' => $task->id,
+                            'error' => $e->getMessage()
+                        ]);
+                    }
+                }
+            }
+
+            // 2. 查询mp_episode_segments表中img_url不为空但audio_url为空的分镜
+            $segmentsNeedAudio = DB::table('mp_episode_segments')
+                ->whereNotNull('img_url')
+                ->where('img_url', '!=', '')
+                ->where(function($query) {
+                    $query->whereNull('audio_url')
+                          ->orWhere('audio_url', '');
+                })
+                ->limit(10) // 每次处理10个分镜
+                ->get();
+            
+            if ($segmentsNeedAudio->isNotEmpty()) {
+                dLog('generate')->info('找到需要生成音频的分镜', ['count' => $segmentsNeedAudio->count()]);
+                
+                foreach ($segmentsNeedAudio as $segment) {
+                    sleep(1);
+                    try {
+                        $segment_id = $segment->segment_id;
+                        $dialogue = getProp($segment, 'dialogue');
+                        $now = date('Y-m-d H:i:s');
+                        
+                        // 如果有对话内容,创建视频配音合成任务
+                        if (!empty($dialogue)) {
+                            $generate_json = [
+                                'text' => $dialogue,
+                                'role' => getProp($segment, 'voice_actor'),
+                                'voice_type' => getProp($segment, 'voice_type'),
+                                'voice_name' => getProp($segment, 'voice_name'),
+                                'emotion' => getProp($segment, 'emotion'),
+                                'emotion_type' => getProp($segment, 'emotion_type'),
+                                'gender' => getProp($segment, 'gender'),
+                                'speed_ratio' => getProp($segment, 'speed_ratio', 0),
+                                'loudness_ratio' => getProp($segment, 'loudness_ratio', 0),
+                                'emotion_scale' => getProp($segment, 'emotion_scale', 0),
+                                'pitch' => getProp($segment, 'pitch', 0),
+                            ];
+                            
+                            // 插入视频配音合成任务
+                            $dubTaskId = DB::table('mp_dub_video_tasks')->insertGetId([
+                                'alias_segment_id' => $segment_id,
+                                'generate_status' => '执行中',
+                                'audio_url' => '',
+                                'generate_json' => json_encode($generate_json, 256),
+                                'created_at' => $now,
+                                'updated_at' => $now,
+                            ]);
+                            
+                            if (!$dubTaskId) {
+                                dLog('anime')->error('创建配音任务失败', ['segment_id' => $segment_id]);
+                                continue;
+                            }
+                            
+                            // 请求远程服务器执行生成
+                            $client = new Client(['timeout' => 300, 'verify' => false]);
+                            $result = $client->get("http://122.9.129.83:5000/api/anime/genAudio?taskId={$dubTaskId}");
+                            $response = $result->getBody()->getContents();
+                            $response_arr = json_decode($response, true);
+                            
+                            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]);
+                            } else {
+                                dLog('generate')->info('音频任务创建成功', ['task_id' => $dubTaskId, 'segment_id' => $segment_id]);
+                                
+                                // 更新分镜表,标记音频正在生成
+                                DB::table('mp_episode_segments')
+                                    ->where('segment_id', $segment_id)
+                                    ->update([
+                                        'audio_url' => '',
+                                        'updated_at' => $now
+                                    ]);
+                            }
+                        } else {
+                            // dialogue为空时,直接写入默认音频信息
+                            DB::table('mp_episode_segments')
+                                ->where('segment_id', $segment_id)
+                                ->update([
+                                    'audio_url' => 'https://zw-audiobook.tos-cn-beijing.volces.com/effects/ellipses_2s.mp3',
+                                    'audio_duration' => 2.0,
+                                    'subtitle_info' => json_encode(['duration' => 2.0, 'words' => []], 256),
+                                    'updated_at' => $now
+                                ]);
+                            
+                            dLog('generate')->info('分镜无对话,写入默认音频', ['segment_id' => $segment_id]);
+                        }
+                    } catch (\Exception $e) {
+                        dLog('anime')->error('处理分镜音频异常', [
+                            'segment_id' => $segment->segment_id,
+                            'error' => $e->getMessage()
+                        ]);
+                    }
+                }
+            }
+
+            // 如果没有待处理的任务,退出循环
+            if ($pendingTasks->isEmpty() && $segmentsNeedAudio->isEmpty()) {
+                dLog('generate')->info('没有待处理的音频任务,退出循环');
+                break;
+            }
+
+            // 等待3秒后继续下一次检查
+            sleep($check_interval);
+        }
+
+        $time_end = microtime(true);
+        $execution_time = round($time_end - $time_start, 2);
+        dLog('generate')->info('脚本执行时间: '.round($time_end-$time_start, 2).'秒');
+        dLog('generate')->info('====================结束检查分镜音频信息====================');
+    }
+    
+}

+ 21 - 7
app/Http/Controllers/Anime/AnimeController.php

@@ -158,12 +158,26 @@ class AnimeController extends BaseController
         return $this->success($result);
     }
 
+    // 新建动漫
     public function createAnime(Request $request) {
         $data = $request->all();
         $result = $this->AnimeService->createAnime($data);
         return $this->success(['anime_id' => $result]);
     }
 
+    // 编辑动漫
+    public function editAnime(Request $request) {
+        $data = $request->all();
+        $result = $this->AnimeService->editAnime($data);
+        return $this->success(['success'=>$result ? 1 : 0]);
+    }
+
+    // 删除动漫
+    public function delAnime(Request $request) {
+        $data = $request->all();
+        $result = $this->AnimeService->delAnime($data);
+        return $this->success(['success'=>$result ? 1 : 0]);
+    }
 
     // 批量生成主体图片
     public function batchSetRoleImg(Request $request) {
@@ -187,13 +201,6 @@ class AnimeController extends BaseController
         return $this->success($result);
     }
 
-    // 编辑动漫
-    public function editAnime(Request $request) {
-        $data = $request->all();
-        $result = $this->AnimeService->editAnime($data);
-        return $this->success(['success'=>$result ? 1 : 0]);
-    }
-
     // 修改分集主体列表
     public function changeEpisodeRoles(Request $request) {
         $data = $request->all();
@@ -1138,6 +1145,13 @@ class AnimeController extends BaseController
         ]);
     }
 
+    public function clipSegmentVideo(Request $request) {
+        $data = $request->all();
+
+        $result = $this->AnimeService->clipSegmentVideo($data);
+        return $this->success(['success'=>$result ? 1: 0]);
+    }
+
     /**
      * 创建完整视频合成任务
      * 

+ 133 - 81
app/Services/Anime/AnimeService.php

@@ -94,6 +94,8 @@ class AnimeService
                 'audio_duration' => getProp($segment, 'audio_duration', 0),
                 'video_url' => getProp($segment, 'video_url'),
                 'video_duration' => getProp($segment, 'video_duration', 0),
+                'video_time_point_start' => getProp($segment, 'video_time_point_start', 0),
+                'video_time_point_end' => getProp($segment, 'video_time_point_end', getProp($segment, 'video_duration', 0)),
                 'last_frame_url' => getProp($segment, 'last_frame_url'),
                 'current_type' => getProp($segment, 'current_type'),
             ];
@@ -332,84 +334,114 @@ class AnimeService
     }
 
     public function editAnime($data) {
-        $script_arr =getProp($data, 'script', []);
-        if (!$script_arr) Utils::throwError('20003:剧本内容不能为空');
-        $start_episode_sequence = getProp($data, 'start_episode_sequence', 1);
         $anime_id = getProp($data, 'anime_id');
-        try {   
-            DB::beginTransaction();
-            $table_data = [
-                'intro' => isset($script_arr['intro']) ? $script_arr['intro'] : '',
-                'highlights' => isset($script_arr['highlights']) ? $script_arr['highlights'] : '',
-                'role_relationship' => isset($script_arr['role_relationship']) ? $script_arr['role_relationship'] : '',
-                'core_contradiction' => isset($script_arr['core_contradiction']) ? $script_arr['core_contradiction'] : '',
-                'roles' => isset($script_arr['roles']) ? json_encode($script_arr['roles'], 256) : '',
-                'art_style' => isset($script_arr['art_style']) ? $script_arr['art_style'] : '',
-                'scenes' => isset($script_arr['scenes']) ? json_encode($script_arr['scenes'], 256) : '',
-                'status' => 3,
-                'start_episode_sequence' => $start_episode_sequence,
-                'end_episode_sequence' => $start_episode_sequence + count($script_arr['episodes']) - 1,
-                'episode_num' => count($script_arr['episodes']),
-                'updated_at' => date('Y-m-d H:i:s')
-            ];
+        $anime_name = trim(getProp($data, 'anime_name'));
 
-            // 保存剧本内容
-            if (!empty($anime_id)) {
-                $boolen = DB::table('mp_animes')->where('id', $anime_id)->update($table_data);
-                if (!$boolen) {
-                    dLog('anime')->info('对话保存失败', $table_data);
-                    Utils::throwError('20003:对话保存失败');
-                }
-            }else {
-                $table['created_at'] = $table_data['updated_at'];
-                $anime_id = DB::table('mp_animes')->insertGetId($table_data);
-                if (!$anime_id) {
-                    dLog('anime')->info('对话保存失败', $table_data);
-                    Utils::throwError('20003:对话保存失败');
-                }
-            }
-            
-            
-            // 保存分集内容
-            // 删除历史分集内容
-            $boolen1 = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->delete();
-            
-            $episodes  = [];
-            $sequence = 1;
-            foreach ($script_arr['episodes'] as $episode) {
-                $segment_number = 1;
-                foreach($episode['segments'] as $segment) {
-                    $episodes[] = [
-                        'anime_id' => $anime_id,
-                        'episode_number' => $episode['episode_number'],
-                        'title' => $episode['title'],
-                        // 'content' => $episode['content'],
-                        'content' => '',
-                        'segment_number' => $segment_number,
-                        'segment_content' => $segment['segment_content'],
-                        'sequence' => $sequence,
-                        'created_at' => date('Y-m-d H:i:s'),
-                        'updated_at' => date('Y-m-d H:i:s')
-                    ];
-                    $sequence++;
-                    $segment_number++;
-                }
+        // 确认对话名称唯一性
+        if ($id = DB::table('mp_animes')->where('anime_name', $anime_name)->value('id')) {
+            if ($id != $anime_id) $anime_name = $anime_name . '_' . date('YmdHis');
+        }
+
+        if (!$anime_id || !$anime_name) {
+            Utils::throwError('20003:参数异常');
+        }
+
+        return DB::table('mp_animes')->where('id', $anime_id)->update([
+            'anime_name'    => $anime_name,
+            'updated_at'    => date('Y-m-d H:i:s')
+        ]);
+
+        // $script_arr =getProp($data, 'script', []);
+        // if (!$script_arr) Utils::throwError('20003:剧本内容不能为空');
+        // $start_episode_sequence = getProp($data, 'start_episode_sequence', 1);
+        // $anime_id = getProp($data, 'anime_id');
+        // try {   
+        //     DB::beginTransaction();
+        //     $table_data = [
+        //         'intro' => isset($script_arr['intro']) ? $script_arr['intro'] : '',
+        //         'highlights' => isset($script_arr['highlights']) ? $script_arr['highlights'] : '',
+        //         'role_relationship' => isset($script_arr['role_relationship']) ? $script_arr['role_relationship'] : '',
+        //         'core_contradiction' => isset($script_arr['core_contradiction']) ? $script_arr['core_contradiction'] : '',
+        //         'roles' => isset($script_arr['roles']) ? json_encode($script_arr['roles'], 256) : '',
+        //         'art_style' => isset($script_arr['art_style']) ? $script_arr['art_style'] : '',
+        //         'scenes' => isset($script_arr['scenes']) ? json_encode($script_arr['scenes'], 256) : '',
+        //         'status' => 3,
+        //         'start_episode_sequence' => $start_episode_sequence,
+        //         'end_episode_sequence' => $start_episode_sequence + count($script_arr['episodes']) - 1,
+        //         'episode_num' => count($script_arr['episodes']),
+        //         'updated_at' => date('Y-m-d H:i:s')
+        //     ];
+
+        //     // 保存剧本内容
+        //     if (!empty($anime_id)) {
+        //         $boolen = DB::table('mp_animes')->where('id', $anime_id)->update($table_data);
+        //         if (!$boolen) {
+        //             dLog('anime')->info('对话保存失败', $table_data);
+        //             Utils::throwError('20003:对话保存失败');
+        //         }
+        //     }else {
+        //         $table['created_at'] = $table_data['updated_at'];
+        //         $anime_id = DB::table('mp_animes')->insertGetId($table_data);
+        //         if (!$anime_id) {
+        //             dLog('anime')->info('对话保存失败', $table_data);
+        //             Utils::throwError('20003:对话保存失败');
+        //         }
+        //     }
+            
+            
+        //     // 保存分集内容
+        //     // 删除历史分集内容
+        //     $boolen1 = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->delete();
+            
+        //     $episodes  = [];
+        //     $sequence = 1;
+        //     foreach ($script_arr['episodes'] as $episode) {
+        //         $segment_number = 1;
+        //         foreach($episode['segments'] as $segment) {
+        //             $episodes[] = [
+        //                 'anime_id' => $anime_id,
+        //                 'episode_number' => $episode['episode_number'],
+        //                 'title' => $episode['title'],
+        //                 // 'content' => $episode['content'],
+        //                 'content' => '',
+        //                 'segment_number' => $segment_number,
+        //                 'segment_content' => $segment['segment_content'],
+        //                 'sequence' => $sequence,
+        //                 'created_at' => date('Y-m-d H:i:s'),
+        //                 'updated_at' => date('Y-m-d H:i:s')
+        //             ];
+        //             $sequence++;
+        //             $segment_number++;
+        //         }
                 
-            }
+        //     }
+
+        //     $boolen2 = DB::table('mp_anime_episodes')->insert($episodes);
+        //     if (!$boolen2) {
+        //         dLog('deepseek')->info('分集内容保存失败', $episodes);
+        //         logDB('deepseek', 'error', '分集内容保存失败', ['episodes_count' => count($episodes)]);
+        //         Utils::throwError('20003:分集内容保存失败');
+        //     }
+
+        // } catch (\Exception $e) {
+        //     DB::rollBack();
+        //     Utils::throwError('20003:'.$e->getMessage());
+        // }
+        // DB::commit();
+        // return true;
+    }
 
-            $boolen2 = DB::table('mp_anime_episodes')->insert($episodes);
-            if (!$boolen2) {
-                dLog('deepseek')->info('分集内容保存失败', $episodes);
-                logDB('deepseek', 'error', '分集内容保存失败', ['episodes_count' => count($episodes)]);
-                Utils::throwError('20003:分集内容保存失败');
-            }
+    public function delAnime($data) {
+        $anime_id = getProp($data, 'anime_id');
 
-        } catch (\Exception $e) {
-            DB::rollBack();
-            Utils::throwError('20003:'.$e->getMessage());
+        if (!$anime_id) {
+            Utils::throwError('20003:请选择剧本');
         }
-        DB::commit();
-        return true;
+
+        return DB::table('mp_animes')->where('id', $anime_id)->update([
+            'is_deleted'    => 1,
+            'updated_at'    => date('Y-m-d H:i:s')
+        ]);
     }
 
     public function animeDetail($data) {
@@ -1228,6 +1260,7 @@ class AnimeService
                 // 如果有对话内容,创建视频配音合成任务
                 $dialogue = getProp($segment, 'dialogue');
                 if (!empty($dialogue)) {
+                    sleep(1);
                     $now = date('Y-m-d H:i:s');
                     $generate_json = [
                         'text' => $dialogue,
@@ -2202,8 +2235,6 @@ class AnimeService
 
         try {
             DB::beginTransaction();
-
-            $now = date('Y-m-d H:i:s');
             
             // 收集需要创建音频合成任务的segment_id和对应的分镜数据
             $segment_ids_to_create_task = [];
@@ -2243,7 +2274,7 @@ class AnimeService
                 if (!empty($segment_ids_to_create_task)) {
                     $global_segment_update_data = $global_update_data;
                     $global_segment_update_data['audio_url'] = '';  // 清空音频URL
-                    $global_segment_update_data['updated_at'] = $now;
+                    $global_segment_update_data['updated_at'] = date('Y-m-d H:i:s');
                     DB::table('mp_episode_segments')
                         ->where('episode_id', $episode_id)
                         ->where('voice_actor', $target_voice_actor)
@@ -2271,7 +2302,7 @@ class AnimeService
                     if ($roles_updated) {
                         DB::table('mp_anime_episodes')->where('id', $episode_id)->update([
                             'roles' => json_encode($episode_roles, 256),
-                            'updated_at' => $now,
+                            'updated_at' => date('Y-m-d H:i:s'),
                         ]);
                     }
                 }
@@ -2307,7 +2338,7 @@ class AnimeService
                         
                         // 更新分镜数据并清空音频URL
                         $segment_update_data['audio_url'] = '';
-                        $segment_update_data['updated_at'] = $now;
+                        $segment_update_data['updated_at'] = date('Y-m-d H:i:s');
                         DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update($segment_update_data);
                     }
                 }
@@ -2340,11 +2371,12 @@ class AnimeService
                             'audio_url' => 'https://zw-audiobook.tos-cn-beijing.volces.com/effects/ellipses_2s.mp3',
                             'audio_duration' => 2.0,
                             'subtitle_info' => json_encode(['duration' => 2.0, 'words' => []], 256),
-                            'updated_at' => $now
+                            'updated_at' => date('Y-m-d H:i:s')
                         ]);
                         continue;
                     }
-                    
+
+                    sleep(1);
                     $generate_json = [
                         'text' => $dialogue,
                         'role' => getProp($updated_segment, 'voice_actor'),
@@ -2365,8 +2397,8 @@ class AnimeService
                         'generate_status' => '执行中',
                         'audio_url' => '',
                         'generate_json' => json_encode($generate_json, 256),
-                        'created_at' => $now,
-                        'updated_at' => $now,
+                        'created_at' => date('Y-m-d H:i:s'),
+                        'updated_at' => date('Y-m-d H:i:s'),
                     ]);
                     
                     if (!$dubTaskId) {
@@ -2629,6 +2661,26 @@ class AnimeService
         };
     }
 
+    public function clipSegmentVideo($data) {
+        $segment_id = getProp($data, 'segment_id');
+        $video_time_point_start = getProp($data, 'video_time_point_start');
+        $video_time_point_end = getProp($data, 'video_time_point_end');
+
+        if (!$segment_id || !$video_time_point_start || !$video_time_point_end) {
+            Utils::throwError('20003:参数异常');
+        }
+
+        if (!DB::table('mp_episode_segments')->where('segment_id', $segment_id)->value('video_url')) {
+            Utils::throwError('20003:该分镜没有视频,无法裁剪');
+        }
+
+        return DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update([
+            'video_time_point_start'    => $video_time_point_start,
+            'video_time_point_end'      => $video_time_point_end,
+            'updated_at'                => date('Y-m-d H:i:s')
+        ]);
+    }
+
     // 轮训获取图片任务结果
     private function loopGetPicTaskResult($task_id) {
         $task = MpGeneratePicTask::where('id', $task_id)->first();

+ 19 - 0
app/Services/DeepSeek/DeepSeekService.php

@@ -2245,6 +2245,25 @@ class DeepSeekService
      * @return \Generator 返回生成器,用于流式输出
      */
     public function addChat($data) {
+        $dubTaskId = 10362;
+            $sid = '202604291402526677001';
+        try {
+            $client = new Client(['timeout' => 300, 'verify' => false]);
+            $result = $client->get("http://122.9.129.83:5000/api/anime/genAudio?taskId={$dubTaskId}");
+            $response = $result->getBody()->getContents();
+            $response_arr = json_decode($response, true);
+            
+            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' => $sid]);
+                logDB('anime', 'error', '火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId, 'segment_id' => $sid]);
+            }
+        } catch (\Exception $e) {
+            dLog('anime')->error('调用音频生成API失败', ['error' => $e->getMessage(), 'task_id' => $dubTaskId, 'segment_id' => $sid]);
+            logDB('anime', 'error', '调用音频生成API失败', ['error' => $e->getMessage(), 'task_id' => $dubTaskId, 'segment_id' => $sid]);
+        }
+        exit();
+
         $uid = Site::getUid();
         $anime_id = getProp($data, 'anime_id');
         if (!$anime_id) Utils::throwError('20003:请选择对话');

+ 3 - 1
routes/api.php

@@ -137,6 +137,8 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
         Route::get('videoModel', [AnimeController::class, 'videoModel']);                       // 视频模型
         Route::get('artStyleList', [AnimeController::class, 'artStyleList']);                   // 艺术风格列表
         Route::post('create', [AnimeController::class, 'createAnime']);                         // 创建动漫
+        Route::post('edit', [AnimeController::class, 'editAnime']);                             // 编辑动漫
+        Route::get('delete', [AnimeController::class, 'delAnime']);                             // 删除动漫
         Route::post('addChat', [DeepSeekController::class, 'addChat']);                         // 新增动漫对话
         Route::post('reGenerateAnime', [DeepSeekController::class, 'reGenerateAnime']);         // 调整动漫大纲
         Route::get('chatList', [AnimeController::class, 'chatList']);                           // 动漫列表
@@ -148,7 +150,6 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
         Route::get('copyEpisodeVersion', [AnimeController::class, 'copyEpisodeVersion']);       // 复制动漫剧集
         Route::get('episodeVersions', [AnimeController::class, 'episodeVersions']);             // 剧集版本
         Route::get('bindEpisodeVersion', [AnimeController::class, 'bindEpisodeVersion']);       // 绑定剧集版本
-        Route::post('edit', [AnimeController::class, 'editAnime']);                             // 编辑动漫(弃用)
         Route::post('changeEpisodeRoles', [AnimeController::class, 'changeEpisodeRoles']);      // 更改分集主体列表
         Route::post('changeEpisodeScenes', [AnimeController::class, 'changeEpisodeScenes']);    // 更改分集场景列表
         Route::post('editSegment', [AnimeController::class, 'editSegment']);                    // 编辑分镜
@@ -170,6 +171,7 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
         Route::post('applyAudioData', [AnimeController::class, 'applyAudioData']);                  // 修改分镜音频参数
         Route::post('previewAudio', [AnimeController::class, 'previewAudio']);                      // 音频试听
         Route::get('episodePicsInfo', [AnimeController::class, 'episodePicsInfo']);                 // 获取主体和场景图片生成信息
+        Route::get('clipSegmentVideo', [AnimeController::class, 'clipSegmentVideo']);                       // 裁剪视频
         
         // 完整视频合成任务
         Route::post('createCompleteVideoTask', [AnimeController::class, 'createCompleteVideoTask']);