UNPKG

@warriorteam/redai-zalo-sdk

Version:

Comprehensive TypeScript/JavaScript SDK for Zalo APIs - Official Account, ZNS, Consultation Service, Group Messaging, and Social APIs

229 lines (186 loc) 7.56 kB
/** * Example: Combined Video Upload and Status Checking * * This example demonstrates how to use the new combined method * uploadVideoAndWaitForCompletion() which handles both video upload * and status checking in a single call. */ import { ZaloSDK, VideoUploadStatus } from '../src/index'; import * as fs from 'fs'; async function videoUploadCombinedExample() { // Initialize SDK const zalo = new ZaloSDK(); // Your access token const accessToken = "YOUR_ACCESS_TOKEN"; try { console.log("🚀 Starting combined video upload example..."); // Read video file const videoBuffer = fs.readFileSync('./path/to/your/video.mp4'); console.log(`📁 Video file size: ${videoBuffer.length} bytes`); // Method 1: Combined upload and wait for completion console.log("\n📤 Method 1: Using combined uploadVideoAndWaitForCompletion()"); const startTime = Date.now(); const finalResult = await zalo.videoUpload.uploadVideoAndWaitForCompletion( accessToken, videoBuffer, "example-video.mp4", 5 * 60 * 1000, // 5 minutes timeout 5 * 1000 // 5 seconds polling interval ); const duration = Date.now() - startTime; console.log(`✅ Video upload completed in ${duration}ms`); console.log(`📹 Video ID: ${finalResult.video_id}`); console.log(`📊 Status: ${finalResult.status} (${getStatusDescription(finalResult.status)})`); console.log(`📝 Status Message: ${finalResult.status_message}`); console.log(`🎬 Video Name: ${finalResult.video_name}`); console.log(`📏 Video Size: ${finalResult.video_size} bytes`); console.log(`🔄 Convert Progress: ${finalResult.convert_percent}%`); // Method 2: Manual step-by-step approach (for comparison) console.log("\n📤 Method 2: Manual step-by-step approach"); // Step 1: Upload video const uploadResult = await zalo.videoUpload.uploadVideo( accessToken, videoBuffer, "example-video-manual.mp4" ); console.log(`🎫 Upload token: ${uploadResult.token}`); // Step 2: Check status manually let attempts = 0; const maxAttempts = 60; // 5 minutes with 5-second intervals while (attempts < maxAttempts) { const status = await zalo.videoUpload.checkVideoStatus(accessToken, uploadResult.token); console.log(`🔍 Attempt ${attempts + 1}: Status ${status.status} - ${status.status_message} (${status.convert_percent}%)`); if (status.status === VideoUploadStatus.SUCCESS && status.video_id) { console.log(`✅ Manual upload completed!`); console.log(`📹 Video ID: ${status.video_id}`); break; } if (status.status === VideoUploadStatus.FAILED) { console.error(`❌ Manual upload failed: ${status.status_message}`); break; } if (status.status === VideoUploadStatus.LOCKED) { console.error(`🔒 Video has been locked: ${status.status_message}`); break; } if (status.status === VideoUploadStatus.DELETED) { console.error(`🗑️ Video has been deleted: ${status.status_message}`); break; } // Continue polling for PROCESSING or UNKNOWN status await new Promise(resolve => setTimeout(resolve, 5000)); attempts++; } if (attempts >= maxAttempts) { console.error(`⏰ Manual upload timeout after ${maxAttempts} attempts`); } // Method 3: Upload from URL (bonus feature) console.log("\n🌐 Method 3: Upload video from URL"); try { const urlUploadResult = await zalo.videoUpload.uploadVideoFromUrl( accessToken, "https://example.com/sample-video.mp4" ); console.log(`🎫 URL upload token: ${urlUploadResult.token}`); // Wait for completion const urlFinalResult = await zalo.videoUpload.waitForUploadCompletion( accessToken, urlUploadResult.token ); console.log(`✅ URL upload completed!`); console.log(`📹 Video ID: ${urlFinalResult.video_id}`); } catch (error) { console.log(`ℹ️ URL upload example skipped (URL not accessible): ${error.message}`); } } catch (error) { console.error("❌ Error in video upload example:", error); if (error.message.includes("Token cannot be empty")) { console.log("💡 Please set your access token in the example"); } if (error.message.includes("Video file size exceeds")) { console.log("💡 Video file is too large. Maximum size is 50MB"); } if (error.message.includes("Unsupported video format")) { console.log("💡 Only MP4 and AVI formats are supported"); } } } /** * Get human-readable status description */ function getStatusDescription(status: number): string { switch (status) { case VideoUploadStatus.UNKNOWN: return "Trạng thái không xác định"; case VideoUploadStatus.SUCCESS: return "Video đã được xử lý thành công và có thể sử dụng"; case VideoUploadStatus.LOCKED: return "Video đã bị khóa"; case VideoUploadStatus.PROCESSING: return "Video đang được xử lý"; case VideoUploadStatus.FAILED: return "Video xử lý thất bại"; case VideoUploadStatus.DELETED: return "Video đã bị xóa"; default: return "Unknown status"; } } /** * Example usage with error handling and retry logic */ async function robustVideoUploadExample() { const zalo = new ZaloSDK(); const accessToken = "YOUR_ACCESS_TOKEN"; try { const videoBuffer = fs.readFileSync('./path/to/your/video.mp4'); // Retry logic for robust upload const maxRetries = 3; let attempt = 0; while (attempt < maxRetries) { try { console.log(`🔄 Upload attempt ${attempt + 1}/${maxRetries}`); const result = await zalo.videoUpload.uploadVideoAndWaitForCompletion( accessToken, videoBuffer, "robust-upload.mp4", 10 * 60 * 1000, // 10 minutes timeout 3 * 1000 // 3 seconds polling interval ); console.log(`✅ Upload successful on attempt ${attempt + 1}`); console.log(`📹 Video ID: ${result.video_id}`); return result; } catch (error) { attempt++; console.log(`❌ Attempt ${attempt} failed: ${error.message}`); if (attempt >= maxRetries) { throw new Error(`Upload failed after ${maxRetries} attempts: ${error.message}`); } // Wait before retry console.log(`⏳ Waiting 10 seconds before retry...`); await new Promise(resolve => setTimeout(resolve, 10000)); } } } catch (error) { console.error("❌ Robust upload failed:", error); } } // Run examples if (require.main === module) { console.log("🎬 Zalo Video Upload Combined Example"); console.log("=====================================\n"); videoUploadCombinedExample() .then(() => { console.log("\n🎯 Basic example completed"); return robustVideoUploadExample(); }) .then(() => { console.log("\n🛡️ Robust example completed"); console.log("\n✨ All examples completed successfully!"); }) .catch(error => { console.error("\n💥 Example failed:", error); process.exit(1); }); } export { videoUploadCombinedExample, robustVideoUploadExample };