Files
easystream/app_scripts/cdn/upload_to_cdn.php
T
Krystie bdd5ab30fd feat: Add multi-CDN integration for global video delivery
- Create CDN manager with multi-provider support (Bunny, Cloudflare, S3, Backblaze, Wasabi)
- Implement automatic CDN upload and failover system
- Add multi-quality video support (360p-2160p)
- Build quality selector UI with auto-detection
- Track CDN bandwidth usage for cost monitoring
- Implement cache purging API
- Add background CDN upload worker script
- Create comprehensive CDN documentation

Features:
- Multi-CDN support with priority-based failover
- BunnyCDN, Cloudflare R2, AWS S3, Backblaze B2, Wasabi integration
- Multi-quality delivery (adaptive quality selection)
- Auto quality based on connection speed
- User preference persistence
- Bandwidth tracking per provider
- Cache purge API
- Cost optimization strategies
- Production-ready with error handling
2026-03-30 17:45:23 -07:00

105 lines
2.9 KiB
PHP

<?php
/**
* Upload Videos to CDN
* Background worker for CDN uploads
*
* Usage:
* php upload_to_cdn.php <video_id> [quality]
* php upload_to_cdn.php --all (upload all pending videos)
*/
require_once dirname(__DIR__, 2) . '/f_core/config.boot.php';
require_once dirname(__DIR__, 2) . '/f_core/f_classes/class.cdn.php';
require_once dirname(__DIR__, 2) . '/f_core/f_classes/class.logger.php';
$logger = new VLogger('cdn_upload');
$cdn = new VCDN();
// Parse arguments
$video_id = $argv[1] ?? null;
$quality = $argv[2] ?? 'original';
if ($video_id === '--all') {
uploadAllPending();
} elseif ($video_id) {
uploadSingleVideo($video_id, $quality);
} else {
echo "Usage: php upload_to_cdn.php <video_id> [quality]\n";
echo " php upload_to_cdn.php --all\n";
exit(1);
}
function uploadSingleVideo($video_id, $quality) {
global $cdn, $logger, $class_database;
$logger->info("Starting CDN upload for video $video_id ($quality)");
// Get video file path
$sql = "SELECT file_path FROM db_videofiles WHERE video_id = ?";
$result = $class_database->execute($sql, [$video_id]);
if (!$result || $class_database->rowCount($result) == 0) {
$logger->error("Video $video_id not found");
return false;
}
$row = $class_database->fetch($result);
$local_path = $row['file_path'];
if (!file_exists($local_path)) {
$logger->error("Video file not found: $local_path");
return false;
}
// Upload to CDN
$success = $cdn->uploadVideo($video_id, $local_path, $quality);
if ($success) {
$logger->info("Successfully uploaded video $video_id to CDN");
echo "✓ Uploaded video $video_id ($quality)\n";
} else {
$logger->error("Failed to upload video $video_id to CDN");
echo "✗ Failed to upload video $video_id\n";
}
return $success;
}
function uploadAllPending() {
global $cdn, $logger, $class_database;
$logger->info("Starting batch CDN upload for all pending videos");
// Find videos not yet uploaded to CDN
$sql = "SELECT v.video_id, v.file_path
FROM db_videofiles v
LEFT JOIN db_cdn_cache_status ccs ON v.video_id = ccs.video_id
AND ccs.status = 'ready'
WHERE ccs.cache_id IS NULL
LIMIT 100";
$result = $class_database->execute($sql);
if (!$result) {
$logger->error("Failed to query pending uploads");
return;
}
$count = 0;
$success_count = 0;
while ($row = $class_database->fetch($result)) {
$count++;
if (uploadSingleVideo($row['video_id'], 'original')) {
$success_count++;
}
// Rate limiting (don't overwhelm CDN)
sleep(2);
}
$logger->info("Batch upload complete: $success_count/$count successful");
echo "\nBatch upload complete: $success_count/$count successful\n";
}