Squeezebox Intregration Complete controls with multiple squeezeboxs and LMS

I’ve been searching for a few weeks on how to fully intregrate LMS and my squeezeboxs in HA. I"ve had the squeezebox intregration setup and working, playing my alarm siren if my alarm was triggered, but what i really wanted was “Spotty” (spotify in LMS) access to play certain playlists, songs, albums with automations.

Searching the web and this site, i didn’t really find much. Until i found a Github that was sourced from the slimdevices fourm for the LMS server. In it it gave all the CLI commands that can be pushed to the server to get songs, sync players and do whatever else you need.

I’m a long time lurker, first time poster and figured i would share my Node-Red flow with all the basic controls for both my players in the house.

i’ve spent about a week getting it all working and figured out, with minor issues, this is just about everything i would want to do.

Local play is done directly through the material skin in LMS as a iframe card, which is the best, so i was mainly concerned on how to make songs play though automations, and this is what i came up with…

Start of Node Red Flow…

[{“id”:“0e7b7842e4b1827a”,“type”:“tab”,“label”:“LMS Controls”,“disabled”:false,“info”:"",“env”:[]},{“id”:“b953f846207bf3ff”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Playlist “Afternoon” on Andrew’s Room”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.andrews_room”,“data”:"{\t “command”:“playlist”,\t “parameters”:[\t “play”,\t “Spotify”\t ]\t}",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:620,“y”:260,“wires”:[[]]},{“id”:“a1d12490b8077d6f”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Play Playlist”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:310,“y”:260,“wires”:[[“b953f846207bf3ff”]]},{“id”:“62541b1f58773f69”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Vol up +10”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:300,“y”:560,“wires”:[[“9226ba3f84aa2726”]]},{“id”:“9296bb0073e0292b”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Vol Down -10”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:310,“y”:620,“wires”:[[“25894137513aca94”]]},{“id”:“25894137513aca94”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Volume Down 10”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.andrews_room”,“data”:"{\t “command”:“mixer”,\t “parameters”:[\t “volume”,\t “-10”\t ]\t}\t\t",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:550,“y”:620,“wires”:[[]]},{“id”:“9226ba3f84aa2726”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Volume up 10”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.andrews_room”,“data”:"{\t “command”:“mixer”,\t “parameters”:[\t “volume”,\t “+10”\t ]\t}\t\t",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:540,“y”:560,“wires”:[[]]},{“id”:“ac238279ecd1c6c1”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Pause Current”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.andrews_room”,“data”:"{\t “command”:“pause”\t \t \t}",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:540,“y”:380,“wires”:[[]]},{“id”:“529c96e522b89e6c”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Pause”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:290,“y”:380,“wires”:[[“ac238279ecd1c6c1”]]},{“id”:“9bb0b6b58f2d9eb4”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Pause Current”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.andrews_room”,“data”:"{\t “command”:“play”\t \t \t}",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:540,“y”:320,“wires”:[[]]},{“id”:“de75a310dbaca1b4”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Play”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:290,“y”:320,“wires”:[[“9bb0b6b58f2d9eb4”]]},{“id”:“5a9a8617b922e3c2”,“type”:“comment”,“z”:“0e7b7842e4b1827a”,“name”:“LMS in Andrew’s room”,“info”:"",“x”:190,“y”:180,“wires”:[]},{“id”:“81ae92fb7e82fc29”,“type”:“comment”,“z”:“0e7b7842e4b1827a”,“name”:“LMS in Living room”,“info”:"",“x”:190,“y”:700,“wires”:[]},{“id”:“70e0da1726cf3022”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Playlist “Morning” in LIving Room”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.living_room”,“data”:"{\t “command”:“playlist”,\t “parameters”:[\t “play”,\t “Spotify”\t ]\t}",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:600,“y”:780,“wires”:[[]]},{“id”:“ad62115f8ce0011b”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Play Playlist”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:310,“y”:780,“wires”:[[“70e0da1726cf3022”]]},{“id”:“3db656ce5de91699”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Pause Current”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.living_room”,“data”:"{\t “command”:“pause”\t \t \t}",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:540,“y”:900,“wires”:[[]]},{“id”:“d6b8b801026eded1”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Pause”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:290,“y”:900,“wires”:[[“3db656ce5de91699”]]},{“id”:“cb8521aec598fbfc”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Pause Current”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.living_room”,“data”:"{\t “command”:“play”\t \t \t}",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:540,“y”:840,“wires”:[[]]},{“id”:“55635bf8df2beafd”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Play”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:290,“y”:840,“wires”:[[“cb8521aec598fbfc”]]},{“id”:“436049cd94e17f34”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Skip Forward +1”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.andrews_room”,“data”:"{\t “command”:“playlist”,\t “parameters”:[\t “index”,\t “+1”\t ]\t}",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:540,“y”:440,“wires”:[[]]},{“id”:“0be75ef39c5079ea”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Skip Forward +1”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:320,“y”:440,“wires”:[[“436049cd94e17f34”]]},{“id”:“e87dd9a7dc0510dd”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Skip Back -1”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.andrews_room”,“data”:"{\t “command”:“playlist”,\t “parameters”:[\t “index”,\t “-1”\t ]\t}",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:530,“y”:500,“wires”:[[]]},{“id”:“1532a348b9d114eb”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Skip Back -1”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:310,“y”:500,“wires”:[[“e87dd9a7dc0510dd”]]},{“id”:“ea04b4eb55f0dc15”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Vol up +10”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:300,“y”:1080,“wires”:[[“7c2d16f1db1579e2”]]},{“id”:“ae20baf0fb0a88bf”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Vol Down -10”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:310,“y”:1140,“wires”:[[“10c78cdbfc81c4fe”]]},{“id”:“10c78cdbfc81c4fe”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Volume Down 10”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.living_room”,“data”:"{\t “command”:“mixer”,\t “parameters”:[\t “volume”,\t “-10”\t ]\t}\t\t",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:550,“y”:1140,“wires”:[[]]},{“id”:“7c2d16f1db1579e2”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Volume up 10”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.living_room”,“data”:"{\t “command”:“mixer”,\t “parameters”:[\t “volume”,\t “+10”\t ]\t}\t\t",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:540,“y”:1080,“wires”:[[]]},{“id”:“2f02b1995c064a70”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Skip Forward +1”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.living_room”,“data”:"{\t “command”:“playlist”,\t “parameters”:[\t “index”,\t “+1”\t ]\t}",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:540,“y”:960,“wires”:[[]]},{“id”:“7b41cb49a220fbd3”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Skip Forward +1”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:320,“y”:960,“wires”:[[“2f02b1995c064a70”]]},{“id”:“fb7a58ff0448ead5”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Skip Back -1”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“call_method”,“entityId”:“media_player.living_room”,“data”:"{\t “command”:“playlist”,\t “parameters”:[\t “index”,\t “-1”\t ]\t}",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:530,“y”:1020,“wires”:[[]]},{“id”:“95391faaec04b495”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Skip Back -1”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:310,“y”:1020,“wires”:[[“fb7a58ff0448ead5”]]},{“id”:“6224041aa8e9a89e”,“type”:“comment”,“z”:“0e7b7842e4b1827a”,“name”:“Sync Players”,“info”:"",“x”:170,“y”:1240,“wires”:[]},{“id”:“4cd37497555f3f8c”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Sync to Andrew”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:320,“y”:1320,“wires”:[[“ce90811304a21b2a”]]},{“id”:“ce90811304a21b2a”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Sync LV to Andrew”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“sync”,“entityId”:“media_player.living_room”,“data”:"{“other_player”:“media_player.andrews_room”}",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:550,“y”:1320,“wires”:[[]]},{“id”:“dc1ccbed2f285e55”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Sync to LV”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:300,“y”:1380,“wires”:[[“dd33d22ea421937e”]]},{“id”:“dd33d22ea421937e”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Sync Andrew to LV”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“sync”,“entityId”:“media_player.andrews_room”,“data”:"{“other_player”:“media_player.living_room”}",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:550,“y”:1380,“wires”:[[]]},{“id”:“98ffca565577c9cb”,“type”:“inject”,“z”:“0e7b7842e4b1827a”,“name”:“Unsync All”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:300,“y”:1440,“wires”:[[“3decbd0bca9f7579”]]},{“id”:“3decbd0bca9f7579”,“type”:“api-call-service”,“z”:“0e7b7842e4b1827a”,“name”:“Sync Andrew to LV”,“server”:“634d39a.94f0cc8”,“version”:3,“debugenabled”:false,“service_domain”:“squeezebox”,“service”:“unsync”,“entityId”:“media_player.andrews_room”,“data”:"",“dataType”:“jsonata”,“mergecontext”:"",“mustacheAltTags”:false,“outputProperties”:[],“queue”:“none”,“x”:550,“y”:1440,“wires”:[[]]},{“id”:“8b4019b39fcaca0f”,“type”:“comment”,“z”:“0e7b7842e4b1827a”,“name”:“List of LMS commands found here (see descripton)”,“info”:“Github where everything is to the point…\nhttps://gist.github.com/samtherussell/335bf9ba75363bd167d2470b8689d9f2\n\n\n\n\nOff the LMS server for complete commands\nhttp://192.168.2.11:9000/html/docs/cli-api.html?player=#mixer%20volume\n\n\n\n\n\n\n\n\n\nBelow is Directly off the Github…\n…Didn’t want to loose access\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nSqueezebox API\n--------------\nThis document outlines the JSON RPC interface with a squeezeserver to control and obtain information about squeezeboxes.\n\nJSON : JavaScript Object Notation\nRPC : Remote Procedure Call\n\nUses POST requests sent to:\nhttp://<squeezeserver_address>:9000/jsonrpc.js\n\nWith Content-Type header set to\napplication/json\n\nAnd a JSON object in the body.\n{‘method’: ‘slim.request’, ‘params’: [<player_mac_address>, ]}\n\nwhere <player_mac_address> is the squeezebox’s MAC address that you are controlling (or “-” to get server info).\nand is the command you want to send.\n\n# Simple commands:\n\n - PLAY: [“play”]\n - PAUSE: [“pause”],\n - POWER ON: [“power”, “1”],\n - POWER OFF: [“power”, “0”],\n - VOLUME UP: [“mixer”,“volume”,”+"], # is a base 10 number. (volume goes from 0-100)\n - VOLUME DOWN: [“mixer”,“volume”,"-"],\n - SET VOLUME: [“mixer”,“volume”,""],\n - SLEEP IN SECONDS: [“sleep”,“300”],\n - SLEEP END OF SONG: [“jiveendoftracksleep”],\n - SKIP: [“playlist”,“index”,"+1"],\n - PREVIOUS: [“playlist”,“index”,"-1"],\n - UNSYNC FROM ALL PLAYERS: [“sync”,"-"]\n\nSo to pause the squeezebox with mac address FF:FF:FF:FF you would send the JSON object:\n{‘method’: ‘slim.request’, ‘params’: [“FF:FF:FF:FF”, [“play”]]}\n\n\nTo get a player’s status use the command:\nSTATUS: [“status”,"-"]\n\nTo SYNCHRONISE two players together:\n’params’: [, [“sync”,]]\nwhere and are the player MAC address strings.\nThe slave player will follow the master player.\n\nTo SWITCH PLAYER from one squeezebox to another.\n’params’: [[“switchplayer”,“from:” + ,“to:” + ]]\nwhere , and are the player MAC address strings.\nThe music will be sent from the source player to the destination player.\n\nYou can get the connected players with:\nuse get number of players first:\n’params’: [“FF:FF:FF:FF”, [“player”,“count”, “?”]]\nThen using returned _count:\n’params’: [“FF:FF:FF:FF”, [“players”,“0”, ]]\n\nYou can search for music accroding to a search term by:\nSEARCH: [“search”, , , “term:” + <search_term>]\nwhere <search_term> is the search term,\n is the beginning index, and the finish index. ie. for the first 10 results: i=0, j=10.\n\nOnce you have obtained the “id” of the music you want to play, you can set it to play on a squeezebox:\n - [“playlistcontrol”, “cmd:”+, “artist_id:”+<artist_id>]\n - [“playlistcontrol”, “cmd:”+, “album_id:”+<album_id>]\n - [“playlistcontrol”, “cmd:”+, “track_id:”+<track_id>]\n\nwhere command is one of:\n - PLAY NOW: “load”\n - ADD TO END: “add”\n - ADD NEXT: “insert”",“x”:430,“y”:1580,“wires”:[]},{“id”:“634d39a.94f0cc8”,“type”:“server”,“name”:“Home Assistant”,“version”:2,“addon”:true,“rejectUnauthorizedCerts”:true,“ha_boolean”:“y|yes|true|on|home|open”,“connectionDelay”:true,“cacheJson”:true,“heartbeat”:false,“heartbeatInterval”:30}]

End of Node Red Flow

Just in case anyone finds this – if youd like to play a Spotify track through Spotty on a Squeezebox player, all you need to do is to go to the Spotify web player, find the album/playlist you want to play, copy the URL and put it in as a parameter for your squeezebox service command, e.g.

    - service: squeezebox.call_method
      data:
        entity_id: media_player.squeeze_lounge
        command: playlist
        parameters:
          - play
          - "https://open.spotify.com/playlist/2xxam29MsK4CIF6VqXQjWd"

Even better, if you want to access the entire Favorites List, just add an iFrame-Card to your dashboard and have it calling the favorites list of LMS like
http://YourLMSserverIp:9000/plugins/Favorites/index.html
Does not look very nice, but it works. When you click on a favorites icon, the play button appears on the right hand side and you can select the entry you want.
For sure, you would need all Spotify (and other) playlists you want to access to the favorites list on LMS first. But works with local music on my LMS, internet radio, Spotify or Digitally Imported for me.