-
-
Save samtherussell/335bf9ba75363bd167d2470b8689d9f2 to your computer and use it in GitHub Desktop.
Squeezebox API | |
-------------- | |
This document outlines the JSON RPC interface with a squeezeserver to control and obtain information about squeezeboxes. | |
JSON : JavaScript Object Notation | |
RPC : Remote Procedure Call | |
Uses POST requests sent to: | |
http://<squeezeserver_address>:9000/jsonrpc.js | |
With Content-Type header set to | |
application/json | |
And a JSON object in the body. | |
{'method': 'slim.request', 'params': [<player_mac_address>, <command>]} | |
where <player_mac_address> is the squeezebox's MAC address that you are controlling (or "-" to get server info). | |
and <command> is the command you want to send. | |
# Simple commands: | |
- PLAY: ["play"] | |
- PAUSE: ["pause"], | |
- POWER ON: ["power", "1"], | |
- POWER OFF: ["power", "0"], | |
- VOLUME UP: ["mixer","volume","+<i>"], # <i> is a base 10 number. (volume goes from 0-100) | |
- VOLUME DOWN: ["mixer","volume","-<i>"], | |
- SET VOLUME: ["mixer","volume","<i>"], | |
- SLEEP IN SECONDS: ["sleep","300"], | |
- SLEEP END OF SONG: ["jiveendoftracksleep"], | |
- SKIP: ["playlist","index","+1"], | |
- PREVIOUS: ["playlist","index","-1"], | |
- UNSYNC FROM ALL PLAYERS: ["sync","-"] | |
So to pause the squeezebox with mac address FF:FF:FF:FF you would send the JSON object: | |
{'method': 'slim.request', 'params': ["FF:FF:FF:FF", ["play"]]} | |
To get a player's status use the command: | |
STATUS: ["status","-"] | |
To SYNCHRONISE two players together: | |
'params': [<master>, ["sync",<slave>]] | |
where <master> and <slave> are the player MAC address strings. | |
The slave player will follow the master player. | |
To SWITCH PLAYER from one squeezebox to another. | |
'params': [<either>["switchplayer","from:" + <source>,"to:" + <destination>]] | |
where <source>, <destination> and <either> are the player MAC address strings. | |
The music will be sent from the source player to the destination player. | |
You can get the connected players with: | |
use get number of players first: | |
'params': ["FF:FF:FF:FF", ["player","count", "?"]] | |
Then using returned _count: | |
'params': ["FF:FF:FF:FF", ["players","0", <count>]] | |
You can search for music accroding to a search term by: | |
SEARCH: ["search", <i>, <j>, "term:" + <search_term>] | |
where <search_term> is the search term, | |
<i> is the beginning index, and <j> the finish index. ie. for the first 10 results: i=0, j=10. | |
Once you have obtained the "id" of the music you want to play, you can set it to play on a squeezebox: | |
- ["playlistcontrol", "cmd:"+<cmd>, "artist_id:"+<artist_id>] | |
- ["playlistcontrol", "cmd:"+<cmd>, "album_id:"+<album_id>] | |
- ["playlistcontrol", "cmd:"+<cmd>, "track_id:"+<track_id>] | |
where command is one of: | |
- PLAY NOW: "load" | |
- ADD TO END: "add" | |
- ADD NEXT: "insert" |
If you are doing this from an IP address other than the server's, how do you get around the CORS issue?
Sorry, I ran these requests from a python program not a webpage so I don't know. My intuition would be you'd have to disable CORS protection in the browser or make your webserver do the request not the client browser.
Warnings here that I don't have much of a coding background. Running LMS on an RPi with the Chromecast add-in to play on my speakers. Do you know how to incorporate this into webCoRE? Below is a piston I'm trying to write to play a playlist, but I'd probably first need to start with a single file. Also, I'm having trouble using the commands to figure out the track or album IDs.
Sorry I don't know and don't a have a system to test on at the moment but could image it would take the form:
["playlistcontrol", "cmd:load", "playlist_id:<playlist_id>"]
here is some example rabbit hole to get the track artwork
bash, jq, curl
tested local and Qobuz
MYSERVER="192.168.x.x"
MYSERVERPORT="9000"
MYMACADDR="dc:a6:32:cd:b4:44" #player
MYTRACKID=$(curl -g -X POST -d '{"id":1,"method":"slim.request","params":["'$MYMACADDR'",["'status'","-",1]]}' http://$MYSERVER:$MYSERVERPORT/jsonrpc.js 2>/dev/null |jq -r ".result.playlist_loop[].id")
MYSONGINFO=$(curl -g -X POST -d '{"id":1,"method":"slim.request","params":["'$MYMACADDR'",["'songinfo'","-",100,"'track_id:$MYTRACKID'"]]}' http://$MYSERVER:$MYSERVERPORT/jsonrpc.js 2>/dev/null)
MYCOVERID=$(echo $MYSONGINFO | jq -r ".result.songinfo_loop[] | select(.coverid) | .coverid")
MYARTWORKURL=$(echo $MYSONGINFO | jq -r ".result.songinfo_loop[] | select(.artwork_url) | .artwork_url")
if [[ "$MYARTWORKURL" != "" ]];then
HTTPCOVER=http://$MYSERVER:$MYSERVERPORT$MYARTWORKURL
elif [[ "$MYCOVERID" != "" ]];then
HTTPCOVER=http://$MYSERVER:$MYSERVERPORT/music/$MYCOVERID/cover.jpg
else
HTTPCOVER=
fi
echo $HTTPCOVER
Done. Thanks for the suggestion