From b1bf873a65c277cf2b21f6bdb0d50fa739613d03 Mon Sep 17 00:00:00 2001
From: Yuchen Pei <id@ypei.org>
Date: Mon, 10 Feb 2025 09:51:26 +1100
Subject: [emacs] belf set author

---
 emacs/.emacs.d/lisp/my/belf.el      | 68 ++++++++++++++++++++++++++-----------
 emacs/.emacs.d/lisp/my/my-dired.el  | 21 ++++++++----
 emacs/.emacs.d/lisp/my/my-libgen.el | 13 +++++--
 3 files changed, 75 insertions(+), 27 deletions(-)

(limited to 'emacs/.emacs.d/lisp/my')

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))
 
-- 
cgit v1.2.3