File size: 4,151 Bytes
f4c8685
dad89e4
f4c8685
 
 
 
7c4e98c
f4c8685
 
 
6868ece
f4c8685
0d5194e
f4c8685
 
dad89e4
 
f4c8685
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7c4e98c
 
0670634
 
 
 
 
 
3020ad1
 
506e32d
 
 
5c5363c
0670634
3020ad1
0670634
 
dad89e4
 
 
 
 
 
 
 
 
6868ece
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0670634
 
 
 
 
c66809e
0670634
 
 
 
 
 
 
 
 
 
dad89e4
0670634
 
 
 
 
 
c66809e
0670634
 
 
c66809e
 
 
 
801318e
c66809e
0670634
dad89e4
0670634
f4c8685
 
 
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import json
from urllib import request
from fastapi import FastAPI
from starlette.middleware.sessions import SessionMiddleware
from starlette.responses import HTMLResponse, RedirectResponse
from starlette.requests import Request
import gradio as gr
import uvicorn
from fastapi.responses import HTMLResponse
from fastapi.responses import RedirectResponse
import pandas as pd

import spotipy
from spotipy import oauth2

import heatmap

PORT_NUMBER = 8080
SPOTIPY_CLIENT_ID = 'c087fa97cebb4f67b6f08ba841ed8378'
SPOTIPY_CLIENT_SECRET = 'ae27d6916d114ac4bb948bb6c58a72d9'
SPOTIPY_REDIRECT_URI = 'https://hf-hackathon-2023-01-spotify.hf.space'
SCOPE = 'user-library-read'

sp_oauth = oauth2.SpotifyOAuth(SPOTIPY_CLIENT_ID, SPOTIPY_CLIENT_SECRET, SPOTIPY_REDIRECT_URI, scope=SCOPE)

app = FastAPI()
app.add_middleware(SessionMiddleware, secret_key="w.o.w")

@app.get('/', response_class=HTMLResponse)
async def homepage(request: Request):
    token = request.session.get('token')
    if token:
        return RedirectResponse("/gradio")

    url = str(request.url)
    code = sp_oauth.parse_response_code(url)
    if code != url:
        token_info = sp_oauth.get_access_token(code)
        request.session['token'] = token_info['access_token']
        return RedirectResponse("/gradio")

    auth_url = sp_oauth.get_authorize_url()
    return "<a href='" + auth_url + "'>Login to Spotify</a>"



from vega_datasets import data

iris = data.iris()


def scatter_plot_fn(request: gr.Request):
    token = request.request.session.get('token')
    if token:
        sp = spotipy.Spotify(token)
        results = sp.current_user()
        print(results)
    return gr.ScatterPlot(
        value=iris,
    )

def heatmap_plot_fn(request: gr.Request):
    token = request.request.session.get('token')
    if token:
        sp = spotipy.Spotify(token)
        data = heatmap.build_heatmap(heatmap.fetch_recent_songs(sp))
        fig, _ = heatmap.plot(data)
        return fig


def get_features(spotify):
    features = []
    for index in range(0, 10):
        results = spotify.current_user_saved_tracks(offset=index*50, limit=50)
        track_ids = [item['track']['id'] for item in results['items']]
        features.extend(spotify.audio_features(track_ids))

    df = pd.DataFrame(data=features)
    names = [
        'danceability', 
        'energy',
        'loudness',
        'speechiness',
        'acousticness',
        'instrumentalness',
        'liveness',
        'valence',
        'tempo',
    ]
    features_means = df[names].mean()
    # print (features_means.to_json())
    return features_means


##########
def get_started():
    # redirects to spotify and comes back
    # then generates plots
    return

with gr.Blocks() as demo:
    gr.Markdown(" ## Spotify Analyzer 🥳🎉")
    gr.Markdown("This app analyzes how cool your music taste is. We dare you to take this challenge!")
    with gr.Row():
        get_started_btn = gr.Button("Get Started")
    with gr.Row():
        with gr.Column():
            with gr.Row():
                with gr.Column():
                    hm_plot = gr.Plot().style(container=True)
                with gr.Column():
                    plot = gr.ScatterPlot(show_label=False).style(container=True)
            with gr.Row():
                with gr.Column():
                    plot = gr.ScatterPlot(show_label=False).style(container=True)
                with gr.Column():
                    plot = gr.ScatterPlot(show_label=False).style(container=True)
    with gr.Row():
        gr.Markdown(" ### We have recommendations for you!")
    with gr.Row():
        gr.Dataframe(
            headers=["Song", "Album", "Artist"],
            datatype=["str", "str", "str"],
            label="Reccomended Songs",
            value=[["something", "something", "something"], ["something", "something", "something"]]  # TODO: replace with actual reccomendations once get_started() is implemeted.
        )
    demo.load(fn=scatter_plot_fn, outputs=plot)
    demo.load(fn=heatmap_plot_fn, output=hm_plot)


gradio_app = gr.mount_gradio_app(app, demo, "/gradio")
uvicorn.run(app, host="0.0.0.0", port=7860)