Tune by Mozaiklabs

Technischer Leitfaden

Diese Seite richtet sich an fortgeschrittene Nutzer und Integratoren: wie Tune aufgebaut ist, seine API und betriebliche Details. Für die alltäglichen Einstellungen siehe Konfiguration.

Architektur

  • Server: ein einziges Programm, tune-server, geschrieben in Rust. Es indiziert die Bibliothek, dekodiert Audio, steuert Geräte und liefert die Weboberfläche, die API und die Audiostreams aus, alles über einen Port (standardmäßig 8888).
  • Weboberfläche: eine Svelte-Anwendung, die vom Server ausgeliefert wird (der Ordner web/ neben dem Programm, oder TUNE_WEB_DIR).
  • Datenbank: standardmäßig SQLite, optional PostgreSQL (siehe Konfiguration). Migrationen laufen beim Start.
  • Dekodierung: integrierte Decoder (Symphonia sowie die eigenen WavPack- und APE-Decoder von Tune und libopus). Das Resampling nutzt Sinc-Interpolation (rubato). Die Wiedergabe läuft nicht über ffmpeg; mit den veröffentlichten Builds wird ein minimales ffmpeg ausgeliefert, nur für die AAC-Kodierung des Konverters.
  • Erkennung: SSDP für DLNA/UPnP, mDNS für AirPlay und Chromecast, Squeezebox-Erkennung auf UDP 3483.
  • Tune tritt im Netzwerk außerdem als UPnP-Medienserver auf (seine Bibliothek ist für DLNA-Steuerungs-Apps sichtbar) und, Zone für Zone, als UPnP-Renderer.

HTTP-API

Alle Routen liegen unter /api/v1. Eine JSON-Liste der Routen wird unter GET /api/v1/system/api-docs bereitgestellt (der Link API-Dokumentation unter Einstellungen › System › Über). Tune stellt keine OpenAPI-Beschreibung bereit.

RouteZweck
GET /api/v1/system/healthServerzustand: ok oder degraded (HTTP 200), error (HTTP 503)
GET /api/v1/system/versionServerversion
GET /api/v1/system/statsStatistiken (vom Health-Check des Docker-Images verwendet)
POST /api/v1/system/scan, GET /api/v1/system/scan/statusEinen Scan starten, seinen Fortschritt verfolgen
GET /api/v1/system/logs?lines=NLetzte Protokollzeilen (standardmäßig 1000)
GET /api/v1/system/diagnostics/bundleDiagnosearchiv
GET /api/v1/zonesListe der Zonen
GET /api/v1/zones/{id}/statusWiedergabestatus einer Zone
POST /api/v1/zones/{id}/play, /pause, /resume, /stop, /next, /previous, /seek, /volumeWiedergabebefehle
GET /api/v1/zones/{id}/queueWarteschlange
GET /api/v1/searchSuche in der Bibliothek und in den Diensten
GET /api/v1/library/albums, /artists, /tracksBibliothek

Echtzeitereignisse (Wiedergabe, Warteschlange, Scan …) laufen über einen WebSocket unter /ws (oder /api/v1/ws). Die alten Routen /api/scan ohne v1 gibt es nicht mehr.

Authentifizierung

Die Authentifizierung ist standardmäßig ausgeschaltet, wodurch die API für das gesamte lokale Netzwerk offen ist. Sie wird über die API eingeschaltet (/api/v1/auth/config). Konten sind Tune-Profile, Passwörter werden mit Argon2 gehasht, und Sitzungen sind 24-Stunden-JWTs. Ein langlebiges API-Token wird mit POST /api/v1/auth/token ausgestellt. Akzeptierte Header: Authorization: Bearer <token> und Authorization: ApiKey <key>. Auch bei eingeschalteter Authentifizierung bleiben /system/health und /system/version öffentlich. Tune liefert kein HTTPS aus: Setzen Sie bei Bedarf einen Reverse-Proxy davor.

Squeezebox- / LMS-Kompatibilität

  • Integrierter SlimProto-Server auf Port 3483 (TCP und UDP, konfigurierbar mit TUNE_SLIMPROTO_PORT), für Squeezelite- und Squeezebox-Player.
  • LMS-kompatibler Text-Befehlsport auf 9090 (TUNE_CLI_PORT), der zum nächsten freien Port wechselt, wenn 9090 belegt ist.

Betrieb

  • .deb-Paket: Programm in /opt/tune/, Daten in /var/lib/tune/, Konfiguration in /etc/default/tune-server (bleibt bei Upgrades erhalten), Unit tune-server.service, die als Benutzer tune läuft. apt purge entfernt /var/lib/tune nie.
  • Docker: Image renesenses/tune (amd64, arm64). Es läuft als Nicht-Root-Benutzer tune (uid 1000), mit den Volumes /data und /music. Es enthält weder lokale Audioausgänge noch PostgreSQL. Unter arm64 ist AirPlay 2 nicht verfügbar, und Tune verwendet AirPlay 1.
  • Tune OS: auf Fedora basierend. Programm in /opt/tune, Dienst tune, Daten in /opt/tune/data, Port 80 auf 8888 weitergeleitet, SSH aktiviert (Root-Anmeldung verweigert).
  • Protokolle: RUST_LOG erlaubt eine feine Filterung pro Modul.

Siehe auch