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.
79 lines
2.7 KiB
Rust
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))
|
|
}
|
|
}
|