![]() 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/ |
<?php
session_start();
require_once 'config/database.php';
// Check if user is logged in
if (!isset($_SESSION['user_id'])) {
header('Location: auth/login.php');
exit;
}
$pdo = getDBConnection();
$user_id = $_SESSION['user_id'];
$user_name = $_SESSION['user_name'];
// Get user's tracks with variations
$stmt = $pdo->prepare("
SELECT
mt.*,
COUNT(av.id) as actual_variations_count
FROM music_tracks mt
LEFT JOIN audio_variations av ON mt.id = av.track_id
WHERE mt.user_id = ?
GROUP BY mt.id
ORDER BY mt.created_at DESC
");
$stmt->execute([$user_id]);
$user_tracks = $stmt->fetchAll();
// Get variations for each track
$tracks_with_variations = [];
foreach ($user_tracks as $track) {
$stmt = $pdo->prepare("
SELECT * FROM audio_variations
WHERE track_id = ?
ORDER BY variation_index
");
$stmt->execute([$track['id']]);
$variations = $stmt->fetchAll();
$tracks_with_variations[] = [
'track' => $track,
'variations' => $variations
];
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Library - SoundStudioPro</title>
<link rel="stylesheet" href="assets/css/style.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<style>
.variations-container {
margin-top: 1rem;
padding: 1rem;
background: rgba(255, 255, 255, 0.05);
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.variations-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1rem;
}
.variations-title {
color: #667eea;
font-size: 1.4rem;
font-weight: 600;
}
.variations-count {
background: rgba(102, 126, 234, 0.2);
color: #667eea;
padding: 0.3rem 0.8rem;
border-radius: 6px;
font-size: 1.2rem;
font-weight: 600;
}
.variations-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.5rem;
}
.variation-card {
background: rgba(255, 255, 255, 0.03);
border-radius: 12px;
padding: 1.5rem;
border: 1px solid rgba(255, 255, 255, 0.05);
transition: all 0.3s ease;
}
.variation-card:hover {
background: rgba(255, 255, 255, 0.05);
border-color: rgba(102, 126, 234, 0.3);
}
.variation-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1rem;
}
.variation-title {
color: white;
font-size: 1.3rem;
font-weight: 600;
}
.variation-index {
background: rgba(102, 126, 234, 0.2);
color: #667eea;
padding: 0.2rem 0.6rem;
border-radius: 4px;
font-size: 1rem;
font-weight: 600;
}
.variation-duration {
color: #a0aec0;
font-size: 1.1rem;
margin-bottom: 1rem;
}
.variation-audio {
width: 100%;
margin-bottom: 1rem;
}
.variation-actions {
display: flex;
gap: 0.8rem;
flex-wrap: wrap;
}
.btn {
padding: 0.6rem 1.2rem;
border: none;
border-radius: 6px;
font-size: 1.2rem;
font-weight: 600;
cursor: pointer;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 0.5rem;
transition: all 0.3s ease;
}
.btn-primary {
background: #667eea;
color: white;
}
.btn-primary:hover {
background: #5a67d8;
}
.btn-secondary {
background: rgba(255, 255, 255, 0.1);
color: white;
}
.btn-secondary:hover {
background: rgba(255, 255, 255, 0.2);
}
.btn-success {
background: #48bb78;
color: white;
}
.btn-success:hover {
background: #38a169;
}
.no-variations {
text-align: center;
color: #a0aec0;
font-style: italic;
padding: 2rem;
}
.track-status {
display: inline-block;
padding: 0.3rem 0.8rem;
border-radius: 6px;
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 1rem;
}
.status-complete {
background: rgba(72, 187, 120, 0.2);
color: #48bb78;
}
.status-processing {
background: rgba(237, 137, 54, 0.2);
color: #ed8936;
}
.status-failed {
background: rgba(245, 101, 101, 0.2);
color: #f56565;
}
</style>
</head>
<body>
<div class="container">
<header class="header">
<h1>🎵 My Library</h1>
<p>Your AI-generated music with multiple variations</p>
</header>
<div class="content">
<?php if (empty($tracks_with_variations)): ?>
<div class="empty-state">
<div class="empty-icon">🎵</div>
<h2>No tracks yet</h2>
<p>Start creating your first AI-generated music!</p>
<a href="create_music.php" class="btn btn-primary">
<i class="fas fa-plus"></i> Create Music
</a>
</div>
<?php else: ?>
<?php foreach ($tracks_with_variations as $track_data): ?>
<?php $track = $track_data['track']; ?>
<?php $variations = $track_data['variations']; ?>
<div class="music-card">
<div class="music-header">
<div>
<h3 class="music-title"><?php echo htmlspecialchars($track['title']); ?></h3>
<p class="music-prompt"><?php echo htmlspecialchars($track['prompt']); ?></p>
</div>
<div class="track-status status-<?php echo $track['status']; ?>">
<?php echo ucfirst($track['status']); ?>
</div>
</div>
<div class="music-details">
<span><i class="fas fa-clock"></i> <?php echo $track['duration']; ?>s</span>
<span><i class="fas fa-calendar"></i> <?php echo date('M j, Y', strtotime($track['created_at'])); ?></span>
<span><i class="fas fa-music"></i> <?php echo count($variations); ?> variations</span>
</div>
<?php if (!empty($variations)): ?>
<div class="variations-container">
<div class="variations-header">
<span class="variations-title">Audio Variations</span>
<span class="variations-count"><?php echo count($variations); ?> versions</span>
</div>
<div class="variations-grid">
<?php foreach ($variations as $variation): ?>
<div class="variation-card">
<div class="variation-header">
<span class="variation-title">
<?php echo htmlspecialchars($variation['title'] ?: $track['title']); ?>
</span>
<span class="variation-index">V<?php echo $variation['variation_index'] + 1; ?></span>
</div>
<div class="variation-duration">
<i class="fas fa-clock"></i> <?php echo round($variation['duration']); ?>s
</div>
<div class="variation-actions">
<button class="btn btn-primary" onclick="playTrack('<?php echo htmlspecialchars($variation['audio_url']); ?>', '<?php echo htmlspecialchars($variation['title'] ?: $track['title']); ?>', '<?php echo htmlspecialchars($user_name); ?>')">
<i class="fas fa-play"></i> Play
</button>
<a href="<?php echo htmlspecialchars($variation['audio_url']); ?>" class="btn btn-secondary" download="<?php echo htmlspecialchars($variation['title'] ?: $track['title']); ?>_v<?php echo $variation['variation_index'] + 1; ?>.mp3">
<i class="fas fa-download"></i> Download
</a>
<button class="btn btn-success" onclick="shareTrack(<?php echo $track['id']; ?>, '<?php echo htmlspecialchars($variation['title'] ?: $track['title']); ?>')">
<i class="fas fa-share"></i> Share
</button>
</div>
<?php if ($variation['tags']): ?>
<div class="variation-tags" style="margin-top: 1rem; font-size: 1.1rem; color: #a0aec0;">
<i class="fas fa-tag"></i> <?php echo htmlspecialchars($variation['tags']); ?>
</div>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
</div>
<?php else: ?>
<div class="no-variations">
<p>No audio variations available for this track.</p>
</div>
<?php endif; ?>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
</div>
<script>
function playTrack(audioUrl, title, artist) {
// Use the global player function (same as main library)
if (typeof window.playTrackWithGlobalPlayer === 'function') {
window.playTrackWithGlobalPlayer(audioUrl, title, artist);
} else if (typeof window.globalPlayer !== 'undefined' && window.globalPlayer.playTrack) {
window.globalPlayer.playTrack(audioUrl, title, artist);
} else {
console.error('Global player not available');
alert('Global player not available. Please refresh the page.');
}
}
function shareTrack(trackId, title) {
const shareUrl = `${window.location.origin}/player.php?track=${trackId}`;
if (navigator.share) {
navigator.share({
title: title,
text: `Check out my track "${title}" on SoundStudioPro!`,
url: shareUrl
});
} else {
// Fallback: copy to clipboard
navigator.clipboard.writeText(shareUrl).then(() => {
alert('Share link copied to clipboard!');
});
}
}
</script>
</body>
</html>