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();
});