From 4b9c91f8df5637f3913b370a56b28211ff168667 Mon Sep 17 00:00:00 2001 From: Sophie Herold Date: Mon, 19 Dec 2022 17:13:53 +0100 Subject: [PATCH] exif: Show device maker more consitently Also, don't call it camera because it can be a scanner etc as well --- data/gtk/properties_view.ui | 6 +++--- src/image_metadata/mod.rs | 34 +++++++++++++++++++++++++++++++++- src/image_metadata/obj.rs | 4 ++-- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/data/gtk/properties_view.ui b/data/gtk/properties_view.ui index fd5b31d..ab9400e 100644 --- a/data/gtk/properties_view.ui +++ b/data/gtk/properties_view.ui @@ -245,15 +245,15 @@ - Camera + Maker, Model - + LpPropertiesView - + LpPropertiesView diff --git a/src/image_metadata/mod.rs b/src/image_metadata/mod.rs index c4c9d1c..6f760a0 100644 --- a/src/image_metadata/mod.rs +++ b/src/image_metadata/mod.rs @@ -162,7 +162,25 @@ impl ImageMetadata { None } - pub fn camera_model(&self) -> Option { + /// Combined maker and model info + pub fn maker_model(&self) -> Option { + if let Some(mut model) = self.model() { + if let Some(maker) = self.maker() { + // This is to avoid doubling the maker name + // Canon for example also puts "Canon" in the model as well + // NIKON sometimes puts "NIKON" in model and "NIKON CORPORATION" in maker + if model.split_whitespace().next() != maker.split_whitespace().next() { + model = format!("{maker} {model}"); + } + } + + Some(model) + } else { + self.maker() + } + } + + pub fn model(&self) -> Option { if let Self::Exif(exif) = self { if let Some(field) = exif.get_field(exif::Tag::Model, exif::In::PRIMARY) { if let exif::Value::Ascii(value) = &field.value { @@ -176,6 +194,20 @@ impl ImageMetadata { None } + pub fn maker(&self) -> Option { + if let Self::Exif(exif) = self { + if let Some(field) = exif.get_field(exif::Tag::Make, exif::In::PRIMARY) { + if let exif::Value::Ascii(value) = &field.value { + if let Some(entry) = value.first() { + return Some(String::from_utf8_lossy(entry).to_string()); + } + } + } + } + + None + } + pub fn gps_location(&self) -> Option { if let Self::Exif(exif) = self { if let (Some(latitude), Some(latitude_ref), Some(longitude), Some(longitude_ref)) = ( diff --git a/src/image_metadata/obj.rs b/src/image_metadata/obj.rs index 434943a..8c961e2 100644 --- a/src/image_metadata/obj.rs +++ b/src/image_metadata/obj.rs @@ -75,7 +75,7 @@ mod imp { "exposure-time", "iso", "focal-length", - "camera-model", + "maker-model", ] .iter() .map(|name| glib::ParamSpecString::builder(name).read_only().build()) @@ -99,7 +99,7 @@ mod imp { "exposure-time" => metadata.exposure_time().to_value(), "iso" => metadata.iso().to_value(), "focal-length" => metadata.focal_length().to_value(), - "camera-model" => metadata.camera_model().to_value(), + "maker-model" => metadata.maker_model().to_value(), name => unimplemented!("property {name}"), } }