124 lines
4.3 KiB
EmacsLisp
124 lines
4.3 KiB
EmacsLisp
;;; db-emms.el -- EMMS configuration -*- lexical-binding: t -*-
|
||
|
||
;;; Commentary:
|
||
|
||
;;; Code:
|
||
|
||
(require 'subr-x)
|
||
(require 'seq)
|
||
(require 'emms)
|
||
(require 'emms-source-file)
|
||
(require 'emms-playlist-mode)
|
||
(require 'emms-volume)
|
||
(require 'hydra)
|
||
|
||
|
||
;; Custom file finder
|
||
|
||
(defun db/emms-source-file-directory-tree-find (dir regex)
|
||
"Return a list of all files under DIR that match REGEX.
|
||
This function uses the external find utility. The name for GNU
|
||
find may be supplied using `emms-source-file-gnu-find'.
|
||
|
||
Difference to original `emms-source-file-directory-tree-find’ is
|
||
that we also follow symbolic links."
|
||
(with-temp-buffer
|
||
(call-process emms-source-file-gnu-find
|
||
nil t nil
|
||
"-L"
|
||
(expand-file-name dir)
|
||
"-type" "f"
|
||
"-iregex" (concat ".*\\(" regex "\\).*"))
|
||
(delete ""
|
||
(split-string (buffer-substring (point-min)
|
||
(point-max))
|
||
"\n"))))
|
||
|
||
|
||
;; Track description
|
||
|
||
(defun db/emms-track-description (track)
|
||
"Return custom description of TRACK.
|
||
This function can be used as a value for `emms-track-description-function’."
|
||
(require 'seq)
|
||
(let* ((artist (propertize (emms-track-get track 'info-artist "")
|
||
'face 'emms-browser-artist-face))
|
||
(composer (propertize (emms-track-get track 'info-composer "")
|
||
'face 'emms-browser-composer-face))
|
||
(performer (propertize (emms-track-get track 'info-performer "")
|
||
'face 'emms-browser-performer-face))
|
||
(title (propertize (emms-track-get track 'info-title "")
|
||
'face 'emms-browser-track-face))
|
||
(album (propertize (emms-track-get track 'info-album "")
|
||
'face 'emms-browser-album-face)))
|
||
(if (not (seq-empty-p title))
|
||
(concat (format "“%s”" title)
|
||
(let* ((first-entry (cond ((not (seq-empty-p composer))
|
||
composer)
|
||
((not (seq-empty-p artist))
|
||
artist)))
|
||
(second-entry (when (and (not (seq-empty-p performer))
|
||
(not (string= performer first-entry)))
|
||
performer)))
|
||
(when first-entry
|
||
(if second-entry
|
||
(format " by %s, performed by %s" first-entry second-entry)
|
||
(format " by %s" first-entry))))
|
||
(and (not (seq-empty-p album))
|
||
(format " (%s)" album)))
|
||
(string-remove-prefix (expand-file-name emms-source-file-default-directory)
|
||
(emms-track-simple-description track)))))
|
||
|
||
;; don't set face in playlist to emms-playlist-track-face
|
||
(defun db/emms-playlist-mode-insert-track (track &optional no-newline)
|
||
"Insert the description of TRACK at point.
|
||
When NO-NEWLINE is non-nil, do not insert a newline after the track."
|
||
(emms-playlist-ensure-playlist-buffer)
|
||
(emms-with-inhibit-read-only-t
|
||
(insert (emms-propertize (emms-track-force-description track)
|
||
'emms-track track
|
||
;'face 'emms-playlist-track-face
|
||
))
|
||
(when (emms-playlist-selected-track-at-p)
|
||
(emms-playlist-mode-overlay-selected))
|
||
(unless no-newline
|
||
(insert "\n"))))
|
||
|
||
|
||
;; Hydra
|
||
|
||
(defun db/emms-track-status ()
|
||
"Return string displaying status of currently played track."
|
||
(require 'emms)
|
||
(if emms-player-playing-p
|
||
(format "%s" (emms-track-description
|
||
(emms-playlist-current-selected-track)))
|
||
"«nothing»"))
|
||
|
||
(defhydra emms-control (:color red :hint none)
|
||
"
|
||
Playing: %s(db/emms-track-status)
|
||
|
||
_n_: ?n? _p_: ?p?
|
||
_RET_: ?RET? _M_: ?M?
|
||
_-_: lower volume _+_: ?+?
|
||
_P_: ?P?
|
||
|
||
"
|
||
("n" emms-next "next")
|
||
("p" emms-previous "previous")
|
||
("RET" emms-pause "play/pause")
|
||
("s" emms-show "show title")
|
||
("-" emms-volume-lower "lower volume")
|
||
("+" emms-volume-raise "raise volume")
|
||
("M" emms "show playlist")
|
||
("P" (db/play-auto-playlist)
|
||
"Play automatically generated playlist"))
|
||
|
||
|
||
;; End
|
||
|
||
(provide 'db-emms)
|
||
|
||
;;; db-emms ends here
|