Spaces:
Running
Running
File size: 3,100 Bytes
dbdd344 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
import os
import gradio as gr
from flask import Flask, request, redirect
from spotipy import Spotify, SpotifyOAuth
from threading import Thread
import random
import time
# ========== Spotify OAuth Setup ==========
CLIENT_ID = os.getenv("SPOTIFY_CLIENT_ID")
CLIENT_SECRET = os.getenv("SPOTIFY_CLIENT_SECRET")
REDIRECT_URI = REDIRECT_URI = "https://jisaacso219-rng-shuffle.hf.space/callback"
SCOPE = "user-read-playback-state user-modify-playback-state playlist-read-private"
auth_codes = {} # Store auth tokens per session (not secure for prod)
sp_oauth = SpotifyOAuth(
client_id=CLIENT_ID,
client_secret=CLIENT_SECRET,
redirect_uri=REDIRECT_URI,
scope=SCOPE
)
# ========== Flask Redirect Server ==========
app = Flask(__name__)
@app.route("/callback")
def callback():
code = request.args.get("code")
token_info = sp_oauth.get_access_token(code, as_dict=True)
auth_codes["user"] = token_info # Single-user session for now
return "โ
Spotify login successful! You can return to the app."
Thread(target=lambda: app.run(host="0.0.0.0", port=7861)).start()
# ========== Gradio UI ==========
def login():
return sp_oauth.get_authorize_url()
def list_playlists():
if "user" not in auth_codes:
return [], "โ ๏ธ Please log in first."
sp = Spotify(auth=auth_codes["user"]["access_token"])
pl = sp.current_user_playlists(limit=50)
choices = {p['name']: p['id'] for p in pl['items']}
return list(choices.keys()), "Select a playlist to shuffle and play."
def shuffle_and_play(playlist_name):
if "user" not in auth_codes:
return "โ ๏ธ Please log in first."
sp = Spotify(auth=auth_codes["user"]["access_token"])
pl = sp.current_user_playlists(limit=50)
pl_map = {p['name']: p['id'] for p in pl['items']}
playlist_id = pl_map[playlist_name]
tracks = []
results = sp.playlist_tracks(playlist_id)
tracks.extend(results['items'])
while results['next']:
results = sp.next(results)
tracks.extend(results['items'])
uris = [t['track']['uri'] for t in tracks if t['track']]
random.shuffle(uris)
devices = sp.devices()
if not devices['devices']:
return "โ ๏ธ No active Spotify devices found. Open the Spotify app and try again."
device_id = devices['devices'][0]['id']
sp.start_playback(device_id=device_id, uris=uris)
return f"โถ๏ธ Playing {len(uris)} shuffled tracks from '{playlist_name}'!"
with gr.Blocks() as demo:
gr.Markdown("# ๐ถ Spotify Playlist Shuffler")
login_btn = gr.Button("๐ Log in to Spotify")
login_out = gr.Textbox(label="Login URL")
playlist_list = gr.Dropdown(label="Your Playlists")
refresh_btn = gr.Button("๐ Load My Playlists")
status = gr.Textbox()
play_btn = gr.Button("โถ๏ธ Shuffle + Play")
result = gr.Textbox()
login_btn.click(fn=login, outputs=login_out)
refresh_btn.click(fn=list_playlists, outputs=[playlist_list, status])
play_btn.click(fn=shuffle_and_play, inputs=playlist_list, outputs=result)
demo.launch(server_port=7860, server_name="0.0.0.0")
|