T.ME/BIBIL_0DAY
CasperSecurity


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/gositeme/domains/soundstudiopro.com/private_html/fix_missing_variations_all_tracks.php
<?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>";


CasperSecurity Mini