|
document.addEventListener('DOMContentLoaded', () => { |
|
const dropArea = document.getElementById('drop-area'); |
|
const fileInput = document.getElementById('fileInput'); |
|
const options = document.getElementById('options'); |
|
const multiplicationFactor = document.getElementById('multiplicationFactor'); |
|
const factorValue = document.getElementById('factorValue'); |
|
const processButton = document.getElementById('processButton'); |
|
const result = document.getElementById('result'); |
|
const audioPlayer = document.getElementById('audioPlayer'); |
|
const downloadLink = document.getElementById('downloadLink'); |
|
|
|
let isDecrypting = false; |
|
let currentFile = null; |
|
|
|
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { |
|
dropArea.addEventListener(eventName, preventDefaults, false); |
|
}); |
|
|
|
function preventDefaults(e) { |
|
e.preventDefault(); |
|
e.stopPropagation(); |
|
} |
|
|
|
['dragenter', 'dragover'].forEach(eventName => { |
|
dropArea.addEventListener(eventName, highlight, false); |
|
}); |
|
|
|
['dragleave', 'drop'].forEach(eventName => { |
|
dropArea.addEventListener(eventName, unhighlight, false); |
|
}); |
|
|
|
function highlight() { |
|
dropArea.classList.add('highlight'); |
|
} |
|
|
|
function unhighlight() { |
|
dropArea.classList.remove('highlight'); |
|
} |
|
|
|
dropArea.addEventListener('drop', handleDrop, false); |
|
|
|
function handleDrop(e) { |
|
const dt = e.dataTransfer; |
|
const files = dt.files; |
|
handleFiles(files); |
|
} |
|
|
|
fileInput.addEventListener('change', function() { |
|
handleFiles(this.files); |
|
}); |
|
|
|
function handleFiles(files) { |
|
if (files.length > 0) { |
|
currentFile = files[0]; |
|
isDecrypting = currentFile.type === 'audio/mpeg'; |
|
options.style.display = 'block'; |
|
processButton.textContent = isDecrypting ? 'Decrypt' : 'Encrypt'; |
|
dropArea.textContent = `File selected: ${currentFile.name}`; |
|
} |
|
} |
|
|
|
processButton.addEventListener('click', function() { |
|
if (!currentFile) { |
|
alert('Please select a file first.'); |
|
return; |
|
} |
|
|
|
const formData = new FormData(); |
|
formData.append('file', currentFile); |
|
formData.append('factor', multiplicationFactor.value); |
|
|
|
fetch('/process', { |
|
method: 'POST', |
|
body: formData |
|
}) |
|
.then(response => { |
|
if (!response.ok) { |
|
return response.json().then(err => { throw new Error(err.error || 'Unknown error occurred') }); |
|
} |
|
return response.blob(); |
|
}) |
|
.then(blob => { |
|
if (blob.size === 0) { |
|
throw new Error('Received empty file from server'); |
|
} |
|
const url = URL.createObjectURL(blob); |
|
result.style.display = 'block'; |
|
if (isDecrypting) { |
|
audioPlayer.style.display = 'none'; |
|
downloadLink.textContent = 'Download Decrypted File'; |
|
} else { |
|
audioPlayer.style.display = 'block'; |
|
audioPlayer.src = url; |
|
downloadLink.textContent = 'Download Encrypted MP3'; |
|
} |
|
downloadLink.href = url; |
|
downloadLink.download = isDecrypting ? 'decrypted_file' : 'encrypted.mp3'; |
|
console.log('File processed successfully. Size:', blob.size, 'bytes'); |
|
}) |
|
.catch(error => { |
|
console.error('Error:', error); |
|
alert('An error occurred while processing the file: ' + error.message); |
|
}); |
|
}); |
|
}); |