diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/media/jao-mpc.el | 81 |
1 files changed, 56 insertions, 25 deletions
diff --git a/lib/media/jao-mpc.el b/lib/media/jao-mpc.el index 512d21b..9004920 100644 --- a/lib/media/jao-mpc.el +++ b/lib/media/jao-mpc.el @@ -20,7 +20,7 @@ ;;; Commentary: -;; Simple mpd control using mpc commands. +;; Simple mpd control using elmpd and mpc. ;;; Code: @@ -29,6 +29,9 @@ (require 'jao-lyrics) (defvar jao-mpc--connection nil) +(defvar-local jao-mpc--local-connecton nil) +(defvar-local jao-mpc--local-port nil) + (defvar jao-mpc-host "localhost") (defvar jao-mpc-port 6600) @@ -38,15 +41,18 @@ (delete-process (elmpd-connection--fd jao-mpc--connection)) (setq jao-mpc--connection nil))) +(defun jao-mpc--connect (name &optional cb) + (elmpd-connect :name name + :host jao-mpc-host + :port jao-mpc-port + :subsystems + (when cb `((player) . ,cb)))) + (defun jao-mpc-connect (&optional force) (interactive) (when force (jao-mpc-disconnect)) (unless jao-mpc--connection - (setq jao-mpc--connection - (elmpd-connect :name "jao-mpc" - :host jao-mpc-host - :port jao-mpc-port - :subsystems '((player) . jao-mpc--watcher))) + (setq jao-mpc--connection (jao-mpc--connect "jao-mpc" 'jao-mpc--watcher)) (jao-mpc--watcher jao-mpc--connection 'player)) jao-mpc--connection) @@ -57,14 +63,17 @@ (defvar jao-mpc--current '()) (defvar jao-mpc-minibuffer-str "") +(defun jao-mpc--parse-retort (txt) + (let (res) + (dolist (e (split-string txt "\n" t " ") res) + (let ((e (split-string e ": " t " "))) + (when (and (car e) (cadr e)) + (push (cons (car e) (cadr e)) res)))))) + (defun jao-mpc--update-status (next) (let ((cb (lambda (_c ok txt) (when ok - (setq jao-mpc--play-status '()) - (dolist (e (split-string txt "\n" t " ")) - (let ((e (split-string e ": " t " "))) - (when (and (car e) (cadr e)) - (push (cons (car e) (cadr e)) jao-mpc--play-status)))) + (setq jao-mpc--play-status (jao-mpc--parse-retort txt)) (when next (funcall next)))))) (jao-mpc--send "status" cb))) @@ -98,15 +107,12 @@ (if (jao-mpc--playing-p) (jao-mpc--current-str) "")) (jao-minibuffer-refresh)) -(defun jao-mpc--update-current () +(defun jao-mpc--update-current (&optional next) (let ((cb (lambda (_c ok txt) (when ok - (setq jao-mpc--current '()) - (dolist (e (split-string txt "\n" t " ")) - (let ((e (split-string e ": " t " "))) - (when (and (car e) (cadr e)) - (push (cons (car e) (cadr e)) jao-mpc--current)))) - (jao-mpc--update-minibuffer))))) + (setq jao-mpc--current (jao-mpc--parse-retort txt)) + (jao-mpc--update-minibuffer) + (when next (funcall next)))))) (jao-mpc--send "currentsong" cb))) (defun jao-mpc--watcher (_conn _subsys) @@ -148,20 +154,37 @@ "Mode to display the list of playlist known by mpd." (read-only-mode -1) (delete-region (point-min) (point-max)) - (insert (shell-command-to-string "mpc playlist")) + (insert (shell-command-to-string (format "mpc -p %s playlist" jao-mpc-port))) (goto-char (point-min)) + (display-line-numbers-mode) (read-only-mode 1)) +(defun jao-mpc--playlist-goto-current () + (interactive) + (let ((jao-mpc--connection + (or jao-mpc--local-connecton jao-mpc--local-connecton))) + (jao-mpc--update-current + (lambda () + (when-let (no (string-to-number (jao-mpc--current-get "Pos"))) + (goto-char (point-min)) + (forward-line no)))))) + +(defun jao-mpc--playlist-play () + (interactive) + (shell-command-to-string (format "mpc -p %s play %s" + (or jao-mpc--local-port jao-mpc-port) + (line-number-at-pos)))) + (define-key jao-mpc-playlist-mode-map (kbd "n") #'next-line) (define-key jao-mpc-playlist-mode-map (kbd "p") #'previous-line) (define-key jao-mpc-playlist-mode-map (kbd "q") #'bury-buffer) +(define-key jao-mpc-playlist-mode-map (kbd ".") #'jao-mpc--playlist-goto-current) +(define-key jao-mpc-playlist-mode-map (kbd "RET") #'jao-mpc--playlist-play) (defun jao-mpc--playlist-buffer () - (if-let (b (get-buffer jao-mpc--playlist)) - b - (with-current-buffer (get-buffer-create jao-mpc--playlist) - (jao-mpc-playlist-mode) - (current-buffer)))) + (with-current-buffer (get-buffer-create jao-mpc--playlist) + (jao-mpc-playlist-mode) + (current-buffer))) ;;;###autoload (defun jao-mpc-stop () @@ -189,6 +212,11 @@ (jao-mpc--send "previous" nil)) ;;;###autoload +(defun jao-mpc-clear () + (interactive) + (jao-mpc--send "clear" nil)) + +;;;###autoload (defun jao-mpc-echo-current () (interactive) (jao-notify (jao-mpc--current-str))) @@ -203,7 +231,10 @@ (defun jao-mpc-show-playlist () "Show current playlist." (interactive) - (pop-to-buffer (jao-mpc--playlist-buffer))) + (pop-to-buffer (jao-mpc--playlist-buffer)) + (setq-local jao-mpc--local-connecton jao-mpc--connection + jao-mpc--local-port jao-mpc-port) + (jao-mpc--playlist-goto-current)) ;;;###autoload (defun jao-mpc-lyrics-track-data () |