feat: 跨视频片段避让 — 生成前注入已用区间 #1670 #1671
Reference in New Issue
Block a user
Delete Branch "feat/cross-video-avoidance-1670"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
生成新视频(含预览和正式生成)时,查询该用户已有视频使用过的素材区间,注入到片段截取逻辑中,让新视频避开已被大量使用的片段,降低不同视频之间的画面重复率。
改动
1. Repository 层
edit_plan_clip_repository.py新增list_used_segments_by_user()edit_plans表,按created_by_user_id+status=completed过滤status=rendered且asset_id非空的 clipscreated_at DESC取最近 50 个 plan{asset_id: [(start_time, start_time + duration), ...]}2. Domain 层
distribute_assets()及所有_distribute_*子函数新增external_used_segments参数used_segments,让_resolve_start_time/_calc_random_start_time自动避让external_used_segments=None时行为不变(向后兼容)3. Service 层
_distribute_assets()新增user_id参数generate_from_template()透传created_by_user_id4. 单元测试
技术约束
external_used_segments深拷贝,不修改外部数据Closes #1670
- Repository: list_used_segments_by_user() JOIN edit_plans 查用户最近 已完成 plan 的已渲染 clips,聚合为 {asset_id: [(start, end), ...]} - Domain: distribute_assets / _distribute_* 子函数新增 external_used_segments 参数,深拷贝注入 used_segments,让 _resolve_start_time 自动避让 - Service: _distribute_assets 新增 user_id 参数,预览和正式生成都查询 已用区间;查询失败时不阻塞,回退纯随机 - 12 个单元测试覆盖 Repository/Domain/Service 三层🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
无
💡 改进建议(不阻塞合并)
[packages/domain/plan_generator_utils.py: 多处] 代码重复
_distribute_one_take、_distribute_pip、_distribute_voice_over、_distribute_voice_pip四个函数中均存在完全相同的used_segments初始化逻辑{k: list(v) for k, v in external_used_segments.items()} if external_used_segments else {}。建议将此逻辑提取为distribute_assets内部的一个局部变量处理,或封装为辅助函数,以减少重复代码。[apps/api/app/services/plan_generator_service.py: 248] 日志信息增强
user_id加入日志信息中(如f"跨视频避让查询失败 (user_id={user_id}),回退到纯随机"),以便在生产环境中排查特定用户的问题。[packages/adapters/sqlalchemy_impl/edit_plan_clip_repository.py: 142-168] 查询性能优化
limit_recent限制了数据量,性能影响可控,但可以考虑使用join或子查询在单次查询中完成,减少网络往返开销。✅ 良好实践
plan_generator_service.py中对list_used_segments_by_user进行了 try-except 包裹,查询失败时回退到纯随机模式,避免了因辅助功能异常阻塞核心生成流程,增强了系统鲁棒性。plan_generator_utils.py中通过列表推导式{k: list(v) ...}对external_used_segments进行了浅拷贝,防止内部逻辑修改外部传入的数据结构,保证了数据的一致性。list_used_segments_by_user中对空user_id和空查询结果进行了前置检查,避免了无效的数据库查询。✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能表现良好
🤖 由 AI 代码审查机器人自动生成 | 2026-09-03 14:28:26 | 模型:
🗑️ 预览环境已清理
PR #1671 已关闭或合并,对应的预览环境已被清理。