![]() 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
session_start();
require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../utils/audio_token.php';
header('Content-Type: application/json; charset=utf-8');
$genre = $_GET['genre'] ?? '';
$per_page = intval($_GET['per_page'] ?? 50);
if (empty($genre)) {
echo json_encode([
'success' => false,
'error' => 'Genre parameter is required'
], JSON_UNESCAPED_UNICODE);
exit;
}
try {
$pdo = getDBConnection();
// Decode and clean genre name
$genre = urldecode($genre);
$genre = trim($genre, '"\'');
$genre = trim($genre);
// Use comprehensive search matching (same as community_fixed.php) to find tracks
// This searches in genre fields, title, artist name, and tags - just like the global search
// This ensures "rap" finds tracks with "rap" in title, genre, artist name, or tags
$genre_lower = strtolower($genre);
$genre_like = '%' . $genre_lower . '%';
// Get tracks by genre - search comprehensively like community_fixed.php does
// This includes title and artist name so "rap" finds all rap-related tracks
$stmt = $pdo->prepare("
SELECT
mt.id,
mt.title,
mt.audio_url,
mt.duration,
mt.image_url,
mt.created_at,
mt.user_id,
u.name as artist_name,
COALESCE(play_stats.play_count, 0) as play_count,
COALESCE(like_stats.like_count, 0) as like_count
FROM music_tracks mt
JOIN users u ON mt.user_id = u.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
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
WHERE mt.status = 'complete'
AND mt.is_public = 1
AND mt.audio_url IS NOT NULL
AND mt.audio_url != ''
AND (
-- Search in genre fields (primary)
LOWER(mt.genre) LIKE ?
OR LOWER(mt.tags) LIKE ?
OR LOWER(JSON_UNQUOTE(JSON_EXTRACT(mt.metadata, '$.genre'))) LIKE ?
OR LOWER(JSON_UNQUOTE(JSON_EXTRACT(mt.metadata, '$.style'))) LIKE ?
OR LOWER(CAST(JSON_EXTRACT(mt.metadata, '$.genre') AS CHAR)) LIKE ?
OR LOWER(CAST(JSON_EXTRACT(mt.metadata, '$.style') AS CHAR)) LIKE ?
OR LOWER(CAST(JSON_EXTRACT(mt.metadata, '$.proGenre') AS CHAR)) LIKE ?
OR LOWER(JSON_UNQUOTE(JSON_EXTRACT(mt.metadata, '$.proGenre'))) LIKE ?
OR LOWER(CAST(JSON_EXTRACT(mt.metadata, '$.proSubGenre') AS CHAR)) LIKE ?
OR LOWER(JSON_UNQUOTE(JSON_EXTRACT(mt.metadata, '$.proSubGenre'))) LIKE ?
-- Also search in title and artist name (like community search does)
OR LOWER(mt.title) LIKE ?
OR LOWER(u.name) LIKE ?
)
ORDER BY mt.created_at DESC
LIMIT ?
");
$stmt->execute([
$genre_like, // LOWER(mt.genre) LIKE ?
$genre_like, // LOWER(mt.tags) LIKE ?
$genre_like, // LOWER(JSON_UNQUOTE(JSON_EXTRACT(mt.metadata, '$.genre'))) LIKE ?
$genre_like, // LOWER(JSON_UNQUOTE(JSON_EXTRACT(mt.metadata, '$.style'))) LIKE ?
$genre_like, // LOWER(CAST(JSON_EXTRACT(mt.metadata, '$.genre') AS CHAR)) LIKE ?
$genre_like, // LOWER(CAST(JSON_EXTRACT(mt.metadata, '$.style') AS CHAR)) LIKE ?
$genre_like, // LOWER(CAST(JSON_EXTRACT(mt.metadata, '$.proGenre') AS CHAR)) LIKE ?
$genre_like, // LOWER(JSON_UNQUOTE(JSON_EXTRACT(mt.metadata, '$.proGenre'))) LIKE ?
$genre_like, // LOWER(CAST(JSON_EXTRACT(mt.metadata, '$.proSubGenre') AS CHAR)) LIKE ?
$genre_like, // LOWER(JSON_UNQUOTE(JSON_EXTRACT(mt.metadata, '$.proSubGenre'))) LIKE ?
$genre_like, // LOWER(mt.title) LIKE ?
$genre_like, // LOWER(u.name) LIKE ?
$per_page
]);
$tracks = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Randomize order but prioritize latest tracks
// Strategy: Keep first 3-5 latest tracks, then randomize the rest
$latest_count = min(5, count($tracks)); // Keep first 5 latest tracks
$latest_tracks = array_slice($tracks, 0, $latest_count);
$remaining_tracks = array_slice($tracks, $latest_count);
// Randomize the remaining tracks
shuffle($remaining_tracks);
// Combine: latest tracks first, then randomized rest
$tracks = array_merge($latest_tracks, $remaining_tracks);
// Process tracks and add signed URLs
$processed_tracks = [];
foreach ($tracks as $track) {
$audio_url = $track['audio_url'];
// Generate signed URL if audio token system is available
if (function_exists('generateSignedAudioUrl')) {
$audio_url = generateSignedAudioUrl($audio_url, $track['id']);
}
$processed_tracks[] = [
'id' => (int)$track['id'],
'title' => $track['title'],
'audio_url' => $audio_url,
'duration' => (int)$track['duration'],
'image_url' => $track['image_url'],
'artist_name' => $track['artist_name'],
'user_id' => (int)$track['user_id'],
'play_count' => (int)$track['play_count'],
'like_count' => (int)$track['like_count'],
'created_at' => $track['created_at']
];
}
echo json_encode([
'success' => true,
'tracks' => $processed_tracks,
'playlist_info' => [
'name' => $genre . ' Playlist',
'description' => 'Popular ' . $genre . ' tracks',
'genre' => $genre
]
], JSON_UNESCAPED_UNICODE);
} catch (Exception $e) {
error_log("Error fetching genre tracks: " . $e->getMessage());
echo json_encode([
'success' => false,
'error' => 'Failed to fetch genre tracks'
], JSON_UNESCAPED_UNICODE);
}
?>