2025-10-17 09:01:24 +02:00
|
|
|
use pmoapp::{WebAppExt, Webapp};
|
2025-10-07 08:33:06 +02:00
|
|
|
use pmocovers::CoverCacheExt;
|
2025-10-17 09:01:24 +02:00
|
|
|
use pmomediarenderer::MEDIA_RENDERER;
|
|
|
|
|
use pmomediaserver::{MEDIA_SERVER, MediaServerExt};
|
|
|
|
|
use pmoserver::{ServerBuilder, logs::LoggingOptions};
|
|
|
|
|
use pmoupnp::{UpnpServer, ssdp::SsdpServer, upnp_api::UpnpApiExt};
|
2025-10-01 20:49:50 +02:00
|
|
|
use tracing::info;
|
2025-09-23 20:54:50 +02:00
|
|
|
|
|
|
|
|
#[tokio::main]
|
|
|
|
|
async fn main() {
|
2025-10-10 11:50:27 +02:00
|
|
|
// Créer le serveur - le trait UpnpServer étend automatiquement Server
|
2025-09-23 20:54:50 +02:00
|
|
|
let mut server = ServerBuilder::new_configured().build();
|
|
|
|
|
|
2025-10-06 20:24:04 +02:00
|
|
|
// Initialiser le logging et enregistrer les routes de logs
|
2025-10-13 11:35:07 +02:00
|
|
|
server.init_logging().await;
|
2025-10-06 20:24:04 +02:00
|
|
|
|
2025-10-07 08:33:06 +02:00
|
|
|
info!("📡 Registering the cover cache...");
|
2025-10-17 09:01:24 +02:00
|
|
|
let cache = server
|
|
|
|
|
.init_cover_cache_configured()
|
|
|
|
|
.await
|
|
|
|
|
.expect("Cannot initialise the image cache");
|
2025-10-07 08:33:06 +02:00
|
|
|
|
2025-10-17 09:01:24 +02:00
|
|
|
info!("✅ Cover cache ready at {}", cache.cache_dir(),);
|
2025-10-07 08:33:06 +02:00
|
|
|
|
2025-10-06 12:15:33 +02:00
|
|
|
// Routes de base
|
2025-09-23 20:54:50 +02:00
|
|
|
server
|
|
|
|
|
.add_route("/info", || async {
|
|
|
|
|
serde_json::json!({"version": "1.0.0"})
|
|
|
|
|
})
|
|
|
|
|
.await;
|
|
|
|
|
|
2025-10-06 20:24:04 +02:00
|
|
|
// Ajouter la webapp via le trait WebAppExt
|
|
|
|
|
info!("📡 Registering Web application...");
|
|
|
|
|
server.add_webapp_with_redirect::<Webapp>("/app").await;
|
2025-10-06 12:15:33 +02:00
|
|
|
|
2025-10-10 11:50:27 +02:00
|
|
|
// Enregistrer l'API d'introspection UPnP
|
|
|
|
|
server.register_upnp_api().await;
|
|
|
|
|
|
2025-10-06 20:24:04 +02:00
|
|
|
info!("📡 Registering MediaRenderer...");
|
2025-10-17 09:01:24 +02:00
|
|
|
let renderer_instance = server
|
|
|
|
|
.register_device(MEDIA_RENDERER.clone())
|
2025-10-06 12:15:33 +02:00
|
|
|
.await
|
|
|
|
|
.expect("Failed to register MediaRenderer routes");
|
|
|
|
|
|
2025-10-17 09:01:24 +02:00
|
|
|
info!(
|
|
|
|
|
"✅ MediaRenderer ready at {}{}",
|
2025-10-06 12:15:33 +02:00
|
|
|
renderer_instance.base_url(),
|
|
|
|
|
renderer_instance.description_route()
|
|
|
|
|
);
|
|
|
|
|
|
2025-10-17 09:01:24 +02:00
|
|
|
// TODO: Enregistrer les sources musicales
|
|
|
|
|
// Exemple d'utilisation du MediaServerExt:
|
|
|
|
|
//
|
|
|
|
|
// use std::sync::Arc;
|
|
|
|
|
//
|
|
|
|
|
// info!("📡 Registering music sources...");
|
|
|
|
|
//
|
|
|
|
|
// // Exemple: Enregistrer une source Qobuz
|
|
|
|
|
// // let qobuz = Arc::new(QobuzSource::new(credentials));
|
|
|
|
|
// // server.register_music_source(qobuz).await;
|
|
|
|
|
//
|
|
|
|
|
// // Exemple: Enregistrer une source Radio Paradise
|
|
|
|
|
// // let radio = Arc::new(RadioParadiseSource::new());
|
|
|
|
|
// // server.register_music_source(radio).await;
|
|
|
|
|
//
|
|
|
|
|
// // Lister toutes les sources enregistrées
|
|
|
|
|
// let sources = server.list_music_sources().await;
|
|
|
|
|
// info!("✅ {} music source(s) registered", sources.len());
|
|
|
|
|
// for source in sources {
|
|
|
|
|
// info!(" - {} ({})", source.name(), source.id());
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
info!("📡 Registering MediaServer...");
|
|
|
|
|
let server_instance = server
|
|
|
|
|
.register_device(MEDIA_SERVER.clone())
|
|
|
|
|
.await
|
|
|
|
|
.expect("Failed to register MediaServer routes");
|
|
|
|
|
|
|
|
|
|
info!(
|
|
|
|
|
"✅ MediaServer ready at {}{}",
|
|
|
|
|
server_instance.base_url(),
|
|
|
|
|
server_instance.description_route()
|
|
|
|
|
);
|
|
|
|
|
|
2025-10-06 12:15:33 +02:00
|
|
|
// 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");
|
|
|
|
|
|
2025-10-06 20:24:04 +02:00
|
|
|
// Créer et enregistrer le device SSDP pour le MediaRenderer
|
2025-10-17 09:01:24 +02:00
|
|
|
let ssdp_device = renderer_instance.to_ssdp_device("PMOMusic", "1.0");
|
2025-10-06 12:15:33 +02:00
|
|
|
ssdp_server.add_device(ssdp_device);
|
|
|
|
|
info!("✅ SSDP announcements sent for MediaRenderer");
|
2025-10-01 20:49:50 +02:00
|
|
|
|
2025-09-23 20:54:50 +02:00
|
|
|
server.start().await;
|
|
|
|
|
server.wait().await;
|
2025-09-16 21:07:44 +02:00
|
|
|
}
|