Files
twitchBot-intelligent/SUBTITLE_STOP_FIX.md
gpatruno 68cf59ae75 update
2025-09-06 17:26:38 +02:00

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() 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

# 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()

# 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

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

  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()

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 ! 🚀