use std::env;
use xmpkit::{core::namespace::ns, XmpFile, XmpValue};
fn read_xmp_from_file() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = env::args().collect();
let path = match args.len() {
2 => Ok(&args[1]),
n => Err(format!(
"expected 1 argument (file name), got {} arguments",
n - 1
)),
}?;
let mut xmp_file = XmpFile::new();
xmp_file.open(path)?;
let xmp = xmp_file
.get_xmp()
.ok_or_else(|| format!("unable to process XMP in file {}", path))?;
if let Some(creator_tool) = xmp.get_property(ns::XMP, "CreatorTool") {
if let XmpValue::String(value) = creator_tool {
println!("CreatorTool = {}", value);
}
}
if let Some(size) = xmp.get_array_size(ns::DC, "creator") {
if size > 0 {
if let Some(first_creator) = xmp.get_array_item(ns::DC, "creator", 0) {
if let XmpValue::String(value) = first_creator {
println!("dc:creator = {}", value);
}
}
} else {
println!("No creator found");
}
} else {
println!("No creator found");
}
if let Some(size) = xmp.get_array_size(ns::DC, "subject") {
for index in 0..size {
if let Some(subject) = xmp.get_array_item(ns::DC, "subject", index) {
if let XmpValue::String(value) = subject {
println!("dc:subject[{}] = {}", index, value);
}
}
}
}
if let Some((value, _actual_lang)) = xmp.get_localized_text(ns::DC, "title", "en", "en-US") {
println!("dc:title in English = {}", value);
}
if let Some((value, _actual_lang)) = xmp.get_localized_text(ns::DC, "title", "fr", "fr-FR") {
println!("dc:title in French = {}", value);
}
if let Some(dt) = xmp.get_date_time(ns::XMP, "MetadataDate") {
println!("xmp:MetadataDate = {}", dt.format());
}
if let Some(value) = xmp.get_struct_field(ns::EXIF, "Flash", "Fired") {
if let XmpValue::String(s) = value {
println!("Flash Used = {}", s);
}
}
Ok(())
}
fn main() {
if let Err(err) = read_xmp_from_file() {
eprintln!("Error: {:?}", err);
std::process::exit(1);
}
}