forslund / spotify-skill

Mycroft Skill to control spotify using the Spotify Connect API
Apache License 2.0
71 stars 38 forks source link

Auth.py missing; wrong import for SpotifyOAuth #163

Open Wattseheck opened 3 years ago

Wattseheck commented 3 years ago

Describe the bug Auth.py does not install when installing mycroft-spotify. When running Auth.py SpotifyOAuth is loaded from the wrong package and thus fails.

To Reproduce Steps to reproduce the behavior:

  1. Try to run Auth.py
  2. It will fail because it cannot "from spotipy import SpotifyOAuth"

Expected behavior Importing SpotifyOAuth

Solution

  1. SCP Auth.py manually into /opt/mycroft/skills/mycroft-spotify.forslund/
  2. Change "from spotipy import SpotifyOAuth" to "from spotipy.oauth2 import SpotifyOAuth"

Environment (please complete the following information):

Additional context I am sorry. This is literally my first time on GitHub and I am no developer or have any experience. Bear with me if anything is unconventional.

forslund commented 3 years ago

Hi, thanks for reporting :)

A couple of questions

  1. How did you install this update?

Just to verify did you run

source venv-activate.sh

from the mycroft-core folder?

Can you please run mycroft-pip show spotipy to verify that the msm install upgraded to the 2.17.1 version.

Also welcome to github, glad to have you here providing feedback and helping to improve the skill!

Wattseheck commented 3 years ago

Hi, I installed the spotify skill using voice. Then I installed the raspotify as in the instruction of your readme. Then I used source venv-activate.sh from the mycroft-core folder. mycroft-pip show spotipy actually shows that I am running the version 2.4.4. Here it says https://pypi.org/project/spotipy/ latest version is 2.18. I am confused. Thanks for you help

forslund commented 3 years ago

Ok, the spotify skill version hasn't been updated in mycroft-skills store so the latest changes for the manual authentication hasn't been added to that version.

Try asking mycroft to

install the beta version of the spotify skill

which should update the skill to the latest version and update the requirements along with it. (can be some issues though since you've manually added files...).

Currently I think both the __init__.py and spotify.py in the skill folder have old code making it hard to run using the generated auth.

Wattseheck commented 3 years ago

Asking mycroft to install the beta version did not work as mycroft asked me which version I am referring to. I did not know the answer to this. Then I tried the following: Deinstall the skill, reinstall the skill. Copying init.py and auth.py into the folder, made sure they replaced the old ones and match the files on GitHub, changed the requirements.txt to specify spotipy 2.17.1. Run again.

First error: from spotipy import SpotifyOAuth - "cannot import name "SpotifyOAuth" from spotipy. So I went into auth.py and changed it to from spotipy.oauth2 import SpotifyOAuth. This removed the error but threw the next one: auth.py line 45: token_info = am.validate_token(am.cache_handler.get_cached_token()). AttributeError: "SpotifyOAuth" object has no attribute "validate_token"

Since then I am clueless.

Jean28518 commented 3 years ago

I had the same problem.

With .venv activated I typed: pip install spotipy --upgrade Then it worked for me.

Wattseheck commented 3 years ago

Hi, thanks this already helps a lot and brings me one step further. However, the auth then asks to "Enter the URL you were redirected to" I don't understand. I was redirected to nowhere. I entered localhost:8888 but why should this work. Also trying to connect to localhost:8888 does not work. Any idea what I am supposed to enter here?

forslund commented 3 years ago

spotipy should have opened up the browser or showed you a link to paste in the browser. The link would take you to spotify where you allow the application to connect to your account. Afterwards it would redirect you to a https://localhost:8888/[lots of letters and numbers] adress. That address should be pasted back into the auth script (the url contains the information needed by spotipy to create your token)

However if the beta update didn't succeed the rest of the skill won't be able to use the auth token the auth script generates.

@Jean28518 how did you update to the latest version? git pull or msm / voice?

wieluk commented 3 years ago

I have the same problem as Wattseheck ... I don't really understand the last part. I am doing this in a console via ssh so no browser will open up and also no link is shown in terminal.

forslund commented 3 years ago

Thanks for the feedback @wieluk, The lib should have show an url, and if this is missing for you there's a bug. I'll try to reproduce. is this picroft or other system?

wieluk commented 3 years ago

Thanks for your fast answer it is raspbian os 32bit with mycroft installed for linux

jhthompson12 commented 3 years ago

Nothing new to report, im getting the same issue as others when running auth.py. Where things seem to go well until I am prompted to "Enter the URL you were redirected to".

From other comments it seems like the expectation is that, at this point, auth.py is supposed to open a browser window. Has anyone figured out a way to make this work / get the necessary data via an SSH connection to the picroft?

Thanks you! Im very excited to get this working :)

forslund commented 3 years ago

I just pushed a change to enforce showing the link in all cases. let me know if this helps.

wieluk commented 3 years ago

Thanks for the fast change. But now I get this after entering client id and secret.

Traceback (most recent call last): File "/opt/mycroft/skills/mycroft-spotify.forslund/auth.py", line 44, in <modu le> open_browser=False) TypeError: __init__() got an unexpected keyword argument 'open_browser'

I am using this "from spotipy.oauth2 import SpotifyOAuth" suggested by wattseheck instead of the one in your auth.py file because with yours i get this Error ImportError: cannot import name 'SpotifyOAuth' from 'spotipy'

forslund commented 3 years ago

Hmm, could you check the version of spotipy you're using? mycroft-pip show spotipy if it's not 2.17.1 try running mycroft-pip install -r /opt/mycroft/skills/mycroft-spotify.forslund/requirements.txt

(If you've updated with a git pull the version may still be the older one)

jhthompson12 commented 3 years ago

Thanks @forslund! That definitely moved things along!

I was able to successfully get through the auth.py script with your change of open_browser=False. Now If I open Spotify on my phone I can see my Picroft device as an available device and can switch to it to play songs, which is a major improvement (though this seems to cause Mycroft to crash, which is fine for now).

Unfortunately, i am unable to control Spotify with Mycroft because I am prompted to set up my credentials at home.mycroft.ai. But this process seems to be broken too? any interactions with the username / password / connect inputs results in a new page opening with _INVALIDCLIENT: Failed to get client. Do you have any suggestions about this?

wieluk commented 3 years ago

yea for me auth.py works now aswell but same problem with INVALID_CLIENT: Failed to get client.

forslund commented 3 years ago

You shouldn't need to connect in the skill settings. just add username and password and save (auth.py replaces the need for using the web connect flow)

forslund commented 3 years ago

Best test of the skill is to ask what spotify devices are available should tell you if it think's it's authorized.

wieluk commented 3 years ago

well the auth.py doesnt complain it just asks me if I want to save the client secrets i said yes. When I ask what devices are available it answers with >> Unable to authorize with the Spotify service. Please go to Skill settings at home dot mycroft dot ai to verify your username and password and to Connect to Spotify.

forslund commented 3 years ago

Hmm, that is strange. as long as the username and password is set on home.mycroft.ai and auth.py is run it should be able to connect after a restart...

Edit: The user / password requirement thing on home is technically something that can be dropped now, was mainly to not spam the oauth endpoint if the user hadn't set up spotify yet...since that endpoint isn't used anymore it should be safe to just do the auth even if no username is set. Mainly Mark-1 that has use for the username and password since on that platform it runs the spotify player as well.

forslund commented 3 years ago

I've pushed 2 small changes now,

  1. remove the connect button from home.
  2. removed the requirement for user to be set on home
jhthompson12 commented 3 years ago

@forslund, my person! Branch 20.08 is working for me now.

You rule!

forslund commented 3 years ago

Oh, sweet! Thanks for the feedback! Let me know if there are follow up issues.

jhthompson12 commented 3 years ago

I've been playing with it a bit and it seems to be working well!

There's one minor "bug" that isnt really that big of a deal, butlet me know what you think:

Things work perfectly if i initiate the spotify session / playback with a Mycroft voice command. The bug occurs when I initiate the raspberry pi playback directly through the Spotify app (i.e. start playing music on the phone app then change the playback device to be the Picroft device). The device switch and playback works well (i think through a standalone raspotify instance that is not related to mycroft) but if i then try to control the raspberry pi playback with mycroft commands mycroft seems confused and doesnt know that a raspotify session is already in progress. Does this make sense?

So Im wondering if it's possible for mycroft to check if raspotify is already running so that it can interact with it (e.g. "pause tspotify", "turn off spotify", etc.).

Let me know if I should submit a separate issue. Thanks!

forslund commented 3 years ago

That is something I've left out intentionally so far, it hasn't been entirely clear when mycroft should "take control" over the playback. what you write makes sense however, if it's playing on the mycroft device it should be aware and able to control it in any case. please open a separate issue with this and we can continue to discuss the interaction there.

wieluk commented 3 years ago

thanks for me it works now too :)

edit: oh now it doesn't ... the what spotify devices are available works but when I ask for a song or anything else than the devices I get this. Do you know why this could happen?


12:59:43.799 | INFO     | 18935 | Playback Control Skill | Resolving Player for: Play the album Hello Nasty on Spotify
12:59:47.263 | ERROR    | 18935 | mycroft.skills.mycroft_skill.mycroft_skill:on_error:835 | An error occurred while processing a request in Spotify Skill
Traceback (most recent call last):
File "/home/pi/mycroft-core/mycroft/skills/mycroft_skill/event_container.py", line 66, in wrapper handler(message)
File "/home/pi/mycroft-core/mycroft/skills/common_play_skill.py", line 96, in __handle_play_query result = self.CPS_match_query_phrase(search_phrase)
File "/opt/mycroft/skills/mycroft-spotify.forslund/__init__.py", line 435, in CPS_match_query_phrase confidence, data = self.specific_query(phrase, bonus)
File "/opt/mycroft/skills/mycroft-spotify.forslund/__init__.py", line 533, in specific_query match = re.match(self.translate_regex('podcast'), phrase,
File "/opt/mycroft/skills/mycroft-spotify.forslund/__init__.py", line 189, in translate_regex return self.regexes[regex]
KeyError: 'podcast'
Removing event mycroft-playback-control.mycroftai:PlayQueryTimeout

edit: I think I am confused about the recommended install method of spotify skill if I do mycroft msm install github link of this repo I still get a old version I manually updated but it still doesn't play I just get PlayQueryTimeouts.

forslund commented 3 years ago

The traceback looks like some trouble with the translation? Are you running en-us or some other language?

msm -l install mycroft-spotify would be the safest bet (-l is for latest / ignore version submitted to mycroft-skills). Otherwise via voice hey mycroft install the beta version of the spotify skill should(TM) work.

If you did an install using the github link it may have downgraded spotipy for you. Does "what spotify devices are available" still work for you?

Xanaxus commented 3 years ago

I am still facing the issue of authorization:

Unable to authorize with the Spotify service. Please go to Skill settings at home dot mycroft dot ai  to verify your username and password and to Connect to Spotify.

Git status:

On branch 20.08
Your branch is up to date with 'origin/20.08'.

I also entered the details on Mycroft skill workshop button, I was unable to get the connect button like before.

I have done a git clone of this repo into the mycroft-core in its skills folder

Device Info:

  1. Laptop
  2. Manjaro KDE
  3. Main shell: fish but ran the python script in the bash
forslund commented 3 years ago

@Xanaxus did you run the auth.py script successfully after doing the clone? Also you shouldn't have a Connect button to press anymore...

The complete process should be something like this (assuming the skill doesn't exist locally already. if so remove it)

cd /opt/mycroft/skills
git cone https://github.com/forslund/spotify-skill mycroft-spotify.forslund
cd [your mycroft-core dir]
source venv-activate.sh
pip install -r /opt/mycroft/skills/mycroft-spotify.forslund/requirements.txt
python /opt/mycroft/skills/mycroft-spotify.forslund/auth.py

Follow the instructions in the script and chose to save the Client Secret.

./start-mycroft.sh all

Go to the skills page on the mycroft website.

Enter your username and password then hit save. If the skill is up to date there should be no "Connect" button to press.

Now that 21.02 of core is released I should be able to push the update to the skill store removing a couple of these steps making things slightly easier.

alexbk66 commented 2 years ago

I tried the above. When restart MyCroft I get "SpotifySkill | Couldn't fetch credentials"

alexbk66 commented 2 years ago

I tried the above. When restart MyCroft I get "SpotifySkill | Couldn't fetch credentials"

Ok, I forgot source venv-activate.sh

Now I get

you have not yet setup any music skills

Note: I do have listed mycroft-spotify.forslund

pjchamberlain commented 1 year ago

I'm trying to get the spotify skill working on a mycroft that I've installed on a linux desktop.

I've read through the thread above and think I followed all the steps

install the beta version of the spotify skill created a developer app on spotify

source venv-activate.sh and pip install spotipy --upgrade and run auth.py and followed all the instructions

but what I see in the log is the that the skill fails to load.

2022-12-28 16:43:21.868 | ERROR    | 1369931 | mycroft.skills.skill_loader:_load_skill_source:278 | Failed to load skill: mycroft-spotify.forslund (ImportError("cannot import name 'SpotifyO
Auth' from 'spotipy' (/home/patrick/mycroft-core/.venv/lib/python3.10/site-packages/spotipy/__init__.py)"))
Traceback (most recent call last):
  File "/home/patrick/mycroft-core/mycroft/skills/skill_loader.py", line 276, in _load_skill_source
    skill_module = load_skill_module(main_file_path, self.skill_id)
  File "/home/patrick/mycroft-core/mycroft/skills/skill_loader.py", line 72, in load_skill_module
    spec.loader.exec_module(mod)
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/opt/mycroft/skills/mycroft-spotify.forslund/__init__.py", line 39, in <module>
    from .spotify import (MycroftSpotifyCredentials, SpotifyConnect,
  File "/opt/mycroft/skills/mycroft-spotify.forslund/spotify.py", line 13, in <module>
    from .auth import AUTH_DIR, SCOPE
  File "/opt/mycroft/skills/mycroft-spotify.forslund/auth.py", line 20, in <module>
    from spotipy import SpotifyOAuth
ImportError: cannot import name 'SpotifyOAuth' from 'spotipy' (/home/patrick/mycroft-core/.venv/lib/python3.10/site-packages/spotipy/__init__.py)
2022-12-28 16:43:21.872 | ERROR    | 1369931 | mycroft.skills.skill_loader:_communicate_load_status:351 | Skill mycroft-spotify.forslund failed to load
forslund commented 1 year ago

Hi pip install spotipy --upgrade will give you the latest version of spotipy and they've done some changes since the version this skill is using.

Try resetting the version to the expected 2.17.1 (this was installed when you asked mycroft to install the beta version)

source venv-activate.sh
pip install spotipy==2.17.1

and then try to ~run the auth-script~ start the skill.

forslund commented 1 year ago

I've upgraded here and I can't reproduce your issue @pjchamberlain. Could you provide the output from

pip show spotipy

and

python --version

so I can see if I can make a better reproduction of the system.

pjchamberlain commented 1 year ago

Thanks you've indirectly highlighted some problems with my python and pip set up .. I'm on Ubuntu 22.04 and haven't actively touched python or pip for a few years until my Mycroft Mark 2 arrived.

Fixing the issues with python and pip so that the simple commands above run without errors, and then restarting mycroft and repeating all the setup steps .. has got it working. This is with spotipy 2.22.0

Happy days. Thanks for your help. I've learned a lot about mycroft. My next puzzle is what to do with my Mark 2 ..

forslund commented 1 year ago

If you set up the spotify skill on the mark 2 feel free to submit fixes or updates to the readme to get it going.

pjchamberlain commented 1 year ago

Porting skills to the Mark 2 is a bit beyond me at this point.

I hadn't looked at Mycroft code at all until my Mark 2 arrived. There is very little information about getting started on the Mark 2. I followed the guide to porting hello world, and got that working eventually.

I'm not sure what the best way forward is - replace Dinkum on my Mark 2 with something else or to try to learn how to port skills I want onto Dinkum. The mycroft ai forum has a lot of people asking the same question.

forslund commented 1 year ago

My Mark-2 arrived today but will likely not start experimenting with it until after new years. I was thinking of going the "sandbox" way but maybe getting it onto Dinkum is a possibility

leogermani commented 1 year ago

The instructions in this comment worked fine on a Docker instance of mycroft.

Any news on releasing the latest version to the store to make it simpler to install this skill?