Ajout de la source Radio France avec : - Implémentation du trait MusicSource pour l'intégration UPnP - Routes HTTP API REST pour l'accès aux stations et flux AAC - Proxy streaming avec tracking des connexions - Génération dynamique de l'arborescence UPnP - Cache multi-niveaux (stations, métadonnées, covers) - Support des ~70 stations (standalone, groupes, radios ICI) Fichiers créés : - pmoradiofrance/src/source.rs (implémentation MusicSource) - pmoradiofrance/src/server_ext.rs (routes HTTP et proxy streaming) - pmoradiofrance/assets/radiofrance-logo.webp (logo placeholder) Fichiers modifiés : - pmoradiofrance/src/lib.rs (re-exports et modules) - pmoradiofrance/Cargo.toml (dépendances server) - Cargo.toml (workspace) - pmomediaserver/Cargo.toml (feature radiofrance) - PMOMusic/Cargo.toml (feature radiofrance) - PMOMusic/src/main.rs (enregistrement automatique) Tests et validation : compilation OK, pattern respecté, feature-gating cohérent
53 lines
1.6 KiB
Rust
53 lines
1.6 KiB
Rust
use std::sync::Arc;
|
|
use std::thread;
|
|
use std::time::Duration;
|
|
|
|
use pmocontrol::RendererProtocol;
|
|
use pmocontrol::{ControlPoint, DeviceRegistryRead, RendererInfo, UpnpMediaServer};
|
|
|
|
fn main() -> std::io::Result<()> {
|
|
// Un tout petit logging optionnel
|
|
tracing_subscriber::fmt::init();
|
|
tracing::info!("Starting PMOMusic control point SSDP discovery example...");
|
|
|
|
// Lance le control point (timeout HTTP pour les descriptions UPnP)
|
|
let cp = ControlPoint::spawn(5)?;
|
|
|
|
loop {
|
|
thread::sleep(Duration::from_secs(5));
|
|
|
|
// Accès thread-safe au DeviceRegistry
|
|
let reg = cp.registry();
|
|
let reg = reg.read().expect("registry poisoned");
|
|
|
|
let renderers: Vec<RendererInfo> = reg.list_renderers();
|
|
let servers: Vec<UpnpMediaServer> = reg.list_servers();
|
|
|
|
println!("=====================");
|
|
println!("Renderers detected : {}", renderers.len());
|
|
for r in &renderers {
|
|
let proto = match r.protocol {
|
|
RendererProtocol::UpnpAvOnly => "UPnP AV",
|
|
RendererProtocol::OpenHomeOnly => "OpenHome",
|
|
RendererProtocol::OpenHomeHybrid => "Hybrid",
|
|
};
|
|
|
|
println!(
|
|
"- [{}] {} ({}) [{}] online={}",
|
|
r.id.0, r.friendly_name, r.model_name, proto, r.online
|
|
);
|
|
}
|
|
|
|
println!();
|
|
println!("Media servers detected : {}", servers.len());
|
|
for s in &servers {
|
|
println!(
|
|
"- [{}] {} ({}) online={}",
|
|
s.id.0, s.friendly_name, s.model_name, s.online
|
|
);
|
|
}
|
|
|
|
println!("=====================");
|
|
}
|
|
}
|