![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/domains/soundstudiopro.com/private_html/ |
<?php
/**
* Fix Track 313 Missing Variations
* Automatically restores missing variations from API.Box or task_results
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once __DIR__ . '/config/database.php';
$pdo = getDBConnection();
if (!$pdo) {
die("<h2>❌ Database connection failed</h2>");
}
$track_id = 313;
echo "<h2>🔧 Fixing Track #313 Variations</h2>";
echo "<style>
body { font-family: Arial, sans-serif; padding: 20px; background: #0a0a0a; color: #fff; }
.section { background: rgba(255,255,255,0.05); padding: 20px; margin: 20px 0; border-radius: 12px; border: 1px solid rgba(102,126,234,0.3); }
.error { color: #f59e0b; }
.success { color: #48bb78; }
.info { color: #667eea; }
pre { background: rgba(0,0,0,0.3); padding: 15px; border-radius: 8px; overflow-x: auto; }
</style>";
// Get track info
try {
$stmt = $pdo->prepare("SELECT id, title, task_id, variations_count FROM music_tracks WHERE id = ?");
$stmt->execute([$track_id]);
$track = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$track) {
die("<div class='section error'><h3>❌ Track #313 not found</h3></div>");
}
echo "<div class='section'>";
echo "<h3>📊 Track Info</h3>";
echo "<p><strong>Title:</strong> " . htmlspecialchars($track['title']) . "</p>";
echo "<p><strong>Task ID:</strong> " . htmlspecialchars($track['task_id'] ?? 'N/A') . "</p>";
echo "<p><strong>Expected variations:</strong> {$track['variations_count']}</p>";
echo "</div>";
// Get current variations count
$stmt = $pdo->prepare("SELECT COUNT(*) as count FROM audio_variations WHERE track_id = ?");
$stmt->execute([$track_id]);
$current = $stmt->fetch(PDO::FETCH_ASSOC);
$current_count = (int)$current['count'];
echo "<div class='section'>";
echo "<h3>🔍 Current State</h3>";
echo "<p>Variations in database: <strong>{$current_count}</strong></p>";
if ($current_count >= $track['variations_count']) {
echo "<p class='success'>✅ All variations are already stored!</p>";
echo "</div>";
exit;
}
echo "<p class='error'>⚠️ Missing " . ($track['variations_count'] - $current_count) . " variation(s)</p>";
echo "</div>";
// Download function (defined before use)
function downloadAndStoreAudio($audioUrl, $taskId, $type = 'main', $variationIndex = null) {
if (empty($audioUrl) || !filter_var($audioUrl, FILTER_VALIDATE_URL)) {
return null;
}
$audioDir = __DIR__ . '/audio_files/';
if (!is_dir($audioDir)) {
mkdir($audioDir, 0755, true);
}
$extension = pathinfo(parse_url($audioUrl, PHP_URL_PATH), PATHINFO_EXTENSION) ?: 'mp3';
if ($type === 'variation' && $variationIndex !== null) {
$filename = "{$taskId}_variation_{$variationIndex}.{$extension}";
} else {
$filename = "{$taskId}.{$extension}";
}
$localPath = $audioDir . $filename;
$webPath = '/audio_files/' . $filename;
if (file_exists($localPath)) {
return $webPath;
}
$context = stream_context_create([
'http' => [
'timeout' => 300,
'user_agent' => 'Mozilla/5.0'
]
]);
$audioContent = @file_get_contents($audioUrl, false, $context);
if ($audioContent === false) {
return null;
}
if (file_put_contents($localPath, $audioContent, LOCK_EX)) {
chmod($localPath, 0644);
return $webPath;
}
return null;
}
// Try to restore from task_results JSON first
$restored = false;
if (!empty($track['task_id'])) {
$taskResultsFile = __DIR__ . "/task_results/{$track['task_id']}.json";
if (file_exists($taskResultsFile)) {
echo "<div class='section'>";
echo "<h3>📄 Restoring from task_results JSON</h3>";
$jsonContent = file_get_contents($taskResultsFile);
$callbackData = json_decode($jsonContent, true);
if ($callbackData && isset($callbackData['data']['data']) && is_array($callbackData['data']['data'])) {
$audioData = $callbackData['data']['data'];
echo "<p class='info'>Found " . count($audioData) . " variation(s) in JSON file</p>";
if (empty($audioUrl) || !filter_var($audioUrl, FILTER_VALIDATE_URL)) {
return null;
}
$audioDir = __DIR__ . '/audio_files/';
if (!is_dir($audioDir)) {
mkdir($audioDir, 0755, true);
}
$extension = pathinfo(parse_url($audioUrl, PHP_URL_PATH), PATHINFO_EXTENSION) ?: 'mp3';
if ($type === 'variation' && $variationIndex !== null) {
$filename = "{$taskId}_variation_{$variationIndex}.{$extension}";
} else {
$filename = "{$taskId}.{$extension}";
}
$localPath = $audioDir . $filename;
$webPath = '/audio_files/' . $filename;
if (file_exists($localPath)) {
return $webPath;
}
$context = stream_context_create([
'http' => [
'timeout' => 300,
'user_agent' => 'Mozilla/5.0'
]
]);
$audioContent = @file_get_contents($audioUrl, false, $context);
if ($audioContent === false) {
return null;
}
if (file_put_contents($localPath, $audioContent, LOCK_EX)) {
chmod($localPath, 0644);
return $webPath;
}
return null;
}
$pdo->beginTransaction();
try {
// Get existing variation indices
$stmt = $pdo->prepare("SELECT variation_index FROM audio_variations WHERE track_id = ?");
$stmt->execute([$track_id]);
$existing_indices = array_column($stmt->fetchAll(PDO::FETCH_ASSOC), 'variation_index');
$storedCount = 0;
$variationIndex = 0;
foreach ($audioData as $originalIndex => $variation) {
// Skip if we already have this index
if (in_array($originalIndex, $existing_indices)) {
continue;
}
// Get audio URL from any available field
$variationAudioUrl = $variation['audio_url'] ?? $variation['source_audio_url'] ?? $variation['stream_audio_url'] ?? null;
if (empty($variationAudioUrl)) {
echo "<p class='error'>⚠️ Skipping variation {$originalIndex} - no audio URL</p>";
continue;
}
// Download audio
$localVariationUrl = downloadAndStoreAudio($variationAudioUrl, $track['task_id'], 'variation', $variationIndex);
// Generate title
$variationTitle = $variation['title'] ?? null;
if (!$variationTitle) {
$titleParts = [];
if (!empty($variation['tags'])) {
$tags = is_array($variation['tags']) ? $variation['tags'] : explode(',', $variation['tags']);
$titleParts = array_slice($tags, 0, 3);
}
$variationTitle = !empty($titleParts) ? implode(', ', $titleParts) : "Variation " . ($variationIndex + 1);
}
// Prepare metadata
$variationMetadata = [
'genre' => $variation['genre'] ?? null,
'style' => $variation['style'] ?? null,
'bpm' => $variation['bpm'] ?? null,
'key' => $variation['key'] ?? null,
'mood' => $variation['mood'] ?? null,
'energy' => $variation['energy'] ?? null,
'instruments' => $variation['instruments'] ?? null,
'tags' => $variation['tags'] ?? null,
'duration' => $variation['duration'] ?? null,
'title' => $variationTitle,
'original_index' => $originalIndex
];
// Insert variation
$stmt = $pdo->prepare("
INSERT INTO audio_variations
(track_id, variation_index, audio_url, duration, title, tags, image_url, source_audio_url, stream_audio_url, metadata)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
");
$result = $stmt->execute([
$track_id,
$originalIndex, // Use original index from API
$localVariationUrl ?: $variationAudioUrl,
$variation['duration'] ?? null,
$variationTitle,
is_array($variation['tags']) ? implode(', ', $variation['tags']) : ($variation['tags'] ?? null),
$variation['image_url'] ?? null,
$variation['source_audio_url'] ?? null,
$variation['stream_audio_url'] ?? null,
json_encode($variationMetadata)
]);
if ($result) {
$storedCount++;
$variationIndex++;
echo "<p class='success'>✅ Stored variation index {$originalIndex}</p>";
} else {
echo "<p class='error'>❌ Failed to store variation index {$originalIndex}</p>";
}
}
$pdo->commit();
$restored = true;
echo "<p class='success'><strong>✅ Successfully restored {$storedCount} variation(s)!</strong></p>";
} catch (Exception $e) {
$pdo->rollBack();
echo "<p class='error'>❌ Error: " . htmlspecialchars($e->getMessage()) . "</p>";
}
} else {
echo "<p class='error'>❌ Invalid JSON structure in task_results file</p>";
}
echo "</div>";
}
}
// If not restored from JSON, try API.Box
if (!$restored && !empty($track['task_id'])) {
echo "<div class='section'>";
echo "<h3>☁️ Trying API.Box</h3>";
$api_key = '63edba40620216c5aa2c04240ac41dbd';
$api_url = "https://api.api.box/api/v1/status/{$track['task_id']}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_url);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code === 200) {
$api_data = json_decode($response, true);
$api_variations = [];
if (isset($api_data['data']['data']) && is_array($api_data['data']['data'])) {
$api_variations = $api_data['data']['data'];
} elseif (isset($api_data['data']) && is_array($api_data['data'])) {
$api_variations = $api_data['data'];
}
if (!empty($api_variations)) {
echo "<p class='info'>Found " . count($api_variations) . " variation(s) in API.Box</p>";
echo "<p class='error'>⚠️ API.Box restore not yet implemented. Please use restore_variations.php or the admin tool.</p>";
}
} else {
echo "<p class='error'>❌ Failed to fetch from API.Box: HTTP {$http_code}</p>";
}
echo "</div>";
}
// Final check
$stmt = $pdo->prepare("SELECT COUNT(*) as count FROM audio_variations WHERE track_id = ?");
$stmt->execute([$track_id]);
$final = $stmt->fetch(PDO::FETCH_ASSOC);
$final_count = (int)$final['count'];
echo "<div class='section'>";
echo "<h3>✅ Final Result</h3>";
echo "<p>Variations now in database: <strong>{$final_count}</strong></p>";
if ($final_count >= $track['variations_count']) {
echo "<p class='success'>✅ All variations restored!</p>";
} else {
echo "<p class='error'>⚠️ Still missing " . ($track['variations_count'] - $final_count) . " variation(s)</p>";
}
echo "<p><a href='/track.php?id={$track_id}' style='color: #667eea;'>View Track Page</a></p>";
echo "</div>";
} catch (Exception $e) {
echo "<div class='section error'><h3>❌ Error</h3><p>" . htmlspecialchars($e->getMessage()) . "</p></div>";
}
?>