# 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)

```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
}
```
