Crea tu radio online con 200 lyneas de python

Crea tu Radio Online con Líneas de Python

Cuando montamos la infraestructura de La MIX Radio, nos dimos cuenta de que no queríamos depender de paneles de control cerrados ni de servicios costosos.
Buscábamos algo que pudiéramos controlar totalmente desde la terminal.
Por eso decidimos que la mejor forma de empezar es cuando alguien crea tu radio online con líneas de Python, conectando un script sencillo con un servidor de streaming robusto.
No necesitamos software complejo, solo lógica pura y una buena conexión.

El problema de depender de software comercial

Muchos intentan lanzar su emisora usando herramientas que prometen «un clic y listo».
El problema real aparece cuando quieres automatizar algo específico, como cambiar el género musical según la hora o integrar un bot de Telegram.
En esos casos, el software cerrado se convierte en una cárcel.
Si el servidor falla a las 3 de la mañana, no tienes acceso a los logs reales ni puedes reiniciar un proceso específico sin tirar toda la plataforma.

Además, la gestión de la música suele ser rígida.
Para nosotros, que manejamos Deep House y Electro Swing, necesitábamos que el flujo de audio fuera constante y que el servidor no consumiera todos los recursos de la máquina.
Si no resuelves esto con scripts propios, terminas pagando mensualidades por funciones que un pequeño archivo de Python puede hacer gratis en un contenedor de Proxmox.

Requisitos previos para el montaje

Antes de tirar la primera línea de código, necesitamos que el entorno esté listo.
No instalamos esto directamente en la máquina física, sino que usamos nuestro homelab para mantener todo aislado. Para seguir este proceso, necesitamos lo siguiente:

  • Una VM con Debian o Ubuntu (en nuestro caso, usamos la VM).
  • Icecast2 instalado y configurado como servidor de streaming.
  • Python 3.9 o superior instalado en el sistema.
  • La librería requests para manejar las peticiones HTTP.
  • Una carpeta con archivos MP3 organizados (por ejemplo, en /home/lamix/music/).

Cómo lo resolvimos: el código y la arquitectura

La clave aquí no es crear un servidor de streaming desde cero, sino crear un «source» o fuente que alimente a Icecast.
Icecast se encarga de distribuir el audio a miles de oyentes, mientras que nuestro script de Python se encarga de leer los archivos y enviarlos en el formato correcto.
Esta es la base de cómo crea tu radio online con líneas de Python de forma eficiente.

Primero, configuramos Icecast en el archivo icecast.xml. Nos aseguramos de que el puerto 8000 esté abierto y que las contraseñas de origen sean seguras. Una vez que el servidor está escuchando, pasamos al script de automatización.

El siguiente bloque de código define la estructura básica del emisor.
Este script lee los archivos de una carpeta, los procesa y los envía al servidor de streaming mediante una conexión socket.

import os
import socket
import time

# Configuración básica del servidor
ICECAST_HOST = '127.0.0.1'
ICECAST_PORT = 8000
MOUNT_POINT = '/stream'
PASSWORD = 'hackme' # Contraseña definida en icecast.xml
MUSIC_DIR = '/home/lamix/music/'

def send_audio_stream():
# Creamos el socket para conectar con Icecast
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ICECAST_HOST, ICECAST_PORT))

# Cabecera de autenticación HTTP para Icecast
# Enviamos la solicitud de montaje del stream
auth_header = (
f"SOURCE /{
MOUNT_POINT
} HTTP/1.0\r\n"
f"Authorization: Basic dXNlcjpwYXNzd29yZA==\r\n" # Usuario:password en base64
f"Content-Length: 0\r\n\r\n"
)
s.sendall(auth_header.encode())

# Bucle infinito para mantener la radio sonando 24/7
while True:
files = [f for f in os.listdir(MUSIC_DIR) if f.endswith('.mp3')]
for file in files:
with open(os.path.join(MUSIC_DIR, file), 'rb') as audio:
print(f"Transmitiendo ahora: {
file
}")
while chunk := audio.read(4096):
s.sendall(chunk)
time.sleep(0.01) # Control de flujo para evitar saturación

Este enfoque nos permite tener un control total sobre la lista de reproducción.
Para que el sistema sea realmente profesional, añadimos una capa de gestión de errores.
Si el servidor Icecast se reinicia, el script de Python no debe morir, sino intentar reconectarse automáticamente cada pocos segundos.

Para manejar esto, envolvemos la función principal en un bloque try-except.
Esto es fundamental en una radio que no puede permitirse el silencio. En Radio OnE, implementamos este sistema para que, aunque haya un microcorte de red en el homelab, la música vuelva a sonar sin intervención humana.

def main():
while True:
try:
print("Iniciando conexión con el servidor de streaming...")
send_audio_stream()
except (socket.error, ConnectionRefusedError) as e:
print(f"Error de conexión: {
e
}. Reintentando en 10 segundos...")
time.sleep(10)
except Exception as e:
print(f"Error inesperado: {
e
}")
time.sleep(5)

if __name__ == "__main__":
main()

Una vez que el script está corriendo, el flujo de datos viaja desde la VM 111 hacia el puerto 8000 de Icecast. Desde allí, cualquier persona con el enlace de nuestra radio puede escuchar el contenido.
Para mejorar la experiencia, usamos Nginx como proxy inverso, lo que nos permite usar puertos estándar como el 80 o 443 y añadir certificados SSL.

Cuando alguien decide que crea tu radio online con 200 líneas de Python, el verdadero secreto no está en el código, sino en la estabilidad del servidor que recibe esos datos.

Errores que nos costaron tiempo

No todo fue sencillo. Durante las primeras semanas de pruebas en nuestro laboratorio, cometimos errores que nos mantuvieron despiertos hasta la madrugada.
Aquí los tres más comunes:

  • El buffer de Nginx: Notamos que el audio se cortaba cada pocos segundos. El problema era que Nginx intentaba guardar el stream en un buffer antes de enviarlo al cliente.
    Lo solucionamos añadiendo proxy_buffering off; en la configuración del servidor.
  • Permisos de archivos: El script de Python fallaba al leer los MP3 porque el usuario que ejecutaba el servicio no tenía permisos sobre /home/lamix/music/.
    Lo resolvimos cambiando el propietario de la carpeta con chown -R.
  • Cierre de sockets: Al principio, el script dejaba sockets abiertos cada vez que se reconectaba, agotando los recursos del sistema.
    Tuvimos que implementar el cierre explícito de la conexión antes de intentar un nuevo saludo HTTP.

Cómo saber que todo funciona

La verificación es simple pero debe ser rigurosa. Primero, revisamos los logs de Icecast en la consola para confirmar que el «Source» está conectado y enviando bytes.
Si vemos el mensaje Source connected, el camino está libre.

Segundo, abrimos el navegador y entramos en la dirección de nuestro servidor (por ejemplo, lamixradio.com/stream).
Si el reproductor comienza a cargar el audio sin saltos, el sistema es estable.
Por último, matamos el script de Python y comprobamos que, efectivamente, la radio se detiene, y al reiniciarlo, el streaming vuelve a iniciar en menos de 15 segundos.

Qué sigue después de montar el stream

Ahora que tenemos la base funcionando, el siguiente paso lógico es la automatización inteligente.
En La MIX Radio, ya no usamos carpetas estáticas, sino que conectamos el script a una base de datos simple.
Esto nos permite programar bloques musicales y lanzar cuñas automáticas usando gTTS (Google Text-to-Speech) con nuestra voz sintética «Emily» en la VM, haciendo que la radio se sienta viva sin necesidad de un locutor presente.

Compartir

“Post relacionados”

🤖
Asistente de Fabio Martínez
En línea
¡Hola! 👋 Soy el asistente virtual de
Fabio Martínez
Técnico de Radio · Dev Web · Servidores

¿Cómo te llamás?