Christophe Weblog Wiki Code Publications Music
a couple of robustification fixes
[squeeze-el.git] / squeeze.el
index c4a229ad0249a345a0691b2e4914c03e504e36b9..1e34449f76861986fee4ab9ca0ca31686188cb59 100644 (file)
     (define-key map (kbd "TAB") 'completion-at-point)
     map))
 
+(defun squeeze-unhex-and-decode-utf8-string (string)
+  (decode-coding-string (url-unhex-string string) 'utf-8))
+
 (define-derived-mode squeeze-mode comint-mode "Squeeze"
   "Major mode for interacting with the Squeezebox Server CLI.\\<squeeze-mode-map>"
   (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-unhex-and-decode-utf8-string nil t)
   (add-hook 'comint-preoutput-filter-functions 'squeeze-update-state nil t))
 
 (defvar squeeze-control-mode-map
          (nblank (floor (- width exact))))
     (format "%s%s%s"
             (make-string nfull ?█)
-            (cond ((= width (+ nfull nblank)) "")
-                  ((< frac 0.0625) " ")
-                  ((< frac 0.1875) "▏")
-                  ((< frac 0.3125) "▎")
-                  ((< frac 0.4375) "▍")
-                  ((< frac 0.5625) "▌")
-                  ((< frac 0.6875) "▋")
-                  ((< frac 0.8125) "▊")
-                  ((< frac 0.9375) "▉")
-                  (t "█"))
+            (if (= width (+ nfull nblank))
+                ""
+              (string (aref " ▏▎▍▌▋▊▉█" (floor (+ frac 0.0625) 0.125))))
             (make-string nblank ? ))))
 
 (defun squeeze-mixer-make-bar (vol width)
 (defun squeeze-control-listen ()
   (squeeze-send-string "listen 1"))
 
+(defun squeeze-accept-process-output ()
+  (while (accept-process-output (get-buffer-process "*squeeze*") 0.1 nil t)))
+
 (defun squeeze-control-refresh ()
   (interactive)
   (let ((squeeze-control-inhibit-display t))
     (squeeze-control-query-players)
-    (accept-process-output (get-buffer-process "*squeeze*"))
+    (squeeze-accept-process-output)
     (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*"))
-      (squeeze-control-query-mixer-volume (squeeze-player-playerid player))
-      (accept-process-output (get-buffer-process "*squeeze*"))))
+      (squeeze-control-query-mixer-volume (squeeze-player-playerid player))))
+  (squeeze-accept-process-output)
   (squeeze-control-display-players))
 
 (defvar squeeze-control-mixer-map
   playerindex playerid uuid ip name model isplayer displaytype canpoweroff connected power volume)
 
 (defun squeeze-string-plistify (string start end)
+  (unless end
+    (setq end (length string)))
   (save-match-data
     (let (result)
       (loop
              (when (> mend end)
                (return))
              (push (intern (format ":%s" (substring string (match-beginning 1) (match-end 1)))) result)
-             (push (url-unhex-string (substring string (match-beginning 2) (match-end 2))) result)
+             (push (decode-coding-string
+                    (url-unhex-string (substring string (match-beginning 2) (match-end 2)))
+                    'utf-8)
+                   result)
              (setq start mend))
          (return)))
       (nreverse result))))
         (startpos (match-end 0)))
     (unless countpos
       (message "no count found in players line"))
-    (let ((count (parse-integer string (match-beginning 1) (match-end 1)))
+    (let ((count (string-to-number (substring string (match-beginning 1) (match-end 1))))
           result endpos)
       (dotimes (i (1- count))
         (setq endpos (progn (string-match " connected%3A[0-1] " string startpos)
             "favorites"
             ))))
 
-(defun squeeze ()
+(defun squeeze-read-server-parameters (address port)
+  (let ((host (read-string "Host: " nil nil address))
+        (port (read-number "Port: " port)))
+    (cons host port)))
+
+(defun squeeze (&optional address port)
   (interactive)
-  (let ((buffer (make-comint-in-buffer "squeeze" nil
-                                       (cons squeeze-server-address
-                                             squeeze-server-port))))
+  (unless address (setq address squeeze-server-address))
+  (unless port (setq port squeeze-server-port))
+  (when current-prefix-arg
+    (let ((parameters (squeeze-read-server-parameters address port)))
+      (setq address (car parameters)
+            port (cdr parameters))))
+  (let ((buffer (make-comint-in-buffer "squeeze" nil (cons address port))))
     (switch-to-buffer buffer)
     (squeeze-mode)))
 
-(defun squeeze-control ()
+(defun squeeze-control (&optional address port)
   (interactive)
-  (squeeze)
+  (unless address (setq address squeeze-server-address))
+  (unless port (setq port squeeze-server-port))
+  (when current-prefix-arg
+    (let ((parameters (squeeze-read-server-parameters address port)))
+      (setq address (car parameters)
+            port (cdr parameters))))
+  (let ((current-prefix-arg nil))
+    (squeeze address port))
   (let ((buffer (get-buffer-create "*squeeze-control*")))
     (switch-to-buffer buffer)
     (squeeze-control-listen)
     (squeeze-control-refresh)
     (squeeze-control-display-players)))
+
+(provide 'squeeze)