committed by
GitHub
5 changed files with 156 additions and 23 deletions
@ -1,9 +1,14 @@ |
|||
bottle==0.12.16 |
|||
certifi==2019.3.9 |
|||
cffi==1.12.3 |
|||
chardet==3.0.4 |
|||
gevent==1.4.0 |
|||
greenlet==0.4.15 |
|||
httplib2==0.12.3 |
|||
idna==2.8 |
|||
pycparser==2.19 |
|||
python-mpd2==1.0.0 |
|||
requests==2.21.0 |
|||
spotify-mpd-sync-weskerfoot==0.0.1 |
|||
spotipy==2.4.4 |
|||
urllib3==1.24.2 |
|||
|
@ -0,0 +1,104 @@ |
|||
# shows a user's playlists (need to be authenticated via oauth) |
|||
|
|||
import threading |
|||
import spotipy.oauth2 as oauth2 |
|||
import spotipy |
|||
import queue |
|||
import os |
|||
from bottle import route, run, response, request |
|||
|
|||
auth_token_queue = queue.Queue() |
|||
event_queue = queue.Queue() |
|||
|
|||
@route('/') |
|||
def index(): |
|||
auth_code = request.query.code |
|||
if auth_code: |
|||
auth_token_queue.put(auth_code) |
|||
return "It worked! You may close this tab now" |
|||
|
|||
return "Oops! Something went wrong. Please file a bug report" |
|||
|
|||
def wait_for_done(task): |
|||
server = threading.Thread(target=task) |
|||
server.daemon = True |
|||
server.start() |
|||
while True: |
|||
event = event_queue.get() |
|||
if event == "done": |
|||
break |
|||
|
|||
def run_server(): |
|||
threading.Thread(target= lambda: wait_for_done(lambda: run(quiet=True, |
|||
host='localhost', |
|||
port=8080))).start() |
|||
|
|||
def prompt_for_user_token(username, scope=None, client_id = None, |
|||
client_secret = None, redirect_uri = None, cache_path = None): |
|||
""" |
|||
prompts the user to login if necessary and returns |
|||
the user token suitable for use with the spotipy.Spotify |
|||
constructor |
|||
|
|||
Parameters: |
|||
|
|||
- username - the Spotify username |
|||
- scope - the desired scope of the request |
|||
- client_id - the client id of your app |
|||
- client_secret - the client secret of your app |
|||
- redirect_uri - the redirect URI of your app |
|||
- cache_path - path to location to save tokens |
|||
""" |
|||
|
|||
if not client_id: |
|||
client_id = os.getenv("SPOTIPY_CLIENT_ID") |
|||
|
|||
if not client_secret: |
|||
client_secret = os.getenv("SPOTIPY_CLIENT_SECRET") |
|||
|
|||
if not redirect_uri: |
|||
redirect_uri = os.getenv("SPOTIPY_REDIRECT_URI", "http://localhost:8080") |
|||
|
|||
if not client_id: |
|||
print(''' |
|||
You need to set your Spotify API credentials. You can do this by |
|||
setting environment variables like so: |
|||
|
|||
export SPOTIPY_CLIENT_ID='your-spotify-client-id' |
|||
export SPOTIPY_CLIENT_SECRET='your-spotify-client-secret' |
|||
export SPOTIPY_REDIRECT_URI='your-app-redirect-url' |
|||
|
|||
Get your credentials at |
|||
https://developer.spotify.com/my-applications |
|||
''') |
|||
raise spotipy.SpotifyException(550, -1, 'no credentials set') |
|||
|
|||
cache_path = cache_path or ".cache-" + username |
|||
sp_oauth = oauth2.SpotifyOAuth(client_id, client_secret, redirect_uri, |
|||
scope=scope, cache_path=cache_path) |
|||
|
|||
# try to get a valid token for this user, from the cache, |
|||
# if not in the cache, the create a new (this will send |
|||
# the user to a web page where they can authorize this app) |
|||
|
|||
token_info = sp_oauth.get_cached_token() |
|||
|
|||
if not token_info: |
|||
run_server() |
|||
auth_url = sp_oauth.get_authorize_url() |
|||
try: |
|||
import webbrowser |
|||
webbrowser.open(auth_url) |
|||
except: |
|||
print("Please navigate here: %s" % auth_url) |
|||
|
|||
response = "%s?code=%s" % (redirect_uri, auth_token_queue.get()) |
|||
event_queue.put("done") |
|||
|
|||
code = sp_oauth.parse_response_code(response) |
|||
token_info = sp_oauth.get_access_token(code) |
|||
# Auth'ed API request |
|||
if token_info: |
|||
return token_info['access_token'] |
|||
else: |
|||
return None |
Loading…
Reference in new issue