btg-sandbox-video-upscaler/api_client.php
DJP dd61900772 Initial commit: Video Enhancement Portal
- Complete PHP web application for video enhancement using Topaz Labs API
- Features include multiple AI models, resolution scaling, and real-time progress tracking
- Microsoft authentication integration with secure session management
- Comprehensive README with installation and configuration guide
- Security-focused .gitignore to protect sensitive configuration

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-17 14:40:40 -04:00

167 lines
No EOL
5.1 KiB
PHP

<?php
class TopazApiClient {
private $apiKey;
public function __construct($apiKey) {
$this->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();
}
}
?>