- Rust 76.2%
- HTML 11%
- Vue 5.2%
- TypeScript 2.1%
- CSS 1.4%
- Other 4.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
Build and Push Docker Image / build (push) Successful in 11m9s
Reviewed-on: #148 |
||
| .cargo | ||
| .gitea/workflows | ||
| .kilo | ||
| .serena | ||
| .vscode | ||
| android | ||
| Blackboard | ||
| Blackboard_HTML | ||
| db | ||
| doc | ||
| example_spcd | ||
| LLM/Docker | ||
| old_code | ||
| pmoandroid | ||
| pmoapp | ||
| pmoaudio | ||
| pmoaudio-ext | ||
| pmoaudiocache | ||
| pmoauth | ||
| pmocache | ||
| pmoconfig | ||
| pmocontrol | ||
| pmocovers | ||
| pmodb | ||
| pmodidl | ||
| pmoevent | ||
| pmoevent-macros | ||
| pmoflac | ||
| pmomediarenderer | ||
| pmomediaserver | ||
| pmometadata | ||
| pmomultiroom | ||
| PMOMusic | ||
| pmoparadise | ||
| pmoplayercore | ||
| pmoplaylist | ||
| pmoqobuz | ||
| pmoquery | ||
| pmoradiofrance | ||
| pmoserver | ||
| pmosource | ||
| pmostreaming | ||
| pmoupnp | ||
| pmourlsource | ||
| pmowebrenderer | ||
| pmoyoutube | ||
| ReleaseNotes | ||
| Report | ||
| scripts | ||
| src | ||
| test_upnp | ||
| third_party/axum-oidc-client | ||
| tools | ||
| .claude-env | ||
| .dockerignore | ||
| .DS_Store | ||
| .gitignore | ||
| .pmomusic.yml.example | ||
| AGENTS.md | ||
| analyze_flac.sh | ||
| blackboard-template.html | ||
| BROWSEMETADATA_FIX.md | ||
| bubble_upmpdcli.pcap | ||
| Cargo.lock | ||
| Cargo.toml | ||
| check_audio_quality.sh | ||
| DEPENDENCIES.md | ||
| deps.svg | ||
| detect_clicks.sh | ||
| DEVELOPMENT.md | ||
| docker-build.sh | ||
| docker-compose.yml | ||
| DOCKER.md | ||
| Dockerfile | ||
| fix-mermaid.sh | ||
| headers.txt | ||
| INSTALL_LIBSOXR.md | ||
| INSTALL_NOTES.md | ||
| Makefile | ||
| media_ | ||
| metadata.txt | ||
| Note-eric.md | ||
| OPTIMIZATION_PREBUFFER_TO_PLAYLIST.md | ||
| package-lock.json | ||
| package.json | ||
| Plan_d_implementation_webui_control_point.md | ||
| PLAYER_PMOSOURCE_README.md | ||
| PMOMusic-A-192.png | ||
| PMOMusic-A-512.png | ||
| Readme.md | ||
| rust-analyzer.toml | ||
| rust-toolchain.toml | ||
| SECURITY_CONFIG.md | ||
| setup-deps.sh | ||
| structure.svg | ||
| Syncthing.md | ||
| test-mermaid.md | ||
| test-output.html | ||
| TODO.md | ||
| toto | ||
| UPNP_ANALYSIS_REPORT.md | ||
| UPNP_FIX_SUMMARY.md | ||
| version.txt | ||
PMOMusic
Un serveur de musique pour la maison, écrit en Rust. Il tourne sur une machine du réseau (un NAS, un mini-PC, un Raspberry Pi…) et se pilote depuis un navigateur ou depuis une application Android.
- Serveur UPnP / DLNA : expose vos sources (Qobuz, Radio Paradise, Radio France…) aux lecteurs du réseau.
- Interface web (
/app) : un point de contrôle pour choisir la musique et piloter les lecteurs, et un lecteur intégré au navigateur. - Application Android : le téléphone devient un lecteur pilotable depuis l'interface web, et la musique se parcourt aussi depuis Android Auto.
Version courante : voir version.txt.
1. Installer le serveur avec Docker
L'image est publiée sur le registre du projet :
gargoton.petite-maison-orange.fr/public/pmomusic:latest
Exemple docker-compose.yml
services:
pmomusic:
image: gargoton.petite-maison-orange.fr/public/pmomusic:latest
container_name: pmomusic
restart: always
# La découverte UPnP utilise le multicast : le plus simple est le réseau de l'hôte.
network_mode: host
environment:
PMOMUSIC_CONFIG: /config
RUST_LOG: info
volumes:
- ./config:/config
mkdir -p config && sudo chown 1000:1000 config # le conteneur tourne avec l'utilisateur 1000
docker compose up -d
docker compose logs -f
Puis ouvrez http://<adresse-de-la-machine>:8080/app.
Réseau
UPnP a besoin du multicast sur le réseau local. Deux montages fonctionnent :
network_mode: host(ci-dessus) : le conteneur partage l'adresse de l'hôte. C'est le plus simple.- Un réseau
macvlan: le conteneur reçoit sa propre adresse sur le réseau local (c'est le montage de l'auteur, avec en plus un réseauproxy_webvers le proxy inverse). Dans ce cas, pensez à réglerhost.http_portsi vous voulez un autre port que 8080.
Conseils
- Mettez les bases de données (
host.pmodb.directory) sur un disque local, pas sur un montage réseau (NFS) : SQLite y est très lent. La configuration et les caches supportent mieux le réseau. - L'utilisateur du conteneur est
1000: les volumes doivent lui être accessibles en écriture. - Une variable
PMOMUSIC_CONFIG__<clé>__<sous-clé>surcharge une clé du fichier de configuration, en minuscules comme les clés : par exemplePMOMUSIC_CONFIG__host__http_port=9000.
2. Configuration
Au démarrage, PMOMusic lit config.yaml dans le répertoire indiqué par PMOMUSIC_CONFIG (à défaut : .pmomusic dans le répertoire courant, puis dans le répertoire personnel) et le réécrit avec les valeurs par défaut complétées ; le répertoire doit exister. Seules les clés que vous voulez changer sont nécessaires. Les noms de clés sont en minuscules.
host:
http_port: 8080 # port de l'interface web et de l'API
base_url: "http://192.168.0.32:8080" # adresse annoncée aux lecteurs ; devinée si absente
upnp: # à différencier si plusieurs serveurs tournent sur le même réseau
friendly_name_prefix: "PMOMusic"
udn_prefix: "pmomusic"
pmodb:
directory: "/config/pmodb" # bases de données (disque local conseillé)
logger:
min_level: "INFO"
accounts:
qobuz:
username: "vous@example.org"
password: "votre-mot-de-passe" # en clair, ou chiffré (préfixe `encrypted:`, lié à la machine)
sources:
radio_paradise:
enabled: true # activé par défaut
default_channel: 0
radiofrance:
enabled: true
Autres clés existantes : host.cover_cache, host.audio_cache et host.qobuz_cache (répertoire et taille des caches, durées de validité), host.logger.enable_console et host.logger.buffer_capacity, host.upnp.manufacturer et host.upnp.model_name_prefix.
Derrière un proxy inverse avec authentification (SSO)
PMOMusic peut démarrer un second port protégé par un fournisseur d'identité OpenID Connect (Authelia, Keycloak…), à exposer sur Internet à travers votre proxy. Le port habituel (http_port) reste sans authentification : réservez-le au réseau local.
host:
sso_enabled: true
sso_port: 8081 # port protégé, à exposer par le proxy
oidc:
issuer: "https://auth.example.org"
client_id: "pmomusic"
client_secret: "…"
redirect_base_url: "https://musique.example.org" # adresse publique, telle que vue par le navigateur
android:
client_id: "pmomusic-android"
audience: "https://musique.example.org" # valeur de `aud` des jetons du client Android
Côté fournisseur d'identité, il faut deux clients OIDC :
| Client | Type | Redirection | Usage |
|---|---|---|---|
pmomusic |
confidentiel | <redirect_base_url>/auth/callback |
l'interface web |
pmomusic-android |
public, PKCE S256, token_endpoint_auth_method: none |
pmomusic://oidc |
l'application Android |
Le client Android doit autoriser le scope offline_access (pour le renouvellement de session) et émettre des jetons d'accès JWT signés RS256 avec l'audience ci-dessus.
3. Application Android
L'application (fr.pmo.pmomusic, Android 8.0 ou plus) :
- se comporte comme un lecteur (renderer) du serveur, pilotable depuis l'interface web ;
- affiche l'interface web ;
- expose l'arbre de navigation à Android Auto ;
- accepte les partages : depuis une autre application, Partager → Lire avec PMOMusic envoie une adresse web (épisode de podcast, album ou morceau Qobuz, émission Radio France, flux audio…) que le serveur reconnaît, et le téléphone la lit. Le résultat s'affiche dans une bulle (« Lecture : … » ou la raison de l'échec).
Installation
- Téléchargez
pmomusic-<version>.apk(et son.sha256pour vérifier l'intégrité) depuis la page des versions du projet : https://gargoton.petite-maison-orange.fr/eric/pmomusic/releases - Ouvrez le fichier sur le téléphone et autorisez l'installation depuis cette source.
- Au premier lancement, acceptez la permission de notifications : sans elle le lecteur ne démarre pas.
Une mise à jour s'installe par-dessus la version précédente, sans perdre les réglages.
Réglages
Appui long sur l'icône de l'application, puis Réglages (ou via la page d'infos de l'application) :
- Adresse du serveur : par défaut celle du serveur de l'auteur (
https://orbis.petite-maison-orange.fr). Changez-la pour la vôtre, par exemplehttp://192.168.0.32:8080sur le réseau local ou votre adresse https publique. - Visibilité du lecteur pour les autres appareils : Privé (seul ce téléphone le voit), Auto (visible seulement quand Android Auto est connecté, pour que les passagers pilotent la musique), Visible (toujours).
Si le serveur est protégé par le SSO, l'application affiche au premier lancement la page de connexion de votre fournisseur d'identité ; la session est ensuite renouvelée automatiquement.
Android Auto
L'application n'étant pas installée depuis le Play Store, Android Auto doit accepter les sources inconnues : dans les réglages d'Android Auto, activez le mode développeur (touchez dix fois « Version »), puis Options pour les développeurs → Sources inconnues. PMOMusic apparaît alors dans les applications multimédias de la voiture.
Sans session ouverte, la voiture affiche « Connexion requise » : ouvrez l'application sur le téléphone pour vous connecter.
4. Compiler et contribuer
La compilation depuis les sources, l'application Android et les notes de développement sont dans DEVELOPMENT.md. La construction de l'image Docker est décrite dans DOCKER.md.