diff --git a/apps/api/app/services/plan_generator_service.py b/apps/api/app/services/plan_generator_service.py index 0bf79f168..9830717ba 100755 --- a/apps/api/app/services/plan_generator_service.py +++ b/apps/api/app/services/plan_generator_service.py @@ -206,4 +206,3 @@ class PlanGeneratorService: 委托给 plan_generator_utils.distribute_assets 纯函数。 """ distribute_assets(clips, asset_ids, editing_mode) - diff --git a/apps/api/app/services/smart_asset_selector.py b/apps/api/app/services/smart_asset_selector.py index 65f2aa8c1..d0b28594c 100755 --- a/apps/api/app/services/smart_asset_selector.py +++ b/apps/api/app/services/smart_asset_selector.py @@ -21,14 +21,14 @@ from __future__ import annotations import logging +from packages.domain.asset_scoring import MEDIUM_BUCKET_MAX as _MEDIUM_BUCKET_MAX +from packages.domain.asset_scoring import MIN_QUALITY_SCORE as _MIN_QUALITY_SCORE +from packages.domain.asset_scoring import OPTIMAL_DURATION_MAX as _OPTIMAL_DURATION_MAX +from packages.domain.asset_scoring import OPTIMAL_DURATION_MIN as _OPTIMAL_DURATION_MIN +from packages.domain.asset_scoring import SHORT_BUCKET_MAX as _SHORT_BUCKET_MAX +from packages.domain.asset_scoring import TARGET_HEIGHT as _TARGET_HEIGHT +from packages.domain.asset_scoring import TARGET_WIDTH as _TARGET_WIDTH from packages.domain.asset_scoring import ( - MEDIUM_BUCKET_MAX as _MEDIUM_BUCKET_MAX, - MIN_QUALITY_SCORE as _MIN_QUALITY_SCORE, - OPTIMAL_DURATION_MAX as _OPTIMAL_DURATION_MAX, - OPTIMAL_DURATION_MIN as _OPTIMAL_DURATION_MIN, - SHORT_BUCKET_MAX as _SHORT_BUCKET_MAX, - TARGET_HEIGHT as _TARGET_HEIGHT, - TARGET_WIDTH as _TARGET_WIDTH, AssetScoreDetail, SmartSelectResult, diverse_selection, diff --git a/apps/web/src/pages/editing-planner/components/pip-config/LayerConfig.tsx b/apps/web/src/pages/editing-planner/components/pip-config/LayerConfig.tsx index 72a3e82f3..2fb7842c5 100755 --- a/apps/web/src/pages/editing-planner/components/pip-config/LayerConfig.tsx +++ b/apps/web/src/pages/editing-planner/components/pip-config/LayerConfig.tsx @@ -2,7 +2,12 @@ * 混剪单图层配置区 */ import React from "react" -import type { PipLayer, PipAnimType, PipSlideDirection, PipGridPosition } from "@/pages/editing-planner/types" +import type { + PipLayer, + PipAnimType, + PipSlideDirection, + PipGridPosition, +} from "@/pages/editing-planner/types" import { GRID_POSITIONS, ANIM_OPTIONS, diff --git a/apps/worker/worker_app/tasks/generation.py b/apps/worker/worker_app/tasks/generation.py index 2237c07ee..279b054d5 100755 --- a/apps/worker/worker_app/tasks/generation.py +++ b/apps/worker/worker_app/tasks/generation.py @@ -20,19 +20,21 @@ import time from pathlib import Path from typing import Any +from video_processing.ffmpeg_utils import probe_duration from worker_app.celery_app import celery_app from worker_app.db import SessionLocal - -from packages.domain.bgm_utils import merge_bgm_config -from video_processing.ffmpeg_utils import probe_duration +from worker_app.tasks.generation_plan_builder import VirtualClip as _VirtualClip +from worker_app.tasks.generation_plan_builder import VirtualPlan as _VirtualPlan +from worker_app.tasks.generation_plan_builder import apply_template_clip_effects as _apply_template_clip_effects from worker_app.tasks.generation_plan_builder import ( - VirtualPlan as _VirtualPlan, - VirtualClip as _VirtualClip, - build_error_info as _build_error_info, - extract_intro_outro_from_clip_configs as _extract_intro_outro_from_clip_configs, - apply_template_clip_effects as _apply_template_clip_effects, build_clips_by_mode, ) +from worker_app.tasks.generation_plan_builder import build_error_info as _build_error_info +from worker_app.tasks.generation_plan_builder import ( + extract_intro_outro_from_clip_configs as _extract_intro_outro_from_clip_configs, +) + +from packages.domain.bgm_utils import merge_bgm_config OUTPUT_WIDTH = 1280 OUTPUT_HEIGHT = 720 diff --git a/packages/domain/plan_generator_utils.py b/packages/domain/plan_generator_utils.py index 4bca02417..155a38516 100755 --- a/packages/domain/plan_generator_utils.py +++ b/packages/domain/plan_generator_utils.py @@ -321,11 +321,7 @@ def create_clips_from_configs( clip_type = cfg.clip_type.value if hasattr(cfg.clip_type, "value") else cfg.clip_type # transition_effect 可能是枚举或字符串 - transition = ( - cfg.transition_effect.value - if hasattr(cfg.transition_effect, "value") - else cfg.transition_effect - ) + transition = cfg.transition_effect.value if hasattr(cfg.transition_effect, "value") else cfg.transition_effect # 从 clip config 中解析 playback_speed(兼容 speed_ratio 字段名) clip_cfg = cfg.config or {} diff --git a/tests/unit/test_asset_scoring.py b/tests/unit/test_asset_scoring.py index 3b1e47619..4a58a1313 100755 --- a/tests/unit/test_asset_scoring.py +++ b/tests/unit/test_asset_scoring.py @@ -19,19 +19,19 @@ from typing import Optional import pytest from packages.domain.asset_scoring import ( - AssetScoreDetail, MEDIUM_BUCKET_MAX, MIN_QUALITY_SCORE, OPTIMAL_DURATION_MAX, OPTIMAL_DURATION_MIN, SHORT_BUCKET_MAX, - SmartSelectResult, TARGET_HEIGHT, TARGET_WIDTH, WEIGHT_BITRATE, WEIGHT_DURATION, WEIGHT_QUALITY, WEIGHT_RESOLUTION, + AssetScoreDetail, + SmartSelectResult, _bucket_by_duration, calculate_total_score, diverse_selection, diff --git a/tests/unit/test_generation_plan_builder.py b/tests/unit/test_generation_plan_builder.py index a34383477..c7d537693 100755 --- a/tests/unit/test_generation_plan_builder.py +++ b/tests/unit/test_generation_plan_builder.py @@ -15,7 +15,6 @@ from typing import Any from unittest.mock import patch import pytest - from worker_app.tasks.generation_plan_builder import ( VirtualClip, VirtualPlan, diff --git a/tests/unit/test_plan_generator_utils.py b/tests/unit/test_plan_generator_utils.py index be7a15d27..53c67463b 100755 --- a/tests/unit/test_plan_generator_utils.py +++ b/tests/unit/test_plan_generator_utils.py @@ -17,7 +17,6 @@ from packages.domain.plan_generator_utils import ( ) from packages.domain.template_clip_config import ClipType, TemplateClipConfig - # ── 辅助函数 ────────────────────────────────────────────────────────── @@ -184,11 +183,7 @@ class TestDistributeVoicePip: def test_three_assets_full_distribution(self): """3个素材:background + corner_voice + b_roll 各一个.""" - clips = ( - _make_clips(1, "background") - + _make_clips(1, "corner_voice") - + _make_clips(1, "b_roll") - ) + clips = _make_clips(1, "background") + _make_clips(1, "corner_voice") + _make_clips(1, "b_roll") distribute_assets(clips, ["a1", "a2", "a3"], EditingMode.VOICE_PIP.value) bgs = [c for c in clips if c.clip_type == "background"] voices = [c for c in clips if c.clip_type == "corner_voice"] @@ -199,11 +194,7 @@ class TestDistributeVoicePip: def test_single_asset_only_background(self): """1个素材:只分配给 background.""" - clips = ( - _make_clips(1, "background") - + _make_clips(1, "corner_voice") - + _make_clips(2, "b_roll") - ) + clips = _make_clips(1, "background") + _make_clips(1, "corner_voice") + _make_clips(2, "b_roll") distribute_assets(clips, ["a1"], EditingMode.VOICE_PIP.value) assert clips[0].asset_id == "a1" assert clips[1].asset_id == "" @@ -212,11 +203,7 @@ class TestDistributeVoicePip: def test_two_assets_bg_and_voice(self): """2个素材:background + corner_voice.""" - clips = ( - _make_clips(1, "background") - + _make_clips(1, "corner_voice") - + _make_clips(2, "b_roll") - ) + clips = _make_clips(1, "background") + _make_clips(1, "corner_voice") + _make_clips(2, "b_roll") distribute_assets(clips, ["a1", "a2"], EditingMode.VOICE_PIP.value) bgs = [c for c in clips if c.clip_type == "background"] voices = [c for c in clips if c.clip_type == "corner_voice"] @@ -227,11 +214,7 @@ class TestDistributeVoicePip: def test_many_broll_clips(self): """多个 b_roll clip:按顺序分配剩余素材.""" - clips = ( - _make_clips(1, "background") - + _make_clips(1, "corner_voice") - + _make_clips(5, "b_roll") - ) + clips = _make_clips(1, "background") + _make_clips(1, "corner_voice") + _make_clips(5, "b_roll") distribute_assets( clips, ["a1", "a2", "a3", "a4", "a5"], @@ -337,11 +320,7 @@ class TestMapClipTypesForMode: def test_non_main_clips_unchanged(self): """非 MAIN 类型 clip 不受影响.""" - clips = ( - _make_clips(1, "intro") - + _make_clips(3) # main - + _make_clips(1, "outro") - ) + clips = _make_clips(1, "intro") + _make_clips(3) + _make_clips(1, "outro") # main map_clip_types_for_mode(clips, EditingMode.PIP.value) assert clips[0].clip_type == "intro" assert clips[1].clip_type == "main" # 第1个 main