2025-10-17 09:01:24 +02:00
|
|
|
use pmoapp::{WebAppExt, Webapp};
|
|
|
|
|
use pmomediarenderer::MEDIA_RENDERER;
|
2025-10-17 12:45:18 +02:00
|
|
|
use pmomediaserver::{MEDIA_SERVER, sources::SourcesExt};
|
2025-10-18 20:25:56 +02:00
|
|
|
use pmoserver::Server;
|
2025-10-19 13:42:29 +02:00
|
|
|
use pmosource::MusicSourceExt;
|
2025-10-26 13:44:41 +01:00
|
|
|
use pmoupnp::UpnpServerExt;
|
2025-10-01 20:49:50 +02:00
|
|
|
use tracing::info;
|
2025-09-23 20:54:50 +02:00
|
|
|
|
|
|
|
|
#[tokio::main]
|
2025-10-18 20:25:56 +02:00
|
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
|
|
|
// ========== PHASE 1 : Infrastructure UPnP ==========
|
2025-10-26 21:35:02 +01:00
|
|
|
// #[cfg(tokio_unstable)]
|
|
|
|
|
// console_subscriber::init();
|
|
|
|
|
|
|
|
|
|
let server = Server::create_upnp_server().await?; // Routes personnalisées de l'application
|
|
|
|
|
server
|
|
|
|
|
.write()
|
|
|
|
|
.await
|
2025-09-23 20:54:50 +02:00
|
|
|
.add_route("/info", || async {
|
|
|
|
|
serde_json::json!({"version": "1.0.0"})
|
|
|
|
|
})
|
|
|
|
|
.await;
|
|
|
|
|
|
2025-10-17 12:45:18 +02:00
|
|
|
// Initialiser le système de gestion des sources musicales avec API REST
|
|
|
|
|
info!("📡 Initializing music sources management system...");
|
2025-10-26 21:35:02 +01:00
|
|
|
server
|
|
|
|
|
.write()
|
|
|
|
|
.await
|
2025-10-17 12:45:18 +02:00
|
|
|
.init_music_sources()
|
|
|
|
|
.await
|
|
|
|
|
.expect("Failed to initialize music sources API");
|
2025-10-17 09:20:12 +02:00
|
|
|
|
2025-10-18 20:25:56 +02:00
|
|
|
// ========== PHASE 2 : Configuration métier ==========
|
2025-10-06 12:15:33 +02:00
|
|
|
|
2025-10-17 09:20:12 +02:00
|
|
|
// Enregistrer les sources musicales
|
2025-10-18 20:25:56 +02:00
|
|
|
info!("🎵 Registering music sources...");
|
2025-10-17 09:20:12 +02:00
|
|
|
|
2025-10-18 20:25:56 +02:00
|
|
|
// // Enregistrer Qobuz
|
|
|
|
|
// if let Err(e) = server.register_qobuz().await {
|
|
|
|
|
// tracing::warn!("⚠️ Failed to register Qobuz: {}", e);
|
|
|
|
|
// }
|
2025-10-17 09:20:12 +02:00
|
|
|
|
2025-10-19 01:01:33 +02:00
|
|
|
// Enregistrer Radio Paradise (inclut l'initialisation de l'API)
|
2025-10-26 13:44:41 +01:00
|
|
|
if let Err(e) = server.write().await.register_paradise().await {
|
2025-10-18 20:25:56 +02:00
|
|
|
tracing::warn!("⚠️ Failed to register Radio Paradise: {}", e);
|
2025-10-17 12:01:36 +02:00
|
|
|
}
|
|
|
|
|
|
2025-10-17 09:20:12 +02:00
|
|
|
// Lister toutes les sources enregistrées
|
2025-10-26 13:44:41 +01:00
|
|
|
let sources = server.read().await.list_music_sources().await;
|
2025-10-17 09:20:12 +02:00
|
|
|
info!("✅ {} music source(s) registered", sources.len());
|
|
|
|
|
for source in sources {
|
|
|
|
|
info!(" - {} ({})", source.name(), source.id());
|
|
|
|
|
}
|
2025-10-17 09:01:24 +02:00
|
|
|
|
2025-10-18 20:25:56 +02:00
|
|
|
// Enregistrer les devices UPnP (HTTP + SSDP automatique)
|
|
|
|
|
info!("📡 Registering UPnP devices...");
|
|
|
|
|
|
2025-10-26 21:35:02 +01:00
|
|
|
let renderer_instance = server
|
|
|
|
|
.write()
|
|
|
|
|
.await
|
2025-10-18 20:25:56 +02:00
|
|
|
.register_device(MEDIA_RENDERER.clone())
|
|
|
|
|
.await
|
|
|
|
|
.expect("Failed to register MediaRenderer");
|
|
|
|
|
|
|
|
|
|
info!(
|
|
|
|
|
"✅ MediaRenderer ready at {}{}",
|
|
|
|
|
renderer_instance.base_url(),
|
|
|
|
|
renderer_instance.description_route()
|
|
|
|
|
);
|
|
|
|
|
|
2025-10-26 21:35:02 +01:00
|
|
|
let server_instance = server
|
|
|
|
|
.write()
|
|
|
|
|
.await
|
2025-10-17 09:01:24 +02:00
|
|
|
.register_device(MEDIA_SERVER.clone())
|
|
|
|
|
.await
|
2025-10-18 20:25:56 +02:00
|
|
|
.expect("Failed to register MediaServer");
|
2025-10-17 09:01:24 +02:00
|
|
|
|
|
|
|
|
info!(
|
|
|
|
|
"✅ MediaServer ready at {}{}",
|
|
|
|
|
server_instance.base_url(),
|
|
|
|
|
server_instance.description_route()
|
|
|
|
|
);
|
|
|
|
|
|
2025-10-18 20:25:56 +02:00
|
|
|
// Ajouter la webapp via le trait WebAppExt
|
|
|
|
|
info!("📡 Registering Web application...");
|
2025-10-26 21:35:02 +01:00
|
|
|
server
|
|
|
|
|
.write()
|
|
|
|
|
.await
|
|
|
|
|
.add_webapp_with_redirect::<Webapp>("/app")
|
|
|
|
|
.await;
|
2025-10-06 12:15:33 +02:00
|
|
|
|
2025-10-18 20:25:56 +02:00
|
|
|
// ========== PHASE 3 : Démarrage du serveur ==========
|
2025-10-01 20:49:50 +02:00
|
|
|
|
2025-10-18 20:25:56 +02:00
|
|
|
info!("🌐 Starting HTTP server...");
|
2025-10-26 13:44:41 +01:00
|
|
|
server.write().await.start().await;
|
2025-10-18 20:25:56 +02:00
|
|
|
|
|
|
|
|
info!("✅ PMOMusic is ready!");
|
|
|
|
|
info!("Press Ctrl+C to stop...");
|
2025-10-26 13:44:41 +01:00
|
|
|
server.write().await.wait().await;
|
2025-10-18 20:25:56 +02:00
|
|
|
|
|
|
|
|
Ok(())
|
2025-09-16 21:07:44 +02:00
|
|
|
}
|