Automatyzacja przepływu wideo przy użyciu API Snapencode
Naucz się budować pełnie automatyczny przepływ wideo, od załadunku do przetwarzania i dostarczania, korzystając z klienta API Snapencode oraz prostego skryptu Node.js.

W dzisiejszym świecie opartym na treściach, ręczne przesyłanie i procesowanie wideo może być poważnym utrudnieniem, zwalniając cały łańcuch produkcyjny. Prawdziwa siła platformy takiej jak Snapencode polega na jej projektowaniu opartym na API, które pozwala automatyzować te powtarzające się zadania i odzyskać cenne czas.
W tym przewodniku zbudujemy praktyczny skrypt “folderu obserwacyjnego” (watch folder), który monitoruje katalogi dla nowych plików wideo, automatycznie przesyłając je do Snapencode i potwierdzając status ich procesowania.
Celem: Skrypt “Folderu Obserwacyjnego”
Naszym celem jest stworzenie skryptu Node.js, który osiągnie następujące cele:
- Monitoruje określony katalog na lokalnym komputerze lub serwerze.
- Gdy nowy plik wideo (
.mp4
,.mov
itp.) zostanie dodany, automatycznie go przesyła do wyznaczonej kolekcji w Snapencode. - Po przesłaniu, poluje na endpoint statusu aż do momentu gdy wideo zostanie “zakończone.”
- Gdy zostanie zakończone, loguje ID wideo i jest gotowe do następnego pliku.
To idealne rozwiązanie dla przepływów pracy, gdzie treści są generowane programowo lub wprowadzane przez niezaufanych członków zespołu.
Przygotowania
- Klucz API Snapencode: Generuj go ze swojego panelu w Ustawienia > Klucze API.
- Node.js: Będziemy używać JavaScript i środowisko Node.js do naszego skryptu.
axios
ichokidar
: Dwie proste pakiety do robienia zapytań API i obserwacji plików.
npm install axios chokidar form-data
Budowanie Skryptu Automatyzacyjnego
Stworzymy jeden, kompletny skrypt. Nazwijmy go upload-watcher.js
.
Krok 1: Konfiguracja Skryptu
Po pierwsze, ustalimy zmienne konfiguracyjne i zaimportujemy niezbędne biblioteki na początku naszego pliku upload-watcher.js
.
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const path = require('path');
const chokidar = require('chokidar');
// --- Konfiguracja ---
const API_BASE_URL = 'https://twoja-domena-snapencode.com/api/client/v1';
const API_KEY = process.env.Snapencode_API_KEY || 'sk_twoj_klucz_api_tutaj'; // Najlepsze praktyki: używaj zmiennych środowiskowych
const TARGET_FOLDER = 'root/automatyczne-wgrania'; // Ścieżka kolekcji w Snapencode
const WATCH_DIRECTORY = './videos-do-wgrania';
// Zbiór do przechowywania plików aktualnie będących w procesie, aby uniknąć podwójnych przesyłań
const processingFiles = new Set();
Używanie zmiennych środowiskowych (process.env.Snapencode_API_KEY
) dla klucza API jest znacznie bezpieczniejsze niż kodowanie go bezpośrednio w skrypcie.
Krok 2: Stworzenie Głównych Funkcji
Następnie dodajemy dwie główne funkcje: jedną do obsługi przesyłu pliku i drugą do monitorowania statusu procesowania.
// (Dodaj ten kod poniżej sekcji konfiguracji)
async function uploadVideo(filePath) {
console.log(`[WGRAJĄC] Rozpoczynamy wgranie dla: ${path.basename(filePath)}`);
processingFiles.add(filePath); // Oznacz plik jako aktualnie będący w procesie
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] Wgranie przyjęte! ID wideo: ${response.data.data.id}`);
return response.data.data.id;
} catch (error) {
console.error(`[FAŁSZ] Wgranie nie powiodło się dla ${path.basename(filePath)}:`, error.response?.data?.message || error.message);
return null;
}
}
async function monitorStatus(videoId, filePath) {
if (!videoId) {
processingFiles.delete(filePath); // Usuń z zestawu procesów na niepowodzeniu
return;
}
console.log(`[MONITORING] Obserwuje status dla ID wideo: ${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) { // Zakończone
console.log(`✅ [ZAKOŃCZONE] Procesowanie zakończone dla ID wideo: ${videoId}!`);
clearInterval(interval);
processingFiles.delete(filePath); // Usuń z zestawu na sukcesie
} else if (status === 7) { // Niepowiodło się
console.error(`❌ [NIEPOWODZIŁO] Procesowanie nie powiodło się dla ID wideo: ${videoId}.`);
clearInterval(interval);
processingFiles.delete(filePath);
} else {
console.log(`[STATUS] ID wideo ${videoId}: ${status_text} (${status})`);
}
} catch (error) {
console.error(`[BŁĄD] Nie mogło się pobrać statusu dla ${videoId}:`, error.message);
clearInterval(interval);
processingFiles.delete(filePath);
}
}, 5000); // Sprawdź co 5 sekund
}
Ten skrypt demonstruje interakcję serwer-serwer. Nigdy nie udostępniaj swojego klucza API w kodzie klienta.
Krok 3: Inicjalizacja Obserwatora Plików
Na końcu dodajemy logikę chokidar
na koniec skryptu. Ten będzie obserwował katalogi i wywoła nasze funkcje gdy nowy plik zostanie dodany.
// (Dodaj ten kod na końcu pliku)
function initializeWatcher() {
console.log(`--- Snapencode Watch Folder Zainicjowany ---`);
console.log(`Obserwuje nowe wideo w: ${path.resolve(WATCH_DIRECTORY)}`);
if (!fs.existsSync(WATCH_DIRECTORY)) {
console.log(`Tworzę katalog obserwowany...`);
fs.mkdirSync(WATCH_DIRECTORY, { recursive: true });
}
const watcher = chokidar.watch(WATCH_DIRECTORY, {
ignored: /(^|[\/\\])\../, // ignoruj pliki zaczynające się od punktu
persistent: true,
ignoreInitial: true, // Nie wgruj plików które są już tam na starcie
});
watcher.on('add', (filePath) => {
if (processingFiles.has(filePath)) {
return; // Przeskocz jeśli jesteśmy już w procesie
}
console.log(`[DETECTOWANO] Nowy plik: ${path.basename(filePath)}`);
// Czekaj chwilę aby upewnić się że plik jest całkowicie zapisany przed przesłaniem
setTimeout(async () => {
const videoId = await uploadVideo(filePath);
await monitorStatus(videoId, filePath);
}, 2000);
});
}
initializeWatcher();
Krok 4: Uruchom Twój Obserwator
Z skryptem upload-watcher.js
ukończonym, możesz go uruchomić z terminala.
# Najlepsze praktyki: Ustaw klucz API jako zmienną środowiskową
export Snapencode_API_KEY="sk_twoj_klucz_api_tutaj"
# Uruchom skrypt
node upload-watcher.js
Teraz, każdy nowy plik wideo który zostanie wprowadzony do katalogu ./videos-do-wgrania
zostanie automatycznie przesyłany i procesowany!