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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/listen 7d2498088b 017/103: Things


From: ELPA Syncer
Subject: [elpa] externals/listen 7d2498088b 017/103: Things
Date: Mon, 26 Feb 2024 12:59:08 -0500 (EST)

branch: externals/listen
commit 7d2498088bb2f6c0f3787146e06a5daf8dc79912
Author: Adam Porter <adam@alphapapa.net>
Commit: Adam Porter <adam@alphapapa.net>

    Things
---
 listen-queue.el | 61 +++++++++++++++++++++++++++++++++++++++++++++++++--------
 listen.el       | 21 +++++++++++++++-----
 2 files changed, 69 insertions(+), 13 deletions(-)

diff --git a/listen-queue.el b/listen-queue.el
index 6a02ff5b65..c74e554a18 100644
--- a/listen-queue.el
+++ b/listen-queue.el
@@ -23,12 +23,16 @@
 
 ;;; Code:
 
-(require 'emms-info-native)
 (require 'vtable)
 
+(require 'emms-info-native)
+(require 'persist)
+
 (require 'listen-lib)
 
-(defvar listen-queues nil)
+(persist-defvar listen-queues nil
+  "Listen queues.")
+
 (defvar listen-directory)
 
 (defvar-local listen-queue nil
@@ -108,7 +112,15 @@
       (vtable-revert-command))))
 
 (declare-function listen-play "listen")
-(defun listen-queue-play (queue track)
+(defun listen-queue-play (queue &optional track)
+  "Play QUEUE and optionally TRACK in it.
+Interactively, selected queue with completion; and with prefix,
+select track as well."
+  (interactive (let* ((queue (listen-queue-complete))
+                      (track (if current-prefix-arg
+                                 (listen-queue-complete-track queue)
+                               (car (listen-queue-tracks queue)))))
+                 (list queue track)))
   (let ((player (listen--player)))
     (listen-play player (listen-track-filename track))
     (setf (listen-queue-current queue) track
@@ -121,6 +133,19 @@
       (format-time-string listen-queue-time-format time)
     "never"))
 
+(defun listen-queue-complete-track (queue)
+  "Return track selected from QUEUE with completion."
+  (cl-labels ((format-track (track)
+                (pcase-let (((cl-struct listen-track artist title album date) 
track))
+                  (format "%s: %s (%s) (%s)"
+                          artist title album date))))
+    (let* ((map (mapcar (lambda (track)
+                          (cons (format-track track) track))
+                        (listen-queue-tracks queue)))
+           (selected (completing-read (format "Track from %S: " 
(listen-queue-name queue))
+                                      map nil t)))
+      (alist-get selected map nil nil #'equal))))
+
 (cl-defun listen-queue-complete (&key (prompt "Queue: "))
   "Return a Listen queue selected with completion.
 PROMPT is passed to `completing-read', which see."
@@ -137,7 +162,9 @@ PROMPT is passed to `completing-read', which see."
 (defun listen-queue-new (name)
   "Add and return a new queue having NAME."
   (interactive (list (read-string "New queue name: ")))
-  (push (make-listen-queue :name name) listen-queues))
+  (let ((queue (make-listen-queue :name name)))
+    (push queue listen-queues)
+    queue))
 
 (defun listen-queue-discard (queue)
   "Discard QUEUE."
@@ -145,7 +172,7 @@ PROMPT is passed to `completing-read', which see."
   (cl-callf2 delete queue listen-queues))
 
 ;;;###autoload
-(cl-defun listen-queue-add (queue files)
+(cl-defun listen-queue-add-files (queue files)
   "Add FILES to QUEUE."
   (interactive
    (let ((queue (listen-queue-complete))
@@ -167,11 +194,29 @@ PROMPT is passed to `completing-read', which see."
                        :date (map-elt metadata "date")
                        :genre (map-elt metadata "genre"))))
 
+(defun listen-queue-shuffle (queue)
+  "Toggle shuffle for QUEUE."
+  (setf (alist-get 'next-track-function queue)
+        (pcase (alist-get 'next-track-function queue)
+          ('listen-queue-random-track nil)
+          (_ 'listen-queue-random-track))))
+
+(defun listen-queue-random-track (queue)
+  "Return a random track in QUEUE."
+  (seq-random-elt (listen-queue-tracks queue)))
+
 (defun listen-queue-next (queue)
+  "Play next track in QUEUE."
+  (interactive (list (listen-queue-complete)))
+  (listen-queue-play queue (listen-queue-next-track queue)))
+
+(defun listen-queue-next-track (queue)
   "Return QUEUE's next track after current."
-  (seq-elt (listen-queue-tracks queue)
-           (1+ (seq-position (listen-queue-tracks queue)
-                             (listen-queue-current queue)))))
+  (if-let ((fn (alist-get 'next-track-function (listen-queue-etc   queue))))
+      (funcall fn queue)
+    (seq-elt (listen-queue-tracks queue)
+             (1+ (seq-position (listen-queue-tracks queue)
+                               (listen-queue-current queue))))))
 
 (provide 'listen-queue)
 ;;; listen-queue.el ends here
diff --git a/listen.el b/listen.el
index 8e35f9f252..69ce31750f 100755
--- a/listen.el
+++ b/listen.el
@@ -4,7 +4,7 @@
 
 ;; Author: Adam Porter <adam@alphapapa.net>
 ;; Keywords:
-;; Package-Requires: ((emacs "29.1") (emms "11"))
+;; Package-Requires: ((emacs "29.1") (emms "11") (persist "0.6"))
 
 ;; This program is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
@@ -108,12 +108,12 @@
              (list "■ ")))))
 
 (declare-function listen-queue-play "listen-queue")
-(declare-function listen-queue-next "listen-queue")
+(declare-function listen-queue-next-track "listen-queue")
 (defun listen--update-lighter (&rest _ignore)
   "Update `listen-mode-lighter'."
   (unless (listen--playing-p listen-player)
     (when-let ((queue (map-elt (listen-player-etc listen-player) :queue))
-               (next-track (listen-queue-next queue))) 
+               (next-track (listen-queue-next-track queue))) 
       (listen-queue-play queue next-track)))
   (setf listen-mode-lighter
         (when (and listen-player (listen--running-p listen-player))
@@ -190,13 +190,24 @@ TIME is an HH:MM:SS string."
     ]
    
    ]
-  ["Queue"
+  [[
+    ]
+   
+   ]
+  ["Queue mode"
    :description
    (lambda ()
      (if-let ((queue (map-elt (listen-player-etc listen-player) :queue)))
          (concat "Queue: " (listen-queue-name queue))
        "No queue"))
-   ("a" "Add" listen-queue-add)
+   ("Q" "Play another queue" listen-queue-play)
+   ("q" "Show queue" listen-queue)
+   ("a" "Add files" listen-queue-add-files)
+   ("t" "Select track" (lambda ()
+                         "Call `listen-queue-play' with prefix."
+                         (interactive)
+                         (let ((current-prefix-arg '(4)))
+                           (call-interactively #'listen-queue-play))))
    ]
   
   )



reply via email to

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