Files
pmomusic/pmoradiofrance/src/pmoserver_impl.rs
Eric Coissac b5e9bb116f Implémentation du cache de métadonnées avec gestion des TTL et amélioration du streaming
Cette mise à jour implémente un système de cache de métadonnées avec gestion des TTL pour les données Radio France. Le cache gère les mises à jour automatiques via des tâches de rafraîchissement, et les clients interrogent uniquement le cache pour obtenir des données à jour. Le streaming est amélioré avec une gestion correcte des connexions et des tâches de rafraîchissement qui s'arrêtent automatiquement à la déconnexion du client. Les versions des packages PMOMusic et pmomediaserver sont mises à jour à 0.3.13.
2026-01-24 10:06:30 +01:00

79 lines
2.7 KiB
Rust

//! Implémentation du trait RadioFranceExt pour pmoserver::Server
//!
//! Ce module enrichit `pmoserver::Server` avec les fonctionnalités du client Radio France
//! en implémentant le trait [`RadioFranceExt`](crate::RadioFranceExt).
//!
//! ## Architecture
//!
//! `pmoradiofrance` étend `pmoserver::Server` sans que `pmoserver` connaisse `pmoradiofrance`.
//! C'est le pattern d'extension : `pmoradiofrance` ajoute des fonctionnalités à un type
//! externe via un trait, similaire au pattern utilisé par `pmoqobuz` pour `QobuzServerExt`.
//!
//! ## Exemple d'utilisation
//!
//! ```rust,no_run
//! use pmoradiofrance::RadioFranceExt;
//! use pmoserver::ServerBuilder;
//!
//! # async fn example() -> anyhow::Result<()> {
//! let mut server = ServerBuilder::new_configured().build();
//!
//! // Le trait RadioFranceExt est automatiquement disponible
//! let state = server.init_radiofrance().await?;
//!
//! server.start().await;
//! # Ok(())
//! # }
//! ```
use crate::api_rest::create_router;
use crate::pmoserver_ext::{RadioFranceExt, RadioFranceState};
use crate::stateful_client::RadioFranceStatefulClient;
use anyhow::Result;
use pmoserver::Server;
use std::sync::Arc;
use tracing::info;
impl RadioFranceExt for Server {
async fn init_radiofrance(&mut self) -> Result<Arc<RadioFranceState>> {
info!("Initializing Radio France API...");
// Créer une source dédiée pour l'API (sans enregistrement UPnP)
let config = pmoconfig::get_config();
let source = crate::source::RadioFranceSource::new(config)
.await
.map_err(|e| anyhow::anyhow!("Failed to create Radio France source: {}", e))?;
// Créer l'état partagé
let state = RadioFranceState::new(Arc::new(source));
// Créer et enregistrer le router
let router = create_router(state.clone());
self.add_router("/api/radiofrance", router).await;
info!("Radio France API initialized");
info!("API endpoints available at /api/radiofrance/*");
Ok(Arc::new(state))
}
async fn init_radiofrance_with_source(
&mut self,
source: Arc<crate::source::RadioFranceSource>,
) -> Result<Arc<RadioFranceState>> {
info!("Initializing Radio France API with existing source...");
// Créer l'état partagé (simplement une référence à la source)
let state = RadioFranceState::new(source);
// Créer et enregistrer le router
let router = create_router(state.clone());
self.add_router("/api/radiofrance", router).await;
info!("Radio France API initialized with source");
info!("API endpoints available at /api/radiofrance/*");
Ok(Arc::new(state))
}
}