Files
pmomusic/pmocontrol/examples/discover.rs
Eric Coissac 5c5e1d534b feat: Implémentation complète de la source Radio France avec intégration UPnP et serveur HTTP
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
2026-01-23 12:20:43 +01:00

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!("=====================");
}
}