domingo, 22 de septiembre de 2019

Synology NAS: Descargar música con streamripper

La música en streaming es un gran invento, pero no tanto si para oírla tienes que gastas datos de tu tarifa o quedarte bloqueado en algún lugar de trabajo que no permita esas condiciones. Una solución es simplemente descargarla a partir del URL del stream (canal) de música, por ejemplo con streamWriter para Windows, que va muy, muy bien.

¿Y si queremos que lo haga una NAS de Synology, ahí en su cuartito y sin dejar el PC principal endendido toda la noche?

Parental advisory: Sigue estos pasos si te sientes con confianza en la línea de comandos de Linux.

Paso 1: Activa el acceso por SSH, accede como admin y hazte root

Para activar SSH simplemente sigue las instrucciones de How to login to DSM with root permission via SSH/Telnet, que te cuentan todo lo necesario para ganar permisos de root ("un gran poder conlleva una gran responsabilidad"). Puedes descargar el binario de putty.exe de putty.org. Personalmente, nunca he llegado a usar el instalador.

Paso 2: Instala iPKG

iPKG es la herramienta mágica que permite descargar paquetes de nuevas funcionalidades, como por ejemplo streamripper. Sigo las indicaciones de la wiki alemana, traducira por Google.

Puedes ir por lo duro con

~# cat /proc/cpuinfo |more
processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 92
model name      : Intel(R) Celeron(R) CPU J3455 @ 1.50GHz

O acortar/contrastar con la guía de procesadores de Synology. Para mi DS918+

DS918+ Intel Celeron J3455 Quad Core 4 Yes Apollolake DDR3L SO-DIMM 4GB

Primera duda, la wiki alemana habla de Intel Atom, yo tengo un Intel Celeron de GenuineIntel. Salto a esta otra guía en inglés, y viendo que también me da

# uname --machine
x86_64

tiro por la calle de en medio con lo que se suponía era para Intel Atom.

# cd /volume1/fitxers/
# mkdir bin
# cd bin

# wget http://ipkg.nslu2-linux.org/feeds/optware/syno-i686/cross/unstable/syno-i686-bootstrap_1.2-7_i686.xsh
--2019-09-22 11:21:00--  http://ipkg.nslu2-linux.org/feeds/optware/syno-i686/cross/unstable/syno-i686-bootstrap_1.2-7_i686.xsh
Resolving ipkg.nslu2-linux.org... 23.141.224.193
Connecting to ipkg.nslu2-linux.org|23.141.224.193|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 249507 (244K) [text/plain]
Saving to: 'syno-i686-bootstrap_1.2-7_i686.xsh'
syno-i686-bootstrap_1.2-7_i686.xsh 100%[=======>] 243.66K   370KB/s    in 0.7s
2019-09-22 11:21:02 (370 KB/s) - 'syno-i686-bootstrap_1.2-7_i686.xsh' saved [249507/249507]

#  chmod +x syno-i686-bootstrap_1.2-7_i686.xsh

# sh syno-i686-bootstrap_1.2-7_i686.xsh
Optware Bootstrap for syno-i686.
Extracting archive... please wait
bootstrap/
bootstrap/bootstrap.sh
bootstrap/ipkg-opt.ipk
1216+1 records in
1216+1 records out
249302 bytes (249 kB) copied, 0.0162184 s, 15.4 MB/s
bootstrap/ipkg.sh
bootstrap/optware-bootstrap.ipk
bootstrap/wget.ipk
Creating temporary ipkg repository...
Installing optware-bootstrap package...
Unpacking optware-bootstrap.ipk...Done.
Configuring optware-bootstrap.ipk...Modifying /etc/rc.local
Done.
Installing ipkg...
Unpacking ipkg-opt.ipk...Done.
Configuring ipkg-opt.ipk...Done.
Removing temporary ipkg repository...
Installing wget...
Installing wget (1.12-2) to root...
Configuring wget
Successfully terminated.
Creating /opt/etc/ipkg/cross-feed.conf...
Setup complete.

# ipkg --version
ipkg version 0.99.163

# rm syno-i686-bootstrap_1.2-7_i686.xsh
# cd ..
# rmdir bin

Vaya por $DEITY, más cobardes de la pradera en versión 0.99 sin atreverse a sacar una 1.0 ;)

La wiki alemana dice que en el perfil de root /opt/bin y /opt/sbin han de estar en PATH. Salimos Ctrl-D y volvemos a entrar sudo -i, y verificamos

~# echo $PATH | grep opt
/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin

Paso 3: Instala streamripper

Y por fin llega el momento mágico de instalar streamripper.

# ipkg install streamripper
Nothing to be done
An error ocurred, return value: 4.
Collected errors:
Cannot find package streamripper.
Check the spelling or perhaps run 'ipkg update'

Un momento aquí qué ha pasado mecagüen mi p*t* calavera, ¿errores, really?

Ah, que dice que hagamos un update y veremos como se baja los índices...

# ipkg update
Downloading http://ipkg.nslu2-linux.org/feeds/optware/syno-i686/cross/unstable/Packages.gz
Inflating http://ipkg.nslu2-linux.org/feeds/optware/syno-i686/cross/unstable/Packages.gz
Updated list of available packages in /opt/lib/ipkg/lists/cross
Successfully terminated.

Y ahora si, momento mágico:

# ipkg install streamripper
Installing streamripper (1.64.6-1) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/.../unstable/streamripper_1.64.6-1_i686.ipk
Installing faad2 (2.6-3) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/.../unstable/faad2_2.6-3_i686.ipk
Installing glib (2.20.4-1) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/.../unstable/glib_2.20.4-1_i686.ipk
Installing libmad (0.15.1b-4) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/.../unstable/libmad_0.15.1b-4_i686.ipk
Installing libogg (1.2.1-1) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/.../unstable/libogg_1.2.1-1_i686.ipk
Installing libvorbis (1.3.2-1) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/.../unstable/libvorbis_1.3.2-1_i686.ipk
Configuring faad2
Configuring glib
Configuring libmad
Configuring libogg
Configuring libvorbis
Configuring streamripper
Successfully terminated.

¡Hecho! Aunque parece ser que sólo funciona para root.

~# streamripper --version
Streamripper 1.64.6

Paso 4: Ejecuta streamripper

Para la primera ejecución, no tiene historia. El primer parámetro es el URL del stream. Con -d indicamos el directorio de destino. Dentro de el creará un directorio con el nombre declarado del canal (stream: Lounge - RadioTunes Premium) en el que guardará todas las canciones que hayan sonado completas. Las que estén a medias van a un subdirectorio "incomplete". Estas son la que pillas a medio ejecutar cuando arrancas, la que no ha acabado en el momento de parar, y la que esté sonando en ese momento.

# streamripper http://prem2.radiotunes.com:80/rtlounge_hi?{clavePrivadaEscondida} \
-d /volume1/fitxers/musica/radiotunes
Connecting...
stream: Lounge - RadioTunes Premium
server name: Icecast 2.4.0-kh3
declared bitrate: 320
meta interval: 16000
[skipping...   ] Cosmo Notes - Dreaming [  2.96M]
[ripping...    ] Chris Le Blanc - Enjoy Your Life (Spa Mix) [  9.50M]
[ripping...    ] Aquarius - Field of Happiness [  8.72M]
^C
shutting down
bye..

Para parar, basta el Ctrl-C. Si queremos dejarlo grabando y desconectarnos de la NAS, está la opción.

Para poder dejar el terminal cerrado, basta indicar --quiet ("mudo", evita que para cada canción  escriba varias líneas de estado a medida que avanza) y el operador & al final para dejar ejecutando en segundo plano. 

El número que sale por pantalla es el identificador de proceso, necesario para finalizar con kill. Si no lo apuntas y lo olvidas, lo puedes sacar con ps filtrado por grep.

# streamripper http://prem2.radiotunes.com:80/rtlounge_hi?{clavePrivadaEscondida}\
-d /volume1/fitxers/musica/radiotunes  --quiet &
[1] 7169
# ps -ef | grep streamripper
root      7169  5251  0 12:27 pts/7    00:00:00 streamripper http://prem2...
root      7178  5251  0 12:27 pts/7    00:00:00 grep --color=auto streamripper
# kill 7169

Y ya está. 

Con streamripper -h puedes ver las opciones. Por ejemplo:
  • -l con el número de segundos, para grabar un programa de duración determinada.
  • -q para numerar las pistas grabadas, por si quieres escucharlas ordenadamente
  • -D define el directorio de destino pero usando la plantilla que le des, no un valor directorio de destino. Esto puede ser útil por ejemplo cuando el nombre del canal tiene caracteres reservados por el sistema de fichero, caso de los '*' en el nombre del canal.