Navidrome: monta tu propio servidor de streaming musical... gratis!

DeBilbao

...del mismo Bilbao
Mensajes
14.650
Reacciones
9.457
Ubicación
El Botxo
Como os comentaba en el hilo de Tailscale, estoy en un proceso de revisión del software que utilizo en mi Sagar Hozkatua, y Plex Media Server es un servidor multimedia que llevo utilizando mucho tiempo, fundamentalmente para ver películas, series y vídeos musicales usando Infuse desde el Apple TV 4K.

Plex tiene un reproductor musical llamado Plexamp, que se conecta a tu servidor Plex y si has configurado una biblioteca con álbumes musicales, te permite escucharlos con comodidad, pero después de analizar alternativas, Plex es cómodo porque ya lo tienes instalado, pero existen proyectos mucho más interesantes que te permiten montar en tu equipo todo lo necesario para convertirte en tu propio Spotify, con gestión de usuarios incluida para que podáis dar acceso a quien queráis a vuestra colección musical, manteniendo control individual de reproducciones, favoritos, listas de reproducción, etc.

oJ0Zorr.jpeg


Todo esto lo hace Navidrome, un proyecto de software libre maravilloso que destaca por la velocidad de respuesta en todo lo que hace y por su capacidad de manejar bibliotecas con muchos miles de álbumes sin despeinarse. Las búsquedas y las reproducciones son instantáneas, las hagas desde donde las hagas, ya sea desde dentro de tu red local o a través de Internet, usando Tailscale no solo para que el servidor y los clientes se vean en la misma red local, sino también para poder asegurar la conexión mediante SSL usando Funnels, que simplifica al máximo la gestión de acceso seguro sin necesidad de certificados ni configuración de puertos.

El proyecto está disponible en su página web, desde donde podéis acceder a la documentación y a la descarga del software. Viendo el LP A.M. de Wilco en la portada, ya es toda una declaración de intenciones y buen gusto musical.


oboiF88.jpeg



Aquí tenéis un buen resumen de características, en la que destaca el uso del API OpenSubsonic, lo que permite utilizar infinidad de sistemas para el acceso al servidor, ya que es un estándar ampliamente soportado.

FIhRByV.png



Instalar Navidrome y configurarlo es bien sencillo, siguiendo las indicaciones de su documentación para la plataforma elegida: Windows, Linux, macOS, Docker, etc. lo tenemos disponible para todo tipo de sistemas operativos, incluidos los de NAS como QNAP, TrueNAS u OpenMediaVault.


Yo lo he instalado en mi Sagar Hozkatua, en una carpeta en mi perfil de usuario que contiene el ejecutable navidrome, y un archivo de configuración llamado navidrome.toml que hay que personalizar.

AB2t5nV.png

Este es el contenido de mi archivo de configuración navidrome.toml en el que se declara la carpeta donde tenemos la colección de música, la carpeta donde se almacena la base de datos, el puerto que se utiliza para acceder, la dirección IP 0.0.0.0 para indicar que es el propio equipo, y la dirección pública que tiene mi Sagar Hozkatua en Tailscale.

3xpzi49.png

Una vez configurado, lo podemos ejecutar desde el terminal, pero es más elegante crear un LaunchAgent en formato .plist que se ejecute al iniciar el equipo y así te olvidas de tener que iniciarlo.

IFv3ub9.png
Si reiniciáis el equipo se ejecutará automáticamente, pero si lo queréis ejecutar desde el terminal, solo tenéis que ejecutar este comando:

Insertar CODE, HTML o PHP:
launchctl load ~/Library/LaunchAgents/com.navidrome.server.plist

Y con este comando podéis cerrarlo

Insertar CODE, HTML o PHP:
launchctl unload ~/Library/LaunchAgents/com.navidrome.server.plist 2>/dev/null

Y para poder usarlo, solo tenéis que ir a la URL que hayáis marcado en el archivo de configuración. La primera vez os pedirá crear un usuario administrador, y una vez dentro de la web, arriba a la derecha veréis una serie de opciones de configuración

0zdSHxd.jpeg


En la opción Personal podéis elegir el tema, el idioma, la vista inicial por defecto, el modo de ReplayGain para ajustar niveles (tengo todos mis archivos con tags que indican el nivel por pista y por álbum, para ofrecer un nivel coherente sin necesidad de andar subiendo y bajando el volumen. Aquí también puedes decirle que haga scrobbling a Last.fm para que se registren tus reproducciones en su servicio.
6f9sFP9.png

La web se puede utilizar también como reproductor, pero hay opciones mucho mejores para que la experiencia sea de otro nivel.
gUpK2vI.png


Para configurar el acceso seguro https desde Internet y hacerlo de forma simplificada, sin proxys inversos ni certificados, he recurrido a la funcionalidad Funnel de Tailscale, que se configura con un único comando desde el terminal:

Insertar CODE, HTML o PHP:
tailscale funnel --bg http://localhost:4533

Para poder ejecutar Tailscale desde el terminal, hay que activar la integración del CLI desde los ajustes de la aplicación.

LZ8rrGh.png

Configurado nuestro servidor, vayamos a por las aplicaciones:

Arriba, en el menú Apps, tenéis una base de datos muy completa de aplicaciones y reproductores para todo tipo de sistemas. Son muy fáciles de instalar y probar, y como son solo una forma de acceso a tus datos, puedes tener las que quieras instaladas.

vCe5BKe.png



Mi favorito para escritorio tiene un nombre bastante feo: Aonsoku. Sin embargo, la aplicación es elegante y muy, muy completa, recordando la interfaz de Spotify, con una página de inicio en donde se muestran los álbumes reproducidos recientemente.


4I4Ht7Z.jpeg

Nuestra biblioteca musical se enriquece con fichas de los artistas obtenidas desde Last.fm, acompañada de un ranking de temas populares.
12TEXSx.png


También se muestra la discografía, e incluso te sugiere artistas relacionados.

eNIxoGZ.png

Y0L1jjC.png

7vEaFou.png

Tts6dBB.png


Feishin también tiene un nombre horroroso, pero es una excelente alternativa.

TGC1BXU.jpeg


Para iOS y iPadOS me quedo con play:Sub, que es de pago (5,99€), pero muy completa.

Así luce la pantalla principal en el iPad

nmf1s4E.jpeg



Pero de tan completa que es, me parece que se pasa y complica la interfaz con demasiada información.


hP38rRl.png



Amperfy es gratuita y funciona muy bien también. No es tan completa, pero es más limpia y agradable de usar.


Q50CiyP.png



En el iPhone, utilizo las mismas dos apps, y me gusta especialmente la interfaz de Amperfy, aunque las búsquedas son más completas en play:sub

nw9D3nz.png


9pzA6k7.png



Y en el OnePlus 8T, con Android 14, he probado varias y Symfonium es la que me ha parecido mejor de todas, aunque es de pago y no sé si la compraré, porque Amperfy o Castafiore también funcionan muy bien y son gratis.

qACPgxs.jpeg



6kNmn0A.jpeg


Este es Castafiore

TPkuId3.jpeg
 
Última edición:
Después de probar varias alternativas para iOS y iPadOS, me quedo con Nautiline.

La podéis descargar y permite usarla durante 7 días de forma gratuita, pero me ha costado solo un par de días decidir que es la mejor de todas las que he probado y he pagado con gusto los 10€ que cuesta. Creo que los merece por el gran cuidado que presta en los detalles, algo que valoro mucho.


BLJFqc5.png



Es muy personalizable, pero la configuración estándar me resulta perfeta. Esta es la página principal de la aplicación ejecutada desde el iPad, con acceso rápido a los últimos álbumes reproducidos, a las últimas novedades, a los últimos álbumes añadidos y a aquellos que has marcado como favoritos.

uHqu8pU.jpeg



La consulta de tu biblioteca musical es muy completa, pudiendo acceder a múltiples criterios, muy bien pensados separando artistas de los artistas del álbum, e incluos compositores pensando en el género de la Clásica.

Syo48m3.png



Si reproduces un álbum, la interfaz es sencilla y nada recargada, con la carátula del álbum dominando la pantalla con buena resolución y los controles de reproducción a mano, sin tanta saturación de información como presentaba play:Sub.

El título de la canción, del álbum y una confirmación de que lo estás reproduciendo en formato FLAC. No necesito más.

yfPNnGL.png



Abajo a la izquierda, acceso rápido a la letra de la canción. No solo muestra la letra, sino que es capaz de mostrarla de forma sincronizada si has guardado la letra con las marcas de tiempo.

Muy útil para disfrutar de las letras junto con la música.

2LvFlAR.png



Le sigue un temporizador, algo muy útil si lo utilizas antes de dormir ya que le puedes decir al de cuánto tiempo quieres que detenga la reproducción.

VzwpFDi.png



El control central permite enviar la señal de audio a los dispositivos que tenga accesibles a través de la red.

jrVwai4.jpeg



Si tienes curiosidad, puedes ver también los detalles del archivo que se está reproduciendo, incluyendo los datos calculados de ReplayGain para el álbum y para la canción.

G6icwrh.png



Y por último la cola de reproducción, que en mi caso que soy consumidor de álbumes completos se muestra con el resto de pistas del CD.

FmQZX2g.png



Ese cuidado de los detalles que os comentaba, se ve hasta en la sección de configuración.

Gxjc0k7.png



Buen control de reproducción, con capacidad de ajustar la ganancia calculada por ReplayGain 2.0 y permitiendo elegir entre Opus y mp3 para transcodificar el material, aunque a nivel de servidor lo tengo limitado para que no transcodifique y siempre me envíe el archivo en formato FLAC.

s3o5CbC.png



No soy amigo de la ecualización, pero incorpora un ecualizador de 10 bandas, personalizable por género musical.

oqYXHl5.png



Puedes controlar la caché de archivos descargados.

3a92GGO.png



Y personalizar las secciones de la página de inicio, pudiendo elegir entre un amplio número de etiquetas.

eKkR2ai.png



Lo dicho, una aplicación muy bien realizada y que da gusto utilizar.

:ok:ok:ok
 
Última edición:
Hoy he visto en Reddit un proyecto nuevo de cliente para servidores Open Subsonic como Navidrome, que está "inspirado" en la interfaz de Apple Music, y para quien no quiera pagar por Nautiline es resultón, aunque todavía está lejos de la experiencia que ofrece Nautiline, y lo veo más orientado a dispositivos Android que iOS.

El proyecto está muy bien presentado, ya desde su página web


IUQnoLd.png



Te explica por qué deberías considerarlo.

rv27BvP.png


En su Github tienes builds disponibles para Windows y para Android, y además el código fuente para poder crearte tu propia build para macOS, iOS o Linux.


2XHqTRf.png



Lo puedes compilar con XCode, pero el desarrollo está basado en Flutter, que tienes que instalarlo - vía Homebrew, p.ej - y también requiere los Pods de Cocoa.

GRiIz9F.png


Una vez satisfechos los requisitos, puedes abrir el proyecto en XCode o compilarlo desde el terminal.

T3IvfNq.png

Una vez compilado, necesitamos activar el modo desarrollador en nuestro iPhone para poder instalar la aplicación. Y una vez hecho y autorizada la aplicación, la podremos utilizar.

Ayer me tocó organizar mi sección de Musicales y hoy le he dedicado un rato a las bandas sonoras de mi colección, y este es el aspecto que luce Musly, no está mal, la verdad.

xas2sS4.png



Las posibilidades de navegación y filtrado están lejos de la de Nuatiline, pero son suficientes.

Qoy4Ye4.png



La vista de álbum es bastante limpia,

x2VEK4I.png



Y lo mismo la de reproducción, con acceso a las letras y a la cola de reproducción arriba a la derecha, y los controles básicos de reproducción y el marcado de favoritos, muy al estilo Apple Music.

bv3YGPT.png



La versión de Android, instalada descargando el archivo .apk en mi OnePlus 8T se ve así:

OxmjTNY.jpeg


OxmjTNY.jpeg


RB4qLZV.jpeg



zOe92GA.jpeg
 
Las plataformas de streaming - y sobre todo Spotify en sus comienzos - consiguieron hacer realidad el sueño de cualquier apasionado por la música: tener acceso a un enorme catálogo musical a cambio de una pequeña cuota mensual.

Por menos de lo que costaba un CD físico, podías acceder a la música de una forma muy cómoda a través de múltiples dispositivos, que también han ido evolucionando con el tiempo y ya no son solo los móviles y tabletas, tenemos a las plataformas en equipos de sala, que consideran a las plataformas como una fuente más.

Prácticamente todo han sido ventajas, aunque tengo que reconocer que le veo algún inconveniente, y sobre todo dos:
  • Hemos perdido la propiedad sobre el contenido, y ahora pagamos solo por el derecho al acceso durante el próximo período de nuestra cuota. No es lo que más me preocupa y a corto plazo no parece un problema, pero nada garantiza que las plataformas vayan a existir siempre.
  • Los algoritmos moldean nuestros gustos musicales. Las plataformas no son solo un lugar donde uno va a escuchar lo que ya conoce, sino a descubrir nuevas propuestas musicales y ahí los algoritmos son los que mandan, sugiriendo y moldeando nuestros gustos. Esto sí me parece un problema porque estamos perdiendo "educación musical", pero este es otro debate.

Tener físicamente el CD no es algo que me haya preocupado nunca y de hecho hace tiempo que doné todos los que tenía en casa a una biblioteca municipal para que los puedan disfrutar otros en régimen de préstamo.

Lo que sí que he hecho a lo largo de los años ha sido convertirlos a formato FLAC en calidad CD (16-bit y 44.1kHz), e ir creando mi biblioteca musical en formato digital, clasificándola en carpetas para poder escucharla con garantías.

Navidrome me ha permitido crear mi propia plataforma de streaming, con un catálogo limitado a mi propia biblioteca, pero con prácticamente las mismas funcionalidades que las plataformas de pago, accesibles desde las distintas aplicaciones que utilizo como clientes.

dGahuyw.jpeg


Feishin se ha convertido en mi referencia como cliente de escritorio, con versiones para macOS, Windows, Linux e incluso una webapp alojada en Vercel con la que puedes acceder a tu propio contenido simplemente desde un navegador. Es un proyecto de código abierto muy activo, que va por su versión 1.2.0 y cuya interfaz está muy bien diseñada, y al igual que en las plataformas puedes crear tu propia radio, algo muy útil para crear listas de reproducción aleatorias sobre tu propia colección.

Es una delicia poder pasar por el Hard Bop

HuVL1l3.jpeg


O por al Rock Progresivo de los 70 y los 80

4GM3Vdm.jpeg


Escuchar tus temas favoritos, acompañados de las letras incluso aunque no las tengas en tu colección. Feishin se encarga de traértelas a través de Netease, otro proyecto chino como Feishin.

xiHLy2U.jpeg


Aunque lo normal es que acabe volviendo al Jazz, que me encanta.

HuVL1l3.jpeg



Y aunque se pueden combinar temas en una lista de reproducción, lo normal también es que escuche álbumes completos, de principio a fin, algo que se está perdiendo en favor de un consumo inmediato de píldoras musicales más cortas.

PXmbvXD.jpeg



Nautiline es mi opción definitiva para clientes iOS y iPadOS. Ya sea en casa o fuera de casa gracias a Tailscale, tengo acceso a mi propia plataforma de streming, con mi propia biblioteca musical y pudiendo disfrutar de una experiencia de usuario de primerísimo nivel, que se integra hasta con CarPlay para poder disfrutarlo también mientras conduces.

8Z3wEQN.png

La interfaz es muy limpia, pero a la vez tiene todo lo que necesitas a mano: acceso a las letras, temporizador por si estás escuchando desde la cama, envío de la señal a dispositivos inalámbricos, información detallada sobre el tema que está sonando y visualización de la cola de reproducción. Y con los 3 puntos de arriba puedes ir al artista, al álbum o añadir el tema que está sonando a una playlist.

vJcDqTY.png

:ok :ok :ok
 
Pues ante todo muchas gracias por el tutorial y la información.
Tiene muy buena pinta, la verdad.
Y yo no se si es que no se organizar mis discos, pero tengo recopilatorios metidos en carpetas (Now that i call music) y ya he requetemirado no se cuantos turoriales, pero aparecen como les da la gana.
Probaré esto a ver que tal.
 
Pues ante todo muchas gracias por el tutorial y la información.
Tiene muy buena pinta, la verdad.
Y yo no se si es que no se organizar mis discos, pero tengo recopilatorios metidos en carpetas (Now that i call music) y ya he requetemirado no se cuantos turoriales, pero aparecen como les da la gana.
Probaré esto a ver que tal.

Eso tiene que ver con la gestión de los metadatos de los archivos, que da para otro hilo...

En el caso de los recopilatorios, la clave está en activar el indicador que indica que el álbum es una recopilación de canciones de varios artistas, que existe dentro de los tags y que hará que el álbum se muestre como uno único y no tantos como artistas contenga.

Para el etiquetado de música, utilizo unas cuantas aplicaciones en macOS:
  • Swansie, que a pesar de ser un reproductor del estilo a iTunes, permite la edición de los tags de una forma rapidísima.
  • Music Tag Editor Pro, que es de lo más completo para poder actualizar todas y cada una de las etiquetas disponibles, renombrar archivos y hacer muchas cosas más.
  • MusicBrainz Picard, para poder analizar un álbum y obtener su información desde Internet. Es muy útil, aunque tiene una cierta curva de aprendizaje para sacarle todo el partido.

Swansie es un calco de lo que era iTunes, y lo puedes configurar como quieras ya que tiene infinidad de opciones para dejar el layout a tu gusto. Yo lo uso sobre todo para catalogar, aunque puedo usarlo también para escuchar mientras lo hago. Me gusta tener las tres columnas de género, artista y álbumes ordenados por año de publicación, más una zona inferior en donde puedo ver la selección de álbumes ordenados por el mismo criterio, y en la parte inferior una zona con los temas de cada álbum ordenados por número de álbum y número de pista.

A la derecha de la ventana, dejo una sección que me permite ver en vertical el contenido de los tags y editarlos si es necesario. Para editar todos los de un álbum, seleccionas todos los temas que quieras, normalmente los de un álbum, pero puede que quieras renombrar un género musical y lo puedes hacer fácilmente.

5tRWcLd.png


Si el álbum es una recopilación de temas de varios artistas, verás que abajo a la derecha está activado "Part of a Compilation". Esto es lo que hace que no se tenga en cuenta la etiqueta de artista, que es diferente de la etiqueta de artista del álbum.

SjQYirO.png


:ok :ok :ok
 
Volviendo a Feishin como reproductor, se puede mejorar la calidad de audio si elegimos el backend de MPV en lugar del backend del navegador, que es el que usa por defecto.

Esto se hace en la ventana de ajustes de reproducción que aparece en los controles de la parte inferior derecha de la ventana del programa, en el icono de los tres deslizadores horizontales.

aFjhZHJ.png


Si no tenéis mpv instalado, lo podéis hacer usando homebrew, e indicándole la ruta donde se encuentra ubicado en la sección de ajustes del programa, que se enceuentra en la parte superior izquierda de la ventana, en el icono de las tres líneas horizontales.

Según vais eligiendo opciones, Feishin ajusta las opciones que enviará a mpv para la reproducción del archivo que contiene el material a reproducir.

Lo he dejado ajustado para que la tasa de muestreo sea 44.100 Hz y asegurarme de que no haga ningún resampling, ya que todos mis archivos FLAC los tengo codificados a 44.1kHz y 16-bit. He probado la alta resolución, pero no le encuentro ninguna ventaja y sí varios inconvenientes.
JRc88ka.png


Con esta combinación y eligiendo como salida la Sound Blaster Play! 3 a la que tengo conectados unos Edifier E25HD Luna Eclipse como monitores de campo cercano, el sonido es muy disfrutable.
27hp1F2.jpeg


No es lo mismo que utilizar Audirvana, que sigue siendo lo que utilizo cuando quiero escuchar con auriculares un álbum con la máxima calidad, seleccionando mi Rega DAC como salida en modo exclusivo para una reproducción bit-perfect, y usando mis auriculares Sennheiser HD 650 para una escucha crítica.

El modo exclusivo impide que ningún otro audio entre en el sistema, y eso está muy bien cuando quieres estar concentrado en esa escucha crítica, pero cuando escucho con los altavoces conectados a mi Sagar Hozkatua, prefiero que me interrumpan las alertas que lo requieran.
KXEonvi.png


:ok :ok :ok
 
En el portátil con Windows también he configurado Feishin para que utilice el backend de MPV como reproductor, eligiendo como dispositivo de salida los AirPods Pro en modo WASAPI, que es con lo que mejor calidad puedo conseguir.

Después de descargar MPV desde


Y descomprimirlo en la carpeta C:\Tools\mpv

He ejecutado desde Powershell el siguiente comando para ver los dispositivos que tengo disponibles (con los AirPods conectados por Bluetooth)

Insertar CODE, HTML o PHP:
PS C:\Tools\mpv> .\mpv --audio-device=help
List of detected audio devices:
  'auto' (Autoselect device)
  'wasapi/{2e312d5c-6146-461d-a166-462dcbc18b58}' (3 - E24-28 (AMD High Definition Audio Device))
  'wasapi/{99fe05d9-cfee-44d1-9787-1e9423a54000}' (Altavoces (Realtek(R) Audio))
  'wasapi/{c5fbb0ed-8c31-463b-b4e3-1ddc833cfb42}' (AirPods Pro 2ª Gen (AirPods Pro 2 - Find My))
  'openal' (Default (openal))

Y así he completado los ajustes de Feishin, indicándole la ruta a MPV y añadiendo estos parámetros extras:
Insertar CODE, HTML o PHP:
audio-device=wasapi/{c5fbb0ed-8c31-463b-b4e3-1ddc833cfb42}
audio-samplerate=0
af=lavfi=[aresample=resampler=soxr]
audio-buffer=0.5
cache=yes
cache-secs=10
demuxer-max-bytes=200MiB
demuxer-max-back-bytes=100MiB

Comento cada una de las opciones elegidas:

audio-device=wasapi/{c5fbb0ed-8c31-463b-b4e3-1ddc833cfb42} para elegir los AirPods 2 Pro como salida de audio.

Windows no pone fácil poder comprobar qué codec está utilizando la conexión Bluetooth con los AirPods Pro 2, pero usando el programa BluetoothTweaker puedes comprobar los codecs que soporta en Windows, y cuál es el codec que ha elegido, que afortunadamente ha sido AAC y no SBC.

En concreto AAC-LC (Low Complexity), a 256kbps y VBR (bitrate variable) y con la frecuencia de muestreo de 48kHz que utilizan los Airpods. La misma configuración que utiliza Apple en iOS y macOS.

CODEC Type: MPEG-2, 4 AAC, Object Type: MPEG-2 AAC-LC, Sampling Frequency: 48kHz, Channels: 2, VBR: supported, Bit rate:256.000


eSS3sAG.png



audio-samplerate=0 para que MPV la respete la frecuencia de muestreo del archio FLAC original y así Windows y Bluetooth negocien la frecuencia final sin forzar conversiones dobles. Porque sí o sí hay resampling, ya que mi archivo está en 44.1kHz y los AirPods funcionan a 48kHz.

af=lavfi=[aresample=resampler=soxr] SOXR es el resampler que se utiliza, y con esta configuración se suavizan las transiciones y evitamos artefactos.

audio-buffer=0.5 / cache=yes / cache-secs=10 medio segundo de buffer y 10 segundos de caché para evitar cortes en la conexión.
demuxer-max-bytes=200MiB / demuxer-max-back-bytes=100MiB también para evitar tirones.


MzcuOmX.png


No selecciono el modo excluxivo de audio, porque si me interrumpe una llamada quiero que me avise.

NQeRe9R.png



Lo cierto es que esta configuración suena bastante bien. Y si ya le pones buena música... ¡ni te cuento! :birra

UIeIpyl.png


:ok:ok:ok
 
Ahora que he convertido mi Sagar Hozkatua en un servidor de streaming de mi colección musical, y también en un servidor de los libros de mi bibloteca de Calibre, me he preguntado...

¿Y si juntamos música y lectura?

Dicho y hecho. Este domingo he revisado los orígenes del Jazz, con ayuda de la guía que Ben Ratliff escribió para The New York Times, con su Essential Library de 100 álbumes.

aNnsD40.jpeg


HEyTD69.jpeg


OtPcuSB.jpeg


Música maravillosa simplemnete para disfrutarla, y fundamental si quieres entender el camino que ha seguido el género desde sus orígenes.

4WC6TS7.jpeg


:ok :ok :ok
 
Acabo de instalarlo en mi QNAP y con Amperfy en mi iPhone, mediante Tailscale. No he tardado más de diez minutos en todo. Facilísimo.
 
Acabo de instalarlo en mi QNAP y con Amperfy en mi iPhone, mediante Tailscale. No he tardado más de diez minutos en todo. Facilísimo.

Genial. Si tienes una buena colección de música en ese QNAP, tendrás tu propio servicio de streaming "Manufy" :palmas

Después de probar varias aplicaciones para iOS y iPadOS, la que me ha gustado más ha sido Nautiline. Son 10€, pero puedes probarlo una semana para comprobar si te convence.


:ok:ok:ok
 
En QNAP ni siquiera hace falta virtualizar o un docker, hay una app nativa. Por si alguien tiene uno y quiere probar.
 
Terminamos la semana relajándonos con un poco de música de cine, del maestro John Williams.

6qCHs1T.jpeg
 
Deja alguna pista, anda...


:ok :ok :ok

Es sencillo, hay que añadir el repositorio de myqnap.org en la sección de aplicaciones, buscarlo e instalar. Nos dará una ip local, que en principio es suficiente si solo lo vamos a usar en casa, pero si pretendemos usarlo fuera, instalamos Tailscale, y este nos dará otra ip, pero esta funciona desde cualquier ubicación.
 
Os he comentado recientemente que viendo lo bien que va mi servidor con Navidrome, me he dado de baja del servicio iTunes Match de Apple.

Tengo la suscripción activa hasta mediados de diciembre de este año, pero con más de 1.500 álbumes subidos a la nube de Apple en formato lossy (m4a), revisarlos para ver si los tengo en mi biblioteca FLAC puede ser una tarea imposible...

... o no. Porque gracias a la inteligencia artificial, este fin de semana he conseguido hacerme una composición de lugar muy rápida.

Os cuento cómo lo he hecho, con la aplicación Música, SwinSian, Claude Sonnet 4.6 en modo de investigación profunda a través de Perplexity Pro, Excel y hasta Automator para automatizar tareas.
  • A la aplicación Música en macOS le he pedido que genere un archivo .xml con todas las canciones que tengo en iTunes Match.
    • Archivo > Biblioteca > Exportar biblioteca...
  • A Claude (Perplexity Pro), le he pedido que me construya un archivo .csv que resuma el .xml con las canciones que tengo en iTunes Match con los siguientes datos:
    • Artista, año, título del álbum, género, número de disco, total de discos, total de canciones y la fecha en la que lo agregué.
  • A SwinSian en macOS, configurada con la carpeta donde tengo todos los FLAC, le he pedido que genere un archivo .xml con todas las canciones que tengo en mi CDTeka en formato FLAC 16-bit/44.1kHz
    • File > Export Library...
  • A Claude (Perplexity Pro), le he pedido que me construya un archivo .csv que resuma el .xml con las canciones que tengo en mi CDTeka con los siguientes
    • Artista, año, título del álbum, género, número de disco, total de discos, total de canciones y la fecha en la que lo agregué.
  • A Claude (Perplexity Pro), le he pedido que me compare los dos archivos .csv y que me genere un nuevo .csv unificado en el que además de los datos de los .csv me cree dos columnas más, una con un indicador de que está en iTunes y otro que está en mi CDTeka
  • A Excel, le he pedido que me abra el archivo .csv y me he creado una columna que me indique que si el álbum está en iTunes y no en mi CDTeka, me diga que tengo que revisarlo.

Con esa lista unificada, la tarea se vuelve mucho más abordable y te la puedes plantear también para revisar los metadatos, unificar géneros musicales y descargar los álbumes que te faltan, pues en iTunes los tengo en formato .m4a (lossy) y en mi CDTeka los quiero en formato FLAC (lossless).

60quAmH.png


Para descargar rápidamente esos álbumes que me faltan, estoy usando OrpheusDL GUI con mi suscripción de TIDAL, que como os dije el otro día funciona perfecto, aunque no me permite especificar cómo quiero que se renombren los archivos (los .flac con la música y los .lrc con las letras), ni me genera la carátula del álbum en formato jpg (aunque va dentro de cada archivo .flac).

Mejor con un ejemplo, con este Blame it on my Youth de Art Farmer

Lo busco en OrpheusDL GUI
HjyqQtA.png

Y con el botón derecho le digo que me lo descargue en formato FLAC

TKaKgAd.png

Y nos lo descarga perfectamente, pero sin estar como me gusta.

4TqbyS2.png

Aprovechando que en su día construí un un script con AppleScript para calcular la ganancia por pista y álbum usando rsgain y aplicar los metadatos a cada pista, le he pedido a Claude que me ayude a mejorarlo para que además de hacer eso haga lo que no hace OrpheusDL y en un momento he terminado con este script que os comparto:

Insertar CODE, HTML o PHP:
on run {input, parameters}
    repeat with f in input
        set folderPath to POSIX path of f
        tell application "Terminal"
            activate
            do script "zsh << 'ENDOFSCRIPT'
#!/bin/zsh

FOLDER=\"" & folderPath & "\"
FOLDER=\"${FOLDER%/}\"
PARENT=\"$(dirname \"$FOLDER\")\"
BASENAME=\"$(basename \"$FOLDER\")\"

# Lee el valor de un tag ignorando el case del nombre del tag.
# Normaliza solo la parte del nombre (antes del =), no el valor.
# Uso: get_tag_value NOMBRE_TAG ruta/archivo.flac
get_tag_value() {
    local tag=\"$1\"
    local file=\"$2\"
    metaflac --export-tags-to=- \"$file\" 2>/dev/null | while IFS= read -r line; do
        local key=\"${line%%=*}\"
        local val=\"${line#*=}\"
        if [ \"$(echo \"$key\" | tr '[:upper:]' '[:lower:]')\" = \"$(echo \"$tag\" | tr '[:upper:]' '[:lower:]')\" ]; then
            echo \"$val\"
            return
        fi
    done
}

echo \"======================================\"
echo \"Procesando: $BASENAME\"
echo \"======================================\"

# ============================================================
# 1. RENOMBRAR CARPETA: debe tener formato [año] título
# ============================================================
if echo \"$BASENAME\" | grep -qE '^\\[[0-9]{4}\\] .+'; then
    echo \"[OK] Nombre de carpeta correcto: $BASENAME\"
else
    echo \"[INFO] Leyendo metadatos del primer archivo FLAC para renombrar carpeta...\"
    FIRST_FLAC=$(find \"$FOLDER\" -maxdepth 1 -name '*.flac' | sort | head -n 1)
    if [ -z \"$FIRST_FLAC\" ]; then
        echo \"[AVISO] No se encontraron archivos FLAC. Omitiendo renombrado de carpeta.\"
    else
        YEAR=$(get_tag_value DATE \"$FIRST_FLAC\" | grep -oE '^[0-9]{4}')
        ALBUM=$(get_tag_value ALBUM \"$FIRST_FLAC\")
        if [ -z \"$YEAR\" ] || [ -z \"$ALBUM\" ]; then
            echo \"[AVISO] No se pudo leer anio o album. Renombrado de carpeta omitido.\"
            echo \"  DATE leido: '$YEAR'\"
            echo \"  ALBUM leido: '$ALBUM'\"
        else
            SAFE_ALBUM=$(echo \"$ALBUM\" | tr '/:*?<>|\\\\' '_' | sed 's/\"/_/g')
            NEW_NAME=\"[${YEAR}] ${SAFE_ALBUM}\"
            NEW_PATH=\"${PARENT}/${NEW_NAME}\"
            if [ \"$BASENAME\" != \"$NEW_NAME\" ]; then
                echo \"[RENOMBRAR CARPETA] '$BASENAME' -> '$NEW_NAME'\"
                mv \"$FOLDER\" \"$NEW_PATH\"
                FOLDER=\"$NEW_PATH\"
                echo \"[OK] Carpeta renombrada.\"
            else
                echo \"[OK] Nombre de carpeta ya es correcto.\"
            fi
        fi
    fi
fi

# ============================================================
# 2. RENOMBRAR ARCHIVOS FLAC y .lrc
#    + Actualizar tags TRACKTOTAL, DISCNUMBER, DISCTOTAL
# ============================================================
echo \"\"
echo \"--- Verificando archivos FLAC y .lrc ---\"

FLAC_FILES=(\"$FOLDER\"/*.flac(N))

if [ ${#FLAC_FILES[@]} -eq 0 ]; then
    echo \"[AVISO] No se encontraron archivos FLAC.\"
else
    TRACKTOTAL=${#FLAC_FILES[@]}
    echo \"[INFO] Total de pistas detectadas: $TRACKTOTAL\"

    # -- Detectar discos unicos --
    DISC_NUMBERS=()
    for FLAC_FILE in \"${FLAC_FILES[@]}\"; do
        DN=$(get_tag_value DISCNUMBER \"$FLAC_FILE\" | grep -oE '^[0-9]+')
        if [ -n \"$DN\" ] && ! echo \"${DISC_NUMBERS[@]}\" | grep -qw \"$DN\"; then
            DISC_NUMBERS+=(\"$DN\")
        fi
    done
    DISCTOTAL=${#DISC_NUMBERS[@]}
    [ \"$DISCTOTAL\" -eq 0 ] && DISCTOTAL=1
    echo \"[INFO] Total de discos detectados: $DISCTOTAL\"

    for FLAC_FILE in \"${FLAC_FILES[@]}\"; do
        FNAME=$(basename \"$FLAC_FILE\" .flac)

        TRACKNUMBER=$(get_tag_value TRACKNUMBER \"$FLAC_FILE\" | grep -oE '^[0-9]+')
        TITLE=$(get_tag_value TITLE \"$FLAC_FILE\")
        DISCNUMBER=$(get_tag_value DISCNUMBER \"$FLAC_FILE\" | grep -oE '^[0-9]+')

        # -- Actualizar tags --
        metaflac --remove-tag=TRACKTOTAL \"$FLAC_FILE\" 2>/dev/null
        metaflac --set-tag=\"TRACKTOTAL=$TRACKTOTAL\" \"$FLAC_FILE\"

        if [ \"$DISCTOTAL\" -gt 1 ]; then
            metaflac --remove-tag=DISCTOTAL \"$FLAC_FILE\" 2>/dev/null
            metaflac --set-tag=\"DISCTOTAL=$DISCTOTAL\" \"$FLAC_FILE\"
            if [ -z \"$DISCNUMBER\" ]; then
                DISCNUMBER=1
                metaflac --remove-tag=DISCNUMBER \"$FLAC_FILE\" 2>/dev/null
                metaflac --set-tag=\"DISCNUMBER=1\" \"$FLAC_FILE\"
            fi
            echo \"[TAG] $(basename \"$FLAC_FILE\"): TRACKTOTAL=$TRACKTOTAL, DISCNUMBER=$DISCNUMBER, DISCTOTAL=$DISCTOTAL\"
        else
            echo \"[TAG] $(basename \"$FLAC_FILE\"): TRACKTOTAL=$TRACKTOTAL\"
        fi

        # -- Renombrar FLAC --
        if [ -z \"$TRACKNUMBER\" ] || [ -z \"$TITLE\" ]; then
            echo \"[AVISO] Sin metadatos de pista/titulo en: $(basename \"$FLAC_FILE\"). Renombrado omitido.\"
            continue
        fi

        TRACKNUM_PAD=$(printf '%02d' \"$TRACKNUMBER\")
        SAFE_TITLE=$(echo \"$TITLE\" | tr '/:*?<>|\\\\' '_' | sed 's/\"/_/g')
        NEW_FNAME=\"${TRACKNUM_PAD} ${SAFE_TITLE}.flac\"
        NEW_PATH=\"${FOLDER}/${NEW_FNAME}\"

        OLD_FNAME_NOEXT=\"$FNAME\"
        NEW_FNAME_NOEXT=\"${TRACKNUM_PAD} ${SAFE_TITLE}\"

        if [ \"$(basename \"$FLAC_FILE\")\" != \"$NEW_FNAME\" ]; then
            echo \"[RENOMBRAR FLAC] '$(basename \"$FLAC_FILE\")' -> '$NEW_FNAME'\"
            mv \"$FLAC_FILE\" \"$NEW_PATH\"
        else
            echo \"[OK FLAC] $(basename \"$FLAC_FILE\")\"
        fi

        # -- Renombrar .lrc asociado si existe --
        LRC_OLD=\"${FOLDER}/${OLD_FNAME_NOEXT}.lrc\"
        LRC_NEW=\"${FOLDER}/${NEW_FNAME_NOEXT}.lrc\"

        if [ -f \"$LRC_OLD\" ]; then
            if [ \"$LRC_OLD\" != \"$LRC_NEW\" ]; then
                echo \"[RENOMBRAR LRC] '${OLD_FNAME_NOEXT}.lrc' -> '${NEW_FNAME_NOEXT}.lrc'\"
                mv \"$LRC_OLD\" \"$LRC_NEW\"
            else
                echo \"[OK LRC] ${OLD_FNAME_NOEXT}.lrc\"
            fi
        fi
    done
fi

# ============================================================
# 3. EXTRAER folder.jpg si no existe
# ============================================================
echo \"\"
echo \"--- Verificando folder.jpg ---\"
FOLDER_JPG=\"$FOLDER/folder.jpg\"

if [ -f \"$FOLDER_JPG\" ]; then
    echo \"[OK] folder.jpg ya existe.\"
else
    echo \"[INFO] folder.jpg no encontrado. Intentando extraer de la primera cancion...\"
    FIRST_FLAC=$(find \"$FOLDER\" -maxdepth 1 -name '*.flac' | sort | head -n 1)
    if [ -z \"$FIRST_FLAC\" ]; then
        echo \"[AVISO] No se encontraron FLAC. No se puede extraer portada.\"
    else
        if metaflac --export-picture-to=\"$FOLDER_JPG\" \"$FIRST_FLAC\" 2>/dev/null; then
            echo \"[OK] folder.jpg extraido con metaflac.\"
        elif /usr/local/bin/ffmpeg -y -i \"$FIRST_FLAC\" -an -vcodec copy \"$FOLDER_JPG\" 2>/dev/null; then
            echo \"[OK] folder.jpg extraido con ffmpeg.\"
        else
            echo \"[AVISO] No se pudo extraer la portada.\"
        fi
    fi
fi

# ============================================================
# 4. EJECUTAR rsgain
# ============================================================
echo \"\"
echo \"--- Ejecutando rsgain ---\"
/usr/local/bin/rsgain easy \"$FOLDER\"
echo \"[OK] rsgain completado.\"
echo \"\"
echo \"Proceso finalizado para: $(basename \"$FOLDER\")\"
ENDOFSCRIPT
"
        end tell
    end repeat
    return input
end run

Con el botón derecho sobre la carpeta del álbum, ejecuto el script, que muestra su ejecución en una ventana del terminal:

nTxvJxy.png

Y lo deja todo perfecto:

tyuIuFK.png

Funciona perfectamente y me ahorra una cantidad de tiempo enorme.


yiCwe7Z.png


60ig8EY.png



Y una vez en Navidrome, solo queda disfrutarlo desde el dispositivo elegido.

Aquí, desde el iPhone con Nautiline


5d4C7px.png

Que nos confirma el formato FLAC y hasta el bitrate:

ZyZijTP.png


BbJgUwW.png

:ok:ok:ok
 
Aunque Swinsian no utiliza la base de datos de Navidrome, al indexar los contenidos de la misma carpeta que tengo indexada en Navidrome, el resultado es el mismo, y lo uso mucho en el servidor donde tengo Navidrome no solo porque es un excelente reproductor, sino porque es una herramienta estupenda para editar los metadatos de los archivos de nuestra colección musical.

No sé si lo sabéis, pero los metadatos no tienen por qué tener un único valor, y podéis combinar varios separándolos por comas.

De esa manera puedo tener el álbum Solitude de Billie Holliday clasificado como Jazz Vocal [Clásico] y también como <JazzBai>

<JazzBai> es un género virtual que me he creado para que aparezca el primero en mi lista de géneros y poder tener en una lista todos aquellos álbumes a los que le dediqué una reseña en el portal JazzBai, que lo tengo completamente abandonado. Algún año retomaré el proyecto...

TrjxyKk.png

La interfaz de Swinsian es muy parecida a la original de iTunes, y puedes personalizar las secciones a tu gusto. Yo lo tengo así, con:
  • Una primera columna con los géneros musicales
  • Una segunda con el artista principal del álbum
  • Una tercera con los álbumes clasificados por orden cronológico según el año de la grabación, no de la edición del CD.
  • Un panel con las carátulas de los álbumes para la selección realizada en esas 3 columnas
  • Una lista inferior con los temas individuales de la selección (normalmente eligo álbumes completos)
  • Un panel a la derecha con los metadatos de la selección realizada de esa lista inferior
  • La carátula del tema o temas seleccionados
Así queda mi sección de bandas sonoras originales (B.S.O.)

jQiDHMD.png

Como también tengo indexada la carpeta con Navidrome, puedo usar Feishin desde cualquier PC con Windows o desde cualquier Mac con macOS en los que tenga Tailscale instalado para poder ver el servidor.

Aquí lo tenéis con la lista de reproducción JazzBai, en este caso ordenada por artista.

QRYmRhD.png

Desde el iPhone, tengo acceso a los mismos contenidos usando un cliente OpenSubsonic, que es el estándar que usa Navidrome.

En mi caso, utilizo Nautiline, que me parece "redondo".

iGLPbwH.png


Sigo añadiendo álbumes que solo tenía en iTunes Match a mi CDTeka en formato FLAC, y viendo la lista de las últimas adiciones, menos mal que lo estoy haciendo, pues me faltaban muchos y muy relevantes.

Cada día me gusta más tener mi propio servidor con Navidrome. Te da un control y una libertad que no te la proporciona ninguna plataforma en streaming, con las cuales convivo perfectamente porque también tienen su sentido para explorar.

Lo más importante es disfrutar de la música, y tener claro la que te gusta. Esto es algo a lo que he dedicado mucho tiempo a lo largo de los años y tengo una selección con la que disfruto muchísimo.

acFmwEr.png

pSTlR5T.png

:ok:ok:ok
 
Última edición:
Navidrome es increíblemente eficaz en su tarea de gestionar mi biblioteca musical, y llevo utilizándolo desde principios de año con la versión 0.59.0 que descargué entonces, pero el desarrollo sigue vivo y en su GitHub la última disponible es la v0.61.2 de mediados de abril.

Tengo que montar algo que me avise de que hay una nueva versión, consultando la rama de releases.


Acualizarlo no puede ser más sencillo, ya que solo hay que sustituir el binario de navidrome por el de la nueva versión.

Para Intel y macOS, esta es la descarga:


Si descomprimimos el archivo, veremos que solo contiene el binario, y archivo de texto con la licencia de uso y otro archivo markdown con información sobre el programa y enlaces interesantes.

Captura de pantalla 2026-05-21 a las 8.29.55.png

La carpeta con el programa y la base de datos están ubicados en el directorio raíz de mi carpeta de usuario (home) y antes de liarla con una actualización, he preferido hacer un backup comprimiéndolos en un archivo .zip, que ocupa bastante porque no he vaciado la caché y están hasta los últimos archivos que ha transcodificado.

Tener una copia de seguridad es importante también porque ahí se almacenan todas nuestras preferencias y estadísticas de escucha.

Captura de pantalla 2026-05-21 a las 8.33.31.png

Una vez hecha la copia de seguridad, detenemos el servidor desde el terminal con este comando:

Insertar CODE, HTML o PHP:
launchctl unload ~/Library/LaunchAgents/com.navidrome.server.plist 2>/dev/null

Copiamos y sustituimos el archivo navidrome, desde el terminal o copiando y pegando desde el Finder:

Captura de pantalla 2026-05-21 a las 8.38.29.png

Lo convertimos en ejecutable

Insertar CODE, HTML o PHP:
chmod +x /Users/tu_nombre_de_usuario/navidrome/navidrome

Y volvemos a iniciar el servidor

Insertar CODE, HTML o PHP:
launchctl load ~/Library/LaunchAgents/com.navidrome.server.plist

Y ya está. Ya lo tenemos funcionando con la versión 0.61.2

Captura de pantalla 2026-05-21 a las 8.40.27.png


Ya solo queda disfrutarlo con un buen programa cliente, y más tarde os hablaré de PsySonic, mi último descubrimiento que me ha dejado impresionado y eleva la experiencia de uso a la de la mejor plataforma de streaming...


Captura de pantalla 2026-05-21 a las 8.20.38.png
Captura de pantalla 2026-05-21 a las 8.20.44.png

:ok :ok :ok
 
¿No te da por los contenedores? Es una manera muy rápida de actualizar, mantener y desplegar aplicaciones.

 
¿No te da por los contenedores? Es una manera muy rápida de actualizar, mantener y desplegar aplicaciones.


Sí, tengo instalado Docker Desktop y tengo contenedores creados para varios servicios como el servidor de Calibre, etc.

Navidrome lo instalé localmente y como es tan sencillo de mantener, me quedé así.

Probaré a instalarlo en un contenedor, aunque reconozco que me da pereza…

:ok.ok:ok
 
Última edición:
  • Me gusta
Reacciones: WRC
Navidrome se actualiza a la versión 0.62.0 con un buen número de mejoras y novedades.

Tenéis el registro de cambios en su repositorio de GitHub


Actualizarlo es tan sencillo como descargarlo, descomprimir y sustituir un único archivo.

Captura de pantalla 2026-06-10 a las 22.08.20.png

:ok :ok:ok
 
Navidrome se actualiza a la versión 0.63.1, es una actualización menor de la última release 0.63.0 de hace dos días, que traía muchas mejoras alrededor de la gestión de letras.


Para instalar la actualización, descargamos el archivo correspondiente a nuestro sistema.

Paramos navidrome

Insertar CODE, HTML o PHP:
launchctl unload ~/Library/LaunchAgents/com.navidrome.server.plist 2>/dev/null

Copiamos el archivo navidrome en el directorio de instalación, y

Captura de pantalla 2026-07-10 a las 7.47.58.png

Volvemos a iniciar navidrome

Insertar CODE, HTML o PHP:
launchctl load ~/Library/LaunchAgents/com.navidrome.server.plist

Y ya está. Así de sencillo.

Captura de pantalla 2026-07-10 a las 7.43.06.png
Insertar CODE, HTML o PHP:
 
La release 0.63 ha debido salir un poco precipitada, porque en 3 días han publicado la 0.63.0, la 0.63.1 y la 0.63.2


:ok :ok :ok
 
Atrás
Arriba Pie