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_related_tracks.php
<?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']);
}
?> 

CasperSecurity Mini