|
|
@@ -5104,7 +5104,8 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
|
|
|
// 新建动漫
|
|
|
if ($user_anime_name == '新剧本策划') {
|
|
|
- $anime_name = getProp($script_arr, 'script_name');
|
|
|
+ $anime_name = trim((string)getProp($script_arr, 'script_name'));
|
|
|
+ $anime_name = preg_replace('/^[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+|[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+$/u', '', $anime_name) ?? $anime_name;
|
|
|
// if (!$anime_name) {
|
|
|
// // 未识别到剧本名,保存对话记录并返回提示
|
|
|
// dLog('deepseek')->info('未能识别到剧本名称');
|
|
|
@@ -5927,7 +5928,8 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
}
|
|
|
|
|
|
if ($user_anime_name != '新剧本策划') {
|
|
|
- $anime_name = isset($script_arr['script_name']) ? $script_arr['script_name'] : '';
|
|
|
+ $anime_name = trim((string)getProp($script_arr, 'script_name'));
|
|
|
+ $anime_name = preg_replace('/^[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+|[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+$/u', '', $anime_name) ?? $anime_name;
|
|
|
// 确认对话名称唯一性
|
|
|
if ($anime_name && $id = DB::table('mp_animes')->where('anime_name', $anime_name)->value('id')) {
|
|
|
if ($id != $anime_id) $anime_name = $anime_name . '_' . date('YmdHis');
|
|
|
@@ -7576,7 +7578,8 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
|
|
|
// 新建动漫
|
|
|
if ($user_anime_name == '新剧本策划') {
|
|
|
- $anime_name = getProp($script_arr, 'script_name');
|
|
|
+ $anime_name = trim((string)getProp($script_arr, 'script_name'));
|
|
|
+ $anime_name = preg_replace('/^[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+|[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+$/u', '', $anime_name) ?? $anime_name;
|
|
|
// if (!$anime_name) {
|
|
|
// // 未识别到剧本名,保存对话记录并返回提示
|
|
|
// dLog('deepseek')->info('未能识别到剧本名称');
|
|
|
@@ -8573,7 +8576,8 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
}
|
|
|
|
|
|
if ($user_anime_name != '新剧本策划') {
|
|
|
- $anime_name = isset($script_arr['script_name']) ? $script_arr['script_name'] : '';
|
|
|
+ $anime_name = trim((string)getProp($script_arr, 'script_name'));
|
|
|
+ $anime_name = preg_replace('/^[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+|[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+$/u', '', $anime_name) ?? $anime_name;
|
|
|
// 确认对话名称唯一性
|
|
|
if ($anime_name && $id = DB::table('mp_animes')->where('anime_name', $anime_name)->value('id')) {
|
|
|
if ($id != $anime_id) $anime_name = $anime_name . '_' . date('YmdHis');
|
|
|
@@ -9815,6 +9819,25 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // 最后一次重试仍校验失败时,兼容合并非强制列表中的资产,保证可以保存并返回 episodes
|
|
|
+ if ($validation_failed && $retry_count >= $max_retries) {
|
|
|
+ dLog('deepseek')->info('最后一次重试仍校验失败,合并非强制列表资产后继续保存', [
|
|
|
+ 'retry_count' => $retry_count,
|
|
|
+ 'last_error' => $validation_error_msg
|
|
|
+ ]);
|
|
|
+ logDB('deepseek', 'info', '最后一次重试校验失败,合并非强制资产', [
|
|
|
+ 'error' => $validation_error_msg,
|
|
|
+ 'anime_id' => $anime_id
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $extra_roles = $this->mergeGeneratedResources($episode_arr['roles'] ?? [], $extra_roles, 'role');
|
|
|
+ $extra_scenes = $this->mergeGeneratedResources($episode_arr['scenes'] ?? [], $extra_scenes, 'scene');
|
|
|
+ $extra_props = $this->mergeGeneratedResources($episode_arr['props'] ?? [], $extra_props, 'prop');
|
|
|
+
|
|
|
+ $validation_failed = false;
|
|
|
+ $validation_error_msg = '';
|
|
|
+ }
|
|
|
+
|
|
|
// 如果重试后仍然失败
|
|
|
if ($validation_failed) {
|
|
|
dLog('deepseek')->error('达到最大重试次数,仍未生成有效内容', [
|
|
|
@@ -10277,6 +10300,32 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 将生成内容中不在强制列表中的资源合并进强制列表
|
|
|
+ * 用于最后一次重试仍校验失败时,兼容剧情需要的新资产
|
|
|
+ *
|
|
|
+ * @param array $generated 生成内容中的资源列表
|
|
|
+ * @param array $forced 强制资源列表(key为资源名称)
|
|
|
+ * @param string $type 资源类型:role、scene、prop
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ private function mergeGeneratedResources(array $generated, array $forced, string $type): array
|
|
|
+ {
|
|
|
+ foreach ($generated as $item) {
|
|
|
+ $name = getProp($item, $type === 'role' ? 'role' : ($type === 'scene' ? 'scene' : 'prop'));
|
|
|
+ if ($name === null || $name === '') {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if ($name === '旁白') {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!isset($forced[$name])) {
|
|
|
+ $forced[$name] = $item;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return $forced;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 智能匹配并替换主体和场景名称
|
|
|
* 如果生成的主体或场景名称是强制设定名称的子串,则自动替换为完整名称
|
|
|
*
|