GEN_VIDEO_STATUS 接口开发完成报告
📋 接口概述
接口名称: gen_video_status
功能描述: 查询视频草稿的渲染状态,获取渲染进度和结果信息
开发状态: ✅ 已完成并测试通过
开发时间: 2025年8月1日
🎯 功能实现
核心功能 ✅
- 状态查询: 实时查询视频渲染任务的当前状态
- 进度跟踪: 获取渲染进度和任务详细信息
- 结果获取: 查询渲染完成后的视频下载链接
- 错误诊断: 查看渲染失败或不存在的草稿信息
- 历史记录: 查询历史渲染任务的状态信息
技术特性 ✅
- 参数验证: 完整的输入参数验证机制
- URL清理: 智能处理剪映链接格式,提取实际的草稿URL
- 错误处理: 完善的错误分类和用户友好错误信息
- 网络请求: 使用 node-fetch 进行可靠的HTTP请求
- 响应标准化: 统一的API响应格式
📝 接口规格
请求参数
{
"draft_url": "https://video-snot-12220.oss-cn-shanghai.aliyuncs.com/draft/0b3de2f7-e263-4cfb-b811-79f337a3843c.json" // 必填:草稿文件URL
}
响应格式
{
"status": "success",
"message": "视频状态查询成功",
"data": {
"code": 200,
"msg": "获取成功",
"data": {
"id": 316008,
"user_id": 245769,
"dayid": "2025-05-16",
"draft_url": "https://video-snot-12220.oss-cn-shanghai.aliyuncs.com/draft/0b3de2f7-e263-4cfb-b811-79f337a3843c.json",
"video_url": "",
"zip_url": "",
"draft_id": "0b3de2f7-e263-4cfb-b811-79f337a3843c",
"status": 0,
"gen_cnt": 0,
"mac_address": "",
"vip_level": 0,
"dispatch_time": "2025-05-16T14:29:27",
"finish_time": null,
"duration_seconds": 0,
"time": "2025-05-16T14:29:27"
}
}
}
🧪 测试结果
1. 基本功能测试 ✅
curl -X POST https://jy-api.fyshark.com/api/drafts/gen_video_status \
-H "Content-Type: application/json" \
-d '{
"draft_url": "https://video-snot-12220.oss-cn-shanghai.aliyuncs.com/draft/0b3de2f7-e263-4cfb-b811-79f337a3843c.json"
}'
测试结果: ✅ 成功
- 参数验证通过
- 成功调用外部状态查询API (https://ts-api.fyshark.com/api/get_draft_status)
- 返回了详细的状态信息:
id
: 316008 (任务ID)status
: 0 (状态码)draft_url
: 草稿URLvideo_url
: 空,表示还未完成渲染finish_time
: null,表示还未完成dispatch_time
: 任务提交时间
2. 参数验证测试 ✅
空参数验证
curl -X POST https://jy-api.fyshark.com/api/drafts/gen_video_status \
-H "Content-Type: application/json" \
-d '{"draft_url": ""}'
结果: ✅ 正确返回 "draft_url是必填项"
3. URL格式处理测试 ✅
curl -X POST https://jy-api.fyshark.com/api/drafts/gen_video_status \
-H "Content-Type: application/json" \
-d '{
"draft_url": "https://ts.fyshark.com/#/cozeToJianyin?drafId=https://video-snot-12220.oss-cn-shanghai.aliyuncs.com/draft/0b3de2f7-e263-4cfb-b811-79f337a3843c.json"
}'
结果: ✅ 成功
- 正确提取了实际的草稿URL
- 移除了剪映链接前缀
- 成功调用状态查询API,返回相同的状态信息
4. 不存在草稿测试 ✅
curl -X POST https://jy-api.fyshark.com/api/drafts/gen_video_status \
-H "Content-Type: application/json" \
-d '{
"draft_url": "https://video-snot-12220.oss-cn-shanghai.aliyuncs.com/draft/nonexistent-draft.json"
}'
结果: ✅ 成功
- 外部API返回404状态码
- 返回"草稿不存在"的友好提示信息
- API正确处理了不存在的草稿情况
🏗️ 技术实现
文件结构 ✅
- 路由定义:
routes/drafts.js
- 添加/gen_video_status
路由 - 控制器实现:
controllers/draftController.js
- 实现genVideoStatus
方法 - 工具类方法:
utils/draftUtils.js
- 实现processVideoStatusQuery
和validateVideoStatusQuery
- 接口文档:
API_GEN_VIDEO_STATUS.md
- 完整的API使用说明 - 应用配置:
app.js
- 更新端点信息
核心算法 ✅
// 视频状态查询处理流程
1. 参数验证:validateVideoStatusQuery(statusConfig)
2. 初始化动态导入:initDynamicImports() 确保fetch可用
3. URL清理:移除剪映链接前缀,提取实际草稿URL
4. 调用外部API:POST https://ts-api.fyshark.com/api/get_draft_status
5. 响应处理:返回状态查询结果
验证机制 ✅
- 必填参数: draft_url
- 类型验证: string 类型检查
- URL验证: JSON文件URL格式验证
- 空值检查: 不允许空字符串
错误处理 ✅
- 网络错误: fetch失败时的网络连接提示
- 资源错误: 404状态码的草稿不存在错误
- 服务器错误: 500状态码的查询服务不可用错误
- 通用错误: 其他类型的错误处理
📊 状态信息解析
返回字段说明
字段名 | 类型 | 说明 |
---|---|---|
id |
number | 任务唯一标识ID |
user_id |
number | 用户ID |
draft_url |
string | 草稿文件URL |
video_url |
string | 渲染完成的视频URL(空表示未完成) |
zip_url |
string | 打包文件URL(如有) |
draft_id |
string | 草稿唯一标识 |
status |
number | 渲染状态码 (0=初始/排队, 1=进行中, 2=完成, -1=失败) |
gen_cnt |
number | 生成次数 |
dispatch_time |
string | 任务提交时间 |
finish_time |
string/null | 完成时间(null表示未完成) |
duration_seconds |
number | 视频时长(秒) |
状态码含义
status | 状态 | 说明 |
---|---|---|
0 | 初始/排队 | 任务已提交,等待处理 |
1 | 渲染中 | 正在进行渲染处理 |
2 | 已完成 | 渲染成功完成,可获取视频 |
-1 | 渲染失败 | 渲染过程中出现错误 |
🔄 工作流程
graph TD
A[接收请求] --> B[参数验证]
B --> C{验证通过?}
C -->|否| D[返回400错误]
C -->|是| E[初始化动态导入]
E --> F[清理draft_url]
F --> G[构建状态查询请求]
G --> H[调用外部状态API]
H --> I{API调用成功?}
I -->|否| J[处理网络错误]
I -->|是| K[解析状态响应]
K --> L[返回状态信息]
J --> M[返回相应错误状态码]
🚀 使用示例
JavaScript 示例
const queryVideoStatus = async (draftUrl) => {
const response = await fetch('/api/drafts/gen_video_status', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ draft_url: draftUrl })
});
const result = await response.json();
if (result.status === 'success') {
return result.data;
}
throw new Error(result.message);
};
// 使用示例
const draftUrl = "https://video-snot-12220.oss-cn-shanghai.aliyuncs.com/draft/0b3de2f7-e263-4cfb-b811-79f337a3843c.json";
const statusInfo = await queryVideoStatus(draftUrl);
console.log('任务ID:', statusInfo.data.id);
console.log('渲染状态:', statusInfo.data.status);
if (statusInfo.data.video_url) {
console.log('视频地址:', statusInfo.data.video_url);
}
Python 示例
import requests
def query_video_status(draft_url):
response = requests.post(
'https://jy-api.fyshark.com/api/drafts/gen_video_status',
headers={'Content-Type': 'application/json'},
json={'draft_url': draft_url}
)
result = response.json()
if result['status'] == 'success':
return result['data']
raise Exception(result['message'])
# 使用示例
draft_url = "https://video-snot-12220.oss-cn-shanghai.aliyuncs.com/draft/0b3de2f7-e263-4cfb-b811-79f337a3843c.json"
status_info = query_video_status(draft_url)
print(f"任务ID: {status_info['data']['id']}")
print(f"渲染状态: {status_info['data']['status']}")
if status_info['data']['video_url']:
print(f"视频地址: {status_info['data']['video_url']}")
📖 应用场景
轮询监控 🔄
- 进度跟踪: 定期查询渲染任务进度
- 状态通知: 渲染完成后自动通知用户
- 批量管理: 管理多个渲染任务的状态
用户界面集成 📱
- 状态显示: 实时显示渲染状态给用户
- 结果下载: 渲染完成后提供下载链接
- 错误提示: 显示渲染失败的详细信息
自动化流程 🤖
- 流水线监控: 监控批量渲染任务的执行状态
- 错误处理: 自动重试失败的渲染任务
- 结果收集: 自动收集完成的视频文件
系统集成 🔗
- 第三方系统: 与其他系统集成实现视频处理流程
- 数据统计: 收集渲染成功率和性能数据
- 报警监控: 监控渲染失败率和异常情况
⚠️ 注意事项
使用限制
- 查询频率: 建议查询间隔不少于5秒,避免过频查询
- 草稿文件: 必须是可访问的JSON格式文件
- 网络连接: 需要稳定的网络连接访问外部查询服务
- 数据时效性: 状态信息可能有1-2秒的缓存延迟
最佳实践
- 轮询策略: 采用指数退避算法避免频繁查询
- 错误重试: 网络错误时应进行适当重试
- 状态存储: 建议本地存储任务状态减少查询次数
- 用户体验: 为用户提供清晰的进度和状态反馈
🔗 相关接口
视频渲染系列
- gen_video - 提交视频渲染任务
- create_draft - 创建基础草稿
内容编辑系列
- add_audios - 添加音频轨道
- add_captions - 添加字幕轨道
- add_images - 添加图片轨道
- add_videos - 添加视频轨道
🚀 最佳实践
智能轮询
// ✅ 推荐:智能轮询策略
const waitForCompletion = async (draftUrl, options = {}) => {
const { interval = 5000, timeout = 600000 } = options;
const startTime = Date.now();
while (Date.now() - startTime < timeout) {
try {
const result = await queryVideoStatus(draftUrl);
const status = result.data.status;
// 检查完成状态
if (status === 2) {
return {
success: true,
video_url: result.data.video_url,
duration: result.data.duration_seconds
};
}
// 检查失败状态
if (status === -1) {
return {
success: false,
error: '渲染失败'
};
}
// 等待下次查询
await new Promise(resolve => setTimeout(resolve, interval));
} catch (error) {
console.warn('状态查询失败,重试中...', error.message);
await new Promise(resolve => setTimeout(resolve, interval));
}
}
throw new Error('等待渲染完成超时');
};
批量监控
// ✅ 推荐:批量状态监控
const monitorBatchStatus = async (draftUrls) => {
const results = new Map();
for (const draftUrl of draftUrls) {
try {
const status = await queryVideoStatus(draftUrl);
results.set(draftUrl, status.data);
console.log(`${draftUrl}: status=${status.data.status}`);
} catch (error) {
console.warn(`查询失败 ${draftUrl}:`, error.message);
results.set(draftUrl, { error: error.message });
}
}
return results;
};
✅ 开发总结
开发状态: 🎉 完全成功
完成情况
- ✅ 接口文档:
API_GEN_VIDEO_STATUS.md
详细说明文档 - ✅ 后端实现: 完整的控制器、工具类、路由配置
- ✅ 参数验证: 全面的输入验证和错误处理
- ✅ 功能测试: 多场景测试覆盖,100%通过
- ✅ 网络请求: 稳定的外部API调用机制
- ✅ 错误处理: 完善的错误分类和用户友好提示
技术亮点
- 智能URL处理: 自动识别和处理剪映链接格式
- 完整参数验证: URL格式验证和完整的输入检查
- 可靠网络请求: 使用node-fetch确保HTTP请求稳定性
- 详细状态信息: 返回丰富的渲染任务状态数据
- 标准化响应: 统一的API响应格式和状态码
关键技术
- External API Integration: 与外部状态查询服务的可靠集成
- URL Processing: 智能的URL格式识别和清理
- Dynamic Imports: 动态导入node-fetch确保兼容性
- Error Classification: 完整的错误分类和处理机制
- Status Interpretation: 详细的状态信息解析和展示
实际测试数据
// 真实API响应示例
{
"id": 316008,
"status": 0, // 0=排队中
"draft_url": "https://video-snot-12220.oss-cn-shanghai.aliyuncs.com/draft/0b3de2f7-e263-4cfb-b811-79f337a3843c.json",
"video_url": "", // 空表示未完成
"dispatch_time": "2025-05-16T14:29:27",
"finish_time": null // null表示未完成
}
开发者: JY API Team
完成时间: 2025年8月1日
接口状态: ✅ 生产就绪
文档版本: v1.0.0
外部服务: https://ts-api.fyshark.com/api/get_draft_status