Cómo Crear Playlists Inteligentes por Horarios con Python
Cuando montamos el sistema de automatización para La MIX Radio, nos dimos cuenta de que no podíamos dejar la música al azar.
El Deep House funciona bien a medianoche, pero el Electro Swing tiene mucha más fuerza durante la tarde.
Por eso, decidimos crear playlists inteligentes por horarios con Python para que el servidor cambie el mood automáticamente sin que tengamos que intervenir manualmente cada pocas horas.
El problema de las listas estáticas en la radio
El error más común al gestionar una radio online es usar una sola lista gigante de canciones en modo aleatorio.
Esto provoca que el oyente escuche un track energético a las tres de la mañana o algo demasiado relajado durante la hora punta.
En nuestra experiencia, esto rompe el flujo de la emisora y ahuyenta a la audiencia que busca una atmósfera específica según la hora.
Si no resolvemos esto, terminamos haciendo cambios manuales en el software de emisión, lo cual es inviable si queremos dormir o trabajar en otras cosas.
Además, depender de la suerte del algoritmo de «shuffle» no es programar una radio, es dejarla a la deriva.
Necesitábamos una forma de decirle al sistema qué carpeta de música leer dependiendo del reloj del servidor.
Esta necesidad nos llevó a mover la lógica fuera del reproductor y llevarla al sistema operativo.
Una vez que el servidor sabe qué hora es, puede alimentar el stream con la carpeta correcta de forma transparente.
Lo que necesitas antes de empezar
Para replicar lo que hacemos en nuestro homelab, no necesitas hardware costoso, pero sí un entorno controlado. Nosotros corremos todo esto en una VM de Proxmox para poder hacer snapshots antes de tocar el código.
- Una instancia de Linux (nosotros usamos Debian en la VM).
- Python 3 instalado y configurado.
- Estructura de carpetas organizada por géneros o moods (ej. /home/lamix/music/morning, /home/lamix/music/night).
- Acceso a la terminal vía SSH.
- Un gestor de streaming como Icecast para recibir la señal.
Cómo lo resolvimos, paso a paso
La idea central es crear un script que actúe como un «director de orquesta».
El script revisa la hora actual y, basándose en rangos definidos, selecciona la carpeta de música correspondiente.
Para evitar que el cambio de playlist sea brusco, el script actualiza un archivo de configuración que el reproductor lee en tiempo real.
Primero, definimos los horarios y sus carpetas asociadas en un diccionario de Python.
Esto nos permite cambiar los rangos fácilmente sin romper la lógica del código.
import datetime
import os
import shutil
# Definimos los rangos horarios y sus carpetas correspondientes
# Formato: (Hora_Inicio, Hora_Fin, Ruta_Carpeta)
SCHEDULE = [
(6, 12, "/home/lamix/music/morning"), # Electro Swing suave
(12, 18, "/home/lamix/music/afternoon"), # House comercial
(18, 0, "/home/lamix/music/night"), # Deep House oscuro
]
# Ruta donde el reproductor busca la lista activa
ACTIVE_PLAYLIST_PATH = "/home/lamix/current_playlist.txt"
Con los horarios definidos, necesitamos una función que determine qué carpeta corresponde al momento exacto.
El problema aquí es que el horario de noche suele cruzar la medianoche (de 18:00 a 00:00), por lo que la comparación simple de números no siempre basta.
Para solucionar esto, implementamos una lógica que valide la hora actual contra nuestra lista de horarios.
def get_current_folder():
now = datetime.datetime.now().hour
for start, end, folder in SCHEDULE:
if start <= now < end:
return folder
# Manejo especial para el turno que termina a medianoche
if start > end and (now >= start or now < end):
return folder
return "/home/lamix/music/default" # Carpeta de respaldo
Una vez que el script sabe qué carpeta usar, lo siguiente es generar la lista de archivos.
No queremos pasarle al reproductor una carpeta, sino un archivo de texto con las rutas completas de las canciones, que es lo que la mayoría de los motores de streaming aceptan.
Este bloque de código escanea la carpeta seleccionada y escribe el archivo de texto que el sistema de audio procesará.
def update_playlist_file(folder):
# Obtenemos la lista de archivos .mp3 de la carpeta seleccionada
songs = [os.path.join(folder, f) for f in os.listdir(folder) if f.endswith('.mp3')]
# Escribimos la lista en el archivo que lee el stream
with open(ACTIVE_PLAYLIST_PATH, "w") as f:
for song in songs:
f.write(song + "\n")
print(f"Playlist actualizada con archivos de: {
folder
}")
Para que todo esto funcione sin supervisión, envolvemos la lógica en un bucle infinito que se ejecuta cada pocos minutos. No tiene sentido revisar la hora cada segundo; con hacerlo cada 5 minutos es suficiente para que el cambio de mood sea fluido.
import time
if __name__ == "__main__":
while True:
current_folder = get_current_folder()
update_playlist_file(current_folder)
# Esperamos 300 segundos (5 minutos) antes de la siguiente revisión
time.sleep(300)
Para crear playlists inteligentes por horarios con Python, la clave no está en el código complejo, sino en organizar bien tus carpetas de música y automatizar la escritura del archivo de lista que usa tu servidor de streaming.
Una vez que el script está corriendo, lo configuramos como un servicio de systemd en la VM.
De esta forma, si el servidor se reinicia por un corte de luz en Benavente, el script arranca solo y la radio nunca se queda en silencio.
Errores que nos costaron tiempo
No todo fue lineal. Durante las pruebas en el homelab, cometimos algunos fallos que nos mantuvieron despiertos hasta la madrugada.
- Permisos de escritura: El script fallaba al intentar crear el archivo .txt porque lo ejecutábamos como usuario root y el reproductor de radio corría bajo el usuario ‘lamix’. Solución: Ajustamos los permisos de la carpeta con
chown. - El salto de medianoche: Al principio, la playlist de noche no cargaba entre las 00:00 y las 06:00 porque el rango (18, 0) no se evaluaba correctamente. Solución: Añadimos la condición
now >= start or now < end. - Caché del reproductor: Notamos que aunque el archivo .txt cambiaba, el reproductor seguía tocando la lista vieja. Solución: Configuramos el reproductor para que revalide la lista cada vez que termina una canción.
Cómo saber que funciona
La verificación es sencilla. No hace falta esperar a que lleguen las 12 de la noche para probarlo.
Cambiamos temporalmente el reloj del servidor en la VM usando el comando date para simular una hora diferente.
Si al cambiar la hora a las 20:00 el archivo current_playlist.txt se actualiza automáticamente con las rutas de la carpeta de Deep House, el sistema está operativo.
También monitoreamos los logs del script para asegurar que no haya errores de lectura de archivos.
Qué sigue
Ahora que la selección es automática por horario, el siguiente paso es integrar esto con n8n.
Queremos que, si detectamos un evento especial o una noticia urgente, n8n pueda forzar la carga de una playlist de «Emergencia» o «Especial» saltándose el horario programado.
Es la evolución natural hacia una radio totalmente inteligente y autónoma.

