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")