Lire le flac en stream et le décoder en PCM avec claxon

This commit is contained in:
2025-10-25 22:24:18 +02:00
parent 2290ae3cd7
commit d78acc254d
15 changed files with 956 additions and 211 deletions

View File

@@ -9,3 +9,5 @@ pmodidl = { path = "../pmodidl" }
once_cell = "1.20"
bevy_reflect = "0.17.1"
htmlescape = "0.3"
quick-xml = "0.38.3"

View File

@@ -5,16 +5,40 @@ use once_cell::sync::Lazy;
use pmodidl::{DIDLLite, MediaMetadataParser};
use pmoupnp::state_variables::{StateVariable, StateVariableError};
use pmoupnp::variable_types::StateVarType;
use htmlescape::decode_html;
fn avtransporturimetadataparser(value: &str) -> Result<Box<dyn Reflect>, StateVariableError> {
// Parse DIDL-Lite
let didl = DIDLLite::parse(value)
// Nettoyage de base
let trimmed = value.trim();
// Cas 1 : chaîne vide => pas de métadonnée
if trimmed.is_empty() {
return Ok(Box::new(DIDLLite::default()) as Box<dyn Reflect>);
}
// Cas 2 : XML échappé (&lt;DIDL-Lite&gt;)
let decoded = if trimmed.starts_with("&lt;") {
decode_html(trimmed).unwrap_or_else(|_| trimmed.to_string())
} else {
trimmed.to_string()
};
// Tentative de parsing
let didl = DIDLLite::parse(&decoded)
.map_err(|e| StateVariableError::ParseError(format!("Failed to parse DIDL-Lite: {}", e)))?;
// Retourne le résultat sous forme de Box<dyn Reflect>
Ok(Box::new(didl) as Box<dyn Reflect>)
}
fn avtransporturimetadatamarshal(value: &dyn Reflect) -> Result<String, StateVariableError> {
let didl = value.downcast_ref::<DIDLLite>()
.ok_or_else(|| StateVariableError::ConversionError("DIDLLite".into()))?;
let xml = quick_xml::se::to_string(didl)
.map_err(|e| StateVariableError::ConversionError(format!("serialize error: {}", e)))?;
Ok(xml)
}
pub static AVTRANSPORTURIMETADATA: Lazy<Arc<StateVariable>> =
Lazy::new(|| -> Arc<StateVariable> {
let mut sv = StateVariable::new(StateVarType::String, "AVTransportURIMetaData".to_string());
@@ -33,5 +57,9 @@ pub static AVTRANSPORTNEXTURIMETADATA: Lazy<Arc<StateVariable>> =
sv.set_value_parser(Arc::new(avtransporturimetadataparser))
.expect("Failed to set parser");
sv.set_value_marshaler(Arc::new(avtransporturimetadatamarshal))
.expect("Failed to set mzrshaler");
Arc::new(sv)
});