(define-key map (kbd "+") 'squeeze-control-volume-up)
(define-key map (kbd "-") 'squeeze-control-volume-down)
(define-key map (kbd "t") 'squeeze-control-toggle-syncgroup-display)
+ (define-key map (kbd ">") 'squeeze-control-next-track)
+ (define-key map (kbd "<") 'squeeze-control-previous-track)
+ (define-key map (kbd "s") 'squeeze-control-select-player)
map))
+(defvar squeeze-control-current-player nil)
+
+(defun squeeze-control-select-player (id)
+ (interactive
+ (list (or (get-text-property (point) 'squeeze-playerid)
+ (let ((name (completing-read "Select player: " (mapcar 'squeeze-player-name squeeze-players))))
+ (squeeze-player-playerid (squeeze-find-player-from-name name))))))
+ (setq squeeze-control-current-player id))
+
+(defun squeeze-control-next-track ()
+ (interactive)
+ (squeeze-send-string "%s playlist index +1" squeeze-control-current-player))
+
+(defun squeeze-control-previous-track ()
+ (interactive)
+ (squeeze-send-string "%s playlist index -1" squeeze-control-current-player))
+
(define-derived-mode squeeze-control-mode special-mode "SqueezeControl"
"Major mode for controlling Squeezebox Servers.\\<squeeze-control-mode-map>")
(and current (max 0 (min 100 (+ current number)))))
(setf (squeeze-player-volume player) number))))
+(require 'notifications)
+
(defun squeeze-update-state-from-line (string)
(cond
((string-match "^players 0" string)
(let ((substring (substring string (match-end 0)))
(id (url-unhex-string (match-string 1 string))))
(cond
+ ((string-match "^playlist newsong \\(.*\\) \\([0-9]+\\)$" substring)
+ (let ((value (save-match-data (url-unhex-string (match-string 1 substring))))
+ (index (url-unhex-string (match-string 2 substring))))
+ (notifications-notify :title "Now playing" :body (encode-coding-string (format "%s: %s" index value) 'utf-8)))
+ t)
((string-match "^power\\(?: \\([01]\\)\\)?" substring)
(let ((state (match-string 1 substring))
(player (squeeze-find-player id)))