feat: 片段分割与合并 - 时间线剪刀工具后端能力 #393

Merged
xiaoxia merged 3 commits from feat/clip-split-merge into develop 2026-07-17 09:18:30 +08:00
Owner

功能

时间线编辑器核心操作:片段分割(剪刀工具)+ 片段合并。

Service 层

split_clip(clip_id, split_time)

  • 指定时间点一分为二,左片段缩短,新增右片段
  • 后续片段 order 自动 +1
  • 有素材的片段自动设置 trim_start/trim_end
  • 属性完整继承:类型/转场/速度/config/文案

merge_clips(clip_ids)

  • 多个连续同类型片段合并为一个
  • 校验规则:同计划 / order连续 / 类型一致 / 至少2个
  • 时长累加、文案拼接、config合并(后者覆盖前者)
  • 自动清理 trim 字段,后续片段 order 前移

API

  • POST /api/v1/edit-plans/clips/{clip_id}/split — 分割片段
  • POST /api/v1/edit-plans/clips/merge — 合并片段
  • 均带项目级权限校验

测试

67 passed(原50 + 新增17),零回归

分割 7 个:基础分割/属性继承/后续重排/边界校验/负数校验/不存在/素材裁剪
合并 10 个:两片段/后续重排/三片段/类型不一致/不连续/单个不足/跨计划/清理trim/分割再合并闭环

## 功能 时间线编辑器核心操作:片段分割(剪刀工具)+ 片段合并。 ## Service 层 ### split_clip(clip_id, split_time) - 指定时间点一分为二,左片段缩短,新增右片段 - 后续片段 order 自动 +1 - 有素材的片段自动设置 trim_start/trim_end - 属性完整继承:类型/转场/速度/config/文案 ### merge_clips(clip_ids) - 多个连续同类型片段合并为一个 - 校验规则:同计划 / order连续 / 类型一致 / 至少2个 - 时长累加、文案拼接、config合并(后者覆盖前者) - 自动清理 trim 字段,后续片段 order 前移 ## API - `POST /api/v1/edit-plans/clips/{clip_id}/split` — 分割片段 - `POST /api/v1/edit-plans/clips/merge` — 合并片段 - 均带项目级权限校验 ## 测试 67 passed(原50 + 新增17),零回归 分割 7 个:基础分割/属性继承/后续重排/边界校验/负数校验/不存在/素材裁剪 合并 10 个:两片段/后续重排/三片段/类型不一致/不连续/单个不足/跨计划/清理trim/分割再合并闭环
xiaoxia force-pushed feat/clip-split-merge from 6be1ae0136 to 5cb6211e64 2026-07-16 13:45:55 +08:00 Compare
xiaoxia force-pushed feat/clip-split-merge from df3e6be448 to 5cb6211e64 2026-07-16 13:56:00 +08:00 Compare
xiaoxia force-pushed feat/clip-split-merge from 5cb6211e64 to 2441bfb7c8 2026-07-16 14:02:52 +08:00 Compare
xiaoxia force-pushed feat/clip-split-merge from 12f803455c to eb41c8acec 2026-07-17 00:35:43 +08:00 Compare
xiaoxia added 3 commits 2026-07-17 08:09:41 +08:00
- EditPlanService.split_clip(): 指定时间点一分为二
  - 自动重排后续片段 order
  - 素材片段自动加 trim_start/trim_end
  - 属性完整继承(类型/转场/速度/config)
- EditPlanService.merge_clips(): 连续同类型片段合并
  - 校验:同计划/连续order/同类型/至少2个
  - 时长累加、文案拼接、config合并
  - 自动清理 trim 字段、重排后续 order
- API: POST /clips/{id}/split + POST /clips/merge
  - 项目级权限校验
- 17个单元测试全覆盖
fix: 修复edit_plans.py语法错误,分割合并路由迁移到edit_plans_clips.py
CI Build & Deploy Pipeline / Build Staging API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Production (pull_request) Has been skipped
CI Build & Deploy Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 31s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 54s
AI Code Review / AI Code Review (pull_request) Successful in 2m9s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m21s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 2m21s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m23s
b19a0a3454
- 修复save_plan_as_template函数被截断导致的SyntaxError
- 分割/合并路由从edit_plans.py迁移到edit_plans_clips.py子路由
- 统一使用_check_plan_access和_get_svc辅助函数
- 2234个单测全绿
xiaoxia force-pushed feat/clip-split-merge from eb41c8acec to b19a0a3454 2026-07-17 08:09:41 +08:00 Compare
auto-approve-bot approved these changes 2026-07-17 08:15:16 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia merged commit 4159e95f10 into develop 2026-07-17 09:18:30 +08:00
xiaoxia deleted branch feat/clip-split-merge 2026-07-17 09:18:31 +08:00
Sign in to join this conversation.