![]() 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
/**
* Diagnostic Script for Missing Lyrics
* Analyzes task_results JSON files to understand why lyrics are missing
*/
require_once 'config/database.php';
$pdo = getDBConnection();
if (!$pdo) {
die("❌ Database connection failed\n");
}
echo "<!DOCTYPE html>
<html>
<head>
<title>Diagnose Missing Lyrics</title>
<style>
body { font-family: Arial, sans-serif; padding: 20px; background: #f5f5f5; }
.container { max-width: 1400px; margin: 0 auto; background: white; padding: 20px; border-radius: 8px; }
h1 { color: #333; }
.track-item { padding: 15px; margin: 10px 0; border: 1px solid #ddd; border-radius: 5px; background: #fafafa; }
.success { color: green; font-weight: bold; }
.error { color: red; font-weight: bold; }
.warning { color: orange; font-weight: bold; }
.info { color: #666; }
.json-preview { background: #f8f9fa; padding: 10px; border-radius: 5px; margin: 10px 0; max-height: 300px; overflow-y: auto; font-family: monospace; font-size: 0.85em; }
.stats { background: #e8f4f8; padding: 15px; border-radius: 5px; margin: 20px 0; }
</style>
</head>
<body>
<div class='container'>
<h1>🔍 Diagnose Missing Lyrics</h1>
<p>Analyzing tracks missing lyrics to understand why they're not being extracted.</p>
";
// Get tracks missing lyrics
$stmt = $pdo->prepare("
SELECT
id,
task_id,
title,
lyrics,
created_at
FROM music_tracks
WHERE status = 'complete'
AND (lyrics IS NULL OR lyrics = '' OR lyrics = 'null' OR lyrics = 'NULL')
ORDER BY created_at DESC
LIMIT 20
");
$stmt->execute();
$tracks = $tracks = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stats = [
'total_checked' => 0,
'has_task_result_file' => 0,
'has_prompt_field' => 0,
'prompt_is_instrumental' => 0,
'prompt_has_lyrics' => 0,
'no_prompt_field' => 0,
'callback_type_text' => 0,
'callback_type_first' => 0,
'callback_type_complete' => 0,
'callback_type_unknown' => 0
];
echo "<div class='stats'>
<h2>Analysis Results</h2>
<p>Analyzing first 20 tracks missing lyrics...</p>
</div>";
foreach ($tracks as $track) {
$trackId = $track['id'];
$taskId = $track['task_id'];
$title = htmlspecialchars($track['title'] ?: 'Untitled Track');
$createdAt = $track['created_at'];
echo "<div class='track-item'>";
echo "<h3>Track #{$trackId}: {$title}</h3>";
echo "<p class='info'>Task ID: {$taskId} | Created: {$createdAt}</p>";
$stats['total_checked']++;
// Check task_results file
$taskResultFile = "task_results/{$taskId}.json";
if (file_exists($taskResultFile)) {
$stats['has_task_result_file']++;
echo "<p class='success'>✅ task_results file exists</p>";
$taskResultContent = @file_get_contents($taskResultFile);
if ($taskResultContent) {
$taskResultData = @json_decode($taskResultContent, true);
if (is_array($taskResultData)) {
// Check callback type
$callbackType = $taskResultData['data']['callbackType'] ?? 'unknown';
echo "<p class='info'>📋 Callback Type: <strong>{$callbackType}</strong></p>";
switch ($callbackType) {
case 'text':
$stats['callback_type_text']++;
break;
case 'first':
$stats['callback_type_first']++;
break;
case 'complete':
$stats['callback_type_complete']++;
break;
default:
$stats['callback_type_unknown']++;
}
// Check for prompt field in data array
$hasPrompt = false;
$promptValue = null;
$promptLocation = '';
if (isset($taskResultData['data']['data']) && is_array($taskResultData['data']['data'])) {
echo "<p class='info'>📦 Data array has " . count($taskResultData['data']['data']) . " items</p>";
foreach ($taskResultData['data']['data'] as $index => $item) {
if (isset($item['prompt']) && !empty($item['prompt'])) {
$hasPrompt = true;
$promptValue = $item['prompt'];
$promptLocation = "data.data[{$index}].prompt";
$stats['has_prompt_field']++;
echo "<p class='info'>📝 Found prompt in {$promptLocation}</p>";
// Check if it's instrumental
$trimmed = trim($promptValue);
if (strtolower($trimmed) === '[instrumental]' ||
strtolower($trimmed) === 'instrumental' ||
strtolower($trimmed) === '[inst]' ||
strtolower($trimmed) === 'inst') {
$stats['prompt_is_instrumental']++;
echo "<p class='warning'>⚠️ Prompt is '[Instrumental]' - no lyrics available</p>";
} else {
$stats['prompt_has_lyrics']++;
echo "<p class='success'>✅ Prompt contains lyrics (" . strlen($promptValue) . " chars)</p>";
// Show preview
$preview = htmlspecialchars(substr($promptValue, 0, 200));
if (strlen($promptValue) > 200) {
$preview .= '...';
}
echo "<div class='json-preview'>{$preview}</div>";
}
break; // Use first item with prompt
}
}
if (!$hasPrompt) {
$stats['no_prompt_field']++;
echo "<p class='error'>❌ No prompt field found in any data items</p>";
// Show what fields ARE available
if (!empty($taskResultData['data']['data'])) {
$firstItem = $taskResultData['data']['data'][0];
$availableFields = array_keys($firstItem);
echo "<p class='info'>Available fields in first item: " . implode(', ', $availableFields) . "</p>";
}
}
} else {
echo "<p class='error'>❌ No data.data array found</p>";
}
// Show JSON structure preview
echo "<details><summary>📄 View JSON Structure</summary>";
echo "<div class='json-preview'>" . htmlspecialchars(json_encode($taskResultData, JSON_PRETTY_PRINT)) . "</div>";
echo "</details>";
} else {
echo "<p class='error'>❌ Failed to parse JSON</p>";
}
} else {
echo "<p class='error'>❌ Failed to read file</p>";
}
} else {
echo "<p class='error'>❌ task_results file NOT found: {$taskResultFile}</p>";
}
echo "</div>";
}
echo "<div class='stats'>
<h2>📊 Diagnostic Summary</h2>
<table style='width: 100%; border-collapse: collapse;'>
<tr>
<th style='text-align: left; padding: 10px; border: 1px solid #ddd;'>Metric</th>
<th style='text-align: right; padding: 10px; border: 1px solid #ddd;'>Count</th>
<th style='text-align: right; padding: 10px; border: 1px solid #ddd;'>Percentage</th>
</tr>
<tr>
<td style='padding: 10px; border: 1px solid #ddd;'>Total Tracks Checked</td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'><strong>{$stats['total_checked']}</strong></td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'>100%</td>
</tr>
<tr>
<td style='padding: 10px; border: 1px solid #ddd;'>✅ Has task_results File</td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'><strong>{$stats['has_task_result_file']}</strong></td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'>" . round(($stats['has_task_result_file'] / max($stats['total_checked'], 1)) * 100, 1) . "%</td>
</tr>
<tr>
<td style='padding: 10px; border: 1px solid #ddd;'>📝 Has Prompt Field</td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'><strong>{$stats['has_prompt_field']}</strong></td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'>" . round(($stats['has_prompt_field'] / max($stats['total_checked'], 1)) * 100, 1) . "%</td>
</tr>
<tr>
<td style='padding: 10px; border: 1px solid #ddd;' class='success'>✅ Prompt Has Lyrics</td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'><strong>{$stats['prompt_has_lyrics']}</strong></td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'>" . round(($stats['prompt_has_lyrics'] / max($stats['total_checked'], 1)) * 100, 1) . "%</td>
</tr>
<tr>
<td style='padding: 10px; border: 1px solid #ddd;' class='warning'>⚠️ Prompt is [Instrumental]</td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'><strong>{$stats['prompt_is_instrumental']}</strong></td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'>" . round(($stats['prompt_is_instrumental'] / max($stats['total_checked'], 1)) * 100, 1) . "%</td>
</tr>
<tr>
<td style='padding: 10px; border: 1px solid #ddd;' class='error'>❌ No Prompt Field</td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'><strong>{$stats['no_prompt_field']}</strong></td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'>" . round(($stats['no_prompt_field'] / max($stats['total_checked'], 1)) * 100, 1) . "%</td>
</tr>
<tr>
<td colspan='3' style='padding: 10px; border: 1px solid #ddd; background: #f8f9fa;'><strong>Callback Types:</strong></td>
</tr>
<tr>
<td style='padding: 10px; border: 1px solid #ddd;'>📝 callbackType: 'text'</td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'><strong>{$stats['callback_type_text']}</strong></td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'>" . round(($stats['callback_type_text'] / max($stats['total_checked'], 1)) * 100, 1) . "%</td>
</tr>
<tr>
<td style='padding: 10px; border: 1px solid #ddd;'>🎵 callbackType: 'first'</td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'><strong>{$stats['callback_type_first']}</strong></td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'>" . round(($stats['callback_type_first'] / max($stats['total_checked'], 1)) * 100, 1) . "%</td>
</tr>
<tr>
<td style='padding: 10px; border: 1px solid #ddd;'>✅ callbackType: 'complete'</td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'><strong>{$stats['callback_type_complete']}</strong></td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'>" . round(($stats['callback_type_complete'] / max($stats['total_checked'], 1)) * 100, 1) . "%</td>
</tr>
<tr>
<td style='padding: 10px; border: 1px solid #ddd;'>❓ callbackType: unknown</td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'><strong>{$stats['callback_type_unknown']}</strong></td>
<td style='text-align: right; padding: 10px; border: 1px solid #ddd;'>" . round(($stats['callback_type_unknown'] / max($stats['total_checked'], 1)) * 100, 1) . "%</td>
</tr>
</table>
</div>";
echo "<p><a href='audit_tracks.php' style='background: #6c757d; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px; display: inline-block;'>← Back to Audit</a></p>";
echo "</div></body></html>";
?>