| const uploadZone = document.getElementById('uploadZone'); |
| const fileInput = document.getElementById('fileInput'); |
| const chooseBtn = document.getElementById('chooseBtn'); |
| const fileCard = document.getElementById('fileCard'); |
| const fileName = document.getElementById('fileName'); |
| const fileDuration = document.getElementById('fileDuration'); |
| const deleteBtn = document.getElementById('deleteBtn'); |
| const attenSlider = document.getElementById('attenSlider'); |
| const attenValue = document.getElementById('attenValue'); |
| const uploadBtn = document.getElementById('uploadBtn'); |
| const status = document.getElementById('status'); |
| const emptyState = document.getElementById('emptyState'); |
| const playerSection = document.getElementById('playerSection'); |
| const toggleEnhanced = document.getElementById('toggleEnhanced'); |
| const audioPlayer = document.getElementById('audioPlayer'); |
| const videoPlayer = document.getElementById('videoPlayer'); |
| const downloadLink = document.getElementById('downloadLink'); |
|
|
| const attenSteps = [null, 80, 40, 20, 10, 5]; |
| const attenLabels = ['Off', 'High', 'Medium', 'Low', 'Minimal', 'Barely']; |
|
|
| let originalSrc = null; |
| let enhancedSrc = null; |
| let isVideo = false; |
| let selectedFile = null; |
|
|
| |
| chooseBtn.addEventListener('click', () => fileInput.click()); |
| uploadZone.addEventListener('click', (e) => { if (e.target !== chooseBtn) fileInput.click(); }); |
|
|
| uploadZone.addEventListener('dragover', (e) => { e.preventDefault(); uploadZone.classList.add('dragover'); }); |
| uploadZone.addEventListener('dragleave', () => uploadZone.classList.remove('dragover')); |
| uploadZone.addEventListener('drop', (e) => { |
| e.preventDefault(); |
| uploadZone.classList.remove('dragover'); |
| const file = e.dataTransfer.files[0]; |
| if (file) handleFile(file); |
| }); |
|
|
| fileInput.addEventListener('change', () => { |
| if (fileInput.files[0]) handleFile(fileInput.files[0]); |
| }); |
|
|
| function handleFile(file) { |
| selectedFile = file; |
| fileName.textContent = file.name; |
| fileDuration.textContent = ''; |
| fileCard.hidden = false; |
| uploadBtn.hidden = false; |
| status.textContent = ''; |
| status.className = ''; |
|
|
| |
| const url = URL.createObjectURL(file); |
| const media = file.type.startsWith('video') ? document.createElement('video') : document.createElement('audio'); |
| media.src = url; |
| media.addEventListener('loadedmetadata', () => { |
| const mins = Math.floor(media.duration / 60); |
| const secs = Math.floor(media.duration % 60).toString().padStart(2, '0'); |
| fileDuration.textContent = `${mins}:${secs}`; |
| URL.revokeObjectURL(url); |
| }); |
| } |
|
|
| deleteBtn.addEventListener('click', () => { |
| fileInput.value = ''; |
| selectedFile = null; |
| fileCard.hidden = true; |
| uploadBtn.hidden = true; |
| playerSection.hidden = true; |
| emptyState.hidden = false; |
| status.textContent = ''; |
| }); |
|
|
| |
| attenSlider.addEventListener('input', () => { |
| attenValue.textContent = attenLabels[attenSlider.value]; |
| }); |
|
|
| |
| uploadBtn.addEventListener('click', async () => { |
| const file = selectedFile || fileInput.files[0]; |
| if (!file) return; |
|
|
| uploadBtn.disabled = true; |
| playerSection.hidden = true; |
| emptyState.hidden = false; |
| status.className = ''; |
| status.textContent = 'Processing... this may take a few minutes.'; |
|
|
| try { |
| const formData = new FormData(); |
| formData.append('file', file); |
| const attenDb = attenSteps[attenSlider.value]; |
| if (attenDb !== null) formData.append('atten_lim_db', attenDb); |
|
|
| const response = await fetch('/upload', { method: 'POST', body: formData }); |
| if (!response.ok) throw new Error(`Server error: ${response.status}`); |
|
|
| const data = await response.json(); |
| isVideo = data.file_type === 'video'; |
|
|
| originalSrc = URL.createObjectURL(file); |
| enhancedSrc = data.download_url; |
|
|
| |
| if (isVideo) { |
| videoPlayer.hidden = false; |
| audioPlayer.hidden = true; |
| videoPlayer.src = originalSrc; |
| } else { |
| audioPlayer.hidden = false; |
| videoPlayer.hidden = true; |
| audioPlayer.src = originalSrc; |
| } |
|
|
| toggleEnhanced.checked = false; |
| downloadLink.href = enhancedSrc; |
| downloadLink.download = isVideo ? 'enhanced.mp4' : 'enhanced.wav'; |
|
|
| emptyState.hidden = true; |
| playerSection.hidden = false; |
| status.textContent = 'Done!'; |
| status.className = 'success'; |
|
|
| } catch (err) { |
| status.textContent = `Something went wrong: ${err.message}`; |
| status.className = 'error'; |
| } finally { |
| uploadBtn.disabled = false; |
| } |
| }); |
|
|
| |
| toggleEnhanced.addEventListener('change', () => { |
| const src = toggleEnhanced.checked ? enhancedSrc : originalSrc; |
| const player = isVideo ? videoPlayer : audioPlayer; |
| const wasPlaying = !player.paused; |
| const currentTime = player.currentTime; |
| player.src = src; |
| player.currentTime = currentTime; |
| if (wasPlaying) player.play(); |
| }); |
|
|