lh 3 месяцев назад
Родитель
Сommit
2592fdc109
2 измененных файлов с 86 добавлено и 6 удалено
  1. 85 5
      app/Services/Anime/AnimeService.php
  2. 1 1
      routes/api.php

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

@@ -442,14 +442,17 @@ class AnimeService
         $episode = (array)$episode;
         $anime_id = $episode['anime_id'];
         $episode_number = $episode['episode_number'];
-        $count = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->where('version_count', '>', 1)->count('id');
+        $count = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->count('id');
+        $sequence = $count + 1;
         unset($episode['id']);
         $now = date('Y-m-d H:i:s');
         $episode['created_at'] = $now;
         $episode['updated_at'] = $now;
         $episode['is_default'] = 1;
-        $episode['title'] = $count > 0 ? $episode['title']."(副本{$count})" : $episode['title']."(副本)";
-        $episode['version_count'] = $count + 2;
+        // 获取版本中含有"(副本"字样的个数
+        $copy_count = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->where('title', 'like', '%(副本%')->count('id');
+        $episode['title'] = $copy_count > 0 ? $episode['title']."(副本{$copy_count})" : $episode['title']."(副本)";  // 生成带(副本)字样的标题
+        $episode['sequence'] = $sequence;
         $episode['is_generated'] = 0;
 
         try {
@@ -580,14 +583,91 @@ class AnimeService
             Utils::throwError('1002:请选择剧集');
         }
 
-        $episodes = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('id', $episode_id)->select('anime_id', 'episode_number', 'sequence', 'title', 'intro', 'art_style', 'roles', 'scenes')->get()->map(function($value) {
+        $episode_number = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('id', $episode_id)->value('episode_number');
+
+        $episodes = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->select('id as episode_id', 'anime_id', 'episode_number', 'sequence', 'title', 'intro', 'art_style', 'roles', 'scenes', 'is_generated')->orderBy('sequence', 'desc')->get()->map(function($value) {
             return (array)$value;
         })->toArray();
         if (!$episodes) Utils::throwError('20003:该剧集不存在!');
+        
         foreach($episodes as &$episode) {
-            $episode['version'] = 'V'.$episode['version_count'];
+            $episode['version'] = 'V'.$episode['sequence'];
             $episode['roles'] = json_decode($episode['roles'], true);
             $episode['scenes'] = json_decode($episode['scenes'], true);
+            
+            // 获取分镜信息
+            $segments = DB::table('mp_episode_segments')->where('anime_id', $anime_id)->where('episode_id', getProp($episode, 'episode_id'))->orderBy('segment_number')
+            ->select('*')->get()->map(function ($value) {
+                return (array)$value;
+            })->toArray();
+            
+            $acts = [];
+            foreach($segments as $segment) {
+                if (isset($acts[getProp($segment, 'act_number')])) {
+                    $acts[getProp($segment, 'act_number')]['segments'][] = [
+                        'segment_id' => getProp($segment, 'segment_id'),
+                        'segment_number' => getProp($segment, 'segment_number'),
+                        'segment_content' => getProp($segment, 'segment_content'),
+                        'description' => getProp($segment, 'description'),
+                        'composition' => getProp($segment, 'composition'),
+                        'camera_movement' => getProp($segment, 'camera_movement'),
+                        'voice_actor' => getProp($segment, 'voice_actor'),
+                        'dialogue' => getProp($segment, 'dialogue'),
+                        'frame_type' => getProp($segment, 'frame_type'),
+                        'scene' => getProp($segment, 'scene'),
+                        'characters' => getProp($segment, 'characters'),
+                        'tail_frame' => getProp($segment, 'tail_frame'),
+                        'emotion' => getProp($segment, 'emotion'),
+                        'emotion_type' => getProp($segment, 'emotion_type'),
+                        'gender' => getProp($segment, 'gender'),
+                        'speed_ratio' => getProp($segment, 'speed_ratio'),
+                        'loudness_ratio' => getProp($segment, 'loudness_ratio'),
+                        'emotion_scale' => getProp($segment, 'emotion_scale'),
+                        'pitch' => getProp($segment, 'pitch'),
+                        'voice_name' => getProp($segment, 'voice_name'),
+                        'voice_type' => getProp($segment, 'voice_type'),
+                        'voice_audio_url' => getProp($segment, 'voice_audio_url'),
+                        'img_url' => getProp($segment, 'img_url'),
+                        'video_url' => getProp($segment, 'video_url'),
+                        'last_frame_url' => getProp($segment, 'last_frame_url'),
+                    ];
+                }else {
+                    $acts[getProp($segment, 'act_number')]= [
+                        'act_number' => getProp($segment, 'act_number'),
+                        'act_title' => getProp($segment, 'act_title'),
+                        'segments' => [
+                            [
+                                'segment_id' => getProp($segment, 'segment_id'),
+                                'segment_number' => getProp($segment, 'segment_number'),
+                                'segment_content' => getProp($segment, 'segment_content'),
+                                'description' => getProp($segment, 'description'),
+                                'composition' => getProp($segment, 'composition'),
+                                'camera_movement' => getProp($segment, 'camera_movement'),
+                                'voice_actor' => getProp($segment, 'voice_actor'),
+                                'dialogue' => getProp($segment, 'dialogue'),
+                                'frame_type' => getProp($segment, 'frame_type'),
+                                'scene' => getProp($segment, 'scene'),
+                                'characters' => getProp($segment, 'characters'),
+                                'tail_frame' => getProp($segment, 'tail_frame'),
+                                'emotion' => getProp($segment, 'emotion'),
+                                'emotion_type' => getProp($segment, 'emotion_type'),
+                                'gender' => getProp($segment, 'gender'),
+                                'speed_ratio' => getProp($segment, 'speed_ratio'),
+                                'loudness_ratio' => getProp($segment, 'loudness_ratio'),
+                                'emotion_scale' => getProp($segment, 'emotion_scale'),
+                                'pitch' => getProp($segment, 'pitch'),
+                                'voice_name' => getProp($segment, 'voice_name'),
+                                'voice_type' => getProp($segment, 'voice_type'),
+                                'voice_audio_url' => getProp($segment, 'voice_audio_url'),
+                                'img_url' => getProp($segment, 'img_url'),
+                                'video_url' => getProp($segment, 'video_url'),
+                                'last_frame_url' => getProp($segment, 'last_frame_url'),
+                            ]
+                        ]
+                    ];
+                }
+            }
+            $episode['acts'] = array_values($acts);
         }
 
         return $episodes;

+ 1 - 1
routes/api.php

@@ -170,7 +170,7 @@ Route::group(['middleware' => ['bindToken', 'bindExportToken', 'checkLogin']], f
         Route::get('generateImg', [AnimeController::class, 'generateImg']);     // 文生图(通用)
         Route::post('generateText', [DeepSeekController::class, 'generateText']);    // 文生文(通用)
         
-        // 监控分镜图片和音频生成任务进度(SSE)
+        // 监控分镜图片和音频生成任务进度(SSE)
         Route::get('segmentPicsInfo', [AnimeController::class, 'monitorSegmentTasks']);
         
         // 导出全部分镜