From 88d22137a6138e36f0befb7ee6c97c856b604c3c Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Fri, 17 Jul 2026 13:34:00 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat(ci):=20P1-1=20Phase2=20=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E5=90=AF=E7=94=A8F401+F841=E5=B9=B6=E4=BF=AE=E5=AD=98?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ruff: 从全局ignore移除F401(未使用import)和F841(未使用变量) - F401: 自动修复32处未使用import - F841: 手动修复7处未使用变量(含1处有副作用调用保留调用) - __init__.py和tests/*的per-file-ignores保持不变 --- apps/api/app/api/routes/edit_plans_clips_batch.py | 2 +- apps/api/app/api/routes/edit_plans_cover.py | 2 +- apps/api/app/api/routes/edit_plans_filter.py | 1 - apps/api/app/api/routes/edit_plans_timeline.py | 2 +- apps/api/app/api/routes/task_center.py | 2 -- apps/api/app/api/routes/videos.py | 2 -- apps/api/app/services/cover_service.py | 2 +- apps/api/app/services/edit_plan_service.py | 2 +- apps/api/app/services/edit_template_service.py | 2 -- apps/worker/video_processing/bgm_mixer.py | 2 -- apps/worker/video_processing/color_grade_engine.py | 2 +- apps/worker/video_processing/concat_engine.py | 2 -- apps/worker/video_processing/intro_outro_engine.py | 3 --- apps/worker/video_processing/render_audio.py | 1 - apps/worker/video_processing/subtitle_render_engine.py | 4 +--- apps/worker/video_processing/unified_render_service.py | 2 +- apps/worker/video_processing/watermark_engine.py | 1 - apps/worker/worker_app/tasks/asset_analyzer.py | 1 - apps/worker/worker_app/tasks/batch_download.py | 3 +-- apps/worker/worker_app/tasks/edit_plan_generation.py | 1 - apps/worker/worker_app/tasks/voice_extraction.py | 1 - packages/adapters/sqlalchemy_impl/template_repository.py | 1 - packages/adapters/tts/mock_tts_service.py | 1 - packages/application/tts_job/streaming_service.py | 1 - packages/application/tts_job/workflow.py | 3 --- packages/domain/filter_presets.py | 2 +- packages/domain/tts_config.py | 2 +- packages/shared/ffmpeg_utils.py | 2 -- pyproject.toml | 2 -- 29 files changed, 11 insertions(+), 43 deletions(-) diff --git a/apps/api/app/api/routes/edit_plans_clips_batch.py b/apps/api/app/api/routes/edit_plans_clips_batch.py index bb4a1fb7b..813878815 100755 --- a/apps/api/app/api/routes/edit_plans_clips_batch.py +++ b/apps/api/app/api/routes/edit_plans_clips_batch.py @@ -3,7 +3,7 @@ from __future__ import annotations import logging -from typing import Any, List, Optional +from typing import Any, List from app.auth import AuthenticatedUser, get_current_user from app.dependencies import get_db_session, get_project_repository diff --git a/apps/api/app/api/routes/edit_plans_cover.py b/apps/api/app/api/routes/edit_plans_cover.py index 13982ac6a..9fe466f9d 100755 --- a/apps/api/app/api/routes/edit_plans_cover.py +++ b/apps/api/app/api/routes/edit_plans_cover.py @@ -9,7 +9,7 @@ from __future__ import annotations import logging -from typing import Any, Dict, Optional +from typing import Any, Optional from app.auth import AuthenticatedUser, get_current_user from app.core.storage import get_storage_service diff --git a/apps/api/app/api/routes/edit_plans_filter.py b/apps/api/app/api/routes/edit_plans_filter.py index 5f9356a3f..fa9c00a37 100755 --- a/apps/api/app/api/routes/edit_plans_filter.py +++ b/apps/api/app/api/routes/edit_plans_filter.py @@ -20,7 +20,6 @@ from sqlalchemy.orm import Session from packages.domain.config_schemas import normalize_plan_config from packages.domain.filter_presets import ( FilterPreset, - build_ffmpeg_filter, get_filter_preset, list_filter_presets, ) diff --git a/apps/api/app/api/routes/edit_plans_timeline.py b/apps/api/app/api/routes/edit_plans_timeline.py index 29c82c7b7..afc108f1c 100755 --- a/apps/api/app/api/routes/edit_plans_timeline.py +++ b/apps/api/app/api/routes/edit_plans_timeline.py @@ -20,7 +20,7 @@ from app.api.routes.edit_plans import ( from app.auth import AuthenticatedUser, get_current_user from app.dependencies import get_db_session, get_project_repository from app.services import EditPlanService, PlanGeneratorService -from fastapi import APIRouter, Depends, HTTPException, Query, status +from fastapi import APIRouter, Depends, HTTPException, status from pydantic import BaseModel, Field from sqlalchemy.orm import Session diff --git a/apps/api/app/api/routes/task_center.py b/apps/api/app/api/routes/task_center.py index 0b2bca118..4804910fe 100755 --- a/apps/api/app/api/routes/task_center.py +++ b/apps/api/app/api/routes/task_center.py @@ -24,8 +24,6 @@ from app.schemas.task_center import ( from fastapi import APIRouter, Depends, HTTPException, Query from packages.application import ( - CreateGenerationTaskCommand, - CreateGenerationTaskUseCase, RetryGenerationTaskUseCase, SubmitIngestJobCommand, SubmitIngestJobUseCase, diff --git a/apps/api/app/api/routes/videos.py b/apps/api/app/api/routes/videos.py index 932c1672b..b3b325aa4 100755 --- a/apps/api/app/api/routes/videos.py +++ b/apps/api/app/api/routes/videos.py @@ -1,7 +1,5 @@ import logging -import uuid -from app.api.routes._helpers import check_project_access from app.auth import AuthenticatedUser, get_current_user from app.core.celery_app import celery_app from app.core.storage import OSSStorageService, get_storage_service diff --git a/apps/api/app/services/cover_service.py b/apps/api/app/services/cover_service.py index d7bc14248..b9453bee5 100644 --- a/apps/api/app/services/cover_service.py +++ b/apps/api/app/services/cover_service.py @@ -9,7 +9,7 @@ from __future__ import annotations import logging import tempfile from pathlib import Path -from typing import Any, Dict, Optional +from typing import Any, Dict logger = logging.getLogger(__name__) diff --git a/apps/api/app/services/edit_plan_service.py b/apps/api/app/services/edit_plan_service.py index 7696029ad..ee1ff055a 100644 --- a/apps/api/app/services/edit_plan_service.py +++ b/apps/api/app/services/edit_plan_service.py @@ -749,7 +749,7 @@ class EditPlanService: config["subtitles"] = subtitles clip.config = config - updated = self._clip_repo.update(clip) + self._clip_repo.update(clip) logger.info( "添加字幕: clip_id=%s subtitle_id=%s start=%.3fs end=%.3fs", diff --git a/apps/api/app/services/edit_template_service.py b/apps/api/app/services/edit_template_service.py index 7ee940258..7ed7ebea0 100755 --- a/apps/api/app/services/edit_template_service.py +++ b/apps/api/app/services/edit_template_service.py @@ -17,8 +17,6 @@ from packages.adapters.sqlalchemy_impl import ( SQLAlchemyEditTemplateRepository, SQLAlchemyTemplateClipConfigRepository, ) -from packages.domain.edit_plan import EditPlan -from packages.domain.edit_plan_clip import EditPlanClip from packages.domain.edit_template import EditTemplate, EditTemplateStatus from packages.domain.template_clip_config import ( ClipType, diff --git a/apps/worker/video_processing/bgm_mixer.py b/apps/worker/video_processing/bgm_mixer.py index a28320756..28aed58c5 100755 --- a/apps/worker/video_processing/bgm_mixer.py +++ b/apps/worker/video_processing/bgm_mixer.py @@ -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)) diff --git a/apps/worker/video_processing/color_grade_engine.py b/apps/worker/video_processing/color_grade_engine.py index afd6d852a..edf92b16f 100755 --- a/apps/worker/video_processing/color_grade_engine.py +++ b/apps/worker/video_processing/color_grade_engine.py @@ -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__) diff --git a/apps/worker/video_processing/concat_engine.py b/apps/worker/video_processing/concat_engine.py index 257827ab7..ecebfa60d 100755 --- a/apps/worker/video_processing/concat_engine.py +++ b/apps/worker/video_processing/concat_engine.py @@ -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 from video_processing.path_security import PathSecurityError, is_in_allowed_dirs, safe_resolve_path diff --git a/apps/worker/video_processing/intro_outro_engine.py b/apps/worker/video_processing/intro_outro_engine.py index d9d9b434c..b618a9261 100755 --- a/apps/worker/video_processing/intro_outro_engine.py +++ b/apps/worker/video_processing/intro_outro_engine.py @@ -160,7 +160,6 @@ class IntroOutroEngine: 是否成功 """ duration = config.intro_duration - bg = config.intro_background.lstrip("#") # 转义文字 title = config.intro_title.replace(":", "\\:").replace("'", "\\'") @@ -357,8 +356,6 @@ class IntroOutroEngine: 只传了片头或片尾也可以,缺失的自动跳过。 """ # 收集所有片段 - segments: list[tuple[Path, float]] = [] # (path, duration) - # 简单探测时长(用 ffprobe,这里简化处理:直接用 xfade 的 offset) # 先添加到列表 has_intro = intro_video is not None and intro_video.exists() diff --git a/apps/worker/video_processing/render_audio.py b/apps/worker/video_processing/render_audio.py index 43e5c5df2..c8df40640 100755 --- a/apps/worker/video_processing/render_audio.py +++ b/apps/worker/video_processing/render_audio.py @@ -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 diff --git a/apps/worker/video_processing/subtitle_render_engine.py b/apps/worker/video_processing/subtitle_render_engine.py index 4efaa24b6..cb4b82e31 100755 --- a/apps/worker/video_processing/subtitle_render_engine.py +++ b/apps/worker/video_processing/subtitle_render_engine.py @@ -24,13 +24,11 @@ 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.path_security import PathSecurityError, is_in_allowed_dirs, safe_resolve_path -from video_processing.render_subtitles import generate_ass_subtitles -from video_processing.subtitle_generator import generate_ass_from_timeline logger = logging.getLogger(__name__) diff --git a/apps/worker/video_processing/unified_render_service.py b/apps/worker/video_processing/unified_render_service.py index b63392f0e..668ed4ccb 100755 --- a/apps/worker/video_processing/unified_render_service.py +++ b/apps/worker/video_processing/unified_render_service.py @@ -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 diff --git a/apps/worker/video_processing/watermark_engine.py b/apps/worker/video_processing/watermark_engine.py index cc9c802d3..a1a1a83fd 100755 --- a/apps/worker/video_processing/watermark_engine.py +++ b/apps/worker/video_processing/watermark_engine.py @@ -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}", diff --git a/apps/worker/worker_app/tasks/asset_analyzer.py b/apps/worker/worker_app/tasks/asset_analyzer.py index 39babeedc..25f7ffb1d 100755 --- a/apps/worker/worker_app/tasks/asset_analyzer.py +++ b/apps/worker/worker_app/tasks/asset_analyzer.py @@ -11,7 +11,6 @@ from __future__ import annotations import json import logging import os -import subprocess import tempfile from dataclasses import dataclass, field diff --git a/apps/worker/worker_app/tasks/batch_download.py b/apps/worker/worker_app/tasks/batch_download.py index 404ce2766..c58911533 100755 --- a/apps/worker/worker_app/tasks/batch_download.py +++ b/apps/worker/worker_app/tasks/batch_download.py @@ -3,7 +3,6 @@ from __future__ import annotations import logging -import os import tempfile import uuid import zipfile @@ -25,7 +24,7 @@ def batch_download_videos(self, video_ids: list[str], user_id: str = "") -> dict Returns: {"download_url": "...", "file_count": N, "total_size": total_bytes} """ - from video_processing.oss_helpers import download_asset, upload_to_oss + from video_processing.oss_helpers import upload_to_oss from worker_app.db import SessionLocal from packages.adapters.sqlalchemy_impl.generated_video_repository import ( diff --git a/apps/worker/worker_app/tasks/edit_plan_generation.py b/apps/worker/worker_app/tasks/edit_plan_generation.py index c879a6632..3e5e974c1 100755 --- a/apps/worker/worker_app/tasks/edit_plan_generation.py +++ b/apps/worker/worker_app/tasks/edit_plan_generation.py @@ -439,7 +439,6 @@ def render_edit_plan(self, plan_id: str) -> dict: ) if task_status == "cancelled": logger.info("任务已被取消,中止渲染: plan_id=%s task_id=%s", plan_id, generation_task_id) - from packages.domain.edit_plan import EditPlanStatus if plan.status.value == "rendering": try: diff --git a/apps/worker/worker_app/tasks/voice_extraction.py b/apps/worker/worker_app/tasks/voice_extraction.py index dd20635bb..6c7a08fa8 100644 --- a/apps/worker/worker_app/tasks/voice_extraction.py +++ b/apps/worker/worker_app/tasks/voice_extraction.py @@ -2,7 +2,6 @@ import logging import os -import subprocess import tempfile from celery import Task diff --git a/packages/adapters/sqlalchemy_impl/template_repository.py b/packages/adapters/sqlalchemy_impl/template_repository.py index bccc4bbaa..e1860cc33 100755 --- a/packages/adapters/sqlalchemy_impl/template_repository.py +++ b/packages/adapters/sqlalchemy_impl/template_repository.py @@ -5,7 +5,6 @@ from __future__ import annotations import uuid from typing import List, Optional -from sqlalchemy import func from sqlalchemy.orm import Session from packages.adapters.sqlalchemy_impl.models import ( diff --git a/packages/adapters/tts/mock_tts_service.py b/packages/adapters/tts/mock_tts_service.py index 185c3344c..aa2cc9fd8 100755 --- a/packages/adapters/tts/mock_tts_service.py +++ b/packages/adapters/tts/mock_tts_service.py @@ -161,7 +161,6 @@ class MockTtsService(TtsService): tremolo_depth = 0.3 # 30% 深度 # 构建滤镜链 - filters: list[str] = [] # 生成基频 + 泛音(让声音更丰富) # 用多个 sine 波叠加模拟更自然的音色 diff --git a/packages/application/tts_job/streaming_service.py b/packages/application/tts_job/streaming_service.py index d509cd5d5..b1b5f8a5e 100644 --- a/packages/application/tts_job/streaming_service.py +++ b/packages/application/tts_job/streaming_service.py @@ -11,7 +11,6 @@ import asyncio import logging from typing import Any, Optional -import httpx from packages.application.cosyvoice_service import CosyVoiceError, CosyVoiceService from packages.application.tts_job.text_splitter import split_text diff --git a/packages/application/tts_job/workflow.py b/packages/application/tts_job/workflow.py index 0415a60cc..393c552a2 100644 --- a/packages/application/tts_job/workflow.py +++ b/packages/application/tts_job/workflow.py @@ -17,7 +17,6 @@ import tempfile from concurrent.futures import ThreadPoolExecutor, as_completed from typing import Optional -import httpx from packages.application.cosyvoice_service import CosyVoiceAuthError, CosyVoiceError, CosyVoiceService from packages.application.tts_job.audio_merger import AudioMerger @@ -27,10 +26,8 @@ from packages.ports.tts_job_repository import TTSJobRepository from packages.shared.storage import SharedStorageService, get_shared_storage_service from packages.shared.url_security import ( ALLOWED_AUDIO_MIME_TYPES, - UrlSecurityError, safe_download_bytes, safe_download_file, - validate_url_safety, ) logger = logging.getLogger(__name__) diff --git a/packages/domain/filter_presets.py b/packages/domain/filter_presets.py index 3a347dacd..f2344a391 100755 --- a/packages/domain/filter_presets.py +++ b/packages/domain/filter_presets.py @@ -7,7 +7,7 @@ from __future__ import annotations from dataclasses import dataclass, field -from typing import Dict, List, Optional +from typing import List, Optional @dataclass(frozen=True) diff --git a/packages/domain/tts_config.py b/packages/domain/tts_config.py index 76206152e..790c1cc80 100755 --- a/packages/domain/tts_config.py +++ b/packages/domain/tts_config.py @@ -2,7 +2,7 @@ from __future__ import annotations -from dataclasses import dataclass, field +from dataclasses import dataclass from typing import Any, Optional diff --git a/packages/shared/ffmpeg_utils.py b/packages/shared/ffmpeg_utils.py index 6518001ca..fbe1281b2 100755 --- a/packages/shared/ffmpeg_utils.py +++ b/packages/shared/ffmpeg_utils.py @@ -11,8 +11,6 @@ from __future__ import annotations import logging import shutil import subprocess # nosec B404 -from pathlib import Path -from typing import Any logger = logging.getLogger(__name__) diff --git a/pyproject.toml b/pyproject.toml index 06003dc3b..39a9a131c 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -89,10 +89,8 @@ ignore = [ "W291", "W293", "B008", # function-call-in-default-argument(FastAPI 依赖注入模式,大量使用) - "F401", # unused-import "F403", "F405", - "F841", # unused-variable ] [tool.ruff.lint.per-file-ignores] -- 2.54.0 From edf1fde323f50508cc4040ff8dc737efe9512a66 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Fri, 17 Jul 2026 13:51:10 +0800 Subject: [PATCH 2/3] fix: isort import????(ruff?F401???????) --- packages/application/tts_job/streaming_service.py | 1 - packages/application/tts_job/workflow.py | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/application/tts_job/streaming_service.py b/packages/application/tts_job/streaming_service.py index b1b5f8a5e..b9ded2270 100644 --- a/packages/application/tts_job/streaming_service.py +++ b/packages/application/tts_job/streaming_service.py @@ -11,7 +11,6 @@ import asyncio import logging from typing import Any, Optional - from packages.application.cosyvoice_service import CosyVoiceError, CosyVoiceService from packages.application.tts_job.text_splitter import split_text from packages.shared.url_security import ALLOWED_AUDIO_MIME_TYPES, safe_download_bytes diff --git a/packages/application/tts_job/workflow.py b/packages/application/tts_job/workflow.py index 393c552a2..137ab4b77 100644 --- a/packages/application/tts_job/workflow.py +++ b/packages/application/tts_job/workflow.py @@ -17,7 +17,6 @@ import tempfile from concurrent.futures import ThreadPoolExecutor, as_completed from typing import Optional - from packages.application.cosyvoice_service import CosyVoiceAuthError, CosyVoiceError, CosyVoiceService from packages.application.tts_job.audio_merger import AudioMerger from packages.application.tts_job.text_splitter import split_text -- 2.54.0 From 9f066026344b8962c8379da366bbcbf0b69daa4d Mon Sep 17 00:00:00 2001 From: CI Bot Date: Fri, 17 Jul 2026 14:02:20 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20black=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=EF=BC=88=E7=A7=BB=E9=99=A4=E6=9C=AA=E4=BD=BF?= =?UTF-8?q?=E7=94=A8import=E5=90=8E=E9=87=8D=E6=8E=92=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/api/app/api/routes/videos.py | 8 +++++--- apps/worker/video_processing/intro_outro_engine.py | 4 +--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/api/app/api/routes/videos.py b/apps/api/app/api/routes/videos.py index b3b325aa4..8a834c6a4 100755 --- a/apps/api/app/api/routes/videos.py +++ b/apps/api/app/api/routes/videos.py @@ -108,7 +108,9 @@ def update_video_review_status( item = use_case.execute(video_id, request.review_status) if item is None: raise HTTPException(status_code=404, detail="Video not found") - logger.info("Video %s review status updated to %s by user %s", video_id, request.review_status, current_user.user_id) + logger.info( + "Video %s review status updated to %s by user %s", video_id, request.review_status, current_user.user_id + ) return _to_video_response(item, storage) @@ -119,7 +121,7 @@ def batch_download_videos( current_user: AuthenticatedUser = Depends(get_current_user), ): """批量下载成片,异步打包 zip。 - + 传入 video_ids 列表,创建一个批量下载任务,任务完成后返回 zip 下载链接。 """ if not request.video_ids: @@ -152,7 +154,7 @@ def get_batch_download_status( from celery.result import AsyncResult task = AsyncResult(job_id, app=celery_app) - + status_map = { "PENDING": "pending", "STARTED": "running", diff --git a/apps/worker/video_processing/intro_outro_engine.py b/apps/worker/video_processing/intro_outro_engine.py index b618a9261..067bc093d 100755 --- a/apps/worker/video_processing/intro_outro_engine.py +++ b/apps/worker/video_processing/intro_outro_engine.py @@ -177,9 +177,7 @@ class IntroOutroEngine: filter_parts = [] # 背景 - filter_parts.append( - f"color=c={config.intro_background}:s={output_width}x{output_height}:d={duration}[bg]" - ) + filter_parts.append(f"color=c={config.intro_background}:s={output_width}x{output_height}:d={duration}[bg]") # 标题 if title: -- 2.54.0