Autorise la configuration des noms UPNP.

This commit is contained in:
2025-12-28 11:36:20 +01:00
parent 876b1e0147
commit 0c64ed1a9a
8 changed files with 126 additions and 11 deletions

View File

@@ -36,6 +36,7 @@ reqwest = "0.12.23"
utoipa = { version = "5.3", features = ["axum_extras"] }
socket2 = "0.5"
get_if_addrs = "0.5"
serde_yaml = "0.9"
[features]
default = ["server"]

View File

@@ -122,6 +122,84 @@ impl Device {
}
}
/// Crée un nouveau modèle de device en utilisant la configuration.
///
/// Cette factory method charge les préfixes depuis pmoconfig et construit
/// automatiquement les noms finaux en combinant les préfixes avec les suffixes.
///
/// # Arguments
///
/// * `name` - Nom unique du device
/// * `device_type` - Type UPnP du device (ex: "MediaServer", "MediaRenderer")
/// * `friendly_name_suffix` - Suffixe pour le nom convivial (sera combiné avec le préfixe)
///
/// # Examples
///
/// ```ignore
/// use pmoupnp::devices::Device;
///
/// let device = Device::new_from_config(
/// "PMO_MediaServer".to_string(),
/// "MediaServer".to_string(),
/// "Media Server".to_string(),
/// );
/// // Avec config par défaut :
/// // - manufacturer = "PMOMusic"
/// // - udn_prefix = "pmomusic"
/// // - model_name = "PMOMusic Media Server"
/// // - friendly_name = "PMOMusic Media Server"
/// ```
pub fn new_from_config(
name: String,
device_type: String,
friendly_name_suffix: String,
) -> Self {
use crate::config_ext::UpnpConfigExt;
let config = pmoconfig::get_config();
// Charger les valeurs depuis la config (avec fallback aux defaults)
let manufacturer = config
.get_upnp_manufacturer()
.unwrap_or_else(|_| "PMOMusic".to_string());
let udn_prefix = config
.get_upnp_udn_prefix()
.unwrap_or_else(|_| "pmomusic".to_string());
let model_name_prefix = config
.get_upnp_model_name_prefix()
.unwrap_or_else(|_| "PMOMusic".to_string());
let friendly_name_prefix = config
.get_upnp_friendly_name_prefix()
.unwrap_or_else(|_| "PMOMusic".to_string());
// Construire les noms finaux
let model_name = format!("{} {}", model_name_prefix, device_type);
let friendly_name = format!("{} {}", friendly_name_prefix, friendly_name_suffix);
Self {
object: UpnpObjectType {
name: name.clone(),
object_type: "Device".to_string(),
},
device_type,
version: 1,
friendly_name,
manufacturer,
manufacturer_url: None,
model_description: None,
model_name,
model_number: None,
model_url: None,
serial_number: None,
udn_prefix,
upc: None,
icon_url: None,
presentation_url: None,
services: RwLock::new(HashMap::new()),
devices: RwLock::new(HashMap::new()),
}
}
/// Retourne le type de device UPnP.
///
/// Format: `urn:schemas-upnp-org:device:{type}:{version}`

View File

@@ -261,7 +261,12 @@ impl UpnpServerExt for Server {
if self.ssdp_enabled() {
let ssdp_opt = SSDP_SERVER.read().unwrap();
if let Some(ref ssdp) = *ssdp_opt {
let ssdp_device = di.to_ssdp_device("PMOMusic", "1.0");
use crate::config_ext::UpnpConfigExt;
let config = pmoconfig::get_config();
let manufacturer = config
.get_upnp_manufacturer()
.unwrap_or_else(|_| "PMOMusic".to_string());
let ssdp_device = di.to_ssdp_device(&manufacturer, "1.0");
ssdp.add_device(ssdp_device);
info!("✅ SSDP announcement for {}", di.udn());
}