emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/calibre 0e7221461b 62/76: Add ability to use CLI interf


From: ELPA Syncer
Subject: [elpa] externals/calibre 0e7221461b 62/76: Add ability to use CLI interface instead of SQLite
Date: Thu, 18 May 2023 09:57:46 -0400 (EDT)

branch: externals/calibre
commit 0e7221461be77e866fc21ec53f2f7e68bd64d7ee
Author: Kjartan Óli Ágústsson <kjartanoli@disroot.org>
Commit: Kjartan Óli Ágústsson <kjartanoli@disroot.org>

    Add ability to use CLI interface instead of SQLite
    
    * calibre-cli.el:
    (calibre-cli--get-books):
    (calibre-cli--make-book):
    (calibre-cli--parse-authors):
    (calibre-cli--parse-timestamp):
    (calibre-cli--parse-formats):
    (calibre-cli--parse-path):
    (calibre-cli--parse-file-name):
    (calibre-cli--search-operation):
    (calibre-cli--get-series-books):
    (calibre-cli--get-publisher-books):
    (calibre-cli--get-format-books):
    (calibre-cli--get-tag-books):
    (calibre-cli--get-author-books):
    (calibre-cli--get-calibre-cli-books):
    Create.
---
 calibre-cli.el | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 114 insertions(+)

diff --git a/calibre-cli.el b/calibre-cli.el
new file mode 100644
index 0000000000..2ec96fc128
--- /dev/null
+++ b/calibre-cli.el
@@ -0,0 +1,114 @@
+;;; calibre-cli.el --- Fallback CLI interface when SQLite is not available  
-*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023  Kjartan Oli Agustsson
+
+;; This file is part of calibre.el.
+
+;; calibre.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.
+
+;; calibre.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 calibre.el.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; This file contains an interface to calibre using calibredb and JSON
+;; parsing instead of SQLite.  This interface is significantly slower
+;; than the SQLite interface, and should therefore only be used when
+;; SQLite support is not available.
+
+;;; Code:
+(require 'calibre)
+(require 'calibre-book)
+(require 'calibre-util)
+
+(defun calibre-cli--get-books ()
+  "Return all books in the Calibre library `calibre-library-dir'."
+  (let ((json (with-temp-buffer
+                (call-process calibre-calibredb-executable
+                              nil
+                              t
+                              nil
+                              "list"
+                              "--with-library"
+                              (calibre--library)
+                              "-f"
+                              "all"
+                              "--for-machine")
+                (goto-char (point-min))
+                (json-parse-buffer :object-type 'alist :array-type 'list))))
+    (mapcar #'calibre-cli--make-book json)))
+
+(defun calibre-cli--make-book (json)
+  "Make a `calibre-book' from JSON."
+  (let-alist json
+    (calibre-book :id .id
+                  :title .title
+                  :authors (calibre-cli--parse-authors .authors)
+                  :publisher .publisher
+                  :series .series
+                  :series-index .series_index
+                  :timestamp (calibre-cli--parse-timestamp .timestamp)
+                  :pubdate (calibre-cli--parse-timestamp .pubdate)
+                  :last-modified (calibre-cli--parse-timestamp .last_modified)
+                  :tags .tags
+                  :formats (calibre-cli--parse-formats .formats)
+                  :path (calibre-cli--parse-path .formats)
+                  :file-name (calibre-cli--parse-file-name .formats))))
+
+(defun calibre-cli--parse-authors (authors)
+  "Parse AUTHORS a string, into a list of authors.
+AUTHORS should be a comma separated string."
+  (string-split authors ","))
+
+(defun calibre-cli--parse-timestamp (timestamp)
+  "Parse TIMESTAMP into a Lisp timestamp."
+  (iso8601-parse timestamp))
+
+(defun calibre-cli--parse-formats (files)
+  "Return the formats of the book whose files are FILES."
+  (mapcar (lambda (f)
+            (intern (file-name-extension f)))
+          files))
+
+(defun calibre-cli--parse-path (files)
+  "Return the path within the library of the book whose files are FILES."
+  (string-replace (calibre--library)
+                  ""
+                  (file-name-directory (car files))))
+
+(defun calibre-cli--parse-file-name (files)
+  "Return the File Name of the book whose files are FILES."
+  (file-name-base (car files)))
+
+(defmacro calibre-cli--search-operation (field)
+  "Create a function to search for books matching FIELD."
+  `(defun ,(intern (format "calibre-cli--get-%s-books" field)) (,field)
+     (with-temp-buffer
+       (call-process calibre-calibredb-executable
+                     nil
+                     t
+                     nil
+                     "search"
+                     "--with-library"
+                     (calibre--library)
+                     (format ,(format "%s:%%s" field) ,field))
+       (mapcar #'cl-parse-integer
+               (string-split
+                (buffer-substring-no-properties (point-min) (point-max))
+                ",")))))
+
+(calibre-cli--search-operation series)
+(calibre-cli--search-operation publisher)
+(calibre-cli--search-operation format)
+(calibre-cli--search-operation tag)
+(calibre-cli--search-operation author)
+
+(provide 'calibre-cli)
+;;; calibre-cli.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]