branch: elpa/dirvish
commit 79d73c07772088e777f1d99deffee2992c3a261b
Author: Alex Lu <[email protected]>
Commit: Alex Lu <[email protected]>
feat: centralize extrnal deps | remove ffmpegthumbnailer hack
Closes #196
---
dirvish-widgets.el | 104 ++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 75 insertions(+), 29 deletions(-)
diff --git a/dirvish-widgets.el b/dirvish-widgets.el
index b6cc564424..fc65f27819 100644
--- a/dirvish-widgets.el
+++ b/dirvish-widgets.el
@@ -20,8 +20,8 @@
;; `file-user', `file-group', `file-time', `file-size', `file-modes',
;; `file-inode-number', `file-device-number'
;;
-;; Preview dispatchers (all enabled by default):
-;; `image', `gif', `video', `epub', `archive', `pdf'
+;; Preview dispatchers:
+;; `audio' `image', `gif', `video', `video-mtn', `epub', `archive', `pdf',
`pdf-preface'
;;; Code:
@@ -40,6 +40,56 @@ The value is a list with 3 elements:
- icon for path separators [/]"
:group 'dirvish :type '(repeat (string :tag "path separator")))
+(defcustom dirvish-magick-program "magick"
+ "Absolute or reletive name of the `magick' program.
+This is used to generate image thumbnails."
+ :group 'dirvish :type 'string)
+
+(defcustom dirvish-ffmpegthumbnailer-program "ffmpegthumbnailer"
+ "Absolute or reletive name of the `ffmpegthumbnailer' program.
+This is used to generate video thumbnails on macOS/Linux."
+ :group 'dirvish :type 'string)
+
+(defcustom dirvish-mtn-program "mtn"
+ "Absolute or reletive name of the `mtn' program.
+This is used to generate video thumbnails on Windows."
+ :group 'dirvish :type 'string)
+
+(defcustom dirvish-epub-thumbnailer-program "epub-thumbnailer"
+ "Absolute or reletive name of the `epub-thumbnailer' program.
+This is used to generate thumbnail for epub files."
+ :group 'dirvish :type 'string)
+
+(defcustom dirvish-mediainfo-program "mediainfo"
+ "Absolute or reletive name of the `mediainfo' program.
+This is used to retrieve metadata for multiple types of media files."
+ :group 'dirvish :type 'string)
+
+(defcustom dirvish-pdfinfo-program "pdfinfo"
+ "Absolute or reletive name of the `pdfinfo' program.
+This is used to retrieve pdf metadata."
+ :group 'dirvish :type 'string)
+
+(defcustom dirvish-pdftoppm-program "pdftoppm"
+ "Absolute or reletive name of the `pdftoppm' program.
+This is used to generate thumbnails for pdf files."
+ :group 'dirvish :type 'string)
+
+(defcustom dirvish-zipinfo-program "zipinfo"
+ "Absolute or reletive name of the `zipinfo' program.
+This is used to list files and their attributes for .zip archives."
+ :group 'dirvish :type 'string)
+
+(defcustom dirvish-tar-program "tar"
+ "Absolute or reletive name of the `tar' program.
+This is used to list files and their attributes for .tar, .gz etc. archives."
+ :group 'dirvish :type 'string)
+
+(defcustom dirvish-show-media-properties
+ (and (executable-find dirvish-mediainfo-program) t)
+ "Show media properties automatically in preview window."
+ :group 'dirvish :type 'boolean)
+
(defvar dirvish-media--cache-pool '())
(defvar dirvish-media--auto-cache-timer nil)
(defcustom dirvish-media-auto-cache-threshold '(500 . 4)
@@ -60,13 +110,6 @@ variable is nil, the auto caching is disabled."
(setq dirvish-media--auto-cache-timer
(run-with-timer 0 0.25 #'dirvish-media--autocache)))))
-(defcustom dirvish-show-media-properties
- (and (executable-find "mediainfo") t)
- "Show media properties automatically in preview window."
- :group 'dirvish :type 'boolean)
-
-(defconst dirvish-media--embedded-video-thumb
- (string-match "prefer embedded image" (shell-command-to-string
"ffmpegthumbnailer -h")))
(defconst dirvish-media--img-max-width 2400)
(defconst dirvish-media--img-scale-h 0.75)
(defconst dirvish-media--img-scale-w 0.92)
@@ -247,14 +290,15 @@ GROUP-TITLES is a list of group titles."
(defun dirvish-media--metadata-from-mediainfo (file)
"Return result string from command `mediainfo' for FILE."
(read (format "(%s)" (shell-command-to-string
- (format "mediainfo --Output='%s' %s"
+ (format "%s --Output='%s' %s"
+ dirvish-mediainfo-program
dirvish-media--info
(shell-quote-argument file))))))
(defun dirvish-media--metadata-from-pdfinfo (file)
"Return result string from command `pdfinfo' for FILE."
(cl-loop with out = (shell-command-to-string
- (format "pdfinfo %s" (shell-quote-argument file)))
+ (format "%s %s" dirvish-pdfinfo-program
(shell-quote-argument file)))
with lines = (remove "" (split-string out "\n"))
for line in lines
for (title content) = (split-string line ":\s+")
@@ -556,23 +600,26 @@ GROUP-TITLES is a list of group titles."
(dirvish-define-preview audio (file ext)
"Preview audio files by printing its metadata.
Require: `mediainfo' (executable)"
- :require ("mediainfo")
- (when (member ext dirvish-audio-exts) `(shell . ("mediainfo" ,file))))
+ :require (dirvish-mediainfo-program)
+ (when (member ext dirvish-audio-exts)
+ `(shell . (,dirvish-mediainfo-program ,file))))
(dirvish-define-preview image (file ext preview-window)
"Preview image files.
Require: `magick' (executable from `imagemagick' suite)"
- :require ("magick")
+ :require (dirvish-magick-program)
(when (member ext dirvish-image-exts)
(let* ((w (dirvish-media--img-size preview-window))
(h (dirvish-media--img-size preview-window 'height))
- (cache (dirvish-media--cache-path file (format "images/%s" w)
".jpg")))
+ (cache (dirvish-media--cache-path
+ file (format "images/%s" w) ".jpg")))
(cond ((file-exists-p cache)
`(img . ,(create-image cache nil nil :max-width w :max-height h)))
((and (< (file-attribute-size (file-attributes file)) 250000)
(member ext '("jpg" "jpeg" "png" "ico" "icns" "bmp" "svg")))
`(img . ,(create-image file nil nil :max-width w :max-height h)))
- (t `(cache . ("magick" ,file "-define" "jpeg:extent=300kb"
"-resize"
+ (t `(cache . (,dirvish-magick-program
+ ,file "-define" "jpeg:extent=300kb" "-resize"
,(number-to-string w) ,cache)))))))
(dirvish-define-preview gif (file ext)
@@ -588,21 +635,20 @@ Require: `magick' (executable from `imagemagick' suite)"
(dirvish-define-preview video (file ext preview-window)
"Preview video files.
Require: `ffmpegthumbnailer' (executable)"
- :require ("ffmpegthumbnailer")
+ :require (dirvish-ffmpegthumbnailer-program)
(when (member ext dirvish-video-exts)
(let* ((width (dirvish-media--img-size preview-window))
(height (dirvish-media--img-size preview-window 'height))
(cache (dirvish-media--cache-path file (format "images/%s" width)
".jpg")))
(if (file-exists-p cache)
`(img . ,(create-image cache nil nil :max-width width :max-height
height))
- `(cache . ("ffmpegthumbnailer" "-i" ,file "-o" ,cache "-s"
- ,(number-to-string width)
- ,(if dirvish-media--embedded-video-thumb "-m"
"")))))))
+ `(cache . (,dirvish-ffmpegthumbnailer-program "-i" ,file "-o" ,cache
"-s"
+ ,(number-to-string width) "-m"))))))
(dirvish-define-preview video-mtn (file ext preview-window)
"Preview video files on MS-Windows.
Require: `mtn' (executable)"
- :require ("mtn")
+ :require (dirvish-mtn-program)
(when (member ext dirvish-video-exts)
(let* ((width (dirvish-media--img-size preview-window))
(height (dirvish-media--img-size preview-window 'height))
@@ -610,21 +656,21 @@ Require: `mtn' (executable)"
(path (dirvish--get-parent-path cache)))
(if (file-exists-p cache)
`(img . ,(create-image cache nil nil :max-width width :max-height
height))
- `(cache . ("mtn" "-P" "-i" "-c" "1" "-r" "1" "-O" ,path ,file "-o"
+ `(cache . (,dirvish-mtn-program "-P" "-i" "-c" "1" "-r" "1" "-O" ,path
,file "-o"
,(format ".%s.jpg" ext) "-w"
,(number-to-string width)))))))
(dirvish-define-preview epub (file preview-window)
"Preview epub files.
Require: `epub-thumbnailer' (executable)"
- :require ("epub-thumbnailer")
+ :require (dirvish-epub-thumbnailer-program)
(when (equal ext "epub")
(let* ((width (dirvish-media--img-size preview-window))
(height (dirvish-media--img-size preview-window 'height))
(cache (dirvish-media--cache-path file (format "images/%s" width)
".jpg")))
(if (file-exists-p cache)
`(img . ,(create-image cache nil nil :max-width width :max-height
height))
- `(cache . ("epub-thumbnailer" ,file ,cache ,(number-to-string
width)))))))
+ `(cache . (,dirvish-epub-thumbnailer-program ,file ,cache
,(number-to-string width)))))))
(dirvish-define-preview pdf (file ext)
"Preview pdf files.
@@ -638,7 +684,7 @@ Require: `pdf-tools' (Emacs package)"
(dirvish-define-preview pdf-preface (file ext preview-window)
"Display the preface image as preview for pdf files."
- :require ("pdftoppm")
+ :require (dirvish-pdftoppm-program)
(when (equal ext "pdf")
(let* ((width (dirvish-media--img-size preview-window))
(height (dirvish-media--img-size preview-window 'height))
@@ -646,19 +692,19 @@ Require: `pdf-tools' (Emacs package)"
(cache-jpg (concat cache ".jpg")))
(if (file-exists-p cache-jpg)
`(img . ,(create-image cache-jpg nil nil :max-width width
:max-height height))
- `(cache . ("pdftoppm" "-jpeg" "-f" "1" "-singlefile" ,file ,cache))))))
+ `(cache . (,dirvish-pdftoppm-program "-jpeg" "-f" "1" "-singlefile"
,file ,cache))))))
(dirvish-define-preview archive (file ext)
"Preview archive files.
Require: `zipinfo' (executable)
Require: `tar' (executable)"
- :require ("zipinfo" "tar")
- (cond ((equal ext "zip") `(shell . ("zipinfo" ,file)))
+ :require (dirvish-zipinfo-program dirvish-tar-program)
+ (cond ((equal ext "zip") `(shell . (,dirvish-zipinfo-program ,file)))
;; Emacs source code files
((string-suffix-p ".el.gz" file)
(dirvish--find-file-temporarily file))
((member ext '("tar" "zst" "bz2" "bz" "gz" "xz" "tgz"))
- `(shell . ("tar" "-tvf" ,file)))))
+ `(shell . (,dirvish-tar-program "-tvf" ,file)))))
(provide 'dirvish-widgets)
;;; dirvish-widgets.el ends here