]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new function exif-field
authorStefan Kangas <stefan@marxist.se>
Sat, 23 Oct 2021 04:12:35 +0000 (06:12 +0200)
committerStefan Kangas <stefan@marxist.se>
Sat, 23 Oct 2021 06:13:43 +0000 (08:13 +0200)
* test/lisp/image/exif-tests.el (exif-elem): Move function from here...
* lisp/image/exif.el (exif-field): ...to here, and rename.
(exif-orientation):
* test/lisp/image/exif-tests.el (test-exif-parse)
(test-exif-parse-short): Use above new function.

etc/NEWS
lisp/image/exif.el
test/lisp/image/exif-tests.el

index 36d04aa2d83ccf930d1c4f24af0be075049a613a..7f61cf952af69e20e0732e9ae957e6b6d70a4d52 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -189,6 +189,12 @@ To improve security, if an sql product has ':password-in-comint' set
 to t, a password supplied via the minibuffer will be sent in-process,
 as opposed to via the command-line.
 
+** Exif
+
+*** New function 'exif-field'.
+This is a convenience function to extract the field data from
+`exif-parse-file' and `exif-parse-buffer'.
+
 \f
 * New Modes and Packages in Emacs 29.1
 
index c2cf23464080bd074c92e58fe7ae52d74497a8d1..67b00844d36edc4416bfa5f449740d068e099228 100644 (file)
@@ -58,6 +58,9 @@
 ;;  (:tag 306 :tag-name date-time :format 2 :format-type ascii
 ;;   :value "2019:09:21 16:22:13")
 ;;   ...)
+;;
+;; (exif-field 'date-time (exif-parse-file "test.jpg")) =>
+;; "2022:09:14 18:46:19"
 
 ;;; Code:
 
@@ -122,13 +125,20 @@ If the data is invalid, an `exif-error' is signaled."
         (when-let ((app1 (cdr (assq #xffe1 (exif--parse-jpeg)))))
           (exif--parse-exif-chunk app1))))))
 
+(defun exif-field (field data)
+  "Return raw FIELD from EXIF.
+If FIELD is not present in the data, return nil.
+FIELD is a symbol in the cdr of `exif-tag-alist'.
+DATA is the result of calling `exif-parse-file'."
+  (plist-get (seq-find (lambda (e)
+                         (eq field (plist-get e :tag-name)))
+                       data)
+             :value))
+
 (defun exif-orientation (exif)
   "Return the orientation (in degrees) in EXIF.
 If the orientation isn't present in the data, return nil."
-  (let ((code (plist-get (cl-find 'orientation exif
-                                  :key (lambda (e)
-                                         (plist-get e :tag-name)))
-                         :value)))
+  (let ((code (exif-field 'orientation exif)))
     (cadr (assq code exif--orientation))))
 
 (defun exif--parse-jpeg ()
index ddbee75467e8b7c049de196762042b3444ee16f4..2357113f6301005ce21b843073a73bbdeccc16a2 100644 (file)
                           (or (getenv "EMACS_TEST_DIRECTORY")
                               "../../"))))
 
-(defun exif-elem (exif elem)
-  (plist-get (seq-find (lambda (e)
-                         (eq elem (plist-get e :tag-name)))
-                       exif)
-             :value))
-
 (ert-deftest test-exif-parse ()
   (let ((exif (exif-parse-file (test-image-file "black.jpg"))))
-    (should (equal (exif-elem exif 'make) "Panasonic"))
-    (should (equal (exif-elem exif 'orientation) 1))
-    (should (equal (exif-elem exif 'x-resolution) '(180 . 1)))))
+    (should (equal (exif-field 'make exif) "Panasonic"))
+    (should (equal (exif-field 'orientation exif) 1))
+    (should (equal (exif-field 'x-resolution exif) '(180 . 1)))
+    (should (equal (exif-field 'date-time exif) "2019:09:21 16:22:13"))))
 
 (ert-deftest test-exif-parse-short ()
   (let ((exif (exif-parse-file (test-image-file "black-short.jpg"))))
-    (should (equal (exif-elem exif 'make) "thr"))
-    (should (equal (exif-elem exif 'model) "four"))
-    (should (equal (exif-elem exif 'software) "em"))
-    (should (equal (exif-elem exif 'artist) "z"))))
+    (should (equal (exif-field 'make exif) "thr"))
+    (should (equal (exif-field 'model exif) "four"))
+    (should (equal (exif-field 'software exif) "em"))
+    (should (equal (exif-field 'artist exif) "z"))))
 
 (ert-deftest test-exit-direct-ascii-value ()
   (should (equal (exif--direct-ascii-value 28005 2 t) (string ?e ?m 0)))