Externe AirPlay-Integration

Ich habe deine Frage an Claude gestellt und die Antwort ist gemischt:

"Ja, ich denke, wir sollten zu @sonn-audio/node-airplay wechseln. Aber bei der Untersuchung habe ich ein größeres Problem als die Wahl der Bibliothek gefunden: Es betrifft die HomePods, unabhängig von der verwendeten Bibliothek.

Warum wechseln

  • Wartung: @lox-audioserver/node-airplay-sender ist archiviert, während die neue Ende August veröffentlicht wurde und die Version 0.1.2 vom 22. September stammt.
  • Lizenz: Die neue ist unter Apache-2.0, wie das Template, und hat keine Abhängigkeiten. Die Integration könnte daher die AGPL verlassen, die ich ihr aufgrund der alten Bibliothek auferlegt hatte.
  • Qualität: Der Autor sagt, er habe sie auf einem HomePod (OS 27) und einem BeoLab 50 getestet. Sie unterstützt wirklich AirPlay 2, indem sie automatisch die Synchronisationsmethode auswählt, die das Gerät akzeptiert (PTP oder NTP). Sie unterstützt auch den Authentifizierungsaustausch einiger alter AirPlay-1-Empfänger, die die Verbindung ohne ihn ablehnen.
  • Ein starkes Argument: Ihr README besagt, dass die neuen HomePods und Apple TVs (OS 27) eine AirPlay-1-Sitzung akzeptieren, aber stumm bleiben. Die alte Bibliothek machte nur einen „best-effort“-AirPlay 2. Auf einem neuen HomePod könnte die aktuelle Integration daher keinen Ton erzeugen.

Was es kostet

  • Die Bibliothek ist jung (0.1.x, ein einzelner Autor).
  • Ihre Schnittstelle ist niedrig: Verbindung, Synchronisation, Audio-Pakete. Die Leselogik müsste neu geschrieben werden, etwa 250 Zeilen in src/player.js.
  • Diese Sitzung wird nicht ausgeführt, ihre Dateien können daher nicht geöffnet werden. Senden Sie eine Nachricht, um sie neu zu starten.
  • Diese Datei ist vom Rest isoliert: Die Entdeckung, die Szenen, das Widget und die Anwendungstests ändern sich nicht. Es müsste nur zusätzlich das Feld et der mDNS-Aufzeichnungen beibehalten werden.

Das grundlegende Problem, das die Bibliothek nicht löst

Ich habe im Code von Gladys überprüft, wie er den Container einer Integration erstellt. Er befindet sich in einem Docker-Netzwerk im Bridge-Modus, mit allen Linux-Fähigkeiten entfernt. Kein Netzwerkmodus host ist möglich, weder für den Hauptcontainer noch für einen Untercontainer, und die exponierten Ports werden zufällig zugewiesen.

  • Für HomePod / Apple TV (PTP): Der Sender muss die Uhr auf den UDP-Ports 319/320 bereitstellen, und das Gerät kommt, um sie an der Adresse zu fragen, die der Sender ihm gibt. Diese Adresse wäre die interne IP des Containers (172.x), die vom lokalen Netzwerk aus nicht erreichbar ist. Diese Geräte würden daher wahrscheinlich stumm bleiben.
  • Für Drittanbieter-Lautsprecher in NTP und AirPlay-1-Empfänger: Es ist günstiger, aber nichts garantiert es, denn das Gerät muss den Sender auch erneut kontaktieren.

Ich hatte es als eine Grenze gemeldet; es ist tatsächlich potenziell blockierend für die HomePods. Die echte Lösung wäre, dass Gladys eine Netzwerkoption für diese Art von Integration anbietet. Es lohnt sich, dies mit den Gladys-Maintainern anzusprechen."

Vielleicht diese Lösung vorerst beiseitelegen und abwarten, bis sie etwas reift?

Und tatsächlich hatte ich noch keine Gelegenheit, es zu testen, aber es ist vielleicht noch nicht möglich, in den aktuellen Zustand in eine externe Integration zu wechseln.

Ja, ich hatte die Lib für die „alte“ interne Integration gesehen, aber du hast vielleicht recht, wir können sie im Auge behalten, um sie später zu verwenden. Im Allgemeinen ist es immer besser, eine gepflegte Lib zu haben als eine alte, veraltete.

Angesichts des letzten Satzes, den du von deinem Claude geschrieben hast, scheint es tatsächlich nicht möglich zu sein. Ich werde versuchen, es schnell zu testen, und ich sage dir, ob es funktioniert.

@GBoulvin das scheint nicht zu funktionieren, ich werde dir am Sonntag mit einem echten Homepod mehr Tests machen

[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("Ungültige binäre Plist. Erwartet 'bplist' an Offset 0.");
    ^

Error: Ungültige binäre Plist. Erwartet 'bplist' an 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)

Laut Claude zeigt dein Log, dass du die neue Bibliothek verwenden solltest. Eine neue Version des Integrationsprozesses ist erschienen. Kannst du das testen?

Ja, ich teste das für dich.