![]() 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/.cursor-server/data/User/History/2c7e01d0/ |
<?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);
// 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;
while ($bpm > 200) {
$bpm = $bpm / 2;
}
$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>";
?>