aboutsummaryrefslogtreecommitdiff
path: root/emacs
diff options
context:
space:
mode:
authorYuchen Pei <id@ypei.org>2025-02-10 09:51:26 +1100
committerYuchen Pei <id@ypei.org>2025-02-10 09:51:26 +1100
commitb1bf873a65c277cf2b21f6bdb0d50fa739613d03 (patch)
tree29d5ea9f780b04158405bedb862b48a18132cfe7 /emacs
parent74fa0df00b35ee09cc1b989c4bfc4c2d56a2a49f (diff)
[emacs] belf set author
Diffstat (limited to 'emacs')
-rw-r--r--emacs/.emacs.d/lisp/my/belf.el68
-rw-r--r--emacs/.emacs.d/lisp/my/my-dired.el21
-rw-r--r--emacs/.emacs.d/lisp/my/my-libgen.el13
3 files changed, 75 insertions, 27 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)
diff --git a/emacs/.emacs.d/lisp/my/my-dired.el b/emacs/.emacs.d/lisp/my/my-dired.el
index 83607ab..2fdbfa9 100644
--- a/emacs/.emacs.d/lisp/my/my-dired.el
+++ b/emacs/.emacs.d/lisp/my/my-dired.el
@@ -109,15 +109,24 @@ With a prefix arg, toggle `my-dired-reverse-sorting' instead."
"Empty the xdg trash"
(interactive)
(let* ((xdg-data-dir
- (directory-file-name
- (expand-file-name "Trash"
- (or (getenv "XDG_DATA_HOME")
- "~/.local/share"))))
- (trash-files-dir (expand-file-name "files" xdg-data-dir))
- (trash-info-dir (expand-file-name "info" xdg-data-dir)))
+ (directory-file-name
+ (expand-file-name "Trash"
+ (or (getenv "XDG_DATA_HOME")
+ "~/.local/share"))))
+ (trash-files-dir (expand-file-name "files" xdg-data-dir))
+ (trash-info-dir (expand-file-name "info" xdg-data-dir)))
(delete-directory trash-files-dir t)
(delete-directory trash-info-dir t)))
+(defun my-dired-jump-xdg-trash ()
+ "Open the xdg trash dir in dired."
+ (interactive)
+ (dired
+ (directory-file-name
+ (expand-file-name "Trash"
+ (or (getenv "XDG_DATA_HOME")
+ "~/.local/share")))))
+
(defun my-dired-do-delete (delete-fun &optional arg)
"Wrapper of `dired-do-delete'.
diff --git a/emacs/.emacs.d/lisp/my/my-libgen.el b/emacs/.emacs.d/lisp/my/my-libgen.el
index 67e0071..f3d6073 100644
--- a/emacs/.emacs.d/lisp/my/my-libgen.el
+++ b/emacs/.emacs.d/lisp/my/my-libgen.el
@@ -160,7 +160,15 @@
id-head
(downcase (alist-get 'md5 info)))))
-(defun my-libgen-download-action ()
+(defun my-libgen-download-library-action ()
+ (interactive)
+ (let ((info (get-text-property (point) 'button-data)))
+ (my-wget-async
+ (my-libgen-make-download-link-library info)
+ (format "%s/%s" (expand-file-name my-libgen-download-dir)
+ (my-libgen-format-filename info)))))
+
+(defun my-libgen-download-onion-action ()
(interactive)
(let ((info (get-text-property (point) 'button-data)))
(my-wget-async
@@ -171,7 +179,8 @@
(defvar my-libgen-button-keymap
(let ((kmap (make-sparse-keymap)))
(set-keymap-parent kmap button-map)
- (define-key kmap "d" 'my-libgen-download-action)
+ (define-key kmap "d" 'my-libgen-download-library-action)
+ (define-key kmap "t" 'my-libgen-download-onion-action)
(define-key kmap "p" 'my-libgen-show-more-info)
kmap))