Files
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

5.1 KiB

Comandos y Control del Sistema

Control de reproducción (señales IPC)

El player monitorea la carpeta ~/.gradio/data/tmp/ cada 200ms. Para enviar un comando, crea el archivo — el player lo lee, ejecuta la acción y borra el archivo.

TMP=~/.gradio/data/tmp

# Reproducir (reanudar desde pausa)
touch "$TMP/cmd_play"

# Pausar / reanudar (toggle)
touch "$TMP/cmd_pause"

# Detener deck A (deja los comerciales intactos)
touch "$TMP/cmd_stop"

# Toggle "detener al terminar el tema actual"
touch "$TMP/cmd_stop_after"

# Saltar al siguiente tema
touch "$TMP/cmd_siguiente"

# STOP GENERAL: detiene música + comerciales + eventos todo
touch "$TMP/cmd_stop_general"

# Reproducir tanda de comerciales AHORA (sin esperar al scheduler)
# Primero cargar la lista, luego la señal
echo "/ruta/spot1.mp3" > "$TMP/comercialeslist4"
echo "/ruta/spot2.mp3" >> "$TMP/comercialeslist4"
touch "$TMP/cmd_play_tanda"

# Reproducir audio en botonera (sin interrumpir música ni comerciales)
echo "/ruta/efecto.mp3" > "$TMP/botonera_now"

# Reproducir tema inmediatamente (crossfade hacia él)
echo -e "/ruta/tema.mp3\t00:03:45.000" > "$TMP/play_now"

Estado del sistema

# Estado completo (JSON actualizado cada 2s)
cat ~/.gradio/data/tmp/estado.json

# Estado formateado
cat ~/.gradio/data/tmp/estado.json | python3 -m json.tool

# Valores individuales
python3 -c "
import json
d = json.load(open('$HOME/.gradio/data/tmp/estado.json'))
print(f'Reproduciendo: {d[\"reproduciendo\"]}')
print(f'Tema actual:   {d[\"titulo_actual\"]}')
print(f'Posición:      {d[\"posicion_secs\"]:.0f}s / {d[\"duracion_secs\"]:.0f}s')
print(f'Volumen:       up={d[\"upvol\"]}% duck={d[\"downvol\"]}%')
print(f'Comerciales:   {d[\"num_comerciales\"]} en cola, activos={d[\"comerciales_activos\"]}')
print(f'Eventos:       {d[\"num_eventos\"]}')
print(f'En espera:     {d[\"num_eventos_espera\"]}')
"

# Playlist pendiente (cuántos temas quedan)
wc -l ~/.gradio/data/tmp/playlist4

# Cola de comerciales activa
cat ~/.gradio/data/tmp/comercialeslist4

Volumen

# Ver volumen actual
echo "Principal: $(cat ~/.gradio/data/tmp/upvol)%"
echo "Duck:      $(cat ~/.gradio/data/tmp/downvol)%"

# Cambiar volumen principal a 85%
echo "85" > ~/.gradio/data/tmp/upvol

# Cambiar volumen duck a 20%
echo "20" > ~/.gradio/data/tmp/downvol

Parrilla (programación)

# Ver qué suena ahora
HORA=$(date +%-H)
DIA=$(date +%u)   # 1=Lun...7=Dom
echo "=== Parrilla actual: día $DIA, hora $HORA ==="
cat ~/.gradio/data/parrilla/$DIA/$HORA-$((HORA+1)).mus

# Agregar tema a la hora actual
echo "/ruta/nuevo_tema.mp3" >> ~/.gradio/data/parrilla/$DIA/$HORA-$((HORA+1)).mus

# Crear parrilla para todas las horas de un día (comodín)
for h in $(seq 0 23); do
  mkdir -p ~/.gradio/data/parrilla/1
  echo "/home/grecord/Musica/Variado/*" >> ~/.gradio/data/parrilla/1/$h-$((h+1)).mus
done

Comerciales

# Agregar comercial a las 16:00 (todos los días, todo el año)
mkdir -p ~/.gradio/data/comerciales/16
echo "/ruta/spot.mp3|1234567|20250101|20261231" >> ~/.gradio/data/comerciales/16/0.com

# Ver tandas de la hora actual
HORA=$(date +%-H)
MIN=$(date +%-M)
ls ~/.gradio/data/comerciales/$HORA/

# Ver tandas ya reproducidas hoy
cat ~/.gradio/data/tmp/played_breaks

Locución con IA

# Generar locución con voz clonada de Pato (requiere GPU NVIDIA)
locuta "Texto a locutar"

# Especificar nombre de archivo
cd ~/Dropbox/LocutorIA
./locucion_pato.sh "Texto a locutar" nombre_salida

# La locución se genera en:
# ~/Dropbox/LocutorIA/salida_mp3/locucion_AAAAMMDD_HHMMSS.mp3
# (o salida_mp3/nombre_salida.mp3 si se usó nombre personalizado)

# Copiar a la carpeta Time de G Radio Player para usar como locución de hora:
cp ~/Dropbox/LocutorIA/salida_mp3/locucion_*.mp3 ~/.gradio/data/panel/Time/

# O copiar a la carpeta de comerciales/eventos para pautar:
cp ~/Dropbox/LocutorIA/salida_mp3/mi_locucion.mp3 ~/.gradio/data/comerciales/15/

Verificar daemons

# Ver si los daemons están corriendo
ps aux | grep -E 'comercial-scheduler|playlist-refill' | grep -v grep

# Verificar que el player está activo
ps aux | grep radio-player | grep -v grep

# Leer configuración actual
cat ~/.gradio/data/tmp/gradio.config

Diagnóstico rápido

# Script de diagnóstico completo
echo "=== G-Radio Player — Estado ==="
echo ""
echo "Procesos:"
ps aux | grep -E 'radio-player|comercial-scheduler|playlist-refill' | grep -v grep

echo ""
echo "Reproducción:"
python3 -c "
import json, sys
try:
    d = json.load(open('$HOME/.gradio/data/tmp/estado.json'))
    print(f'  Reproduciendo: {d[\"reproduciendo\"]}')
    print(f'  Tema: {d[\"titulo_actual\"]}')
    print(f'  Posición: {d[\"posicion_secs\"]:.0f}s / {d[\"duracion_secs\"]:.0f}s')
except: print('  (estado.json no disponible)')
"

echo ""
echo "Colas:"
echo "  Música pendiente: $(wc -l < ~/.gradio/data/tmp/playlist4 2>/dev/null || echo 0) temas"
echo "  Comerciales: $(wc -l < ~/.gradio/data/tmp/comercialeslist4 2>/dev/null | tr -d ' ') items"
echo "  Eventos: $(wc -l < ~/.gradio/data/tmp/eventoslist 2>/dev/null | tr -d ' ') items"
echo "  En espera: $(wc -l < ~/.gradio/data/tmp/eventos-esperalist 2>/dev/null | tr -d ' ') items"