Sistema de automatización de radio en Rust (GTK4 + GStreamer): reproductor principal con crossfade y ducking, scheduler de comerciales, refill de playlist, y herramientas auxiliares (pautaje, parrilla, botonera, visor, buscador, playlist, grabador, reportes). Incluye sistema de skins y modos de Players (paneles de reproducción configurables).
159 lines
6.0 KiB
Bash
Executable File
159 lines
6.0 KiB
Bash
Executable File
#!/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."
|