![]() 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 Missing Variations for All Tracks
* Processes task_results JSON files and stores variations for tracks that are missing them
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once 'config/database.php';
// Include callback functions
define('CALLBACK_INCLUDED', true);
require_once 'callback.php';
$logFile = 'fix_variations_log.txt';
echo "<h1>🎵 Fix Missing Variations for All Tracks</h1>";
echo "<style>
.section { border: 2px solid #667eea; padding: 20px; margin: 20px 0; background: #1a1a2e; }
.good { color: #10b981; }
.bad { color: #ef4444; }
.warning { color: #f59e0b; }
table { width: 100%; border-collapse: collapse; margin: 10px 0; }
th, td { padding: 10px; border: 1px solid #333; text-align: left; }
th { background: #667eea; color: white; }
</style>";
$pdo = getDBConnection();
if (!$pdo) {
die("<p style='color: red;'>❌ Database connection failed</p>");
}
// Find all complete tracks that might be missing variations
$stmt = $pdo->prepare("
SELECT mt.id, mt.task_id, mt.title, mt.created_at, mt.variations_count,
(SELECT COUNT(*) FROM audio_variations WHERE track_id = mt.id) as actual_variations_count
FROM music_tracks mt
WHERE mt.status = 'complete'
AND mt.task_id IS NOT NULL
AND mt.task_id != ''
AND mt.task_id != 'unknown'
AND mt.task_id NOT LIKE 'temp_%'
AND mt.task_id NOT LIKE 'retry_%'
AND (
(SELECT COUNT(*) FROM audio_variations WHERE track_id = mt.id) = 0
OR mt.variations_count = 0
OR (SELECT COUNT(*) FROM audio_variations WHERE track_id = mt.id) < mt.variations_count
)
ORDER BY mt.created_at DESC
LIMIT 500
");
$stmt->execute();
$tracksToFix = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($tracksToFix)) {
echo "<p style='color: green;'>✅ No tracks found that need variations fixed!</p>";
exit;
}
echo "<p>Found " . count($tracksToFix) . " track(s) that may be missing variations</p>";
echo "<hr>";
$fixedCount = 0;
$skippedCount = 0;
$errorCount = 0;
$totalVariationsAdded = 0;
foreach ($tracksToFix as $track) {
$trackId = $track['id'];
$taskId = $track['task_id'];
$title = $track['title'];
$existingCount = $track['actual_variations_count'];
$storedCount = $track['variations_count'];
echo "<div style='border: 1px solid #ccc; padding: 15px; margin: 10px 0;'>";
echo "<h3>Track #{$trackId}: " . htmlspecialchars($title) . "</h3>";
echo "<p><strong>Task ID:</strong> {$taskId}</p>";
echo "<p><strong>Stored variations_count:</strong> {$storedCount}</p>";
echo "<p><strong>Actual variations in DB:</strong> {$existingCount}</p>";
// Check for task_results JSON file
$taskResultFile = "task_results/{$taskId}.json";
if (!file_exists($taskResultFile)) {
echo "<p style='color: orange;'>⚠️ No task_results JSON file found</p>";
$skippedCount++;
echo "</div>";
continue;
}
echo "<p style='color: green;'>✅ Found task_results JSON file</p>";
// Load and parse task_results
$taskResultContent = file_get_contents($taskResultFile);
$taskResultData = json_decode($taskResultContent, true);
if (!$taskResultData) {
echo "<p style='color: red;'>❌ Failed to parse task_results JSON</p>";
$errorCount++;
echo "</div>";
continue;
}
// Check if we have multiple items in data array
$audioData = null;
if (isset($taskResultData['data']['data']) && is_array($taskResultData['data']['data'])) {
$audioData = $taskResultData['data']['data'];
} elseif (isset($taskResultData['data']) && is_array($taskResultData['data'])) {
$audioData = $taskResultData['data'];
}
if (!$audioData || count($audioData) <= 1) {
echo "<p style='color: orange;'>⚠️ Only " . (count($audioData ?? []) ?: 0) . " item(s) in task_results (need > 1 for variations)</p>";
$skippedCount++;
echo "</div>";
continue;
}
echo "<p>Found " . count($audioData) . " items in task_results - processing as variations...</p>";
// Get current variation count
$countStmt = $pdo->prepare("SELECT COUNT(*) FROM audio_variations WHERE track_id = ?");
$countStmt->execute([$trackId]);
$currentVariationCount = $countStmt->fetchColumn();
// Clear existing variations if we're going to reprocess (to avoid duplicates)
// Or we can append - let's append to be safe
$variationIndex = $currentVariationCount;
$storedVariationsCount = 0;
foreach ($audioData as $originalIndex => $variation) {
// Check for audio URL (same logic as callback)
$variationAudioUrl = (!empty($variation['audio_url'])) ? $variation['audio_url'] :
((!empty($variation['source_audio_url'])) ? $variation['source_audio_url'] :
((!empty($variation['stream_audio_url'])) ? $variation['stream_audio_url'] : null));
if (!empty($variationAudioUrl)) {
// Check if this variation already exists
$checkStmt = $pdo->prepare("SELECT COUNT(*) FROM audio_variations WHERE track_id = ? AND (audio_url = ? OR source_audio_url = ? OR stream_audio_url = ?)");
$checkStmt->execute([$trackId, $variationAudioUrl, $variationAudioUrl, $variationAudioUrl]);
$exists = $checkStmt->fetchColumn() > 0;
if ($exists) {
echo "<p style='color: orange;'>⚠️ Variation at index {$originalIndex} already exists (skipping)</p>";
continue;
}
// Download variation audio
$localVariationUrl = downloadAndStoreAudio($variationAudioUrl, $taskId, 'variation', $variationIndex);
// Extract variation title
$variationTitle = $variation['title'] ?? null;
if (!$variationTitle) {
$titleParts = [];
if (isset($variation['genre'])) $titleParts[] = $variation['genre'];
if (isset($variation['style'])) $titleParts[] = $variation['style'];
if (isset($variation['mood'])) $titleParts[] = $variation['mood'];
if (isset($variation['energy'])) $titleParts[] = $variation['energy'];
if (!empty($titleParts)) {
$variationTitle = implode(' ', $titleParts) . ' Variation';
} else {
$variationTitle = "AI Variation " . ($variationIndex + 1);
}
}
// Build variation metadata
$variationMetadata = [
'genre' => $variation['genre'] ?? (is_array($variation['tags']) ? $variation['tags'][0] : (is_string($variation['tags']) ? explode(',', $variation['tags'])[0] : null)),
'style' => $variation['style'] ?? null,
'bpm' => $variation['bpm'] ?? $variation['tempo'] ?? 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
];
// Download variation image if available
$variationImageUrl = null;
if (isset($variation['image_url']) && !empty($variation['image_url'])) {
$variationImageUrl = downloadAndStoreImage($variation['image_url'], $taskId . '_var' . $variationIndex);
} elseif (isset($variation['source_image_url']) && !empty($variation['source_image_url'])) {
$variationImageUrl = downloadAndStoreImage($variation['source_image_url'], $taskId . '_var' . $variationIndex);
}
// Insert variation
try {
$variationStmt = $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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
");
$variationTags = is_array($variation['tags']) ? implode(', ', $variation['tags']) : ($variation['tags'] ?? '');
// Ensure metadata is valid JSON
$variationMetadataJson = json_encode($variationMetadata);
if (json_last_error() !== JSON_ERROR_NONE) {
$variationMetadataJson = json_encode(['title' => $variationTitle, 'duration' => $variation['duration'] ?? null]);
}
$insertResult = $variationStmt->execute([
$trackId,
$variationIndex,
$localVariationUrl ?: $variationAudioUrl,
$variation['duration'] ?? null,
$variationTitle,
$variationTags ?: null,
$variationImageUrl,
$variation['source_audio_url'] ?? null,
$variation['stream_audio_url'] ?? null,
$variationMetadataJson
]);
if ($insertResult) {
$storedVariationsCount++;
$variationIndex++;
$totalVariationsAdded++;
echo "<p style='color: green;'>✅ Stored variation #{$variationIndex}: {$variationTitle}</p>";
$logEntry = "✅ Track #{$trackId}: Stored variation #{$variationIndex} ({$variationTitle})\n";
file_put_contents($logFile, $logEntry, FILE_APPEND | LOCK_EX);
} else {
$errorInfo = $variationStmt->errorInfo();
echo "<p style='color: red;'>❌ Failed to insert variation: " . htmlspecialchars(json_encode($errorInfo)) . "</p>";
$errorCount++;
}
} catch (Exception $e) {
echo "<p style='color: red;'>❌ Exception: " . htmlspecialchars($e->getMessage()) . "</p>";
$errorCount++;
}
} else {
echo "<p style='color: orange;'>⚠️ Skipping item {$originalIndex} - no audio URL found</p>";
}
}
// Update variations_count
if ($storedVariationsCount > 0) {
$newTotalCount = $currentVariationCount + $storedVariationsCount;
$updateStmt = $pdo->prepare("UPDATE music_tracks SET variations_count = ? WHERE id = ?");
$updateStmt->execute([$newTotalCount, $trackId]);
// Verify
$verifyStmt = $pdo->prepare("SELECT COUNT(*) FROM audio_variations WHERE track_id = ?");
$verifyStmt->execute([$trackId]);
$actualCount = $verifyStmt->fetchColumn();
echo "<p style='color: green; font-weight: bold;'>✅ Added {$storedVariationsCount} variation(s) - Total now: {$actualCount}</p>";
echo "<p>Updated variations_count field to: {$newTotalCount}</p>";
if ($actualCount == $newTotalCount) {
echo "<p style='color: green;'>✅ Variation button should now work!</p>";
} else {
echo "<p style='color: orange;'>⚠️ Count mismatch - fixing...</p>";
$fixStmt = $pdo->prepare("UPDATE music_tracks SET variations_count = ? WHERE id = ?");
$fixStmt->execute([$actualCount, $trackId]);
echo "<p style='color: green;'>✅ Fixed variations_count to match actual: {$actualCount}</p>";
}
$fixedCount++;
} else {
echo "<p style='color: orange;'>⚠️ No new variations stored (may already exist or no valid audio URLs)</p>";
$skippedCount++;
}
echo "</div>";
}
echo "<hr>";
echo "<h2>📊 Summary</h2>";
echo "<p><strong>Fixed (added variations):</strong> {$fixedCount}</p>";
echo "<p><strong>Skipped:</strong> {$skippedCount}</p>";
echo "<p><strong>Errors:</strong> {$errorCount}</p>";
echo "<p><strong>Total Variations Added:</strong> {$totalVariationsAdded}</p>";
echo "<p><strong>Total Tracks Checked:</strong> " . count($tracksToFix) . "</p>";
if ($fixedCount > 0) {
echo "<p style='color: green; font-size: 18px; font-weight: bold;'>✅ Successfully fixed {$fixedCount} track(s) with {$totalVariationsAdded} variation(s)!</p>";
}
echo "<p><a href='library.php'>← Back to Library</a> | <a href='admin.php'>Admin</a></p>";