Home Assistant custom component to start Spotify playback on an idle chromecast device or a Spotify Connect device (thanks to @kleinc80) which means that you can target your automation for chromecast as well as connect devices.
This component is not meant to be a full Spotify chromecast media_player but only serves to start the playback. Controlling the chromecast device and the Spotify playback after the initial start is done in their respective components. Because starting playback using the API requires more powerful token the username and password used for browser login is used.
Used by https://github.com/custom-cards/spotify-card.
This component is easiest installed using HACS.
Copy all files from custom_components/spotcast/ to custom_components/spotcast/ inside your config Home Assistant directory.
Note that as of v3.5.2 you must also have the official Home Assistant Spotify Integration installed and configured for this custom component to work. This is because it provides the correct device list which has the correct scopes in its token.
Spotcast uses two cookies to authenticate against Spotify in order to have access to the required services.
To obtain the cookies:
- Using Chrome or Edge
- Open url
chrome://settings/cookies/detail?site=spotify.com
- If no cookies appear go to
https://open.spotify.com
and sign-in- Copy content from
sp_dc
andsp_key
cookies
- Using another browser
- Use a browser extension like "Export cookies" and look for
sp_dc
andsp_key
cookies
or
- Open a new Incognito window at https://accounts.spotify.com/en/login?continue=https:%2F%2Fopen.spotify.com%2F
- Open Developer Tools in your browser (might require developer menu to be enabled in some browsers)
- Login to Spotify
- Search/Filter for
get_access_token
in Developer tools under Network.- Under cookies for the request save the values for
sp_dc
andsp_key
- Close the window without logging out (Otherwise the cookies are made invalid)
- Alternatively you can use a browser plugin like "Export cookies".
Add the following to your configuration.yaml:
spotcast:
sp_dc: !secret sp_dc
sp_key: !secret sp_key
Add accounts
dict to the configuration and populate with a list of accounts to
be able to initiate playback using diffferent accounts than the default.
If you are using v3.5.2 or greater and thus also have the core Spotify Integration installed, then the additional accounts will also need to be added there as well for multiple accounts to work.
spotcast:
sp_dc: !secret primary_sp_dc
sp_key: !secret primary_sp_key
accounts:
niklas:
sp_dc: !secret niklas_sp_dc
sp_key: !secret niklas_sp_key
ming:
sp_dc: !secret ming_sp_dc
sp_key: !secret ming_sp_key
The spotcast custom component creates a service called 'spotcast.start' in Home Assistant.
{
"spotify_device_id" : "ab123c5d7347324c2b1234567890f8d6dc40350",
"uri" : "spotify:playlist:37i9dQZF1DX3yvAYDslnv8",
"random_song": true
}
{
"device_name" : "Kök",
"uri" : "spotify:playlist:37i9dQZF1DX3yvAYDslnv8",
"random_song": true
}
where:
spotify_device_id
is the device ID of the Spotify Connect devicedevice_name
is the friendly name of the chromecast deviceuri
is the Spotify uri, supports all uris including track (limit to one track)random_song
optional parameter that starts the playback at a random position in the playlistrepeat
optional parameter that repeats the playlist/trackshuffle
optional parameter to set shuffle mode for playbackoffset
optional parameter to set offset mode for playback. 0 is the first song
Optionally you can specify the entity_id
of an existing Home Assistant chromecast media-player like:
{
"entity_id" : "media_player.vardagsrum",
"uri" : "spotify:playlist:37i9dQZF1DX3yvAYDslnv8"
}
To use the Spotcast service with a Spotify Connect device, you need the spotify_device_id
. To find the spotify_device_id
, enable the debug logs (instructions are in section Enabling Debug Log
in this README), reboot Home Assistant, and go to Configuration >> Logs >> Load Full Home Assistant Log
. Find the log entry get_spotify_devices
and look for the device ID.
- id: 'jul_spotify_spela_julmusik'
alias: Jul spela julmusik
initial_state: 'on'
trigger:
- event_data:
id: remote_fonsterlampor
event: 5002
platform: event
event_type: deconz_event
condition: []
action:
- data:
uri: 'spotify:playlist:56Bor5fbMJlJV7oryb2p3k'
random_song: true
shuffle: true
start_volume: 50
entity_id: media_player.gh_kok
service: spotcast.start
Omitting uri
will transfer the playback to the specified device.
{
"device_name" : "Högtalare uppe"
}
Use the parameter force_playback
to continue the user's playback even if nothing is currently playing.
{
"device_name" : "MultiRoom",
"force_playback" : true
}
where:
device_name
is the friendly name of the chromecastforce_playback
(optional) true or false, true to continue the user's playback even if nothing is currently playing
{
"account":"niklas",
"device_name" : "Kök",
"uri" : "spotify:playlist:37i9dQZF1DX3yvAYDslnv8"
}
where:
account
is the name of account key in the accounts dictionary in the configurationdevice_name
is the friendly name of the chromecasturi
is the Spotify uri, supports all uris including track (limit to one track)
Play the latest episode of a given podcast show.
{
"account":"niklas",
"device_name" : "Kök",
"uri" : "spotify:show:6PeAI9SHRZhghU7NRPXvT3"
"ignore_fully_played": true
}
where
account
is the name of account key in the accounts dictionary in the configurationdevice_name
is the friendly name of the Chromecasturi
is the spotify uri, (podcasts use the 'show' uri)ignore_fully_played
(optional) true or false, true to ignore already fully played episodes (defaults to false and play the latest released episode)
The sensor has the discovered chromecasts as both json and an array of objects. Since v3.4.0 it does not do its own discovery but relies on data from core cast. Add the following to the sensor section of the configuration:
sensor:
- platform: spotcast
Sensor name:
sensor.chromecast_devices
Attributes
devices_json: [
{
"name": "Kök",
"cast_type": "audio",
"model_name": "Google Home",
"uuid": "xxxxx",
"manufacturer": "Google Inc."
},
{
"name": "Högtalare uppe",
"cast_type": "group",
"model_name": "Google Cast Group",
"uuid": "xxxx",
"manufacturer": "Google Inc."
},
{
"name": "Vardagsrum",
"cast_type": "cast",
"model_name": "HK Citation 300",
"uuid": "xxxx",
"manufacturer":"Harman Kardon"
}
]
last_update: 2019-05-01T15:27:49.828553+02:00
friendly_name: Chromecast Devices
The components websocket api. Example usage:
// Retrieve playlists
const res = await this.props.hass.callWS({
type: 'spotcast/playlists',
playlist_type: 'featured', // one of 'user', 'discover-weekly' and 'featured'
country_code: 'SV', // Optional country code used by featured playlists
limit: 20, // Optional limit, default is 10
account: 'ming' // optional account name
});
// Retrieve devices
const res = await this.props.hass.callWS({
type: 'spotcast/devices',
account: 'ming' // optional account name
});
// Retrieve player
const res = await this.props.hass.callWS({
type: 'spotcast/player',
account: 'ming' // optional account name
});
In configuration.yaml for you HA add and attach those the relevant logs. Be sure to disable it later as it is quite noisy.
logger:
default: info
logs:
custom_components.spotcast: debug
If you like what I do and want to support me - I love coffee!
Please do! Open a Pull Request with your improvements.
Apache 2.0