apiKey = $apiKey; Logger::log('API Client initialized'); } private function makeRequest($endpoint, $method = 'GET', $data = null) { $url = Config::API_BASE_URL . $endpoint; $curl = curl_init(); $headers = [ 'X-API-Key: ' . $this->apiKey, 'Accept: application/json', 'Content-Type: application/json' ]; $options = [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => $headers, CURLOPT_CUSTOMREQUEST => $method ]; if ($data && in_array($method, ['POST', 'PATCH'])) { $options[CURLOPT_POSTFIELDS] = json_encode($data); } curl_setopt_array($curl, $options); Logger::log("Making $method request to: $url"); if ($data) { Logger::log("Request payload: " . json_encode($data, JSON_PRETTY_PRINT)); } $response = curl_exec($curl); $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); if ($error = curl_error($curl)) { Logger::log("cURL Error: $error", 'ERROR'); throw new Exception("API request failed: $error"); } curl_close($curl); Logger::log("API Response (Status: $statusCode): " . substr($response, 0, 200) . '...'); return json_decode($response, true); } public function createVideoRequest($videoInfo) { return $this->makeRequest('', 'POST', $videoInfo); } public function acceptVideoRequest($requestId) { return $this->makeRequest("$requestId/accept", 'PATCH'); } public function completeUpload($requestId, $uploadResults) { return $this->makeRequest("$requestId/complete-upload/", 'PATCH', [ 'uploadResults' => $uploadResults ]); } public function getStatus($requestId) { return $this->makeRequest("$requestId/status"); } } // uploader.php class VideoUploader { private $apiClient; public function __construct($apiClient) { $this->apiClient = $apiClient; } public function processUpload($file) { Logger::log('Starting video upload process'); // Get video information $videoInfo = $this->getVideoInfo($file); // Create enhancement request $request = $this->apiClient->createVideoRequest($videoInfo); $requestId = $request['requestId']; Logger::log("Enhancement request created: $requestId"); // Accept the request and get upload URLs $acceptResponse = $this->apiClient->acceptVideoRequest($requestId); $uploadUrls = $acceptResponse['urls']; // Upload file parts $uploadResults = $this->uploadParts($file, $uploadUrls); // Complete the upload $this->apiClient->completeUpload($requestId, $uploadResults); Logger::log('Upload completed successfully'); return $requestId; } private function getVideoInfo($file) { // Get video metadata using FFmpeg or similar tool // This is a simplified example return [ 'source' => [ 'container' => 'mp4', 'size' => filesize($file['tmp_name']), 'duration' => 0, // Should be calculated 'frameCount' => 0, // Should be calculated 'frameRate' => 30, 'resolution' => [ 'width' => 1920, 'height' => 1080 ] ], 'filters' => [ [ 'model' => 'prob-4', 'videoType' => 'Progressive', 'auto' => 'Auto' ] ], 'output' => [ 'resolution' => [ 'width' => 1920, 'height' => 1080 ], 'frameRate' => 30, 'audioCodec' => 'AAC', 'audioTransfer' => 'Copy', 'container' => 'mp4' ] ]; } private function uploadParts($file, $urls) { $results = []; $fileSize = filesize($file['tmp_name']); $partSize = ceil($fileSize / count($urls)); foreach ($urls as $index => $url) { $partNum = $index + 1; $start = $index * $partSize; // Upload the part and get ETag $eTag = $this->uploadFilePart($file['tmp_name'], $url, $start, $partSize); $results[] = [ 'partNum' => $partNum, 'eTag' => $eTag ]; Logger::log("Uploaded part $partNum with ETag: $eTag"); } return $results; } private function uploadFilePart($filePath, $url, $start, $length) { // Implementation of multipart upload // Returns ETag from S3 response return "dummy-etag-" . uniqid(); } } ?>