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

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

[elpa] externals/listen 0cdd583432 2/3: Add: (listen-queue-repeat-mode)


From: ELPA Syncer
Subject: [elpa] externals/listen 0cdd583432 2/3: Add: (listen-queue-repeat-mode)
Date: Fri, 1 Mar 2024 12:58:42 -0500 (EST)

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

    Add: (listen-queue-repeat-mode)
---
 README.org      |  3 +++
 listen-queue.el | 13 +++++++++++++
 listen.el       | 38 ++++++++++++++++++++++++++++----------
 3 files changed, 44 insertions(+), 10 deletions(-)

diff --git a/README.org b/README.org
index 8f0138a60a..6ec564a05f 100644
--- a/README.org
+++ b/README.org
@@ -67,6 +67,9 @@ Use the command ~listen~ to show the Transient menu.  From 
there, it is--hopeful
 
 ** v0.5-pre
 
+*Additions*
++ Option ~listen-queue-repeat-mode~ (also settable in ~listen-menu~) allows 
repeating a queue in-order or shuffled.
+
 *Fixes*
 + Increase timeout for reading track durations.
 
diff --git a/listen-queue.el b/listen-queue.el
index d0457d57a8..6f86efc15e 100644
--- a/listen-queue.el
+++ b/listen-queue.el
@@ -65,6 +65,19 @@
   "Maximum number of processes to run while probing track durations."
   :type 'natnum)
 
+(defcustom listen-queue-repeat-mode nil
+  "Whether and how to repeat queues.
+This is provided as a customization option, but it's mainly
+intended to be set from the `listen-menu'."
+  :type '(choice (const :tag "Don't repeat" nil)
+                 (const :tag "Repeat queue" queue)
+                 (const :tag "Shuffle and repeat queue"
+                        :documentation "When the queue finishes, shuffle it 
and play again."
+                        shuffle)
+                 ;; TODO: Implement track repeat (it doesn't fit into the 
current logic).
+                 ;; (const :tag "Repeat track" track)
+                 ))
+
 ;;;; Commands
 
 ;; (defmacro listen-queue-command (command)
diff --git a/listen.el b/listen.el
index d1be017936..974535f321 100755
--- a/listen.el
+++ b/listen.el
@@ -234,10 +234,20 @@ command with completion."
                   ;; HACK: It seems that sometimes the player gets restarted
                   ;; even when paused: this extra check should prevent that.
                   (member (listen--status listen-player) '("playing" 
"paused")))
-        (when-let ((queue (map-elt (listen-player-etc listen-player) :queue))
-                   (next-track (listen-queue-next-track queue)))
-          (listen-queue-play queue next-track)
-          (setf playing-next-p t))))
+        (when-let ((queue (map-elt (listen-player-etc listen-player) :queue)))
+          (if-let ((next-track (listen-queue-next-track queue)))
+              (progn
+                (listen-queue-play queue next-track)
+                (setf playing-next-p t))
+            ;; Queue done: repeat?
+            (pcase listen-queue-repeat-mode
+              ('queue
+               (listen-queue-play queue)
+               (setf playing-next-p t))
+              ('shuffle
+               (listen-queue-play queue (seq-random-elt (listen-queue-tracks 
queue)))
+               (listen-queue-shuffle queue)
+               (setf playing-next-p t)))))))
     (setf listen-mode-lighter
           (when (and listen-player (listen--running-p listen-player))
             (listen-mode-lighter)))
@@ -272,11 +282,12 @@ TIME is a string like \"SS\", \"MM:SS\", or \"HH:MM:SS\"."
 (declare-function listen-queue "listen-queue")
 (declare-function listen-queue-shuffle "listen-queue")
 
+(defvar listen-queue-repeat-mode)
+
 ;; It seems that autoloading the transient prefix command doesn't work
 ;; as expected, so we'll try this workaround.
 ;;;###autoload
 (defalias 'listen #'listen-menu)
-
 (transient-define-prefix listen-menu ()
   "Show Listen menu."
   :refresh-suffixes t
@@ -356,11 +367,18 @@ TIME is a string like \"SS\", \"MM:SS\", or \"HH:MM:SS\"."
      :transient t)
     ("qd" "Deduplicate" listen-queue-deduplicate
      :transient t)
-    ("qs" "Shuffle" (lambda ()
-                      "Shuffle queue."
-                      (interactive)
-                      (call-interactively #'listen-queue-shuffle))
-     :transient t)]])
+    ("qs" "Shuffle" (lambda () (interactive) (call-interactively 
#'listen-queue-shuffle))
+     :transient t)]
+   ["Repeat"
+    ("qrn" "None" (lambda () (interactive) (setopt listen-queue-repeat-mode 
nil))
+     :inapt-if (lambda () (not listen-queue-repeat-mode)))
+    ("qrq" "Queue" (lambda () (interactive) (setopt listen-queue-repeat-mode 
'queue))
+     :inapt-if (lambda () (eq 'queue listen-queue-repeat-mode)))
+    ("qrs" "Queue and shuffle" (lambda () (interactive) (setopt 
listen-queue-repeat-mode 'shuffle))
+     :inapt-if (lambda () (eq 'shuffle listen-queue-repeat-mode)))
+    ;; ("qrt" "Track" (lambda () (interactive) (setopt 
listen-queue-repeat-mode 'track))
+    ;;  :inapt-if (lambda () (eq 'track listen-queue-repeat-mode)))
+    ]])
 
 (provide 'listen)
 



reply via email to

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