.emacs.d/site-lisp/db-emms.el

145 lines
5.5 KiB
EmacsLisp
Raw Normal View History

;;; db-emms.el -- EMMS configuration -*- lexical-binding: t -*-
;;; Commentary:
;;; Code:
2017-08-06 13:03:43 +02:00
(declare-function emms-shuffle "emms")
(declare-function emms-mode-line "emms-mode-line")
(declare-function emms-playlist-new "emms")
(declare-function emms-stop "emms")
(declare-function emms-playlist-set-playlist-buffer "emms")
(declare-function emms-playlist-current-clear "emms")
(declare-function emms-playlist-current-insert-source "emms")
(declare-function emms-playlist-select-first "emms")
(declare-function emms-start "emms")
(declare-function emms-track-get "emms")
(declare-function emms-track-simple-description "emms")
(declare-function emms-playlist-ensure-playlist-buffer "emms")
(declare-function emms-propertize "emms-compat")
(declare-function emms-track-force-description "emms")
(declare-function emms-playlist-selected-track-at-p "emms")
(declare-function emms-playlist-mode-overlay-selected "emms-playlist-mode")
(declare-function emms-track-description "emms")
(declare-function emms-playlist-current-selected-track "emms")
(declare-function emms-next "emms")
(declare-function emms-previous "emms")
(declare-function emms-pause "emms")
(declare-function emms-show "emms")
(declare-function emms "emms-playlist-mode")
2018-01-27 17:28:20 +01:00
(declare-function emms-cache-save "emms-cache")
(declare-function string-remove-prefix "subr-x")
(declare-function emms-with-inhibit-read-only-t "emms")
2017-08-06 13:03:43 +02:00
;; Custom file finder
(defun db/emms-source-file-directory-tree-find (dir regex)
"Return a list of all files under DIR that match REGEX.
2017-08-06 13:03:43 +02:00
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)
2017-08-06 13:03:43 +02:00
"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"))))
2017-08-06 13:03:43 +02:00
;; Hydra
(defun db/emms-track-status ()
2017-08-06 13:03:43 +02:00
"Return string displaying status of currently played track."
(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" (lambda ()
(interactive)
(require 'db-music)
(call-interactively db/playlist-play-function))
"Play automatically generated playlist"))
;; End
(provide 'db-emms)
;;; db-emms ends here