summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-06-17 21:35:21 +0300
committerPaul Buetow <paul@buetow.org>2026-06-17 21:35:21 +0300
commit25aff490d739290602b28bdc53936dd3ea6ed939 (patch)
treedb6b521d3e5281d5edec1aa8588b48192e3a0f4d /src
parent6109e2a6f5bc45c3c4080259bd09a1e3dc48ea4d (diff)
mn0 share camera Make+Model dedup helper
The rule that joins a camera's EXIF Make + Model into one label while avoiding a duplicated manufacturer prefix (e.g. "Canon Canon EOS 5D" -> "Canon EOS 5D") was implemented independently in the album tooltip builder and the stats leaderboard tally. Extract it into a single shared helper camera_label_from_make_model in the new src/lib/metadata-label.source.sh, sourced before both callers. Both prior implementations were behavior-identical (empty model -> make, empty make -> model, exact/prefix dedup, case-sensitive), so this is a pure DRY refactor with no observable output change. Added a focused unit test covering dedup, plain concatenation and the empty-field edge cases. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffstat (limited to 'src')
-rw-r--r--src/lib/album-metadata.source.sh18
-rw-r--r--src/lib/metadata-label.source.sh31
-rw-r--r--src/lib/stats-aggregate.source.sh25
3 files changed, 38 insertions, 36 deletions
diff --git a/src/lib/album-metadata.source.sh b/src/lib/album-metadata.source.sh
index 2078a85..cc500ae 100644
--- a/src/lib/album-metadata.source.sh
+++ b/src/lib/album-metadata.source.sh
@@ -169,21 +169,9 @@ _photo_exif_tooltip_text_from_values() {
make="${values_ref[Make]:-}"
model="${values_ref[Model]:-}"
- camera="$make"
- if [ -n "$model" ]; then
- if [ -n "$make" ]; then
- case "$model" in
- "$make"|"$make "*)
- camera="$model"
- ;;
- *)
- camera="$make $model"
- ;;
- esac
- else
- camera="$model"
- fi
- fi
+ # Dedup the manufacturer prefix via the shared helper (task mn0) so this
+ # tooltip and the stats leaderboard derive identical camera labels.
+ camera=$(camera_label_from_make_model "$make" "$model")
_first_exif_value_to aperture "$exif_name" FNumber ApertureValue
_first_exif_value_to iso "$exif_name" \
diff --git a/src/lib/metadata-label.source.sh b/src/lib/metadata-label.source.sh
new file mode 100644
index 0000000..4d36b3c
--- /dev/null
+++ b/src/lib/metadata-label.source.sh
@@ -0,0 +1,31 @@
+# Shared EXIF metadata label helpers. Extracted (task mn0) so the rule for
+# turning a camera's Make + Model into one human-readable label lives in a
+# single place instead of being duplicated in album-metadata.source.sh's
+# tooltip builder and stats-aggregate.source.sh's leaderboard tally. This file
+# is sourced before both callers (see LIB_SOURCES in the Justfile). All library
+# modules are sourced before any code runs, so definition order only documents
+# the dependency, it does not affect availability.
+
+# Join a camera's EXIF Make + Model into one label, avoiding a duplicated
+# manufacturer prefix. Many cameras already repeat the make inside the model
+# (e.g. Make="Canon", Model="Canon EOS 5D"), so when the model equals the make
+# or starts with "<make> " we keep the model alone ("Canon EOS 5D" rather than
+# "Canon Canon EOS 5D"). Either field may be empty: an empty model yields the
+# make, an empty make yields the model, and both empty yields an empty string.
+camera_label_from_make_model() {
+ local -r make="$1"; shift
+ local -r model="$1"; shift
+
+ if [ -z "$model" ]; then
+ printf '%s' "$make"
+ return
+ fi
+ if [ -z "$make" ]; then
+ printf '%s' "$model"
+ return
+ fi
+ case "$model" in
+ "$make"|"$make "*) printf '%s' "$model" ;;
+ *) printf '%s %s' "$make" "$model" ;;
+ esac
+}
diff --git a/src/lib/stats-aggregate.source.sh b/src/lib/stats-aggregate.source.sh
index ebb75cf..46592c4 100644
--- a/src/lib/stats-aggregate.source.sh
+++ b/src/lib/stats-aggregate.source.sh
@@ -300,34 +300,17 @@ _stats_slug() {
printf '%s' "$slug"
}
-# Join Make + Model into a single camera label, reusing the same dedup logic as
-# album.source.sh's tooltip builder (handles "Model already includes Make").
-_stats_camera_label() {
- local -r make="$1"; shift
- local -r model="$1"; shift
-
- if [ -z "$model" ]; then
- printf '%s' "$make"
- return
- fi
- if [ -z "$make" ]; then
- printf '%s' "$model"
- return
- fi
- case "$model" in
- "$make"|"$make "*) printf '%s' "$model" ;;
- *) printf '%s %s' "$make" "$model" ;;
- esac
-}
-
# Tally a photo's camera (Make+Model) and, when present, its lens into their
# leaderboard counts and filter mini-albums. Skips photos with no Make/Model.
+# The Make+Model dedup now lives in camera_label_from_make_model
+# (metadata-label.source.sh, task mn0), shared with the album tooltip builder.
_stats_record_camera() {
local -n values_ref="$1"; shift
local -r photo="$1"; shift
local label
- label=$(_stats_camera_label "${values_ref[Make]:-}" "${values_ref[Model]:-}")
+ label=$(camera_label_from_make_model \
+ "${values_ref[Make]:-}" "${values_ref[Model]:-}")
_stats_tally STATS_CAMERAS camera "$label" "$label" "$photo"
if [ -n "${values_ref[LensModel]:-}" ]; then
_stats_tally STATS_LENSES lens \