ビデオワークフローを自動化するにはSnapencode APIを使用する
Node.jsスクリプトを使って、アップロードから処理までの完全な自動化されたビデオパイプラインを作成してみましょう。Snapencodeクライアント向けAPIと簡単なNode.jsスクリプトを使用します。

今日のコンテンツドライブ世界では、手動でビデオをアップロードして処理することは、コンテンツパイプライン全体に重大なボトルネックとなります。プラットフォームのようなSnapencodeのAPIファースト設計は、これらの繰り返しタスクを自動化し、貴重な時間を取り戻すことができるようにします。
このチュートリアルでは、「ウォッチフォルダ」スクリプトを作成して、ディレクトリ内の新しいビデオファイルを監視し、Snapencodeに自動的にアップロードし、その処理状態を確認する方法を説明します。
ゴール: 「ウォッチフォルダ」アップローダー
私たちの目標は、Node.jsスクリプトを作成して、次のことを実行することです。
- 指定されたディレクトリを監視する
- 新しいビデオファイル (
.mp4
、.mov
など) が追加されると、それを指定されたコレクションに自動的にアップロードする - アップロード後、ステータスエンドポイントをポーリングして、ビデオが「完了」になったときまで待つ
- 完了したら、ビデオのIDとログし、次のファイルに進む
これは、プログラムでコンテンツを生成したり、非技術的なチームメンバーによって共有フォルダにドロップしたりするワークフローにとって、完璧なソリューションです。
必要事項
- Snapencode API キー: ダッシュボードの「設定 > API キー」から生成してください。
- Node.js: スクリプトを実行するために使用します。
axios
とchokidar
: 2 つのシンプルなパッケージで、API リクエストとファイルの監視を行います。
npm install axios chokidar form-data
スクリプトを作成する
単一のスクリプトを生成します。upload-watcher.js
と名付けましょう。
ステップ 1: スクリプトの設定
まず、必要なライブラリと構成変数を 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();
API キーは、環境変数 (process.env.Snapencode_API_KEY
) を使用して保護することをお勧めします。直接スクリプトに埋め込まないようにしてください。
ステップ 2: メインの機能を作成
次に、ファイルアップロードと処理状態監視を行う 2 つのメイン関数を追加します。
// (設定セクションの下に追加)
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
ロジックをスクリプトの最後に追加します。これにより、ディレクトリ内の新しいファイルが検出されると、機能がトリガーされます。
// (ファイルの末尾に追加)
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
ディレクトリにドロップした新しいビデオファイルはすべて自動的にアップロードされ、処理されます!