énorme refactoring de PMOcontrol step 1
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 : {}{}",
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user