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