# 测试素材创建工具

`create_test_asset.py` 是一个自动化测试辅助工具，用于快速创建 `ready` 状态的视频素材，跳过正常的上传和转码流程，直接指定已存在于 OSS 的文件来生成可用素材。

## 适用场景

- 渲染对比测试：快速创建测试素材用于生成任务
- 性能测试：批量创建素材模拟真实场景
- 开发调试：无需真实上传文件即可测试素材相关功能

## 前置条件

1. API 服务正在运行
2. 有有效的登录 token
3. 指定的 `storage_key` 对应的文件已存在于 OSS 中
4. 用户对指定项目有访问权限

## 使用方法

### 基本用法

```bash
# 设置环境变量（可选）
export API_BASE_URL=http://localhost:8000
export API_TOKEN=your_token_here

# 创建测试素材
python tests/render_compare/create_test_asset.py \
    --project-id proj_xxx \
    --name "测试素材-30s" \
    --storage-key "assets/test/sample_30s.mp4" \
    --duration 30 \
    --file-size 10485760
```

### 完整参数示例

```bash
python tests/render_compare/create_test_asset.py \
    --base-url http://localhost:8000 \
    --token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... \
    --project-id proj_a1b2c3d4e5f6 \
    --name "1080p测试视频-60s" \
    --storage-key "test-assets/1080p_60fps_60s.mp4" \
    --duration 60 \
    --width 1920 \
    --height 1080 \
    --fps 60 \
    --mime-type "video/mp4" \
    --file-size 52428800 \
    --codec "h264" \
    --kind video
```

### 在脚本中捕获 asset_id

```bash
# 最后一行输出为 asset_id，方便脚本捕获
ASSET_ID=$(python tests/render_compare/create_test_asset.py \
    --project-id proj_xxx \
    --name "测试素材" \
    --storage-key "test/video.mp4" \
    2>&1 | tail -1)

echo "创建的素材 ID: $ASSET_ID"
```

## 参数说明

| 参数 | 环境变量 | 必填 | 默认值 | 说明 |
|------|----------|------|--------|------|
| `--base-url` | `API_BASE_URL` | 否 | `http://localhost:8000` | API 服务地址 |
| `--token` | `API_TOKEN` | 是 | - | 登录认证 token |
| `--project-id` | - | 是 | - | 项目 ID |
| `--name` | - | 是 | - | 素材名称 |
| `--storage-key` | - | 是 | - | OSS storage_key（文件需已存在） |
| `--duration` | - | 否 | `30` | 视频时长（秒） |
| `--width` | - | 否 | `1280` | 视频宽度 |
| `--height` | - | 否 | `720` | 视频高度 |
| `--fps` | - | 否 | `25` | 帧率 |
| `--mime-type` | - | 否 | `video/mp4` | MIME 类型 |
| `--file-size` | - | 否 | `0` | 文件大小（字节） |
| `--codec` | - | 否 | - | 视频编码 |
| `--kind` | - | 否 | `video` | 素材库类型 (video/voice/image) |

## API 调用流程

脚本会依次调用以下 API：

### 1. 确保默认素材库存在

```
POST /api/v1/asset-libraries/ensure-default
Content-Type: application/json
Authorization: Bearer {token}

{
  "project_id": "proj_xxx",
  "kind": "video"
}
```

- 如果项目下已有对应类型的素材库，直接返回第一个
- 如果不存在，自动创建默认名称的素材库

### 2. 创建素材

```
POST /api/v1/assets
Content-Type: application/json
Authorization: Bearer {token}

{
  "project_id": "proj_xxx",
  "library_id": "lib_xxx",
  "name": "测试素材",
  "storage_key": "assets/test/video.mp4",
  "mime_type": "video/mp4",
  "file_size": 10485760,
  "duration": 30,
  "width": 1280,
  "height": 720,
  "fps": 25,
  "status": "ready",
  "classification_status": "pending",
  "metadata": {}
}
```

**关键点**：
- `status: "ready"` 直接跳过转码流程，立即可用
- `storage_key` 必须对应 OSS 中真实存在的文件，否则播放会失败
- `uploaded_by_user_id` 由 API 自动设置为当前登录用户

## 输出说明

脚本输出分为三部分：

1. **参数回显**：确认输入的参数是否正确
2. **执行日志**：显示每一步的执行情况
3. **结果输出**：
   - 素材详细信息（asset_id、状态、文件 URL 等）
   - 调用示例
   - 最后一行为纯 asset_id，方便脚本捕获

## 错误排查

### 常见错误

#### 401 Unauthorized
- 检查 token 是否正确且未过期
- 确认 Authorization header 格式为 `Bearer {token}`

#### 403 Forbidden
- 确认用户对该项目有访问权限
- 检查项目 ID 是否正确

#### 404 Project not found
- 项目 ID 错误或项目不存在

#### 422 Validation Error
- 检查参数格式是否正确
- 查看响应中的 detail 字段了解具体错误

### 调试技巧

脚本在 API 失败时会打印完整的响应内容，包括：
- HTTP 状态码
- 错误原因
- 响应 body 详情

如果遇到问题，请检查：
1. API 服务是否正常运行
2. base-url 是否正确（注意端口号）
3. token 是否有效
4. storage_key 对应的文件是否存在于 OSS

## 与渲染对比测试配合使用

```bash
# 1. 创建测试素材
ASSET_ID=$(python tests/render_compare/create_test_asset.py \
    --project-id proj_xxx \
    --name "渲染对比测试素材" \
    --storage-key "test-assets/base_1080p_30s.mp4" \
    --duration 30 --width 1920 --height 1080 \
    2>&1 | tail -1)

# 2. 使用该素材运行渲染对比测试
python tests/render_compare/runner.py \
    --project-id proj_xxx \
    --asset-id $ASSET_ID \
    --scenario quality_test
```

## 注意事项

1. **storage_key 必须真实存在**：脚本不会上传文件，只是创建数据库记录。如果 OSS 中没有对应文件，素材虽然状态是 ready，但无法正常播放。
2. **素材参数要准确**：duration、width、height、fps 等参数应与实际文件一致，否则可能导致后续渲染或分析出现偏差。
3. **权限检查**：确保 token 对应用户有项目的素材创建权限。
4. **清理测试数据**：测试完成后记得清理不需要的测试素材，避免占用资源。
