비디오 워크플로우를 자동화하는 방법: 스냅인코딩 API 사용하기
비디오 업로드부터 처리 및 전송까지 완전히 자동화된 비디오 파이프라인을 구축하는 방법에 대해 알아보세요. 스냅인코딩 클라이언트 접면 API와 간단한 Node.js 스크립트를 사용하여.

오늘날의 콘텐츠 중심 세계에서 수동 비디오 업로드 및 처리는 콘텐트 파이프라인의 전체 속도에 큰 장애물로 작용할 수 있습니다. 플랫폼인 Snapencode의 API-첫 번째 설계의真正한 힘은 이러한 반복적인 작업을 자동화하고 유용한 시간을 되찾아주는 것입니다.
이 튜토리얼에서, 우리는 Node.js 스크립트를 작성하여 특정 디렉터리를 모니터링하고 새 비디오 파일이 추가될 때 Snapencode로 자동으로 업로드하고 처리 상태를 확인하는 “워치 폴더” 스크립트를 구축할 것입니다.
목표: “Watch Folder” 업로더
목표는 Node.js 스크립트를 작성하여 다음을 달성하는 것입니다.
- 특정 디렉터리를 로컬 머신 또는 서버에서 모니터링합니다.
- 새 비디오 파일 (
.mp4
,.mov
등)이 추가될 때, 지정된 컬렉션에 업로드하고 Snapencode로 자동으로 업로드합니다. - 업로드 후, 상태 엔드포인트를 폴링하여 비디오가 “완료” 될 때까지 지속합니다.
- 완료되면, 비디오 ID와 로그를 기록하고 다음 파일을 준비합니다.
이것은 콘텐츠가 프로그래밍적으로 생성되거나 공유 폴더에 비디오를 드롭하는 비기술적인 팀원들이 있는 워크플로우의 완벽한 솔루션입니다.
필수 조건
- Snapencode API 키: 설정 > API 키에서 키를 생성하세요.
- Node.js: 스크립트를 작성하기 위해 JavaScript 및 Node.js 런타임을 사용합니다.
axios
및chokidar
: 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단계: 주요 함수 생성
다음으로, 업로드와 처리 상태 모니터링을 위한 두 개의 메인 함수를 추가합니다.
// (구성 섹션 아래에 코드 추가)
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(`[SUCCESS] 업로드 성공! 비디오 ID: ${response.data.data.id}`);
return response.data.data.id;
} catch (error) {
console.error(`[FAILURE] 업로드 실패: ${path.basename(filePath)}:`, error.response?.data?.message || error.message);
return null;
}
}
async function monitorStatus(videoId, filePath) {
if (!videoId) {
processingFiles.delete(filePath); // 실패 시 현재 처리 중인 파일에서 제거
return;
}
console.log(`[MONITORING] 비디오 상태 모니터링: Video 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(`✅ [COMPLETE] 처리 완료! 비디오 ID: ${videoId}!`);
clearInterval(interval);
processingFiles.delete(filePath); // 성공 시 현재 처리 중인 파일에서 제거
} else if (status === 7) { // 실패
console.error(`❌ [FAILED] 처리 실패! 비디오 ID: ${videoId}.`);
clearInterval(interval);
processingFiles.delete(filePath);
} else {
console.log(`[STATUS] 비디오 ID ${videoId}: ${status_text} (${status})`);
}
} catch (error) {
console.error(`[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(`[DETECTED] 새 파일: ${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
디렉터리에 새 비디오 파일을 추가하면 자동으로 업로드되고 처리됩니다!