diff --git a/src/parsers/audio/ape.rs b/src/parsers/audio/ape.rs index d7f81fef7..0e4bcda0c 100644 --- a/src/parsers/audio/ape.rs +++ b/src/parsers/audio/ape.rs @@ -182,7 +182,7 @@ fn parse_mac_audio_header( let samples = u64::from(total_frames - 1) * u64::from(blocks_per_frame) + u64::from(final_frame_blocks); metadata.insert( - "APE:Duration".to_string(), + "Composite:Duration".to_string(), TagValue::new_string(convert_duration(samples as f64 / f64::from(sample_rate))), ); } @@ -429,6 +429,7 @@ mod tests { metadata.get("APE:SampleRate").unwrap().as_integer(), Some(44100) ); + assert_eq!(text(&metadata, "Composite:Duration"), "2.64 s"); } #[test] diff --git a/src/parsers/image/djvu.rs b/src/parsers/image/djvu.rs index 9e514f01d..216895601 100644 --- a/src/parsers/image/djvu.rs +++ b/src/parsers/image/djvu.rs @@ -177,7 +177,8 @@ fn metadata_from_expression(expression: Expression, metadata: &mut MetadataMap) "DjVu:Trapped".to_string(), TagValue::new_string(value.trim_start_matches('/').to_string()), ), - "note" | "Subject" | "Keywords" | "Creator" | "Producer" => { + "note" => metadata.insert("DjVu:Note".to_string(), TagValue::new_string(value.clone())), + "Subject" | "Keywords" | "Creator" | "Producer" => { metadata.insert(format!("DjVu:{name}"), TagValue::new_string(value.clone())) } _ => None, diff --git a/src/parsers/image/embedded.rs b/src/parsers/image/embedded.rs index c7f695d12..9ce9d9b82 100644 --- a/src/parsers/image/embedded.rs +++ b/src/parsers/image/embedded.rs @@ -14,7 +14,7 @@ use crate::core::{MetadataMap, TagValue}; use crate::io::buffered_reader::BufferedReader; use crate::io::{ByteOrder as IoByteOrder, EndianReader}; use crate::parsers::tiff::ifd_parser::{ByteOrder, parse_ifd}; -use crate::parsers::xmp::rdf_parser::parse_xmp; +use crate::parsers::xmp::rdf_parser::{XmpValue, parse_xmp_typed}; use crate::tag_db::lookup_tag_name; /// EXIF sub-IFD pointer (`ExifOffset`). @@ -127,11 +127,17 @@ pub fn parse_embedded_xmp(xmp_data: &[u8], metadata: &mut MetadataMap) -> bool { if std::str::from_utf8(xmp_data).is_err() { return false; } - match parse_xmp(xmp_data) { + match parse_xmp_typed(xmp_data) { Ok(tags) => { let found = !tags.is_empty(); for (name, value) in tags { - metadata.insert(name, TagValue::new_string(value)); + let value = match value { + XmpValue::Scalar(value) => TagValue::new_string(value), + XmpValue::List(values) => { + TagValue::Array(values.into_iter().map(TagValue::new_string).collect()) + } + }; + metadata.insert(name, value); } found }