énorme refactoring de PMOcontrol step 1

This commit is contained in:
2025-12-28 17:45:06 +01:00
parent 000d378789
commit 64450185c5
54 changed files with 3840 additions and 2769 deletions

View File

@@ -13,6 +13,8 @@ pmoaudiocache = { path = "../pmoaudiocache", features = ["pmoserver"] }
pmoplaylist = { path = "../pmoplaylist", optional = true, features = ["pmoserver"] }
pmocache = { path = "../pmocache" }
async-trait = "0.1"
async-recursion = "1.1"
url = "2.5.7"
uuid = "1.18.1"
hex = "0.4.3"

View File

@@ -280,44 +280,40 @@ impl DeviceInstance {
}
/// Enregistre toutes les URLs du device et de ses services dans le serveur.
pub fn register_urls<'a>(
&'a self,
server: &'a mut pmoserver::Server,
) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<(), DeviceError>> + 'a>> {
Box::pin(async move {
info!(
"✅ Device description for {} available at: {}{}",
self.get_name(),
self.base_url(),
self.description_route(),
);
#[async_recursion::async_recursion]
pub async fn register_urls(&self, server: &mut pmoserver::Server) -> Result<(), DeviceError> {
info!(
"✅ Device description for {} available at: {}{}",
self.get_name(),
self.base_url(),
self.description_route(),
);
// Handler pour la description du device
let instance_desc = self.clone();
server
.add_handler(&self.description_route(), move || {
let instance = instance_desc.clone();
async move { instance.description_handler().await }
})
.await;
// Handler pour la description du device
let instance_desc = self.clone();
server
.add_handler(&self.description_route(), move || {
let instance = instance_desc.clone();
async move { instance.description_handler().await }
})
.await;
// Enregistrer les services
for service in self.services() {
service
.register_urls(server)
.await
.map_err(|e| DeviceError::UrlRegistrationError(e.to_string()))?;
// Start the periodic notifier so buffered state changes are flushed to subscribers.
let _ = service.start_notifier(DEFAULT_NOTIFY_INTERVAL);
}
// Enregistrer les services
for service in self.services() {
service
.register_urls(server)
.await
.map_err(|e| DeviceError::UrlRegistrationError(e.to_string()))?;
// Start the periodic notifier so buffered state changes are flushed to subscribers.
let _ = service.start_notifier(DEFAULT_NOTIFY_INTERVAL);
}
// Enregistrer les sous-devices
for device in self.devices() {
device.register_urls(server).await?;
}
// Enregistrer les sous-devices
for device in self.devices() {
device.register_urls(server).await?;
}
Ok(())
})
Ok(())
}
/// Génère l'élément XML de description du device.

View File

@@ -545,16 +545,18 @@ impl ServiceInstance {
///
/// Retourne une erreur si l'enregistrement des routes échoue.
pub async fn register_urls(&self, server: &mut pmoserver::Server) -> Result<(), ServiceError> {
let device = self.device.read().unwrap();
let device_name = device
.as_ref()
.map(|d| d.get_name().clone())
.unwrap_or_else(|| "unknown".to_string());
let server_url = device
.as_ref()
.map(|d| d.base_url().to_string())
.unwrap_or_default();
drop(device);
let (device_name, server_url) = {
let device = self.device.read().unwrap();
let device_name = device
.as_ref()
.map(|d| d.get_name().clone())
.unwrap_or_else(|| "unknown".to_string());
let server_url = device
.as_ref()
.map(|d| d.base_url().to_string())
.unwrap_or_default();
(device_name, server_url)
};
info!(
"✅ Service description for {}:{} available at : {}{}",

View File

@@ -81,6 +81,7 @@ static SSDP_SERVER: Lazy<RwLock<Option<SsdpServer>>> = Lazy::new(|| RwLock::new(
/// // Introspection via le trait UpnpServer
/// let devices = server.device_registry().list_devices();
/// ```
#[async_trait::async_trait]
pub trait UpnpServerExt {
// ========= Device Management (existant) =========
@@ -226,6 +227,7 @@ pub trait UpnpServerExt {
}
// Implémentation du trait UpnpServer pour pmoserver::Server
#[async_trait::async_trait]
impl UpnpServerExt for Server {
async fn register_device(
&mut self,
@@ -308,7 +310,6 @@ impl UpnpServerExt for Server {
use pmoaudiocache::new_cache;
use pmocache::pmoserver_ext::{create_api_router, create_file_router};
let base_url = self.info().base_url.clone();
let cache = Arc::new(new_cache(cache_dir, limit)?);
// Routes de fichiers pour servir les pistes FLAC