From 156390b6762565a38553c1bc2ecf71096d35622d Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 10:51:18 +0800 Subject: [PATCH 1/7] =?UTF-8?q?fix(ci):=20=E4=BF=AE=E5=A4=8Ddevelop?= =?UTF-8?q?=E5=88=86=E6=94=AFCI=E6=A0=B8=E5=BF=83=E9=93=BE=E8=B7=AF?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复项: 1. Code Quality: 修复F401未使用import + 配置tests目录忽略B011(assert-false) 2. Unit Tests(14个失败): - shared.url_security补全ALLOWED_VIDEO_MIME_TYPES re-export - video_processing.__init__导出url_security子模块 - test_classification更新AssetLibraryKind(新增IMAGE) - test_multi_track_subtitle_concat修复POSITION_ALIGNMENT导入路径 3. Frontend Unit Tests: 更新useGenerateVideo测试为实际存在的导出 --- .../src/test/pages/generate/useGenerateVideo.test.ts | 12 ++++++------ apps/worker/video_processing/__init__.py | 3 ++- apps/worker/video_processing/speed_engine.py | 2 -- packages/shared/url_security.py | 1 + pyproject.toml | 2 ++ tests/unit/domain/test_classification.py | 9 ++++++--- tests/unit/test_multi_track_subtitle_concat.py | 3 ++- 7 files changed, 19 insertions(+), 13 deletions(-) diff --git a/apps/web/src/test/pages/generate/useGenerateVideo.test.ts b/apps/web/src/test/pages/generate/useGenerateVideo.test.ts index a93b67dc2..dd523e064 100755 --- a/apps/web/src/test/pages/generate/useGenerateVideo.test.ts +++ b/apps/web/src/test/pages/generate/useGenerateVideo.test.ts @@ -8,14 +8,14 @@ import type { UseGenerateVideoProps, GenerationPhase, } from "@/pages/generate/hooks/generate-video/types" -import { getNextPhase, PHASE_ORDER } from "@/pages/generate/hooks/generate-video/phase" -import { extractErrorMessage } from "@/pages/generate/hooks/generate-video/errorUtils" -import { getDefaultVoiceConfig } from "@/pages/generate/hooks/generate-video/voiceConfig" +import { getGenerationPhase } from "@/pages/generate/hooks/generate-video/phase" +import { extractBackendError } from "@/pages/generate/hooks/generate-video/errorUtils" +import { buildVoiceConfig } from "@/pages/generate/hooks/generate-video/voiceConfig" describe("generate-video module smoke test", () => { it("should load all generate-video modules", () => { - expect(PHASE_ORDER.length).toBeGreaterThan(0) - expect(typeof extractErrorMessage).toBe("function") - expect(typeof getDefaultVoiceConfig).toBe("function") + expect(typeof getGenerationPhase).toBe("function") + expect(typeof extractBackendError).toBe("function") + expect(typeof buildVoiceConfig).toBe("function") }) }) diff --git a/apps/worker/video_processing/__init__.py b/apps/worker/video_processing/__init__.py index e84d30c6c..d45325dae 100644 --- a/apps/worker/video_processing/__init__.py +++ b/apps/worker/video_processing/__init__.py @@ -8,10 +8,11 @@ packages / DB 等重依赖。 """ # 共享工具模块(零外部依赖,供 editing_modes / generation / edit_plan_generation 等复用) -from . import dedup_helpers, ffmpeg_utils, oss_helpers +from . import dedup_helpers, ffmpeg_utils, oss_helpers, url_security __all__ = [ "ffmpeg_utils", "oss_helpers", "dedup_helpers", + "url_security", ] diff --git a/apps/worker/video_processing/speed_engine.py b/apps/worker/video_processing/speed_engine.py index ac56a2d05..5c2d92f4d 100755 --- a/apps/worker/video_processing/speed_engine.py +++ b/apps/worker/video_processing/speed_engine.py @@ -15,8 +15,6 @@ from __future__ import annotations from packages.domain.speed_config import ( DEFAULT_SPEED, - MAX_SPEED, - MIN_SPEED, SpeedConfig, _split_atempo_stages, ) diff --git a/packages/shared/url_security.py b/packages/shared/url_security.py index a198f6a72..518074816 100755 --- a/packages/shared/url_security.py +++ b/packages/shared/url_security.py @@ -24,6 +24,7 @@ from urllib.parse import urljoin from packages.domain.url_security import ALLOWED_AUDIO_MIME_TYPES as _allowed_audio_base from packages.domain.url_security import ALLOWED_IMAGE_MIME_TYPES as _allowed_image_base +from packages.domain.url_security import ALLOWED_VIDEO_MIME_TYPES as _allowed_video_base from packages.domain.url_security import ALLOWED_PORTS as _allowed_ports_base from packages.domain.url_security import ALLOWED_SCHEMES as _allowed_schemes_base from packages.domain.url_security import MAX_URL_LENGTH as _max_url_length_base diff --git a/pyproject.toml b/pyproject.toml index 39a9a131c..b3703100b 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,3 +102,5 @@ ignore = [ "apps/api/app/middleware/auth.py" = ["ALL"] "apps/*/migrations/*" = ["ALL"] "alembic/*" = ["ALL"] + +"tests/**" = ["B011"] \ No newline at end of file diff --git a/tests/unit/domain/test_classification.py b/tests/unit/domain/test_classification.py index 09077950a..7fdd31f3e 100644 --- a/tests/unit/domain/test_classification.py +++ b/tests/unit/domain/test_classification.py @@ -18,9 +18,9 @@ from packages.domain.classification import ( class TestAssetLibraryKind: """AssetLibraryKind 枚举测试.""" - def test_two_values(self): - """视频和配音两类.""" - assert len(AssetLibraryKind) == 2 + def test_three_values(self): + """视频/配音/图片三类.""" + assert len(AssetLibraryKind) == 3 def test_video(self): assert AssetLibraryKind.VIDEO == "video" @@ -28,6 +28,9 @@ class TestAssetLibraryKind: def test_voice(self): assert AssetLibraryKind.VOICE == "voice" + def test_image(self): + assert AssetLibraryKind.IMAGE == "image" + def test_str_compatible(self): """StrEnum 字符串兼容.""" assert AssetLibraryKind.VIDEO == "video" diff --git a/tests/unit/test_multi_track_subtitle_concat.py b/tests/unit/test_multi_track_subtitle_concat.py index f24c83296..6a727931f 100755 --- a/tests/unit/test_multi_track_subtitle_concat.py +++ b/tests/unit/test_multi_track_subtitle_concat.py @@ -468,7 +468,8 @@ class TestSubtitleStyle: assert style3.alignment == 5 def test_9grid_positions(self): - from video_processing.subtitle_render_engine import POSITION_ALIGNMENT, SubtitleStyle + from packages.domain.subtitle_style import POSITION_ALIGNMENT + from video_processing.subtitle_render_engine import SubtitleStyle for pos, align in POSITION_ALIGNMENT.items(): style = SubtitleStyle.from_dict({"position": pos}) -- 2.54.0 From 846e267b11175778d81c49df8ef741d33c3bc470 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Wed, 29 Jul 2026 02:54:16 +0000 Subject: [PATCH 2/7] style: auto-format with black + isort + prettier [skip ci-format-check] --- packages/shared/url_security.py | 2 +- tests/unit/test_multi_track_subtitle_concat.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/shared/url_security.py b/packages/shared/url_security.py index 518074816..7091f2c9e 100755 --- a/packages/shared/url_security.py +++ b/packages/shared/url_security.py @@ -24,9 +24,9 @@ from urllib.parse import urljoin from packages.domain.url_security import ALLOWED_AUDIO_MIME_TYPES as _allowed_audio_base from packages.domain.url_security import ALLOWED_IMAGE_MIME_TYPES as _allowed_image_base -from packages.domain.url_security import ALLOWED_VIDEO_MIME_TYPES as _allowed_video_base from packages.domain.url_security import ALLOWED_PORTS as _allowed_ports_base from packages.domain.url_security import ALLOWED_SCHEMES as _allowed_schemes_base +from packages.domain.url_security import ALLOWED_VIDEO_MIME_TYPES as _allowed_video_base from packages.domain.url_security import MAX_URL_LENGTH as _max_url_length_base from packages.domain.url_security import UrlSecurityError as _UrlSecurityError_base from packages.domain.url_security import check_internal_hostname as _check_internal_hostname_base diff --git a/tests/unit/test_multi_track_subtitle_concat.py b/tests/unit/test_multi_track_subtitle_concat.py index 6a727931f..b1383b25d 100755 --- a/tests/unit/test_multi_track_subtitle_concat.py +++ b/tests/unit/test_multi_track_subtitle_concat.py @@ -468,9 +468,10 @@ class TestSubtitleStyle: assert style3.alignment == 5 def test_9grid_positions(self): - from packages.domain.subtitle_style import POSITION_ALIGNMENT from video_processing.subtitle_render_engine import SubtitleStyle + from packages.domain.subtitle_style import POSITION_ALIGNMENT + for pos, align in POSITION_ALIGNMENT.items(): style = SubtitleStyle.from_dict({"position": pos}) assert style.position == pos -- 2.54.0 From 79f4865a88546401b6b000242c155cde2d3a5f14 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 10:57:39 +0800 Subject: [PATCH 3/7] =?UTF-8?q?fix(ci):=20=E8=A1=A5=E5=85=A8=20ALLOWED=5FV?= =?UTF-8?q?IDEO=5FMIME=5FTYPES=20=E5=AF=BC=E5=87=BA=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20F401=20=E6=9C=AA=E4=BD=BF=E7=94=A8=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/shared/url_security.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/shared/url_security.py b/packages/shared/url_security.py index 7091f2c9e..5be0c09a1 100755 --- a/packages/shared/url_security.py +++ b/packages/shared/url_security.py @@ -43,6 +43,7 @@ ALLOWED_SCHEMES = set(_allowed_schemes_base) ALLOWED_PORTS = set(_allowed_ports_base) ALLOWED_AUDIO_MIME_TYPES = set(_allowed_audio_base) ALLOWED_IMAGE_MIME_TYPES = set(_allowed_image_base) +ALLOWED_VIDEO_MIME_TYPES = set(_allowed_video_base) MAX_URL_LENGTH = _max_url_length_base UrlSecurityError = _UrlSecurityError_base -- 2.54.0 From cfc7f2435d86ebb18b702e980f325430dcd8087b Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 11:15:37 +0800 Subject: [PATCH 4/7] =?UTF-8?q?fix(ci):=20speed=5Fengine=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=90=91=E5=90=8E=E5=85=BC=E5=AE=B9=E7=9A=84=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=BA=A7=E5=AF=BC=E5=87=BA=EF=BC=88MAX=5FSPEED/MIN=5FSPEED/?= =?UTF-8?q?=E7=BA=AF=E5=87=BD=E6=95=B0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/worker/video_processing/speed_engine.py | 34 ++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/apps/worker/video_processing/speed_engine.py b/apps/worker/video_processing/speed_engine.py index 5c2d92f4d..82100e284 100755 --- a/apps/worker/video_processing/speed_engine.py +++ b/apps/worker/video_processing/speed_engine.py @@ -15,6 +15,8 @@ from __future__ import annotations from packages.domain.speed_config import ( DEFAULT_SPEED, + MAX_SPEED, + MIN_SPEED, SpeedConfig, _split_atempo_stages, ) @@ -68,3 +70,35 @@ class SpeedEngine: ) -> float: """从 clip config 中解析 playback_speed,0 或缺失则使用全局速度.""" return _resolve_clip_speed_base(clip_config, global_speed) + + +# ── 向后兼容:模块级函数(重构前的 API) ───────────────────────── +def build_video_filter(config): + """向后兼容:模块级 build_video_filter.""" + return _build_video_filter_base(config) + + +def build_audio_filter(config): + """向后兼容:模块级 build_audio_filter.""" + return _build_audio_filter_base(config) + + +def adjust_duration(original_duration, config): + """向后兼容:模块级 adjust_duration.""" + return _adjust_duration_base(original_duration, config) + + +def resolve_clip_speed(clip_config, global_speed=DEFAULT_SPEED): + """向后兼容:模块级 resolve_clip_speed.""" + return _resolve_clip_speed_base(clip_config, global_speed) + + +def build_clip_speed_filter(speed, pitch_correct=True): + """向后兼容:模块级 build_clip_speed_filter.""" + config = SpeedConfig(speed=speed, pitch_correct=pitch_correct) + config.clamp() + return ( + build_video_filter(config), + build_audio_filter(config), + config, + ) -- 2.54.0 From 928b6e88ff318b0ee141589a946a81b6ddb74741 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Wed, 29 Jul 2026 11:26:22 +0800 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4speed=5Fengine?= =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E7=9A=84MAX=5FSPEED/MIN=5FSPEED?= =?UTF-8?q?=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/worker/video_processing/speed_engine.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/worker/video_processing/speed_engine.py b/apps/worker/video_processing/speed_engine.py index 82100e284..dcbd4e68d 100755 --- a/apps/worker/video_processing/speed_engine.py +++ b/apps/worker/video_processing/speed_engine.py @@ -15,8 +15,6 @@ from __future__ import annotations from packages.domain.speed_config import ( DEFAULT_SPEED, - MAX_SPEED, - MIN_SPEED, SpeedConfig, _split_atempo_stages, ) -- 2.54.0 From c327ddd2c33761bb308a04fad333c5d3404045e6 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Wed, 29 Jul 2026 11:48:47 +0800 Subject: [PATCH 6/7] =?UTF-8?q?fix(ci):=20=E6=B7=BB=E5=8A=A0MAX=5FSPEED/MI?= =?UTF-8?q?N=5FSPEED=E5=90=91=E5=90=8E=E5=85=BC=E5=AE=B9=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=EF=BC=88=E5=B8=A6noqa=E9=98=B2=E6=AD=A2=E8=A2=ABauto-format?= =?UTF-8?q?=E5=88=A0=E9=99=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/worker/video_processing/speed_engine.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/worker/video_processing/speed_engine.py b/apps/worker/video_processing/speed_engine.py index dcbd4e68d..2a7b1684a 100755 --- a/apps/worker/video_processing/speed_engine.py +++ b/apps/worker/video_processing/speed_engine.py @@ -19,6 +19,8 @@ from packages.domain.speed_config import ( _split_atempo_stages, ) from packages.domain.speed_config import adjust_duration as _adjust_duration_base # noqa: F401 — 向后兼容 +from packages.domain.speed_config import MAX_SPEED # noqa: F401 — 向后兼容 +from packages.domain.speed_config import MIN_SPEED # noqa: F401 — 向后兼容 from packages.domain.speed_config import build_audio_filter as _build_audio_filter_base from packages.domain.speed_config import build_video_filter as _build_video_filter_base from packages.domain.speed_config import resolve_clip_speed as _resolve_clip_speed_base -- 2.54.0 From 91c5e4eab7ebe01e13f64d0e40109561757291fb Mon Sep 17 00:00:00 2001 From: CI Bot Date: Wed, 29 Jul 2026 03:52:00 +0000 Subject: [PATCH 7/7] style: auto-format with black + isort + prettier [skip ci-format-check] --- apps/worker/video_processing/speed_engine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/worker/video_processing/speed_engine.py b/apps/worker/video_processing/speed_engine.py index 2a7b1684a..4ad3e6b55 100755 --- a/apps/worker/video_processing/speed_engine.py +++ b/apps/worker/video_processing/speed_engine.py @@ -13,14 +13,14 @@ from __future__ import annotations +from packages.domain.speed_config import MAX_SPEED # noqa: F401 — 向后兼容 +from packages.domain.speed_config import MIN_SPEED # noqa: F401 — 向后兼容 from packages.domain.speed_config import ( DEFAULT_SPEED, SpeedConfig, _split_atempo_stages, ) from packages.domain.speed_config import adjust_duration as _adjust_duration_base # noqa: F401 — 向后兼容 -from packages.domain.speed_config import MAX_SPEED # noqa: F401 — 向后兼容 -from packages.domain.speed_config import MIN_SPEED # noqa: F401 — 向后兼容 from packages.domain.speed_config import build_audio_filter as _build_audio_filter_base from packages.domain.speed_config import build_video_filter as _build_video_filter_base from packages.domain.speed_config import resolve_clip_speed as _resolve_clip_speed_base -- 2.54.0