![]() 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/public_html/ |
<?php
/**
* Fix Wrong BPM in Existing Tracks
*
* This script corrects BPM values in existing tracks by extracting
* the actual BPM from the API response stored in raw_callback metadata.
* Only updates tracks where the API actually provided BPM data.
*/
require_once 'config/database.php';
$pdo = getDBConnection();
if (!$pdo) {
die("Failed to connect to database");
}
// Function to extract BPM from API callback data (same logic as callback.php)
function extractBPMFromCallback($data) {
$apiBpm = null;
// Check nested data structure (API.box format)
if (isset($data['data']['data']) && is_array($data['data']['data']) && !empty($data['data']['data'])) {
$trackData = $data['data']['data'][0]; // First variation
$apiBpm = $trackData['bpm'] ?? $trackData['tempo'] ?? null;
}
// Fallback to top-level data
if (!$apiBpm) {
$apiBpm = $data['bpm'] ?? $data['tempo'] ?? null;
}
// Validate BPM is in reasonable range (40-300 BPM)
if ($apiBpm !== null) {
$apiBpm = intval($apiBpm);
if ($apiBpm < 40 || $apiBpm > 300) {
return null; // Invalid BPM
}
}
return $apiBpm;
}
echo "<h1>Fix Wrong BPM in Existing Tracks</h1>\n";
echo "<style>
body { font-family: Arial, sans-serif; margin: 20px; background: #1a1a1a; color: #fff; }
.success { color: #4CAF50; }
.error { color: #f44336; }
.warning { color: #ff9800; }
.info { color: #2196F3; }
table { border-collapse: collapse; width: 100%; margin-top: 20px; }
th, td { border: 1px solid #444; padding: 8px; text-align: left; }
th { background: #333; }
tr:nth-child(even) { background: #222; }
</style>\n";
// Get all tracks with metadata
$stmt = $pdo->query("
SELECT id, title, metadata, status
FROM music_tracks
WHERE metadata IS NOT NULL
AND JSON_EXTRACT(metadata, '$.bpm') IS NOT NULL
AND status = 'complete'
ORDER BY id DESC
");
$tracks = $stmt->fetchAll(PDO::FETCH_ASSOC);
$totalTracks = count($tracks);
$fixedCount = 0;
$skippedCount = 0;
$errorCount = 0;
echo "<p class='info'>Found $totalTracks tracks with BPM in metadata</p>\n";
echo "<table>\n";
echo "<tr><th>Track ID</th><th>Title</th><th>Old BPM</th><th>API BPM</th><th>Status</th></tr>\n";
foreach ($tracks as $track) {
$trackId = $track['id'];
$title = htmlspecialchars($track['title']);
$metadata = json_decode($track['metadata'], true);
if (!$metadata) {
echo "<tr><td>$trackId</td><td>$title</td><td colspan='3' class='error'>Invalid metadata JSON</td></tr>\n";
$errorCount++;
continue;
}
$oldBpm = $metadata['bpm'] ?? null;
// Check if we have raw_callback with API data
$rawCallback = $metadata['raw_callback'] ?? null;
if (!$rawCallback) {
echo "<tr><td>$trackId</td><td>$title</td><td>$oldBpm</td><td colspan='2' class='warning'>No raw_callback data - cannot verify</td></tr>\n";
$skippedCount++;
continue;
}
// Extract actual BPM from API response
$apiBpm = extractBPMFromCallback($rawCallback);
if ($apiBpm === null) {
// API didn't provide BPM - remove it from metadata
unset($metadata['bpm']);
$updateStmt = $pdo->prepare("UPDATE music_tracks SET metadata = ? WHERE id = ?");
$updateStmt->execute([json_encode($metadata), $trackId]);
echo "<tr><td>$trackId</td><td>$title</td><td>$oldBpm</td><td>NULL (API didn't provide)</td><td class='warning'>Removed (API has no BPM)</td></tr>\n";
$fixedCount++;
continue;
}
// Check if BPM needs correction
if ($oldBpm != $apiBpm) {
// Update metadata with correct BPM
$metadata['bpm'] = $apiBpm;
$updateStmt = $pdo->prepare("UPDATE music_tracks SET metadata = ? WHERE id = ?");
$updateStmt->execute([json_encode($metadata), $trackId]);
echo "<tr><td>$trackId</td><td>$title</td><td>$oldBpm</td><td>$apiBpm</td><td class='success'>✅ Fixed</td></tr>\n";
$fixedCount++;
} else {
echo "<tr><td>$trackId</td><td>$title</td><td>$oldBpm</td><td>$apiBpm</td><td class='info'>Already correct</td></tr>\n";
$skippedCount++;
}
}
echo "</table>\n";
echo "<hr>\n";
echo "<h2>Summary</h2>\n";
echo "<p class='success'>✅ Fixed: $fixedCount tracks</p>\n";
echo "<p class='info'>ℹ️ Skipped (already correct or no API data): $skippedCount tracks</p>\n";
echo "<p class='error'>❌ Errors: $errorCount tracks</p>\n";
echo "<p class='info'>📊 Total processed: $totalTracks tracks</p>\n";