# 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) │ └── /.com │ ├── eventos-espera/ ← Eventos en espera del operador │ └── /.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) ```json { "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 } ```