(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)))
(let ((syncgroups squeeze-syncgroups)
(seen))
(while syncgroups
- (let ((names (getf syncgroups :names))
- (members (split-string (getf syncgroups :members) ",")))
+ (let ((names (getf syncgroups :sync_member_names))
+ ;; new server version has sync_members and sync_member_names
+ (members (split-string (getf syncgroups :sync_members) ",")))
(insert (propertize names 'face 'squeeze-syncgroup-face) "\n")
(dolist (member members)
(let ((player (squeeze-find-player member)))
(save-excursion
(list (progn (backward-word) (point))
(progn (forward-word) (point))
- '(;; General commands and queries
- "login" "can" "version" "listen" "subscribe" "pref"
- "logging" "getstring" "setsncredentials" "debug"
- "exit" "shutdown"
-
- ;; Player commands and queries
- "player" "count" "id" "uuid" "name" "ip" "model" "isplayer"
- "displaytype" "canpoweroff" "?" "signalstrength" "connected"
- "sleep" "sync" "syncgroups" "power" "mixer" "volume" "muting"
- "bass" "treble" "pitch" "show" "display" "linesperscreen"
- "displaynow" "playerpref" "button" "ir" "irenable"
- "connect" "client" "forget" "disconnect" "players"
-
- ;; Database commands and queries
- "rescan" "rescanprogress" "abortscan" "wipecache" "info"
- "total" "genres" "artists" "albums" "songs" "years"
- "musicfolder" "playlists" "tracks" "new" "rename" "delete"
- "edit" "songinfo" "titles" "search" "pragma"
-
- ;; Playlist commands and queries
- "play" "stop" "pause" "mode" "time" "genre" "artist" "album"
- "title" "duration" "remote" "current_title" "path" "playlist"
- "add" "insert" "deleteitem" "move" "delete" "preview" "resume"
- "save" "loadalbum" "addalbum" "loadtracks" "addtracks"
- "insertalbum" "deletealbum" "clear" "zap" "name" "url"
- "modified" "playlistsinfo" "index" "shuffle" "repeat"
- "playlistcontrol"
-
- ;; Compound queries
- "serverstatus" "status" "displaystatus" "readdirectory"
-
- ;; Notifications
-
- ;; Alarm commands and queries
- "alarm" "alarms"
-
- ;; Plugins commands and queries
- "favorites"
- ))))
+ (append
+ (mapcar 'squeeze-player-playerid squeeze-players)
+ '(;; General commands and queries
+ "login" "can" "version" "listen" "subscribe" "pref"
+ "logging" "getstring" "setsncredentials" "debug"
+ "exit" "shutdown"
+
+ ;; Player commands and queries
+ "player" "count" "id" "uuid" "name" "ip" "model" "isplayer"
+ "displaytype" "canpoweroff" "?" "signalstrength" "connected"
+ "sleep" "sync" "syncgroups" "power" "mixer" "volume" "muting"
+ "bass" "treble" "pitch" "show" "display" "linesperscreen"
+ "displaynow" "playerpref" "button" "ir" "irenable"
+ "connect" "client" "forget" "disconnect" "players"
+
+ ;; Database commands and queries
+ "rescan" "rescanprogress" "abortscan" "wipecache" "info"
+ "total" "genres" "artists" "albums" "songs" "years"
+ "musicfolder" "playlists" "tracks" "new" "rename" "delete"
+ "edit" "songinfo" "titles" "search" "pragma"
+
+ ;; Playlist commands and queries
+ "play" "stop" "pause" "mode" "time" "genre" "artist" "album"
+ "title" "duration" "remote" "current_title" "path" "playlist"
+ "add" "insert" "deleteitem" "move" "delete" "preview" "resume"
+ "save" "loadalbum" "addalbum" "loadtracks" "addtracks"
+ "insertalbum" "deletealbum" "clear" "zap" "name" "url"
+ "modified" "playlistsinfo" "index" "shuffle" "repeat"
+ "playlistcontrol"
+
+ ;; Compound queries
+ "serverstatus" "status" "displaystatus" "readdirectory"
+
+ ;; Notifications
+
+ ;; Alarm commands and queries
+ "alarm" "alarms"
+
+ ;; Plugins commands and queries
+ "favorites"
+ )))))
(defun squeeze-read-server-parameters (address port)
(let ((host (read-string "Host: " nil nil address))