|
|
@@ -8,8 +8,11 @@ use Illuminate\Support\Facades\DB;
|
|
|
|
|
|
/**
|
|
|
* 处理 id >= 12835 的新数据视频任务(动漫 act/分镜链路):
|
|
|
- * 1. 480p 档任务切换为 720p(处理 480p -> 720p 档位残留);
|
|
|
- * 2. 检查 sr_720p / 720p / 480p 成功任务的 result_url、compressed_url 是否真的是 720p:
|
|
|
+ * 1. 仅处理 video_resolution=480p 且 mp_anime_episodes 对应分集设置为 sr_720p 的任务
|
|
|
+ * (通过 alias_act_id/alias_segment_id 关联 mp_episode_segments 再取分集 video_resolution),
|
|
|
+ * 分集未设置 sr_720p 的不做超分修复;
|
|
|
+ * 2. task_id 为空的任务视为用户手动上传的视频,不做检测与超分处理;
|
|
|
+ * 3. 检查上述任务的 result_url、compressed_url 是否真的是 720p:
|
|
|
* - result 为 480p 档 -> 本地超分到 720p,重新压缩,更新任务两列 URL;
|
|
|
* - result 已是 720p+ 但 compressed 为 480p 档 -> 基于 result 重新压缩;
|
|
|
* - 同步关联 mp_episode_segments 的 origin_video_url / video_url(仅 URL,其余字段不动);
|
|
|
@@ -50,10 +53,13 @@ class FixNewVideoTasks720pCommand extends Command
|
|
|
$tasks = DB::table('mp_generate_video_tasks')
|
|
|
->select([
|
|
|
'id', 'video_resolution', 'status', 'api_type',
|
|
|
- 'alias_segment_id', 'alias_act_id', 'result_url', 'compressed_url',
|
|
|
+ 'alias_segment_id', 'alias_act_id', 'task_id', 'result_url', 'compressed_url',
|
|
|
])
|
|
|
->where('id', '>=', $minId)
|
|
|
- ->whereIn('video_resolution', ['sr_720p', '720p', '480p'])
|
|
|
+ // 仅处理 480p 任务;task_id 为空 = 用户手动上传的视频,不处理
|
|
|
+ ->whereRaw('LOWER(TRIM(video_resolution)) = ?', ['480p'])
|
|
|
+ ->whereNotNull('task_id')
|
|
|
+ ->where('task_id', '<>', '')
|
|
|
->where('status', 'success')
|
|
|
->whereNotNull('result_url')
|
|
|
->where('result_url', '<>', '')
|
|
|
@@ -67,8 +73,29 @@ class FixNewVideoTasks720pCommand extends Command
|
|
|
$needCompressedFix = 0;
|
|
|
$probeFailed = 0;
|
|
|
$updated = 0;
|
|
|
+ $skippedManual = 0;
|
|
|
+ $skippedEpisode = 0;
|
|
|
|
|
|
foreach ($tasks as $task) {
|
|
|
+ // 防御:task_id 为空视为人工上传视频(查询已排除,双保险)
|
|
|
+ if (empty($task->task_id)) {
|
|
|
+ $skippedManual++;
|
|
|
+ $this->warn(sprintf('#%d task_id 为空(疑似用户手动上传),跳过检测与超分', $task->id));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 仅当对应分集设置的 video_resolution 为 sr_720p 时才需要修复
|
|
|
+ $episodeResolution = $this->resolveEpisodeResolution($task);
|
|
|
+ if ($episodeResolution !== 'sr_720p') {
|
|
|
+ $skippedEpisode++;
|
|
|
+ $this->line(sprintf(
|
|
|
+ '#%d 对应分集 video_resolution=%s(非 sr_720p),跳过超分修复',
|
|
|
+ $task->id,
|
|
|
+ $episodeResolution === '' ? '未知' : $episodeResolution
|
|
|
+ ));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
$resultProbe = $this->probeUrl($task->result_url);
|
|
|
if (!$resultProbe['ok']) {
|
|
|
$probeFailed++;
|
|
|
@@ -163,12 +190,14 @@ class FixNewVideoTasks720pCommand extends Command
|
|
|
}
|
|
|
|
|
|
$this->info(sprintf(
|
|
|
- '汇总:待超分 result=%d,需重压 compressed=%d,已合格=%d,探测失败=%d,已更新任务=%d',
|
|
|
+ '汇总:待超分 result=%d,需重压 compressed=%d,已合格=%d,探测失败=%d,已更新任务=%d,跳过人工上传=%d,跳过非sr_720p分集=%d',
|
|
|
$needResultFix,
|
|
|
$needCompressedFix,
|
|
|
$alreadyOk,
|
|
|
$probeFailed,
|
|
|
- $updated
|
|
|
+ $updated,
|
|
|
+ $skippedManual,
|
|
|
+ $skippedEpisode
|
|
|
));
|
|
|
|
|
|
if (!$apply) {
|
|
|
@@ -231,6 +260,36 @@ class FixNewVideoTasks720pCommand extends Command
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 通过任务的 alias_act_id / alias_segment_id 关联分镜,再取对应分集的 video_resolution
|
|
|
+ *
|
|
|
+ * @param object $task
|
|
|
+ * @return string 小写分集分辨率;无法关联时返回空字符串
|
|
|
+ */
|
|
|
+ private function resolveEpisodeResolution($task): string
|
|
|
+ {
|
|
|
+ $segment = null;
|
|
|
+ if (!empty($task->alias_act_id)) {
|
|
|
+ $segment = DB::table('mp_episode_segments')
|
|
|
+ ->where('id', $task->alias_act_id)
|
|
|
+ ->first(['episode_id']);
|
|
|
+ } elseif (!empty($task->alias_segment_id)) {
|
|
|
+ $segment = DB::table('mp_episode_segments')
|
|
|
+ ->where('segment_id', $task->alias_segment_id)
|
|
|
+ ->first(['episode_id']);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!$segment || empty($segment->episode_id)) {
|
|
|
+ return '';
|
|
|
+ }
|
|
|
+
|
|
|
+ $episode = DB::table('mp_anime_episodes')
|
|
|
+ ->where('id', $segment->episode_id)
|
|
|
+ ->first(['video_resolution']);
|
|
|
+
|
|
|
+ return strtolower(trim((string)($episode->video_resolution ?? '')));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 同步 mp_anime_records 中 assistant 对话记录的 video_url
|
|
|
* 仅更新 video_task_id 匹配、role=assistant 且 video_url 仍指向该任务旧 result_url 的行,
|
|
|
* 避免覆盖同 act 其他任务写入的记录。
|