Commit Graph

753 Commits

Author SHA1 Message Date
8adccaa2df feat: implémente client stateful et support playlist UPnP
Ajout d'un client stateful avec gestion automatique du cache pour les stations et métadonnées live.

Fonctionnalités principales :
- Client stateful avec cache à deux niveaux (stations 7 jours, métadonnées TTL dynamique)
- Support des playlists UPnP avec structures StationGroups et StationPlaylist
- Gestion intelligente du TTL respectant delayToRefresh de l'API
- Intégration avec pmoconfig pour le caching des stations
- Support des covers via pmocovers avec fallback sur URLs Pikapi
- Doctests compilés avec contexte async complet
- Feature playlist avec dépendance pmodidl

Corrections et améliorations :
- Ajout d'un variant Error::Config pour conversion automatique
- Gestion propre des erreurs avec conversion anyhow::Error
- Tests unitaires et d'intégration (26/26 passés)
- Optimisations : pooling de connexions HTTP, préchargement intelligent

Les stations sont organisées hiérarchiquement : standalone, groupes avec webradios, radios locales ICI (ex-France Bleu)
Les métadonnées sont mises à jour dynamiquement avec respect des intervalles de polling
2026-01-22 23:50:41 +01:00
94f9790634 Implémentation du client stateful pour Radio France
Ajout de l'implémentation du client stateful `RadioFranceStatefulClient` avec gestion du cache des stations et des métadonnées live, ainsi que la construction de playlists UPnP. Intégration avec `SourceCacheManager` pour les covers. Ajout des structures `StationGroups`, `StationGroup` et `StationPlaylist` pour l'organisation hiérarchique des stations et le mapping API → UPnP.
2026-01-22 23:04:58 +01:00
e10f217385 feat(pmoradiofrance): implémentation complète du client Radio France
Cette mise à jour implémente complètement le client Radio France avec :

- Découverte dynamique des stations (principales, webradios et locales)
- Accès aux métadonnées live via l'API publique
- Gestion des flux audio HiFi (AAC 192 kbps, HLS)
- Support du cache des stations avec TTL configurable
- Extension de configuration pour pmoconfig
- Exemples d'utilisation et tests d'intégration

Les stations découvertes incluent : France Inter, France Info, France Culture, France Musique, FIP, Mouv', France Bleu (locales), et leurs variantes webradios respectives.

Les fonctionnalités incluent :
- Récupération des métadonnées live (émission en cours, producteur, visuels)
- Accès aux flux audio HiFi
- Gestion intelligente des rafraîchissements via delayToRefresh
- Cache des listes de stations avec TTL configurable (7 jours par défaut)

Les tests d'intégration couvrent : découverte des stations, métadonnées live, flux audio, cache, et gestion des erreurs.
2026-01-22 22:00:40 +01:00
b6a10a1250 Merge pull request 'Fix cache image loading bug in webapp' (#65) from push-sswurqzkvnnx into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m8s
Reviewed-on: #65
2026-01-21 20:08:10 +01:00
c9f9eb4ee5 Fix cache image loading bug in webapp
Fix the bug where cached images were not displaying in the webapp due to synchronous load events. Added checkImageComplete() function to detect already loaded images from cache and updated all affected components (CurrentTrack, QueueItem, MediaItem, RendererCard) to properly handle cached image loading.
2026-01-21 20:02:10 +01:00
18fdfbe017 Merge pull request 'Bump version to 0.3.10' (#64) from push-koulrlvkzszm into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m19s
Reviewed-on: #64
2026-01-17 21:07:50 +01:00
c9dda75628 Bump version to 0.3.10
Update version number from 0.3.9 to 0.3.10 in Cargo.toml and version.txt files.

Also, enhance image loading handling in multiple Vue components (ContainerItem, CurrentTrack, MediaItem, QueueItem, ServerDrawer) by:
- Adding ref and watch for tracking image loading states
- Implementing proper load and error handlers
- Using v-show to control image visibility based on loading state
- Adding image state tracking for each item in ServerDrawer
- Improving placeholder display logic
2026-01-17 21:06:19 +01:00
f290878c5f Merge pull request 'push-xtrnoorvumqm' (#62) from push-xtrnoorvumqm into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m25s
Reviewed-on: #62
2026-01-17 19:02:49 +01:00
39dbf56416 Amélioration de l'overlay de couverture d'album
### Modifications principales

- Les métadonnées sont maintenant visibles par défaut à l'ouverture de l'overlay
- Ajout d'une barre de progression interactive dans le panneau des métadonnées (support souris et tactile)
- Style glassmorphism appliqué à l'overlay (fond transparent 35%, blur 30px, bordure subtile)
- Panneau réduit à 70% de largeur pour un look plus élégant
- Fermeture ergonomique sur mobile via swipe down (seuil 100px) avec feedback visuel
- Bouton X conservé pour desktop
- Blocage du pull-to-refresh Android

### Corrections supplémentaires

- Support tactile de la barre de progression principale (hors overlay)
- Utilisation de `100dvh` au lieu de `100vh` pour compatibilité avec les barres de navigation mobiles
- Corrections TypeScript pour les événements tactiles
2026-01-17 19:01:40 +01:00
70f2389b17 Move configuration files and add large cover feature implementation
Move config files from Todo to ToDiscuss directory

Add implementation details for large cover feature:
- Make metadata visible by default when clicking album cover
- Add progress bar with draggable thumb
- Implement glass metal style overlay with 10-20% transparency
- Address closing button positioning issues for mobile navigation
- Improve drawer navigation for mobile users
2026-01-17 18:35:28 +01:00
01fb821dd3 Merge pull request 'Fix backend mutex poisoned panic on OpenHome stop' (#60) from push-zxynzquymotu into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m33s
Reviewed-on: #60
2026-01-17 13:41:02 +01:00
4f8f902f3f Fix backend mutex poisoned panic on OpenHome stop
Fix backend mutex poisoned panic when stopping playback on OpenHome renderer

This commit addresses a panic that occurred when stopping playback on OpenHome renderers, which was caused by:

1. Mutex poisoning from unhandled panics in backend operations
2. A regression revealed after initial fixes, where inconsistent renderer state caused index out of bounds errors

Changes include:
- Added defensive error handling for mutex operations to prevent poisoning
- Implemented bounds-checking for current_index in sync_queue to handle inconsistent renderer states
- Removed redundant clear_queue calls that were causing additional failures
- Improved error tolerance in queue operations

The fix ensures that the backend mutex remains healthy and that inconsistent renderer states are handled gracefully rather than causing panics.
2026-01-17 13:40:23 +01:00
d7dcd164c8 Merge pull request 'push-mkkrtyulmvrn' (#59) from push-mkkrtyulmvrn into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m44s
Reviewed-on: #59
2026-01-17 09:17:52 +01:00
90af7cf772 Corrige le transfert de queue entre renderers
Le transfert de la queue de lecture entre renderers était corrompu car le binding de playlist était réinitialisé, effaçant les items transférés. Correction en transférant directement le binding sans déclencher de rafraîchissement, préservant ainsi le current_index et la position de lecture.

- Fichiers modifiés : pmocontrol/src/control_point.rs
- Version mise à jour : 0.3.7
2026-01-17 09:17:16 +01:00
41a4f0eaea Fix bug play single track Qobuz
Corrige le bug empêchant la lecture d'un track Qobuz individuel depuis le ServerDrawer.

- Implémente `get_item()` dans `QobuzSource` pour retourner des URLs HTTP valides au lieu de URLs symboliques
- Rend `format_duration()` publique dans `pmoqobuz/src/didl.rs`
- Ajoute le logging dans `pmocontrol/src/pmoserver_ext.rs` pour suivre le flux de lecture
- Améliore la gestion des objets dans `pmocontrol/src/pmoserver_ext.rs` pour distinguer les conteneurs des éléments
2026-01-17 08:36:23 +01:00
4cddbc8382 Merge pull request 'push-tpslpksrwqus' (#58) from push-tpslpksrwqus into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m29s
Reviewed-on: #58
2026-01-16 23:36:11 +01:00
066e2fe008 Corrige le bug d'URL relative pour la cover dans pmoqobuz
Correction du bug où l'URL de la cover générée par pmoqobuz était relative au lieu d'être absolue, comme pour le flux audio. Ajout de la conversion de l'URL de la cover en URL absolue dans la fonction adapt_playlist_items_to_qobuz. Version mise à jour de 0.3.5 à 0.3.6.
2026-01-16 23:35:07 +01:00
5701fbf465 Fix queue duplication and internal queue playback bugs
Fix bug where tracks were duplicated in queue position 0 during playlist refreshes by comparing items with URI or didl_id

Fix race condition in internal queue playback where transient STOPPED states caused unwanted auto-advance

- Updated sync_queue in interne.rs to use didl_id as fallback for URI comparison
- Added items_match function in openhome.rs for robust item comparison
- Modified lcs_flags in openhome.rs to use items_match for LCS algorithm
- Added has_played_since_track_start flag in musicrenderer.rs to prevent auto-advance on transient STOPPED states
- Updated play_* methods in musicrenderer.rs to reset the has_played flag before starting playback
- Added diagnostic logs in sync_queue for tracking item matching issues
2026-01-16 22:46:05 +01:00
cdd0e79be8 Merge pull request 'Refactoriser MusicRenderer pour un comportement stateful complet' (#57) from push-rkkrpwtnxvpx into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m34s
Reviewed-on: #57
version-0.3.5
2026-01-16 20:57:53 +01:00
02cff8e913 Refactoriser MusicRenderer pour un comportement stateful complet
Cette modification refactorise l'architecture pour que chaque `MusicRenderer` gère son propre thread de surveillance (watcher), au lieu de déléguer le polling au `ControlPoint` centralisé. 

- Ajout d'un module `watcher.rs` avec `WatchStrategy`, `WatchedState` et fonctions helper
- Implémentation de `start_watching()` et `stop_watching()` dans `MusicRenderer`
- Centralisation de la gestion du watcher dans le constructeur et les méthodes `has_been_seen_now()`/`mark_as_offline()`
- Suppression du polling central (~140 lignes) dans `control_point.rs`
- Simplification du `registry.rs` avec suppression des appels manuels `start/stop_watching()`
- Correction du bug dans `refresh_device_presence()` pour le traitement offline→online
- Préparation pour le support futur des notifications push (OpenHome, Chromecast)

L'architecture est maintenant plus robuste avec une meilleure encapsulation, cohérence des événements et une gestion automatique du watcher.
2026-01-16 20:52:29 +01:00
7b5eb5a4da Merge pull request 'push-oowmozyxmlpo' (#56) from push-oowmozyxmlpo into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m52s
Reviewed-on: #56
2026-01-16 13:24:17 +01:00
c524ba57e5 Bump version to 0.3.4
Update version number in Cargo.toml and version.txt to 0.3.4
2026-01-16 13:21:46 +01:00
8e9dd7601f Implémentation du shuffle de la queue de lecture
Ajout de la fonctionnalité de shuffle pour mélanger l'ordre des morceaux dans la queue de lecture.

- Implémentation de la méthode shuffle_queue() dans MusicRenderer
- Ajout de l'endpoint REST /api/control/renderers/{renderer_id}/queue/shuffle
- Intégration du bouton shuffle dans l'interface Vue.js
- Centralisation des émissions d'événements SSE dans le MusicRenderer
- Mise à jour de la documentation OpenAPI

Cette fonctionnalité permet de randomiser l'ordre des morceaux dans la queue et de redémarrer la lecture depuis le premier morceau, tout en améliorant l'architecture en centralisant les émissions d'événements.
2026-01-16 13:09:23 +01:00
50bc0570ba Mise à jour des règles de développement et ajout de la tâche shuffle_play
Mise à jour complète des règles de développement du projet PMO Music avec clarification du workflow Blackboard, ajout de la documentation d'architecture et de la tâche shuffle_play.md
2026-01-16 08:41:36 +01:00
f3274fcc10 Correction and completion of the blackboard 2026-01-16 08:34:19 +01:00
2cdc7109d1 Implémentation des fonctionnalités d'items épinglables et TTL dans PMOcache
Ajout de la capacité à épingler des items pour les protéger de l'éviction LRU et à définir un TTL pour l'expiration automatique des items temporaires.

Cette implémentation inclut :
- Ajout de colonnes `pinned` et `ttl_expires_at` dans la base de données
- Nouvelles méthodes dans DB et Cache pour gérer le pinning et le TTL
- Modification de la politique d'éviction pour exclure les items épinglés
- Implémentation d'une règle métier interdisant le pinning et le TTL simultanément
- API REST complète avec endpoints GET/POST/DELETE pour gérer le pinning et le TTL
- Documentation OpenAPI automatique
- Tests complets couvrant tous les cas d'usage

Les items épinglés ne comptent pas dans la limite du cache et ne peuvent jamais être supprimés automatiquement, tandis que les items avec TTL sont supprimés automatiquement à l'expiration.
2026-01-15 22:18:43 +01:00
c250801a9f Documentation complète des patterns d'extension pmoconfig, pmoserver_ext et implémentation MusicSource
Ajout de la documentation complète pour les patterns d'extension pmoconfig, pmoserver_ext et l'implémentation d'une nouvelle MusicSource, incluant les guides détaillés, exemples de code et checklists d'implémentation.
2026-01-15 08:18:15 +01:00
2ef4ebf020 Suppression de la logique de débouncing SSE dans MediaBrowser.vue
Suppression de la logique de débouncing et cooldown inutile dans MediaBrowser.vue, puisque le serveur contrôle déjà le flux SSE. Cela améliore la réactivité de l'interface et réduit la complexité du code.
2026-01-13 19:01:35 +01:00
82bfab233f Documentation du pattern d'extension pmoserver_ext
Ajout de la documentation complète du pattern d'extension pmoserver_ext pour permettre une implémentation modulaire et cohérente des fonctionnalités du serveur PMO.

Cette documentation inclut :
- Une vue d'ensemble de l'architecture du pattern
- Les composants principaux : traits d'extension, état partagé, handlers HTTP, documentation OpenAPI
- Des patterns avancés : async-trait, intégration Control Point et WebApp
- Des registres globaux (singletons) pour le partage de ressources
- Une checklist d'implémentation et des bonnes pratiques
- Des exemples d'utilisation concrets

Les fichiers générés sont :
1. Blackboard/Architecture/pmoserver_ext.md (745 lignes)
2. Blackboard/Report/pmoserver_ext.md (157 lignes)

La documentation permet de suivre les conventions établies pour implémenter de nouvelles extensions au serveur PMOMusic de manière cohérente et modulaire.
2026-01-12 12:52:15 +01:00
93f5900456 Bump PMOMusic version and improve snapshot update logic
Version bump for PMOMusic from 0.3.1 to 0.3.3

- Updated snapshot update logic in useRenderers.ts to directly update local snapshot state based on event types
- Improved handling of various events like state_changed, position_changed, volume_changed, etc.
- Adjusted polling interval in control_point.rs from 500ms to 250ms for smoother UI updates
2026-01-11 21:19:10 +01:00
af003292bc Merge pull request 'Mise à jour de la version vers 0.3.3' (#55) from push-prmxltxrnkml into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m58s
Reviewed-on: #55
2026-01-11 16:40:07 +01:00
c1bf488ab2 Mise à jour de la version vers 0.3.3
Mise à jour de la version dans Cargo.toml et version.txt vers 0.3.3

- Suppression de l'étape d'extraction de version dans le workflow build-push.yaml
- Amélioration de la cible Makefile sync-version pour utiliser un fichier de dépendance
- Ajout de messages de documentation lors du push avec jj
2026-01-11 16:39:42 +01:00
6f25b8ef53 Merge pull request 'Mise à jour de la version et synchronisation du fichier version.txt' (#54) from push-qpnykqxpynuq into main
Some checks failed
Build and Push Docker Image / build (push) Failing after 4m51s
Reviewed-on: #54
2026-01-11 16:32:48 +01:00
01abf5d8bc Mise à jour de la version et synchronisation du fichier version.txt
Mise à jour de la version dans PMOMusic/Cargo.toml de 0.3.1 à 0.3.2.
Ajout du fichier version.txt contenant la version 0.3.2.
Mise à jour du Makefile pour synchroniser automatiquement version.txt depuis PMOMusic/Cargo.toml lors de la mise à jour de la version.
Ajout de la cible sync-version dans le Makefile pour permettre une synchronisation manuelle du fichier version.txt.
2026-01-11 16:31:52 +01:00
258d97bd1f Merge pull request 'push-tlnqyqsrywyr' (#53) from push-tlnqyqsrywyr into main
Some checks failed
Build and Push Docker Image / build (push) Failing after 4m55s
Reviewed-on: #53
2026-01-11 16:15:47 +01:00
646633af6b Mise à jour de la version et améliorations du workflow
Mise à jour de la version de PMOMusic de 0.1.0 à 0.3.1

- Correction de l'indentation dans le fichier de workflow
- Ajout d'une étape pour extraire la version depuis Cargo.toml
- Ajout d'une cible Makefile pour incrémenter automatiquement le numéro de version patch
- Ajout de cibles Makefile pour gérer les commits avec jj (jeff) : bump-version, jjnew, jjpush, jjfetch
- Suppression du fichier version.txt inutile
2026-01-11 16:15:13 +01:00
7d2cb75e58 Optimisation des délais de rafraîchissement et amélioration de la réactivité
Réduction du délai de rafraîchissement des conteneurs à 2 secondes et ajustement du polling pour une meilleure réactivité de l'interface utilisateur.

- Modification du délai de cooldown de 5 secondes à 2 secondes dans MediaBrowser.vue
- Réduction du délai de polling de 60 secondes à 10 secondes pour la découverte des appareils dans control_point.rs
- Modification du polling de volume et de mute de 3 secondes à 1 seconde (tous les 2 ticks à 500ms) dans control_point.rs
- Réduction du délai de polling de position de 1 seconde à 500ms dans control_point.rs
2026-01-11 15:53:42 +01:00
da12cc82b3 Refactor playback and queue commands to use async background tasks
Replace blocking tasks with async background tasks for play, add to queue, and add after current commands. This improves responsiveness by launching commands in the background and returning immediately, with UI updates handled via SSE events. Remove timeout handling and error wrapping as the async task management now handles these cases properly.
2026-01-11 15:26:47 +01:00
7ce91bc079 Merge pull request 'push-zplyprxpvxxm' (#51) from push-zplyprxpvxxm into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m7s
Reviewed-on: #51
2026-01-11 08:16:46 +01:00
f074f4d657 Bump version to 0.3.0
Update version numbers in Cargo.lock, Cargo.toml, and version.txt to 0.3.0
2026-01-11 08:15:59 +01:00
8fb135541d Optimize seek queue command handling
Refactor the seek queue command to run asynchronously in the background, returning immediately to the client. The UI will now be updated via SSE events when the state changes, improving responsiveness. The previous timeout and error handling logic has been replaced with a more robust async approach that logs different error scenarios appropriately.
2026-01-11 08:14:31 +01:00
5a30731854 Validate playback position against duration in control point
This commit adds validation to ensure that the playback position does not exceed the track duration. When the position is greater than the duration (which can happen during track initialization on some UPNP renderers), the position is set to None to avoid displaying bogus timestamps. This improves the robustness of playback position handling.
2026-01-11 08:05:02 +01:00
36a05a2575 Prevent auto-advance on user-requested stop
Mark user-requested stops to prevent auto-advance when sleep timer expires. This ensures that playback stops cleanly without triggering automatic advancement to the next item.
2026-01-11 07:53:53 +01:00
293daf5b3b Merge pull request 'push-mlzoossntumr' (#48) from push-mlzoossntumr into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 28m51s
Reviewed-on: #48
2026-01-11 00:31:17 +01:00
700c8f2fc9 Fix OpenHome client IdResponse handling and seek argument name
This commit fixes two issues in the OpenHome client:

1. Improves error handling in IdResponse parsing by ensuring proper formatting of the error message
2. Corrects the argument name used in seek_second_absolute from 'Second' to 'Value' to match the expected SOAP action parameters

These changes ensure proper communication with OpenHome devices and correct seeking behavior.
2026-01-11 00:23:41 +01:00
c3a9e3ea7b Refactor queue management and transport control across all renderer backends
This commit refactors queue management and transport control to use a unified approach across all renderer backends (UPnP, OpenHome, Arylic TCP, Chromecast, LinkPlay). Key changes include:

1. Introduces `RendererBackend` and `QueueTransportControl` traits to provide consistent queue access and transport control operations
2. Moves queue management from the `MusicRenderer` struct to individual backend implementations
3. Implements `play_from_queue`, `play_next`, `play_previous`, and `play_from_index` methods in all backends
4. Simplifies `MusicRenderer` methods to delegate to backend-specific implementations
5. Removes direct queue access methods from `MusicRenderer` and centralizes queue operations in backend traits
6. Updates all backend implementations (UPnP, OpenHome, Arylic TCP, Chromecast, LinkPlay) to implement the new queue transport control traits

This change provides a more consistent and maintainable way to handle queue operations across different renderer types, ensuring that queue management and playback navigation work uniformly regardless of the underlying backend.
2026-01-11 00:07:02 +01:00
7f10f55086 Implémentation du sleep timer
Ajout de la fonctionnalité de sleep timer pour les renderers audio.

- Création du composant TimerControl.vue avec interface utilisateur interactive
- Implémentation des API endpoints pour gérer le sleep timer (start, update, cancel, get)
- Intégration du système de timer dans le control point avec surveillance par thread dédié
- Ajout de la logique de timer dans les renderers (sleep_timer.rs)
- Mise à jour des types et événements SSE pour le sleep timer
- Intégration du timer dans la barre de bas de l'application

Cette fonctionnalité permet aux utilisateurs de configurer un timer qui arrêtera automatiquement la lecture après une durée définie, avec une interface intuitive et des notifications en temps réel.
2026-01-10 20:45:51 +01:00
220eeb1244 Merge pull request 'push-xmrpvpxvppzw' (#43) from push-xmrpvpxvppzw into main
All checks were successful
Build and Push Docker Image / build (push) Successful in 29m41s
Reviewed-on: #43
2026-01-10 16:45:55 +01:00
c9f15289d0 Ajout d'un padding à la liste des pistes
Ajout d'un padding de 10px à gauche et à droite dans la liste des pistes pour améliorer l'espacement et l'alignement visuel.
2026-01-10 16:44:29 +01:00
c745179200 Implémentation du seek audio avec support des Range requests
Ajout de la fonctionnalité de seek audio dans les renderers avec support des Range requests HTTP pour permettre le seek pendant le téléchargement.

- Ajout de la route /control/renderers/{renderer_id}/seek pour le seek par secondes
- Implémentation du support des Range requests dans le serveur de fichiers (pmocache)
- Mise à jour des dépendances avec http-range-header, tower, tower-http
- Amélioration de l'interface utilisateur avec une barre de progression interactive dans CurrentTrack.vue
- Support du seek pendant le téléchargement avec streaming progressif
- Gestion des erreurs et timeouts pour les commandes de seek
2026-01-10 16:35:52 +01:00