![]() 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/api/ |
<?php
session_start();
header('Content-Type: application/json');
require_once '../config/database.php';
try {
$pdo = getDBConnection();
// Get artist ID from request
$artist_id = isset($_GET['artist_id']) ? (int)$_GET['artist_id'] : null;
if (!$artist_id) {
throw new Exception('Artist ID is required');
}
// OPTIMIZED: Using JOINs instead of correlated subqueries for better performance
// Get artist's primary playlist with tracks
$stmt = $pdo->prepare("
SELECT
ap.id as playlist_id,
ap.name as playlist_name,
ap.description as playlist_description,
ap.is_primary,
mt.id as track_id,
mt.title,
mt.prompt,
mt.audio_url,
mt.duration,
mt.created_at,
mt.user_id,
u.name as artist_name,
pt.position,
COALESCE(like_stats.like_count, 0) as like_count,
COALESCE(play_stats.play_count, 0) as play_count
FROM artist_playlists ap
LEFT JOIN playlist_tracks pt ON ap.id = pt.playlist_id
LEFT JOIN music_tracks mt ON pt.track_id = mt.id
LEFT JOIN users u ON mt.user_id = u.id
LEFT JOIN (SELECT track_id, COUNT(*) as like_count FROM track_likes GROUP BY track_id) like_stats ON mt.id = like_stats.track_id
LEFT JOIN (SELECT track_id, COUNT(*) as play_count FROM track_plays GROUP BY track_id) play_stats ON mt.id = play_stats.track_id
WHERE ap.user_id = ?
AND ap.is_primary = TRUE
AND mt.status = 'complete'
ORDER BY pt.position ASC, mt.created_at DESC
");
$stmt->execute([$artist_id]);
$results = $stmt->fetchAll();
if (empty($results)) {
// No playlist found, return empty result
echo json_encode([
'success' => true,
'playlist' => [
'id' => null,
'name' => 'No Playlist',
'description' => 'This artist has no tracks yet',
'tracks' => []
]
]);
exit;
}
// Organize data into playlist structure
$playlist = [
'id' => $results[0]['playlist_id'],
'name' => $results[0]['playlist_name'],
'description' => $results[0]['playlist_description'],
'tracks' => []
];
foreach ($results as $row) {
if ($row['track_id']) {
// Decode HTML entities in title and artist name (e.g., ' → ')
$title = $row['title'] ?: substr($row['prompt'], 0, 50) . '...';
$title = html_entity_decode($title, ENT_QUOTES | ENT_HTML5, 'UTF-8');
$artistName = html_entity_decode($row['artist_name'] ?? '', ENT_QUOTES | ENT_HTML5, 'UTF-8');
$playlist['tracks'][] = [
'id' => $row['track_id'],
'title' => $title,
'artist_name' => $artistName,
'audio_url' => $row['audio_url'],
'duration' => $row['duration'],
'created_at' => $row['created_at'],
'user_id' => $row['user_id'],
'position' => $row['position'],
'like_count' => $row['like_count'],
'play_count' => $row['play_count']
];
}
}
echo json_encode([
'success' => true,
'playlist' => $playlist
]);
} catch (Exception $e) {
http_response_code(500);
echo json_encode([
'success' => false,
'error' => $e->getMessage()
]);
}
?>