From c6ff053f19fe052f39c59a2a3706da88fdcbdc15 Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Wed, 1 Mar 2017 16:02:18 +0530 Subject: Rename library to exiftool.el. --- el-exiftool.el | 134 --------------------------------------------- exiftool.el | 134 +++++++++++++++++++++++++++++++++++++++++++++ tests/Makefile | 2 +- tests/el-exiftool-tests.el | 74 ------------------------- tests/exiftool-tests.el | 74 +++++++++++++++++++++++++ 5 files changed, 209 insertions(+), 209 deletions(-) delete mode 100644 el-exiftool.el create mode 100644 exiftool.el delete mode 100644 tests/el-exiftool-tests.el create mode 100644 tests/exiftool-tests.el diff --git a/el-exiftool.el b/el-exiftool.el deleted file mode 100644 index 33a91e5..0000000 --- a/el-exiftool.el +++ /dev/null @@ -1,134 +0,0 @@ -;;; el-exiftool.el --- Elisp wrapper around ExifTool -*- lexical-binding: t -*- - -;; Elisp wrapper around ExifTool -;; Copyright (C) 2017 by Arun I -;; -;; Author: Arun I -;; Version: 0.1 -;; Keywords: data -;; Homepage: https://git.systemreboot.net/el-exiftool -;; Package-Requires: ((emacs "25")) - -;; This file is part of el-exiftool. - -;; el-exiftool is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; el-exiftool is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with el-exiftool. If not, see . - -;;; Commentary: -;; -;; el-exiftool is an elisp wrapper around ExifTool. ExifTool supports -;; reading and writing metadata in various formats including EXIF, XMP -;; and IPTC. -;; -;; There is a significant overhead in loading ExifTool for every -;; command to be exected. So, el-exiftool starts an ExifTool process -;; in the -stay_open mode, and passes all commands to it. For more -;; about ExifTool's -stay_open mode, see -;; http://www.sno.phy.queensu.ca/~phil/exiftool/#performance - -;;; Code: - -(require 'cl-lib) -(require 'subr-x) -(require 'tq) - -(defun el-exiftool--tq-sync-query (tq question regexp) - "Add a transaction to transaction queue TQ, block and read response. - -See `tq-enqueue' for details of arguments QUESTION and REGEXP." - (let ((response)) - (tq-enqueue tq question regexp nil - (lambda (_ answer) (setq response answer))) - (while (not response) - (accept-process-output)) - response)) - -(defun el-exiftool-run () - "Start an exiftool process if one is not already running. - -If an exiftool process is already running, delete it, and create -a new one. Return the process object of the newly created -process." - (when-let (exiftool (get-process "exiftool")) - (delete-process exiftool)) - (start-process "exiftool" "exiftool" "exiftool" "-stay_open" "True" "-@" "-")) - -(let ((tq (tq-create (el-exiftool-run)))) - (defun el-exiftool-command (&rest args) - "Execute a command in the currently running exiftool process. - -ARGS are arguments of the command to be run, as provided to the -exiftool command line application." - (string-trim - (let ((suffix "{ready}\n")) - (string-remove-suffix - suffix (el-exiftool--tq-sync-query - tq (concat (string-join args "\n") - "\n-execute\n") - suffix)))))) - -(defun el-exiftool-read (file &rest tags) - "Read TAGS from FILE, return an alist mapping TAGS to values. - -If a tag is not found, return an empty string \"\" as the -value. If no TAGS are specified, read all tags from FILE. - -\(fn FILE TAG...)" - (mapcar - (lambda (line) - (cl-destructuring-bind - (tag value) (split-string line ": ") - (let ((value (if (equal value "-") "" value))) - (cons tag value)))) - (split-string - (apply 'el-exiftool-command - "-s" "-s" "-f" - (append - (mapcar (apply-partially 'format "-%s") tags) - (list file))) - "\n+"))) - -(defun el-exiftool-copy (source destination &rest tags) - "Copy TAGS from SOURCE file to DESTINATION file. - -If no TAGS are specified, copy all tags from SOURCE." - (apply 'el-exiftool-command - "-overwrite_original" - "-tagsFromFile" source - (append - (mapcar (apply-partially 'format "-%s") tags) - (list "-all:all" destination))) - (message "Tags from %s copied to %s" source destination) - destination) - -(defun el-exiftool-write (file &rest tag-value-alist) - "Write tags to FILE. - -The metadata to be written is specified as (TAG . VALUE) -pairs. Specifying the empty string \"\" for VALUE deletes that -TAG. - -\(fn FILE (TAG . VALUE)...)" - (apply 'el-exiftool-command - "-m" "-overwrite_original" - (append - (mapcar - (cl-function - (lambda ((tag . value)) - (format "-%s=%s" tag value))) - tag-value-alist) - (list file)))) - -(provide 'el-exiftool) - -;;; el-exiftool.el ends here diff --git a/exiftool.el b/exiftool.el new file mode 100644 index 0000000..cf7a89f --- /dev/null +++ b/exiftool.el @@ -0,0 +1,134 @@ +;;; exiftool.el --- Elisp wrapper around ExifTool -*- lexical-binding: t -*- + +;; Elisp wrapper around ExifTool +;; Copyright (C) 2017 by Arun I +;; +;; Author: Arun I +;; Version: 0.1 +;; Keywords: data +;; Homepage: https://git.systemreboot.net/exiftool.el +;; Package-Requires: ((emacs "25")) + +;; This file is part of exiftool.el. + +;; exiftool.el is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; exiftool.el is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with exiftool.el. If not, see . + +;;; Commentary: +;; +;; exiftool.el is an elisp wrapper around ExifTool. ExifTool supports +;; reading and writing metadata in various formats including EXIF, XMP +;; and IPTC. +;; +;; There is a significant overhead in loading ExifTool for every +;; command to be exected. So, exiftool.el starts an ExifTool process +;; in the -stay_open mode, and passes all commands to it. For more +;; about ExifTool's -stay_open mode, see +;; http://www.sno.phy.queensu.ca/~phil/exiftool/#performance + +;;; Code: + +(require 'cl-lib) +(require 'subr-x) +(require 'tq) + +(defun exiftool--tq-sync-query (tq question regexp) + "Add a transaction to transaction queue TQ, block and read response. + +See `tq-enqueue' for details of arguments QUESTION and REGEXP." + (let ((response)) + (tq-enqueue tq question regexp nil + (lambda (_ answer) (setq response answer))) + (while (not response) + (accept-process-output)) + response)) + +(defun exiftool-run () + "Start an exiftool process if one is not already running. + +If an exiftool process is already running, delete it, and create +a new one. Return the process object of the newly created +process." + (when-let (exiftool (get-process "exiftool")) + (delete-process exiftool)) + (start-process "exiftool" "exiftool" "exiftool" "-stay_open" "True" "-@" "-")) + +(let ((tq (tq-create (exiftool-run)))) + (defun exiftool-command (&rest args) + "Execute a command in the currently running exiftool process. + +ARGS are arguments of the command to be run, as provided to the +exiftool command line application." + (string-trim + (let ((suffix "{ready}\n")) + (string-remove-suffix + suffix (exiftool--tq-sync-query + tq (concat (string-join args "\n") + "\n-execute\n") + suffix)))))) + +(defun exiftool-read (file &rest tags) + "Read TAGS from FILE, return an alist mapping TAGS to values. + +If a tag is not found, return an empty string \"\" as the +value. If no TAGS are specified, read all tags from FILE. + +\(fn FILE TAG...)" + (mapcar + (lambda (line) + (cl-destructuring-bind + (tag value) (split-string line ": ") + (let ((value (if (equal value "-") "" value))) + (cons tag value)))) + (split-string + (apply 'exiftool-command + "-s" "-s" "-f" + (append + (mapcar (apply-partially 'format "-%s") tags) + (list file))) + "\n+"))) + +(defun exiftool-copy (source destination &rest tags) + "Copy TAGS from SOURCE file to DESTINATION file. + +If no TAGS are specified, copy all tags from SOURCE." + (apply 'exiftool-command + "-overwrite_original" + "-tagsFromFile" source + (append + (mapcar (apply-partially 'format "-%s") tags) + (list "-all:all" destination))) + (message "Tags from %s copied to %s" source destination) + destination) + +(defun exiftool-write (file &rest tag-value-alist) + "Write tags to FILE. + +The metadata to be written is specified as (TAG . VALUE) +pairs. Specifying the empty string \"\" for VALUE deletes that +TAG. + +\(fn FILE (TAG . VALUE)...)" + (apply 'exiftool-command + "-m" "-overwrite_original" + (append + (mapcar + (cl-function + (lambda ((tag . value)) + (format "-%s=%s" tag value))) + tag-value-alist) + (list file)))) + +(provide 'exiftool) + +;;; exiftool.el ends here diff --git a/tests/Makefile b/tests/Makefile index c501287..95d8728 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,2 +1,2 @@ check: - emacs -batch -l ert -l ../el-exiftool.el -l el-exiftool-tests.el -f ert-run-tests-batch-and-exit + emacs -batch -l ert -l ../exiftool.el -l exiftool-tests.el -f ert-run-tests-batch-and-exit diff --git a/tests/el-exiftool-tests.el b/tests/el-exiftool-tests.el deleted file mode 100644 index 6d7d01a..0000000 --- a/tests/el-exiftool-tests.el +++ /dev/null @@ -1,74 +0,0 @@ -;;; el-exiftool.el --- Elisp wrapper around exiftool ;; -*- lexical-binding: t -*- - -;; Elisp wrapper around exiftool -;; Copyright (C) 2017 by Arun I -;; -;; Author: Arun I -;; Keywords: data -;; Homepage: https://git.systemreboot.net/el-exiftool - -;; This file is part of el-exiftool. - -;; el-exiftool is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; el-exiftool is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with el-exiftool. If not, see . - -;;; Commentary: -;; -;; Unit testing for el-exiftool - -;;; Code: - -(defvar el-exiftool-tests--tag-value - '(("Marked" . "True") - ("Creator" . "foo") - ("Rights" . "bar"))) - -(require 'el-exiftool) -(require 'ert) - -(defmacro with-temp-test-file (test-file temp-file &rest body) - "Copy TEST-FILE to temporary file, put path in TEMP-FILE, evaluate BODY." - (declare (indent defun)) - `(let ((,temp-file (make-temp-file "el-exiftool-" - nil (concat "-" ,test-file)))) - (copy-file ,test-file ,temp-file t) - ,@body - (delete-file ,temp-file))) - -(ert-deftest read-write-test () - (with-temp-test-file "test1.png" temp-file - (apply 'el-exiftool-write temp-file el-exiftool-tests--tag-value) - (should (equal (apply 'el-exiftool-read temp-file (mapcar 'car el-exiftool-tests--tag-value)) - el-exiftool-tests--tag-value)))) - -(ert-deftest delete-test () - (with-temp-test-file "test1.png" temp-file - (el-exiftool-write temp-file (car el-exiftool-tests--tag-value)) - (let ((delete-pair - (cons (caar el-exiftool-tests--tag-value) ""))) - (el-exiftool-write temp-file delete-pair) - (should (equal (car (el-exiftool-read temp-file "Marked")) - delete-pair))))) - -(ert-deftest copy-test () - (with-temp-test-file "test1.png" temp-1 - (with-temp-test-file "test2.jpg" temp-2 - (apply 'el-exiftool-write temp-1 el-exiftool-tests--tag-value) - (el-exiftool-copy temp-1 temp-2) - (let ((tags (mapcar 'car el-exiftool-tests--tag-value))) - (should (equal (apply 'el-exiftool-read temp-1 tags) - (apply 'el-exiftool-read temp-2 tags))))))) - -(provide 'el-exiftool-tests) - -;;; el-exiftool-tests.el ends here diff --git a/tests/exiftool-tests.el b/tests/exiftool-tests.el new file mode 100644 index 0000000..fa13dbf --- /dev/null +++ b/tests/exiftool-tests.el @@ -0,0 +1,74 @@ +;;; exiftool.el --- Elisp wrapper around exiftool ;; -*- lexical-binding: t -*- + +;; Elisp wrapper around exiftool +;; Copyright (C) 2017 by Arun I +;; +;; Author: Arun I +;; Keywords: data +;; Homepage: https://git.systemreboot.net/exiftool.el + +;; This file is part of exiftool.el. + +;; exiftool.el is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; exiftool.el is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with exiftool.el. If not, see . + +;;; Commentary: +;; +;; Unit testing for exiftool.el + +;;; Code: + +(defvar exiftool-tests--tag-value + '(("Marked" . "True") + ("Creator" . "foo") + ("Rights" . "bar"))) + +(require 'exiftool) +(require 'ert) + +(defmacro with-temp-test-file (test-file temp-file &rest body) + "Copy TEST-FILE to temporary file, put path in TEMP-FILE, evaluate BODY." + (declare (indent defun)) + `(let ((,temp-file (make-temp-file "exiftool-" + nil (concat "-" ,test-file)))) + (copy-file ,test-file ,temp-file t) + ,@body + (delete-file ,temp-file))) + +(ert-deftest read-write-test () + (with-temp-test-file "test1.png" temp-file + (apply 'exiftool-write temp-file exiftool-tests--tag-value) + (should (equal (apply 'exiftool-read temp-file (mapcar 'car exiftool-tests--tag-value)) + exiftool-tests--tag-value)))) + +(ert-deftest delete-test () + (with-temp-test-file "test1.png" temp-file + (exiftool-write temp-file (car exiftool-tests--tag-value)) + (let ((delete-pair + (cons (caar exiftool-tests--tag-value) ""))) + (exiftool-write temp-file delete-pair) + (should (equal (car (exiftool-read temp-file "Marked")) + delete-pair))))) + +(ert-deftest copy-test () + (with-temp-test-file "test1.png" temp-1 + (with-temp-test-file "test2.jpg" temp-2 + (apply 'exiftool-write temp-1 exiftool-tests--tag-value) + (exiftool-copy temp-1 temp-2) + (let ((tags (mapcar 'car exiftool-tests--tag-value))) + (should (equal (apply 'exiftool-read temp-1 tags) + (apply 'exiftool-read temp-2 tags))))))) + +(provide 'exiftool-tests) + +;;; exiftool-tests.el ends here -- cgit v1.2.3