6.3 KiB
6.3 KiB
🔧 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()utilisaitsubprocess.run()qui bloquait jusqu'à la fin du processus Whisper - Impossible d'interrompre le traitement en cours
- Aucune vérification de la variable
auto_subtitle_runningpendant le traitement
🔍 Cause Racine
# 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_runningpendant l'exécution de Whisper
✅ Solution Implémentée
🔧 Améliorations Principales
1. Utilisation de subprocess.Popen()
# 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_runningtoutes 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
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é
@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
<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
python test_subtitle_stop.py
Tests Inclus
- ✅ Vérification du statut initial
- ✅ Démarrage de la génération automatique
- ✅ Vérification du démarrage
- ✅ Arrêt pendant le traitement
- ✅ Vérification de l'arrêt
- ✅ Test de l'arrêt forcé
- ✅ 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
- Cliquer sur le toggle "Génération Auto Sous-titres"
- Attendre la confirmation d'arrêt
- Vérifier le statut affiché
Arrêt Forcé
- Cliquer sur "Force Stop"
- Confirmer l'action
- Vérifier que le traitement s'arrête immédiatement
Débogage
- Ouvrir la console du navigateur
- Vérifier les logs de débogage
- Utiliser le script de test
📝 Code Modifié
Fonction auto_subtitle_loop()
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()
@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 ! 🚀