Mplayer
Mplayer
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Neon Music Player</title>
<style>
:root {
--bg-color: #1a1a2e;
--text-color: #e6e6e6;
--primary-color: #00f0ff;
--secondary-color: #ff00ff;
--accent-color: #ff6b6b;
--card-bg: #16213e;
--shadow-color: rgba(0, 240, 255, 0.3);
}
.light-mode {
--bg-color: #f0f0f0;
--text-color: #333333;
--primary-color: #0077ff;
--secondary-color: #ff5500;
--accent-color: #ff3366;
--card-bg: #ffffff;
--shadow-color: rgba(0, 119, 255, 0.2);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
transition: background-color 0.3s, color 0.3s;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: var(--bg-color);
color: var(--text-color);
min-height: 100vh;
padding: 20px;
}
.container {
max-width: 800px;
margin: 0 auto;
}
header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
padding-bottom: 15px;
border-bottom: 1px solid var(--primary-color);
}
h1 {
font-size: 2.5rem;
text-shadow: 0 0 10px var(--primary-color), 0 0 20px var(--shadow-
color);
color: var(--primary-color);
}
.mode-toggle {
background: none;
border: none;
cursor: pointer;
font-size: 1.5rem;
color: var(--secondary-color);
text-shadow: 0 0 5px var(--secondary-color);
}
.mode-toggle:hover {
transform: scale(1.1);
}
.player-container {
background-color: var(--card-bg);
border-radius: 10px;
padding: 20px;
margin-bottom: 20px;
box-shadow: 0 0 15px var(--shadow-color);
border-left: 4px solid var(--primary-color);
}
.now-playing {
display: flex;
align-items: center;
margin-bottom: 20px;
gap: 20px;
}
.album-art {
width: 120px;
height: 120px;
border-radius: 10px;
object-fit: cover;
border: 2px solid var(--primary-color);
box-shadow: 0 0 10px var(--shadow-color);
flex-shrink: 0;
}
.song-info {
flex: 1;
}
.song-title {
font-size: 1.5rem;
margin-bottom: 5px;
color: var(--primary-color);
text-shadow: 0 0 5px var(--shadow-color);
}
.song-artist {
font-size: 1.1rem;
margin-bottom: 10px;
color: var(--text-color);
opacity: 0.8;
}
.progress-container {
width: 100%;
height: 6px;
background-color: rgba(255, 255, 255, 0.1);
border-radius: 3px;
margin-bottom: 5px;
cursor: pointer;
}
.progress-bar {
height: 100%;
background-color: var(--primary-color);
border-radius: 3px;
width: 0%;
box-shadow: 0 0 5px var(--primary-color);
}
.time-info {
display: flex;
justify-content: space-between;
font-size: 0.9rem;
color: var(--text-color);
opacity: 0.7;
margin-bottom: 20px;
}
.controls {
display: flex;
justify-content: center;
gap: 20px;
margin-bottom: 20px;
}
.control-btn {
background: none;
border: none;
cursor: pointer;
font-size: 1.8rem;
color: var(--text-color);
width: 50px;
height: 50px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
}
.control-btn:hover {
transform: scale(1.1);
color: var(--primary-color);
text-shadow: 0 0 10px var(--shadow-color);
}
.play-btn {
background-color: var(--primary-color);
color: var(--bg-color);
font-size: 2rem;
box-shadow: 0 0 15px var(--shadow-color);
}
.play-btn:hover {
background-color: var(--secondary-color);
color: var(--bg-color);
box-shadow: 0 0 20px var(--secondary-color);
}
.volume-container {
display: flex;
align-items: center;
gap: 10px;
margin-top: 10px;
}
.volume-slider {
flex: 1;
-webkit-appearance: none;
height: 4px;
background: rgba(255, 255, 255, 0.2);
border-radius: 2px;
}
.volume-slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 15px;
height: 15px;
border-radius: 50%;
background: var(--primary-color);
cursor: pointer;
box-shadow: 0 0 5px var(--shadow-color);
}
.playlist-container {
background-color: var(--card-bg);
border-radius: 10px;
padding: 20px;
box-shadow: 0 0 15px var(--shadow-color);
border-left: 4px solid var(--secondary-color);
}
.playlist-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
}
.playlist-title {
font-size: 1.5rem;
color: var(--secondary-color);
text-shadow: 0 0 5px var(--secondary-color);
}
.add-song-btn {
background-color: var(--secondary-color);
color: #fff;
border: none;
border-radius: 5px;
padding: 8px 15px;
cursor: pointer;
font-weight: bold;
box-shadow: 0 0 10px var(--secondary-color);
transition: all 0.3s;
}
.add-song-btn:hover {
transform: translateY(-2px);
box-shadow: 0 0 15px var(--secondary-color);
}
.playlist {
list-style: none;
max-height: 300px;
overflow-y: auto;
}
.playlist::-webkit-scrollbar {
width: 8px;
}
.playlist::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
}
.playlist::-webkit-scrollbar-thumb {
background: var(--primary-color);
border-radius: 4px;
}
.song-item {
display: flex;
align-items: center;
padding: 10px;
border-radius: 5px;
margin-bottom: 5px;
cursor: pointer;
transition: all 0.2s;
}
.song-item:hover {
background-color: rgba(255, 255, 255, 0.1);
transform: translateX(5px);
}
.song-item.active {
background-color: rgba(0, 240, 255, 0.2);
border-left: 3px solid var(--primary-color);
}
.song-item-number {
width: 30px;
text-align: center;
opacity: 0.7;
}
.song-item-info {
flex: 1;
}
.song-item-title {
font-weight: bold;
margin-bottom: 3px;
}
.song-item-artist {
font-size: 0.9rem;
opacity: 0.7;
}
.song-item-duration {
padding: 0 10px;
opacity: 0.7;
}
.song-item-delete {
color: var(--accent-color);
background: none;
border: none;
cursor: pointer;
font-size: 1.2rem;
opacity: 0.7;
transition: all 0.2s;
}
.song-item-delete:hover {
opacity: 1;
transform: scale(1.2);
}
.empty-state {
text-align: center;
padding: 30px;
color: #888;
font-size: 1.2rem;
}
.file-input {
display: none;
}
.controls {
gap: 10px;
}
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>Neon Music Player</h1>
<button class="mode-toggle" id="mode-toggle">🌓</button>
</header>
<div class="player-container">
<div class="now-playing">
<img src="https://via.placeholder.com/120" alt="Album Art"
class="album-art" id="album-art">
<div class="song-info">
<div class="song-title" id="song-title">No song selected</div>
<div class="song-artist" id="song-artist">Artist</div>
<div class="progress-container" id="progress-container">
<div class="progress-bar" id="progress-bar"></div>
</div>
<div class="time-info">
<span id="current-time">0:00</span>
<span id="duration">0:00</span>
</div>
</div>
</div>
<div class="controls">
<button class="control-btn" id="prev-btn">⏮</button>
<button class="control-btn play-btn" id="play-btn">▶</button>
<button class="control-btn" id="next-btn">⏭</button>
</div>
<div class="volume-container">
<span>🔈</span>
<input type="range" class="volume-slider" id="volume-slider"
min="0" max="1" step="0.01" value="0.7">
<span>🔊</span>
</div>
</div>
<div class="playlist-container">
<div class="playlist-header">
<h2 class="playlist-title">Playlist</h2>
<button class="add-song-btn" id="add-song-btn">Add Song</button>
<input type="file" class="file-input" id="file-input"
accept="audio/*" multiple>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
// DOM Elements
const modeToggle = document.getElementById('mode-toggle');
const albumArt = document.getElementById('album-art');
const songTitle = document.getElementById('song-title');
const songArtist = document.getElementById('song-artist');
const progressContainer = document.getElementById('progress-
container');
const progressBar = document.getElementById('progress-bar');
const currentTimeEl = document.getElementById('current-time');
const durationEl = document.getElementById('duration');
const playBtn = document.getElementById('play-btn');
const prevBtn = document.getElementById('prev-btn');
const nextBtn = document.getElementById('next-btn');
const volumeSlider = document.getElementById('volume-slider');
const addSongBtn = document.getElementById('add-song-btn');
const fileInput = document.getElementById('file-input');
const playlistEl = document.getElementById('playlist');
const emptyState = document.getElementById('empty-state');
// Audio context
const audio = new Audio();
let isPlaying = false;
let currentSongIndex = 0;
let songs = JSON.parse(localStorage.getItem('neonPlaylist')) || [];
// Event listeners
playBtn.addEventListener('click', togglePlay);
prevBtn.addEventListener('click', prevSong);
nextBtn.addEventListener('click', nextSong);
progressContainer.addEventListener('click', setProgress);
volumeSlider.addEventListener('input', setVolume);
addSongBtn.addEventListener('click', () => fileInput.click());
fileInput.addEventListener('change', handleFileUpload);
modeToggle.addEventListener('click', toggleMode);
// Toggle play/pause
function togglePlay() {
if (songs.length === 0) return;
if (isPlaying) {
pauseSong();
} else {
playSong();
}
}
// Play song
function playSong() {
if (songs.length === 0) return;
// Pause song
function pauseSong() {
audio.pause();
isPlaying = false;
playBtn.textContent = '▶';
}
// Previous song
function prevSong() {
if (songs.length === 0) return;
currentSongIndex--;
if (currentSongIndex < 0) {
currentSongIndex = songs.length - 1;
}
playSong();
}
// Next song
function nextSong() {
if (songs.length === 0) return;
currentSongIndex++;
if (currentSongIndex >= songs.length) {
currentSongIndex = 0;
}
playSong();
}
// Set volume
function setVolume() {
audio.volume = this.value;
}
const song = {
id: Date.now() + i,
title: artistTitle.length > 1 ? artistTitle[1] : fileName,
artist: artistTitle.length > 1 ? artistTitle[0] : 'Unknown
Artist',
url: url,
artwork: 'https://via.placeholder.com/120',
duration: 0 // Will be updated when played
};
songs.push(song);
}
savePlaylist();
renderPlaylist();
updateEmptyState();
// Render playlist
function renderPlaylist() {
playlistEl.innerHTML = '';
// Delete button
const deleteBtn = songEl.querySelector('.song-item-delete');
deleteBtn.addEventListener('click', (e) => deleteSong(song.id,
e));
playlistEl.appendChild(songEl);
});
}
</script>
</body>
</html>