emacs-elpa-diffs
[Top][All Lists]
Advanced

[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)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]