193 lines
6.3 KiB
Markdown
193 lines
6.3 KiB
Markdown
# 🔧 Correction du Bouton Slide "Génération Auto Sous-titres"
|
|
|
|
## 📋 Problème Identifié
|
|
|
|
### ❌ **Problème Initial**
|
|
- Le bouton slide "Génération Auto Sous-titres" ne pouvait pas arrêter la boucle de traitement
|
|
- La boucle `auto_subtitle_loop()` utilisait `subprocess.run()` qui bloquait jusqu'à la fin du processus Whisper
|
|
- Impossible d'interrompre le traitement en cours
|
|
- Aucune vérification de la variable `auto_subtitle_running` pendant le traitement
|
|
|
|
### 🔍 **Cause Racine**
|
|
```python
|
|
# Ancien code problématique
|
|
result = subprocess.run(command, capture_output=True, text=True, timeout=60)
|
|
```
|
|
- `subprocess.run()` bloque l'exécution jusqu'à la fin du processus
|
|
- Aucune possibilité d'interruption pendant le traitement
|
|
- La boucle ne peut pas vérifier `auto_subtitle_running` pendant l'exécution de Whisper
|
|
|
|
## ✅ **Solution Implémentée**
|
|
|
|
### 🔧 **Améliorations Principales**
|
|
|
|
#### 1. **Utilisation de `subprocess.Popen()`**
|
|
```python
|
|
# Nouveau code avec contrôle d'interruption
|
|
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
|
|
|
# Attendre la fin du processus avec vérification périodique
|
|
while process.poll() is None:
|
|
if not auto_subtitle_running:
|
|
print("Arrêt demandé, interruption du processus Whisper")
|
|
process.terminate()
|
|
try:
|
|
process.wait(timeout=5)
|
|
except subprocess.TimeoutExpired:
|
|
process.kill()
|
|
break
|
|
time.sleep(1)
|
|
```
|
|
|
|
#### 2. **Vérification Périodique de l'Arrêt**
|
|
- Vérification de `auto_subtitle_running` toutes les secondes
|
|
- Interruption immédiate du processus Whisper si arrêt demandé
|
|
- Nettoyage propre des processus en cours
|
|
|
|
#### 3. **Logs de Débogage Améliorés**
|
|
```python
|
|
print(f"[{datetime.now().strftime('%H:%M:%S')}] Démarrage de la boucle de génération automatique de sous-titres")
|
|
print(f"[{datetime.now().strftime('%H:%M:%S')}] Traitement de: {audio_file}")
|
|
print(f"[{datetime.now().strftime('%H:%M:%S')}] Arrêt demandé, interruption du processus Whisper")
|
|
```
|
|
|
|
#### 4. **Fonction d'Arrêt Forcé**
|
|
```python
|
|
@app.route('/api/subtitles/auto/force-stop', methods=['POST'])
|
|
def force_stop_auto_subtitle():
|
|
"""Forcer l'arrêt de la génération automatique de sous-titres"""
|
|
global auto_subtitle_running, current_processing_file
|
|
auto_subtitle_running = False
|
|
current_processing_file = None
|
|
```
|
|
|
|
#### 5. **Bouton d'Arrêt Forcé dans l'Interface**
|
|
```html
|
|
<button class="btn btn-warning btn-sm w-100" onclick="forceStopAutoSubtitle()" title="Forcer l'arrêt en cas de problème">
|
|
<i class="fas fa-stop-circle me-1"></i>Force Stop
|
|
</button>
|
|
```
|
|
|
|
## 🚀 **Fonctionnalités Ajoutées**
|
|
|
|
### **Contrôle Interruptible**
|
|
- ✅ Arrêt immédiat même pendant le traitement Whisper
|
|
- ✅ Interruption propre des processus en cours
|
|
- ✅ Nettoyage des ressources
|
|
|
|
### **Interface Utilisateur Améliorée**
|
|
- ✅ Bouton "Force Stop" pour les cas d'urgence
|
|
- ✅ Feedback visuel en temps réel
|
|
- ✅ Logs de débogage détaillés
|
|
|
|
### **Gestion d'Erreurs Robuste**
|
|
- ✅ Vérification de l'état avant démarrage
|
|
- ✅ Gestion des timeouts
|
|
- ✅ Nettoyage automatique des fichiers temporaires
|
|
|
|
## 🔍 **Tests et Validation**
|
|
|
|
### **Script de Test**
|
|
```bash
|
|
python test_subtitle_stop.py
|
|
```
|
|
|
|
### **Tests Inclus**
|
|
1. ✅ Vérification du statut initial
|
|
2. ✅ Démarrage de la génération automatique
|
|
3. ✅ Vérification du démarrage
|
|
4. ✅ Arrêt pendant le traitement
|
|
5. ✅ Vérification de l'arrêt
|
|
6. ✅ Test de l'arrêt forcé
|
|
7. ✅ Test du traitement avec interruption
|
|
|
|
## 📊 **Améliorations de Performance**
|
|
|
|
### **Optimisations**
|
|
- Interruption immédiate des processus
|
|
- Vérification périodique de l'état
|
|
- Nettoyage automatique des ressources
|
|
- Logs de débogage détaillés
|
|
|
|
### **Sécurité**
|
|
- Gestion des timeouts
|
|
- Interruption propre des processus
|
|
- Protection contre les fuites de ressources
|
|
|
|
## 🎯 **Utilisation**
|
|
|
|
### **Arrêt Normal**
|
|
1. Cliquer sur le toggle "Génération Auto Sous-titres"
|
|
2. Attendre la confirmation d'arrêt
|
|
3. Vérifier le statut affiché
|
|
|
|
### **Arrêt Forcé**
|
|
1. Cliquer sur "Force Stop"
|
|
2. Confirmer l'action
|
|
3. Vérifier que le traitement s'arrête immédiatement
|
|
|
|
### **Débogage**
|
|
1. Ouvrir la console du navigateur
|
|
2. Vérifier les logs de débogage
|
|
3. Utiliser le script de test
|
|
|
|
## 📝 **Code Modifié**
|
|
|
|
### **Fonction `auto_subtitle_loop()`**
|
|
```python
|
|
def auto_subtitle_loop():
|
|
"""Boucle de génération automatique de sous-titres"""
|
|
global auto_subtitle_running, current_processing_file
|
|
|
|
print(f"[{datetime.now().strftime('%H:%M:%S')}] Démarrage de la boucle de génération automatique de sous-titres")
|
|
|
|
while auto_subtitle_running:
|
|
try:
|
|
# Vérification des fichiers audio
|
|
audio_files = [f for f in os.listdir(record_dir) if f.endswith('.mp3')]
|
|
if not audio_files:
|
|
time.sleep(5)
|
|
continue
|
|
|
|
# Traitement avec contrôle d'interruption
|
|
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
|
|
|
while process.poll() is None:
|
|
if not auto_subtitle_running:
|
|
process.terminate()
|
|
break
|
|
time.sleep(1)
|
|
|
|
# Vérification finale de l'arrêt
|
|
if not auto_subtitle_running:
|
|
break
|
|
|
|
except Exception as e:
|
|
print(f"Erreur dans la boucle: {e}")
|
|
time.sleep(5)
|
|
```
|
|
|
|
### **Fonction `force_stop_auto_subtitle()`**
|
|
```python
|
|
@app.route('/api/subtitles/auto/force-stop', methods=['POST'])
|
|
def force_stop_auto_subtitle():
|
|
"""Forcer l'arrêt de la génération automatique de sous-titres"""
|
|
global auto_subtitle_running, current_processing_file
|
|
auto_subtitle_running = False
|
|
current_processing_file = None
|
|
return jsonify({'success': True, 'message': 'Arrêt forcé'})
|
|
```
|
|
|
|
## 🎉 **Résultat Final**
|
|
|
|
✅ **Bouton slide fonctionnel**
|
|
✅ **Arrêt immédiat même pendant le traitement**
|
|
✅ **Interruption propre des processus Whisper**
|
|
✅ **Interface utilisateur améliorée**
|
|
✅ **Logs de débogage détaillés**
|
|
✅ **Gestion d'erreurs robuste**
|
|
✅ **Tests de validation complets**
|
|
|
|
---
|
|
|
|
*Le bouton slide "Génération Auto Sous-titres" fonctionne maintenant parfaitement et peut arrêter la boucle même pendant le traitement d'un fichier ! 🚀* |