const axios = require('axios');
const fs = require('fs');
const FormData = require('form-data');
const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://api.yelinai.com/v1';
// Create video task (text-to-video)
async function createVideoTask(prompt, size = '1280x720', seconds = '15') {
const response = await axios.post(`\`$\{BASE_URL}/videos`, {
model: 'sora-2',
prompt,
size,
seconds
}, {
headers: { 'Authorization': `Bearer \`$\{API_KEY}` }
});
return response.data;
}
// Create video task (image-to-video)
async function createVideoTaskWithImage(prompt, imagePath, size = '1280x720', seconds = '10') {
const formData = new FormData();
formData.append('model', 'sora-2');
formData.append('prompt', prompt);
formData.append('size', size);
formData.append('seconds', seconds);
formData.append('input_reference', fs.createReadStream(imagePath));
const response = await axios.post(`\`$\{BASE_URL}/videos`, formData, {
headers: {
'Authorization': `Bearer \`$\{API_KEY}`,
...formData.getHeaders()
}
});
return response.data;
}
// Poll for status
async function waitForVideo(videoId, pollInterval = 5000, timeout = 600000) {
const startTime = Date.now();
while (true) {
// Check timeout
if (Date.now() - startTime > timeout) {
throw new Error(`Video generation timeout (\`$\{timeout/1000}s)`);
}
// Query status
const response = await axios.get(`\`$\{BASE_URL}/videos/\`$\{videoId}`, {
headers: { 'Authorization': `Bearer \`$\{API_KEY}` }
});
const task = response.data;
const { status, progress = 0 } = task;
console.log(`Status: \`$\{status}, Progress: \`$\{progress}%`);
if (status === 'completed') {
return task;
} else if (status === 'failed') {
const error = task.error || {};
throw new Error(`Generation failed: \`$\{error.message || 'Unknown error'}`);
}
// Wait before retry
await new Promise(resolve => setTimeout(resolve, pollInterval));
}
}
// Download video
async function downloadVideo(videoId, savePath = 'video.mp4') {
const response = await axios.get(
`\`$\{BASE_URL}/videos/\`$\{videoId}/content`,
{
headers: { 'Authorization': `Bearer \`$\{API_KEY}` },
responseType: 'stream'
}
);
const writer = fs.createWriteStream(savePath);
response.data.pipe(writer);
return new Promise((resolve, reject) => {
writer.on('finish', () => {
console.log(`Video saved to: \`$\{savePath}`);
resolve();
});
writer.on('error', reject);
});
}
// Complete workflow (text-to-video)
async function generateVideoAsync(prompt, size = '1280x720', seconds = '15') {
try {
console.log('1. Creating video task...');
const task = await createVideoTask(prompt, size, seconds);
const videoId = task.id;
console.log(` Task ID: \`$\{videoId}`);
console.log('\n2. Waiting for video generation...');
const completedTask = await waitForVideo(videoId);
const duration = completedTask.completed_at - completedTask.created_at;
console.log(` Completed! Duration: \`$\{duration}s`);
console.log('\n3. Downloading video...');
await downloadVideo(videoId);
console.log('\n✅ Done!');
} catch (error) {
console.error('Error:', error.message);
}
}
// Complete workflow (image-to-video)
async function generateVideoFromImageAsync(imagePath, prompt, size = '1280x720', seconds = '10') {
try {
if (!fs.existsSync(imagePath)) {
console.error(`Error: Image file not found \`$\{imagePath}`);
return null;
}
console.log(`1. Uploading image and creating task... (\`$\{imagePath})`);
const task = await createVideoTaskWithImage(prompt, imagePath, size, seconds);
const videoId = task.id;
console.log(` Task ID: \`$\{videoId}`);
console.log('\n2. Waiting for video generation...');
const completedTask = await waitForVideo(videoId);
const duration = completedTask.completed_at - completedTask.created_at;
console.log(` Completed! Duration: \`$\{duration}s`);
console.log('\n3. Downloading video...');
await downloadVideo(videoId, `image_to_video_\`$\{videoId}.mp4`);
console.log('\n✅ Done!');
return videoId;
} catch (error) {
console.error('Error:', error.message);
return null;
}
}
// Usage examples
// Text-to-video
generateVideoAsync(
'A cute cat playing with a ball in a sunny garden',
'1280x720', // Landscape
'15' // 15 seconds
);
// Image-to-video
generateVideoFromImageAsync(
'/path/to/your/image.png',
'Animate this scene with natural dynamic effects',
'1280x720', // Landscape
'10' // 10 seconds
);