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é.");
});