mirror of
https://github.com/Hommy-master/capcut-mate.git
synced 2026-09-01 15:32:57 +08:00
340 lines
10 KiB
Markdown
340 lines
10 KiB
Markdown
# SAVE_DRAFT API 接口文档
|
||
|
||
## 📋 目录
|
||
|
||
- [🔧 接口信息](#-接口信息)
|
||
- [🎯 功能描述](#-功能描述)
|
||
- [📖 更多文档](#-更多文档)
|
||
- [📥 请求参数](#-请求参数)
|
||
- [📤 响应格式](#-响应格式)
|
||
- [💻 使用示例](#-使用示例)
|
||
- [❌ 错误码说明](#-错误码说明)
|
||
- [⚠️ 注意事项](#️-注意事项)
|
||
- [🔗 相关接口](#-相关接口)
|
||
|
||
## 🔧 接口信息
|
||
|
||
```
|
||
POST /openapi/capcut-mate/v1/save_draft
|
||
```
|
||
|
||
## 功能描述
|
||
|
||
保存剪映草稿。该接口用于保存当前的草稿状态,确保编辑的内容得到持久化存储。通常在完成一系列编辑操作后调用此接口,以防止编辑内容丢失。
|
||
|
||
## 更多文档
|
||
|
||
📖 更多详细文档和教程请访问:[https://docs.jcaigc.cn](https://docs.jcaigc.cn)
|
||
|
||
## 请求参数
|
||
|
||
```json
|
||
{
|
||
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
|
||
}
|
||
```
|
||
|
||
### 参数说明
|
||
|
||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||
|--------|------|------|--------|------|
|
||
| draft_url | string | ✅ | - | 要保存的草稿URL |
|
||
|
||
### 参数详解
|
||
|
||
#### draft_url
|
||
|
||
- **类型**: 字符串
|
||
- **必填**: 是
|
||
- **格式**: 完整的草稿URL,通常由create_draft接口返回
|
||
- **示例**: `https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
|
||
}
|
||
```
|
||
|
||
### 响应字段说明
|
||
|
||
| 字段名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| draft_url | string | 保存后的草稿URL,通常与请求中的URL相同 |
|
||
|
||
### 错误响应 (4xx/5xx)
|
||
|
||
```json
|
||
{
|
||
"detail": "错误信息描述"
|
||
}
|
||
```
|
||
|
||
## 使用示例
|
||
|
||
### cURL 示例
|
||
|
||
#### 1. 基本保存草稿
|
||
|
||
```bash
|
||
curl -X POST https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/save_draft \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"draft_url": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
|
||
}'
|
||
```
|
||
|
||
### JavaScript 示例
|
||
|
||
```javascript
|
||
const saveDraft = async (draftUrl) => {
|
||
const response = await fetch('/openapi/capcut-mate/v1/save_draft', {
|
||
method: 'POST',
|
||
headers: { 'Content-Type': 'application/json' },
|
||
body: JSON.stringify({ draft_url: draftUrl })
|
||
});
|
||
return response.json();
|
||
};
|
||
|
||
// 保存草稿
|
||
const draftUrl = "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258";
|
||
const result = await saveDraft(draftUrl);
|
||
console.log('草稿保存成功:', result.draft_url);
|
||
```
|
||
|
||
### 高级JavaScript示例
|
||
|
||
```javascript
|
||
class DraftManager {
|
||
constructor(baseUrl = 'https://capcut-mate.jcaigc.cn') {
|
||
this.baseUrl = baseUrl;
|
||
}
|
||
|
||
async saveDraft(draftUrl) {
|
||
const response = await fetch(`${this.baseUrl}/openapi/capcut-mate/v1/save_draft`, {
|
||
method: 'POST',
|
||
headers: { 'Content-Type': 'application/json' },
|
||
body: JSON.stringify({ draft_url: draftUrl })
|
||
});
|
||
|
||
if (!response.ok) {
|
||
throw new Error(`保存草稿失败: ${response.statusText}`);
|
||
}
|
||
|
||
return response.json();
|
||
}
|
||
|
||
// 自动保存功能
|
||
async autoSave(draftUrl, intervalMs = 30000) {
|
||
const saveInterval = setInterval(async () => {
|
||
try {
|
||
await this.saveDraft(draftUrl);
|
||
console.log(`自动保存成功: ${new Date().toLocaleTimeString()}`);
|
||
} catch (error) {
|
||
console.error('自动保存失败:', error);
|
||
}
|
||
}, intervalMs);
|
||
|
||
// 返回停止自动保存的函数
|
||
return () => clearInterval(saveInterval);
|
||
}
|
||
|
||
// 编辑流程中的保存
|
||
async editWorkflow(draftUrl, operations) {
|
||
const results = [];
|
||
|
||
for (const operation of operations) {
|
||
try {
|
||
// 执行编辑操作(这里是示例)
|
||
const editResult = await operation();
|
||
results.push(editResult);
|
||
|
||
// 每次操作后自动保存
|
||
await this.saveDraft(draftUrl);
|
||
console.log(`操作完成并保存: ${operation.name}`);
|
||
|
||
} catch (error) {
|
||
console.error(`操作失败: ${operation.name}`, error);
|
||
results.push({ error: error.message });
|
||
}
|
||
}
|
||
|
||
return results;
|
||
}
|
||
|
||
// 批量保存多个草稿
|
||
async saveMutipleDrafts(draftUrls) {
|
||
const results = {};
|
||
|
||
for (const [name, url] of Object.entries(draftUrls)) {
|
||
try {
|
||
const result = await this.saveDraft(url);
|
||
results[name] = result;
|
||
|
||
// 添加延迟避免请求过快
|
||
await new Promise(resolve => setTimeout(resolve, 100));
|
||
} catch (error) {
|
||
console.error(`保存草稿失败 ${name}:`, error);
|
||
results[name] = { error: error.message };
|
||
}
|
||
}
|
||
|
||
return results;
|
||
}
|
||
}
|
||
|
||
// 使用示例
|
||
const draftManager = new DraftManager();
|
||
|
||
// 基本保存
|
||
const draftUrl = "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258";
|
||
await draftManager.saveDraft(draftUrl);
|
||
|
||
// 启动自动保存(每30秒保存一次)
|
||
const stopAutoSave = await draftManager.autoSave(draftUrl, 30000);
|
||
|
||
// 编辑完成后停止自动保存
|
||
setTimeout(() => {
|
||
stopAutoSave();
|
||
console.log('自动保存已停止');
|
||
}, 300000); // 5分钟后停止
|
||
|
||
// 批量保存多个草稿
|
||
const multipleDrafts = {
|
||
"project1": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258",
|
||
"project2": "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
|
||
};
|
||
const saveResults = await draftManager.saveMutipleDrafts(multipleDrafts);
|
||
```
|
||
|
||
### Python 示例
|
||
|
||
```python
|
||
import requests
|
||
import time
|
||
import threading
|
||
from typing import Dict, List, Callable
|
||
|
||
class DraftSaver:
|
||
def __init__(self, base_url: str = "https://assets.jcaigc.cn"):
|
||
self.base_url = base_url
|
||
self._auto_save_threads = {}
|
||
|
||
def save_draft(self, draft_url: str) -> Dict:
|
||
"""保存草稿"""
|
||
response = requests.post(
|
||
f'{self.base_url}/openapi/capcut-mate/v1/save_draft',
|
||
headers={'Content-Type': 'application/json'},
|
||
json={"draft_url": draft_url}
|
||
)
|
||
response.raise_for_status()
|
||
return response.json()
|
||
|
||
def auto_save(self, draft_url: str, interval_seconds: int = 30) -> str:
|
||
"""启动自动保存,返回线程ID用于停止"""
|
||
def save_loop():
|
||
while True:
|
||
try:
|
||
self.save_draft(draft_url)
|
||
print(f"自动保存成功: {time.strftime('%H:%M:%S')}")
|
||
time.sleep(interval_seconds)
|
||
except Exception as e:
|
||
print(f"自动保存失败: {e}")
|
||
time.sleep(5) # 出错后等待5秒再重试
|
||
|
||
thread_id = f"auto_save_{int(time.time())}"
|
||
thread = threading.Thread(target=save_loop, daemon=True)
|
||
thread.start()
|
||
self._auto_save_threads[thread_id] = thread
|
||
|
||
return thread_id
|
||
|
||
def stop_auto_save(self, thread_id: str):
|
||
"""停止自动保存"""
|
||
if thread_id in self._auto_save_threads:
|
||
# 线程设为daemon,程序结束时会自动停止
|
||
del self._auto_save_threads[thread_id]
|
||
print(f"自动保存线程 {thread_id} 已标记停止")
|
||
|
||
def save_with_retry(self, draft_url: str, max_retries: int = 3) -> Dict:
|
||
"""带重试机制的保存"""
|
||
for attempt in range(max_retries):
|
||
try:
|
||
return self.save_draft(draft_url)
|
||
except Exception as e:
|
||
if attempt == max_retries - 1:
|
||
raise e
|
||
print(f"保存失败,第{attempt + 1}次重试: {e}")
|
||
time.sleep(2 ** attempt) # 指数退避
|
||
|
||
# 使用示例
|
||
saver = DraftSaver()
|
||
|
||
# 基本保存
|
||
draft_url = "https://capcut-mate.jcaigc.cn/openapi/capcut-mate/v1/get_draft?draft_id=2025092811473036584258"
|
||
result = saver.save_draft(draft_url)
|
||
print(f"草稿保存成功: {result['draft_url']}")
|
||
|
||
# 带重试的保存
|
||
try:
|
||
result = saver.save_with_retry(draft_url, max_retries=3)
|
||
print("保存成功(带重试机制)")
|
||
except Exception as e:
|
||
print(f"保存最终失败: {e}")
|
||
|
||
# 启动自动保存
|
||
auto_save_id = saver.auto_save(draft_url, interval_seconds=30)
|
||
print(f"自动保存已启动,ID: {auto_save_id}")
|
||
|
||
# 10分钟后停止自动保存
|
||
time.sleep(600)
|
||
saver.stop_auto_save(auto_save_id)
|
||
```
|
||
|
||
## 错误码说明
|
||
|
||
| 错误码 | 错误信息 | 说明 | 解决方案 |
|
||
|--------|----------|------|----------|
|
||
| 400 | draft_url是必填项 | 缺少草稿URL参数 | 提供有效的draft_url |
|
||
| 400 | draft_url格式无效 | URL格式不正确 | 检查URL格式是否正确 |
|
||
| 404 | 草稿不存在 | 指定的草稿无法找到 | 确认草稿URL是否正确且存在 |
|
||
| 500 | 保存失败 | 内部服务错误 | 联系技术支持或稍后重试 |
|
||
| 503 | 服务不可用 | 系统维护中 | 稍后重试 |
|
||
|
||
## 注意事项
|
||
|
||
1. **URL有效性**: 确保传入的draft_url是有效且存在的
|
||
2. **网络稳定性**: 保存操作需要稳定的网络连接
|
||
3. **频率控制**: 避免过于频繁的保存操作
|
||
4. **自动保存**: 建议在长时间编辑时启用自动保存功能
|
||
5. **错误处理**: 保存失败时应该有重试机制
|
||
6. **并发安全**: 同一草稿的并发保存可能导致冲突
|
||
|
||
## 工作流程
|
||
|
||
1. 验证draft_url参数
|
||
2. 检查草稿是否存在
|
||
3. 获取当前草稿状态
|
||
4. 持久化保存草稿数据
|
||
5. 返回保存结果
|
||
|
||
## 最佳实践
|
||
|
||
1. **定期保存**: 在重要操作后及时保存
|
||
2. **自动保存**: 为长时间编辑设置自动保存
|
||
3. **错误恢复**: 保存失败时提供重试机制
|
||
4. **状态提示**: 向用户显示保存状态
|
||
5. **备份策略**: 考虑多版本备份机制
|
||
|
||
## 相关接口
|
||
|
||
- [创建草稿](./create_draft.md)
|
||
- [添加视频](./add_videos.md)
|
||
- [添加音频](./add_audios.md)
|
||
- [添加图片](./add_images.md)
|
||
- [生成视频](./gen_video.md)
|
||
|
||
---
|
||
|
||
<div align="right">
|
||
|
||
📚 **项目资源**
|
||
**GitHub**: [https://github.com/Hommy-master/capcut-mate](https://github.com/Hommy-master/capcut-mate)
|
||
**Gitee**: [https://gitee.com/taohongmin-gitee/capcut-mate](https://gitee.com/taohongmin-gitee/capcut-mate)
|
||
|
||
</div> |