Integración externa Airplay

Le hice tu pregunta a Claude y la respuesta es mixta:

"Sí, creo que hay que pasar a @sonn-audio/node-airplay. Pero al examinarla, encontré un problema más importante que la elección de la biblioteca: afecta a los HomePod, independientemente de la biblioteca utilizada.

¿Por qué cambiar?

  • Mantenimiento: @lox-audioserver/node-airplay-sender está archivada, mientras que la nueva se publicó a finales de agosto y la 0.1.2 es del 22 de septiembre.
  • Licencia: la nueva está bajo Apache-2.0, como el template, y no tiene dependencias. La integración podría, por tanto, salir de la AGPL que le había impuesto debido a la antigua.
  • Calidad: el autor dice haberla probado en un HomePod (OS 27) y un BeoLab 50. Realmente gestiona AirPlay 2, eligiendo automáticamente el método de sincronización que el altavoz acepta (PTP o NTP). También gestiona el intercambio de autenticación de algunos viejos receptores AirPlay 1 que rechazan la conexión sin él.
  • Un argumento fuerte: su README indica que los HomePod y Apple TV recientes (OS 27) aceptan una sesión AirPlay 1 pero se quedan mudos. La antigua biblioteca solo hacía un AirPlay 2 « best-effort ». En un HomePod reciente, la integración actual podría, por tanto, no producir ningún sonido.

Lo que cuesta

  • La biblioteca es joven (0.1.x, un solo autor).
  • Su interfaz es de bajo nivel: conexión, sincronización, paquetes de audio. Sería necesario reescribir la lógica de lectura, es decir, unas 250 líneas en src/player.js. Esta sesión no está en ejecución, por lo que sus archivos no pueden abrirse. Envíe un mensaje para reiniciarla.
  • Este archivo está aislado del resto: el descubrimiento, las escenas, el widget y las pruebas de la aplicación no cambian. Solo sería necesario conservar, además, el campo et de los registros mDNS.

El problema de fondo, que la biblioteca no resuelve

He verificado en el código de Gladys cómo crea el contenedor de una integración. Está en una red Docker en modo bridge, con todas las capacidades Linux retiradas. No es posible ningún modo de red host, ni para el contenedor principal ni para un subcontenedor, y los puertos expuestos se asignan aleatoriamente.

  • Para los HomePod / Apple TV (PTP): el emisor debe servir el reloj en los puertos UDP 319/320, y el altavoz viene a interrogarlo a la dirección que el emisor le da. Esta dirección sería la IP interna del contenedor (172.x), inalcanzable desde la red local. Estos dispositivos probablemente se quedarían, por tanto, mudos.
  • Para los altavoces de terceros en NTP y los receptores AirPlay 1: es más favorable, pero nada lo garantiza, ya que el altavoz también debe volver a contactar con el emisor.

Lo había señalado como un límite; en realidad, es potencialmente bloqueante para los HomePod. La verdadera solución sería que Gladys ofreciera una opción de red para este tipo de integración. Vale la pena abordarlo con los mantenedores de Gladys."

¿Quizás guardar esta solución bajo el brazo y esperar a que madure un poco?

Y en realidad, aún no he tenido la oportunidad de probarlo, pero quizá aún no sea posible pasar a integración externa en este estado

Sí, había visto la librería para la « antigua » integración interna, pero quizá tengas razón, podemos vigilarla para usarla más tarde. En general, siempre es mejor tener una librería mantenida que una vieja librería abandonada.

Dada la última frase que has puesto de tu Claude, sí, en efecto no me parece que sea posible. Voy a intentar probarlo rápidamente, y te digo si funciona.

@GBoulvin no parece funcionar, haré más pruebas el domingo con un verdadero Homepod

[2026-10-29T21:40:02.135Z] [INFO] [app] Action test_speaker <- ext:ext-gboulvin-gladys-airplay:speaker:faee67b415d7
[2026-10-29T21:40:02.160Z] [INFO] [player] Playing on Speaker (172.16.8.255:7000, AirPlay 2)
/app/node_modules/bplist-parser/bplistParser.js:64
    throw new Error("Invalid binary plist. Expected 'bplist' at offset 0.");
    ^

Error: Invalid binary plist. Expected 'bplist' at offset 0.
    at exports.parseBuffer (/app/node_modules/bplist-parser/bplistParser.js:64:11)
    at Client.processData (/app/node_modules/@lox-audioserver/node-airplay-sender/dist/core/rtsp.js:1501:43)
    at Socket.<anonymous> (/app/node_modules/@lox-audioserver/node-airplay-sender/dist/core/rtsp.js:211:18)
    at Socket.emit (node:events:514:28)
    at addChunk (node:internal/streams/readable:569:12)
    at readableAddChunkPushByteMode (node:internal/streams/readable:520:3)
    at Readable.push (node:internal/streams/readable:400:5)
    at TCP.onStreamRead (node:internal/stream_base_commons:194:23)

Según Claude, tu registro muestra que hay que usar la nueva lib. Ha salido una nueva versión de la integración. ¿Podrías probarla?

Sí, te lo pruebo