Christophe Weblog Wiki Code Publications Music
save point within squeeze-control-display-players
[squeeze-el.git] / squeeze.el
index 2b0e4b8e080cc649a8bff77e1ae6c6103cc2c7db..c4a229ad0249a345a0691b2e4914c03e504e36b9 100644 (file)
@@ -24,6 +24,7 @@
 (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)
 (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)
   (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)
   (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)))
           (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)
 
 (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)