Música en Android usando rsync sobre SSH

Thursday, 10 de January de 2013 » linux  tips 

He caído. Me he pasado a Android. Y una de las necesidades que me han surgido ha sido la de sincronizar mi librería de música de alguna forma.

El primer intento ha sido Spotify y la suscripción que uso normalmente… y no funciona demasiado bien en Android: con librerías grandes es lento y pesado, y no me interesa mezclar mis librerías de Spotify y "clásicas".

El siguiente intento ha sido Google Play Music: éste soporta streaming y caché local a través de Play Music (servicio gratuito de Google), pero requiere cargar antes al servicio la librería. Y después de varios días para subir más de 20 GB desde el ordenador, y de esperar para que se sincronizase de nuevo al móvil (pinning), ha empezado a dar fallos, como archivos que desaparecen de la caché.

Existe otra opción: copiarla a una SD (en mi caso, una de 32 GB, que además son muy baratas), y usar Apollo o Play Music mismamente para reproducir música.

Aquí es donde entra en juego rsync. Sincronizar tantos gigas de música, que además va cambiando, es de todo menos divertido.

Lo primero pasa por instalar un cliente SSH en el móvil previamente rooteado, como dropbeard, que es gratuito. Después de añadir la clave (en OSX o Linux basta con generarla usando ssh-keygen) y copiarla al móvil para seleccionarlo desde Dropbear).

Después, y ya mediante SSH, hay que instalar el binario de rsync. Se puede descargar aquí y una vez copiado a la SD sólo queda copiarlo a /system/xbin/. Como está protegido, hay que volver a montar el volumen en read-write de la siguiente manera (y vuelta atrás en read-only):

root@android:/system/xbin# busybox mount -o remount,rw /system
root@android:/system/xbin# cp /sdcard/rsync /system/xbin/
root@android:/system/xbin# busybox mount -o remount,ro /system

Después de eso, sólo queda crear una carpeta en la SD para guardar la música y lanzar el proceso de rsync desde nuestro ordenador. En mi caso, he usado el siguiente comando:

$ rsync -e ssh -rltP --delete --exclude=".*" \
             /Users/Adrian/Music/MusicLibrary/ root@192.168.0.100:/sdcard/Music/

La explicación es sencilla. Por una parte, se ejecuta por SSH según los parámetros estándar (si no, se especificaría el puerto por ejemplo, pasándolo en el parámetro -e).

Hace una copia recursiva (-r, carpetas y sus contenidos), conservando enlaces (-l) y marcas de tiempo (-t, casi imprescindible para agilizar futuras sincronizaciones). Además, muestra progreso.

También suprime los archivos remotos que no concuerden con lo local (convirtiendo la carpeta de la SD en un "espejo" de lo que tenemos en local) y excluye archivos ocultos de la sincronización (los puñeteros .DS_Store, por ejemplo).

Ya sólo queda sincronizar todo. Puede tardar, pero teniendo control sobre el proceso al menos no ocurrirán las desgracias que ocurren con otros sistemas, y siempre mantenemos control sobre nuestros datos. Si se da el caso de que la música no aparece en las distintas aplicaciones, desmontar la SD y volverla a montar desde las preferencias es suficiente para que se "refresquen".

Además, se puede guardar el comando de rsync en el fichero .bash_profile en forma de alias, para que de esta forma baste con ejecutar un comando (p.ej, "sync") en la terminal para que se sincronice. Muy útil si el móvil siempre conserva la misma IP y se sincroniza siempre en el mismo entorno.