Spaces:
Sleeping
Sleeping
File size: 8,106 Bytes
5e23602 533d37b 5e23602 04969c3 5e23602 533d37b 0985ce8 533d37b 0985ce8 533d37b 0985ce8 5e23602 533d37b 0985ce8 5e23602 533d37b 5e23602 533d37b 0985ce8 533d37b 0985ce8 533d37b 5e23602 0985ce8 533d37b 0985ce8 533d37b 0985ce8 5e23602 533d37b 0985ce8 04969c3 5e23602 0985ce8 5e23602 0985ce8 04969c3 0985ce8 04969c3 0985ce8 5e23602 0985ce8 04969c3 533d37b 0985ce8 04969c3 0985ce8 04969c3 0985ce8 04969c3 5e23602 0985ce8 533d37b 0985ce8 533d37b 0985ce8 04969c3 533d37b 5e23602 533d37b 5e23602 0985ce8 533d37b 0985ce8 5e23602 0985ce8 5e23602 |
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 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
document.addEventListener('DOMContentLoaded', () => {
console.log("DOM entièrement chargé et analysé. Initialisation du script.");
const uploadForm = document.getElementById('upload-form');
const imageFilesInput = document.getElementById('image-files');
const messageArea = document.getElementById('message-area');
const progressContainer = document.getElementById('progress-container');
const progressBarFill = document.getElementById('progress-bar');
const progressTextElement = document.getElementById('progress-text');
if (!uploadForm || !imageFilesInput || !messageArea || !progressContainer || !progressBarFill || !progressTextElement) {
const errorMsg = "Un ou plusieurs éléments d'interface utilisateur sont manquants. L'application ne peut pas fonctionner correctement. Veuillez vérifier les IDs dans les fichiers HTML et JS.";
console.error(errorMsg);
if (messageArea) {
messageArea.textContent = errorMsg;
messageArea.className = 'error';
}
alert(errorMsg);
return;
}
console.log("Tous les éléments DOM principaux ont été trouvés.");
let progressInterval = null; // Pour l'animation de la barre
uploadForm.addEventListener('submit', async (event) => {
console.log("Événement 'submit' du formulaire capturé.");
event.preventDefault();
console.log("event.preventDefault() a été appelé.");
// Nettoyer l'intervalle précédent s'il existe
if (progressInterval) {
clearInterval(progressInterval);
progressInterval = null;
}
try {
messageArea.textContent = '';
messageArea.className = '';
const files = imageFilesInput.files;
const numFiles = files.length;
console.log(`Nombre de fichiers sélectionnés : ${numFiles}`);
if (numFiles === 0) {
messageArea.textContent = 'Veuillez sélectionner au moins une image.';
messageArea.classList.add('error');
console.warn("Aucun fichier sélectionné, soumission annulée.");
return;
}
console.log("Configuration de la barre de progression...");
progressTextElement.textContent = `Préparation de ${numFiles} image(s)...`;
progressBarFill.style.width = '0%'; // Réinitialiser
progressBarFill.classList.remove('processing-animation'); // Assurer que l'ancienne classe d'animation est retirée
progressBarFill.classList.remove('determinate');
progressBarFill.textContent = '';
progressContainer.style.display = 'block';
// Démarrer une progression visuelle (même si elle n'est pas parfaitement synchronisée)
let currentProgress = 0;
progressBarFill.style.width = '5%'; // Départ initial
progressTextElement.textContent = `Traitement de ${numFiles} image(s) en cours... (Étape 1/3 Préparation)`;
// Ajout de la classe pour une animation CSS douce vers 90%
// L'animation CSS se chargera d'aller vers la largeur cible
setTimeout(() => {
progressBarFill.classList.add('processing-animation');
progressBarFill.style.width = '20%'; // Déclencheur pour l'animation CSS qui pourrait aller plus loin
progressTextElement.textContent = `Traitement de ${numFiles} image(s) en cours... (Étape 2/3 Envoi et IA)`;
}, 100); // Petit délai pour que le 5% initial soit rendu
const formData = new FormData();
for (const file of files) {
formData.append('files', file);
}
console.log("FormData construit.");
console.log("Début de la requête fetch vers /api/upload-images/...");
const response = await fetch('/api/upload-images/', {
method: 'POST',
body: formData,
});
console.log(`Réponse reçue du serveur : ${response.status} ${response.statusText}`);
// Arrêter l'animation de progression "en cours" et préparer pour l'état final
progressBarFill.classList.remove('processing-animation'); // Retirer l'animation en cours
if (progressInterval) { // Au cas où un intervalle serait utilisé
clearInterval(progressInterval);
progressInterval = null;
}
if (response.ok) {
console.log("Réponse OK. Traitement du blob ZIP.");
progressTextElement.textContent = `Traitement de ${numFiles} image(s) terminé. Préparation du téléchargement... (Étape 3/3)`;
progressBarFill.style.width = '95%'; // Presque terminé
const blob = await response.blob();
const contentDisposition = response.headers.get('content-disposition');
let filename = "captions_output.zip";
if (contentDisposition) {
const filenameMatch = contentDisposition.match(/filename="?(.+)"?/i);
if (filenameMatch && filenameMatch.length === 2)
filename = filenameMatch[1].replace(/^"|"$/g, ''); // Enlever les guillemets
}
console.log(`Nom du fichier ZIP à télécharger : ${filename}`);
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(link.href);
console.log("Téléchargement du ZIP initié.");
messageArea.textContent = `${numFiles} image(s) traitée(s). Le fichier ZIP '${filename}' est en cours de téléchargement.`;
messageArea.classList.add('success');
progressBarFill.style.width = '100%';
progressBarFill.classList.add('determinate');
progressBarFill.textContent = 'Terminé !';
progressTextElement.textContent = "Opération terminée avec succès !";
console.log("Interface utilisateur mise à jour pour le succès.");
} else {
console.error(`Erreur HTTP : ${response.status} ${response.statusText}`);
let errorDetail = `Erreur ${response.status}.`;
try {
const errorResult = await response.json();
if (errorResult && errorResult.detail) {
errorDetail = errorResult.detail;
}
} catch (e) {
const errorText = await response.text().catch(() => "Impossible de lire le corps de l'erreur.");
errorDetail += ` ${errorText.substring(0, 300)}`;
}
messageArea.textContent = `Une erreur est survenue : ${errorDetail}`;
console.error(`Détail de l'erreur du serveur : ${errorDetail}`);
messageArea.classList.add('error');
if (progressContainer) progressContainer.style.display = 'none';
}
} catch (error) {
console.error('Erreur globale dans le gestionnaire de soumission :', error);
messageArea.textContent = 'Une erreur critique est survenue dans le script client. Vérifiez la console du navigateur.';
messageArea.classList.add('error');
if (progressContainer) progressContainer.style.display = 'none';
if (progressInterval) {
clearInterval(progressInterval);
progressInterval = null;
}
progressBarFill.classList.remove('processing-animation');
}
});
console.log("Gestionnaire d'événement 'submit' attaché.");
}); |