Spaces:
Running
Running
const API_BASE_URL = 'http://127.0.0.1:5000/api'; | |
// Tab functionality | |
function openTab(evt, tabName) { | |
const tabcontent = document.getElementsByClassName("tab-content"); | |
const tabbuttons = document.getElementsByClassName("tab-button"); | |
for (let i = 0; i < tabcontent.length; i++) { | |
tabcontent[i].classList.remove("active"); | |
} | |
for (let i = 0; i < tabbuttons.length; i++) { | |
tabbuttons[i].classList.remove("active"); | |
} | |
document.getElementById(tabName).classList.add("active"); | |
evt.currentTarget.classList.add("active"); | |
} | |
// File upload functionality | |
function setupFileUpload(type) { | |
const uploadArea = document.getElementById(`${type}-upload`); | |
const fileInput = document.getElementById(`${type}-input`); | |
const predictBtn = document.getElementById(`${type}-predict`); | |
uploadArea.addEventListener('click', () => fileInput.click()); | |
fileInput.addEventListener('change', (e) => { | |
const file = e.target.files[0]; | |
if (file) { | |
handleFileSelect(file, type); | |
} | |
}); | |
// Drag and drop | |
uploadArea.addEventListener('dragover', (e) => { | |
e.preventDefault(); | |
uploadArea.classList.add('dragover'); | |
}); | |
uploadArea.addEventListener('dragleave', () => { | |
uploadArea.classList.remove('dragover'); | |
}); | |
uploadArea.addEventListener('drop', (e) => { | |
e.preventDefault(); | |
uploadArea.classList.remove('dragover'); | |
const file = e.dataTransfer.files[0]; | |
if (file) { | |
const dt = new DataTransfer(); | |
dt.items.add(file); | |
fileInput.files = dt.files; | |
handleFileSelect(file, type); | |
} | |
}); | |
predictBtn.addEventListener('click', () => { | |
const file = fileInput.files[0]; | |
if (file) { | |
predictFile(file, type); | |
} | |
}); | |
} | |
function handleFileSelect(file, type) { | |
const uploadArea = document.getElementById(`${type}-upload`); | |
const predictBtn = document.getElementById(`${type}-predict`); | |
// Update UI to show file selected | |
uploadArea.innerHTML = ` | |
<div class="file-preview"> | |
<p><strong>Selected:</strong> ${file.name}</p> | |
<p class="file-types">Click "Analyze ${type.charAt(0).toUpperCase() + type.slice(1)}" to process</p> | |
</div> | |
`; | |
// Show preview for images | |
if (type === 'image' && file.type.startsWith('image/')) { | |
const reader = new FileReader(); | |
reader.onload = (e) => { | |
uploadArea.innerHTML += `<img src="${e.target.result}" alt="Preview">`; | |
}; | |
reader.readAsDataURL(file); | |
} | |
// Show preview for videos | |
if (type === 'video' && file.type.startsWith('video/')) { | |
const reader = new FileReader(); | |
reader.onload = (e) => { | |
uploadArea.innerHTML += `<video controls src="${e.target.result}"></video>`; | |
}; | |
reader.readAsDataURL(file); | |
} | |
predictBtn.disabled = false; | |
} | |
function predictFile(file, type) { | |
const loading = document.getElementById('loading'); | |
const resultDiv = document.getElementById(`${type}-result`); | |
loading.style.display = 'flex'; | |
resultDiv.className = 'result'; | |
resultDiv.textContent = ''; | |
const formData = new FormData(); | |
formData.append('file', file); | |
fetch(`${API_BASE_URL}/predict/${type}`, { | |
method: 'POST', | |
body: formData, | |
headers: { | |
'Accept': 'application/json', | |
} | |
}) | |
.then(response => { | |
if (!response.ok) { | |
throw new Error(`HTTP error! status: ${response.status}`); | |
} | |
return response.json(); | |
}) | |
.then(data => { | |
loading.style.display = 'none'; | |
if (data.status === 'success') { | |
resultDiv.className = 'result success'; | |
resultDiv.innerHTML = data.result.replace(/\n/g, '<br>'); | |
} else { | |
resultDiv.className = 'result error'; | |
resultDiv.textContent = `Error: ${data.error}`; | |
} | |
}) | |
.catch(error => { | |
loading.style.display = 'none'; | |
resultDiv.className = 'result error'; | |
resultDiv.textContent = `Error: ${error.message}`; | |
console.error('Error:', error); | |
}); | |
} | |
function loadExample(type, filename) { | |
const resultDiv = document.getElementById(`${type}-result`); | |
resultDiv.className = 'result'; | |
resultDiv.textContent = `Example: ${filename} - Upload a file to test this functionality`; | |
} | |
function resetUploadArea(type) { | |
const uploadArea = document.getElementById(`${type}-upload`); | |
const predictBtn = document.getElementById(`${type}-predict`); | |
const fileInput = document.getElementById(`${type}-input`); | |
const icons = { | |
'video': '📹', | |
'image': '🖼️', | |
'audio': '🎵' | |
}; | |
const fileTypes = { | |
'video': 'Supported: MP4, AVI, MOV', | |
'image': 'Supported: JPG, PNG, JPEG', | |
'audio': 'Supported: WAV, FLAC, MP3' | |
}; | |
uploadArea.innerHTML = ` | |
<div class="upload-placeholder"> | |
<i class="upload-icon">${icons[type]}</i> | |
<p>Click to upload ${type} or drag and drop</p> | |
<p class="file-types">${fileTypes[type]}</p> | |
</div> | |
`; | |
fileInput.value = ''; | |
predictBtn.disabled = true; | |
} | |
// Initialize when page loads | |
document.addEventListener('DOMContentLoaded', () => { | |
setupFileUpload('video'); | |
setupFileUpload('image'); | |
setupFileUpload('audio'); | |
}); |