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).
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
#!/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."
|
||||
Reference in New Issue
Block a user