:selected (alist-get 'xfade mpc-status)]
"--"
["Add new browser" mpc-tagbrowser]
+ ["Server Stats" mpc-server-stats]
["Update DB" mpc-update]
["Quit" mpc-quit]))
;;; Song Viewer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defface mpc-song-viewer-value
+(defface mpc-table-value
'((t (:inherit vtable)))
- "Face for tag values in the MPC song viewer.")
+ "Face for values in MPC tables.")
-(defface mpc-song-viewer-tag
- '((t (:inherit (mpc-song-viewer-value bold))))
- "Face for tag types in the MPC song viewer.")
+(defface mpc-table-key
+ '((t (:inherit (mpc-table-value bold))))
+ "Face for keys in MPC tables.")
-(defface mpc-song-viewer-empty
- '((t (:inherit (mpc-song-viewer-value italic shadow))))
- "Face for empty tag values in the MPC song viewer.")
+(defface mpc-table-empty
+ '((t (:inherit (mpc-table-value italic shadow))))
+ "Face for empty values in MPC tables.")
(defcustom mpc-song-viewer-tags
'("Title" "Artist" "Album" "Performer" "Composer"
:min-width 3
:displayer
(lambda (tag &rest _)
- (propertize tag 'face 'mpc-song-viewer-tag)))
+ (propertize tag 'face 'mpc-table-key)))
( :name "Value"
:align left
:min-width 5
:displayer
(lambda (value &rest _)
(if (and value (not (string-blank-p value)))
- (propertize value 'face 'mpc-song-viewer-value)
- (propertize "empty" 'face 'mpc-song-viewer-empty)))))
+ (propertize value 'face 'mpc-table-value)
+ (propertize "empty" 'face 'mpc-table-empty)))))
:objects (mapcar
(lambda (tag)
(pcase tag
display-buffer-same-window)
(reusable-frames . t))))))
+;;; Stats viewer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar mpc--server-stats-date "%c"
+ "Format used for dates in `mpc-server-stats'.
+See `format-time-string' for formatting details.")
+
+(defvar mpc--server-stats-duration "%Y, %D, %z%h:%.2m:%.2s"
+ "Format used for durations in `mpc-server-stats'.
+See `format-seconds' for formatting details.")
+
+(defun mpc--server-stats-date (seconds)
+ "Format SECONDS as a date for display by `mpc-server-stats'."
+ (format-time-string mpc--server-stats-date (string-to-number seconds)))
+
+(defun mpc--server-stats-duration (seconds)
+ "Format SECONDS as a duration for display by `mpc-server-stats'."
+ (format-seconds mpc--server-stats-duration (string-to-number seconds)))
+
+(defun mpc--server-stats-format (stat)
+ "Format STAT data for display by `mpc-server-stats'."
+ (let ((key (seq-reduce (lambda (string from-to)
+ (string-replace (car from-to) (cdr from-to) string))
+ '(("Db_" . "DB_") ("_" . " "))
+ (capitalize (symbol-name (car stat)))))
+ (val (cdr stat)))
+ (list key (cond
+ ((string-match-p "time\\'" key) (mpc--server-stats-duration val))
+ ((string-match-p "date\\'" key) (mpc--server-stats-date val))
+ (t val)))))
+
+(defun mpc-server-stats ()
+ "Display stats about the connected MPD server."
+ (interactive)
+ (let ((buffer "*MPC Stats Viewer*"))
+ (with-current-buffer (get-buffer-create buffer)
+ (special-mode)
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (make-vtable
+ :columns '((:name "Server Stats" :align right :min-width 10) "")
+ :formatter (lambda (value column &rest _)
+ (propertize value 'face (if (= column 0)
+ 'mpc-table-key
+ 'mpc-table-value)))
+ :objects (mapcar #'mpc--server-stats-format
+ (mpc-proc-cmd-to-alist (list "stats")))))
+ (pop-to-buffer buffer '((display-buffer-reuse-window)
+ (reusable-frames . t)
+ (window-height . 10))))))
+
;;; Toplevel ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defcustom mpc-frame-alist '((name . "MPC") (tool-bar-lines . 1)