Files
G-Radio-Player/assets/opencode/context/01-estructura.md
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

5.1 KiB

Estructura de G-Radio-Player

Sistema de automatización de radio profesional en Rust + GTK4. Tres procesos coordinados que se comunican mediante archivos compartidos en ~/.gradio/data/tmp/.

Binarios instalados en /usr/local/bin/

Binario Descripción
radio-player UI principal GTK4 — reproduce música, maneja crossfade, Duck
comercial-scheduler Daemon que se activa en el minuto :58 y carga las tandas del minuto siguiente
playlist-refill Daemon que revisa cada 5s y rellena playlist4 con ~14 temas de la parrilla
gradio.sh Lanzador principal (mata procesos previos, inicia los 3 procesos + watchdog)
gr-botonera Ventana de botonera de efectos y jingles rápidos
gr-parrilla Editor de parrilla semanal (qué suena cada hora)
gr-pautaje Editor de pautaje comercial (qué comerciales suenan cada minuto)
gr-playlist Editor de playlist
gr-buscador Buscador de archivos de audio con preescucha
gr-visor Visor de reportes y programación
gr-reportes Generador de reportes de reproducción
gr-record Grabación de audio

Árbol de datos ~/.gradio/data/

~/.gradio/data/
├── tmp/                         ← Estado en vivo (leer/escribir aquí)
│   ├── gradio.config            ← Configuración principal (18 líneas)
│   ├── playlist4                ← Cola musical: "ruta\tduracion" por línea
│   ├── comercialeslist4         ← Cola activa de comerciales (solo rutas)
│   ├── eventoslist              ← Cola activa de eventos (solo rutas)
│   ├── eventos-esperalist       ← Cola activa de eventos en espera
│   ├── estado.json              ← Estado completo del player (se escribe cada 2s)
│   ├── upvol                    ← Volumen principal 0-100
│   ├── downvol                  ← Volumen duck 0-100
│   ├── cmd_play                 ← Señal: reproducir (crear el archivo para activar)
│   ├── cmd_pause                ← Señal: pausar
│   ├── cmd_stop                 ← Señal: detener deck A
│   ├── cmd_stop_after           ← Señal: toggle "detener al terminar el tema"
│   ├── cmd_siguiente            ← Señal: saltar al siguiente tema
│   ├── cmd_stop_general         ← Señal: detener TODO (música + comerciales + eventos)
│   ├── cmd_play_tanda           ← Señal: reproducir tanda de comerciales inmediata
│   ├── botonera_now             ← Señal: ruta de audio a reproducir en botonera
│   ├── play_now                 ← Señal: "ruta\tduracion" para reproducir ahora
│   └── played_breaks            ← Tandas ya reproducidas hoy (YYYYMMDD HH:MM por línea)
│
├── parrilla/                    ← Programación semanal de música
│   ├── 1/                       ← Lunes (1=Lun, 2=Mar, ..., 7=Dom)
│   │   ├── 0-1.mus              ← Bloque 00:00-01:00 del lunes
│   │   ├── 8-9.mus
│   │   └── ...
│   ├── 2/ ... 7/
│
├── comerciales/                 ← Pautaje de comerciales
│   ├── 0/                       ← Hora 0 (00:xx)
│   │   ├── 0.com                ← Comerciales a las 00:00
│   │   ├── 30.com               ← Comerciales a las 00:30
│   │   └── ...
│   └── 1/ ... 23/
│
├── eventos/                     ← Eventos programados (mismo formato .com)
│   └── <hora>/<minuto>.com
│
├── eventos-espera/              ← Eventos en espera del operador
│   └── <hora>/<minuto>.com
│
├── botonera/config.json         ← Botones configurados en gr-botonera
│
├── panel/Time/                  ← 109 audios de hora (HRS00..HRS23, MIN01..MIN59, etc.)
│
└── reporte/                     ← Reportes CSV de reproducción

Archivo gradio.config (18 líneas)

línea 1:  tarjeta audio principal (vacío = auto)
línea 2:  tarjeta audio CUE (vacío = auto)
línea 3:  nombre del medio
línea 4:  tiempo de fundido crossfade (segundos)
línea 5:  pisador habilitado (1/0)
línea 6:  carpeta de pisadores
línea 7:  cada cuántos temas tocar pisador
línea 8:  carpetas excluidas de pisador (formato: "/ruta/a";"/ruta/b")
línea 9:  silencio máximo en segundos (0=desactivado)
línea 10: carpetas de música nacional (para reportes)
línea 11: carpetas de interculturalidad (para reportes)
línea 12: puerto servidor gr-client (default 7777)
línea 13: token de autenticación gr-client
línea 14: relay habilitado (1/0)
línea 15: ID de relay (8 dígitos)
línea 16: días de no-repetición (default 3)
línea 17: locale ("es"/"en"/"pt" o vacío=auto)
línea 18: IA habilitada (1/0)

Archivo estado.json (se actualiza cada 2 segundos)

{
  "reproduciendo": true,
  "pausado": false,
  "track_actual": "/home/usuario/Música/tema.mp3",
  "titulo_actual": "Nombre del tema",
  "posicion_secs": 45.3,
  "duracion_secs": 210.0,
  "upvol": 90,
  "downvol": 20,
  "comerciales_activos": false,
  "eventos_activos": false,
  "num_comerciales": 3,
  "num_eventos": 0,
  "num_eventos_espera": 1,
  "indice_actual": 7
}