feat(ci): 代码质量深度加固 - mypy/ruff/vulture 接入
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Failing after 35s
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 1533h49m24s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 1533h49m25s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 1533h49m25s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 1533h49m27s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 1533h49m26s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 1533h49m27s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 1533h49m27s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 1533h49m27s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 1533h49m27s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Failing after 1534h21m3s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 1534h21m5s

- ruff 替换 flake8:增加 bugbear/pyupgrade/simplify/return 等规则集
  * 自动修复34个问题(未使用import/格式等)
  * 手动修复10个F841未使用变量 + 2个E722裸except
- mypy 类型检查:告警模式接入Validate,不阻断CI
  * 检查范围:apps/api/app + packages核心业务代码
  * 配置:ignore-missing-imports + explicit-package-bases
- vulture 死代码扫描升级:
  * 置信度阈值从80%降到70%,输出更多参考
  * 按size排序,便于人工审查高价值条目
  * 告警模式不阻断CI
- 新增 pyproject.toml:ruff 集中配置
- 修复F841未使用变量(10处)+ E722裸except(2处)
This commit is contained in:
CI Bot
2026-07-14 17:38:13 +08:00
parent 1c8cb20373
commit 19edd9aa85
25 changed files with 101 additions and 118 deletions
-2
View File
@@ -88,14 +88,12 @@ def prepare_bgm_track(
# 构建滤镜链
filter_parts: list[str] = []
input_looped: bool = False
if needs_loop:
# 计算需要循环多少次才能铺满
loop_count = max(1, int(target_duration / bgm_dur) + 2)
# aloop 滤镜:循环指定次数
filter_parts.append(f"aloop=loop={loop_count}:size=0")
input_looped = True
# 音量调节
volume = max(0.0, min(1.0, bgm.volume))
@@ -10,7 +10,7 @@
from __future__ import annotations
import logging
from dataclasses import dataclass, field
from dataclasses import dataclass
from typing import Any
logger = logging.getLogger(__name__)
@@ -18,10 +18,8 @@
from __future__ import annotations
import logging
import tempfile
from dataclasses import dataclass, field
from pathlib import Path
from typing import Any
from video_processing.ffmpeg_utils import FFMPEG_BIN, probe_duration, probe_video_info, run_ffmpeg
@@ -160,7 +160,6 @@ class IntroOutroEngine:
是否成功
"""
duration = config.intro_duration
bg = config.intro_background.lstrip("#")
# 转义文字
title = config.intro_title.replace(":", "\\:").replace("'", "\\'")
@@ -357,7 +356,6 @@ class IntroOutroEngine:
只传了片头或片尾也可以,缺失的自动跳过。
"""
# 收集所有片段
segments: list[tuple[Path, float]] = [] # (path, duration)
# 简单探测时长(用 ffprobe,这里简化处理:直接用 xfade 的 offset)
# 先添加到列表
@@ -156,7 +156,6 @@ def mix_audio(
from video_processing.bgm_mixer import BGMConfig, mix_bgm_with_main
bgm_cfg = BGMConfig.from_config_dict(bgm_path, bgm_config)
bgm_output = ctx.work_dir / f"audio_with_bgm_{ctx.plan_id}.aac"
try:
# 这里 main_audio 就是 output_path,先有主音频再混 BGM
@@ -24,12 +24,10 @@
from __future__ import annotations
import logging
from dataclasses import dataclass, field
from dataclasses import dataclass
from pathlib import Path
from typing import Any
from video_processing.render_subtitles import generate_ass_subtitles
from video_processing.subtitle_generator import generate_ass_from_timeline
logger = logging.getLogger(__name__)
@@ -44,7 +44,7 @@ from video_processing.pip_engine import PiPConfig, PiPEngine, PiPLayerConfig
from video_processing.render_audio import RenderContext, merge_audio_video, mix_audio
from video_processing.render_subtitles import generate_ass_subtitles
from video_processing.reverse_engine import ReverseConfig, ReverseEngine
from video_processing.speed_engine import SpeedConfig, SpeedEngine
from video_processing.speed_engine import SpeedEngine
from video_processing.sticker_engine import StickerEngine
from video_processing.subtitle_generator import generate_ass_from_timeline
from video_processing.transition_engine import TransitionEngine
@@ -243,7 +243,6 @@ class WatermarkEngine:
# 构建滤镜
# 先缩放水印图
wm_input_idx = 1 # 假设水印图是第二个输入(索引1
filter_parts = [
f"[1:v]{wm_filter}{wm_pre_label}",
f"{input_video_label}{wm_pre_label}overlay={overlay_expr}{output_label}",