[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))))
]
)
- [elpa] externals/listen 86e6677c6b 056/103: Fix, (continued)
- [elpa] externals/listen 86e6677c6b 056/103: Fix, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 4fac16dd51 057/103: Docs, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 9ce822e09c 059/103: Add: basic library view, ELPA Syncer, 2024/02/26
- [elpa] externals/listen d4723c91f0 060/103: Library improvements, ELPA Syncer, 2024/02/26
- [elpa] externals/listen f97086d0fc 080/103: Change: (listen-queue) Headers for first 2 columns, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 317732714c 083/103: Fix: (listen-queue-next-track) Also test filename, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 8bad3e92dc 087/103: Meta: v0.3-pre, ELPA Syncer, 2024/02/26
- [elpa] externals/listen a9e77ab677 101/103: Fix: (listen-queue-play) Add autoload, ELPA Syncer, 2024/02/26
- [elpa] externals/listen f9b0fe8b7d 102/103: Change: Use prin1 for filenames, ELPA Syncer, 2024/02/26
- [elpa] externals/listen d85ba4038e 097/103: Comment: Add TODO, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 7d2498088b 017/103: Things,
ELPA Syncer <=
- [elpa] externals/listen 33fe769381 018/103: And more, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 74c5c75f41 019/103: More, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 5ce4c38d1f 021/103: Tidy, ELPA Syncer, 2024/02/26
- [elpa] externals/listen c3aff3362f 035/103: Ensure track metadata, ELPA Syncer, 2024/02/26
- [elpa] externals/listen c0cc1c8a02 034/103: Add MPD source, other changes, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 250135e4d9 036/103: Showing empty queues, ELPA Syncer, 2024/02/26
- [elpa] externals/listen d6d760adef 043/103: Volume stuff, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 56a4a2ebec 054/103: Add: listen-info, ELPA Syncer, 2024/02/26
- [elpa] externals/listen e3fc93d830 045/103: Tidy, ELPA Syncer, 2024/02/26
- [elpa] externals/listen bb08261ae3 061/103: Docs, ELPA Syncer, 2024/02/26