Daniel Borchmann
dd27018420
The `db-music' package is supposed to be an abstract interface to music functionality, and should thus define the main hydra for this. Moreover, the hydra should not contain „emms“ in it's name, although it's using only EMMS functions. It's not clear whether EMMS will every be replaced by some other backend, but it's nicer to have a (more or less) clear separation between user frontend and implementation backend.
100 lines
3.8 KiB
EmacsLisp
100 lines
3.8 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)
|
||
|
||
|
||
;; 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"))))
|
||
|
||
(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»"))
|
||
|
||
|
||
;; End
|
||
|
||
(provide 'db-emms)
|
||
|
||
;;; db-emms ends here
|