lh há 1 semana atrás
pai
commit
49cb0beae6
1 ficheiros alterados com 65 adições e 6 exclusões
  1. 65 6
      app/Console/Commands/FixNewVideoTasks720pCommand.php

+ 65 - 6
app/Console/Commands/FixNewVideoTasks720pCommand.php

@@ -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 其他任务写入的记录。