[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/listen 13baa5d468 025/103: Things
From: |
ELPA Syncer |
Subject: |
[elpa] externals/listen 13baa5d468 025/103: Things |
Date: |
Mon, 26 Feb 2024 12:59:13 -0500 (EST) |
branch: externals/listen
commit 13baa5d4681afadaae3fb530f6686aa99d5d265f
Author: Adam Porter <adam@alphapapa.net>
Commit: Adam Porter <adam@alphapapa.net>
Things
---
listen-lib.el | 6 +++
listen-vlc.el | 6 +++
listen.el | 142 +++++++++++++++++++++++++++++++++-------------------------
3 files changed, 92 insertions(+), 62 deletions(-)
diff --git a/listen-lib.el b/listen-lib.el
index b0dc6b6571..5d0dd6b615 100644
--- a/listen-lib.el
+++ b/listen-lib.el
@@ -52,6 +52,12 @@
(or listen-player
(setf listen-player (make-listen-player-vlc))))
+;;;; Methods
+
+(cl-defmethod listen--running-p ((player listen-player))
+ "Return non-nil if PLAYER is running."
+ (process-live-p (listen-player-process player)))
+
;;;; Footer
(provide 'listen-lib)
diff --git a/listen-vlc.el b/listen-vlc.el
index 6ad287b9bd..5e312b7434 100755
--- a/listen-vlc.el
+++ b/listen-vlc.el
@@ -46,6 +46,12 @@
(group (1+ (not (any "
"))))) nil t)
collect (cons (match-string 1) (match-string 2)))))
+(cl-defmethod listen--filename ((player listen-player-vlc))
+ "Return filename of PLAYER's current track."
+ (let ((status (listen--send player "status")))
+ (when (string-match (rx bol "( new input: file://" (group (1+ nonl)) " )"
) status)
+ (match-string 1 status))))
+
(cl-defmethod listen--title ((player listen-player-vlc))
(listen--send player "get_title"))
diff --git a/listen.el b/listen.el
index c0bc26e67f..1bed8f5a09 100755
--- a/listen.el
+++ b/listen.el
@@ -47,11 +47,78 @@
"Default music directory."
:type 'directory)
-;;;; Functions
+;;;; Commands
+
+(defun listen-quit (player)
+ "Quit PLAYER.
+Interactively, uses the default player."
+ (interactive
+ (list (listen--player)))
+ (delete-process (listen-player-process player))
+ (when (eq player listen-player)
+ (setf listen-player nil)))
+
+(declare-function listen-queue-next "listen-queue")
+(defun listen-next (player)
+ "Play next track in PLAYER's queue.
+Interactively, uses the default player."
+ (interactive (list listen-player))
+ (listen-queue-next (map-elt (listen-player-etc player) :queue)))
+
+(defun listen-pause (player)
+ "Pause/unpause PLAYER.
+Interactively, uses the default player."
+ (interactive (list listen-player))
+ (listen--pause player))
+
+;; (defun listen-stop (player)
+;; (interactive (list listen-player))
+;; (listen--stop player))
+
+;;;###autoload
+(defun listen-play (player file)
+ "Play FILE with PLAYER.
+Interactively, uses the default player."
+ (interactive
+ (list (listen--player)
+ (read-file-name "Play file: " listen-directory nil t)))
+ (listen--play player file))
+
+(defun listen-volume (player volume)
+ "Set PLAYER's volume to VOLUME %.
+Interactively, uses the default player."
+ (interactive
+ (let* ((player (listen--player))
+ (volume (floor (listen--volume player))))
+ (list player (read-number "Volume %: " volume))))
+ (listen--volume player volume))
+
+(defun listen-seek (player seconds)
+ "Seek PLAYER to SECONDS.
+Interactively, use the default player, and read a position
+timestamp, like \"23\" or \"1:23\", with optional -/+ prefix for
+relative seek."
+ (interactive
+ (let* ((player (listen--player))
+ (position (read-string "Seek to position: "))
+ (prefix (when (string-match (rx bos (group (any "-+")) (group (1+
anything))) position)
+ (prog1 (match-string 1 position)
+ (setf position (match-string 2 position)))))
+ (seconds (listen-read-time position)))
+ (list player (concat prefix (number-to-string seconds)))))
+ (listen--seek player seconds))
-(cl-defmethod listen--running-p ((player listen-player))
- "Return non-nil if PLAYER is running."
- (process-live-p (listen-player-process player)))
+(cl-defun listen-shell-command (command filename)
+ "Run shell COMMAND on FILENAME.
+Interactively, use the current player's current track, and read
+command with completion."
+ (interactive
+ (let* ((player (listen--player))
+ (filename (abbreviate-file-name (listen--filename player)))
+ (command (read-shell-command (format "Run command on %S: "
filename))))
+ (list command filename)))
+ (let ((command (format "%s %s" command (shell-quote-argument
(expand-file-name filename)))))
+ (async-shell-command command)))
;;;; Mode
@@ -67,7 +134,7 @@
(when (timerp listen-mode-update-mode-line-timer)
;; Cancel any existing timer. Generally shouldn't happen, but not
impossible.
(cancel-timer listen-mode-update-mode-line-timer))
- (setf listen-mode-update-mode-line-timer (run-with-timer nil 1
#'listen--update-lighter))
+ (setf listen-mode-update-mode-line-timer (run-with-timer nil 1
#'listen-mode--update))
;; Avoid adding the lighter multiple times if the mode is activated
again.
(cl-pushnew lighter global-mode-string :test #'equal))
(when listen-mode-update-mode-line-timer
@@ -77,9 +144,10 @@
(remove lighter global-mode-string)))))
(defcustom listen-lighter-format 'remaining
- "Time elapsed/remaining format."
- :type '(choice (const remaining)
- (const elapsed)))
+ "Time elapsed/remaining format.
+For the currently playing track."
+ :type '(choice (const :tag "Time remaining" remaining)
+ (const :tag "Time elapsed/total" elapsed)))
(defun listen-mode-lighter ()
"Return lighter for `listen-mode'."
@@ -110,12 +178,12 @@
(declare-function listen-queue-play "listen-queue")
(declare-function listen-queue-next-track "listen-queue")
-(defun listen--update-lighter (&rest _ignore)
- "Update `listen-mode-lighter'."
+(defun listen-mode--update (&rest _ignore)
+ "Play next track and/or update variable `listen-mode-lighter'."
(let (playing-next-p)
(unless (listen--playing-p listen-player)
(when-let ((queue (map-elt (listen-player-etc listen-player) :queue))
- (next-track (listen-queue-next-track queue)))
+ (next-track (listen-queue-next-track queue)))
(listen-queue-play queue next-track)
(setf playing-next-p t)))
(setf listen-mode-lighter
@@ -124,49 +192,7 @@
(when playing-next-p
(force-mode-line-update 'all))))
-;;;; Commands
-
-(defun listen-next (player)
- "Play next track in PLAYER's queue."
- (interactive (list listen-player))
- (listen-queue-next (map-elt (listen-player-etc player) :queue)))
-
-(defun listen-pause (player)
- (interactive (list listen-player))
- (listen--pause player))
-
-;; (defun listen-stop (player)
-;; (interactive (list listen-player))
-;; (listen--stop player))
-
-;;;###autoload
-(defun listen-play (player file)
- (interactive
- (list (listen--player)
- (read-file-name "Play file: " listen-directory nil t)))
- (listen--play player file))
-
-(defun listen-volume (player volume)
- "Set PLAYER's volume to VOLUME %."
- (interactive
- (let* ((player (listen--player))
- (volume (floor (listen--volume player))))
- (list player (read-number "Volume %: " volume))))
- (listen--volume player volume))
-
-(defun listen-seek (player seconds)
- "Seek PLAYER to SECONDS.
-Interactively, read a position timestamp, like \"23\" or
-\"1:23\", with optional -/+ prefix for relative seek."
- (interactive
- (let* ((player (listen--player))
- (position (read-string "Seek to position: "))
- (prefix (when (string-match (rx bos (group (any "-+")) (group (1+
anything))) position)
- (prog1 (match-string 1 position)
- (setf position (match-string 2 position)))))
- (seconds (listen-read-time position)))
- (list player (concat prefix (number-to-string seconds)))))
- (listen--seek player seconds))
+;;;; Functions
(defun listen-read-time (time)
"Return TIME in seconds.
@@ -182,14 +208,6 @@ TIME is an HH:MM:SS string."
for factor in factors
sum (* (string-to-number field) factor))))
-(defun listen-quit (player)
- "Quit PLAYER."
- (interactive
- (list (listen--player)))
- (delete-process (listen-player-process player))
- (when (eq player listen-player)
- (setf listen-player nil)))
-
;;;; Transient
(require 'transient)
- [elpa] externals/listen d28f58805b 006/103: Not-yet-functional queue, (continued)
- [elpa] externals/listen d28f58805b 006/103: Not-yet-functional queue, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 87a916839f 003/103: Add -lib, etc., ELPA Syncer, 2024/02/26
- [elpa] externals/listen a6ca9bd249 009/103: Tidy, ELPA Syncer, 2024/02/26
- [elpa] externals/listen e1194accde 010/103: Lighter stuff, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 5a0a5683e0 011/103: Things, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 11466911d5 012/103: Mostly queue stuff, ELPA Syncer, 2024/02/26
- [elpa] externals/listen eca9034d41 014/103: Tiny, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 9d116dc78d 013/103: More, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 1cab9f9892 015/103: Stuff, ELPA Syncer, 2024/02/26
- [elpa] externals/listen bbc0b2e55d 023/103: Tidying, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 13baa5d468 025/103: Things,
ELPA Syncer <=
- [elpa] externals/listen a9ff51ecfb 020/103: Faces, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 1714586ecf 022/103: Overlay, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 2206de36b0 024/103: Improvements and changes, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 79888f5af1 026/103: More, ELPA Syncer, 2024/02/26
- [elpa] externals/listen a47db2edab 028/103: Genre column, ELPA Syncer, 2024/02/26
- [elpa] externals/listen ba8806a020 029/103: Move tracks in queue, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 42c5397b01 030/103: Add TODO, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 2eb2ac9db4 027/103: Volume stuff, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 4390995834 031/103: SPC to pause in queue, ELPA Syncer, 2024/02/26
- [elpa] externals/listen 8d3706c4c3 033/103: Rename commands, ELPA Syncer, 2024/02/26