#!/bin/bash # ─── G Radio Player — lanzador completo ───────────────────────────────────── cd "$(dirname "$0")" BIN="./target/release" HOME_GRADIO="$HOME/.gradio/data" PIDDIR="$HOME_GRADIO/tmp/pids" # URL del relay internet (ver nota equivalente en package-deb.sh) export GRADIO_RELAY_URL="${GRADIO_RELAY_URL:-wss://relay.gradio.net/ws}" # Verificar que estén compilados for b in radio-player comercial-scheduler playlist-refill; do if [ ! -f "$BIN/$b" ]; then echo "ERROR: $BIN/$b no existe. Ejecuta ./build.sh primero." exit 1 fi done mkdir -p "$PIDDIR" # ── Matar proceso por archivo PID + búsqueda por nombre ────────────────────── kill_aux() { local name="$1" local pidfile="$PIDDIR/$name.pid" # Matar por PID guardado if [ -f "$pidfile" ]; then local pid pid=$(cat "$pidfile" 2>/dev/null) if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then echo " Deteniendo $name (PID $pid)..." kill "$pid" 2>/dev/null for i in $(seq 1 6); do sleep 0.5 kill -0 "$pid" 2>/dev/null || break done kill -0 "$pid" 2>/dev/null && kill -9 "$pid" 2>/dev/null fi rm -f "$pidfile" fi # Matar cualquier instancia adicional por nombre (por si hay huérfanos) pkill -f "target/release/$name" 2>/dev/null sleep 0.3 } # ── Matar instancias previas ────────────────────────────────────────────────── echo "==> Deteniendo instancias previas (si las hay)..." kill_aux "comercial-scheduler" kill_aux "playlist-refill" sleep 0.5 # ── Crear directorios necesarios ────────────────────────────────────────────── mkdir -p "$HOME_GRADIO/tmp" mkdir -p "$HOME_GRADIO/comerciales" mkdir -p "$HOME_GRADIO/eventos-espera" mkdir -p "$HOME_GRADIO/eventos" mkdir -p "$HOME_GRADIO/parrilla" mkdir -p "$HOME_GRADIO/reporte" mkdir -p "$HOME/G Radio/inicio-espacio-pub" mkdir -p "$HOME/G Radio/fin-espacio-pub" # Migrar archivo device antiguo a gradio.config si existe DEVICE_FILE="$HOME_GRADIO/tmp/device" CONFIG_FILE="$HOME_GRADIO/tmp/gradio.config" if [ -f "$DEVICE_FILE" ] && [ ! -f "$CONFIG_FILE" ]; then echo "==> Migrando device → gradio.config..." MIX=$(cat "$HOME_GRADIO/mix" 2>/dev/null || echo "3.0") paste -d"\n" "$DEVICE_FILE" /dev/null > "$CONFIG_FILE" printf "G Radio\n%s\n" "$MIX" >> "$CONFIG_FILE" rm -f "$DEVICE_FILE" fi # Limpiar listas temporales y playlist (toma la programación de la hora actual) > "$HOME_GRADIO/tmp/comercialeslist4" > "$HOME_GRADIO/tmp/eventos-esperalist" > "$HOME_GRADIO/tmp/eventoslist" > "$HOME_GRADIO/tmp/playlist4" echo "==> Listas temporales y playlist limpiadas." # ── Lanzar auxiliares guardando su PID ─────────────────────────────────────── echo "==> Iniciando comercial-scheduler..." "$BIN/comercial-scheduler" & SCHED_PID=$! echo "$SCHED_PID" > "$PIDDIR/comercial-scheduler.pid" echo " PID: $SCHED_PID" echo "==> Iniciando playlist-refill..." "$BIN/playlist-refill" & REFILL_PID=$! echo "$REFILL_PID" > "$PIDDIR/playlist-refill.pid" echo " PID: $REFILL_PID" # ── Watchdog: verifica cada 30s que los auxiliares siguen vivos ────────────── watchdog() { while true; do sleep 30 # Si la UI ya no existe, salir kill -0 "$RADIO_PID" 2>/dev/null || break if ! kill -0 "$SCHED_PID" 2>/dev/null; then echo "==> WATCHDOG: comercial-scheduler caído, reiniciando..." "$BIN/comercial-scheduler" & SCHED_PID=$! echo "$SCHED_PID" > "$PIDDIR/comercial-scheduler.pid" fi if ! kill -0 "$REFILL_PID" 2>/dev/null; then echo "==> WATCHDOG: playlist-refill caído, reiniciando..." "$BIN/playlist-refill" & REFILL_PID=$! echo "$REFILL_PID" > "$PIDDIR/playlist-refill.pid" fi done } # ── Inhibir suspensión / DPMS en ARM (previene interferencia con el main loop GTK4) ── # En ARM+Wayland el compositor puede congelar el GLib main loop al apagar la pantalla, # causando que los detectores de silencio disparen en falso al reanudar. # Se intenta con systemd-inhibit (funciona en X11 y Wayland); si no está disponible # se usa xset para deshabilitar DPMS en X11. if command -v systemd-inhibit &>/dev/null; then echo "==> Inhibiendo idle con systemd-inhibit..." # Lanzar el player dentro de systemd-inhibit para bloquear el idle del sistema RUST_LOG=info systemd-inhibit \ --what=idle \ --who="G Radio Player" \ --why="Reproducción de audio en curso" \ --mode=block \ "$BIN/radio-player" & RADIO_PID=$! else # Fallback X11: deshabilitar screensaver y DPMS xset s off 2>/dev/null || true xset -dpms 2>/dev/null || true xset s noblank 2>/dev/null || true # ── Iniciar UI ────────────────────────────────────────────────────────────── echo "==> Iniciando radio-player (UI)..." RUST_LOG=info "$BIN/radio-player" & RADIO_PID=$! fi # Lanzar watchdog en segundo plano watchdog & WATCHDOG_PID=$! # Esperar a que la UI termine wait "$RADIO_PID" # ── Limpieza al salir ───────────────────────────────────────────────────────── echo "==> Cerrando procesos auxiliares..." kill "$WATCHDOG_PID" 2>/dev/null kill_aux "comercial-scheduler" kill_aux "playlist-refill" rm -f "$PIDDIR/comercial-scheduler.pid" "$PIDDIR/playlist-refill.pid" echo "==> Terminado."