# 素材标签继承问题修复

## 🐛 问题描述

用户反馈：导入素材成功，但在项目详情页面看不到导入的素材。经过分析发现，问题的根本原因是**视频分镜时生成的片段没有继承原始视频的标签**。

## 🔍 问题分析

### 问题定位
在 `python_core/services/media_manager.py` 的 `_split_video_by_scenes` 函数中：

```python
# 问题代码 (第297行和第375行)
segment = VideoSegment(
    # ... 其他属性
    tags=[],  # ❌ 这里硬编码为空数组，没有继承原始视频的标签
    # ... 其他属性
)
```

### 调用链分析
```
upload_video_file() 
  ↓ (第487行)
_split_video_by_scenes(video_path, scene_changes, video_id)  # ❌ 没有传递tags
  ↓
创建VideoSegment时 tags=[]  # ❌ 片段没有标签
```

### 影响范围
1. **所有通过自动分镜生成的视频片段都没有标签**
2. **项目详情页面通过标签过滤素材，导致无法显示这些片段**
3. **影响所有导入的视频素材（单文件和批量导入）**

## ✅ 修复方案

### 1. 修改函数签名
**文件**: `python_core/services/media_manager.py`
**位置**: 第267-268行

```python
# 修改前
def _split_video_by_scenes(self, video_path: str, scene_changes: List[float],
                          original_video_id: str) -> List[VideoSegment]:

# 修改后  
def _split_video_by_scenes(self, video_path: str, scene_changes: List[float],
                          original_video_id: str, tags: List[str] = None) -> List[VideoSegment]:
```

### 2. 添加标签处理逻辑
**位置**: 第270-271行

```python
# 新增
if tags is None:
    tags = []
```

### 3. 修复片段创建时的标签
**位置**: 第300行和第378行

```python
# 修改前
tags=[],

# 修改后
tags=tags.copy(),
```

### 4. 修改函数调用
**位置**: 第487行（主要调用）

```python
# 修改前
segments = self._split_video_by_scenes(str(stored_path), scene_changes, video_id)

# 修改后
segments = self._split_video_by_scenes(str(stored_path), scene_changes, video_id, tags)
```

**位置**: 第393行（错误处理调用）

```python
# 修改前
return self._split_video_by_scenes(video_path, [0.0, self._get_video_info(video_path)['duration']], original_video_id)

# 修改后
return self._split_video_by_scenes(video_path, [0.0, self._get_video_info(video_path)['duration']], original_video_id, tags)
```

## 🧪 验证修复

### 1. 运行测试脚本
```bash
python scripts/test_material_tags_fix.py
```

### 2. 手动测试步骤
1. **导入新视频**:
   - 进入项目详情页面
   - 点击"导入素材"
   - 选择视频文件，确保添加了项目标签
   - 完成导入

2. **检查标签继承**:
   - 打开开发者工具查看控制台日志
   - 确认片段创建时包含了正确的标签
   - 在项目详情页面验证素材显示

3. **验证数据文件**:
   - 检查 `cache/video_segments.json`
   - 确认新生成的片段包含标签

### 3. 预期结果
```json
// video_segments.json 中的片段应该包含标签
{
  "id": "segment-uuid",
  "original_video_id": "video-uuid", 
  "filename": "segment_001.mp4",
  "tags": ["项目商品名", "其他标签"],  // ✅ 现在有标签了
  // ... 其他属性
}
```

## 🔧 现有数据修复

### 问题
已经导入的视频片段仍然没有标签，需要手动修复。

### 解决方案

#### 方案1: 重新导入（推荐）
1. 删除现有的无标签素材
2. 重新导入视频文件
3. 新导入的片段将自动包含正确的标签

#### 方案2: 手动添加标签
1. 进入素材管理页面
2. 找到相关的视频片段
3. 手动为每个片段添加项目商品名标签
4. 返回项目详情页面验证

#### 方案3: 批量修复脚本
创建脚本批量为现有片段添加标签：

```python
# 示例修复脚本
def fix_existing_segments():
    media_manager = MediaManager()
    
    # 获取所有无标签的片段
    segments = media_manager.get_all_segments()
    untagged_segments = [s for s in segments if not s.get('tags')]
    
    # 为每个片段添加标签（需要根据实际情况确定标签）
    for segment in untagged_segments:
        # 根据文件名或其他信息确定应该添加的标签
        tags_to_add = ["项目商品名"]  # 需要根据实际情况调整
        media_manager.add_tags_to_segment(segment['id'], tags_to_add)
```

## 📊 修复效果

### 修复前
```
导入视频 → 生成片段 → tags: [] → 项目页面无法显示
```

### 修复后  
```
导入视频 → 生成片段 → tags: ["项目商品名", "其他标签"] → 项目页面正常显示
```

## 🚨 注意事项

1. **现有数据**: 修复只影响新导入的视频，现有无标签片段需要单独处理
2. **标签匹配**: 确保项目设置了正确的商品名称
3. **大小写敏感**: 标签匹配是大小写敏感的
4. **测试验证**: 修复后务必测试新的导入流程

## 📝 相关文件

- `python_core/services/media_manager.py` - 主要修复文件
- `src/pages/ProjectDetailPage.tsx` - 项目素材显示逻辑
- `src/components/ImportMaterialModal.tsx` - 导入界面
- `scripts/test_material_tags_fix.py` - 测试脚本

## 🎯 总结

通过修复 `_split_video_by_scenes` 函数的标签继承问题，现在：

1. ✅ 新导入的视频片段会正确继承原始视频的标签
2. ✅ 项目详情页面能够正确显示导入的素材
3. ✅ 自动分镜功能不再丢失标签信息
4. ✅ 单文件和批量导入都能正常工作

这个修复解决了素材导入后无法在项目中显示的核心问题！
