[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/listen 11466911d5 012/103: Mostly queue stuff
From: |
ELPA Syncer |
Subject: |
[elpa] externals/listen 11466911d5 012/103: Mostly queue stuff |
Date: |
Mon, 26 Feb 2024 12:59:02 -0500 (EST) |
branch: externals/listen
commit 11466911d58c6e25644baab671ee15955ff4d2a3
Author: Adam Porter <adam@alphapapa.net>
Commit: Adam Porter <adam@alphapapa.net>
Mostly queue stuff
---
listen-lib.el | 4 +--
listen-queue.el | 106 +++++++++++++++++++++++++++++++++++++++++++++++++-------
listen-vlc.el | 2 +-
listen.el | 7 ++++
4 files changed, 104 insertions(+), 15 deletions(-)
diff --git a/listen-lib.el b/listen-lib.el
index 961ad9b136..07c2abe77e 100644
--- a/listen-lib.el
+++ b/listen-lib.el
@@ -31,10 +31,10 @@
process command args)
(cl-defstruct listen-queue
- tracks (track-number 0) etc)
+ name tracks current etc)
(cl-defstruct listen-track
- filename artist title genre length rating etc)
+ filename artist title album number genre length date rating etc)
;;;; Variables
diff --git a/listen-queue.el b/listen-queue.el
index e6eb60ec5b..598146e4f6 100644
--- a/listen-queue.el
+++ b/listen-queue.el
@@ -29,25 +29,107 @@
(defvar listen-queues nil)
+(defgroup listen-queue nil
+ "Queues."
+ :group 'listen)
+
+(defcustom listen-queue-time-format "%Y-%m-%d %H:%M:%S"
+ "Time format for `listen-queue' buffer."
+ :type 'string)
+
+(defmacro listen-queue-command (command)
+ "Expand to a lambda that applies its args to COMMAND and reverts the list
buffer."
+ `(lambda (&rest args)
+ (let ((list-buffer (current-buffer)))
+ (apply #',command queue args)
+ (with-current-buffer list-buffer
+ (vtable-revert)))))
+
;;;###autoload
-(defun listen-queue ()
- "Show listen queue."
- (interactive)
- (with-current-buffer (get-buffer-create "*Listen: Queue*")
+(defun listen-queue (queue)
+ "Show listen QUEUE."
+ (interactive (list (listen-queue-complete)))
+ (with-current-buffer (get-buffer-create (format "*Listen Queue: %s*"
(listen-queue-name queue)))
(let ((inhibit-read-only t))
(read-only-mode)
(erase-buffer)
- )))
-
-(cl-defun listen-queue-add (&optional (queue listen-queue) &rest files)
+ (toggle-truncate-lines 1)
+ (make-vtable
+ :columns
+ (list (list :name "*" :primary 'descend
+ :getter (lambda (track _table)
+ (if (eq track (listen-queue-current queue))
+ "▶" " ")))
+ (list :name "At" :primary 'descend
+ :getter (lambda (track _table)
+ (cl-position track (listen-queue-tracks queue))))
+ (list :name "Artist"
+ :getter (lambda (track _table)
+ (listen-track-artist track)))
+ (list :name "Title"
+ :getter (lambda (track _table)
+ (listen-track-title track)))
+ (list :name "Album"
+ :getter (lambda (track _table)
+ (listen-track-album track)))
+ (list :name "#"
+ :getter (lambda (track _table)
+ (listen-track-number track)))
+ (list :name "Date"
+ :getter (lambda (track _table)
+ (listen-track-date track)))
+ (list :name "File"
+ :getter (lambda (track _table)
+ (listen-track-filename track))))
+ :objects-function (lambda ()
+ (listen-queue-tracks queue))
+ :sort-by '((1 . descend))
+ :actions `("q" (lambda (&rest _) (bury-buffer))
+ "n" (lambda (&rest _) (forward-line 1))
+ "p" (lambda (&rest _) (forward-line -1))
+ "RET" ,(listen-queue-command listen-queue-play)))
+ (pop-to-buffer (current-buffer)))))
+
+(defun listen-queue-play (queue track)
+ (listen-play (listen--player) (listen-track-filename track))
+ (setf (listen-queue-current queue) track))
+
+(defun listen-queue--format-time (time)
+ "Return TIME formatted according to `listen-queue-time-format', which see."
+ (if time
+ (format-time-string listen-queue-time-format time)
+ "never"))
+
+(defun listen-queue-complete ()
+ "Return a Listen queue selected with completion."
+ (let* ((queue-names (mapcar #'listen-queue-name listen-queues))
+ (selected (completing-read "Queue (or enter new name): "
queue-names)))
+ (if (member selected queue-names)
+ (cl-find selected listen-queues :key #'listen-queue-name :test #'equal)
+ (push (make-listen-queue :name selected) listen-queues))))
+
+(cl-defun listen-queue-add (queue files)
(interactive
- (list listen-queue
- (read-file-name "Enqueue file: " listen-directory nil t)))
+ (let ((queue (listen-queue-complete))
+ (path (expand-file-name (read-file-name "Enqueue file/directory: "
listen-directory nil t))))
+ (list queue
+ (if (file-directory-p path)
+ (directory-files-recursively path ".")
+ (list path)))))
(cl-callf append (listen-queue-tracks queue) (mapcar #'listen-queue-track
files)))
-(defun listen-queue-track (file)
- "Return track for FILE."
- (make-listen-track :filename file))
+(require 'emms-info-native)
+
+(defun listen-queue-track (filename)
+ "Return track for FILENAME."
+ (let* ((metadata (emms-info-native--decode-info-fields filename)))
+ (make-listen-track :filename filename
+ :artist (map-elt metadata "artist")
+ :title (map-elt metadata "title")
+ :album (map-elt metadata "album")
+ :number (map-elt metadata "tracknumber")
+ :date (map-elt metadata "date")
+ :genre (map-elt metadata "genre"))))
(defun listen-queue-next-p (queue)
"Return non-nil if QUEUE has a track after current."
diff --git a/listen-vlc.el b/listen-vlc.el
index fe4264f68c..5efa4d7cf9 100755
--- a/listen-vlc.el
+++ b/listen-vlc.el
@@ -54,7 +54,7 @@
(cl-defmethod listen--play ((player listen-player-vlc) file)
"Play FILE with PLAYER."
- (dolist (command `("clear" ,(format "add %s" (expand-file-name file))
"play"))
+ (dolist (command `("stop" "clear" ,(format "add %s" (expand-file-name file))
"play"))
(listen--send player command)))
(cl-defmethod listen--stop ((player listen-player-vlc))
diff --git a/listen.el b/listen.el
index 7e48ffa63a..d6ef75a9ed 100755
--- a/listen.el
+++ b/listen.el
@@ -139,6 +139,13 @@
(list (read-number "Volume %: " volume))))
(listen--volume (listen--player) volume))
+(defun listen-quit (player)
+ "Quit PLAYER."
+ (interactive
+ (list (listen--player)))
+ (delete-process (listen-player-process player))
+ (setf listen-player nil))
+
;;;; Transient
(require 'transient)
- [elpa] externals/listen 9ed97e2238 007/103: Tidy, (continued)
- [elpa] externals/listen 9ed97e2238 007/103: Tidy, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 95d5f42100 008/103: Lighter format, ELPA Syncer, 2024/02/26
- [elpa] externals/listen b1eeaff4b8 002/103: Rename to listen.el, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 4a5ed2f7a7 005/103: More, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 1d5f86ebc0 004/103: Updates, ELPA Syncer, 2024/02/26
- [elpa] externals/listen d28f58805b 006/103: Not-yet-functional queue, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 87a916839f 003/103: Add -lib, etc., ELPA Syncer, 2024/02/26
- [elpa] externals/listen a6ca9bd249 009/103: Tidy, ELPA Syncer, 2024/02/26
- [elpa] externals/listen e1194accde 010/103: Lighter stuff, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 5a0a5683e0 011/103: Things, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 11466911d5 012/103: Mostly queue stuff,
ELPA Syncer <=
- [elpa] externals/listen eca9034d41 014/103: Tiny, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 9d116dc78d 013/103: More, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 1cab9f9892 015/103: Stuff, ELPA Syncer, 2024/02/26
- [elpa] externals/listen bbc0b2e55d 023/103: Tidying, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 13baa5d468 025/103: Things, ELPA Syncer, 2024/02/26
- [elpa] externals/listen a9ff51ecfb 020/103: Faces, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 1714586ecf 022/103: Overlay, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 2206de36b0 024/103: Improvements and changes, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 79888f5af1 026/103: More, ELPA Syncer, 2024/02/26
- [elpa] externals/listen a47db2edab 028/103: Genre column, ELPA Syncer, 2024/02/26