|
|
@@ -1603,6 +1603,9 @@ class AnimeController extends BaseController
|
|
|
if ($uncompleted_pic_count == 0 && $uncompleted_audio_count == 0) {
|
|
|
$completedCount = DB::table('mp_episode_segments')->where('anime_id', $animeId)->where('episode_id', $episodeId)->where('pic_task_id', '<>', '')->where('pic_task_status', '已完成')->count('id');
|
|
|
|
|
|
+ // 获取剧集信息之前先处理视频截止时间点
|
|
|
+ $this->handleVideoTimePointEnd();
|
|
|
+
|
|
|
// 获取剧集信息
|
|
|
$episode = DB::table('mp_anime_episodes')
|
|
|
->where('anime_id', $animeId)
|
|
|
@@ -1803,6 +1806,9 @@ class AnimeController extends BaseController
|
|
|
|
|
|
// 如果所有分镜都已处理完成(成功或失败),获取最终结果并结束连接
|
|
|
if (count($processedSegments) === count($segments)) {
|
|
|
+ // 获取剧集信息之前先处理视频截止时间点
|
|
|
+ $this->handleVideoTimePointEnd();
|
|
|
+
|
|
|
// 获取剧集信息
|
|
|
$episode = DB::table('mp_anime_episodes')
|
|
|
->where('anime_id', $animeId)
|
|
|
@@ -1827,49 +1833,9 @@ class AnimeController extends BaseController
|
|
|
})->toArray();
|
|
|
|
|
|
// 按照episodeInfo的格式组织数据
|
|
|
- $acts = [];
|
|
|
- foreach($allSegments as $segment) {
|
|
|
- $segmentData = [
|
|
|
- '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'),
|
|
|
- 'audio_url' => getProp($segment, 'audio_url'),
|
|
|
- 'video_url' => getProp($segment, 'video_url'),
|
|
|
- 'last_frame_url' => getProp($segment, 'last_frame_url'),
|
|
|
- ];
|
|
|
-
|
|
|
- $actNumber = getProp($segment, 'act_number');
|
|
|
- if (isset($acts[$actNumber])) {
|
|
|
- $acts[$actNumber]['segments'][] = $segmentData;
|
|
|
- } else {
|
|
|
- $acts[$actNumber] = [
|
|
|
- 'act_number' => $actNumber,
|
|
|
- 'act_title' => getProp($segment, 'act_title'),
|
|
|
- 'segments' => [$segmentData]
|
|
|
- ];
|
|
|
- }
|
|
|
- }
|
|
|
- $episode['acts'] = array_values($acts);
|
|
|
+ $segmentsStructure = $this->AnimeService->buildEpisodeSegmentsStructure($allSegments);
|
|
|
+ $episode['acts'] = $segmentsStructure['acts'];
|
|
|
+ $episode['total_duration'] = $segmentsStructure['total_duration'];
|
|
|
}
|
|
|
|
|
|
echo "data: " . json_encode([
|
|
|
@@ -1950,4 +1916,62 @@ class AnimeController extends BaseController
|
|
|
$result = $this->AnimeService->previewAudio($data);
|
|
|
return $this->success($result);
|
|
|
}
|
|
|
+
|
|
|
+ private function handleVideoTimePointEnd() {
|
|
|
+ // 处理音频时长,循环查询dub_video_task_queue列表中的任务
|
|
|
+ $queueLength = Redis::llen('dub_video_task_queue');
|
|
|
+ if ($queueLength > 0) {
|
|
|
+ $processedTaskIds = []; // 记录已处理的任务ID
|
|
|
+
|
|
|
+ // 遍历队列中的所有任务
|
|
|
+ for ($i = 0; $i < $queueLength; $i++) {
|
|
|
+ $dubTaskId = Redis::lindex('dub_video_task_queue', $i);
|
|
|
+ if (!$dubTaskId) continue;
|
|
|
+
|
|
|
+ // 查询任务状态
|
|
|
+ $dubTask = DB::table('mp_dub_video_tasks')
|
|
|
+ ->where('id', $dubTaskId)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if (!$dubTask) {
|
|
|
+ // 任务不存在,标记为需要删除
|
|
|
+ $processedTaskIds[] = $dubTaskId;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果任务状态是已完成
|
|
|
+ if ($dubTask->generate_status === '已完成') {
|
|
|
+ // 获取对应的分镜信息
|
|
|
+ $segment = DB::table('mp_episode_segments')
|
|
|
+ ->where('segment_id', $dubTask->alias_segment_id)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ // 如果分镜存在且audio_duration大于0
|
|
|
+ if ($segment && isset($segment->audio_duration) && $segment->audio_duration > 0) {
|
|
|
+ // 更新video_time_point_end字段
|
|
|
+ DB::table('mp_episode_segments')
|
|
|
+ ->where('segment_id', $dubTask->alias_segment_id)
|
|
|
+ ->update([
|
|
|
+ 'video_time_point_end' => $segment->audio_duration,
|
|
|
+ 'updated_at' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
+
|
|
|
+ dLog('anime')->info('更新分镜视频截止时间点', [
|
|
|
+ 'task_id' => $dubTaskId,
|
|
|
+ 'segment_id' => $dubTask->alias_segment_id,
|
|
|
+ 'audio_duration' => $segment->audio_duration
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 标记为需要从队列中删除
|
|
|
+ $processedTaskIds[] = $dubTaskId;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从Redis列表中删除已处理的任务ID
|
|
|
+ foreach ($processedTaskIds as $taskId) {
|
|
|
+ Redis::lrem('dub_video_task_queue', 0, $taskId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|