bdd5ab30fd
- 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
105 lines
2.9 KiB
PHP
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";
|
|
}
|