Files
autoclip/docs/COLLECTION_CLIP_IDS_FIX.md
2025-08-21 01:05:23 +08:00

4.8 KiB
Raw Blame History

合集clip_ids映射问题修复文档

问题描述

前端详情页显示12个切片但合集数据为0无法正确显示合集包含的切片。

问题原因分析

  1. 数据重复运行多次修复脚本导致切片数据重复12个而不是6个
  2. clip_ids映射错误合集中的clip_ids是metadata_id如"3", "4", "5"而不是实际的切片UUID
  3. 数据格式问题clip_ids在数据库中存储为字符串而不是JSON数组

修复方案

1. 清理重复数据

问题每个metadata_id都有两个切片导致数据重复

解决方案

DELETE FROM clips WHERE id IN (
    SELECT id FROM (
        SELECT id, ROW_NUMBER() OVER (
            PARTITION BY json_extract(clip_metadata, '$.id') 
            ORDER BY created_at
        ) as rn 
        FROM clips 
        WHERE project_id = '5c48803d-0aa7-48d7-a270-2b33e4954f25'
    ) WHERE rn > 1
);

2. 修复clip_ids映射

问题合集中的clip_ids是metadata_id需要映射到实际的切片UUID

解决方案

  • 创建metadata_id到clip_id的映射
  • 更新collection_metadata中的clip_ids字段
# 创建metadata_id到clip_id的映射
metadata_id_to_clip_mapping = {}
for clip in clips:
    metadata = clip.clip_metadata or {}
    metadata_id = metadata.get('id')
    if metadata_id:
        metadata_id_to_clip_mapping[str(metadata_id)] = clip.id

# 映射clip_ids
mapped_clip_ids = []
for metadata_id in original_clip_ids:
    if metadata_id in metadata_id_to_clip_mapping:
        mapped_clip_ids.append(metadata_id_to_clip_mapping[metadata_id])

3. 修复数据格式

问题clip_ids在数据库中存储为字符串而不是JSON数组

解决方案

UPDATE collections 
SET collection_metadata = json_set(
    collection_metadata, 
    '$.clip_ids', 
    json('["clip_id_1", "clip_id_2", "clip_id_3"]')
) 
WHERE project_id = '5c48803d-0aa7-48d7-a270-2b33e4954f25';

修复结果

修复前

  • 切片数量: 12个重复
  • 合集数量: 1个
  • 合集切片数量: 0个clip_ids映射错误

修复后

  • 切片数量: 6个正确
  • 合集数量: 1个
  • 合集切片数量: 3个正确

📊 数据映射结果

原始clip_ids: ["3", "4", "5"] (metadata_id) 映射后clip_ids: ["4ae8d564-234e-4a5f-86a3-840d65e59f59", "c8be1b33-679c-4ac6-9af6-2af21595e458", "0125c5ec-4ba5-41ac-b328-e1bc61ea9e69"] (实际clip_id)

映射关系

  • metadata_id 3 → clip_id 4ae8d564-234e-4a5f-86a3-840d65e59f59 (AI创业正进入大学生时代这届年轻人开始弯道超车)
  • metadata_id 4 → clip_id c8be1b33-679c-4ac6-9af6-2af21595e458 (AI让经验失效却让这项能力变得前所未有地重要)
  • metadata_id 5 → clip_id 0125c5ec-4ba5-41ac-b328-e1bc61ea9e69 (未来十年真正抗风险的能力,不在技能,而在判断)

创建的工具脚本

scripts/fix_collection_clip_ids.py

  • 自动映射metadata_id到clip_id
  • 更新collection_metadata中的clip_ids
  • 测试修复结果

使用方法

# 修复并测试
python scripts/fix_collection_clip_ids.py --project-id <项目ID>

# 仅测试
python scripts/fix_collection_clip_ids.py --project-id <项目ID> --test-only

测试结果

API测试

# 切片API
curl "http://localhost:8000/api/v1/clips/?project_id=5c48803d-0aa7-48d7-a270-2b33e4954f25"
# 返回: 6个切片 ✅

# 合集API
curl "http://localhost:8000/api/v1/collections/?project_id=5c48803d-0aa7-48d7-a270-2b33e4954f25"
# 返回: 1个合集包含3个clip_ids ✅

前端测试

python scripts/test_frontend_data.py
# 结果: 前端数据读取测试通过 ✅

当前状态

正常工作

  • 前端数据读取
  • 切片API返回6个切片
  • 合集API返回1个合集包含3个切片
  • 数据映射正确

⚠️ 需要进一步修复

  • 合集视频访问404错误
  • 前端视频预览功能

相关文件

  • backend/models/collection.py - 合集模型
  • backend/services/collection_service.py - 合集服务
  • backend/api/v1/collections.py - 合集API
  • frontend/src/services/api.ts - 前端API客户端
  • scripts/fix_collection_clip_ids.py - 修复脚本

经验总结

  1. 数据一致性确保metadata_id和clip_id的映射关系正确
  2. 数据格式JSON字段需要正确的格式数组而不是字符串
  3. 数据清理:定期清理重复数据,避免数据不一致
  4. 测试验证修复后及时测试API和前端功能

下一步工作

  1. 修复合集视频访问解决合集视频URL的404错误
  2. 优化前端体验:改进视频预览和播放功能
  3. 数据验证:添加数据一致性检查机制
  4. 自动化修复:将修复逻辑集成到数据处理流程中