![]() 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
/**
* Restore Variations from Callback Data
* Extracts variations from task_results JSON and stores them in database
*/
session_start();
require_once 'config/database.php';
$confirm = $_GET['confirm'] ?? 'false';
$track_id = intval($_GET['track_id'] ?? 0);
if ($confirm !== 'yes') {
die("Add ?confirm=yes to URL to proceed");
}
if (!$track_id) {
die("Track ID required: restore_variations.php?track_id=XXX&confirm=yes");
}
$pdo = getDBConnection();
// Get track info
$stmt = $pdo->prepare("SELECT id, task_id, title FROM music_tracks WHERE id = ?");
$stmt->execute([$track_id]);
$track = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$track) {
die("Track ID {$track_id} not found");
}
echo "<h2>Restoring Variations for Track ID: {$track_id}</h2>";
echo "<p><strong>Title:</strong> {$track['title']}</p>";
echo "<p><strong>Task ID:</strong> {$track['task_id']}</p>";
echo "<hr>";
// Load task_results JSON
$taskResultsFile = __DIR__ . "/task_results/{$track['task_id']}.json";
if (!file_exists($taskResultsFile)) {
die("❌ task_results JSON file not found: {$taskResultsFile}");
}
$jsonContent = file_get_contents($taskResultsFile);
$callbackData = json_decode($jsonContent, true);
if (!$callbackData || !isset($callbackData['data']['data']) || !is_array($callbackData['data']['data'])) {
die("❌ Invalid callback data or no audioData found");
}
$audioData = $callbackData['data']['data'];
echo "<p>✅ Found " . count($audioData) . " variation(s) in callback data</p>";
// Include download function from callback.php
function downloadAndStoreAudio($audioUrl, $taskId, $type = 'main', $variationIndex = null) {
if (empty($audioUrl) || !filter_var($audioUrl, FILTER_VALIDATE_URL)) {
return null;
}
$audioDir = 'audio_files/';
if (!is_dir($audioDir)) {
mkdir($audioDir, 0755, true);
}
$extension = pathinfo(parse_url($audioUrl, PHP_URL_PATH), PATHINFO_EXTENSION) ?: 'mp3';
if ($type === 'variation' && $variationIndex !== null) {
$filename = "{$taskId}_variation_{$variationIndex}.{$extension}";
} else {
$filename = "{$taskId}.{$extension}";
}
$localPath = $audioDir . $filename;
$webPath = '/audio_files/' . $filename;
if (file_exists($localPath)) {
return $webPath;
}
$context = stream_context_create([
'http' => [
'timeout' => 300,
'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
]
]);
$audioContent = @file_get_contents($audioUrl, false, $context);
if ($audioContent === false) {
return null;
}
if (file_put_contents($localPath, $audioContent, LOCK_EX)) {
chmod($localPath, 0644);
return $webPath;
}
return null;
}
$pdo->beginTransaction();
try {
// Clear existing variations
$stmt = $pdo->prepare("DELETE FROM audio_variations WHERE track_id = ?");
$stmt->execute([$track_id]);
echo "<p>✅ Cleared existing variations</p>";
$storedCount = 0;
$variationIndex = 0;
foreach ($audioData as $originalIndex => $variation) {
// Check multiple audio URL fields - be more thorough
$variationAudioUrl = null;
// Try each field, checking if it's not empty string
if (!empty($variation['audio_url']) && trim($variation['audio_url']) !== '') {
$variationAudioUrl = trim($variation['audio_url']);
} elseif (!empty($variation['source_audio_url']) && trim($variation['source_audio_url']) !== '') {
$variationAudioUrl = trim($variation['source_audio_url']);
} elseif (!empty($variation['stream_audio_url']) && trim($variation['stream_audio_url']) !== '') {
$variationAudioUrl = trim($variation['stream_audio_url']);
}
if (empty($variationAudioUrl)) {
echo "<p>⚠️ Skipping variation {$originalIndex} - no valid audio URL (checked: audio_url=" . ($variation['audio_url'] ?? 'NULL') . ", source_audio_url=" . ($variation['source_audio_url'] ?? 'NULL') . ", stream_audio_url=" . ($variation['stream_audio_url'] ?? 'NULL') . ")</p>";
continue;
}
// Download audio
$localVariationUrl = downloadAndStoreAudio($variationAudioUrl, $track['task_id'], 'variation', $variationIndex);
// Generate 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 metadata - remove null values to avoid JSON issues
$variationMetadata = [];
if (isset($variation['genre']) && $variation['genre'] !== null) {
$variationMetadata['genre'] = $variation['genre'];
} elseif (isset($variation['tags'][0]) && $variation['tags'][0] !== null) {
$variationMetadata['genre'] = $variation['tags'][0];
}
if (isset($variation['style']) && $variation['style'] !== null) {
$variationMetadata['style'] = $variation['style'];
}
if (isset($variation['bpm']) && $variation['bpm'] !== null) {
$variationMetadata['bpm'] = $variation['bpm'];
} elseif (isset($variation['tempo']) && $variation['tempo'] !== null) {
$variationMetadata['bpm'] = $variation['tempo'];
}
if (isset($variation['key']) && $variation['key'] !== null) {
$variationMetadata['key'] = $variation['key'];
}
if (isset($variation['mood']) && $variation['mood'] !== null) {
$variationMetadata['mood'] = $variation['mood'];
}
if (isset($variation['energy']) && $variation['energy'] !== null) {
$variationMetadata['energy'] = $variation['energy'];
}
if (isset($variation['tags']) && $variation['tags'] !== null) {
$variationMetadata['tags'] = $variation['tags'];
}
if (isset($variation['duration']) && $variation['duration'] !== null) {
$variationMetadata['duration'] = $variation['duration'];
}
$variationMetadata['title'] = $variationTitle;
// Validate JSON before encoding
$metadataJson = json_encode($variationMetadata, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
if ($metadataJson === false) {
echo "<p style='color: orange;'>⚠️ Failed to encode metadata JSON, using empty object</p>";
$metadataJson = '{}';
}
// Validate JSON is valid
$testDecode = json_decode($metadataJson, true);
if ($testDecode === null && json_last_error() !== JSON_ERROR_NONE) {
echo "<p style='color: orange;'>⚠️ Invalid JSON generated, using empty object. Error: " . json_last_error_msg() . "</p>";
$metadataJson = '{}';
}
// Insert variation
$stmt = $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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
");
$result = $stmt->execute([
$track_id,
$variationIndex,
$localVariationUrl ?: $variationAudioUrl,
$variation['duration'] ?? null,
$variationTitle,
is_array($variation['tags']) ? implode(', ', $variation['tags']) : ($variation['tags'] ?? null),
$variation['image_url'] ?? null,
$variation['source_audio_url'] ?? null,
$variation['stream_audio_url'] ?? null,
$metadataJson
]);
if ($result) {
$storedCount++;
$variationIndex++;
echo "<p>✅ Stored variation {$variationIndex} (original index {$originalIndex}): {$variationTitle}</p>";
} else {
$errorInfo = $stmt->errorInfo();
echo "<p style='color: red;'>❌ Failed to store variation {$originalIndex}</p>";
echo "<p><strong>Error:</strong> " . htmlspecialchars($errorInfo[2] ?? 'Unknown error') . "</p>";
echo "<p><strong>Error Code:</strong> " . ($errorInfo[0] ?? 'N/A') . "</p>";
echo "<details><summary>Metadata that failed:</summary><pre>" . htmlspecialchars($metadataJson) . "</pre></details>";
echo "<details><summary>Full error info:</summary><pre>" . htmlspecialchars(json_encode($errorInfo, JSON_PRETTY_PRINT)) . "</pre></details>";
// Try inserting without metadata to see if that's the issue
echo "<p>🔄 Trying to insert without metadata field...</p>";
try {
$stmt2 = $pdo->prepare("
INSERT INTO audio_variations
(track_id, variation_index, audio_url, duration, title, tags, image_url, source_audio_url, stream_audio_url)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
");
$result2 = $stmt2->execute([
$track_id,
$variationIndex,
$localVariationUrl ?: $variationAudioUrl,
$variation['duration'] ?? null,
$variationTitle,
is_array($variation['tags']) ? implode(', ', $variation['tags']) : ($variation['tags'] ?? null),
$variation['image_url'] ?? null,
$variation['source_audio_url'] ?? null,
$variation['stream_audio_url'] ?? null
]);
if ($result2) {
echo "<p style='color: green;'>✅ Successfully stored without metadata field</p>";
$storedCount++;
$variationIndex++;
} else {
$errorInfo2 = $stmt2->errorInfo();
echo "<p style='color: red;'>❌ Still failed without metadata: " . htmlspecialchars($errorInfo2[2] ?? 'Unknown') . "</p>";
}
} catch (Exception $e2) {
echo "<p style='color: red;'>❌ Exception without metadata: " . htmlspecialchars($e2->getMessage()) . "</p>";
}
}
}
// Update variations_count
$stmt = $pdo->prepare("UPDATE music_tracks SET variations_count = ? WHERE id = ?");
$stmt->execute([$storedCount, $track_id]);
$pdo->commit();
echo "<hr>";
echo "<p style='color: green; font-size: 18px;'><strong>✅ SUCCESS!</strong> Restored {$storedCount} variation(s)</p>";
echo "<p><a href='check_track_variations.php'>Check Again</a> | <a href='/library.php'>View Library</a></p>";
} catch (Exception $e) {
$pdo->rollBack();
echo "<p style='color: red;'>❌ ERROR: " . htmlspecialchars($e->getMessage()) . "</p>";
echo "<pre>" . htmlspecialchars($e->getTraceAsString()) . "</pre>";
}