Spaces:
Sleeping
Sleeping
File size: 4,979 Bytes
ebe2347 0f623ae ebe2347 0f623ae ebe2347 0f623ae ebe2347 0f623ae ebe2347 0f623ae ebe2347 0f623ae ebe2347 0f623ae ebe2347 0f623ae ebe2347 0f623ae ebe2347 0f623ae ebe2347 0f623ae ebe2347 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | 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;
// --- File picking ---
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 = '';
// Get duration via a temp media element
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 = '';
});
// --- Slider ---
attenSlider.addEventListener('input', () => {
attenValue.textContent = attenLabels[attenSlider.value];
});
// --- Upload & process ---
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;
// Set up players
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;
}
});
// --- Toggle between original and enhanced ---
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();
});
|