![]() 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/-10d16f47/ |
<?php
// Admin Playlist Management
session_start();
// Check admin access
if (!isset($_SESSION['user_id']) || $_SESSION['user_role'] !== 'admin') {
header('Location: /auth/login.php');
exit;
}
require_once __DIR__ . '/../config/database.php';
// Handle form submissions
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$pdo = getDBConnection();
if (isset($_POST['action'])) {
switch ($_POST['action']) {
case 'toggle_featured':
$track_id = intval($_POST['track_id']);
$is_featured = isset($_POST['is_featured']) ? 1 : 0;
$stmt = $pdo->prepare("UPDATE music_tracks SET is_featured = ? WHERE id = ?");
$stmt->execute([$is_featured, $track_id]);
break;
case 'toggle_vip':
$track_id = intval($_POST['track_id']);
$is_vip = isset($_POST['is_vip']) ? 1 : 0;
$stmt = $pdo->prepare("UPDATE music_tracks SET is_vip_sample = ? WHERE id = ?");
$stmt->execute([$is_vip, $track_id]);
break;
case 'update_order':
$track_id = intval($_POST['track_id']);
$order = intval($_POST['order']);
$stmt = $pdo->prepare("UPDATE music_tracks SET playlist_order = ? WHERE id = ?");
$stmt->execute([$order, $track_id]);
break;
}
// Redirect to prevent resubmission
header('Location: ' . $_SERVER['PHP_SELF'] . '?tab=' . ($_POST['tab'] ?? 'all'));
exit;
}
}
// Get current tab
$current_tab = $_GET['tab'] ?? 'all';
// Get database connection
$pdo = getDBConnection();
// Fetch tracks based on current tab
switch ($current_tab) {
case 'featured':
$where_clause = "WHERE mt.is_featured = 1";
break;
case 'vip':
$where_clause = "WHERE mt.is_vip_sample = 1";
break;
case 'all':
default:
$where_clause = "WHERE 1=1";
break;
}
$query = "
SELECT
mt.id,
mt.title,
mt.audio_url,
mt.is_featured,
mt.is_vip_sample,
mt.playlist_order,
mt.created_at,
u.user_name as artist_name,
COALESCE(play_count.count, 0) as play_count,
COALESCE(like_count.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 count
FROM track_plays
GROUP BY track_id
) play_count ON mt.id = play_count.track_id
LEFT JOIN (
SELECT track_id, COUNT(*) as count
FROM track_likes
GROUP BY track_id
) like_count ON mt.id = like_count.track_id
$where_clause
AND mt.status = 'complete'
AND mt.audio_url IS NOT NULL
ORDER BY mt.playlist_order ASC, mt.created_at DESC
LIMIT 100
";
$tracks = $pdo->query($query)->fetchAll(PDO::FETCH_ASSOC);
// Get counts
$featured_count = $pdo->query("SELECT COUNT(*) as count FROM music_tracks WHERE is_featured = 1")->fetch()['count'];
$vip_count = $pdo->query("SELECT COUNT(*) as count FROM music_tracks WHERE is_vip_sample = 1")->fetch()['count'];
$total_count = $pdo->query("SELECT COUNT(*) as count FROM music_tracks WHERE status = 'complete'")->fetch()['count'];
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Playlist Management - Admin</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f8fafc; }
.container { max-width: 1200px; margin: 0 auto; padding: 20px; }
.header { background: white; padding: 20px; border-radius: 8px; margin-bottom: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
.tabs { display: flex; gap: 10px; margin-bottom: 20px; }
.tab { padding: 10px 20px; background: white; border: 1px solid #e5e7eb; border-radius: 6px; text-decoration: none; color: #374151; }
.tab.active { background: #3b82f6; color: white; }
.track-list { background: white; border-radius: 8px; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
.track-item { display: grid; grid-template-columns: 50px 2fr 100px 100px 80px 200px; gap: 15px; padding: 15px; border-bottom: 1px solid #f3f4f6; align-items: center; }
.track-item:last-child { border-bottom: none; }
.track-title { font-weight: 600; color: #111827; }
.track-artist { font-size: 14px; color: #6b7280; }
.checkbox-group { display: flex; flex-direction: column; gap: 5px; }
.checkbox-group label { font-size: 12px; color: #374151; }
.order-input { width: 60px; padding: 4px; border: 1px solid #d1d5db; border-radius: 4px; }
.stats { font-size: 12px; color: #6b7280; }
.actions { display: flex; gap: 5px; }
.btn { padding: 6px 12px; border: none; border-radius: 4px; cursor: pointer; font-size: 12px; }
.btn-primary { background: #3b82f6; color: white; }
.btn-secondary { background: #6b7280; color: white; }
.play-btn { background: #10b981; color: white; border: none; border-radius: 50%; width: 40px; height: 40px; cursor: pointer; }
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>🎵 Playlist Management</h1>
<p>Manage Featured tracks and VIP Sample playlist for the homepage</p>
</div>
<div class="tabs">
<a href="?tab=all" class="tab <?= $current_tab === 'all' ? 'active' : '' ?>">All Tracks (<?= $total_count ?>)</a>
<a href="?tab=featured" class="tab <?= $current_tab === 'featured' ? 'active' : '' ?>">⭐ Featured (<?= $featured_count ?>)</a>
<a href="?tab=vip" class="tab <?= $current_tab === 'vip' ? 'active' : '' ?>">🎵 VIP Samples (<?= $vip_count ?>)</a>
</div>
<div class="track-list">
<div class="track-item" style="background: #f9fafb; font-weight: 600;">
<div>Play</div>
<div>Track Details</div>
<div>Featured</div>
<div>VIP Sample</div>
<div>Order</div>
<div>Actions</div>
</div>
<?php foreach ($tracks as $track): ?>
<div class="track-item">
<button class="play-btn" onclick="playTrack('<?= htmlspecialchars($track['audio_url']) ?>', '<?= htmlspecialchars($track['title']) ?>', '<?= htmlspecialchars($track['artist_name']) ?>')">
<i style="font-size: 14px;">▶</i>
</button>
<div>
<div class="track-title"><?= htmlspecialchars($track['title']) ?></div>
<div class="track-artist">by <?= htmlspecialchars($track['artist_name']) ?></div>
<div class="stats"><?= $track['play_count'] ?> plays • <?= $track['like_count'] ?> likes</div>
</div>
<form method="POST" style="margin: 0;">
<input type="hidden" name="action" value="toggle_featured">
<input type="hidden" name="track_id" value="<?= $track['id'] ?>">
<input type="hidden" name="tab" value="<?= $current_tab ?>">
<div class="checkbox-group">
<label>
<input type="checkbox" name="is_featured" <?= $track['is_featured'] ? 'checked' : '' ?> onchange="this.form.submit()">
Featured
</label>
</div>
</form>
<form method="POST" style="margin: 0;">
<input type="hidden" name="action" value="toggle_vip">
<input type="hidden" name="track_id" value="<?= $track['id'] ?>">
<input type="hidden" name="tab" value="<?= $current_tab ?>">
<div class="checkbox-group">
<label>
<input type="checkbox" name="is_vip" <?= $track['is_vip_sample'] ? 'checked' : '' ?> onchange="this.form.submit()">
VIP
</label>
</div>
</form>
<form method="POST" style="margin: 0;">
<input type="hidden" name="action" value="update_order">
<input type="hidden" name="track_id" value="<?= $track['id'] ?>">
<input type="hidden" name="tab" value="<?= $current_tab ?>">
<input type="number" name="order" value="<?= $track['playlist_order'] ?>" class="order-input" onchange="this.form.submit()">
</form>
<div class="actions">
<button class="btn btn-secondary" onclick="window.open('<?= htmlspecialchars($track['audio_url']) ?>', '_blank')">Download</button>
</div>
</div>
<?php endforeach; ?>
</div>
<div style="margin-top: 20px; text-align: center;">
<a href="/admin.php" class="btn btn-primary">← Back to Admin Dashboard</a>
</div>
</div>
<script>
function playTrack(audioUrl, title, artist) {
// Use the global player if available
if (typeof window.enhancedGlobalPlayer !== 'undefined') {
window.enhancedGlobalPlayer.playTrack(audioUrl, title, artist);
} else if (typeof window.playTrack === 'function') {
window.playTrack(audioUrl, title, artist);
} else {
// Fallback: open in new window
window.open(audioUrl, '_blank');
}
}
</script>
</body>
</html>