基于Snapencode API自动化您的视频工作流程
学习如何使用Snapencode客户端API和简单的Node.js脚本构建一个从上传到处理和交付的完全自动化视频管道。

在今天的内容驱动世界中,手动视频上传和处理可能会成为一个显著的瓶颈,拖慢整个内容管道。Snapencode平台的API优先设计使得我们能够自动化这些重复任务并恢复宝贵的时间。
在本教程中,我们将构建一个实用的“监视文件夹”脚本,它会监控特定目录中的新视频文件,自动上传它们到Snapencode,并确认处理状态。
目标:一个“监视文件夹”上传器
我们的目标是创建一个Node.js脚本,它实现以下功能:
- 监视本地机器或服务器上的特定目录。
- 当添加新视频文件(
.mp4
,.mov
等)时,它会自动将它们上传到Snapencode的指定集合中。 - 上传后,它会轮询状态端点直到视频完成。
- 一旦完成,它就会记录视频ID并准备下一个文件。
这是一种完美的解决方案,适用于内容通过程序生成或非技术人员将其放入共享文件夹的工作流中。
前提条件
- Snapencode API Key: 从你的仪表盘下 设置 > API密钥 中生成一个。
- Node.js: 我们将使用JavaScript和Node.js运行时来编写脚本。
axios
和chokidar
: 两种简单的包,用于发送API请求和监视文件。
npm install axios chokidar form-data
构建自动化脚本
我们将创建一个单独的完整脚本。让我们称它为 upload-watcher.js
。
步骤 1:配置脚本
首先,让我们在我们的 upload-watcher.js
文件顶部设置配置变量和导入必要库。
upload-watcher.js
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const path = require('path');
const chokidar = require('chokidar');
// --- 配置 ---
const API_BASE_URL = 'https://your-Snapencode-domain.com/api/client/v1';
const API_KEY = process.env.Snapencode_API_KEY || 'sk_your_api_key_here'; // 最佳实践:使用环境变量
const TARGET_FOLDER = 'root/automated-uploads'; // Snapencode中的集合路径
const WATCH_DIRECTORY = './videos-to-upload';
// 一个集合,跟踪当前正在处理的文件,以避免双重上传
const processingFiles = new Set();
使用环境变量(process.env.Snapencode_API_KEY
)来存储API密钥比直接在脚本中硬编码更安全。
步骤 2:创建核心函数
下一步,添加两个主要函数:一个用于处理文件上传,另一个用于监视处理状态。
upload-watcher.js
// (在配置部分下方添加此代码)
async function uploadVideo(filePath) {
console.log(`[UPLOADING] 开始上传 ${path.basename(filePath)}:`);
processingFiles.add(filePath); // 标记文件为正在处理
const form = new FormData();
form.append('video', fs.createReadStream(filePath));
form.append('folder', TARGET_FOLDER);
try {
const response = await axios.post(`${API_BASE_URL}/uploads`, form, {
headers: { ...form.getHeaders(), 'Authorization': `Bearer ${API_KEY}` },
});
console.log(`[成功] 上传接受!视频ID:${response.data.data.id}`);
return response.data.data.id;
} catch (error) {
console.error(`[失败] 上传 ${path.basename(filePath)} 失败:`, error.response?.data?.message || error.message);
return null;
}
}
async function monitorStatus(videoId, filePath) {
if (!videoId) {
processingFiles.delete(filePath); // 从处理集合中删除文件在失败时
return;
}
console.log(`[监视] 观察视频ID ${videoId} 的状态:`);
const interval = setInterval(async () => {
try {
const response = await axios.get(`${API_BASE_URL}/uploads/${videoId}`, {
headers: { 'Authorization': `Bearer ${API_KEY}` },
});
const { status, status_text } = response.data.data;
if (status === 6) { // 完成
console.log(`✅ [完成] 处理完成视频ID:${videoId}!`);
clearInterval(interval);
processingFiles.delete(filePath); // 从集合中删除文件在成功时
} else if (status === 7) { // 失败
console.error(`❌ [失败] 处理视频ID ${videoId} 失败。`);
clearInterval(interval);
processingFiles.delete(filePath);
} else {
console.log(`[状态] 视频ID ${videoId}:${status_text} (${status})`);
}
} catch (error) {
console.error(`[错误] 无法获取视频ID ${videoId} 的状态:`, error.message);
clearInterval(interval);
processingFiles.delete(filePath);
}
}, 5000); // 每5秒检查一次
}
这个脚本演示了服务器到服务器的交互。永远不要在客户端浏览器代码中暴露你的秘密API密钥。
步骤 3:初始化文件监视器
最后,添加 chokidar
逻辑到脚本末尾。这将监视目录并触发我们的函数,当新文件被添加时。
upload-watcher.js
// (在脚本末尾添加此代码)
function initializeWatcher() {
console.log(`--- Snapencode Watch Folder Initialized ---`);
console.log(`正在监视 ${path.resolve(WATCH_DIRECTORY)} 目录中的新视频文件:`);
if (!fs.existsSync(WATCH_DIRECTORY)) {
console.log(`创建监视目录...`);
fs.mkdirSync(WATCH_DIRECTORY, { recursive: true });
}
const watcher = chokidar.watch(WATCH_DIRECTORY, {
ignored: /(^|[\/\\])\../, // 忽略点文件
persistent: true,
ignoreInitial: true, // 在启动时忽略已存在的文件
});
watcher.on('add', (filePath) => {
if (processingFiles.has(filePath)) {
return; // 跳过正在处理的文件
}
console.log(`[检测] 新文件:${path.basename(filePath)}`);
// 等待一会儿,以确保文件完全写入后再上传
setTimeout(async () => {
const videoId = await uploadVideo(filePath);
await monitorStatus(videoId, filePath);
}, 2000);
});
}
initializeWatcher();
步骤 4:运行你的监视器
与 upload-watcher.js
文件完成后,你可以从终端中运行它。
# 最佳实践:将API密钥设置为环境变量
export Snapencode_API_KEY="sk_your_api_key_here"
# 运行脚本
node upload-watcher.js
现在,任何新视频文件你都可以将其放入 ./videos-to-upload
目录中,它都会被自动上传和处理!