Faire fonctionner le media server

This commit is contained in:
2025-10-18 20:25:56 +02:00
parent f27d5d3483
commit fb0394b427
4 changed files with 189 additions and 61 deletions

View File

@@ -1,51 +1,23 @@
use pmoapp::{WebAppExt, Webapp};
use pmocovers::CoverCacheExt;
use pmoaudiocache::AudioCacheExt;
use pmomediarenderer::MEDIA_RENDERER;
use pmomediaserver::{MEDIA_SERVER, sources::SourcesExt};
use pmosource::MusicSourceExt;
use pmoserver::ServerBuilder;
use pmoupnp::{UpnpServerExt, ssdp::SsdpServer, upnp_api::UpnpApiExt};
use pmoserver::Server;
use pmoupnp::{UpnpServerExt, upnp_api::UpnpApiExt};
use tracing::info;
#[tokio::main]
async fn main() {
// Créer le serveur - le trait UpnpServer étend automatiquement Server
let mut server = ServerBuilder::new_configured().build();
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// ========== PHASE 1 : Infrastructure UPnP ==========
let mut server = Server::create_upnp_server().await?;
// Initialiser le logging et enregistrer les routes de logs
server.init_logging().await;
info!("📡 Registering the cover cache...");
let covercache = server
.init_cover_cache_configured()
.await
.expect("Cannot initialise the image cache");
info!("✅ Cover cache ready at {}", covercache.cache_dir().display());
info!("📡 Registering the audio cache...");
let audiocache = server
.init_audio_cache_configured()
.await
.expect("Cannot initialise the audio cache");
info!("✅ Audio cache ready at {}", audiocache.cache_dir().display());
// Routes de base
// Routes personnalisées de l'application
server
.add_route("/info", || async {
serde_json::json!({"version": "1.0.0"})
})
.await;
// Ajouter la webapp via le trait WebAppExt
info!("📡 Registering Web application...");
server.add_webapp_with_redirect::<Webapp>("/app").await;
// Enregistrer l'API d'introspection UPnP
server.register_upnp_api().await;
// Initialiser le système de gestion des sources musicales avec API REST
info!("📡 Initializing music sources management system...");
server
@@ -53,29 +25,19 @@ async fn main() {
.await
.expect("Failed to initialize music sources API");
info!("📡 Registering MediaRenderer...");
let renderer_instance = server
.register_device(MEDIA_RENDERER.clone())
.await
.expect("Failed to register MediaRenderer routes");
info!(
"✅ MediaRenderer ready at {}{}",
renderer_instance.base_url(),
renderer_instance.description_route()
);
// ========== PHASE 2 : Configuration métier ==========
// Enregistrer les sources musicales
info!("📡 Registering music sources...");
info!("🎵 Registering music sources...");
// Enregistrer Qobuz
if let Err(e) = server.register_qobuz().await {
tracing::warn!("Failed to register Qobuz: {}", e);
}
// // Enregistrer Qobuz
// if let Err(e) = server.register_qobuz().await {
// tracing::warn!("⚠️ Failed to register Qobuz: {}", e);
// }
// Enregistrer Radio Paradise
if let Err(e) = server.register_paradise().await {
tracing::warn!("Failed to register Radio Paradise: {}", e);
tracing::warn!("⚠️ Failed to register Radio Paradise: {}", e);
}
// Lister toutes les sources enregistrées
@@ -85,11 +47,24 @@ async fn main() {
info!(" - {} ({})", source.name(), source.id());
}
info!("📡 Registering MediaServer...");
// Enregistrer les devices UPnP (HTTP + SSDP automatique)
info!("📡 Registering UPnP devices...");
let renderer_instance = server
.register_device(MEDIA_RENDERER.clone())
.await
.expect("Failed to register MediaRenderer");
info!(
"✅ MediaRenderer ready at {}{}",
renderer_instance.base_url(),
renderer_instance.description_route()
);
let server_instance = server
.register_device(MEDIA_SERVER.clone())
.await
.expect("Failed to register MediaServer routes");
.expect("Failed to register MediaServer");
info!(
"✅ MediaServer ready at {}{}",
@@ -97,16 +72,18 @@ async fn main() {
server_instance.description_route()
);
// Créer et démarrer le serveur SSDP
info!("📡 Starting SSDP discovery...");
let mut ssdp_server = SsdpServer::new();
ssdp_server.start().expect("Failed to start SSDP server");
// Ajouter la webapp via le trait WebAppExt
info!("📡 Registering Web application...");
server.add_webapp_with_redirect::<Webapp>("/app").await;
// Créer et enregistrer le device SSDP pour le MediaRenderer
let ssdp_device = renderer_instance.to_ssdp_device("PMOMusic", "1.0");
ssdp_server.add_device(ssdp_device);
info!("✅ SSDP announcements sent for MediaRenderer");
// ========== PHASE 3 : Démarrage du serveur ==========
info!("🌐 Starting HTTP server...");
server.start().await;
info!("✅ PMOMusic is ready!");
info!("Press Ctrl+C to stop...");
server.wait().await;
Ok(())
}