properties: Add creator, rights, lens, software

This commit is contained in:
Sophie Herold 2026-06-25 22:14:38 +02:00
parent 18d44da9e9
commit 4adf22c4e5
4 changed files with 118 additions and 4 deletions

View file

@ -20,6 +20,7 @@
mod file;
use std::collections::BTreeMap;
use std::path::PathBuf;
use std::str::FromStr;
@ -61,12 +62,23 @@ impl Metadata {
}
}
fn set_key_value(&mut self, key_value: BTreeMap<String, String>) {
let result = self.metadata.add_key_value(key_value);
if let Err(err) = &result {
tracing::warn!("Failed to add key-value data: {err}");
}
}
pub fn set_image_info(&mut self, image_info: ImageDetails) {
if let Some(exif_raw) = image_info.metadata_exif() {
self.set_exif_bytes(exif_raw.to_owned());
}
if let Some(exif_xmp) = image_info.metadata_xmp() {
self.set_xmp_bytes(exif_xmp.to_owned());
if let Some(xmp_raw) = image_info.metadata_xmp() {
self.set_xmp_bytes(xmp_raw.to_owned());
}
if let Some(key_value) = image_info.metadata_key_value() {
self.set_key_value(key_value.to_owned());
}
self.image_info = Some(image_info);
}
@ -309,6 +321,56 @@ impl Metadata {
self.metadata.make()
}
pub fn camera_owner_name(&self) -> Option<String> {
self.metadata.camera_owner_name()
}
pub fn creator(&self) -> Option<String> {
self.metadata.creator()
}
pub fn lens(&self) -> Option<String> {
if let Some(lens) = self.metadata.lens_specification()
&& lens.min_f_number_max_focal_length.numerator > 0
&& lens.min_f_number_max_focal_length.denominator > 0
{
let mut s = if lens.min_focal_length == lens.max_focal_length {
format!("{}\u{202F}mm", lens.min_focal_length.as_f32())
} else {
format!(
"{}–{}\u{202F}mm",
lens.min_focal_length.as_f32(),
lens.max_focal_length.as_f32()
)
};
if lens.min_f_number_min_focal_length == lens.min_f_number_max_focal_length {
s.push_str(&format!(
" \u{192}\u{2215}{}",
lens.min_f_number_min_focal_length.as_f32()
));
} else {
s.push_str(&format!(
" \u{192}\u{2215}{}–{}",
lens.min_f_number_min_focal_length.as_f32(),
lens.min_f_number_max_focal_length.as_f32()
));
}
Some(s)
} else {
self.metadata.lens_model()
}
}
pub fn rights(&self) -> Option<String> {
self.metadata.rights()
}
pub fn software(&self) -> Option<String> {
self.metadata.software()
}
pub fn gps_location(&self) -> Option<gufo::common::geography::Location> {
self.metadata.gps_location()
}