nouveau mediarenderer
This commit is contained in:
@@ -18,6 +18,9 @@ use pmoaudiocache::Cache as AudioCache;
|
||||
/// Contient les instances partagées des caches de couvertures et audio.
|
||||
/// Ces caches sont uniques et partagés entre toutes les sources musicales.
|
||||
pub struct CacheRegistry {
|
||||
/// URL de base du serveur (ex: "http://localhost:8080")
|
||||
base_url: Option<String>,
|
||||
|
||||
/// Cache de couvertures (WebP)
|
||||
cover_cache: Option<Arc<CoverCache>>,
|
||||
|
||||
@@ -29,11 +32,22 @@ impl CacheRegistry {
|
||||
/// Créer un nouveau registre vide
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
base_url: None,
|
||||
cover_cache: None,
|
||||
audio_cache: None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Définir l'URL de base du serveur
|
||||
pub fn set_base_url(&mut self, url: String) {
|
||||
self.base_url = Some(url);
|
||||
}
|
||||
|
||||
/// Récupérer l'URL de base du serveur
|
||||
pub fn base_url(&self) -> Option<&str> {
|
||||
self.base_url.as_deref()
|
||||
}
|
||||
|
||||
/// Enregistrer le cache de couvertures
|
||||
pub fn set_cover_cache(&mut self, cache: Arc<CoverCache>) {
|
||||
self.cover_cache = Some(cache);
|
||||
@@ -53,6 +67,42 @@ impl CacheRegistry {
|
||||
pub fn audio_cache(&self) -> Option<Arc<AudioCache>> {
|
||||
self.audio_cache.clone()
|
||||
}
|
||||
|
||||
/// Construit l'URL complète pour une couverture
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `pk` - Clé primaire de la couverture
|
||||
/// * `size` - Taille optionnelle de l'image
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// URL complète (ex: "http://localhost:8080/covers/images/abc123/300")
|
||||
pub fn build_cover_url(&self, pk: &str, size: Option<usize>) -> anyhow::Result<String> {
|
||||
let base_url = self.base_url
|
||||
.as_ref()
|
||||
.ok_or_else(|| anyhow::anyhow!("Base URL not set in CacheRegistry"))?;
|
||||
let route = pmocovers::cache::route_for(pk, size);
|
||||
Ok(format!("{}{}", base_url, route))
|
||||
}
|
||||
|
||||
/// Construit l'URL complète pour une piste audio
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `pk` - Clé primaire de la piste
|
||||
/// * `param` - Paramètre optionnel (ex: "orig", "128k")
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// URL complète (ex: "http://localhost:8080/audio/tracks/abc123/orig")
|
||||
pub fn build_audio_url(&self, pk: &str, param: Option<&str>) -> anyhow::Result<String> {
|
||||
let base_url = self.base_url
|
||||
.as_ref()
|
||||
.ok_or_else(|| anyhow::anyhow!("Base URL not set in CacheRegistry"))?;
|
||||
let route = pmoaudiocache::cache::route_for(pk, param);
|
||||
Ok(format!("{}{}", base_url, route))
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for CacheRegistry {
|
||||
@@ -99,6 +149,48 @@ pub fn get_audio_cache() -> Option<Arc<AudioCache>> {
|
||||
CACHE_REGISTRY.read().unwrap().audio_cache()
|
||||
}
|
||||
|
||||
/// Construit l'URL complète pour une couverture
|
||||
///
|
||||
/// Fonction globale qui utilise le registre de caches pour construire l'URL.
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `pk` - Clé primaire de la couverture
|
||||
/// * `size` - Taille optionnelle de l'image
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust,ignore
|
||||
/// use pmoupnp::cache_registry::build_cover_url;
|
||||
///
|
||||
/// let url = build_cover_url("abc123", Some(300))?;
|
||||
/// // url = "http://localhost:8080/covers/images/abc123/300"
|
||||
/// ```
|
||||
pub fn build_cover_url(pk: &str, size: Option<usize>) -> anyhow::Result<String> {
|
||||
CACHE_REGISTRY.read().unwrap().build_cover_url(pk, size)
|
||||
}
|
||||
|
||||
/// Construit l'URL complète pour une piste audio
|
||||
///
|
||||
/// Fonction globale qui utilise le registre de caches pour construire l'URL.
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `pk` - Clé primaire de la piste
|
||||
/// * `param` - Paramètre optionnel (ex: "orig", "128k")
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust,ignore
|
||||
/// use pmoupnp::cache_registry::build_audio_url;
|
||||
///
|
||||
/// let url = build_audio_url("abc123", Some("orig"))?;
|
||||
/// // url = "http://localhost:8080/audio/tracks/abc123/orig"
|
||||
/// ```
|
||||
pub fn build_audio_url(pk: &str, param: Option<&str>) -> anyhow::Result<String> {
|
||||
CACHE_REGISTRY.read().unwrap().build_audio_url(pk, param)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
@@ -186,8 +186,8 @@ impl UpnpServerExt for Server {
|
||||
use pmocovers::new_cache;
|
||||
use pmocache::pmoserver_ext::{create_file_router_with_generator, create_api_router};
|
||||
|
||||
let base_url = self.info().base_url;
|
||||
let cache = Arc::new(new_cache(cache_dir, limit, &base_url)?);
|
||||
let base_url = self.info().base_url.clone();
|
||||
let cache = Arc::new(new_cache(cache_dir, limit)?);
|
||||
|
||||
// Routes de fichiers avec génération de variantes
|
||||
// Routes: GET /covers/image/{pk} et GET /covers/image/{pk}/{size}
|
||||
@@ -220,8 +220,12 @@ impl UpnpServerExt for Server {
|
||||
let openapi = pmocovers::ApiDoc::openapi();
|
||||
self.add_openapi(api_router, openapi, "covers").await;
|
||||
|
||||
// Enregistrer dans le registre global
|
||||
CACHE_REGISTRY.write().unwrap().set_cover_cache(cache.clone());
|
||||
// Enregistrer base_url et cache dans le registre global
|
||||
{
|
||||
let mut registry = CACHE_REGISTRY.write().unwrap();
|
||||
registry.set_base_url(base_url);
|
||||
registry.set_cover_cache(cache.clone());
|
||||
}
|
||||
|
||||
Ok(cache)
|
||||
}
|
||||
@@ -231,8 +235,8 @@ impl UpnpServerExt for Server {
|
||||
use pmoaudiocache::new_cache;
|
||||
use pmocache::pmoserver_ext::{create_file_router, create_api_router};
|
||||
|
||||
let base_url = self.info().base_url;
|
||||
let cache = Arc::new(new_cache(cache_dir, limit, &base_url)?);
|
||||
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
|
||||
let file_router = create_file_router(cache.clone(), "audio/flac");
|
||||
@@ -243,8 +247,12 @@ impl UpnpServerExt for Server {
|
||||
let openapi = pmoaudiocache::ApiDoc::openapi();
|
||||
self.add_openapi(api_router, openapi, "audio").await;
|
||||
|
||||
// Enregistrer dans le registre global
|
||||
CACHE_REGISTRY.write().unwrap().set_audio_cache(cache.clone());
|
||||
// Enregistrer base_url et cache dans le registre global
|
||||
{
|
||||
let mut registry = CACHE_REGISTRY.write().unwrap();
|
||||
registry.set_base_url(base_url);
|
||||
registry.set_audio_cache(cache.clone());
|
||||
}
|
||||
|
||||
Ok(cache)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user