T.ME/BIBIL_0DAY
CasperSecurity


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/gositeme/domains/soundstudiopro.com/private_html/api/get_genre_tracks.php
<?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);
}
?>


CasperSecurity Mini