Spotify Playlist Player

I assume this is only working for those with a paid subscription?

As a non-paid user, I get the following error:

 spotipy.client.SpotifyException: http status: 403, code:-1 - https://api.spotify.com/v1/me/player/volume?volume_percent=30:
 Not available for the current user

Yeah, you need a premium (paid) account for API controls to work.

Nice project but in my config there is a problem. Any ideas?

2017-10-31 07:31:25 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/lib/python3.4/asyncio/tasks.py", line 233, in _step
result = coro.throw(exc)
  File "/srv/homeassistant/homeassistant_venv/lib/python3.4/site-packages/homeassistant/core.py", line 1026, in _event_to_service_call
yield from service_handler.func(service_call)
  File "/srv/homeassistant/homeassistant_venv/lib/python3.4/site-packages/homeassistant/components/media_player/__init__.py", line 408, in async_service_handler
yield from getattr(player, method['method'])(**params)
  File "/usr/lib/python3.4/asyncio/futures.py", line 388, in __iter__
yield self  # This tells Task to wait for completion.
  File "/usr/lib/python3.4/asyncio/tasks.py", line 286, in _wakeup
value = future.result()
  File "/usr/lib/python3.4/asyncio/futures.py", line 277, in result
raise self._exception
  File "/usr/lib/python3.4/concurrent/futures/thread.py", line 54, in run
result = self.fn(*self.args, **self.kwargs)
  File "/srv/homeassistant/homeassistant_venv/lib/python3.4/site-packages/homeassistant/components/media_player/spotify.py", line 241, in select_source
self._player.transfer_playback(self._devices[source],
KeyError: 'Kƶk'

ok got all working but i used input_number instead of input_slider for the same result

About this shuffle mode does it always play the same 1rst track then start shuffeling at the 2nd one?
or how does this work cause i have:

spotify_music:
 alias: 'Spotify Playlist'
 sequence:
  - service: media_player.volume_set
    data:
      entity_id: media_player.spotify
      volume_level: '0.20'
  -  service: media_player.select_source
     data_template:
       entity_id: media_player.spotify
       source: >
        {% if is_state("input_select.spotify_source", "Timos Echo Dot") %} Timos Echo Dot
        {% endif %}
  -  service: media_player.play_media
     data_template:
       entity_id: media_player.spotify
       media_content_type: playlist
       media_content_id: >
        {% if is_state("input_select.spotify_playlist", "Trap/Festival Trap") %} spotify:user:1245722571:playlist:2KalbFVILCxGne9SoUfa5Y
        {% elif is_state("input_select.spotify_playlist", "Future House Mix") %} spotify:user:futureofhouse:playlist:0vfpDUvR2cQgbvM9F4SQNU
        {% elif is_state("input_select.spotify_playlist", "Hardstyle Mix") %} spotify:user:hard-with-style:playlist:0WbkpMEQVm8eiTdiI2WfzH
        {% elif is_state("input_select.spotify_playlist", "EDM Mix") %} spotify:user:spinninrecordsofficial:playlist:4173ENNA5eMzHrz9pipvxI
        {% endif %}
  -  service: media_player.shuffle_set
     data: 
       entity_id: media_player.spotify
       shuffle: true

I updated the code to work in Home Assistant 0.59.2. I implemented the code as a ā€œpackageā€ (see code below). I did this before I realized Iā€™d be foiled by not having a premium account to use the API controls though heh. So ā€¦ itā€™s untested (I get the same error as switched). Thank you to GigabitGuy!

\\HASSIO\config\configuration.yaml: (relevant excerpts)

homeassistant:
#...
  # Extra code is stored in these package.  Look for more variable names here
  packages: 
    pack_1: !include custom_components/spotify_playlist_player.yaml

#...
http:
  # Secrets are defined in the file secrets.yaml
  # api_password: !secret http_password
  # Uncomment this if you are using SSL/TLS, running in Docker container, etc.
  # base_url: example.xxxxxxxxxx.org:8123
  base_url: xxxxxxxxxx.duckdns.org
      #base_url needed for Spotify component
  api_password: xxxxxxxxxxxx
  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem

media_player:
#...
# Spotify media player only displays artwork of currently playing songs.  It leaves the artwork up after Spotify is off.  Also, no controls work (play/pause/stop/forward/back).  Chromecast Audio works for displaying the same artwork and stopping play.
  - platform: spotify
    client_id:  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    client_secret:  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    aliases:
          xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: 'Web Player (Chrome)'
         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: 'All Home Speakers'

.

\\HASSIO\config\custom_components\spotify_playlist_player.yaml:

group:
    music_spotify:
      name: Music 
      entities:
      - input_select.spotify_playlist
      - input_select.spotify_source
      - script.spotify_music
      - input_number.spotify_volume

#Use this to find aliases for your spotify media_player component (in your configuration.yaml file).  Look at home-assistant.log to find the aliases of your components.  Enter these aliases into that component in configuration.yaml.
# https://home-assistant.io/components/media_player.spotify/
logger:
    default: warning
    logs:
        homeassistant.components.media_player.spotify: info
      
homeassistant:
  customize:
    script.spotify_music:
      friendly_name: 'Play'
      icon: mdi:play

input_number:
  spotify_volume:
    name: Volume
    icon: mdi:volume-high
    min: 0
    max: 1
    step: 0.05

input_select:
  spotify_playlist:
    name: 'Playlist:'
    options:
      - Your Favorite Coffehouse
      - Morning Commute
      - Cinematic Chill-Out
      - FUTURESYNTH
      - From a Smokey Bar
      - Piano in the Background
    initial: Your Favorite Coffehouse
    icon: mdi:spotify
  spotify_source:
    name: 'Source:'
    options:
      - All Home Speakers
      - Bedroom Speakers
      - Livingroom Speakers
      - Kitchen Speakers
      - Bathroom Speakers
      - PS4-353
    initial: All Home Speakers
    icon: mdi:speaker-wireless

script:
    spotify_music:
    #alias: Play selected spotify playlist
        sequence:
          - service: media_player.volume_set
            data:
              entity_id: media_player.spotify
              volume_level: '0.40'
          -  service: media_player.select_source
             data_template: 
               entity_id: media_player.spotify
               source: >
                {% if is_state("input_select.spotify_source", "All Home Speakers") %} All Home Speakers
                {% elif is_state("input_select.spotify_source", "Bedroom Speakers") %} Bedroom Speakers
                {% elif is_state("input_select.spotify_source", "Livingroom Speakers") %} Livingroom Speakers
                {% elif is_state("input_select.spotify_source", "Kitchen Speakers") %} Kitchen Speakers
                {% elif is_state("input_select.spotify_source", "Bathroom Speakers") %} Bathroom Speakers
                {% elif is_state("input_select.spotify_source", "PS4-353") %} PS4-353
                {% endif %}
          -  service: media_player.play_media
             data_template:
               entity_id: media_player.spotify
               media_content_type: playlist
               media_content_id: >
                {% if is_state("input_select.spotify_playlist", "Morning Commute") %} spotify:user:spotify:playlist:37i9dQZF1DX2MyUCsl25eb
                {% elif is_state("input_select.spotify_playlist", "Cinematic Chill-Out") %} spotify:user:spotify:playlist:37i9dQZF1DWVFJtzvDHN4L
                {% elif is_state("input_select.spotify_playlist", "FUTURESYNTH") %} spotify:user:12131571557:playlist:2JgjNysZhksrtRjuGbbWns
                {% elif is_state("input_select.spotify_playlist", "From a Smokey Bar") %} spotify:user:spotify:playlist:37i9dQZF1DWTlzJXLRpd4a 
                {% elif is_state("input_select.spotify_playlist", "Piano in the Background") %} spotify:user:spotify:playlist:37i9dQZF1DX7K31D69s4M1
                {% elif is_state("input_select.spotify_playlist", "Your Favorite Coffehouse") %} spotify:user:spotify:playlist:37i9dQZF1DX6ziVCJnEm59
                {% endif %}
            
automation:
  - alias: 'Set Spotify Volume'
    trigger:
        platform: state
        entity_id: input_number.spotify_volume
    action:
        service: media_player.volume_set
        data_template:
          entity_id: media_player.spotify
          volume_level: '{{  states.input_number.spotify_volume.state  }}'
3 Likes

Great work @Wheezy, I didnā€™t know about the new package feature, as I have been away from HA a while. Iā€™m having huge issues with automations in general after trying to split it up/being away for a couple of months, maybe this approach can fix my issues as well.

1 Like

Iā€™m going nuts over this! Iā€™ve must have tried a hundred different combinations of base_urls and redirect URIā€™s to no avail, I get either an Error 500 or a Invalid redirect URI no matter what I do.

The firewall ports are open, I can access HASS from outside my LAN, so my Duckdns redirect is working. Iā€™ve tried using the local server IP as URI, Iā€™ve tried my Duckdns address, with and without trailing slashes or port numbers. Still I get an error all the time. What am I doing wrong?

configuration.yaml:

http:
  # Uncomment this to add a password (recommended!)
  api_password: xXxXxXxXxXx
  # Uncomment this if you are using SSL or running in Docker etc
  base_url: XxXxXxXxXxX.duckdns.org
media_player:
  - platform: cast
    host: 192.168.1.152 #Kitchen 
  - platform: spotify
    client_id: XxXxXxXxXxXXxXxXxXxXxXXxXxXxXxXxX
    client_secret: xXxXxXxXxXxxXxXxXxXxXxxXxXxXxXxXx

Screenshot from 2017-12-16 22-54-27
(Yes, I have saved them)

From the log:
2017-12-16 22:57:47 INFO (Thread-5) [homeassistant.components.media_player.spotify] no token; requesting authorization

The last times I ran the authorization before writing this post, I got an INVALID_CLIENT: Invalid redirect URI in my browser, it doesnā€™t matter if I use my internal IP:port or my Duckdns address. Neither the HASS log or the journalctl output will give me any more details on whats wrong.

Edit: after changing my base_url to my local IP for the umptieth time it suddenly works.

http:
  # Uncomment this to add a password (recommended!)
  api_password: xXxXxXxXxXx
  # Uncomment this if you are using SSL or running in Docker etc
  base_url: http://192.168.x.xx:8123 # 

Spotify whitelist as above.

Now that the authorization is done I just have to get it working too, that seems easier said than doneā€¦

With all respect @bonterra, but I donā€™t think this is the thread to be doing component troubleshooting in, and you might get better help in a dedicated thread. :wink:

Yeah, youā€™re probably right. Eventually I did get the authorization to succeed though, I added my details to my post above. Iā€™ll give @Wheezyā€™s package a try once I find some time to sit down.

Easy workaround: Just automatically skip to the next track once shuffle is enabled.

      - service: media_player.media_next_track
        data:
          entity_id: media_player.spotify
2 Likes

Hey Home Assistant Community,

I figured out a way to accomplish casting Spotify Playlists to Chromecast Audioā€™s through Home Assistant. I use this project in tandem with a writeup on Mopidy and Icecast2, can be found here: https://www.vittoriomonaco.de/home-automation-part-7.html

You can use my adaptation here:
https://github.com/robwolff3/homeassistant-config/blob/master/packages/audiocontrol.yaml

From my testing so far it works pretty well.

4 Likes

dude this is exactly what i need, basically commenting to remember for later so i can adjust mine. I thought that w should ahve ability to set the text and value on input_selects so we donā€™t have to do anything weird.

Nice @robwolff3, I tried to play with Mopidy earlier on, but newer really got it going - that tutorial was just what I neededā€¦ Maybe its time to revisit and update this when I have the time.

Commenting to setup myself soon. Thanks for all the code :slight_smile:

Great trick!
How did you set up your ā€˜All Home Speakersā€™ ? I can play only one device with spotifyā€¦

In gh, you can create groups of speakers containing chromecast audio and gh devices. Name it and it will show up as a new device that you can cast to.

I have this configuration, the playlist select works fine, but the source not at all. Any hints?
Other thing, do I need the below automation, for?

script:
  spotify_music:
    alias: Play selected spotify playlist
    sequence:
      - service: media_player.volume_set
        data:
          entity_id: media_player.spotify
          volume_level: ā€˜{{ states.input_number.spotify_volume.state }}ā€™
      -  service: media_player.select_source
         data_template: 
           entity_id: media_player.spotify
           source: >
            {% if is_state("input_select.spotify_source", "Portable speaker") %} Portable speaker
            {% elif is_state("input_select.spotify_source", "Living room speaker") %} Living room speaker
            {% elif is_state("input_select.spotify_source", "Dining room speaker") %} Dining room speaker
            {% elif is_state("input_select.spotify_source", "Guest room speaker") %} Guest room speaker
            {% elif is_state("input_select.spotify_source", "Master bedroom speaker") %} Master bedroom speaker
            {% elif is_state("input_select.spotify_source", "Irma room speaker") %} Irma room speaker
            {% elif is_state("input_select.spotify_source", "Portable and dining room") %} Portable and dining room
            {% elif is_state("input_select.spotify_source", "All speakers") %} All speakers
            {% elif is_state("input_select.spotify_source", "First floor speakers") %} First floor speakers
            {% elif is_state("input_select.spotify_source", "SHIELD") %} SHIELD
            {% endif %}
      -  service: media_player.play_media
         data_template:
           entity_id: media_player.spotify
           media_content_type: playlist
           media_content_id: >
            {% if is_state("input_select.spotify_playlist", "Morning Commute") %} spotify:user:spotify:playlist:37i9dQZF1DX2MyUCsl25eb
            {% elif is_state("input_select.spotify_playlist", "Cinematic Chill-Out") %} spotify:user:spotify:playlist:37i9dQZF1DWVFJtzvDHN4L
            {% elif is_state("input_select.spotify_playlist", "FUTURESYNTH") %} spotify:user:12131571557:playlist:2JgjNysZhksrtRjuGbbWns
            {% elif is_state("input_select.spotify_playlist", "From a Smokey Bar") %} spotify:user:spotify:playlist:37i9dQZF1DWTlzJXLRpd4a 
            {% elif is_state("input_select.spotify_playlist", "Piano in the Background") %} spotify:user:spotify:playlist:37i9dQZF1DX7K31D69s4M1
            {% elif is_state("input_select.spotify_playlist", "Romance") %} spotify:user:claudioita:playlist:1xntGadjxisaQNyuqh5Zyn
            {% elif is_state("input_select.spotify_playlist", "Sleeping") %} spotify:user:claudioita:playlist:3obCZpU1YpzZbzTr45B7gM
            {% endif %}


automation:
 - alias: Set Spotify Source
    trigger:
      - platform: state
        entity_id: input_select.spotify_source
    condition:
      - condition: template
        value_template: "{{ not is_state_attr('media_player.spotify', 'source', states('input_select.spotify_source')) }}"
    action:
      - service: media_player.select_source
        entity_id: media_player.spotify
        data_template:
          source: "{{ states('input_select.spotify_source') }}"
 - alias: Set Spotify Playlist
    trigger:
      - platform: state
        entity_id: input_select.spotify_playlist
    condition:
      - condition: template
        value_template: "{{ not is_state_attr('media_player.spotify', 'source', states('input_select.spotify_playlist')) }}"
    action:
      - service: media_player.media_play
        entity_id: media_player.spotify
        data_template:
          source: "{{ states('input_select.spotify_playlist') }}"
1 Like

Shouldnā€™t all the entity_idā€™s created by the package have audiocontrol_ infront of them? Isnā€™t that what a package does?

Iā€™ve just started using packages and I had to make a few amendments to the last one I tried because of thisā€¦

Edit: Also, your package has an entity_id ā€œscript.playlist_remoteā€ in a group, but doesnā€™t actually exist in the package.

Edit2: Nevermind, got it all working, found the script elsewhere in your config. THANKS!

Hi, I also could not find that script: script.playlist_remote
Any hint about where to look for?

Thanks in advance.