diff options
author | Yuchen Pei <id@ypei.org> | 2025-02-10 09:51:26 +1100 |
---|---|---|
committer | Yuchen Pei <id@ypei.org> | 2025-02-10 09:51:26 +1100 |
commit | b1bf873a65c277cf2b21f6bdb0d50fa739613d03 (patch) | |
tree | 29d5ea9f780b04158405bedb862b48a18132cfe7 /emacs/.emacs.d/lisp/my/belf.el | |
parent | 74fa0df00b35ee09cc1b989c4bfc4c2d56a2a49f (diff) |
[emacs] belf set author
Diffstat (limited to 'emacs/.emacs.d/lisp/my/belf.el')
-rw-r--r-- | emacs/.emacs.d/lisp/my/belf.el | 68 |
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) |