PSR001 Homelab: Música
Reflexiones sobre el panorama musical actual y guía sobre cómo montar un sistema funcional y gratuito, con el que poder escuchar tu música sin depender de terceros.
Buenas a todos!
Los que me conocen saben que he estado obsesionado últimamente con un proyecto casero de lo que online se conoce como “Homelab”. Para los que no lo sepan, un Homelab no es más que un laboratorio casero en el que experimentar con diferentes tecnologías y servicios, todos (o casi todos) de código abierto. Es una forma increíble de aprender, y la verdad es que es tremendamente divertido también.
Después de andar experimentando un tiempo con esta idea, decidí ponerme un poco más en serio con el tema y pasar a lo que se conoce en el mundo de IT de “testeo a producción”. Es decir, montar un stack de servicios de código abierto y (prácticamente) gratuito y casero que pueda usar en mi día a día, buscando un máximo control sobre mi infraestructura digital y mi información personal.
Esta es la primera entrega de una nueva serie en la que trataré de mostrar algunas pinceladas de cómo he ido abordando este proceso, comenzando por mi stack de música. Creo que lo interesante (o al menos, lo más novedoso) de mi aproximación es que intentaré abordarlo no solo desde un punto de vista descriptivo y algo técnico, sino ahondar y reflexionar sobre cuestiones más de fondo.
DISCLAIMER - Pronto elaboraré la parte 0 de esta entrega, donde hablaré de forma un poco más general acerca de la filosofía detrás de este proyecto, el por qué pienso que es importante intentar descentralizar lo máximo posible lo que consumimos en el mundo digital, y cómo todos podemos intentar mejorar nuestra privacidad, seguridad y control sobre nuestros datos.
DISCLAIMER II - Este post no hace un detallado técnico paso a paso de cómo desplegar los servicios. Durante el artículo daré algunas pinceladas, pero cada uno de los servicios está suficientemente bien documentado de por sí. Junto con alguna guía más que comento por ahí, y con un poco de ayuda de la IA, veo más relevante aportar una idea de arquitectura que otra cosa.
Introducción
Mi interés por este proyecto surge esencialmente por dos motivos:
- La necesidad de modificar el tipo de consumo de música que venía adoptando hasta ahora.
- Tratar de eliminar por completo mi dependencia de las plataformas de streaming, en especial Spotify.
Trataré de ser breve en ambos puntos, puesto que podría extenderme enormemente, y probablemente esto necesitase de varias entradas del blog. Aun así, creo que es importante describirlos para entender mejor la postura desde la que parto, y así podáis entender un poco mejor mi, ejem, gorrito de plata.
La crisis musical actual
La tecnología, y en especial las redes sociales, han acelerado el consumo de cualquier forma de creación artística. La música no es ninguna excepción. Gran parte de los lanzamientos comerciales han tendido a reducir tanto la longitud de sus temas como el formato. Muchos artistas ya no buscan lanzar un álbum de 1h con canciones de 9 minutos en las que tratan de expresar ciertas ideas, emociones o protestas, porque saben que no es lo que vende, ni lo que engancha.
Redes sociales como TikTok exacerban este fenómeno, puesto que sus cortos vídeos suelen contener canciones de escasa duración, versionadas muchas veces por sabe Dios quién (o qué), y con un foco en una melodía que enganche rápidamente, pero vacía de contenido artístico como tal. Hubo un momento en el que me di cuenta de que este efecto había tenido un impacto real en mi forma de consumir música. Habéis entrado en perfiles de artistas en Spotify/SoundCloud o YouTube Music a explorar, solo para escuchar sus temas más populares? Habéis escuchado los álbumes enteros de la mayoría de artistas que os gustan? Soléis escuchar los temas desde el principio hasta que terminan? Yo conozco mis respuestas a estas preguntas, y cuando me las planteé no me gustó el resultado de mi autocrítica.
Aun así, quiero dejar claro desde ya que este artículo no busca señalizar virtud ni mostrar superioridad moral de ningún tipo. Simplemente busco instar a reflexionar sobre ciertas formas de consumo que predominan hoy por hoy, que desde mi óptica no son más que manifestaciones de un capitalismo rampante y autodestructivo, y sobre su influencia en productores, artistas y consumidores.
El Éxodo Spotify
¿Por qué debería dejar de utilizar Spotify? Esta es la pregunta que la mayoría de la gente se estará haciendo. Mi principal motivación con este artículo es instar a abandonar especialmente esta plataforma, puesto que otras plataformas de streaming como Qobuz, Tidal o por supuesto, Bandcamp (de momento), se salvan. Mi especial inquina con Spotify proviene de motivos éticos.
El fundador de Spotify, Daniel Ek, invirtió 600 millones de euros el año pasado en Helsing, una empresa orientada al desarrollo de tecnología militar con inteligencia artificial. Asimismo, es conocida la considerable donación de esta compañía a la segunda ceremonia de inauguración de la presidencia de Trump.
En varias entrevistas, Ek sugirió que los artistas modernos deben mantener un flujo constante de contenido, exigiendo a los músicos trabajar como si fuesen creadores de contenido de redes sociales, en lugar de ser artistas. Lamentable.
Otro de los motivos para esto son las insignificantes regalías que Spotify paga a los artistas, en una horquilla que va desde los 3$ hasta los 5$ por cada 1000 reproducciones. Para contrastar, Qobuz ofrece 18.73$, y con Bandcamp el artista recibe hasta el 82% del dinero.
Ni siquiera voy a profundizar mucho en el tema de la IA en la plataforma, que es absolutamente distópico. Desde perfiles inflados con bots, pasando por música creada por IA, hasta cosas aún más horribles… solo con estas consideraciones ya hay motivos de sobra para boicotear a esta compañía.
Y por terminar con este asalto, queda el gran problema de la centralización. Spotify controla más del 30% del streaming mundial. Sus algoritmos deciden quién triunfa (o sobrevive) en la escena musical y quién muere. Todo lo que no encaje con su modelo de negocio está condenado a desaparecer.
La cura
Pero hay motivos más que suficientes para mantenerse optimista frente a semejante panorama. Mi objetivo es motivar al lector a pasar a un tipo de consumo menos pasivo (el algoritmo me dice lo que debo escuchar) y más selectivo/activo (yo busco y elijo qué escuchar y cómo). Pasar de un rol más consumista a uno más participativo, que ayude a mantener el ecosistema desde la comunidad. Para mí, la cura se sustenta en varios conceptos:
Tus datos siempre a la venta
Por supuesto, para mí la razón con más peso es la privacidad y la libertad. Escapar de los algoritmos es algo no solamente posible, sino necesario hoy día. El stack descrito más abajo no solo proporciona control y soberanía; no más anuncios, no más metadatos para empresas de marketing agresivo, no más algoritmos manipuladores. Ek dejará de saber qué escuchas, cuándo, cuántas veces, con qué frecuencia… solo con esto yo ya estoy dentro.
“Hoarding Goblin”
Poseer música, tanto física como digitalmente, es una forma fantástica de recuperar la soberanía cultural. Esto se conoce en la cultura popular de internet como “data hoarding” o preservación activa. Planteo lo siguiente: y si una distribuidora tiene un problema legal con un artista y su música desaparece de la plataforma? Es cierto que responsabilizarse del medio es más inconveniente, pero la recompensa es muy satisfactoria y genera mucha menor dependencia de corporaciones.
Los bolos y el merchan
Por supuesto, una de las mejores formas de apoyar a los artistas hoy por hoy no es solo comprando su música, sino asistiendo a sus conciertos y comprando su merchandising. Si tenemos en cuenta que 1000 reproducciones dan a un artista para un café y poco más, una camiseta que cueste 30$ le supondrá bastante más dinerito al artista, aun teniendo en cuenta intermediarios.
¿Física o digital? No importa!
Coleccionar música física (CDs o vinilos) es algo que me encantaría empezar a hacer. Ya sea comprando en tiendas de segunda mano o en distribuidores oficiales, tener una biblioteca física de música es un hobby fantástico. El problema es que necesitas algún medio para reproducirla, cosa de la que hoy por hoy carezco (en un futuro probablemente esto cambie). En estos últimos años parece que esto que digo se está convirtiendo en tendencia mundial, con cifras que parecen mostrar que la música física está lejos de ser algo del pasado a pesar de la popularidad del streaming. Aunque aún no tenga un equipo de sonido, la música que compro es toda digital, fundamentalmente a través de plataformas como Bandcamp. En un futuro próximo planteo comprarme también un burner externo de CD/DVD para tener mis discos favoritos en físico también.
Peero en última instancia… solo queda surcar Los Mares 🏴☠
No pretendo ser hipócrita tampoco. Es más, el stack que he generado tiene mucho foco también en obtener música de la comunidad directamente. Sigo poniendo el foco en la importancia de apoyar a los artistas y comprar música directamente. Pero conozco mis patrones de consumo, soy humano también, y sé cómo pensamos todos. El volumen de música que escucho es demasiado grande para lo que mi cartera puede permitirse. Aunque bien es cierto que desde que dejé las plataformas de streaming compro más música que nunca, también he vuelto a 🏴☠ más música que nunca. Cada cual debe sacar sus propias conclusiones y entender sus limitaciones.
Ahora que he articulado mis pensamientos al respecto del porqué, toca cambiar al qué y un poco el cómo. Prosigamos.
Arquitectura general
Vamos primero con un diagrama general de la arquitectura según los servicios que componen el stack.
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#1e1e2e',
'primaryTextColor': '#cdd6f4',
'primaryBorderColor': '#89b4fa',
'lineColor': '#9399b2',
'secondaryColor': '#313244',
'tertiaryColor': '#11111b',
'mainBkg': '#1e1e2e',
'nodeBorder': '#89b4fa',
'clusterBkg': '#181825',
'clusterBorder': '#45475a',
'titleColor': '#f5e0dc'
}
} }%%
graph TD
%% Define Node Styles for Dark Mode
classDef client fill:#313244,stroke:#fab387,stroke-width:2px,color:#cdd6f4;
classDef server fill:#313244,stroke:#89b4fa,stroke-width:2px,color:#cdd6f4;
classDef external fill:#313244,stroke:#f38ba8,stroke-width:2px,color:#cdd6f4;
classDef storage fill:#313244,stroke:#a6e3a1,stroke-width:2px,color:#cdd6f4;
classDef plugins fill:#313244,stroke:#db0000,stroke-width:2px,color:#cdd6f4;
classDef downloaders fill:#313244,stroke:#f2e160,stroke-width:2px,color:#cdd6f4;
%% Android client
subgraph android_client [fa:fa-android Cliente Android  ]
Symfonium([fa:fa-play Symfonium ])
end
%% Desktop client
subgraph desktop_client [fa:fa-desktop Cliente escritorio  ]
Feishin([fa:fa-music Feishin ])
end
%% External
subgraph Internet [fa:fa-globe APIs externas ]
Musicbrainz(fa:fa-database Musicbrainz )
Lastfm(fa:fa-lastfm Last.fm )
end
%% BMAX Homelab
subgraph BMAX [fa:fa-server Homelab ]
direction TB
Navi(fa:fa-broadcast-tower Navidrome )
Lidarr(fa:fa-compact-disc Lidarr )
Prowl(fa:fa-search Prowlarr )
Aurral(fa:fa-wand-magic-sparkles Aurral )
subgraph Downloaders [fa:fa-cloud-download Clientes de descarga  ]
SAB(fa:fa-box SABnzbd )
SLSKD(fa:fa-network-wired slskd )
QBIT(fa:fa-magnet qBittorrent )
end
subgraph Plugins [fa:fa-plug Hooks y plugins  ]
Tubi(fa:fa-youtube Tubifarry )
BCSync(fa:fa-cart-shopping Bandcampsync )
end
end
%% Storage
subgraph Storage [fa:fa-hdd Almacenamiento físico  ]
Music[(fa:fa-folder-open Librería )]
end
%% Connections
Symfonium === Navi
Feishin === Navi
Lidarr <-->|Metadatos | Prowl
Lidarr -.->|Trigger | Downloaders
Tubi -.->|Monitoriza  | Lidarr
BCSync -.->|Sync | Lidarr
Aurral -.->|Solicita | Lidarr
Navi -.->|Scrobble | Lastfm
Musicbrainz -.->|Metadatos | Lastfm
Lastfm -.->|Histoial | Aurral
Musicbrainz -.->|Insights | Aurral
SAB --> Music
QBIT --> Music
SLSKD --> Music
Tubi --> Music
BCSync --> Music
Navi --> Music
%% Apply Styles
class Symfonium,Feishin client;
class Navi,Lidarr,Prowl,Aurral server;
class SAB,SLSKD,QBIT downloaders;
class BCSync,Tubi plugins;
class Musicbrainz,Lastfm external;
class Music storage; Por hacer un comentario general de la estructura, esencialmente hago streaming de la música a través de un cliente de escritorio o de Android, y toda la “magia” ocurre por detrás. A través de Aurral, puedo descubrir artistas nuevos y solicitar álbumes para que sean monitorizados y descargados automáticamente, todo desde el móvil también. Intentaré comentar algunos de los componentes más importantes a continuación.
El núcleo duro: Navidrome y Lidarr
Navidrome
El núcleo duro de este stack lo componen sin duda la plataforma de streaming de música, el maravilloso Navidrome, y Lidarr.
Los motivos por los que escogí Navidrome son:
- Es de código abierto.
- Es ligero (50MB de RAM) y fácil de usar.
- Permite ser auto-alojado mediante contenedor de Docker.
- Es compatible con la API de Subsonic, lo que permite conectarlo a los clientes de reproducción (Symfonium/Feishin).
Además, es compatible con una amplia variedad de formatos de audio, y tiene una interfaz web muy intuitiva. Ojo que este es el servidor y no el reproductor, tiene uno integrado, pero es bastante pobre.

Navidrome
Asimismo, tal y como se muestra en el diagrama, Navidrome se puede enlazar con dos APIs externas: Last.fm para el “scrobbling” de las canciones que escucho, y Musicbrainz para obtener metadatos de los artistas y álbumes de mi librería. Estos metadatos serán muy útiles cuando expliquemos cómo los utiliza Aurral.
Aquí el fichero de Docker compose que utilizo:
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
user: "1000:1000" # Para que el contenedor corra como vuestro usuario
ports:
- "4533:4533"
restart: unless-stopped
environment:
ND_SCANSCHEDULE: "@every 1h" # Frecuencia de escaneo de la librería
ND_LOGLEVEL: debug
ND_SESSIONTIMEOUT: 24h
ND_BASEURL: ""
ND_COVERARTPRIORITY: cover.*,folder.*,front.*,embedded,external
ND_LASTFM_APIKEY: # Tu llave de API de Last.fm
ND_LASTFM_SECRET: # El secreto de la API de Last.fm
volumes:
- /data/navidrome:/data # Ruta donde queráis almacenar los datos de Navidrome
- /data/media/music:/music:ro # Mapeo de la librería gestionada por Lidarr (read-only)
networks:
- proxy_network # En mi caso, eso es necesario para que tanto Navidrome como NPM (el proxy) estén en la misma red.
networks:
proxy_network:
external: true Algunas consideraciones:
- Estando tanto Navidrome como NPM en una red compartida (proxy_network), puedo crear una entrada en NPM y así acceder a Navidrome desde mi VPN a través del dominio https://navidrome.h3lkias.xyz. Mucho más sencillo y sin complicaciones.
ND_SCANSCHEDULE: Por defecto, Navidrome no escanea cambios instantáneamente. Yo lo tengo configurado para que, por ejemplo, cada hora (@every 1h) detecte nuevas adquisiciones de Lidarr sin intervención manual.ND_LOGLEVEL: Durante el setup, recomiendo ponerlo en debug. Si una carpeta no aparece, el log te dirá si es por permisos o por formato de archivo.- Transcoding: Para tener más fluidez a la hora de reproducir desde Symfonium, recomiendo activar la transcodificación a 320 kbps para el cliente. Esto no es más que cambiar de un códec a otro para mejorar tiempos de respuesta, puesto que mi librería se encuentra en un ~98% en formato FLAC. Estos archivos son más pesados, y MP3 a un bitrate de 320 es más que suficiente para disfrutar de una calidad de audio muy buena.
Lidarr
Como habréis podido observar en el diagrama, la segunda pieza fundamental es Lidarr. En este caso, Lidarr actúa como un gestor de adquisiciones para conseguir, organizar y etiquetar la música que luego Navidrome puede servir.

Lidarr
Lidarr es un fork de Sonarr/Radarr adaptado específicamente para música, y enfocado en el concepto de “releases” o lanzamientos. Esto es una consideración importante a tener en cuenta porque con Lidarr es bastante más complejo gestionar canciones sueltas. Si planeas tener una librería clasificada por álbumes de artistas, Lidarr será tu mejor amigo. Si tienes una amalgama de música desordenada o basada en canciones sueltas, con distinta nomenclatura y de diferentes formatos… quizás esta no sea tu mejor solución.
Aquí muestro la estructura de carpetas del disco externo sobre el que tengo montada la librería.
/mnt
└── /data
├── torrents/
├── usenet/
└── complete/
└── music/
└── incomplete/
├── soulseek/
└── media/
└── music/ Lidarr permite monitorización activa. Según como lo configures, puedes decidir monitorizar artistas enteros y álbumes futuros/que no tengas. Lidarr consultará constantemente bases de datos (principalmente MusicBrainz) para saber si han sacado algo nuevo y lo mandará a la cola de descargas. Asimismo, puedes monitorizar discografías enteras de artistas, y lo mismo hará con los lanzamientos que te falten.
Tienen otras muchas funcionalidades, como renombrado automático de archivos según un patrón, configuración de perfiles de calidad (por ejemplo solo quiero calidad lossless en FLAC y con un tamaño máximo determinado) o enriquecimiento de metadatos a través de MusicBrainz. He mencionado en varias ocasiones esta plataforma, pero es que es fenomenal. Es, en esencia, la fuente de información musical definitiva. Si algo no está aquí, digamos que probablemente sea muy pero que muy underground (yo todavía no tuve problemas, toda la música que escucho está ahí, y eso que no escucho precisamente música popular y tengo más de 450 álbumes).
Recomiendo encarecidamente seguir las guías de TRaSH, y en especial para Lidarr la Davo’s Community Guide. Aquí se detalla perfectamente y al detalle no solo cómo configurar Lidarr, sino cómo configurar los indexadores y clientes de descarga.
services:
lidarr:
image: lscr.io/linuxserver/lidarr:nightly
container_name: lidarr
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid
volumes:
- /data/lidarr/config:/config
- /data:/data # Directorio raíz
ports:
- 8686:8686
networks:
- proxy_network
networks:
proxy_network:
external: true Una particularidad es que uso la imagen de Docker nightly, no la latest. Esta es la única forma de poder utilizar plugins dentro de Lidarr, algo a tener en cuenta y que me costó encontrar al principio.
Adquisición de música
Para la adquisición de música, utilizo una combinación de tanto protocolos P2P como adquisiciones legítimas a través de Bandcamp. Esta parte del stack se compone de:
Prowlarr
Su función es centralizar todos tus indexadores (sitios de torrents o Usenet). En lugar de configurar cada sitio en Lidarr, los configuras una vez en Prowlarr y este los “sincroniza” con todas tus aplicaciones del stack *arr. En este caso es quizás un servicio que sobre, pero si en el futuro utilizas Sonarr para series o Radarr para películas, la cosa cambia.
SABnzbd
Recibe los archivos .nzb de Lidarr (vía Prowlarr), los descarga, los repara (usando archivos PAR2 si están corruptos) y los descomprime. La principal ventaja de NZB frente a los torrents es la arquitectura cliente-servidor. Esto proporciona mayor velocidad, confianza y estabilidad a las descargas.
qBittorrent
A modo de redundancia, está muy bien tener un par de indexadores de Torrents. Esto incrementa las posibilidades de encontrar lanzamientos un poco menos oscuros, aunque personalmente en mi setup rara vez se descargan a través de esto.
slskd
Soulseek sigue siendo la meca de la música rara; es una auténtica mina de oro para ripeos de vinilos descatalogados y lanzamientos que no están en ninguna otra parte. slskd es la versión moderna y “headless” de este protocolo.
Configurar los clientes y el indexador para que utilicen solo la VPN y ajustar sus configuraciones para que todo funcionase me llevó tiempo y paciencia. En mi caso, utilizo Gluetun con una configuración descargada de WireGuard de mi cuenta de ProtonVPN. De esta forma, los contenedores salen a internet usando Gluetun como interfaz, y por tanto siempre dentro de la VPN. Decidí poner todos los servicios en el mismo docker-compose.yml para que todos dependan de que tanto Gluetun (usando el depends_on) como el túnel de la VPN, se levanten correctamente. He aquí el archivo completo:
services:
gluetun:
image: qmcgaw/gluetun:latest
container_name: gluetun
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
ports:
- 8089:8089/tcp # qBittorrent Web UI
- 8080:8080/tcp # SABnzbd Web UI
- 9696:9696/tcp # Prowlarr Web UI
- 5030:5040/tcp # slskd Web UI
volumes:
- /home/data/gluetun/scripts/update_slskd.sh:/gluetun/update_slskd.sh:ro # Script para actualizar los clientes con el puerto nuevo
environment:
- VPN_SERVICE_PROVIDER=protonvpn
- VPN_TYPE=wireguard
- VPN_PORT_FORWARDING=on
- WIREGUARD_PRIVATE_KEY=PRIVATE_KEY
- WIREGUARD_MTU=1300
- SERVER_COUNTRIES=Spain
- FIREWALL_VPN_INPUT_PORTS=50305
- FIREWALL_OUTBOUND_SUBNETS=172.16.0.0/12,192.168.0.0/24
- HTTP_CONTROL_SERVER_AUTH_DEFAULT_ROLE='{"auth":"apikey","apikey":"API_KEY"}'
- VPN_PORT_FORWARDING_UP_COMMAND=/gluetun/update_slskd.sh {{PORT}}
restart: unless-stopped
networks:
- proxy_network
healthcheck:
test: ["CMD", "wget", "-qO-", "http://127.0.0.1:9999/ready"]
interval: 10s
timeout: 5s
retries: 5
start_period: 20s
slskd:
image: slskd/slskd
container_name: slskd
user: "1000:1000"
network_mode: "container:gluetun"
environment:
- SLSKD_HTTP_PORT=5040
- SLSKD_REMOTE_CONFIGURATION=false
- SLSKD_SHARED_DIR=/music
- TZ=Europe/Madrid
volumes:
- /home/slskd:/app
- /data/soulseek:/app/downloads
- /data/media/music:/music:ro # Dentro del directorio raíz, donde se encuentra la biblioteca de música en concreto. :ro es read-only, para evitar que slskd modifique nada (aunque no debería)
restart: unless-stopped
depends_on:
gluetun:
condition: service_healthy
sabnzbd:
image: lscr.io/linuxserver/sabnzbd:latest
container_name: sabnzbd
network_mode: "container:gluetun"
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid
volumes:
- /home/sabnzbd/config:/config
- /data/usenet:/data/usenet
restart: unless-stopped
depends_on:
gluetun:
condition: service_healthy
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
network_mode: "container:gluetun"
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid
- WEBUI_PORT=8089
volumes:
- /home/qbittorrent/config:/config
- /data/torrents:/data/torrents
restart: unless-stopped
depends_on:
gluetun:
condition: service_healthy
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
network_mode: "container:gluetun"
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid
volumes:
- /home/prowlarr/config:/config
restart: unless-stopped
depends_on:
gluetun:
condition: service_healthy
networks:
proxy_network:
external: true Una vez esto ocurre, Gluetun ejecuta un pequeño script, que manda peticiones PATCH y POST a slskd y a qBittorrent, para actualizarles con el puerto por el que Proton está haciendo el port-forwarding. El script es el siguiente:
#!/bin/sh
exec > /tmp/script.log 2>&1
NEW_PORT=$1
API_KEY="TU_APIKEY_SLSKD"
echo "Updating clients listening port to $NEW_PORT..."
# slskd port update
wget --header="X-API-Key: $API_KEY" \
--header="Content-Type: application/json" \
--post-data="{\"soulseek\":{\"listenPort\":$NEW_PORT}}" \
--method=PATCH \
http://127.0.0.1:5040/api/v0/options \
-O -
# qBittorrent port update
wget --post-data="json={\"listen_port\":$NEW_PORT}" \
http://127.0.0.1:8089/api/v2/app/setPreferences -O -
echo "Port update command sent." SABnzbd no necesita este ajuste por ejemplo.
BandcampSync
Finalmente, este es un script que actúa como hook conectado con Lidarr. Cuando compras un álbum en Bandcamp, este script detecta la compra, la descarga en la mejor calidad disponible y la inyecta directamente en tu librería. Funciona fenomenalmente. En mi caso, utilizo la variable de NOTIFY_URL para avisar a Lidarr de que debe importar lo que haya comprado nuevo a la librería y organizarlo.
services:
bandcampsync:
image: ghcr.io/meeb/bandcampsync:latest
container_name: bandcampsync
restart: unless-stopped
volumes:
- /home/bandcampsync/config:/config
- /data/bandcamp:/downloads
environment:
- TZ=Europe/Madrid
- PUID=1000
- PGID=1000
- RUN_DAILY_AT=11
- NOTIFY_URL=http://lidarr:8686/api/v1/downloadclient/scan?apiKey=API_KEY_LIDARR&path=/data/bandcamp Algunas consideraciones al respecto de esto:
- Todos estos programas deben compartir una estructura de carpetas coherente. Si SABnzbd descarga en
/downloads/usenety Lidarr busca en/downloads/completed, la automatización se romperá. Por eso puse más arriba mi estructura de carpetas. En mi caso, todos comparten el directorio raíz/data. - Estos programas son de “instalar y olvidar”, pero de vez en cuando hay que limpiar la cola de descargas fallidas en Lidarr si un archivo estaba corrupto o no tenía seeds.
Plugins y recomendaciones
Tubifarry
El único plugin que utilizo para Lidarr es Tubifarry. Este plugin es absolutamente maravilloso. Utilizo casi todas sus funcionalidades:
- SoulSeek Setup: Permite integrar slskd como un cliente/indexador en Lidarr, puesto que esto no es soportado de forma nativa por la aplicación. Solo por esto Tubifarry es excelente.
- Queue Cleaner: Este pequeño script se encarga de gestionar descargas que no se han importado a la biblioteca por X motivo (canciones que faltan, metadatos incorrectos, etc.), y gestiona los archivos pendientes en función de la configuración. Muy útil!
- Lyrics Fetcher: Esta funcionalidad sube el nivel un paso más. Permite descargar automáticamente la letra de los temas en tu biblioteca. Recoge la letra de LRCLIB y da la opción de guardarla como un fichero .lrc dentro de la carpeta del álbum, o embeberla directamente en el fichero como parte de sus metadatos. Aquí una muestra de cómo Feishin la muestra perfectamente:

Ejemplo de letra sincronizada
Nota - No he conseguido que Navidrome reproduzca correctamente la letra de las canciones, por algún motivo que desconozco. De todas formas, recomiendo usar los clientes que menciono en lugar de Navidrome directamente!- Search Sniper: Finalmente, esta última feature de Tubifarry se encarga de automáticamente realizar búsquedas de todos los álbumes que no están en tu biblioteca, pero están monitorizados y marcados como pendientes. En lugar de buscar todo a la vez, lo cual puede sobrecargar tus indexers, el Sniper selecciona uno o varios álbumes de tu lista de deseados en intervalos regulares y activa búsquedas automáticas.
Tubifarry tiene algunas otras funcionalidades más que son tremendamente útiles también, como integrar otras fuentes de metadatos como Discogs o Deezer, o un conversor de códecs automático, muy útil para algunos setups. Estas son solo las que yo utilizo.
Aurral
Finalmente, Aurral es la guinda del pastel. Se trata de un gestor de peticiones basado en recomendaciones de la música que escuchas. En lugar de un algoritmo, Aurral solo recoge métricas directas de lo que escuchas, y te sugiere artistas basados en la categorización del género/s de su música. Este sería su funcionamiento a grosso modo:
Flow
Vamos a explicar un poco el proceso.
- Solicitas escuchar canciones de tu servidor a través de Symfonium, por ejemplo. La petición viaja hasta tu servidor (Navidrome).
- Después, tu historial de Navidrome se ingesta en tu cuenta de Last.fm a través de los “scrobbles”. Objetivo: Saber exactamente qué géneros, artistas y épocas estás consumiendo en tiempo real, sin que esos datos se usen para venderte publicidad.
- Aurral se enriquece de metadatos a través de MusicBrainz para entender el contexto (subgéneros a los que pertenece, año de lanzamiento, artistas relacionados…).
- Esta es la parte más potente. Aurral puede enviar órdenes a Lidarr, para que directamente puedas monitorizar artistas y álbumes y automáticamente se añadan a tu biblioteca. Esto permite que tengas álbumes nuevos en tu biblioteca prácticamente en tiempo real!
El archivo de Docker es bastante sencillo, pero porque todas las llaves de API y demás configuraciones se pueden hacer desde la UI de forma más sencilla.
services:
aurral:
image: ghcr.io/lklynet/aurral:latest
container_name: aurral
restart: unless-stopped
ports:
- "3009:3001"
environment:
- DOWNLOAD_FOLDER=/app/downloads
- TRUST_PROXY=true
volumes:
- /home/data/aurral:/app/backend/data
networks:
- proxy_network
networks:
proxy_network:
external: true Para mi gusto, este tipo de servicios son perfectos porque ofrecen lo mejor de todos los mundos: máxima privacidad, recomendaciones ajustadas estrictamente a lo que me gusta, y un filtro orgánico y manual, de manera que soy yo el “curador” que tiene el control total de su biblioteca.
Además, la interfaz es una pasada:

Aurral
Clientes
Vamos a la parte final del setup. Estos clientes son los que permiten tener una experiencia de escucha fantástica. Sin anuncios. Con máxima disponibilidad. Muchísimas funcionalidades de Spotify. Código abierto. Y unas cuantas más. Creo que no hace falta que siga.
Feishin
Si vienes de Spotify como yo, seguramente ya te hayas acostumbrado a una interfaz y a unas funcionalidades concretas. Con Feishin te sentirás como en casa. Es un cliente de escritorio (Windows/Mac/Linux) moderno y minimalista diseñado específicamente para servidores Subsonic (como Navidrome).

Feishin
No tengo mucho que añadir al respecto; es simplemente un reproductor fenomenal.
Symfonium
Este es el cliente de Android. Tiene muchísimas funcionalidades, es muy completo. El único problema es que para tener todas las funciones debes pagarlo (pago único), pero para los 6€ que cuesta, tardé poco en comprarlo. He probado otros clientes gratuitos, pero ninguno tan siquiera se le acerca.

Symfonium
De entre las (muchas) capacidades que tiene, destacaría:
- Puedes configurarlo para que descargue automáticamente todo lo que escuchas o tus listas favoritas. Esto es especialmente útil, por ejemplo, si vas a irte de viaje en avión y no puedes disponer de conexión.
- Puedes tener un perfil de EQ para tus auriculares de cable y otro totalmente distinto para el Bluetooth del coche; Symfonium los cambia automáticamente al conectarse. Para un quisquilloso como yo, esto es una maravilla.
- Las playlists son dinámicas y se sincronizan directamente con Navidrome, de manera que las tienes en cualquier lugar instantáneamente.
Resultados y conclusión
Después de un mes con el stack completamente funcional, estas son mis conclusiones:
| Métrica | Spotify | My stack auto-alojado | ||
|---|---|---|---|---|
| Calidad de la música | Hasta 320kpbs | Ilimitada (FLAC/lossless) | ||
| Coste mensual | 11,99 €/mes | 5€ de Symfonium iniciales | ||
| Dinero al artista | ~$0.0003 - 0.0005 por stream | Apoyo directo a través de Bandcamp | ||
| Propiedad de la música | Alquilada | Es tuya para siempre | ||
| Acceso offline | Descargas limitadas | Disponibilidad completa siempre | ||
| Privacidad | Nula | Completa | ||
| Disponibilidad | La música puede desaparecer en cualquier momento | Nunca, a menos que tú lo escojas |
Con Feishin y Symfonium instalados, ya tienes el stack de música perfecto. Has pasado de ser un suscriptor que meramente alquila, a ser un archivista y curador que la posee, controla y disfruta con mejores herramientas que las que ofrece el mercado comercial.
Hasta otra!
🧙🏽♂️