///! Extension trait pour initialiser le PMO Music MediaServer UPnP use pmoupnp::devices::DeviceInstance; use pmoupnp::variable_types::StateValue; use std::sync::Arc; use tracing::{info, warn}; /// Extension trait pour initialiser les variables UPnP du MediaServer pub trait MediaServerDeviceExt { /// Initialise les ProtocolInfo du ConnectionManager pour PMO Music. /// /// PMO Music convertit tous les flux audio en FLAC (et OGG-FLAC). /// Cette méthode configure le `SourceProtocolInfo` avec les formats supportés: /// - `http-get:*:audio/flac:*` - FLAC standard /// - `http-get:*:application/ogg:*` - OGG-FLAC /// - `http-get:*:audio/ogg:*` - OGG-FLAC (format alternatif) /// /// # Arguments /// /// * `device_instance` - L'instance du MediaServer device /// /// # Returns /// /// `Ok(())` si l'initialisation réussit, `Err` sinon. /// /// # Example /// /// ```ignore /// use pmomediaserver::MediaServerDeviceExt; /// use pmomediaserver::MEDIA_SERVER; /// /// let server_instance = server /// .write().await /// .register_device(MEDIA_SERVER.clone()) /// .await?; /// /// server_instance.init_protocol_info(); /// ``` fn init_protocol_info(&self); } impl MediaServerDeviceExt for Arc { fn init_protocol_info(&self) { // Liste des formats que PMO Music peut servir // PMO Music convertit tout au vol en FLAC let protocol_info = vec![ // FLAC standard (format principal) "http-get:*:audio/flac:*", "http-get:*:audio/x-flac:*", "http-get:*:application/flac:*", "http-get:*:application/x-flac:*", // OGG-FLAC "http-get:*:application/ogg:*", "http-get:*:audio/ogg:*", "http-get:*:audio/x-ogg:*", ]; let source_protocol_info = protocol_info.join(","); info!("🔧 Initializing MediaServer ProtocolInfo:"); info!(" Source: {}", source_protocol_info); // Accéder au service ConnectionManager if let Some(conn_mgr) = self.get_service("ConnectionManager") { // Initialiser SourceProtocolInfo (formats que le serveur peut fournir) if let Some(source_var) = conn_mgr.get_variable("SourceProtocolInfo") { tokio::spawn(async move { if let Err(e) = source_var .set_value(StateValue::String(source_protocol_info.clone())) .await { warn!("⚠️ Failed to set SourceProtocolInfo: {}", e); } else { info!("✅ SourceProtocolInfo initialized"); } }); } else { warn!("⚠️ SourceProtocolInfo variable not found in ConnectionManager"); } // SinkProtocolInfo reste vide pour un MediaServer (il ne consomme pas de contenu) } else { warn!("⚠️ ConnectionManager service not found in MediaServer"); } } }