![]() 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/.cursor-server/data/User/History/-293ddee6/ |
<?php
session_start();
header('Content-Type: application/json');
require_once '../config/database.php';
require_once '../utils/audio_token.php';
try {
$pdo = getDBConnection();
$artist_id = $_GET['artist_id'] ?? null;
$type = $_GET['type'] ?? 'all';
$offset = (int)($_GET['offset'] ?? 0);
$limit = (int)($_GET['limit'] ?? 20);
if (!$artist_id) {
throw new Exception('Artist ID is required');
}
// Build query based on type
$where_clause = "WHERE mt.user_id = ? AND mt.is_public = 1";
if ($type === 'completed') {
$where_clause .= " AND mt.status = 'complete'";
} elseif ($type === 'tracks') {
// All tracks (including processing, failed, etc.)
}
// Get current user ID for variation preferences (if logged in)
$current_user_id = $_SESSION['user_id'] ?? 0;
$stmt = $pdo->prepare("
SELECT
mt.id,
mt.title,
mt.prompt,
mt.duration,
mt.audio_url,
mt.image_url,
mt.price,
mt.status,
mt.created_at,
mt.music_type,
mt.metadata,
mt.user_id,
mt.task_id,
u.name as artist_name,
(SELECT COUNT(*) FROM track_likes WHERE track_id = mt.id) as like_count,
(SELECT COUNT(*) FROM track_comments WHERE track_id = mt.id) as comment_count,
(SELECT COUNT(*) FROM track_plays WHERE track_id = mt.id) as play_count,
COALESCE((SELECT COUNT(*) FROM track_shares WHERE track_id = mt.id), 0) as share_count,
COALESCE((SELECT COUNT(*) FROM track_purchases WHERE track_id = mt.id), 0) as purchase_count,
COALESCE((SELECT AVG(rating) FROM track_ratings WHERE track_id = mt.id), 0) as average_rating,
COALESCE((SELECT COUNT(*) FROM track_ratings WHERE track_id = mt.id), 0) as rating_count,
(
SELECT CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END
FROM track_likes tl
WHERE tl.track_id = mt.id
AND tl.user_id = ?
) as user_liked,
(
SELECT CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END
FROM user_wishlist uw
WHERE uw.track_id = mt.id
AND uw.user_id = ?
) as is_in_wishlist,
(
SELECT CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END
FROM track_purchases tp
WHERE tp.track_id = mt.id
AND tp.user_id = ?
) as user_purchased,
MAX(uvp.variation_id) as preferred_variation_id
FROM music_tracks mt
JOIN users u ON mt.user_id = u.id
LEFT JOIN user_variation_preferences uvp ON mt.id = uvp.track_id AND uvp.user_id = ? AND uvp.is_main_track = TRUE
$where_clause
GROUP BY mt.id, mt.title, mt.prompt, mt.duration, mt.audio_url, mt.image_url, mt.price, mt.status, mt.created_at, mt.music_type, mt.metadata, mt.user_id, mt.task_id, u.name
ORDER BY mt.created_at DESC
LIMIT ? OFFSET ?
");
$stmt->execute([$current_user_id, $current_user_id, $current_user_id, $current_user_id, $artist_id, $limit, $offset]);
$tracks = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Process tracks for display with variation selection logic
// Priority: 1) Track metadata selected_variation, 2) user_variation_preferences, 3) default track audio
$processed_tracks = [];
foreach ($tracks as $track) {
// Determine preferred audio URL based on variation selection
$preferred_audio_url = $track['audio_url']; // Default to original track
$preferred_duration = $track['duration']; // Default to original track duration
// First, check track metadata for selected_variation (set by track owner in library.php)
$trackMetadata = json_decode($track['metadata'] ?? '{}', true) ?: [];
$selectedVariationIndex = $trackMetadata['selected_variation'] ?? null;
if ($selectedVariationIndex !== null) {
// Get the selected variation from audio_variations table (including duration)
$var_stmt = $pdo->prepare("SELECT audio_url, duration FROM audio_variations WHERE track_id = ? AND variation_index = ?");
$var_stmt->execute([$track['id'], $selectedVariationIndex]);
$variation = $var_stmt->fetch(PDO::FETCH_ASSOC);
if ($variation && $variation['audio_url']) {
$preferred_audio_url = $variation['audio_url'];
// Use variation duration if available, otherwise keep main track duration
if (!empty($variation['duration'])) {
$preferred_duration = $variation['duration'];
}
}
} elseif ($track['preferred_variation_id']) {
// Fallback to user_variation_preferences if no metadata selection
$var_stmt = $pdo->prepare("SELECT audio_url, duration FROM audio_variations WHERE id = ?");
$var_stmt->execute([$track['preferred_variation_id']]);
$variation = $var_stmt->fetch(PDO::FETCH_ASSOC);
if ($variation && $variation['audio_url']) {
$preferred_audio_url = $variation['audio_url'];
// Use variation duration if available, otherwise keep main track duration
if (!empty($variation['duration'])) {
$preferred_duration = $variation['duration'];
}
}
}
// Only include tracks with audio URLs (either original or variation)
if ($preferred_audio_url) {
// Parse metadata for additional info
$metadata = json_decode($track['metadata'] ?: '{}', true);
// IMPORTANT: Use main track audio_url, NOT preferred_audio_url
// preferred_audio_url might be a preview variation (44 seconds)
// We want the full track for playlist playback
$processed_tracks[] = [
'id' => $track['id'],
'title' => $track['title'] ?: 'Untitled Track',
'duration' => $track['duration'], // Use main track duration
'audio_url' => $track['audio_url'], // Use main track audio_url, not preferred
'image_url' => $track['image_url'] ?? null,
'price' => $track['price'] ?? 0,
'status' => $track['status'],
'created_at' => $track['created_at'],
'task_id' => $track['task_id'] ?? null,
'music_type' => $track['music_type'] ?: 'music',
'genre' => $metadata['genre'] ?? 'Unknown',
'description' => $track['prompt'] ?: '',
'artist_name' => $track['artist_name'] ?: 'Unknown Artist',
'user_id' => $track['user_id'],
'like_count' => $track['like_count'] ?? 0,
'comment_count' => $track['comment_count'] ?? 0,
'play_count' => $track['play_count'] ?? 0,
'share_count' => $track['share_count'] ?? 0,
'purchase_count' => $track['purchase_count'] ?? 0,
'average_rating' => $track['average_rating'] ?? 0,
'rating_count' => $track['rating_count'] ?? 0,
'user_liked' => $track['user_liked'] ?? 0,
'is_in_wishlist' => $track['is_in_wishlist'] ?? 0,
'user_purchased' => $track['user_purchased'] ?? 0,
'metadata' => $track['metadata'] ?? null
];
}
}
echo json_encode([
'success' => true,
'tracks' => $processed_tracks,
'count' => count($processed_tracks)
]);
} catch (Exception $e) {
http_response_code(500);
echo json_encode([
'success' => false,
'error' => $e->getMessage()
]);
}
?>