Tune by Mozaiklabs

Guide technique

Cette page s'adresse aux utilisateurs avancés et aux intégrateurs : comment Tune est construit, son API et les détails d'exploitation. Pour les réglages courants, voir Configuration.

Architecture

  • Serveur : un seul programme, tune-server, écrit en Rust. Il indexe la bibliothèque, décode l'audio, pilote les appareils et sert l'interface web, l'API et les flux audio, le tout sur un même port (8888 par défaut).
  • Interface web : une application Svelte servie par le serveur (dossier web/ à côté du programme, ou TUNE_WEB_DIR).
  • Base de données : SQLite par défaut ; PostgreSQL en option (voir Configuration). Les migrations s'appliquent au démarrage.
  • Décodage : décodeurs intégrés (Symphonia, plus des décodeurs WavPack et APE propres à Tune, et libopus). Le rééchantillonnage se fait par interpolation sinc (rubato). La lecture ne passe pas par ffmpeg ; un ffmpeg minimal est fourni avec les versions publiées, uniquement pour l'encodage AAC du convertisseur.
  • Découverte : SSDP pour DLNA/UPnP, mDNS pour AirPlay et Chromecast, découverte Squeezebox sur UDP 3483.
  • Tune se présente aussi lui-même au réseau comme serveur multimédia UPnP (sa bibliothèque est visible des applications de contrôle DLNA) et, zone par zone, comme renderer UPnP.

API HTTP

Toutes les routes sont sous /api/v1. Une liste des routes au format JSON est servie par GET /api/v1/system/api-docs (lien Documentation API dans Réglages › Système › À propos). Tune ne fournit pas de description OpenAPI.

RouteRôle
GET /api/v1/system/healthÉtat du serveur : ok ou degraded (HTTP 200), error (HTTP 503)
GET /api/v1/system/versionVersion du serveur
GET /api/v1/system/statsStatistiques (route utilisée par le contrôle de santé de l'image Docker)
POST /api/v1/system/scan, GET /api/v1/system/scan/statusLancer un scan, suivre son avancement
GET /api/v1/system/logs?lines=NDernières lignes du journal (1000 par défaut)
GET /api/v1/system/diagnostics/bundleArchive de diagnostic
GET /api/v1/zonesListe des zones
GET /api/v1/zones/{id}/statusÉtat de lecture d'une zone
POST /api/v1/zones/{id}/play, /pause, /resume, /stop, /next, /previous, /seek, /volumeCommandes de lecture
GET /api/v1/zones/{id}/queueFile d'attente
GET /api/v1/searchRecherche dans la bibliothèque et les services
GET /api/v1/library/albums, /artists, /tracksBibliothèque

Les événements en temps réel (lecture, file, scan…) passent par un WebSocket sur /ws (ou /api/v1/ws). Les anciennes routes /api/scan sans v1 n'existent plus.

Authentification

Elle est désactivée par défaut : l'API est alors ouverte à tout le réseau local. Elle s'active par l'API (/api/v1/auth/config) : les comptes sont les profils Tune, les mots de passe sont hachés en Argon2, et les sessions sont des jetons JWT de 24 heures. Un jeton d'API longue durée s'obtient par POST /api/v1/auth/token. Les en-têtes acceptés sont Authorization: Bearer <jeton> et Authorization: ApiKey <clé>. Même avec l'authentification active, /system/health et /system/version restent publics. Tune ne fournit pas de HTTPS : placez un proxy inverse devant lui si vous en avez besoin.

Compatibilité Squeezebox / LMS

  • Serveur SlimProto intégré sur le port 3483 (TCP et UDP, réglable par TUNE_SLIMPROTO_PORT), pour Squeezelite et les lecteurs Squeezebox.
  • Port de commande texte compatible LMS sur 9090 (TUNE_CLI_PORT), qui passe au port libre suivant si 9090 est pris.

Exploitation

  • Paquet .deb : programme dans /opt/tune/, données dans /var/lib/tune/, configuration dans /etc/default/tune-server (conservée lors des mises à jour), unité tune-server.service sous l'utilisateur tune. apt purge ne supprime jamais /var/lib/tune.
  • Docker : image renesenses/tune (amd64, arm64). Elle tourne sous l'utilisateur non root tune (uid 1000), avec les volumes /data et /music. Elle n'inclut ni les sorties audio locales ni PostgreSQL. Sur arm64, AirPlay 2 n'est pas disponible et Tune utilise AirPlay 1.
  • Tune OS : base Fedora. Programme dans /opt/tune, service tune, données dans /opt/tune/data, port 80 redirigé vers 8888, SSH actif (connexion root refusée).
  • Journal : RUST_LOG permet un filtrage fin par module.

Voir aussi