|
|
@@ -5,6 +5,7 @@ namespace App\Services\Anime;
|
|
|
use App\Consts\ErrorConst;
|
|
|
use App\Facade\Site;
|
|
|
use App\Libs\Utils;
|
|
|
+use App\Models\MpGeneratePicTask;
|
|
|
use App\Services\AIGeneration\AIImageGenerationService;
|
|
|
use Dflydev\DotAccessData\Util;
|
|
|
use GuzzleHttp\Client;
|
|
|
@@ -45,13 +46,13 @@ class AnimeService
|
|
|
$role_name = getProp($role, 'role');
|
|
|
$description = getProp($role, 'description');
|
|
|
// 参考图地址
|
|
|
- $ref_img_url = getProp($role, 'ref_img_url');
|
|
|
+ $ref_img_url = getProp($role, 'url');
|
|
|
|
|
|
// 此处调用AIImageGenerationService的生成图片任务接口: createImageGenerationTask(注意使用默认参数,prompt使用角色描述),并返回任务id
|
|
|
try {
|
|
|
$params = [
|
|
|
'prompt' => $description,
|
|
|
- 'ref_img_urls' => !empty($ref_img_url) ? $ref_img_url : []
|
|
|
+ 'ref_img_urls' => !empty($ref_img_url) ? [$ref_img_url] : []
|
|
|
];
|
|
|
|
|
|
$task = $this->aiImageGenerationService->createImageGenerationTask($params);
|
|
|
@@ -99,7 +100,7 @@ class AnimeService
|
|
|
try {
|
|
|
$params = [
|
|
|
'prompt' => $description,
|
|
|
- 'ref_img_urls' => !empty($ref_img_url) ? $ref_img_url : []
|
|
|
+ 'ref_img_urls' => !empty($ref_img_url) ? [$ref_img_url] : []
|
|
|
];
|
|
|
|
|
|
$task = $this->aiImageGenerationService->createImageGenerationTask($params);
|
|
|
@@ -238,12 +239,40 @@ class AnimeService
|
|
|
Utils::throwError('1002:请选择剧集');
|
|
|
}
|
|
|
|
|
|
- $episode = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->where('is_default', 1)->select('id as episode_id', 'anime_id', 'episode_number', 'title', 'intro', 'art_style', 'roles', 'scenes', 'acts')->first();
|
|
|
+ $episode = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->where('is_default', 1)->select('id as episode_id', 'anime_id', 'episode_number', 'title', 'intro', 'art_style', 'roles', 'scenes')->first();
|
|
|
if (!$episode) Utils::throwError('20003: 该剧集不存在!');
|
|
|
$episode = (array)$episode;
|
|
|
$episode['roles'] = json_decode($episode['roles'], true);
|
|
|
$episode['scenes'] = json_decode($episode['scenes'], true);
|
|
|
- $episode['acts'] = json_decode($episode['acts'], true);
|
|
|
+
|
|
|
+ // 获取分镜信息
|
|
|
+ $segments = DB::table('mp_episode_segments')->where('anime_id', $anime_id)->where('episode_id', getProp($episode, 'episode_id'))->orderBy('segment_number')->select('act_number', 'act_title', 'segment_id', 'segment_number', 'segment_content')->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'),
|
|
|
+ ];
|
|
|
+ }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'),
|
|
|
+ ]
|
|
|
+ ]
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $episode['acts'] = array_values($acts);
|
|
|
|
|
|
return $episode;
|
|
|
}
|
|
|
@@ -277,6 +306,22 @@ class AnimeService
|
|
|
Utils::throwError('20003:创建副本失败!');
|
|
|
}
|
|
|
$episode['episode_id'] = $new_episode_id;
|
|
|
+
|
|
|
+ // 获取分镜数据
|
|
|
+ $segments = DB::table('mp_episode_segments')->where('episode_id', $episode_id)->get()->map(function($item) use ($new_episode_id) {
|
|
|
+ $item = (array)$item;
|
|
|
+ unset($item['id']);
|
|
|
+ $item['episode_id'] = $new_episode_id;
|
|
|
+ $item['segment_id'] = date('YmdHis').mt_rand(1000,9999).str_pad($item['segment_number'], 3, "0", STR_PAD_LEFT);
|
|
|
+ $item['created_at'] = $item['updated_at'] = date('Y-m-d H:i:s');
|
|
|
+ return $item;
|
|
|
+ })->toArray();
|
|
|
+
|
|
|
+ // 写入分镜数据
|
|
|
+ $boolen2 = DB::table('mp_episode_segments')->insert($segments);
|
|
|
+ if (!$boolen2) {
|
|
|
+ Utils::throwError('20003:写入分镜数据失败!');
|
|
|
+ }
|
|
|
}catch (\Exception $e) {
|
|
|
DB::rollBack();
|
|
|
Utils::throwError('20003:'.$e->getMessage());
|
|
|
@@ -294,7 +339,7 @@ class AnimeService
|
|
|
Utils::throwError('1002:请选择剧集');
|
|
|
}
|
|
|
|
|
|
- $episodes = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->select('anime_id', 'episode_number', 'sequence', 'title', 'intro', 'art_style', 'roles', 'scenes', 'acts')->get()->map(function($value) {
|
|
|
+ $episodes = DB::table('mp_anime_episodes')->where('anime_id', $anime_id)->where('episode_number', $episode_number)->select('anime_id', 'episode_number', 'sequence', 'title', 'intro', 'art_style', 'roles', 'scenes')->get()->map(function($value) {
|
|
|
return (array)$value;
|
|
|
})->toArray();
|
|
|
if (!$episodes) Utils::throwError('20003: 该剧集不存在!');
|
|
|
@@ -302,7 +347,6 @@ class AnimeService
|
|
|
$episode['version'] = 'V'.$episode['sequence'];
|
|
|
$episode['roles'] = json_decode($episode['roles'], true);
|
|
|
$episode['scenes'] = json_decode($episode['scenes'], true);
|
|
|
- $episode['acts'] = json_decode($episode['acts'], true);
|
|
|
}
|
|
|
|
|
|
return $episodes;
|
|
|
@@ -339,4 +383,82 @@ class AnimeService
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
+
|
|
|
+ public function chatChangeImg($data) {
|
|
|
+ $segment_id = getProp($data, 'segment_id');
|
|
|
+ $prompt = getProp($data, 'prompt');
|
|
|
+ if (!$prompt || !$segment_id) {
|
|
|
+ Utils::throwError('1002:请输入提示词,并且选择需修改的图片');
|
|
|
+ }
|
|
|
+ $segment = DB::table("mp_episode_segments")->where('segment_id', $segment_id)->first();
|
|
|
+ if (!$segment) Utils::throwError('20003:该分镜不存在!');
|
|
|
+ $ref_img_url = getProp($segment, 'img_url');
|
|
|
+ if (empty($ref_img_url)) {
|
|
|
+ $prompt = getProp($segment, 'segment_content');
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ $params = [
|
|
|
+ 'alias_segment_id' => $segment_id,
|
|
|
+ 'prompt' => $prompt,
|
|
|
+ 'ref_img_urls' => !empty($ref_img_url) ? [$ref_img_url] : []
|
|
|
+ ];
|
|
|
+
|
|
|
+ $task = $this->aiImageGenerationService->createImageGenerationTask($params);
|
|
|
+ $task_id = $task->id;
|
|
|
+
|
|
|
+ if (!$task_id) {
|
|
|
+ Utils::throwError("20003: 生成图片失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新任务ID
|
|
|
+ $boolen = DB::table('mp_episode_segments')->where('segment_id', $segment_id)->update(['pic_task_id' => $task_id, 'pic_task_status' => '生成中', 'updated_at' => date('Y-m-d H:i:s')]);
|
|
|
+ if (!$boolen) Utils::throwError('20003:更新任务ID失败');
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Utils::throwError("20003:" . $e->getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ $start_count = 0;
|
|
|
+ $img_url = '';
|
|
|
+ while ($start_count <= 30) {
|
|
|
+ sleep(3);
|
|
|
+
|
|
|
+ $task = MpGeneratePicTask::where('id', $task_id)->first();
|
|
|
+ $statusInfo = $this->aiImageGenerationService->queryTaskStatus($task);
|
|
|
+
|
|
|
+ if ($statusInfo['status'] === 'success') {
|
|
|
+ $task->updateStatus('success', [
|
|
|
+ 'result_url' => $statusInfo['result_url'],
|
|
|
+ 'result_json' => $statusInfo['result_json'] ?? []
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 同步调整分镜图片状态和结果
|
|
|
+ if (getProp($task, 'alias_segment_id')) {
|
|
|
+ DB::table('mp_episode_segments')->where('segment_id', getProp($task, 'alias_segment_id'))->update([
|
|
|
+ 'img_url' => $statusInfo['result_url'][0],
|
|
|
+ 'pic_task_status' => '已完成',
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ $img_url = $statusInfo['result_url'][0];
|
|
|
+ break;
|
|
|
+ } elseif ($statusInfo['status'] === 'failed') {
|
|
|
+ $task->updateStatus('failed', [
|
|
|
+ 'error_message' => $statusInfo['error_message'],
|
|
|
+ 'result_json' => $statusInfo['result_json'] ?? []
|
|
|
+ ]);
|
|
|
+
|
|
|
+ if (getProp($task, 'alias_segment_id')) {
|
|
|
+ DB::table('mp_episode_segments')->where('segment_id', getProp($task, 'alias_segment_id'))->update([
|
|
|
+ 'pic_task_status' => '失败',
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ $start_count+=3;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!$img_url) Utils::throwError('20003:图片生成中,请稍后刷新');
|
|
|
+ return $img_url;
|
|
|
+
|
|
|
+ }
|
|
|
}
|