#!/bin/bash

mkdir -p out

# --- Configuration du Failover ---
SOURCE_1="http://familyrestream.com:2095/Majid2022/WhatsApp2962myrestream/302559"
SOURCE_2="http://direct-local.com:8080/IPTVStreamNow4028/vHimB5DdOiPEILfTpr4h5QJY/23"

CURRENT_SOURCE="$SOURCE_1"

# Limites du "Disjoncteur"
FAIL_LIMIT=2       # 3 échecs
FAIL_WINDOW=30     # en 30 secondes

# Array pour stocker les timestamps (en secondes) des échecs
declare -a FAILURE_TIMESTAMPS=()
# -------------------------------

# Piège la sortie (Ctrl+C) pour quitter proprement
trap "echo 'Sortie demandée.'; exit 0;" SIGINT SIGTERM

while true; do
  echo "--- Lancement de FFmpeg ---"
  echo "Source actuelle: $CURRENT_SOURCE"

  # On lance ffmpeg avec la source actuelle
  ffmpeg -hide_banner -loglevel info -stats -stats_period 1 -nostdin \
  -xerror \
  -re -reconnect 1 -reconnect_streamed 1 -reconnect_at_eof 1 -reconnect_on_network_error 1 -reconnect_delay_max 5 -rw_timeout 15000000 -thread_queue_size 4096 \
  -user_agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36" \
  -i "$CURRENT_SOURCE" \
  -filter_complex "[0:v]scale=1280:720:flags=bicubic,fps=25,format=yuv420p,setpts=PTS-STARTPTS[vout];[0:a:0?]asetpts=PTS-STARTPTS,aresample=async=1:first_pts=0[aout]" \
  -map "[vout]" -map "[aout]" \
  -c:v libx264 -preset fast -b:v 3500k -maxrate 3500k -bufsize 7000k \
  -pix_fmt yuv420p -profile:v high -level 4.2 \
  -g 25 \
  -x264-params "keyint=25:min-keyint=25:scenecut=0:nal-hrd=cbr:aud=1:repeat-headers=1" \
  -force_key_frames "expr:gte(t,n_forced*1)" \
  -c:a aac -b:a 160k -ac 2 -ar 48000 \
  -muxdelay 0 -muxpreload 0 \
  -f hls -hls_time 2 -hls_list_size 10 \
  -hls_flags delete_segments+append_list+independent_segments+temp_file+program_date_time+omit_endlist \
  -hls_segment_filename "out/seg_%08d.ts" out/index.m3u8

  # --- Logique de Failover (Disjoncteur) ---
  EXIT_CODE=$? # Récupère le code de sortie de FFmpeg

  if [ "$EXIT_CODE" -ne 0 ]; then
    # FFmpeg a échoué
    CURRENT_TIME=$(date +%s)
    
    # 1. Ajoute le nouvel échec
    FAILURE_TIMESTAMPS+=("$CURRENT_TIME")
    
    # 2. Nettoie les anciens échecs
    declare -a PRUNED_TIMESTAMPS=() # Array temporaire
    for TS in "${FAILURE_TIMESTAMPS[@]}"; do
      ELAPSED=$((CURRENT_TIME - TS))
      if [ "$ELAPSED" -le "$FAIL_WINDOW" ]; then
        PRUNED_TIMESTAMPS+=("$TS") # Garde les échecs récents
      fi
    done
    FAILURE_TIMESTAMPS=("${PRUNED_TIMESTAMPS[@]}") # Met à jour la liste

    # 3. Compte les échecs récents
    FAIL_COUNT=${#FAILURE_TIMESTAMPS[@]}
    
    echo "Source en erreur ($FAIL_COUNT/$FAIL_LIMIT dans les $FAIL_WINDOW dernières secondes). Tentative dans 1s..."
    sleep 1

    # 4. Vérifie si on bascule
    if [ "$FAIL_COUNT" -ge "$FAIL_LIMIT" ]; then
      echo "Limite d'échecs ($FAIL_LIMIT en ${FAIL_WINDOW}s) atteinte. Basculement."
      
      if [ "$CURRENT_SOURCE" == "$SOURCE_1" ]; then
        CURRENT_SOURCE="$SOURCE_2"
      else
        CURRENT_SOURCE="$SOURCE_1"
      fi
      
      # IMPORTANT: Vide le compteur pour la nouvelle source
      FAILURE_TIMESTAMPS=()
      echo "Nouvelle source active: $CURRENT_SOURCE"
      sleep 1 
    fi
  else
    # FFmpeg s'est terminé sans erreur (succès)
    # On réinitialise le compteur d'échecs
    FAILURE_TIMESTAMPS=()
  fi
  
done

