Implémentation du streaming audio côté serveur pour WebRenderer

Cette mise à jour implémente le streaming audio côté serveur pour WebRenderer, en remplaçant l'ancienne architecture basée sur WebSocket par une nouvelle approche utilisant des endpoints HTTP. Les modifications incluent l'ajout de dépendances audio, la création de nouveaux modules pour le pipeline audio, la gestion des registres et des flux, ainsi que la modification des handlers UPnP pour utiliser le nouveau pipeline. Le frontend a également été mis à jour pour utiliser un seul élément <audio> pointant vers le nouveau endpoint de streaming.
This commit is contained in:
2026-02-23 19:59:19 +01:00
parent 97879b4539
commit 4b3e8a961c
6 changed files with 1435 additions and 3 deletions

View File

@@ -192,6 +192,20 @@ pub fn get_server() -> Option<Arc<RwLock<Server>>> {
/// println!("Stream available at: {}", stream_url);
/// }
/// ```
/// Récupère l'URL de base effective pour une requête donnée.
///
/// Utilise les headers `X-Forwarded-*` si présents (accès via reverse proxy),
/// sinon fallback sur l'URL de base configurée (accès local direct).
pub fn get_request_base_url(headers: &axum::http::HeaderMap) -> Option<String> {
GLOBAL_SERVER.get().map(|server| {
if let Ok(srv) = server.try_read() {
srv.request_base_url(headers)
} else {
futures::executor::block_on(async { server.read().await.request_base_url(headers) })
}
})
}
pub fn get_server_base_url() -> Option<String> {
GLOBAL_SERVER.get().map(|server| {
// Utiliser try_read() pour éviter de bloquer

View File

@@ -615,6 +615,30 @@ impl Server {
self.join_handle.take()
}
/// Retourne l'URL de base vue par le client pour une requête donnée.
///
/// Priorité : headers `X-Forwarded-Proto` + `X-Forwarded-Host` (présents
/// quand la requête passe par un reverse proxy comme NPM), sinon fallback
/// sur `self.base_url()`. Cela permet de générer des URLs correctes aussi
/// bien en accès local direct qu'en accès public via proxy.
pub fn request_base_url(&self, headers: &axum::http::HeaderMap) -> String {
let proto = headers
.get("x-forwarded-proto")
.and_then(|v| v.to_str().ok())
.and_then(|v| v.split(',').next())
.map(str::trim);
let host = headers
.get("x-forwarded-host")
.or_else(|| headers.get("host"))
.and_then(|v| v.to_str().ok())
.map(str::trim);
match (proto, host) {
(Some(proto), Some(host)) => format!("{}://{}", proto, host),
_ => self.base_url(),
}
}
/// Retourne l'URL de base complète du serveur (schéma + hôte + port).
///
/// La valeur configurable peut omettre le schéma ou le port ; cette méthode