steake's picture
Add 2 files
3a03d45 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>LyricSync - Spotify Karaoke Player</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap');
body {
font-family: 'Poppins', sans-serif;
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
color: #fff;
min-height: 100vh;
}
.lyric-line {
transition: all 0.3s ease;
line-height: 2.5;
}
.lyric-line.active {
color: #1DB954;
font-size: 1.5rem;
font-weight: 600;
text-shadow: 0 0 10px rgba(29, 185, 84, 0.5);
}
.progress-bar {
height: 4px;
background: rgba(255, 255, 255, 0.2);
border-radius: 2px;
}
.progress-fill {
height: 100%;
background: #1DB954;
border-radius: 2px;
transition: width 0.1s linear;
}
.volume-slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 16px;
height: 16px;
background: #1DB954;
border-radius: 50%;
cursor: pointer;
}
.playlist-item:hover {
background: rgba(255, 255, 255, 0.1);
}
.blur-bg {
background: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(10px);
}
.language-option:hover {
background: rgba(29, 185, 84, 0.2);
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
.pulse-animation {
animation: pulse 2s infinite;
}
</style>
</head>
<body class="flex flex-col">
<!-- Main Container -->
<div class="flex flex-col md:flex-row flex-1 overflow-hidden">
<!-- Sidebar -->
<div class="w-full md:w-64 bg-black bg-opacity-30 p-4 flex flex-col">
<div class="mb-8">
<h1 class="text-2xl font-bold text-white flex items-center">
<i class="fas fa-music text-green-500 mr-2"></i>
LyricSync
</h1>
<p class="text-gray-400 text-sm">Your Spotify Karaoke Experience</p>
</div>
<nav class="mb-8">
<ul class="space-y-2">
<li>
<a href="#" class="flex items-center px-3 py-2 rounded text-white bg-green-900 bg-opacity-30">
<i class="fas fa-home mr-3"></i> Home
</a>
</li>
<li>
<a href="#" class="flex items-center px-3 py-2 rounded text-gray-400 hover:text-white hover:bg-gray-800">
<i class="fas fa-search mr-3"></i> Search
</a>
</li>
<li>
<a href="#" class="flex items-center px-3 py-2 rounded text-gray-400 hover:text-white hover:bg-gray-800">
<i class="fas fa-book mr-3"></i> Your Library
</a>
</li>
</ul>
</nav>
<div class="mb-8">
<div class="flex items-center justify-between mb-4">
<h2 class="text-gray-400 uppercase text-xs font-bold tracking-wider">Playlists</h2>
<button class="text-gray-400 hover:text-white">
<i class="fas fa-plus"></i>
</button>
</div>
<ul class="space-y-2">
<li>
<a href="#" class="flex items-center px-3 py-2 rounded text-gray-400 hover:text-white hover:bg-gray-800">
<i class="fas fa-heart mr-3 text-green-500"></i> Liked Songs
</a>
</li>
<li>
<a href="#" class="flex items-center px-3 py-2 rounded text-gray-400 hover:text-white hover:bg-gray-800">
<i class="fas fa-clock mr-3"></i> Recently Played
</a>
</li>
<li>
<a href="#" class="flex items-center px-3 py-2 rounded text-gray-400 hover:text-white hover:bg-gray-800">
<i class="fas fa-list mr-3"></i> Discover Weekly
</a>
</li>
</ul>
</div>
<div class="mt-auto">
<button id="loginBtn" class="w-full bg-green-500 hover:bg-green-600 text-white py-2 px-4 rounded-full font-medium flex items-center justify-center">
<i class="fab fa-spotify mr-2"></i> Connect Spotify
</button>
</div>
</div>
<!-- Main Content -->
<div class="flex-1 flex flex-col overflow-hidden">
<!-- Top Navigation -->
<div class="p-4 flex justify-between items-center blur-bg">
<div class="flex space-x-4">
<button class="w-8 h-8 rounded-full bg-black bg-opacity-40 flex items-center justify-center hover:bg-opacity-60">
<i class="fas fa-chevron-left"></i>
</button>
<button class="w-8 h-8 rounded-full bg-black bg-opacity-40 flex items-center justify-center hover:bg-opacity-60">
<i class="fas fa-chevron-right"></i>
</button>
</div>
<div class="flex items-center space-x-4">
<div class="relative group">
<button class="flex items-center space-x-2 bg-black bg-opacity-60 hover:bg-opacity-80 px-4 py-1 rounded-full">
<span class="text-sm font-medium">Premium Required</span>
<i class="fas fa-crown text-yellow-400"></i>
</button>
<div class="absolute right-0 mt-2 w-64 bg-gray-800 rounded-md shadow-lg z-10 hidden group-hover:block p-2">
<p class="text-sm text-gray-300 p-2">Full playback features require Spotify Premium account.</p>
</div>
</div>
<div class="relative group">
<button class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center overflow-hidden">
<i class="fas fa-user"></i>
</button>
<div class="absolute right-0 mt-2 w-48 bg-gray-800 rounded-md shadow-lg z-10 hidden group-hover:block">
<a href="#" class="block px-4 py-2 text-sm text-gray-300 hover:bg-gray-700">Account</a>
<a href="#" class="block px-4 py-2 text-sm text-gray-300 hover:bg-gray-700">Settings</a>
<a href="#" class="block px-4 py-2 text-sm text-gray-300 hover:bg-gray-700">Log out</a>
</div>
</div>
</div>
</div>
<!-- Content Area -->
<div class="flex-1 overflow-y-auto p-6">
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- Playlists Section -->
<div class="lg:col-span-1 bg-gray-800 bg-opacity-40 rounded-xl p-4">
<h2 class="text-xl font-bold mb-4">Your Library</h2>
<div class="mb-6">
<h3 class="text-sm font-semibold text-gray-400 mb-2">RECENTLY PLAYED</h3>
<div class="space-y-2">
<div class="playlist-item flex items-center p-2 rounded cursor-pointer">
<div class="w-12 h-12 bg-gray-700 rounded mr-3 overflow-hidden">
<img src="https://i.scdn.co/image/ab67616d00001e02ff9ca10b55ce82ae553c8228" class="w-full h-full object-cover">
</div>
<div>
<h4 class="font-medium">Blinding Lights</h4>
<p class="text-xs text-gray-400">The Weeknd</p>
</div>
</div>
<div class="playlist-item flex items-center p-2 rounded cursor-pointer">
<div class="w-12 h-12 bg-gray-700 rounded mr-3 overflow-hidden">
<img src="https://i.scdn.co/image/ab67616d00001e02663a67c2591b8e2316140f05" class="w-full h-full object-cover">
</div>
<div>
<h4 class="font-medium">Save Your Tears</h4>
<p class="text-xs text-gray-400">The Weeknd</p>
</div>
</div>
<div class="playlist-item flex items-center p-2 rounded cursor-pointer">
<div class="w-12 h-12 bg-gray-700 rounded mr-3 overflow-hidden">
<img src="https://i.scdn.co/image/ab67616d00001e02d5f788c3b3c4e5a87d327d26" class="w-full h-full object-cover">
</div>
<div>
<h4 class="font-medium">Levitating</h4>
<p class="text-xs text-gray-400">Dua Lipa</p>
</div>
</div>
</div>
</div>
<div>
<h3 class="text-sm font-semibold text-gray-400 mb-2">YOUR PLAYLISTS</h3>
<div class="space-y-2">
<div class="playlist-item flex items-center p-2 rounded cursor-pointer">
<div class="w-12 h-12 bg-gradient-to-br from-purple-500 to-blue-500 rounded mr-3 flex items-center justify-center">
<i class="fas fa-heart text-white"></i>
</div>
<div>
<h4 class="font-medium">Liked Songs</h4>
<p class="text-xs text-gray-400">Playlist • 127 songs</p>
</div>
</div>
<div class="playlist-item flex items-center p-2 rounded cursor-pointer">
<div class="w-12 h-12 bg-gradient-to-br from-green-500 to-blue-500 rounded mr-3 flex items-center justify-center">
<i class="fas fa-clock text-white"></i>
</div>
<div>
<h4 class="font-medium">Recently Played</h4>
<p class="text-xs text-gray-400">Playlist • 50 songs</p>
</div>
</div>
<div class="playlist-item flex items-center p-2 rounded cursor-pointer">
<div class="w-12 h-12 bg-gradient-to-br from-yellow-500 to-red-500 rounded mr-3 flex items-center justify-center">
<i class="fas fa-list text-white"></i>
</div>
<div>
<h4 class="font-medium">Discover Weekly</h4>
<p class="text-xs text-gray-400">Playlist • 30 songs</p>
</div>
</div>
</div>
</div>
</div>
<!-- Lyrics Section -->
<div class="lg:col-span-2 bg-gray-800 bg-opacity-40 rounded-xl p-6">
<div class="flex justify-between items-center mb-6">
<div>
<h2 class="text-2xl font-bold">Blinding Lights</h2>
<p class="text-gray-400">The Weeknd • After Hours • 2020</p>
</div>
<div class="flex space-x-3">
<button class="w-10 h-10 rounded-full bg-gray-700 hover:bg-gray-600 flex items-center justify-center">
<i class="fas fa-random"></i>
</button>
<button class="w-10 h-10 rounded-full bg-gray-700 hover:bg-gray-600 flex items-center justify-center">
<i class="fas fa-step-backward"></i>
</button>
<button id="playBtn" class="w-10 h-10 rounded-full bg-green-500 hover:bg-green-600 flex items-center justify-center">
<i class="fas fa-play"></i>
</button>
<button class="w-10 h-10 rounded-full bg-gray-700 hover:bg-gray-600 flex items-center justify-center">
<i class="fas fa-step-forward"></i>
</button>
<button class="w-10 h-10 rounded-full bg-gray-700 hover:bg-gray-600 flex items-center justify-center">
<i class="fas fa-redo"></i>
</button>
</div>
</div>
<div class="mb-6">
<div class="progress-bar mb-1">
<div id="progressFill" class="progress-fill" style="width: 35%"></div>
</div>
<div class="flex justify-between text-xs text-gray-400">
<span id="currentTime">2:15</span>
<span id="duration">3:20</span>
</div>
</div>
<div class="flex justify-between items-center mb-6">
<div class="flex items-center space-x-2">
<i class="fas fa-volume-up text-gray-400"></i>
<input type="range" min="0" max="100" value="70" class="volume-slider w-24">
</div>
<div class="relative group">
<button id="translateBtn" class="flex items-center space-x-2 bg-gray-700 hover:bg-gray-600 px-4 py-2 rounded-full">
<i class="fas fa-language"></i>
<span>Translate</span>
</button>
<div id="languageDropdown" class="absolute right-0 mt-2 w-48 bg-gray-800 rounded-md shadow-lg z-10 hidden">
<div class="p-2">
<h4 class="text-xs text-gray-400 px-2 py-1">Select Language</h4>
<div class="language-option px-3 py-2 text-sm cursor-pointer rounded" data-lang="es">Spanish</div>
<div class="language-option px-3 py-2 text-sm cursor-pointer rounded" data-lang="fr">French</div>
<div class="language-option px-3 py-2 text-sm cursor-pointer rounded" data-lang="de">German</div>
<div class="language-option px-3 py-2 text-sm cursor-pointer rounded" data-lang="it">Italian</div>
<div class="language-option px-3 py-2 text-sm cursor-pointer rounded" data-lang="ja">Japanese</div>
</div>
</div>
</div>
</div>
<div class="lyrics-container h-96 overflow-y-auto p-4 rounded-lg bg-black bg-opacity-20">
<div id="originalLyrics" class="text-center space-y-4">
<div class="lyric-line" data-time="5.2">I been tryna call</div>
<div class="lyric-line" data-time="8.5">I been on my own for long enough</div>
<div class="lyric-line" data-time="12.1">Maybe you can show me how to love, maybe</div>
<div class="lyric-line" data-time="16.8">I'm going through withdrawals</div>
<div class="lyric-line" data-time="20.3">You don't even have to do too much</div>
<div class="lyric-line" data-time="24.0">You can turn me on with just a touch, baby</div>
<div class="lyric-line" data-time="28.5">I look around and Sin City's cold and empty (Oh)</div>
<div class="lyric-line" data-time="33.2">No one's around to judge me (Oh)</div>
<div class="lyric-line" data-time="36.8">I can't see clearly when you're gone</div>
<div class="lyric-line" data-time="41.5">I said, ooh, I'm blinded by the lights</div>
<div class="lyric-line active pulse-animation" data-time="45.0">No, I can't sleep until I feel your touch</div>
<div class="lyric-line" data-time="49.7">I said, ooh, I'm drowning in the night</div>
<div class="lyric-line" data-time="53.2">Oh, when I'm like this, you're the one I trust</div>
</div>
<div id="translatedLyrics" class="text-center space-y-4 mt-8 hidden">
<div class="lyric-line" data-time="5.2">He estado intentando llamar</div>
<div class="lyric-line" data-time="8.5">He estado solo por suficiente tiempo</div>
<div class="lyric-line" data-time="12.1">Quizás puedas mostrarme cómo amar, quizás</div>
<div class="lyric-line" data-time="16.8">Estoy pasando por la abstinencia</div>
<div class="lyric-line" data-time="20.3">Ni siquiera tienes que hacer mucho</div>
<div class="lyric-line" data-time="24.0">Puedes excitarme con solo un toque, cariño</div>
<div class="lyric-line" data-time="28.5">Miro alrededor y Sin City está fría y vacía (Oh)</div>
<div class="lyric-line" data-time="33.2">No hay nadie alrededor para juzgarme (Oh)</div>
<div class="lyric-line" data-time="36.8">No puedo ver claramente cuando te has ido</div>
<div class="lyric-line" data-time="41.5">Dije, ooh, estoy cegado por las luces</div>
<div class="lyric-line" data-time="45.0">No, no puedo dormir hasta sentir tu toque</div>
<div class="lyric-line" data-time="49.7">Dije, ooh, me estoy ahogando en la noche</div>
<div class="lyric-line" data-time="53.2">Oh, cuando estoy así, eres en quien confío</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Player Bar (Fixed at bottom) -->
<div class="h-20 bg-gray-900 border-t border-gray-800 flex items-center px-4">
<div class="flex items-center w-1/4">
<div class="w-14 h-14 bg-gray-800 rounded mr-3 overflow-hidden">
<img src="https://i.scdn.co/image/ab67616d00001e02ff9ca10b55ce82ae553c8228" class="w-full h-full object-cover">
</div>
<div>
<h4 class="font-medium">Blinding Lights</h4>
<p class="text-xs text-gray-400">The Weeknd</p>
</div>
<button class="ml-4 text-gray-400 hover:text-white">
<i class="far fa-heart"></i>
</button>
</div>
<div class="flex-1 flex flex-col items-center">
<div class="flex space-x-4 mb-2">
<button class="text-gray-400 hover:text-white">
<i class="fas fa-random"></i>
</button>
<button class="text-gray-400 hover:text-white">
<i class="fas fa-step-backward"></i>
</button>
<button class="w-8 h-8 rounded-full bg-white flex items-center justify-center hover:scale-105">
<i class="fas fa-pause text-black"></i>
</button>
<button class="text-gray-400 hover:text-white">
<i class="fas fa-step-forward"></i>
</button>
<button class="text-gray-400 hover:text-white">
<i class="fas fa-redo"></i>
</button>
</div>
<div class="w-full flex items-center">
<span class="text-xs text-gray-400 mr-2">2:15</span>
<div class="progress-bar flex-1">
<div class="progress-fill" style="width: 35%"></div>
</div>
<span class="text-xs text-gray-400 ml-2">3:20</span>
</div>
</div>
<div class="w-1/4 flex justify-end items-center space-x-3">
<button class="text-gray-400 hover:text-white">
<i class="fas fa-list"></i>
</button>
<button class="text-gray-400 hover:text-white">
<i class="fas fa-laptop"></i>
</button>
<div class="flex items-center">
<i class="fas fa-volume-down text-gray-400 mr-2"></i>
<input type="range" min="0" max="100" value="70" class="volume-slider w-24">
</div>
</div>
</div>
<script>
// Simulate Spotify login
document.getElementById('loginBtn').addEventListener('click', function() {
this.innerHTML = '<i class="fab fa-spotify mr-2"></i> Connected';
this.classList.remove('bg-green-500', 'hover:bg-green-600');
this.classList.add('bg-gray-700', 'hover:bg-gray-600');
// Show success notification
const notification = document.createElement('div');
notification.className = 'fixed bottom-24 right-6 bg-green-500 text-white px-4 py-2 rounded-lg shadow-lg flex items-center';
notification.innerHTML = '<i class="fas fa-check-circle mr-2"></i> Successfully connected to Spotify';
document.body.appendChild(notification);
setTimeout(() => {
notification.remove();
}, 3000);
});
// Play/Pause button functionality
const playBtn = document.getElementById('playBtn');
let isPlaying = false;
playBtn.addEventListener('click', function() {
isPlaying = !isPlaying;
if (isPlaying) {
this.innerHTML = '<i class="fas fa-pause"></i>';
this.classList.add('pulse-animation');
startLyricsSync();
} else {
this.innerHTML = '<i class="fas fa-play"></i>';
this.classList.remove('pulse-animation');
stopLyricsSync();
}
});
// Lyrics synchronization
let lyricsInterval;
let currentTime = 135; // 2:15 in seconds
const duration = 200; // 3:20 in seconds
function startLyricsSync() {
const progressFill = document.getElementById('progressFill');
const currentTimeEl = document.getElementById('currentTime');
lyricsInterval = setInterval(() => {
currentTime += 1;
// Update progress bar
const progressPercent = (currentTime / duration) * 100;
progressFill.style.width = `${progressPercent}%`;
// Update time display
const minutes = Math.floor(currentTime / 60);
const seconds = Math.floor(currentTime % 60).toString().padStart(2, '0');
currentTimeEl.textContent = `${minutes}:${seconds}`;
// Highlight current lyric line
highlightCurrentLyric(currentTime);
}, 1000);
}
function stopLyricsSync() {
clearInterval(lyricsInterval);
}
function highlightCurrentLyric(currentTime) {
const lyricLines = document.querySelectorAll('.lyric-line');
let activeLineFound = false;
lyricLines.forEach(line => {
line.classList.remove('active', 'pulse-animation');
const lineTime = parseFloat(line.getAttribute('data-time'));
if (!activeLineFound && currentTime >= lineTime) {
line.classList.add('active');
// Only add pulse animation to the most recent line
if (currentTime - lineTime < 2) {
line.classList.add('pulse-animation');
}
// Scroll to the active line
if (currentTime - lineTime < 1) {
line.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
}
if (currentTime < lineTime) {
activeLineFound = true;
}
});
}
// Translation functionality
const translateBtn = document.getElementById('translateBtn');
const languageDropdown = document.getElementById('languageDropdown');
const originalLyrics = document.getElementById('originalLyrics');
const translatedLyrics = document.getElementById('translatedLyrics');
translateBtn.addEventListener('click', function() {
languageDropdown.classList.toggle('hidden');
});
document.querySelectorAll('.language-option').forEach(option => {
option.addEventListener('click', function() {
const lang = this.getAttribute('data-lang');
// Change button text
translateBtn.innerHTML = `<i class="fas fa-language"></i> ${this.textContent}`;
// Show loading state
translatedLyrics.innerHTML = '<div class="text-center py-10"><i class="fas fa-spinner fa-spin text-2xl text-green-500"></i><p class="mt-2 text-gray-400">Translating lyrics...</p></div>';
translatedLyrics.classList.remove('hidden');
// Simulate API call delay
setTimeout(() => {
// Show translated lyrics (in a real app, this would come from an API)
translatedLyrics.innerHTML = `
<div class="lyric-line" data-time="5.2">He estado intentando llamar</div>
<div class="lyric-line" data-time="8.5">He estado solo por suficiente tiempo</div>
<div class="lyric-line" data-time="12.1">Quizás puedas mostrarme cómo amar, quizás</div>
<div class="lyric-line" data-time="16.8">Estoy pasando por la abstinencia</div>
<div class="lyric-line" data-time="20.3">Ni siquiera tienes que hacer mucho</div>
<div class="lyric-line" data-time="24.0">Puedes excitarme con solo un toque, cariño</div>
<div class="lyric-line" data-time="28.5">Miro alrededor y Sin City está fría y vacía (Oh)</div>
<div class="lyric-line" data-time="33.2">No hay nadie alrededor para juzgarme (Oh)</div>
<div class="lyric-line" data-time="36.8">No puedo ver claramente cuando te has ido</div>
<div class="lyric-line" data-time="41.5">Dije, ooh, estoy cegado por las luces</div>
<div class="lyric-line" data-time="45.0">No, no puedo dormir hasta sentir tu toque</div>
<div class="lyric-line" data-time="49.7">Dije, ooh, me estoy ahogando en la noche</div>
<div class="lyric-line" data-time="53.2">Oh, cuando estoy así, eres en quien confío</div>
`;
// Hide dropdown
languageDropdown.classList.add('hidden');
// If currently playing, sync the translated lyrics too
if (isPlaying) {
highlightCurrentLyric(currentTime);
}
}, 1500);
});
});
// Close dropdown when clicking outside
document.addEventListener('click', function(event) {
if (!translateBtn.contains(event.target) && !languageDropdown.contains(event.target)) {
languageDropdown.classList.add('hidden');
}
});
// Initialize with first lyric highlighted
highlightCurrentLyric(currentTime);
</script>
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=steake/spotify-lyrics-translate" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>