Genera Contenido Web a partir de tu Programación Radial
Cuando montamos la estructura de La MIX Radio, nos dimos cuenta de que mantener una programación radial manual es una batalla perdida.
No importa cuántas horas le dediquemos a organizar las carpetas de música, siempre hay un archivo que falla o un espacio vacío que genera silencio.
Para nosotros, la clave no estuvo en comprar un software caro, sino en convertir la pauta de emisión en datos que el servidor pueda procesar solo.
Por qué la pauta tradicional falla en la radio online
El problema real aparece cuando intentas coordinar los bloques de Deep House y Electro Swing sin que el flujo suene repetitivo.
Si dependemos de un operador humano o de una lista de reproducción simple, terminamos poniendo el mismo tema tres veces en una hora.
Esto sucede porque la mayoría de los sistemas de automatización no «entienden» la estructura del día, solo lanzan archivos al azar.
Si no resolvemos esto, la experiencia del oyente cae drásticamente.
Un oyente que detecta un patrón aburrido o, peor aún, un silencio prolongado por un archivo corrupto, cierra la pestaña del navegador inmediatamente.
En nuestro caso, el riesgo era mayor porque operamos 24/7 desde un homelab, donde cualquier caída del sistema debe ser detectada y resuelta sin intervención manual constante.
Esta fragilidad nos obligó a dejar de ver la pauta como un documento de texto y empezar a verla como una base de datos. Una vez que cambiamos el enfoque, pudimos conectar el horario de emisión con scripts que mueven los archivos en el servidor justo a tiempo.
Lo que necesitamos para automatizar la pauta
Antes de tocar el código, dejamos listo el entorno para que nada interfiera con el streaming.
No instalamos todo en la misma máquina para evitar que un proceso de Python consuma la RAM necesaria para el audio.
- Un servidor Proxmox con una VM dedicada (usamos la VM 111 para el streaming).
- Icecast2 instalado y configurado como servidor de streaming.
- Python 3 instalado en el contenedor de gestión (CT 101).
- Acceso SSH entre la VM de audio y el contenedor de control.
- Una estructura de carpetas organizada por géneros en /home/lamix/music/.
Cómo implementamos la gestión de la programación radial
Para que la programación radial funcione sola, creamos un script de Python que actúa como el «director de orquesta».
Este script lee un archivo JSON donde definimos qué género suena en cada franja horaria y luego le indica al software de emisión qué carpeta debe leer.
Primero, definimos el archivo de pauta en formato JSON para que sea fácil de modificar sin tocar el código principal.
{
"00:00-06:00": "deep_house_ambient",
"06:00-12:00": "electro_swing_morning",
"12:00-18:00": "deep_house_main",
"18:00-00:00": "electro_swing_night"
}
Una vez que tenemos el horario definido, necesitamos que la VM 111 sepa qué archivos cargar.
Para esto, usamos un script que verifica la hora actual y actualiza el enlace simbólico de la carpeta de música que lee Icecast o Liquidsoap.
Este bloque de código se encarga de rotar las carpetas según la hora del día.
import json
from datetime import datetime
import os
# Ruta donde se encuentran las carpetas de música
BASE_PATH = "/home/lamix/music/"
PAUTA_FILE = "/home/lamix/pauta.json"
def actualizar_programacion():
# Cargamos la pauta desde el archivo JSON
with open(PAUTA_FILE, 'r') as f:
pauta = json.load(f)
ahora = datetime.now().strftime("%H:%M")
# Buscamos qué género corresponde a la hora actual
for franja, genero in pauta.items():
inicio, fin = franja.split('-')
if inicio <= ahora <= fin:
# Creamos el enlace simbólico a la carpeta activa
target = os.path.join(BASE_PATH, genero)
link = os.path.join(BASE_PATH, "current_playlist")
if os.path.exists(link):
os.remove(link)
os.symlink(target, link)
print(f"Cambiando a: {
genero
}")
break
if __name__ == "__main__":
actualizar_programacion()
Para que esto no sea un proceso manual, programamos el script en el crontab del sistema.
Así, cada minuto el servidor revisa si debe cambiar la carpeta de música, asegurando que la transición entre géneros sea exacta.
Configuramos la tarea programada en el sistema Linux de la siguiente manera.
# Ejecutar el script de pauta cada minuto
* * * * * /usr/bin/
python3 /home/lamix/scripts/update_pauta.py >> /home/lamix/logs/pauta.log 2>&1
Al automatizar la programación radial mediante enlaces simbólicos y scripts de Python, eliminamos la posibilidad de que el servidor se quede sin archivos que reproducir.
Errores que nos costaron tiempo y sueño
No todo fue sencillo. Tuvimos que aprender a golpes sobre cómo Linux maneja los archivos y los permisos en tiempo real.
El primer error fue el bloqueo de archivos. Intentamos mover la carpeta completa mientras el software de streaming la estaba leyendo.
Resultado: la radio se quedó en silencio y el proceso se colgó.
Lo resolvimos usando enlaces simbólicos (symlinks), así el software siempre lee la ruta /current_playlist/ y nosotros solo cambiamos a dónde apunta ese enlace.
El segundo fallo ocurrió con el formato de hora en el JSON.
Usamos formatos de 12 horas en lugar de 24 horas, lo que causó que la música de la mañana sonara a medianoche.
La solución fue estandarizar todo a formato ISO 24h y validar la entrada con la librería datetime de Python.
El tercer problema fue el consumo de CPU en la VM 111. Al principio, el script de Python hacía un escaneo completo de miles de archivos cada minuto.
Esto saturaba la VM y causaba micro-cortes en el audio.
Lo arreglamos haciendo que el script solo actúe si la hora actual coincide exactamente con el inicio de una franja horaria.
Cómo verificar que la pauta funciona
Para saber que todo está en orden, no nos fijamos solo en si se escucha música, sino en los logs del servidor. Entramos por SSH al contenedor CT 101 y revisamos que la salida del script coincida con la hora del reloj.
Ejecutamos el comando de lectura de logs en tiempo real para confirmar que el cambio de carpeta se realizó con éxito.
tail -f /home/lamix/logs/pauta.log
Si vemos la línea «Cambiando a: electroswingnight» justo a las 18:00, sabemos que la automatización está respondiendo correctamente y que el flujo de audio seguirá sin interrupciones.
Cuál es el siguiente paso
Una vez que la música rota sola, el siguiente desafío es la voz.
Ahora estamos integrando a Emily, nuestra voz generada con gTTS en la VM 111, para que anuncie el cambio de programa automáticamente.
No queremos que el oyente solo escuche música, sino que sepa exactamente qué bloque de la programación radial está escuchando sin que nosotros tengamos que grabar cuñas manualmente cada semana.

