aboutsummaryrefslogtreecommitdiff
path: root/lisp/emms-playlist-limit.el
diff options
context:
space:
mode:
authorFran Burstall <feb@maths.bath.ac.uk>2018-10-05 23:53:58 +0100
committerFran Burstall <feb@maths.bath.ac.uk>2018-10-05 23:53:58 +0100
commit23ea5748244c8f2794e2d90a7ed564e2a326ec5a (patch)
tree3e790ab9001695b5ccf7b2fbc228eafdca410113 /lisp/emms-playlist-limit.el
parent8d35c26cd6f5cfd4ec97ee5bc274e931809f4094 (diff)
* lisp/emms-playlist-limit.el: limit by track description
Diffstat (limited to 'lisp/emms-playlist-limit.el')
-rw-r--r--lisp/emms-playlist-limit.el56
1 files changed, 36 insertions, 20 deletions
diff --git a/lisp/emms-playlist-limit.el b/lisp/emms-playlist-limit.el
index 5f0cb28..9fcc74b 100644
--- a/lisp/emms-playlist-limit.el
+++ b/lisp/emms-playlist-limit.el
@@ -45,6 +45,7 @@
;; / a emms-playlist-limit-to-info-artist
;; / b emms-playlist-limit-to-info-album
;; / c emms-playlist-limit-to-info-composer
+;; / d emms-playlist-limit-to-description
;; / g emms-playlist-limit-to-info-genre
;; / n emms-playlist-limit-to-name
;; / p emms-playlist-limit-to-info-performer
@@ -79,11 +80,11 @@ the current playlist." attribute)
(interactive
(list
(let* ((curr
- (or (emms-track-get
+ (or (emms-playlist-limit-track-get
(or (emms-playlist-track-at)
(emms-playlist-track-at (max 1 (1- (point))))) ; at eol
(quote ,attribute))
- (emms-track-get
+ (emms-playlist-limit-track-get
(emms-playlist-selected-track) (quote ,attribute))))
(attr-name ,(emms-replace-regexp-in-string
"info-" "" (symbol-name attribute)))
@@ -92,11 +93,11 @@ the current playlist." attribute)
(format "Limit to %s (regexp): " attr-name))))
(read-string fmt))))
(when (string= regexp "")
- (setq regexp (or (emms-track-get
+ (setq regexp (or (emms-playlist-limit-track-get
(or (emms-playlist-track-at)
(emms-playlist-track-at (max 1 (1- (point))))) ; at eol
(quote ,attribute))
- (emms-track-get
+ (emms-playlist-limit-track-get
(emms-playlist-selected-track) (quote ,attribute)))))
(if regexp
(emms-playlist-limit-do (quote ,attribute) regexp)
@@ -110,6 +111,7 @@ the current playlist." attribute)
(define-emms-playlist-limit info-year)
(define-emms-playlist-limit info-genre)
(define-emms-playlist-limit name)
+(define-emms-playlist-limit description)
(defvar-local emms-playlist-limit--original-playlist nil
"Playlist buffer from which we derive the limited playlist.")
@@ -137,6 +139,7 @@ If this playlist is current, make the playlist we switch to current."
(define-key emms-playlist-mode-map (kbd "/ b") 'emms-playlist-limit-to-info-album)
(define-key emms-playlist-mode-map (kbd "/ y") 'emms-playlist-limit-to-info-year)
(define-key emms-playlist-mode-map (kbd "/ g") 'emms-playlist-limit-to-info-genre)
+(define-key emms-playlist-mode-map (kbd "/ d") 'emms-playlist-limit-to-description)
(define-key emms-playlist-mode-map (kbd "/ /") 'emms-playlist-limit-to-all)
@@ -145,9 +148,12 @@ If this playlist is current, make the playlist we switch to current."
(defun emms-playlist-limit-track-get (track type)
"Return the value of TYPE from TRACK.
-This is a wrapper around `emms-track-get' that also tries
-'info-originalyear, 'info-originaldate and 'info-date to get a
-usable date when TYPE is 'info-year."
+Here TYPE is a field available to `emms-track-get' or
+'description which gives the result of
+`emms-track-description-function'.
+
+When type is 'info-year, also tries 'info-originalyear,
+ 'info-originaldate and 'info-date to get a usable date."
(cond ((eq type 'info-year)
(let ((date (or (emms-track-get track 'info-originaldate)
(emms-track-get track 'info-originalyear)
@@ -155,26 +161,34 @@ usable date when TYPE is 'info-year."
(emms-track-get track 'info-year))))
(or (emms-format-date-to-year date)
"<unknown year>")))
+ ((eq type 'description) (funcall emms-track-description-function track))
(t (emms-track-get track type))))
-(defun emms-playlist-limit--limit-playlist (playlist type regexp)
- "Return new playlist containing the tracks of PLAYLIST with TYPE matching REGEXP."
- (let* ((bufname (concat (buffer-name playlist)
- (format "/%s=%s"
- (emms-replace-regexp-in-string "info-" "" (symbol-name type)) regexp)))
- (tracks (nreverse (with-current-buffer playlist
+(defun emms-playlist-limit--derive-playlist (playlist pred name)
+ "Return a new playlist NAME of tracks in PLAYLIST for which (PRED track)
+is non-nil."
+ (let* ((tracks (nreverse (with-current-buffer playlist
(save-excursion (emms-playlist-tracks-in-region (point-min) (point-max))))))
- (filtered-tracks (seq-filter
- (lambda (track) (let ((field (emms-playlist-limit-track-get track type)))
- (and field (string-match regexp field))))
- tracks))
- (new-playlist (or (get-buffer bufname)
- (emms-playlist-new bufname))))
+ (filtered-tracks (seq-filter pred tracks))
+ (new-playlist (or (get-buffer name)
+ (emms-playlist-new name))))
(with-current-buffer new-playlist
(emms-with-inhibit-read-only-t (erase-buffer))
(mapc #'emms-playlist-insert-track filtered-tracks))
new-playlist))
+(defun emms-playlist-limit--limit-playlist (playlist type regexp)
+ "Return a new playlist of tracks in PLAYLIST with TYPE matching REGEXP."
+ (let* ((bufname (concat (buffer-name playlist)
+ (format "/%s=%s"
+ (emms-replace-regexp-in-string "info-" "" (symbol-name type)) regexp))))
+ (emms-playlist-limit--derive-playlist
+ playlist
+ `(lambda (track) (let ((field (emms-playlist-limit-track-get track (quote ,type))))
+ (and field (string-match ,regexp field))))
+ bufname)))
+
+
(defun emms-playlist-limit-do (type regexp)
"Switch to a derived playlist containing the tracks with TYPE matching REGEXP.
@@ -194,7 +208,9 @@ See `emms-info-mp3find-arguments' for possible options for TYPE."
(kill-buffer))
(let ((pos (when curr (text-property-any (point-min) (point-max)
'emms-track curr))))
- (emms-playlist-select (or pos 1)))
+ (if pos
+ (emms-playlist-select pos)
+ (emms-playlist-select-first)))
(emms-playlist-mode-center-current)
(setq emms-playlist-limit--original-playlist old-buf)
(when old-buf-is-current-playlist