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/admin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/gositeme/domains/soundstudiopro.com/private_html/admin/batch_fix_audio_analysis.php
<?php
/**
 * Batch Fix Audio Analysis - Scan all tracks and fix bad BPM/Key values
 * 
 * This script:
 * 1. Fixes bad BPM values (188 -> 94, >200 halved, <50 doubled)
 * 2. Normalizes BPM values in both metadata and dedicated columns
 * 3. Updates database with correct values
 */

// Enable error reporting for debugging
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('max_execution_time', 0); // No time limit

session_start();

// Check if admin
if (!isset($_SESSION['is_admin']) || !$_SESSION['is_admin']) {
    die('Admin access required');
}

require_once __DIR__ . '/../config/database.php';

$pdo = getDBConnection();
if (!$pdo) {
    die('Database connection failed');
}

// Get all tracks with audio
try {
    $stmt = $pdo->query("
        SELECT id, audio_url, metadata, status 
        FROM music_tracks 
        WHERE status = 'complete' 
        AND audio_url IS NOT NULL 
        AND audio_url != ''
        ORDER BY id ASC
    ");
    $tracks = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) {
    die('Database error: ' . $e->getMessage());
}

$total = count($tracks);
$fixed = 0;
$errors = 0;
$fixedTracks = [];

echo "<!DOCTYPE html><html><head><title>Batch Fix Audio Analysis</title>";
echo "<style>body{font-family:monospace;padding:20px;}pre{background:#f5f5f5;padding:10px;border-radius:5px;max-height:80vh;overflow:auto;}</style>";
echo "</head><body>";
echo "<h1>Batch Audio Analysis Fix</h1>";
echo "<p>Processing {$total} tracks...</p>";
echo "<pre>";

foreach ($tracks as $track) {
    $trackId = $track['id'];
    $metadata = json_decode($track['metadata'] ?? '{}', true) ?: [];
    $updated = false;
    $changes = [];
    
    // Get BPM from multiple sources
    $bpm = $metadata['analyzed_bpm'] ?? $metadata['bpm'] ?? null;
    $originalBpm = $bpm;
    
    if ($bpm && is_numeric($bpm)) {
        $bpm = floatval($bpm);
        
        // Safety: Check for invalid values (NaN, Infinity) that could cause infinite loops
        if (!is_finite($bpm) || is_nan($bpm)) {
            echo "⚠️ Track #$trackId: Invalid BPM value (NaN or Infinity), skipping\n";
            continue;
        }
        
        // Fix 188 -> 94 (common error)
        if (abs($bpm - 188) < 2) {
            $bpm = 94;
            $changes[] = "BPM {$originalBpm} → {$bpm} (188 fix)";
            $updated = true;
        }
        // Fix > 200 (almost always wrong)
        elseif ($bpm > 200) {
            $original = $bpm;
            $maxIterations = 10; // Safety limit
            $iterations = 0;
            $previousBpm = $bpm;
            while ($bpm > 200 && $iterations < $maxIterations) {
                $bpm = $bpm / 2;
                $iterations++;
                // Safety check: if BPM doesn't decrease, break to prevent infinite loop
                if ($iterations > 1 && $bpm >= $previousBpm) {
                    echo "⚠️ Track #$trackId: BPM normalization stuck at $bpm, breaking loop\n";
                    break;
                }
                $previousBpm = $bpm;
            }
            // Final safety: if still > 200 after max iterations, clamp it
            if ($bpm > 200) {
                $bpm = 200;
            }
            $changes[] = "BPM {$original} → {$bpm} (halved)";
            $updated = true;
        }
        // Fix < 50 (very low, likely wrong)
        elseif ($bpm < 50 && $bpm > 0) {
            $doubled = $bpm * 2;
            if ($doubled <= 180) {
                $bpm = $doubled;
                $changes[] = "BPM {$originalBpm} → {$bpm} (doubled)";
                $updated = true;
            }
        }
        
        // Update metadata
        if ($updated) {
            $metadata['analyzed_bpm'] = $bpm;
            $metadata['bpm'] = $bpm;
        }
    }
    
    // Update database if fixed
    if ($updated) {
        try {
            // Update metadata JSON and dedicated BPM column
            // Try to update bpm column (may not exist, that's ok)
            try {
                $stmt = $pdo->prepare("UPDATE music_tracks SET metadata = ?, bpm = ?, updated_at = NOW() WHERE id = ?");
                $stmt->execute([json_encode($metadata), $bpm, $trackId]);
            } catch (PDOException $e) {
                // If bpm column doesn't exist, just update metadata
                $stmt = $pdo->prepare("UPDATE music_tracks SET metadata = ?, updated_at = NOW() WHERE id = ?");
                $stmt->execute([json_encode($metadata), $trackId]);
            }
            
            $fixed++;
            $fixedTracks[] = [
                'id' => $trackId,
                'changes' => implode(', ', $changes)
            ];
            
            echo "Track #{$trackId}: " . implode(', ', $changes) . "\n";
        } catch (Exception $e) {
            $errors++;
            echo "Track #{$trackId}: ERROR - " . $e->getMessage() . "\n";
        }
    }
    
    // Flush output for real-time progress
    if ($fixed % 10 == 0) {
        flush();
        ob_flush();
    }
}

echo "\n\n";
echo "=== SUMMARY ===\n";
echo "Total tracks processed: {$total}\n";
echo "Tracks fixed: {$fixed}\n";
echo "Errors: {$errors}\n";
echo "\n";

if ($fixed > 0) {
    echo "=== FIXED TRACKS ===\n";
    foreach ($fixedTracks as $ft) {
        echo "Track #{$ft['id']}: {$ft['changes']}\n";
    }
}

echo "\n✅ Done!\n";
echo "</pre>";
echo "</body></html>";

?>

CasperSecurity Mini