X-Git-Url: http://christophe.rhodes.io/gitweb/?p=squeeze-el.git;a=blobdiff_plain;f=squeeze.el;h=c4a229ad0249a345a0691b2e4914c03e504e36b9;hp=0d23a0c6d23dbeb5dd0349215b53ee8d3ec79024;hb=698e6e901e34e13c21cccdadea39f359399f384d;hpb=454563fcec34bdfa3ba4921d06c6fc809e193957 diff --git a/squeeze.el b/squeeze.el index 0d23a0c..c4a229a 100644 --- a/squeeze.el +++ b/squeeze.el @@ -17,12 +17,14 @@ (define-derived-mode squeeze-mode comint-mode "Squeeze" "Major mode for interacting with the Squeezebox Server CLI.\\" + (add-to-list 'completion-at-point-functions 'squeeze-complete-command-at-point) (add-hook 'comint-preoutput-filter-functions 'url-unhex-string nil t) (add-hook 'comint-preoutput-filter-functions 'squeeze-update-state nil t)) (defvar squeeze-control-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "SPC") 'squeeze-control-toggle-power) + (define-key map (kbd "f") 'squeeze-control-play-favorite) (define-key map (kbd "g") 'squeeze-control-refresh) (define-key map (kbd "+") 'squeeze-control-volume-up) (define-key map (kbd "-") 'squeeze-control-volume-down) @@ -164,26 +166,42 @@ (defvar squeeze-players ()) (defvar squeeze-syncgroups ()) +(defun squeeze-send-string (control &rest arguments) + (let* ((process (get-buffer-process "*squeeze*")) + (string (apply #'format control arguments)) + (length (length string))) + (unless (and (> length 0) (char-equal (aref string (1- length)) ?\n)) + (setq string (format "%s\n" string))) + (if process + (comint-send-string process string) + (error "can't find squeeze process")))) + (defun squeeze-control-query-syncgroups () (interactive) - (comint-send-string (get-buffer-process "*squeeze*") (format "syncgroups ?\n"))) + (squeeze-send-string "syncgroups ?")) (defun squeeze-control-query-players () (interactive) - (comint-send-string (get-buffer-process "*squeeze*") (format "players 0\n"))) + (squeeze-send-string "players 0")) (defun squeeze-control-toggle-power (&optional id) (interactive) (unless id (setq id (get-text-property (point) 'squeeze-playerid))) - (comint-send-string (get-buffer-process "*squeeze*") (format "%s power\n" id))) + (squeeze-send-string "%s power" id)) + +(defun squeeze-control-play-favorite (&optional favorite id) + (interactive "nFavourite: ") + (unless id + (setq id (get-text-property (point) 'squeeze-playerid))) + (squeeze-send-string "%s favorites playlist play item_id:%d" id favorite)) (defun squeeze-control-query-power (&optional id) (interactive) (unless id (setq id (get-text-property (point) 'squeeze-playerid))) (when id - (comint-send-string (get-buffer-process "*squeeze*") (format "%s power ?\n" id)))) + (squeeze-send-string "%s power ?" id))) (defun squeeze-control-volume-up (&optional id inc) (interactive) @@ -191,7 +209,7 @@ (unless id (setq id (get-text-property (point) 'squeeze-playerid))) (when id - (comint-send-string (get-buffer-process "*squeeze*") (format "%s mixer volume %+d\n" id inc)))) + (squeeze-send-string "%s mixer volume %+d" id inc))) (defun squeeze-control-volume-down (&optional id inc) (interactive) @@ -199,18 +217,18 @@ (unless id (setq id (get-text-property (point) 'squeeze-playerid))) (when id - (comint-send-string (get-buffer-process "*squeeze*") (format "%s mixer volume %+d\n" id (- inc))))) + (squeeze-send-string "%s mixer volume %+d" id (- inc)))) (defun squeeze-control-volume-set (id val) (interactive) - (comint-send-string (get-buffer-process "*squeeze*") (format "%s mixer volume %d\n" id val))) + (squeeze-send-string "%s mixer volume %d" id val)) (defun squeeze-control-query-mixer-volume (&optional id) (interactive) (unless id (setq id (get-text-property (point) 'squeeze-playerid))) (when id - (comint-send-string (get-buffer-process "*squeeze*") (format "%s mixer volume ?\n" id)))) + (squeeze-send-string "%s mixer volume ?" id))) (defun squeeze-control-player-face (player) (let ((power (squeeze-player-power player))) @@ -219,13 +237,15 @@ (t 'squeeze-player-face)))) (defun squeeze-control-listen () - (comint-send-string (get-buffer-process "*squeeze*") (format "listen 1\n"))) + (squeeze-send-string "listen 1")) (defun squeeze-control-refresh () (interactive) (let ((squeeze-control-inhibit-display t)) (squeeze-control-query-players) (accept-process-output (get-buffer-process "*squeeze*")) + (squeeze-control-query-syncgroups) + (accept-process-output (get-buffer-process "*squeeze*")) (dolist (player squeeze-players) (squeeze-control-query-power (squeeze-player-playerid player)) (accept-process-output (get-buffer-process "*squeeze*")) @@ -280,35 +300,33 @@ (defun squeeze-control-display-players () (interactive) - (cond - (squeeze-control-display-syncgroups - (with-current-buffer (get-buffer-create "*squeeze-control*") + (with-current-buffer (get-buffer-create "*squeeze-control*") + (let ((saved (point))) (squeeze-control-mode) (read-only-mode -1) (erase-buffer) - (let ((syncgroups squeeze-syncgroups) - (seen)) - (while syncgroups - (let ((names (getf syncgroups :names)) - (members (split-string (getf syncgroups :members) ","))) - (insert (propertize names 'face 'squeeze-syncgroup-face) "\n") - (dolist (member members) - (let ((player (squeeze-find-player member))) - (squeeze-control-insert-player player) - (push player seen)))) - (setq syncgroups (cddddr syncgroups))) - (insert (propertize "No syncgroup" 'face 'squeeze-syncgroup-face) "\n") + (cond + (squeeze-control-display-syncgroups + (let ((syncgroups squeeze-syncgroups) + (seen)) + (while syncgroups + (let ((names (getf syncgroups :names)) + (members (split-string (getf syncgroups :members) ","))) + (insert (propertize names 'face 'squeeze-syncgroup-face) "\n") + (dolist (member members) + (let ((player (squeeze-find-player member))) + (squeeze-control-insert-player player) + (push player seen)))) + (setq syncgroups (cddddr syncgroups))) + (insert (propertize "No syncgroup" 'face 'squeeze-syncgroup-face) "\n") + (dolist (player squeeze-players) + (unless (member player seen) + (squeeze-control-insert-player player))))) + (t (dolist (player squeeze-players) - (unless (member player seen) - (squeeze-control-insert-player player)))))) - (t - (with-current-buffer (get-buffer-create "*squeeze-control*") - (squeeze-control-mode) - (read-only-mode -1) - (erase-buffer) - (dolist (player squeeze-players) - (squeeze-control-insert-player player)) - (read-only-mode 1))))) + (squeeze-control-insert-player player)) + (read-only-mode 1))) + (goto-char saved)))) (cl-defstruct (squeeze-player (:constructor squeeze-make-player)) playerindex playerid uuid ip name model isplayer displaytype canpoweroff connected power volume)