![]() 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/api/ |
<?php
require_once '../config/database.php';
session_start();
header('Content-Type: application/json');
// Only allow GET requests
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
http_response_code(405);
echo json_encode(['success' => false, 'error' => 'Method not allowed']);
exit;
}
$track_id = $_GET['track_id'] ?? null;
$artist_id = $_GET['artist_id'] ?? null;
if (!$track_id || !$artist_id) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'Track ID and Artist ID are required']);
exit;
}
try {
$pdo = getDBConnection();
// First, get more tracks from the same artist (prioritized)
$stmt = $pdo->prepare("
SELECT
mt.id,
mt.title,
mt.image_url,
mt.audio_url,
mt.duration,
u.name as artist_name,
'same_artist' as source
FROM music_tracks mt
JOIN users u ON mt.user_id = u.id
WHERE mt.user_id = ?
AND mt.id != ?
AND mt.status = 'complete'
ORDER BY mt.created_at DESC
LIMIT 8
");
$stmt->execute([$artist_id, $track_id]);
$same_artist_tracks = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Then get tracks from other artists to fill remaining slots
$remaining_slots = 8 - count($same_artist_tracks);
$other_tracks = [];
if ($remaining_slots > 0) {
$stmt = $pdo->prepare("
SELECT
mt.id,
mt.title,
mt.image_url,
mt.audio_url,
mt.duration,
u.name as artist_name,
'other_artist' as source
FROM music_tracks mt
JOIN users u ON mt.user_id = u.id
WHERE mt.user_id != ?
AND mt.id != ?
AND mt.status = 'complete'
ORDER BY RAND()
LIMIT ?
");
$stmt->execute([$artist_id, $track_id, $remaining_slots]);
$other_tracks = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Get available genres list - ROBUST VERSION
$available_genres = [];
// First, let's see what metadata structure we actually have
$stmt = $pdo->prepare("
SELECT id, metadata, title, prompt
FROM music_tracks
WHERE status = 'complete'
AND metadata IS NOT NULL
AND metadata != ''
LIMIT 5
");
$stmt->execute();
$sample_tracks = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Debug: Log sample metadata to understand structure
error_log("Sample metadata structure: " . json_encode($sample_tracks));
// Get current track's genre from metadata
$stmt = $pdo->prepare("
SELECT metadata, title, prompt FROM music_tracks WHERE id = ?
");
$stmt->execute([$track_id]);
$current_track = $stmt->fetch(PDO::FETCH_ASSOC);
$current_genre = 'Electronic'; // Default
if ($current_track && $current_track['metadata']) {
$metadata = json_decode($current_track['metadata'], true);
$current_genre = $metadata['genre'] ?? $metadata['style'] ?? $metadata['type'] ?? 'Electronic';
}
// Try multiple approaches to get genres
$genre_queries = [
// Approach 1: JSON_EXTRACT for genre
"SELECT DISTINCT
JSON_EXTRACT(metadata, '$.genre') as genre,
COUNT(*) as track_count
FROM music_tracks
WHERE metadata IS NOT NULL
AND metadata != ''
AND JSON_EXTRACT(metadata, '$.genre') IS NOT NULL
AND JSON_EXTRACT(metadata, '$.genre') != ''
AND JSON_EXTRACT(metadata, '$.genre') != ?
AND status = 'complete'
GROUP BY JSON_EXTRACT(metadata, '$.genre')
HAVING track_count > 0
ORDER BY track_count DESC
LIMIT 8",
// Approach 2: JSON_EXTRACT for style
"SELECT DISTINCT
JSON_EXTRACT(metadata, '$.style') as genre,
COUNT(*) as track_count
FROM music_tracks
WHERE metadata IS NOT NULL
AND metadata != ''
AND JSON_EXTRACT(metadata, '$.style') IS NOT NULL
AND JSON_EXTRACT(metadata, '$.style') != ''
AND JSON_EXTRACT(metadata, '$.style') != ?
AND status = 'complete'
GROUP BY JSON_EXTRACT(metadata, '$.style')
HAVING track_count > 0
ORDER BY track_count DESC
LIMIT 8",
// Approach 3: Extract from prompt (common patterns)
"SELECT DISTINCT
CASE
WHEN LOWER(prompt) LIKE '%rock%' THEN 'Rock'
WHEN LOWER(prompt) LIKE '%pop%' THEN 'Pop'
WHEN LOWER(prompt) LIKE '%hip hop%' OR LOWER(prompt) LIKE '%rap%' THEN 'Hip Hop'
WHEN LOWER(prompt) LIKE '%jazz%' THEN 'Jazz'
WHEN LOWER(prompt) LIKE '%country%' THEN 'Country'
WHEN LOWER(prompt) LIKE '%classical%' THEN 'Classical'
WHEN LOWER(prompt) LIKE '%electronic%' OR LOWER(prompt) LIKE '%edm%' THEN 'Electronic'
WHEN LOWER(prompt) LIKE '%blues%' THEN 'Blues'
WHEN LOWER(prompt) LIKE '%reggae%' THEN 'Reggae'
WHEN LOWER(prompt) LIKE '%folk%' THEN 'Folk'
ELSE 'Other'
END as genre,
COUNT(*) as track_count
FROM music_tracks
WHERE status = 'complete'
AND prompt IS NOT NULL
AND prompt != ''
GROUP BY genre
HAVING track_count > 0 AND genre != 'Other'
ORDER BY track_count DESC
LIMIT 8"
];
$found_genres = false;
foreach ($genre_queries as $query) {
try {
$stmt = $pdo->prepare($query);
$stmt->execute([$current_genre]);
$genre_results = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (!empty($genre_results)) {
foreach ($genre_results as $genre_data) {
if (!empty($genre_data['genre']) && $genre_data['genre'] !== $current_genre) {
$available_genres[] = [
'name' => $genre_data['genre'],
'track_count' => $genre_data['track_count'],
'source' => 'other_genre'
];
}
}
$found_genres = true;
break; // Use the first successful approach
}
} catch (Exception $e) {
error_log("Genre query failed: " . $e->getMessage());
continue;
}
}
// If still no genres found, use common genres as fallback
if (empty($available_genres)) {
$common_genres = ['Rock', 'Pop', 'Hip Hop', 'Jazz', 'Country', 'Classical', 'Electronic', 'Blues'];
foreach ($common_genres as $genre) {
if ($genre !== $current_genre) {
$available_genres[] = [
'name' => $genre,
'track_count' => 0,
'source' => 'other_genre'
];
}
}
}
// Combine: same artist first, then other artists
$tracks = array_merge($same_artist_tracks, $other_tracks);
echo json_encode([
'success' => true,
'tracks' => $tracks,
'genres' => $available_genres
]);
} catch (Exception $e) {
error_log("Error getting related tracks: " . $e->getMessage());
http_response_code(500);
echo json_encode(['success' => false, 'error' => 'Internal server error']);
}
?>