Why do you only discover bugs _after_ you've committed?
[slh] / mpd.el
diff --git a/mpd.el b/mpd.el
index b695f56..c71cda6 100644 (file)
--- a/mpd.el
+++ b/mpd.el
@@ -80,7 +80,7 @@
 ;; `cover.jpg' files in the same directory as the album's audio files.
 ;; Yep, sort your music by album (at least).
 ;;
-;; Embedded art is not supported at this time, but hopefully one day.
+;; Embedded art is supported via FFmpeg.  The embedded art is preferred.
 
 ;;; Player control buttons:
 ;;
@@ -405,9 +405,21 @@ it first."
 
 The file may not exist on disc so call `file-exists-p' on it, or see
 `mpd-has-cover-p'."
-  (let ((dir (paths-construct-path
-             (list mpd-music-directory (file-dirname (mpd-file))))))
-    (expand-file-name "cover.jpg" dir)))
+  (let ((ifile (expand-file-name (mpd-file) mpd-music-directory))
+       (ofile (expand-file-name "cover.jpg" (temp-directory)))
+       (dir (paths-construct-path
+             (list mpd-music-directory (file-dirname (mpd-file)))))
+       (ffmpeg (executable-find "ffmpeg"))
+       (embedded 1))
+    ;; Try for embedded art first
+    (when ffmpeg
+      (setq embedded (call-process "ffmpeg" nil nil nil
+                                  "-hide_banner"
+                                  "-loglevel" "quiet" "-y"
+                                  "-i" ifile ofile)))
+    (if (eq embedded 0)
+       ofile
+      (expand-file-name "cover.jpg" dir))))
 
 (defun mpd-has-cover-p ()
   "Return t when coverart exists for the current track."
@@ -443,13 +455,14 @@ A string is returned that can be used in the :data key of `make-glyph'."
       (let ((cover (mpd-cover-file))
            (nocover (expand-file-name "nocover.jpg" mpd-directory)))
        (if (mpd-has-cover-p)
-           (set-extent-end-glyph
-            mpd-cover-glyph
-            (make-glyph
-             (list (vector 'jpeg :data (mpd-scale-cover cover 48)))))
+           (progn
+             (setq cover (mpd-scale-cover cover 48))
+             (set-extent-end-glyph
+              mpd-cover-glyph
+              (make-glyph `([jpeg :data ,cover]))))
          (set-extent-end-glyph
           mpd-cover-glyph
-          (make-glyph (list (vector 'jpeg :file nocover)))))))
+          (make-glyph `([jpeg :file ,nocover]))))))
     (setq mpd-current-filename (mpd-file))))
 
 (defun mpd-update-variables ()
@@ -514,10 +527,10 @@ Year: %s  Genre: %s\n
   "Inserts coverart into mpd balloon."
   (let ((cover (mpd-cover-file)))
     (when (mpd-has-cover-p)
+      (setq cover (mpd-scale-cover cover 128))
       (set-extent-begin-glyph
        (make-extent (point-min) (point-min))
-       (make-glyph
-       (list (vector 'jpeg :data (mpd-scale-cover cover 128))))))))
+       (make-glyph `([jpeg :data ,cover]))))))
 
 (defadvice balloon-help-display-help (after mpd-balloon-cover (&rest args) activate)
   "Display cover art image in the balloon."
@@ -565,32 +578,28 @@ Year: %s  Genre: %s\n
          (set-extent-end-glyph
           (setq prev (make-extent (point-max) (point-max)))
           (make-glyph
-           (list (vector 'xpm :file (expand-file-name "Rewind.xpm"
-                                                      mpd-directory)))))
+           `([xpm :file ,(expand-file-name "Rewind.xpm" mpd-directory)])))
          (set-extent-properties 
           prev
           `(keymap ,mpd-prev-map balloon-help "Previous Track"))
          (set-extent-end-glyph
           (setq pause (make-extent (point-max) (point-max)))
           (make-glyph
-           (list (vector 'xpm :file (expand-file-name "Pause.xpm"
-                                                      mpd-directory)))))
+           `([xpm :file ,(expand-file-name "Pause.xpm" mpd-directory)])))
          (set-extent-properties
           pause
           `(keymap ,mpd-pause-map balloon-help "Pause"))
          (set-extent-end-glyph
           (setq play (make-extent (point-max) (point-max)))
           (make-glyph
-           (list (vector 'xpm :file (expand-file-name "Play.xpm"
-                                                      mpd-directory)))))
+           `([xpm :file ,(expand-file-name "Play.xpm" mpd-directory)])))
          (set-extent-properties
           play
           `(keymap ,mpd-play-map balloon-help "Play"))
          (set-extent-end-glyph
           (setq next (make-extent (point-max) (point-max)))
           (make-glyph
-           (list (vector 'xpm :file (expand-file-name "FFwd.xpm"
-                                                      mpd-directory)))))
+           `([xpm :file ,(expand-file-name "FFwd.xpm" mpd-directory)])))
          (set-extent-properties
           next
           `(keymap ,mpd-next-map balloon-help "Next Track"))
@@ -598,8 +607,8 @@ Year: %s  Genre: %s\n
          (set-extent-end-glyph
           (setq mpd-cover-glyph (make-extent (point-max) (point-max)))
           (make-glyph
-           (list (vector 'jpeg :file (expand-file-name "nocover.jpg"
-                                                       mpd-directory)))))
+           `([jpeg :file ,(expand-file-name "nocover.jpg"
+                                           mpd-directory)])))
          (set-extent-properties
           mpd-cover-glyph
           `(keymap ,mpd-pause-map balloon-help ,#'mpd-info)))))