Integración externa - Subsonic

[Integración] Subsonic — Conecta Gladys a tu servidor musical (Navidrome, Airsonic…)

Hola a todos :wave:

Acabo de publicar Subsonic, una integración externa que conecta Gladys a cualquier servidor musical que implemente la API Subsonic: Navidrome, Airsonic-Advanced, Gonic, LMS, Subsonic…

Mi necesidad inicial era simple: que Gladys supiera lo que ocurre en mi instancia Navidrome y pudiera reproducir música desde mis escenas. Está desarrollada y probada primero contra Navidrome, pero nada es específico de este servidor.

:link: Repositorio: GitHub - guim31/gladys-subsonic · GitHub


Qué aporta

Dispositivo « Servidor Subsonic » — 6 sensores

Sensor Qué proporciona
Now playing La canción en curso, en formato Artista — Título (oyente)
Portada del álbum La portada del álbum escuchado, actualizada cada vez que cambia la canción
Transmisiones activas Cuántas canciones se están escuchando en este momento
Canciones / Artistas / Álbumes en la biblioteca El tamaño de tu biblioteca

Mostrar la portada en el tablero de control

La portada utiliza el canal de imagen de Gladys: añade un widget Cámara y elige el dispositivo « Servidor Subsonic ». El nombre del widget sorprende al principio, pero es el único de Gladys que muestra la imagen de un dispositivo y se actualiza en tiempo real. El widget Foto, en cambio, solo acepta una lista de URLs fijas introducidas manualmente: no puede seguir lo que se reproduce.

Dispositivo « Jukebox Subsonic » (opcional)

Control de la reproducción en el servidor (función de jukebox de la API): reproducción/pausa, anterior/siguiente, volumen y estado de reproducción. Debe activarse explícitamente tanto en Gladys como en el servidor. El widget Música del tablero de control controla directamente estos comandos.

Botones en la pantalla de configuración

  • Probar la conexión — muestra la identidad del servidor (ej. navidrome 0.63.2, API 1.16.1)
  • Escanear la biblioteca musical
  • Jukebox: reproducción aleatoria (N canciones al azar)
  • Jukebox: reproducir una lista de reproducción (por su nombre)

Algunas ideas de escenas

  • No molestar: si Transmisiones activas > 0, no iniciar el aspirador o apagar los altavoces.
  • Despertar con música: a las 7 h, la acción « reproducir una lista de reproducción » inicia tu lista de reproducción matutina en el jukebox.
  • Reaccionar a la canción: el sensor « Now playing » es una característica de texto, y Gladys activa sus escenas cuando cambia su valor — por lo tanto, puedes hacer que tu instalación reaccione a cada nueva canción (mostrar el título, ajustar las luces…).
  • Tablero de control: la portada en grande (widget Cámara), el título actual y los comandos del jukebox lado a lado.

Instalación

Requisito previo: Gladys 4.86.0 o superior.

Desde Integraciones → Instalar una integración, busca « Subsonic » en el catálogo.

Luego, en la pestaña Configuración:

  1. URL del servidor: la raíz, sin /rest — ej. http://192.168.1.10:4533 (puerto por defecto de Navidrome).
  2. Usuario / Contraseña: una cuenta de tu servidor (crea una dedicada si es posible).
  3. Método de autenticación: deja Token. La contraseña nunca se transfiere, solo se envía un hash md5 salado. Cambia a Legacy solo para un servidor muy antiguo (API < 1.13) o una cuenta LDAP que rechaza el token.
  4. Haz clic en Probar la conexión, luego recupera el dispositivo en la pestaña Descubrimiento.

Para el jukebox

Reproduce la música en la máquina que alberga el servidor (aquella conectada a tus altavoces). Debe activarse en ambos lados — en Navidrome:

[Jukebox]
Enabled = true

(o ND_JUKEBOX_ENABLED=true), luego marca Activar el dispositivo jukebox en la configuración de la integración.


Qué no hace (para evitar malentendidos)

Mejor ser claro sobre los límites, que provienen de la propia API Subsonic:

  • El jukebox reproduce en el host del servidor, no en la máquina de Gladys: no es una solución multiroom.
  • Imposible controlar otro cliente (tu teléfono, el reproductor web): la API no permite controlar la reproducción de un cliente externo.
  • No hay anuncio vocal a través de esta integración: la acción « Reproducir una notificación » de Gladys envía una URL de audio TTS, pero el jukebox Subsonic solo sabe reproducir canciones de la biblioteca. Eso sigue siendo el terreno de Sonos / Chromecast.

Aspectos técnicos

Construido a partir del plantilla oficial JavaScript y del SDK @gladysassistant/integration-sdk. Node 24 Alpine, imagen multi-arch (amd64 + arm64), rootfs en solo lectura, pruebas unitarias y CI (Prettier / ESLint / pruebas) en cada commit. Licencia Apache-2.0.

Un pequeño cuidado especial en las solicitudes enviadas al servidor: la lista completa de artistas solo se relee cuando la biblioteca ha cambiado (firma de escaneo) o una vez por hora, en lugar de volver a descargarse en cada lectura — los valores siguen publicándose en cada ciclo. La portada sigue la misma lógica: solo se descarga cuando cambia la canción, y en el tamaño más grande que se ajuste al límite del canal de imagen.


Los comentarios, informes de errores e ideas de funcionalidades son bienvenidos, aquí o en los issues del repositorio. Si lo pruebas con algo que no sea Navidrome, me interesa mucho saber si todo funciona bien :slight_smile:

Hola @guim31, quería saber cómo vincular el LMS del que dispongo con tu integración. Mi configuración de LMS no requiere autenticación y es obligatorio en la integración. ¿Hay alguna solución?

Hola @Tolkyen :wave:

Buenas noticias: debería funcionar sin cambiar nada, pero hay que pasar por una clave de API.

No es la integración la que es demasiado exigente: el protocolo Subsonic transporta identificadores en cada solicitud, simplemente no tiene un modo «sin autenticación». Y del lado de LMS (si es realmente Lightweight Music Server el que usas), es aún más claro — su documentación especifica que su API Subsonic acepta únicamente la autenticación por clave de API, independientemente de que tu interfaz web no te pida nada.

Concretamente:

  1. En LMS, abre la página Settings de tu usuario y genera una clave de API.
  2. En la configuración de la integración Gladys:
    • Usuario: tu identificador LMS
    • Contraseña: la clave de API (y no una contraseña de cuenta)
    • Método de autenticación: deja Token
  3. Haz clic en Probar la conexión.

He verificado en el código de LMS: con el método Token, calcula el hash salado de cada una de las claves de API de tu usuario y las compara con el que enviamos — por lo tanto, el esquema por defecto de la integración es adecuado. Si algo falla, cambia a Legacy, LMS también maneja este formato.

Un punto de atención de todos modos: solo he probado Navidrome. El reproductor de música, por ejemplo, puede comportarse de manera diferente — LMS tiene su propia implementación. Tu retroalimentación me interesa mucho, serías el primero en LMS :slight_smile:

Entiendo de dónde viene mi problema, cuando leí LMS, entendí Logitech Media Server y no Lightweight Music Server :sweat_smile:

Ah, vaya… en efecto, no podía funcionar, ¡Logitech Media Server no se basa en la API Subsonic! Vas a tener que pedir una integración para ti :wink:

Hola,

Gracias por esta integración
Estoy instalándola con un servidor Navidrome
Por lo tanto, he creado un usuario dedicado
La conexión es correcta, pero tengo un mensaje de error en el escaneo:

He creado un usuario clásico sin derechos de administrador
Quizás me he perdido algo, pero no sé qué :sweat_smile:

Lo he probado mediante el método Token y Legacy y tengo el mismo resultado

Gracias

Hola @prohand, gracias por el feedback :slight_smile:

startScan es el único endpoint utilizado por la integración que Navidrome reserva para los administradores (está codificado en el enrutador Subsonic). Tu usuario dedicado es una cuenta estándar, por lo que Navidrome rechaza la operación, de ahí el error 50. De hecho, por eso Jeton y Legacy dan el mismo resultado: la autenticación funciona muy bien (tu « Probar la conexión » está en verde), pero es el permiso lo que falla, y el método de autenticación no cambia nada.

Dos opciones:

  • No hacer nada — eso es lo que recomiendo. Este botón es solo un atajo de comodidad: Navidrome ya escanea por sí mismo (según su programación y su monitoreo de carpetas), y los sensores de la integración seguirán en el próximo registro. Ninguna otra funcionalidad necesita permisos de administrador.
  • Convertir esta cuenta en administrador en Navidrome, si insistes en iniciar el escaneo desde Gladys.

Todo lo demás funciona perfectamente con una cuenta estándar: los sensores, la canción actual, la portada del álbum e incluso el jukebox (allí, es Jukebox.Enabled del lado del servidor lo que cuenta, no los permisos de administrador).

El verdadero defecto aquí está de mi lado: el mensaje se muestra en verde, como un éxito, cuando en realidad es un rechazo — y no explica la causa. Lo voy a corregir para que aparezca claramente como un error, con la razón. ¡Gracias por reportarlo!

Gracias por la respuesta
Acabo de verificar y efectivamente veo mi servidor :slight_smile:

Gracias :wink:

No sé si es un error o es normal, pero acabo de detener la música en Navidrome y me indica que sigue habiendo una canción en reproducción.

Para la música que sigue apareciendo: no es un error, es el funcionamiento de la lista « en reproducción » de Navidrome. Una sesión se mantiene después de detenerse — 30 minutos si el reproductor ha notificado la pausa o el fin, de lo contrario hasta el final teórico de la pista, ya que el protocolo Subsonic clásico no tiene la noción de « parada »: un cliente simplemente deja de pedir nada.

Pero no estaba aprovechando una información que proporciona Navidrome: el estado real de cada sesión. Esto se ha corregido en la próxima versión — solo se contabilizan las sesiones realmente en reproducción, por lo que tu parada se tendrá en cuenta en el siguiente registro (máximo 60 s).

Quedará un caso irreductible: un reproductor que se cierra sin avisar al servidor sigue listado hasta el final de la pista. Allí, nadie puede hacer mejor.

También he corregido el mensaje del escaneo: ahora se muestra en rojo, con la explicación (derechos de administrador) en lugar de un código de error bruto. ¡Gracias por estos dos comentarios!! :slight_smile:

Gracias por las correcciones :smiling_face:

:musical_note: Subsonic 1.1.0 está disponible, con tres widgets de panel de control: En reproducción (quién escucha qué, con las portadas), Tocadiscos (un verdadero mando a distancia: reproducción/pausa, anterior, siguiente, aleatorio) y Biblioteca (temas, artistas, álbumes, estado del último escaneo y botón de Escanear). ¡Ya no es necesario pasar por el widget de la Cámara para mostrar una portada!

:warning: Esta versión requiere Gladys 5.1 como mínimo: actualice Gladys primero, de lo contrario, no se le ofrecerá la actualización de la integración.

La actualización se realiza en Integraciones; sus dispositivos y escenas no cambian. @prohand, un comentario sobre tu Navidrome sería bienvenido :slightly_smiling_face:

Por mi parte no uso el modo jukebox, por lo que no podré reportar cosas de ese lado.
Por otro lado, en cuanto al widget de escucha, veo el nombre de la aplicación que se está reproduciendo:


No sé si en su lugar o añadiendo se puede poner el nombre de la persona que está escuchando.

Edición: Veo en los registros que el nombre del usuario se reporta, por lo que debe haber una posibilidad :sweat_smile:

Gracias :wink:

Subsonic 1.1.1 está disponible: el badge del widget « Escuchando » ahora muestra a la persona que está escuchando, y el reproductor (Symfonium, etc.) aparece con un clic en la línea. ¡Gracias por la idea :+1:!