mirror of
https://github.com/spotipy-dev/spotipy.git
synced 2026-06-19 01:03:53 +00:00
114 lines
4.1 KiB
Python
114 lines
4.1 KiB
Python
"""
|
|
Prerequisites
|
|
|
|
pip3 install spotipy Flask Flask-Session
|
|
|
|
// from your [app settings](https://developer.spotify.com/dashboard/applications)
|
|
export SPOTIPY_CLIENT_ID=client_id_here
|
|
export SPOTIPY_CLIENT_SECRET=client_secret_here
|
|
export SPOTIPY_REDIRECT_URI='http://127.0.0.1:8080' // must contain a port
|
|
// SPOTIPY_REDIRECT_URI must be added to your [app settings](https://developer.spotify.com/dashboard/applications)
|
|
OPTIONAL
|
|
// in development environment for debug output
|
|
export FLASK_ENV=development
|
|
// so that you can invoke the app outside of the file's directory include
|
|
export FLASK_APP=/path/to/spotipy/examples/app.py
|
|
|
|
// on Windows, use `SET` instead of `export`
|
|
|
|
Run app.py
|
|
|
|
python3 app.py OR python3 -m flask run
|
|
NOTE: If receiving "port already in use" error, try other ports: 5000, 8090, 8888, etc...
|
|
(will need to be updated in your Spotify app and SPOTIPY_REDIRECT_URI variable)
|
|
"""
|
|
|
|
import os
|
|
from flask import Flask, session, request, redirect
|
|
from flask_session import Session
|
|
import spotipy
|
|
|
|
app = Flask(__name__)
|
|
app.config['SECRET_KEY'] = os.urandom(64)
|
|
app.config['SESSION_TYPE'] = 'filesystem'
|
|
app.config['SESSION_FILE_DIR'] = './.flask_session/'
|
|
Session(app)
|
|
|
|
|
|
@app.route('/')
|
|
def index():
|
|
|
|
cache_handler = spotipy.cache_handler.FlaskSessionCacheHandler(session)
|
|
auth_manager = spotipy.oauth2.SpotifyOAuth(scope='user-read-currently-playing playlist-modify-private',
|
|
cache_handler=cache_handler,
|
|
show_dialog=True)
|
|
|
|
if request.args.get("code"):
|
|
# Step 2. Being redirected from Spotify auth page
|
|
auth_manager.get_access_token(request.args.get("code"))
|
|
return redirect('/')
|
|
|
|
if not auth_manager.validate_token(cache_handler.get_cached_token()):
|
|
# Step 1. Display sign in link when no token
|
|
auth_url = auth_manager.get_authorize_url()
|
|
return f'<h2><a href="{auth_url}">Sign in</a></h2>'
|
|
|
|
# Step 3. Signed in, display data
|
|
spotify = spotipy.Spotify(auth_manager=auth_manager)
|
|
return f'<h2>Hi {spotify.me()["display_name"]}, ' \
|
|
f'<small><a href="/sign_out">[sign out]<a/></small></h2>' \
|
|
f'<a href="/playlists">my playlists</a> | ' \
|
|
f'<a href="/currently_playing">currently playing</a> | ' \
|
|
f'<a href="/current_user">me</a>' \
|
|
|
|
|
|
|
|
@app.route('/sign_out')
|
|
def sign_out():
|
|
session.pop("token_info", None)
|
|
return redirect('/')
|
|
|
|
|
|
@app.route('/playlists')
|
|
def playlists():
|
|
cache_handler = spotipy.cache_handler.FlaskSessionCacheHandler(session)
|
|
auth_manager = spotipy.oauth2.SpotifyOAuth(cache_handler=cache_handler)
|
|
if not auth_manager.validate_token(cache_handler.get_cached_token()):
|
|
return redirect('/')
|
|
|
|
spotify = spotipy.Spotify(auth_manager=auth_manager)
|
|
return spotify.current_user_playlists()
|
|
|
|
|
|
@app.route('/currently_playing')
|
|
def currently_playing():
|
|
cache_handler = spotipy.cache_handler.FlaskSessionCacheHandler(session)
|
|
auth_manager = spotipy.oauth2.SpotifyOAuth(cache_handler=cache_handler)
|
|
if not auth_manager.validate_token(cache_handler.get_cached_token()):
|
|
return redirect('/')
|
|
spotify = spotipy.Spotify(auth_manager=auth_manager)
|
|
track = spotify.current_user_playing_track()
|
|
if not track is None:
|
|
return track
|
|
return "No track currently playing."
|
|
|
|
|
|
@app.route('/current_user')
|
|
def current_user():
|
|
cache_handler = spotipy.cache_handler.FlaskSessionCacheHandler(session)
|
|
auth_manager = spotipy.oauth2.SpotifyOAuth(cache_handler=cache_handler)
|
|
if not auth_manager.validate_token(cache_handler.get_cached_token()):
|
|
return redirect('/')
|
|
spotify = spotipy.Spotify(auth_manager=auth_manager)
|
|
return spotify.current_user()
|
|
|
|
|
|
'''
|
|
Following lines allow application to be run more conveniently with
|
|
`python app.py` (Make sure you're using python3)
|
|
(Also includes directive to leverage pythons threading capacity.)
|
|
'''
|
|
if __name__ == '__main__':
|
|
app.run(threaded=True, port=int(os.environ.get("PORT",
|
|
os.environ.get("SPOTIPY_REDIRECT_URI", 8080).split(":")[-1])))
|