Files
G-Radio-Player/run.sh
T
cescobar 03084e2d5a Commit inicial: G Radio Player
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).
2026-08-23 00:57:40 -05:00

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."