← Volver atrás

Radio

Acá encuentras detalles sobre nuestra radio, Radio Costa.

Indice:

  1. Historia
  2. Configuración
  3. Metadata
  4. Editaje
  5. Cacharreo
  6. Extras

Historia

Pira

Nuestra radio inicialamente estuvo alojada en una Raspberry Pi llamada Pira. Tenía acceso a internet pero no se podía acceder a ella desde afuera. No teníamos acceso al router para abrir los puertos.

Para poder transmitir hicimos un "ssh reverse tunneling" con caracolito. De esa forma pudimos hacerla funcionar. Pira usaba Ices+Icescast2.

Servidor amigo

Más adelante pudimos aprovechar el espacio de un servidor amigo, donde los recursos nos permitieron cambiar de Ices2 a Liquidsoap. La radio estuvo mucho tiempo alojada ahí.

El nuestro

Ya con nuestro propio servidor nos dedicamos a explorar otras opciones para manejar la radio, como LibreTime, pero no terminó de convencernos. Por ahora decidimos quedarnos con Icecast2+Liquidsoap.

Configuración

La radio usa Icecast2 con Liquidsoap para servir y reproducir el audio.

Ambos programas son relativamente livianos y simples. Manejamos todo por la línea de comando.

Originalmente Ices2 utilizaba una lista en texto plano para leer las canciones que queremos que reproduzca. En ese archivo escribíamos los caminos ("paths") de las canciones. Por ejemplo:

~/musicaradio/LasLetras/Tanama.ogg

Un detalle para quienes quieran usar Ices2: solo reproduce archivos ".ogg".

Actualmente, con Liquidsoap, utilizamos las listas de reproducción que le indicamos (e.g. lista.m3u). Este programa se maneja con un script, y utiliza su propio lenguaje. El programa lee un archivo con extensión ".liq". Este es el contenido de nuestro archivo ".liq":

#!/usr/bin/liquidsoap
# Direccion del log
set("log.file.path","/tmp/log/basic-radio.log")

def predicate.activates(~init=false, p)
  last = ref(not init)
  fun () -> begin
    cur = p()
    ans = (not !last) and cur
    last := cur
    ans
  end
end

# Musica
dia = playlist("/~/jabonliquido/dia.m3u")
tarde = playlist("/~/jabonliquido/tarde.m3u")
noche = playlist("/~/jabonliquido/noche.m3u")
madrugada = playlist("/~/jabonliquido/madrugada.m3u")
# Separadores
separadores = playlist("/~/jabonliquido/separadores.m3u")
# Seguridad
seguridad = single("/~/musicaradio/Separadores/separadorRCdiez.ogg")

# Radio
radio = switch([
	(predicate.activates({ 0m-7m }), separadores),
	({ 4h-10h }, madrugada),
	({ 10h-16h }, dia),
	({ 16h-22h }, tarde),
	({ 22h-4h }, noche)
	])
# Si algo sale mal esto se reproducira
radio = fallback(track_sensitive = false, [radio, seguridad])
# La salida del stream
output.icecast(%mp3(bitrate=128),
	host = "localhost", 
	port = 8000, icy_metadata = "true",
	password = "password", 
	mount = "radiocosta", 
	description="La radio oficial de Archipielago I.",
	radio)

output.icecast(%mp3.abr(bitrate=64,max_bitrate=128,id3v2=true),
	host = "localhost", 
	port = 8000, icy_metadata = "true", 
	description="(Menor calidad) La radio oficial de Archipielago I.",
	password = "password", 
	mount = "mradiocosta",
	radio)

De manera simple este script indica:

  1. Guarda el log en esta dirección.
  2. Define lo que es la función "predicate.activates" (para que prediga cuando tiene que reproducir el separador, y cuantas veces).
  3. Estos son los caminos a las listas y sus respectivas referencias. (Lo que esta bajo # Music)
  4. Este es el camino para nuestra "seguridad", lo que va a reproducir si algo sale mal.
  5. Esta es la definición de la radio: Reproduce un separador dentro de los primeros 7 minutos de cada hora, de acuerdo a los parametros de "predicate.activates". Reproduce la lista de madrugada de 4h-10h, la de día de 10h-16h, la de tarde de 16h-22h y la de noche de 22h-4h.
  6. Esta es la definición por si algo sale mal.
  7. Esto son los streams que queremos que salgan: El primero, en .mp3, con 128 de bitrate, por el puerto 8000, en el punto de montaje "radiocosta", con tal contraseña (definida desde Icecast), con esta descripción. El segundo con los mismos detalles excepto con 64 de bitrate (menor calidad).

Metadata

Muchas veces nos encontramos con que la radio no tiene la metadata incluída en sus canciones. Para añadir la información correspondiente usamos `id3v2` para varios formatos (mp3, m4a, wav, ...) y `vorbiscomment` para ".ogg".

Con `id3v2` podemos hacer varias cosas.

Si quieres ver la metada de todos los archivos ".mp3" en una carpeta puedes hacer:

id3v2 -l *.mp3

Para añadir el nombre de artista a todos los archivos ".mp3" puedes hacer:

id3v2 -a "Nombre de Artista" *.mp3

Para añadir el título de una canción puedes hacer:

id3v2 -t "Nombre de la canción" cancion.mp3

Con que la canción tenga nombre de artista y título nos es suficiente.

Para `vorbiscomment` puedes usar estos dos comandos.

Para añadir nombre de artista puedes hacer:

vorbiscomment -a -t "ARTIST=Nombre de artista" Nombredelarchivo.ogg

Para añadir el título de una cancióin puedes hacer:

vorbiscomment -a -t "TITLE=Titulo de la canción" Nombredelarchivo.ogg

Lamentablemente `vorbiscomment` no permite usar el asterisco (*) para añadir a todos los ".ogg", por lo que hay ir uno por uno.

Editaje

Editar el nombre de los archivos

Cuando copiamos o bajamos canciones a la radio es común encontrar que los nombres de los archivos tienen espacios o palabras que no queremos.

Como por ejemplo:

Hector Coco Barez - Lo que te vuelve loco.mp3

En este caso nos interesa quitar el nombre de artista y todos los espacios en blanco. Vayamos por paso.

Para remover lo que se quiera del título de los archivos usamos `rename`. Supongamos que todos los ".mp3" en nuestra carpeta tienen lo mismo. Usaríamos el siguiente comando para borrarlo:

rename ’s/Hector Coco Barez - //‘ *.mp3

El archivo se renombra como "Lo que te vuelve loco.mp3". En el resto de los ".mp3" también se elimina.

Ahora queremos quitar los espacios en blanco para que Liquidsoap los pueda leer sin problema. Usamos el siguiente comando que aplica a todos los archivos ".mp3" de la carpeta:

rename 's/ //g' *.mp3

De esta forma el archivo queda "Loquetevuelveloco.mp3", justo como lo necesitamos.

A veces el archivo tiene números luego de un guión, como por ejemplo "Hector Coco Barez - Lo que te vuelve loco-415633156.mp3". En este caso, luego de hacer los pasos anteriores, hacemos este último para elminarlos:

rename 's/\-\d+\.mp3$/\.mp3/' *.mp3

Este comando le dice que elimine todo lo que esta entre el guión ("-") y el ".mp3". El "*.mp3" establece que haga lo mismo para todos los archivos que terminen en ".mp3".

También nos podemos encontrar con un archivo de nombre `cancion[123456].mp3`. Si queremos que elimine los corchetes y los números podemos usar:

rename 's/\[.*\]//' *.mp3

El archivo entonces quedaría como `cancion.mp3`.

Añadiendo canciones a la lista de bloque

Para que Liquidsoap reproduzca las canciones es necesario añadir su dirección ("path") a nuestra lista de bloque (.m3u). Siguiendo con el ejemplo, supongamos que ésta y las demás canciones en esta carpeta las queremos añadir a la tarde.

Primero debemos conocer su dirección completa. Estas canciones estan en una carpeta de álbum (ElLaberintodelCoco), dentro de la carpeta de artista (CocoBarez), dentro de la carpeta de la música de la radio (musicaradio). Si nos movemos a la carpeta donde están todas las canciones podemos hacer esto:

find $(pwd) -iname "*.mp3"

Esto "imprime" la dirección completa de todos los archivos con la extensión ".mp3".

Suponiendo que nuestra musica esta en el "home" (~) en una carpeta llamada "musicaradio", el resultado con la canción de ejemplo sería el siguiente:

/home/usuarie/musicaradio/CocoBarez/ElLaberintodelCoco/Loquetevuelveloco.mp3

Esa dirección (y la de las demás canciones) la añadimos al archivo "tarde.m3u". Para poder distinguir entre artistas es posible comentar en el archivo con "#":

# Coco Barez
/home/usuarie/musicaradio/CocoBarez/ElLaberintodelCoco/Loquetevuelveloco.mp3
# Viento de Agua
/home/usuarie/musicaradio/VientodeAgua/DePuertoRicoAlMundo/FiestadePlena.mp3

Y listo, así la canción se añade a la lista de la tarde.

Cacharreo

Mostrar las últimas carpetas que fueron creadas

find ~ -type d | ls -ltra | tail -10

Esto comando muestra las últimas 10 carpetas que fueron creadas. Se pude editar el comando `tail` para mostrar la cantidad que se quiera.

Añadir "últimas canciones" en la web

Si bien Icecast2 no recomienda editar sus ".xsl", nosotres nos aventuramos. :)

Para poder mostrar las últimas canciones que han sonado en la radio incrustramos un ".txt" que las muestra.

Hicimos un script (.sh) que extrae la últimas canciones que han sonado del log de liquidsoap. Luego elimina parte de la dirección (path) de las carpetas. Eso lo convierte en un ".txt" y ese archivo lo incrustramos en la página de icecast.

El script (.sh) contiene lo siguiente:

#!/bin/bash
tail -n 20 /liquidsoap/log/radio.log | grep RID | cut -d '"' -f 2 > /usr/share/icecast2/web/ultimas.txt
sed -i 's/\/home//' /usr/share/icecast2/web/ultimas.txt
sed -i 's/.mp3//' /usr/share/icecast2/web/ultimas.txt
echo Listo

Vamos por paso.

tail -n 20 /liquidsoap/log/radio.log | grep RID | cut -d '"' -f 2 > /usr/share/icecast2/web/ultimas.txt`

Este comando es una composición de varios. El primer comando es `tail`, que muestra las últimas líneas del archivo que le indicas. En este caso le estamos diciendo que nos muestre las últimas 20 líneas (`-n 20`) del log de liquidsoap.

Luego lo pareamos con que solo muestre las líneas que tienen "RID", con `grep RID`.

A la vez le decimos que solo muestre lo que esta entre comillas, que en este caso es la dirección (path) de la canción. Eso lo logramos con `cut -d '"' -f 2`.

Luego le decimos que el resultado de esos comandos lo convierta en un archivo llamado "ultimas.txt" y que lo coloque en /usr/share/icecast2/web/ (donde estan los archivos de la página web).

Una línea dentro del archivo ".txt" se ve de la siguiente forma:

/home/musicaradio/CERO39/MontateenelViaje/Corozo.mp3

sed -i 's/\/home//' /usr/share/icecast2/web/ultimas.txt

Este comando con "sed" elimina la parte de la dirección que dice "/home/", en las líneas del ".txt". Esto lo hacemos por motivos de seguridad.

El resultado es:

/musicaradio/CERO39/MontateenelViaje/Corozo.mp3

sed -i 's/.mp3//' /usr/share/icecast2/web/ultimas.txt

Por último, este comando "sed" elimina los ".mp3" al final de cada línea. Esto lo hacemos más por motivos estéticos.

Al final del script escribimos "echo Listo" para saber que el script se ejecutó exitosamente.

Con este script guardado (guardado como "ultimas.sh", por ejemplo) podemos hacer que se ejecute cada cierta cantidad de tiempo. Eso lo logramos con un "cronjob".

$ crontab -e

Dentro de ese archivo, al final, escribimos la siguiente línea. Este ejemplo esta hecho para correr el script cada minuto:

* * * * * cd /home/ && sh ultimas.sh

Con este script automatizamos las últimas canciones que están sonando en la radio.

Ahora necesitamos "incrustrar" ese ".txt" en nuestra página.

En el archivo "status.xsl" de la carpeta de icecast (/usr/share/icecast2/web/status.xsl) incluímos lo siguiente:

<object data="ultimas.txt" type="text/plain" width="500" style="height: 250px"></object>

El grosor y la altura la determinas a gusto.

El resultado final debe mostrar algo parecido a:

/musicaradio/CERO39/MontateenelViaje/Corozo
/musicaradio/Pachyman/InDub/Uptown
/musicaradio/YesserTejeda/Kijombo/SwingRipiaoftElProdigio
/musicaradio/Separadores/separadorazul
/musicaradio/AustinTV/LaUltimaNochedelMundo/Rucci

Actualizar yt-dlp

En nuestro servidor tenemos instalado `yt-dlp` de acuerdo a las instrucciones oficiales donde se descarga directamente el binario:

yt-dlp Installation - Using the release binary

Para actualizarlo, como root, hay que realizar lo siguiente:

# yt-dlp -U

Extras

AURA

Una futura opción de interface gráfica para manejo de la radio.