setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // create tables if missing $pdo->exec("CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, email TEXT UNIQUE, password TEXT, role TEXT DEFAULT 'user', created_at DATETIME DEFAULT CURRENT_TIMESTAMP )"); $pdo->exec("CREATE TABLE IF NOT EXISTS tracks ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, title TEXT, artist TEXT, album TEXT, genre TEXT, filename TEXT, filesize INTEGER, mime TEXT, status TEXT DEFAULT 'pending', -- pending | approved | rejected notes TEXT, uploaded_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY(user_id) REFERENCES users(id) )"); } catch (Exception $e) { die("DB error: " . htmlspecialchars($e->getMessage())); } // create default admin if not exists $admin_email = 'admin@demo.com'; $stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?"); $stmt->execute([$admin_email]); if (!$stmt->fetch()) { $pdo->prepare("INSERT INTO users (name,email,password,role) VALUES (?,?,?,?)") ->execute(['Admin', $admin_email, password_hash('admin123', PASSWORD_DEFAULT), 'admin']); } // --- Helper functions --- function is_logged() { return isset($_SESSION['user_id']); } function is_admin() { return (isset($_SESSION['role']) && $_SESSION['role'] === 'admin'); } function redirect($url) { header("Location: $url"); exit; } function e($s) { return htmlspecialchars($s ?? '', ENT_QUOTES); } // --- AUTH: register / login / logout --- $action = $_REQUEST['action'] ?? null; if ($action === 'register' && $_SERVER['REQUEST_METHOD'] === 'POST') { $name = trim($_POST['name'] ?? ''); $email = trim($_POST['email'] ?? ''); $pass = $_POST['password'] ?? ''; if ($name && filter_var($email, FILTER_VALIDATE_EMAIL) && strlen($pass) >= 6) { $hash = password_hash($pass, PASSWORD_DEFAULT); try { $pdo->prepare("INSERT INTO users (name,email,password) VALUES (?,?,?)") ->execute([$name, $email, $hash]); $_SESSION['flash'] = "Registration successful. Please login."; redirect('./'); } catch (Exception $e) { $_SESSION['flash'] = "Error: " . e($e->getMessage()); redirect('./?view=auth'); } } else { $_SESSION['flash'] = "Please provide valid name, email and password (6+ chars)."; redirect('./?view=auth'); } } if ($action === 'login' && $_SERVER['REQUEST_METHOD'] === 'POST') { $email = trim($_POST['email'] ?? ''); $pass = $_POST['password'] ?? ''; $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?"); $stmt->execute([$email]); $u = $stmt->fetch(PDO::FETCH_ASSOC); if ($u && password_verify($pass, $u['password'])) { $_SESSION['user_id'] = $u['id']; $_SESSION['name'] = $u['name']; $_SESSION['role'] = $u['role']; $_SESSION['flash'] = "Welcome, " . $u['name']; redirect('./'); } else { $_SESSION['flash'] = "Invalid credentials."; redirect('./?view=auth'); } } if ($action === 'logout') { session_unset(); session_destroy(); session_start(); $_SESSION['flash'] = "Logged out."; redirect('./'); } // --- UPLOAD track (user) --- if ($action === 'upload' && $_SERVER['REQUEST_METHOD'] === 'POST' && is_logged()) { $title = trim($_POST['title'] ?? ''); $artist = trim($_POST['artist'] ?? ''); $album = trim($_POST['album'] ?? ''); $genre = trim($_POST['genre'] ?? ''); if (!isset($_FILES['track']) || $_FILES['track']['error'] !== UPLOAD_ERR_OK) { $_SESSION['flash'] = "Please choose a file to upload."; redirect('./?view=dashboard'); } $f = $_FILES['track']; if ($f['size'] > MAX_UPLOAD_BYTES) { $_SESSION['flash'] = "File too large (max 20MB)."; redirect('./?view=dashboard'); } // Basic mime validation $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $f['tmp_name']); finfo_close($finfo); $allowed = ['audio/mpeg','audio/mp3','audio/wav','audio/x-wav','audio/flac','audio/x-flac']; if (!in_array($mime, $allowed)) { $_SESSION['flash'] = "Unsupported audio format: " . e($mime) . ". Allowed: mp3/wav/flac."; redirect('./?view=dashboard'); } $ext = pathinfo($f['name'], PATHINFO_EXTENSION); $basename = bin2hex(random_bytes(8)) . '.' . $ext; $dest = UPLOAD_DIR . '/' . $basename; if (!move_uploaded_file($f['tmp_name'], $dest)) { $_SESSION['flash'] = "Failed to move uploaded file."; redirect('./?view=dashboard'); } // insert track record $pdo->prepare("INSERT INTO tracks (user_id,title,artist,album,genre,filename,filesize,mime) VALUES (?,?,?,?,?,?,?,?)") ->execute([$_SESSION['user_id'],$title,$artist,$album,$genre,$basename,$f['size'],$mime]); $_SESSION['flash'] = "Track uploaded and awaiting admin approval."; redirect('./?view=dashboard'); } // --- ADMIN actions: approve/reject/delete --- if (is_admin() && $action === 'admin_action' && $_SERVER['REQUEST_METHOD'] === 'POST') { $sub = $_POST['subaction'] ?? ''; $track_id = (int)($_POST['track_id'] ?? 0); if ($sub === 'approve') { $pdo->prepare("UPDATE tracks SET status = 'approved', notes = ? WHERE id = ?") ->execute([trim($_POST['notes'] ?? 'Approved'), $track_id]); $_SESSION['flash'] = "Track approved."; } elseif ($sub === 'reject') { $pdo->prepare("UPDATE tracks SET status = 'rejected', notes = ? WHERE id = ?") ->execute([trim($_POST['notes'] ?? 'Rejected'), $track_id]); $_SESSION['flash'] = "Track rejected."; } elseif ($sub === 'delete') { $stmt = $pdo->prepare("SELECT filename FROM tracks WHERE id = ?"); $stmt->execute([$track_id]); $row = $stmt->fetch(PDO::FETCH_ASSOC); if ($row) { $file = UPLOAD_DIR . '/' . $row['filename']; if (file_exists($file)) @unlink($file); $pdo->prepare("DELETE FROM tracks WHERE id = ?")->execute([$track_id]); $_SESSION['flash'] = "Track deleted."; } } redirect('./?view=admin'); } // --- ROUTES: simple view router --- $view = $_GET['view'] ?? 'home'; // small helpers for queries function get_latest_tracks($pdo, $limit=12) { $stmt = $pdo->prepare("SELECT t.*, u.name as uploader FROM tracks t LEFT JOIN users u ON u.id=t.user_id WHERE t.status='approved' ORDER BY t.uploaded_at DESC LIMIT ?"); $stmt->execute([$limit]); return $stmt->fetchAll(PDO::FETCH_ASSOC); } function get_user_tracks($pdo, $user_id) { $stmt = $pdo->prepare("SELECT * FROM tracks WHERE user_id = ? ORDER BY uploaded_at DESC"); $stmt->execute([$user_id]); return $stmt->fetchAll(PDO::FETCH_ASSOC); } function get_all_tracks($pdo) { $stmt = $pdo->query("SELECT t.*, u.name as uploader FROM tracks t LEFT JOIN users u ON u.id=t.user_id ORDER BY t.uploaded_at DESC"); return $stmt->fetchAll(PDO::FETCH_ASSOC); } function get_users($pdo) { $stmt = $pdo->query("SELECT id,name,email,role,created_at FROM users ORDER BY created_at DESC"); return $stmt->fetchAll(PDO::FETCH_ASSOC); } // --- Flash messages --- $flash = $_SESSION['flash'] ?? null; unset($_SESSION['flash']); ?> Playnex Mini — Music Distribution
Playnex Mini — Music Distribution
Upload · Approve · Distribute (demo)

Latest Releases

Approved tracks available for streaming / distribution preview.

No released tracks yet. Upload and wait for admin approval.
🎵
· ·

Login / Register

Register

Create account

My Dashboard

Hello, — Upload tracks and track their approval status.

Upload Track

My Uploads

No uploads yet.
🎧
·
Uploaded: · Size: MB
Pending Approved Rejected
Admin note:

Admin Panel

Approve, reject or delete uploads. Download raw files and manage users.

Pending & All Tracks

No tracks yet.
🎵
·
·
Pending Approved Rejected
Note:
Download

Users

No users.
Role: · Joined:
Please log in to view this page.