aboutsummaryrefslogtreecommitdiff
path: root/emacs/.emacs.d/lisp/my/belf.el
diff options
context:
space:
mode:
Diffstat (limited to 'emacs/.emacs.d/lisp/my/belf.el')
-rw-r--r--emacs/.emacs.d/lisp/my/belf.el68
1 files changed, 49 insertions, 19 deletions
diff --git a/emacs/.emacs.d/lisp/my/belf.el b/emacs/.emacs.d/lisp/my/belf.el
index 9eef0b8..da18613 100644
--- a/emacs/.emacs.d/lisp/my/belf.el
+++ b/emacs/.emacs.d/lisp/my/belf.el
@@ -32,12 +32,15 @@
(defvar-keymap belf-mode-map
:parent tabulated-list-mode-map
"F" #'belf-toggle-follow-mode
+ "RET" #'belf-open-book
+ "b" #'tabulated-list-previous-column
"d" #'belf-show-in-dired
+ "f" #'tabulated-list-next-column
"i" #'belf-book-infobox-at-point
"n" #'belf-next-line
"o" #'belf-open-book-other-window
"p" #'belf-previous-line
- "RET" #'belf-open-book
+ ;; "s" #'tabulated-list-col-sort
)
(define-derived-mode belf-mode tabulated-list-mode "Bookshelf"
@@ -73,14 +76,21 @@
(when-let ((parsed (belf-parse-file-name f)))
(let-alist parsed
(list f (vector .authors .title .year)))))
- (directory-files belf-dir t "\\.\\(epub\\|pdf\\|mobi\\|cbr\\|djvu\\)$"))))
+ (directory-files belf-dir t "\\.\\(epub\\|pdf\\|cbr\\|djvu\\)$"))))
(defun belf-parse-file-name (file-name)
(let ((base (file-name-base file-name)))
- (when (string-match "^\\(.*?\\) - \\(.*\\) (\\([0-9]*\\))" base)
+ (when (string-match "^\\(.*?\\) - \\(.*\\) (\\([0-9]*\\)) \\[\\(.*\\)\\]$" base)
`((authors . ,(match-string 1 base))
(title . ,(match-string 2 base))
- (year . ,(match-string 3 base))))))
+ (year . ,(match-string 3 base))
+ (identifier . ,(match-string 4 base))))))
+
+(defun belf-format-base-name (info)
+ (let-alist info
+ (file-name-concat
+ belf-dir
+ (format "%s - %s (%s) [%s]" .authors .title .year .identifier))))
(defun belf-book-infobox (file-name)
(interactive)
@@ -95,7 +105,7 @@
(let ((start (point)))
(call-process-region
nil nil "jq" nil t nil
- ".[0]|pick(.Title, .Author, .Creator, .Keywords, .Subject, .Publisher, .Identifier, .Series, .Title_sort, .Author_sort, .PageCount, .ISBN, .Language, .FileType, .Description)")
+ ".[0]|pick(.Title, .Author, .Creator, .Keywords, .Subject, .Publisher, .Identifier, .Series, .Title_sort, .Author_sort, .PageCount, .FileSize, .ISBN, .Language, .FileType, .Description)")
(goto-char start)
(json-read)))
)
@@ -183,20 +193,40 @@ Then for PDF, extract the first page.
For EPUB, looks for a cover image in the file."
(if-let ((cover-file-name (belf-locate-book-cover file-name)))
(concat "file://" cover-file-name)
- (when (equal "epub" (file-name-extension file-name))
- (when-let* ((content-file-name (belf-epub-content-file-name file-name))
- (cover-file
- (belf-epub-cover-file-name file-name content-file-name))
- (cover-file-name (file-name-with-extension
- file-name
- (file-name-extension cover-file))))
- (call-process "unzip" nil `(:file ,cover-file-name) nil
- "-p" file-name cover-file)
- (format "file://%s" cover-file-name)))
- (when (equal "pdf" (file-name-extension file-name))
- (when (setq cover-file-name (belf-pdf-page-one-cover file-name))
- (format "file://%s" cover-file-name))))
- )
+ (cond ((equal "epub" (file-name-extension file-name))
+ (when-let* ((content-file-name (belf-epub-content-file-name file-name))
+ (cover-file
+ (belf-epub-cover-file-name file-name content-file-name))
+ (cover-file-name (file-name-with-extension
+ file-name
+ (file-name-extension cover-file))))
+ (call-process "unzip" nil `(:file ,cover-file-name) nil
+ "-p" file-name cover-file)
+ (format "file://%s" cover-file-name)))
+ ((equal "pdf" (file-name-extension file-name))
+ (when (setq cover-file-name (belf-pdf-page-one-cover file-name))
+ (format "file://%s" cover-file-name))))))
+
+(defun belf-set-authors (new-authors)
+ (interactive
+ (list
+ (read-string "Set author to: "
+ (alist-get 'authors (belf-parse-file-name
+ (tabulated-list-get-id))))))
+ (let* ((file-name (tabulated-list-get-id))
+ (parsed (belf-parse-file-name file-name))
+ new-base-name
+ new-file)
+ (setf (alist-get 'authors parsed) new-authors)
+ (setq new-base-name (belf-format-base-name parsed))
+ (dolist (file (directory-files belf-dir t
+ (format "^%s\\.[a-zA-Z0-9]+$"
+ (regexp-quote
+ (file-name-base file-name)))))
+ (setq new-file (format "%s.%s" new-base-name (file-name-extension file)))
+ (message "%s -> %s" file new-file)
+ (rename-file file new-file))
+ (revert-buffer)))
(defun belf-book-infobox-at-point ()
(interactive)