|
|
<!DOCTYPE html> |
|
|
<html lang="en"> |
|
|
<head> |
|
|
<meta charset="UTF-8"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
|
<title>Splitter AI - Vocal Remover and Music Source Separator</title> |
|
|
<link rel="icon" type="image/x-icon" href="/static/favicon.ico"> |
|
|
<script src="https://cdn.tailwindcss.com"></script> |
|
|
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet"> |
|
|
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script> |
|
|
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script> |
|
|
<script src="https://unpkg.com/feather-icons"></script> |
|
|
<style> |
|
|
.gradient-bg { |
|
|
background: linear-gradient(135deg, #6e8efb 0%, #4a6cf7 100%); |
|
|
} |
|
|
.file-uploader { |
|
|
border: 2px dashed #ccc; |
|
|
transition: all 0.3s ease; |
|
|
} |
|
|
.file-uploader:hover { |
|
|
border-color: #4a6cf7; |
|
|
background: rgba(74, 108, 247, 0.05); |
|
|
} |
|
|
.waveform { |
|
|
height: 100px; |
|
|
background: linear-gradient(90deg, #4a6cf7 50%, transparent 50%); |
|
|
background-size: 8px 100%; |
|
|
} |
|
|
.play-btn { |
|
|
transition: all 0.2s ease; |
|
|
} |
|
|
.play-btn:hover { |
|
|
transform: scale(1.1); |
|
|
} |
|
|
.tooltip:hover .tooltip-text { |
|
|
visibility: visible; |
|
|
opacity: 1; |
|
|
} |
|
|
</style> |
|
|
</head> |
|
|
<body class="font-sans bg-gray-50"> |
|
|
|
|
|
<nav class="gradient-bg text-white shadow-lg"> |
|
|
<div class="container mx-auto px-4 py-3 flex justify-between items-center"> |
|
|
<div class="flex items-center space-x-2"> |
|
|
<i data-feather="music" class="w-6 h-6"></i> |
|
|
<span class="text-xl font-bold hidden md:inline">Splitter AI</span> |
|
|
<span class="text-xl font-bold md:hidden">SAI</span> |
|
|
</div> |
|
|
<div class="flex space-x-4 md:space-x-6"> |
|
|
<a href="/" class="hover:text-gray-200 font-medium">Home</a> |
|
|
<a href="/help.html" class="hover:text-gray-200">Help</a> |
|
|
<a href="/about.html" class="hover:text-gray-200">About</a> |
|
|
</div> |
|
|
</div> |
|
|
</nav> |
|
|
|
|
|
|
|
|
<section class="gradient-bg text-white py-16"> |
|
|
<div class="container mx-auto px-4 text-center" data-aos="fade-up"> |
|
|
<h1 class="text-3xl md:text-5xl font-bold mb-4">Splitter AI - Vocal Remover</h1> |
|
|
<p class="text-xl md:text-2xl mb-8 max-w-3xl mx-auto"> |
|
|
Extract vocals, instrumental, drums, bass, piano and more from any song |
|
|
</p> |
|
|
<div class="flex justify-center space-x-4"> |
|
|
<button class="bg-white text-blue-600 px-6 py-3 rounded-full font-bold hover:bg-gray-100 transition"> |
|
|
Try for Free |
|
|
</button> |
|
|
<button class="border-2 border-white px-6 py-3 rounded-full font-bold hover:bg-white hover:text-blue-600 transition"> |
|
|
Learn More |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
|
|
|
<section class="py-12"> |
|
|
<div class="container mx-auto px-4"> |
|
|
<div class="max-w-4xl mx-auto bg-white rounded-xl shadow-lg overflow-hidden" data-aos="fade-up"> |
|
|
<div class="p-6 md:p-8"> |
|
|
<h2 class="text-2xl font-bold text-gray-800 mb-6">Upload Your Audio File</h2> |
|
|
|
|
|
|
|
|
<div class="file-uploader rounded-lg p-8 text-center mb-8 cursor-pointer"> |
|
|
<i data-feather="upload" class="w-12 h-12 mx-auto text-gray-400 mb-4"></i> |
|
|
<p class="text-gray-500 mb-2">Drag & drop your audio file here or click to browse</p> |
|
|
<p class="text-sm text-gray-400">Supports MP3, WAV, FLAC, OGG, AAC (Max 100MB)</p> |
|
|
<input type="file" class="hidden" accept="audio/*" id="fileInput"> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="mb-8"> |
|
|
<h3 class="font-bold text-gray-700 mb-4">Processing Options</h3> |
|
|
<div class="grid grid-cols-2 md:grid-cols-4 gap-4" id="processingOptions"> |
|
|
<button class="option-btn border rounded-lg p-3 flex flex-col items-center hover:bg-gray-50 transition" data-mode="vocals"> |
|
|
<i data-feather="mic-off" class="w-6 h-6 text-blue-500 mb-2"></i> |
|
|
<span>Vocals Only</span> |
|
|
</button> |
|
|
<button class="option-btn border rounded-lg p-3 flex flex-col items-center hover:bg-gray-50 transition" data-mode="instrumental"> |
|
|
<i data-feather="mic" class="w-6 h-6 text-blue-500 mb-2"></i> |
|
|
<span>Instrumental</span> |
|
|
</button> |
|
|
<button class="option-btn border rounded-lg p-3 flex flex-col items-center hover:bg-gray-50 transition" data-mode="drums"> |
|
|
<i data-feather="drum" class="w-6 h-6 text-blue-500 mb-2"></i> |
|
|
<span>Drums</span> |
|
|
</button> |
|
|
<button class="option-btn border rounded-lg p-3 flex flex-col items-center hover:bg-gray-50 transition" data-mode="bass"> |
|
|
<i data-feather="music" class="w-6 h-6 text-blue-500 mb-2"></i> |
|
|
<span>Bass</span> |
|
|
</button> |
|
|
<button class="option-btn border rounded-lg p-3 flex flex-col items-center hover:bg-gray-50 transition" data-mode="piano"> |
|
|
<i data-feather="music" class="w-6 h-6 text-blue-500 mb-2"></i> |
|
|
<span>Piano</span> |
|
|
</button> |
|
|
<button class="option-btn border rounded-lg p-3 flex flex-col items-center hover:bg-gray-50 transition" data-mode="guitar"> |
|
|
<i data-feather="music" class="w-6 h-6 text-blue-500 mb-2"></i> |
|
|
<span>Guitar</span> |
|
|
</button> |
|
|
<button class="option-btn border rounded-lg p-3 flex flex-col items-center hover:bg-gray-50 transition" data-mode="other"> |
|
|
<i data-feather="music" class="w-6 h-6 text-blue-500 mb-2"></i> |
|
|
<span>Other</span> |
|
|
</button> |
|
|
<button class="option-btn border rounded-lg p-3 flex flex-col items-center hover:bg-gray-50 transition" data-mode="full"> |
|
|
<i data-feather="layers" class="w-6 h-6 text-blue-500 mb-2"></i> |
|
|
<span>All Stems</span> |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="mb-8"> |
|
|
<div class="flex justify-between items-center mb-4"> |
|
|
<h3 class="font-bold text-gray-700">Advanced Settings</h3> |
|
|
<button class="text-blue-500 hover:text-blue-700 text-sm flex items-center"> |
|
|
<i data-feather="settings" class="w-4 h-4 mr-1"></i> |
|
|
Show Settings |
|
|
</button> |
|
|
</div> |
|
|
<div class="space-y-4 hidden"> |
|
|
<div class="flex flex-col"> |
|
|
<label class="text-sm text-gray-500 mb-1">Processing Quality</label> |
|
|
<select class="border rounded p-2 bg-gray-50"> |
|
|
<option>Standard (Fastest)</option> |
|
|
<option selected>High Quality</option> |
|
|
<option>Professional (Slowest)</option> |
|
|
</select> |
|
|
</div> |
|
|
<div class="flex flex-col"> |
|
|
<label class="text-sm text-gray-500 mb-1">Output Format</label> |
|
|
<select class="border rounded p-2 bg-gray-50"> |
|
|
<option selected>MP3</option> |
|
|
<option>WAV</option> |
|
|
<option>FLAC</option> |
|
|
</select> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<button id="processBtn" class="gradient-bg text-white w-full py-3 rounded-lg font-bold hover:opacity-90 transition flex justify-center items-center hovered-element"> |
|
|
<i data-feather="zap" class="w-5 h-5 mr-2"></i> |
|
|
Separate Now (Free) |
|
|
</button> |
|
|
<p class="text-center text-sm text-gray-500 mt-2">No registration required - process up to 10 minutes per file</p> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
|
|
|
<section class="py-12 bg-gray-100"> |
|
|
<div class="container mx-auto px-4"> |
|
|
<h2 class="text-3xl font-bold text-center mb-12" data-aos="fade-up">Powerful AI Audio Processing</h2> |
|
|
|
|
|
<div class="grid md:grid-cols-3 gap-8"> |
|
|
<div class="bg-white p-6 rounded-lg shadow-sm" data-aos="fade-up" data-aos-delay="100"> |
|
|
<div class="w-12 h-12 bg-blue-100 rounded-full flex items-center justify-center mb-4"> |
|
|
<i data-feather="cpu" class="w-6 h-6 text-blue-500"></i> |
|
|
</div> |
|
|
<h3 class="font-bold text-lg mb-2">AI-Powered Separation</h3> |
|
|
<p class="text-gray-600">Uses deep neural networks to precisely isolate different elements of your music tracks.</p> |
|
|
</div> |
|
|
|
|
|
<div class="bg-white p-6 rounded-lg shadow-sm" data-aos="fade-up" data-aos-delay="200"> |
|
|
<div class="w-12 h-12 bg-purple-100 rounded-full flex items-center justify-center mb-4"> |
|
|
<i data-feather="cloud" class="w-6 h-6 text-purple-500"></i> |
|
|
</div> |
|
|
<h3 class="font-bold text-lg mb-2">Cloud Processing</h3> |
|
|
<p class="text-gray-600">All processing happens in the cloud - no software to install. Works on any device.</p> |
|
|
</div> |
|
|
|
|
|
<div class="bg-white p-6 rounded-lg shadow-sm" data-aos="fade-up" data-aos-delay="300"> |
|
|
<div class="w-12 h-12 bg-green-100 rounded-full flex items-center justify-center mb-4"> |
|
|
<i data-feather="download" class="w-6 h-6 text-green-500"></i> |
|
|
</div> |
|
|
<h3 class="font-bold text-lg mb-2">High-Quality Output</h3> |
|
|
<p class="text-gray-600">Download separated stems in high quality formats suitable for professional use.</p> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
|
|
|
<section class="py-12 hidden" id="resultsSection"> |
|
|
<div class="container mx-auto px-4"> |
|
|
<h2 class="text-3xl font-bold text-center mb-12" data-aos="fade-up">How It Works</h2> |
|
|
|
|
|
<div class="max-w-4xl mx-auto bg-white rounded-xl shadow-md overflow-hidden" data-aos="fade-up"> |
|
|
<div class="md:flex"> |
|
|
<div class="p-6 md:p-8 flex-1"> |
|
|
<h3 class="font-bold text-xl mb-4">Vocal Separation Preview</h3> |
|
|
|
|
|
<div class="space-y-4"> |
|
|
|
|
|
<div> |
|
|
<div class="flex justify-between mb-1"> |
|
|
<span class="text-sm font-medium">Original Track</span> |
|
|
<span class="text-xs text-gray-500">2:45</span> |
|
|
</div> |
|
|
<div class="waveform rounded overflow-hidden relative"> |
|
|
<div class="absolute inset-0 flex items-center justify-center play-btn bg-blue-500 bg-opacity-10 text-blue-500 rounded-full w-12 h-12 hover:bg-opacity-20"> |
|
|
<i data-feather="play" class="w-5 h-5 ml-0.5"></i> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div> |
|
|
<div class="flex justify-between mb-1"> |
|
|
<span class="text-sm font-medium">Vocals Only</span> |
|
|
<span class="text-xs text-gray-500">2:45</span> |
|
|
</div> |
|
|
<div class="waveform rounded overflow-hidden relative" style="background: linear-gradient(90deg, #f472b6 50%, transparent 50%);"> |
|
|
<div class="absolute inset-0 flex items-center justify-center play-btn bg-pink-500 bg-opacity-10 text-pink-500 rounded-full w-12 h-12 hover:bg-opacity-20"> |
|
|
<i data-feather="play" class="w-5 h-5 ml-0.5"></i> |
|
|
</div> |
|
|
</div> |
|
|
<div class="mt-2 flex justify-end space-x-2"> |
|
|
<button class="text-xs border px-2 py-1 rounded hover:bg-gray-50 download-btn" data-type="vocals"> |
|
|
<i data-feather="download" class="w-3 h-3 inline mr-1"></i> |
|
|
Download MP3 |
|
|
</button> |
|
|
<button class="text-xs border px-2 py-1 rounded hover:bg-gray-50 download-btn" data-type="vocals" data-format="wav"> |
|
|
<i data-feather="download" class="w-3 h-3 inline mr-1"></i> |
|
|
Download WAV |
|
|
</button> |
|
|
<button class="text-xs bg-blue-500 text-white px-2 py-1 rounded hover:bg-blue-600"> |
|
|
<i data-feather="share-2" class="w-3 h-3 inline mr-1"></i> |
|
|
Share |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div> |
|
|
<div class="flex justify-between mb-1"> |
|
|
<span class="text-sm font-medium">Instrumental</span> |
|
|
<span class="text-xs text-gray-500">2:45</span> |
|
|
</div> |
|
|
<div class="waveform rounded overflow-hidden relative" style="background: linear-gradient(90deg, #10b981 50%, transparent 50%);"> |
|
|
<div class="absolute inset-0 flex items-center justify-center play-btn bg-green-500 bg-opacity-10 text-green-500 rounded-full w-12 h-12 hover:bg-opacity-20"> |
|
|
<i data-feather="play" class="w-5 h-5 ml-0.5"></i> |
|
|
</div> |
|
|
</div> |
|
|
<div class="mt-2 flex justify-end space-x-2"> |
|
|
<button class="text-xs border px-2 py-1 rounded hover:bg-gray-50"> |
|
|
<i data-feather="download" class="w-3 h-3 inline mr-1"></i> |
|
|
Download |
|
|
</button> |
|
|
<button class="text-xs bg-blue-500 text-white px-2 py-1 rounded hover:bg-blue-600"> |
|
|
<i data-feather="share-2" class="w-3 h-3 inline mr-1"></i> |
|
|
Share |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
|
|
|
<section class="py-12 bg-gray-100"> |
|
|
<div class="container mx-auto px-4 max-w-4xl"> |
|
|
<h2 class="text-3xl font-bold text-center mb-12" data-aos="fade-up">Frequently Asked Questions</h2> |
|
|
|
|
|
<div class="space-y-4" data-aos="fade-up"> |
|
|
<div class="bg-white p-4 rounded-lg shadow-sm"> |
|
|
<button class="w-full flex justify-between items-center font-bold"> |
|
|
<span>How do I upload my audio file?</span> |
|
|
<i data-feather="chevron-down" class="w-5 h-5"></i> |
|
|
</button> |
|
|
<div class="mt-2 text-gray-600 hidden"> |
|
|
<p>Simply drag and drop your audio file onto the upload area or click to browse your computer. We support MP3, WAV, FLAC, OGG and other common audio formats.</p> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div class="bg-white p-4 rounded-lg shadow-sm"> |
|
|
<button class="w-full flex justify-between items-center font-bold"> |
|
|
<span>Is there a file size limit?</span> |
|
|
<i data-feather="chevron-down" class="w-5 h-5"></i> |
|
|
</button> |
|
|
<div class="mt-2 text-gray-600 hidden"> |
|
|
<p>Yes, the maximum file size for free users is 50MB. For larger files, consider our premium plans for extended limits and faster processing.</p> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div class="bg-white p-4 rounded-lg shadow-sm"> |
|
|
<button class="w-full flex justify-between items-center font-bold"> |
|
|
<span>How long does processing take?</span> |
|
|
<i data-feather="chevron-down" class="w-5 h-5"></i> |
|
|
</button> |
|
|
<div class="mt-2 text-gray-600 hidden"> |
|
|
<p>Processing time depends on the length and quality of your audio file. Typically, a 3-minute song takes about 1-2 minutes to process at standard quality settings.</p> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div class="bg-white p-4 rounded-lg shadow-sm"> |
|
|
<button class="w-full flex justify-between items-center font-bold"> |
|
|
<span>Can I use this for commercial purposes?</span> |
|
|
<i data-feather="chevron-down" class="w-5 h-5"></i> |
|
|
</button> |
|
|
<div class="mt-2 text-gray-600 hidden"> |
|
|
<p>Yes, however you must ensure you have the rights to the original audio material you're processing. The separated stems inherit the same copyright status as the original track.</p> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
|
|
|
<footer class="bg-gray-800 text-white py-8"> |
|
|
<div class="container mx-auto px-4"> |
|
|
<div class="flex flex-col md:flex-row justify-between"> |
|
|
<div class="mb-6 md:mb-0"> |
|
|
<div class="flex items-center space-x-2 mb-4"> |
|
|
<i data-feather="music" class="w-6 h-6"></i> |
|
|
<span class="text-xl font-bold">Splitter AI</span> |
|
|
</div> |
|
|
<p class="text-gray-400 max-w-xs">AI-powered vocal remover and music stem separator for artists, DJs, and music enthusiasts.</p> |
|
|
</div> |
|
|
|
|
|
<div class="grid grid-cols-2 md:grid-cols-3 gap-8"> |
|
|
<div> |
|
|
<h4 class="font-bold text-lg mb-4">Product</h4> |
|
|
<ul class="space-y-2"> |
|
|
<li><a href="#" class="text-gray-400 hover:text-white">Features</a></li> |
|
|
<li><a href="#" class="text-gray-400 hover:text-white">Pricing</a></li> |
|
|
<li><a href="#" class="text-gray-400 hover:text-white">API</a></li> |
|
|
</ul> |
|
|
</div> |
|
|
|
|
|
<div> |
|
|
<h4 class="font-bold text-lg mb-4">Resources</h4> |
|
|
<ul class="space-y-2"> |
|
|
<li><a href="#" class="text-gray-400 hover:text-white">Documentation</a></li> |
|
|
<li><a href="#" class="text-gray-400 hover:text-white">Support</a></li> |
|
|
<li><a href="#" class="text-gray-400 hover:text-white">Blog</a></li> |
|
|
</ul> |
|
|
</div> |
|
|
|
|
|
<div> |
|
|
<h4 class="font-bold text-lg mb-4">Company</h4> |
|
|
<ul class="space-y-2"> |
|
|
<li><a href="#" class="text-gray-400 hover:text-white">About</a></li> |
|
|
<li><a href="#" class="text-gray-400 hover:text-white">Privacy</a></li> |
|
|
<li><a href="#" class="text-gray-400 hover:text-white">Terms</a></li> |
|
|
</ul> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div class="border-t border-gray-700 mt-8 pt-8 flex flex-col md:flex-row justify-between items-center"> |
|
|
<p class="text-gray-400 mb-4 md:mb-0">© 2023 Splitter AI. All rights reserved.</p> |
|
|
<div class="flex space-x-4"> |
|
|
<a href="#" class="text-gray-400 hover:text-white"><i data-feather="twitter" class="w-5 h-5"></i></a> |
|
|
<a href="#" class="text-gray-400 hover:text-white"><i data-feather="instagram" class="w-5 h-5"></i></a> |
|
|
<a href="#" class="text-gray-400 hover:text-white"><i data-feather="facebook" class="w-5 h-5"></i></a> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</footer> |
|
|
|
|
|
<script> |
|
|
|
|
|
AOS.init({ |
|
|
duration: 800, |
|
|
easing: 'ease-in-out', |
|
|
once: true |
|
|
}); |
|
|
|
|
|
|
|
|
feather.replace(); |
|
|
|
|
|
|
|
|
document.querySelectorAll('footer button').forEach(button => { |
|
|
button.addEventListener('click', () => { |
|
|
const answer = button.nextElementSibling; |
|
|
const icon = button.querySelector('i'); |
|
|
|
|
|
answer.classList.toggle('hidden'); |
|
|
|
|
|
if (!answer.classList.contains('hidden')) { |
|
|
icon.setAttribute('data-feather', 'chevron-up'); |
|
|
} else { |
|
|
icon.setAttribute('data-feather', 'chevron-down'); |
|
|
} |
|
|
feather.replace(); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
const fileUploader = document.querySelector('.file-uploader'); |
|
|
const fileInput = document.getElementById('fileInput'); |
|
|
let selectedMode = 'vocals'; |
|
|
let uploadedFile = null; |
|
|
|
|
|
|
|
|
document.querySelector('[data-mode="vocals"]').classList.add('border-blue-500', 'bg-blue-50'); |
|
|
|
|
|
fileUploader.addEventListener('click', () => fileInput.click()); |
|
|
|
|
|
fileInput.addEventListener('change', (e) => { |
|
|
if (e.target.files.length > 0) { |
|
|
uploadedFile = e.target.files[0]; |
|
|
|
|
|
const validTypes = ['audio/mpeg', 'audio/wav', 'audio/x-wav', 'audio/flac', 'audio/ogg', 'audio/aac']; |
|
|
if (!validTypes.includes(uploadedFile.type)) { |
|
|
alert('Please upload a valid audio file (MP3, WAV, FLAC, OGG, AAC)'); |
|
|
return; |
|
|
} |
|
|
|
|
|
if (uploadedFile.size > 100 * 1024 * 1024) { |
|
|
alert('File size exceeds 100MB limit'); |
|
|
return; |
|
|
} |
|
|
|
|
|
fileUploader.innerHTML = ` |
|
|
<i data-feather="check-circle" class="w-12 h-12 mx-auto text-green-500 mb-4"></i> |
|
|
<p class="text-gray-700 font-medium truncate max-w-xs mx-auto">${uploadedFile.name}</p> |
|
|
<p class="text-sm text-gray-400">${(uploadedFile.size / 1024 / 1024).toFixed(2)} MB</p> |
|
|
`; |
|
|
feather.replace(); |
|
|
|
|
|
|
|
|
document.getElementById('processingOptions').classList.remove('hidden'); |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
document.querySelectorAll('.option-btn').forEach(btn => { |
|
|
btn.addEventListener('click', () => { |
|
|
document.querySelectorAll('.option-btn').forEach(b => { |
|
|
b.classList.remove('border-blue-500', 'bg-blue-50'); |
|
|
b.classList.add('border-gray-200'); |
|
|
}); |
|
|
btn.classList.remove('border-gray-200'); |
|
|
btn.classList.add('border-blue-500', 'bg-blue-50'); |
|
|
selectedMode = btn.dataset.mode; |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
document.getElementById('processBtn').addEventListener('click', async () => { |
|
|
if (!uploadedFile) { |
|
|
alert('Please upload an audio file first.'); |
|
|
return; |
|
|
} |
|
|
if (!selectedMode) { |
|
|
alert('Please select a processing option.'); |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
const processBtn = document.getElementById('processBtn'); |
|
|
const originalText = processBtn.innerHTML; |
|
|
processBtn.innerHTML = '<i data-feather="loader" class="w-5 h-5 mr-2 animate-spin"></i>Processing...'; |
|
|
processBtn.disabled = true; |
|
|
feather.replace(); |
|
|
|
|
|
try { |
|
|
|
|
|
const formData = new FormData(); |
|
|
formData.append('audio', uploadedFile); |
|
|
formData.append('mode', selectedMode); |
|
|
|
|
|
|
|
|
document.getElementById('resultsSection').classList.remove('hidden'); |
|
|
document.querySelector('#resultsSection .waveform').innerHTML = |
|
|
'<div class="absolute inset-0 flex items-center justify-center">Processing audio...</div>'; |
|
|
|
|
|
|
|
|
const response = await fetch('/api/process', { |
|
|
method: 'POST', |
|
|
body: formData |
|
|
}); |
|
|
|
|
|
if (!response.ok) { |
|
|
throw new Error('Processing failed'); |
|
|
} |
|
|
|
|
|
const result = await response.json(); |
|
|
|
|
|
|
|
|
document.querySelectorAll('.waveform').forEach(wave => { |
|
|
wave.innerHTML = ''; |
|
|
wave.style.background = 'linear-gradient(90deg, #4a6cf7 50%, transparent 50%)'; |
|
|
}); |
|
|
|
|
|
|
|
|
document.querySelectorAll('.download-btn').forEach(btn => { |
|
|
btn.onclick = () => { |
|
|
const format = btn.dataset.format || 'mp3'; |
|
|
const type = btn.dataset.type || selectedMode; |
|
|
window.location.href = `/api/download?track=${type}&format=${format}&file=${result.id}`; |
|
|
}; |
|
|
}); |
|
|
|
|
|
|
|
|
alert(`Successfully separated ${selectedMode} track!`); |
|
|
|
|
|
} catch (error) { |
|
|
console.error('Error:', error); |
|
|
alert('Processing failed. Please try again later.'); |
|
|
} finally { |
|
|
|
|
|
processBtn.innerHTML = originalText; |
|
|
processBtn.disabled = false; |
|
|
feather.replace(); |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
fileUploader.addEventListener('dragover', (e) => { |
|
|
e.preventDefault(); |
|
|
fileUploader.classList.add('border-blue-500', 'bg-blue-50'); |
|
|
}); |
|
|
|
|
|
fileUploader.addEventListener('dragleave', () => { |
|
|
fileUploader.classList.remove('border-blue-500', 'bg-blue-50'); |
|
|
}); |
|
|
|
|
|
fileUploader.addEventListener('drop', (e) => { |
|
|
e.preventDefault(); |
|
|
fileUploader.classList.remove('border-blue-500', 'bg-blue-50'); |
|
|
|
|
|
if (e.dataTransfer.files.length) { |
|
|
const file = e.dataTransfer.files[0]; |
|
|
|
|
|
const validTypes = ['audio/mpeg', 'audio/wav', 'audio/x-wav', 'audio/flac', 'audio/ogg', 'audio/aac']; |
|
|
if (!validTypes.includes(file.type)) { |
|
|
alert('Please upload a valid audio file (MP3, WAV, FLAC, OGG, AAC)'); |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
const dataTransfer = new DataTransfer(); |
|
|
dataTransfer.items.add(file); |
|
|
fileInput.files = dataTransfer.files; |
|
|
|
|
|
const event = new Event('change'); |
|
|
fileInput.dispatchEvent(event); |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
document.querySelector('[aria-label="Show Settings"]').addEventListener('click', (e) => { |
|
|
const settings = e.target.closest('div').nextElementSibling; |
|
|
settings.classList.toggle('hidden'); |
|
|
|
|
|
const icon = e.target.querySelector('i') || e.target.closest('button').querySelector('i'); |
|
|
if (settings.classList.contains('hidden')) { |
|
|
icon.setAttribute('data-feather', 'settings'); |
|
|
e.target.querySelector('span').textContent = 'Show Settings'; |
|
|
} else { |
|
|
icon.setAttribute('data-feather', 'chevron-up'); |
|
|
e.target.querySelector('span').textContent = 'Hide Settings'; |
|
|
} |
|
|
feather.replace(); |
|
|
}); |
|
|
|
|
|
|
|
|
document.querySelectorAll('.play-btn').forEach(btn => { |
|
|
btn.addEventListener('click', (e) => { |
|
|
e.stopPropagation(); |
|
|
const isPlaying = btn.classList.contains('playing'); |
|
|
|
|
|
if (isPlaying) { |
|
|
btn.classList.remove('playing'); |
|
|
btn.innerHTML = '<i data-feather="play" class="w-5 h-5 ml-0.5"></i>'; |
|
|
} else { |
|
|
btn.classList.add('playing'); |
|
|
btn.innerHTML = '<i data-feather="pause" class="w-5 h-5"></i>'; |
|
|
} |
|
|
feather.replace(); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
document.querySelectorAll('button:has(i[data-feather="download"])').forEach(btn => { |
|
|
btn.addEventListener('click', () => { |
|
|
alert('Download functionality would be implemented here'); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
document.querySelectorAll('button:has(i[data-feather="share-2"])').forEach(btn => { |
|
|
btn.addEventListener('click', () => { |
|
|
alert('Share functionality would be implemented here'); |
|
|
}); |
|
|
}); |
|
|
</script> |
|
|
</body> |
|
|
</html> |
|
|
|