No description
  • Rust 76.2%
  • HTML 11%
  • Vue 5.2%
  • TypeScript 2.1%
  • CSS 1.4%
  • Other 4.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Eric Coissac c1a1ca450b
All checks were successful
Build and Push Docker Image / build (push) Successful in 11m9s
Merge pull request 'push-uuvvulokvlns' (#148) from push-uuvvulokvlns into main
Reviewed-on: #148
2026-10-01 21:40:57 +02:00
.cargo chore: bump version to 0.3.26 and configure custom cargo registry 2026-03-24 16:15:08 +01:00
.gitea/workflows Update version and improve release process 2026-09-20 16:59:22 +02:00
.kilo refactor: rework search implementation and fix navigation bug 2026-06-11 22:02:38 +02:00
.serena expand project configuration and fix stream detection URL parsing 2026-08-29 15:57:23 +02:00
.vscode Enorme refactoring de PMO control step 2 2026-01-03 08:00:08 +01:00
android Implement media sharing flow with outcomes. 2026-10-01 21:28:11 +02:00
Blackboard Implement volume calibration and device lifecycle monitoring 2026-09-30 18:36:25 +02:00
Blackboard_HTML Correction and completion of the blackboard 2026-01-16 08:34:19 +01:00
db Change ID: xnmuwquy 2025-09-07 12:14:50 +02:00
doc Gros refactoring 2025-10-05 22:03:13 +02:00
example_spcd On avance... 2025-09-06 17:45:28 +02:00
LLM/Docker update the LLM Docker description 2025-09-06 17:47:24 +02:00
old_code Ajout de la gestion des couvertures d'albums par le FlacCacheSink 2025-11-03 20:48:58 +01:00
pmoandroid Implement media sharing flow with outcomes. 2026-10-01 21:28:11 +02:00
pmoapp Implement media sharing flow with outcomes. 2026-10-01 21:28:11 +02:00
pmoaudio Introduce diagnostic logging and fix playback clock state 2026-09-30 18:22:13 +02:00
pmoaudio-ext Refactor audio streaming to pmostreaming 2026-09-09 20:26:36 +02:00
pmoaudiocache Implement media decoding, transcoding, and YouTube source integration 2026-10-01 21:35:29 +02:00
pmoauth Refactor Android media playback and sharing logic 2026-09-21 06:16:39 +02:00
pmocache Implement media decoding, transcoding, and YouTube source integration 2026-10-01 21:35:29 +02:00
pmoconfig Implement device retention and stale purge logic 2026-09-24 22:12:20 +02:00
pmocontrol Implement media sharing flow with outcomes. 2026-10-01 21:28:11 +02:00
pmocovers Refactor cache initialization to require a database root path 2026-09-11 07:52:35 +02:00
pmodb Refactor store API and backend implementation 2026-09-24 22:10:22 +02:00
pmodidl Refactor player API, implement stream refresh, and enhance metadata handling 2026-09-25 16:55:53 +02:00
pmoevent Implement core event system and cache logic 2026-09-05 18:38:28 +02:00
pmoevent-macros Implement core event system and cache logic 2026-09-05 18:38:28 +02:00
pmoflac Implement media decoding, transcoding, and YouTube source integration 2026-10-01 21:35:29 +02:00
pmomediarenderer Implement robust stream management and calibration logic 2026-09-30 18:33:18 +02:00
pmomediaserver Bump version to 0.5.5 and update infrastructure 2026-10-01 21:36:33 +02:00
pmometadata Implement cover image management and permanent ID system 2026-09-09 20:22:43 +02:00
pmomultiroom Bump version to 0.5.2 2026-09-30 20:08:20 +02:00
PMOMusic Bump version to 0.5.5 and update infrastructure 2026-10-01 21:36:33 +02:00
pmoparadise Introduce pagination and total count support 2026-09-11 19:39:59 +02:00
pmoplayercore Feature: Implement transport volume and seek controls 2026-09-30 18:06:06 +02:00
pmoplaylist Refactor cache initialization to require a database root path 2026-09-11 07:52:35 +02:00
pmoqobuz Implement media decoding, transcoding, and YouTube source integration 2026-10-01 21:35:29 +02:00
pmoquery reflexions sur la recherche 2026-09-22 06:21:19 +02:00
pmoradiofrance Refactor player API, implement stream refresh, and enhance metadata handling 2026-09-25 16:55:53 +02:00
pmoserver Ensure device paths are blocked and handle host mismatches correctly 2026-09-12 21:47:54 +02:00
pmosource Introduce pagination and total count support 2026-09-11 19:39:59 +02:00
pmostreaming Implement content clock synchronization and session management 2026-09-30 18:15:55 +02:00
pmoupnp Refactor cache system to support lazy loading 2026-09-10 16:36:13 +02:00
pmourlsource Implement media decoding, transcoding, and YouTube source integration 2026-10-01 21:35:29 +02:00
pmowebrenderer Introduce renderer privacy and visibility logic 2026-09-20 16:05:20 +02:00
pmoyoutube Implement media decoding, transcoding, and YouTube source integration 2026-10-01 21:35:29 +02:00
ReleaseNotes Bump version to 0.5.5 and update infrastructure 2026-10-01 21:36:33 +02:00
Report ⚡ Optimise frontend performance for large playlists (~1000 tracks) 2026-04-06 17:48:41 +02:00
scripts Implement secure Bearer token validation for Android SSO 2026-09-20 14:57:49 +02:00
src Mise en place de la synchronisation de la playlist du point de contrôle avec celle du serveur de média. 2025-12-06 12:48:21 +01:00
test_upnp Bon ben... 2025-10-29 22:35:53 +01:00
third_party/axum-oidc-client Implement OAuth2/OIDC client with multi-cache and token refresh 2026-09-20 21:07:04 +02:00
tools Refactor station data management: externalize to generated file + improve metadata handling 2026-03-25 20:18:20 +01:00
.claude-env update de qobuz pour utiliser les sources lazy 2025-12-28 12:37:10 +01:00
.dockerignore Add docker image building 2025-12-23 13:03:18 +01:00
.DS_Store Refactor playback state transitions and encoder restart logic 2026-09-13 14:59:50 +02:00
.gitignore Implement tab synchronization and renderer filtering 2026-09-13 15:41:03 +02:00
.pmomusic.yml.example security: Remove sensitive credentials from repository 2025-11-04 20:38:10 +00:00
AGENTS.md Track bundle versions and enforce strict agent interaction rules 2026-08-31 23:37:43 +02:00
analyze_flac.sh Add FLAC analysis scripts for click detection 2025-11-08 20:09:00 +00:00
blackboard-template.html Correction and completion of the blackboard 2026-01-16 08:34:19 +01:00
BROWSEMETADATA_FIX.md debug du upnp mediaserver 2025-12-06 12:48:21 +01:00
bubble_upmpdcli.pcap Bon, à nouveau ça marche plus dans bubble UPNP. 2025-12-06 12:48:21 +01:00
Cargo.lock Bump version to 0.5.5 and update infrastructure 2026-10-01 21:36:33 +02:00
Cargo.toml Implement media decoding, transcoding, and YouTube source integration 2026-10-01 21:35:29 +02:00
check_audio_quality.sh Add audio quality check script with delta ratio analysis 2025-11-08 20:19:02 +00:00
DEPENDENCIES.md Les playlists suivent la lecture de leurs morceaux. 2025-12-06 12:48:21 +01:00
deps.svg Gros refactoring 2025-10-05 22:03:13 +02:00
detect_clicks.sh Add FLAC analysis scripts for click detection 2025-11-08 20:09:00 +00:00
DEVELOPMENT.md Refactor Android media playback and sharing logic 2026-09-21 06:16:39 +02:00
docker-build.sh bump version to 0.4.13 and automate Dockerfile crate synchronization 2026-09-05 07:35:44 +02:00
docker-compose.yml cache: add batch retrieval and update operations for albums, tracks, and artists 2026-09-03 01:09:34 +02:00
DOCKER.md Update dependency version and implement multi-stage Docker build 2026-09-13 15:42:16 +02:00
Dockerfile Bump version to 0.5.5 and update infrastructure 2026-10-01 21:36:33 +02:00
fix-mermaid.sh Correction and completion of the blackboard 2026-01-16 08:34:19 +01:00
headers.txt Patch of the web logger 2025-10-20 19:50:58 +02:00
INSTALL_LIBSOXR.md Documenter le contenu de setup-env.sh dans la documentation 2025-11-06 07:47:10 +00:00
INSTALL_NOTES.md Améliorer la documentation d'installation et ajouter des scripts automatiques 2025-11-06 07:45:36 +00:00
Makefile Implement dynamic multiroom playback and sink management 2026-09-29 17:56:23 +02:00
media_ Mise en place d'un bus d'événements pour les serveurs de médias. 2025-12-06 12:48:21 +01:00
metadata.txt Implémentation du client stateful pour Radio France 2026-01-22 23:04:58 +01:00
Note-eric.md Implement robust cache system features 2026-09-09 19:54:24 +02:00
OPTIMIZATION_PREBUFFER_TO_PLAYLIST.md Add optimization guide for prebuffer→playlist delay reduction 2025-11-07 09:39:53 +00:00
package-lock.json Update webapp dependencies and lockfile structure, add Syncthing sync exclusions 2026-09-04 23:50:54 +02:00
package.json Mise en place de la synchronisation de la playlist du point de contrôle avec celle du serveur de média. 2025-12-06 12:48:21 +01:00
Plan_d_implementation_webui_control_point.md première version de la web UI du control point 2025-12-06 12:48:21 +01:00
PLAYER_PMOSOURCE_README.md des debug mais je ne sais plus de quoi 2025-12-06 12:48:21 +01:00
PMOMusic-A-192.png feat: add PWA support and bump project version to 0.3.59 2026-06-28 12:04:32 +02:00
PMOMusic-A-512.png feat: add PWA support and bump project version to 0.3.59 2026-06-28 12:04:32 +02:00
Readme.md Refactor Android media playback and sharing logic 2026-09-21 06:16:39 +02:00
rust-analyzer.toml Implement architecture-specific gain DSP and refine player source logic 2026-09-09 20:17:25 +02:00
rust-toolchain.toml feat: handle SSE cache invalidation and nightly rust toolchain config 2026-06-07 14:20:25 +02:00
SECURITY_CONFIG.md security: Remove sensitive credentials from repository 2025-11-04 20:38:10 +00:00
setup-deps.sh Améliorer la documentation d'installation et ajouter des scripts automatiques 2025-11-06 07:45:36 +00:00
structure.svg Gros refactoring 2025-10-05 22:03:13 +02:00
Syncthing.md Update webapp dependencies and lockfile structure, add Syncthing sync exclusions 2026-09-04 23:50:54 +02:00
test-mermaid.md Correction and completion of the blackboard 2026-01-16 08:34:19 +01:00
test-output.html Correction and completion of the blackboard 2026-01-16 08:34:19 +01:00
TODO.md Migrate SQLite database handling to r2d2 connection pool 2026-08-30 20:08:01 +02:00
toto feat: Améliorations et corrections dans la gestion des devices UPnP 2026-01-08 15:53:31 +01:00
UPNP_ANALYSIS_REPORT.md debug du upnp mediaserver 2025-12-06 12:48:21 +01:00
UPNP_FIX_SUMMARY.md debug du upnp mediaserver 2025-12-06 12:48:21 +01:00
version.txt Bump version to 0.5.5 and update infrastructure 2026-10-01 21:36:33 +02:00

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éseau proxy_web vers le proxy inverse). Dans ce cas, pensez à régler host.http_port si 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 exemple PMOMUSIC_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

  1. Téléchargez pmomusic-<version>.apk (et son .sha256 pour vérifier l'intégrité) depuis la page des versions du projet : https://gargoton.petite-maison-orange.fr/eric/pmomusic/releases
  2. Ouvrez le fichier sur le téléphone et autorisez l'installation depuis cette source.
  3. 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 exemple http://192.168.0.32:8080 sur 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.