Lire le flac en stream et le décoder en PCM avec claxon
This commit is contained in:
@@ -9,3 +9,5 @@ pmodidl = { path = "../pmodidl" }
|
||||
|
||||
once_cell = "1.20"
|
||||
bevy_reflect = "0.17.1"
|
||||
htmlescape = "0.3"
|
||||
quick-xml = "0.38.3"
|
||||
|
||||
@@ -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é (<DIDL-Lite>)
|
||||
let decoded = if trimmed.starts_with("<") {
|
||||
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)
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user