Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -32,7 +32,7 @@ def log_to_spotify():
|
|
32 |
st.session_state['login'] = (sp, user_id, legit_genres)
|
33 |
|
34 |
|
35 |
-
@st.cache
|
36 |
def get_user_playlists(users_links):
|
37 |
global sp
|
38 |
# Scanning users
|
@@ -40,7 +40,10 @@ def get_user_playlists(users_links):
|
|
40 |
all_uris, all_names = [], []
|
41 |
if users_links != "":
|
42 |
try:
|
43 |
-
|
|
|
|
|
|
|
44 |
n_playlists = len(all_uris)
|
45 |
except:
|
46 |
st.warning('Please enter a valid list of user names (one url per line)')
|
@@ -51,7 +54,6 @@ def get_filtered_user_playlists(user_links):
|
|
51 |
st.spinner(text="Scanning users..")
|
52 |
all_uris, all_names, n_playlists = get_user_playlists(user_links)
|
53 |
if n_playlists <= 1:
|
54 |
-
st.success(f'Currently {len(all_uris)} user playlists taken into account.')
|
55 |
return all_uris
|
56 |
else:
|
57 |
# let the user uncheck playlists
|
@@ -74,13 +76,13 @@ def get_filtered_user_playlists(user_links):
|
|
74 |
for i_emc, emc in enumerate(empty_checkboxes):
|
75 |
st.session_state['checkboxes_playlists'][i_emc] = emc.checkbox(all_names[i_emc], value=st.session_state['checkboxes_playlists'][i_emc])
|
76 |
|
77 |
-
filter_playlist = st.button
|
78 |
if filter_playlist:
|
79 |
return list(np.array(all_uris)[np.where(st.session_state['checkboxes_playlists'])])
|
80 |
else:
|
81 |
return []
|
82 |
|
83 |
-
@st.cache
|
84 |
def get_non_user_playlists(playlist_links):
|
85 |
# Scanning playlists
|
86 |
new_playlist_uris = []
|
@@ -104,6 +106,9 @@ def extract_audio_features(data_tracks, legit_genres):
|
|
104 |
# Extract audio features
|
105 |
all_tracks_uris = np.array(list(data_tracks.keys()))
|
106 |
all_audio_features = [data_tracks[uri]['track']['audio_features'] for uri in all_tracks_uris]
|
|
|
|
|
|
|
107 |
all_tracks_audio_features = dict(zip(relevant_audio_features, [[audio_f[k] for audio_f in all_audio_features] for k in relevant_audio_features]))
|
108 |
genres = dict()
|
109 |
for index, uri in enumerate(all_tracks_uris):
|
@@ -128,11 +133,11 @@ def select_songs(legit_genres):
|
|
128 |
st.markdown("This can be done in two ways: \n"
|
129 |
"1. Get songs from a list of users (and their playlists)\n"
|
130 |
"2. Get songs from a list of playlists.\n"
|
131 |
-
"For this you'll need to collect user
|
132 |
"https://open.spotify.com/playlist/1H7a4q8JZArMQiidRy6qon) by clicking on 'Share' and copying the url. "
|
133 |
"You need to provide at least one source of music.")
|
134 |
|
135 |
-
users_playlists = "Add a list of user
|
136 |
users_links = st.text_area(users_playlists, value="")
|
137 |
label_playlists = "Add a list of playlists urls, one per line (optional)"
|
138 |
playlist_links = st.text_area(label_playlists, value="https://open.spotify.com/playlist/1H7a4q8JZArMQiidRy6qon")
|
@@ -155,7 +160,8 @@ def select_songs(legit_genres):
|
|
155 |
init_time = time.time()
|
156 |
new_playlist_uris = get_non_user_playlists(playlist_links)
|
157 |
playlist_uris += new_playlist_uris
|
158 |
-
|
|
|
159 |
print(f'2. non user playlist: {time.time() - init_time:.2f}')
|
160 |
init_time = time.time()
|
161 |
if str(playlist_uris) in st.session_state.keys():
|
@@ -165,10 +171,13 @@ def select_songs(legit_genres):
|
|
165 |
st.session_state[str(playlist_uris)] = data_tracks
|
166 |
print(f'3. track extraction: {time.time() - init_time:.2f}')
|
167 |
init_time = time.time()
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
|
|
|
|
|
|
172 |
return all_tracks_uris, all_tracks_audio_features, genres, genres_labels
|
173 |
|
174 |
def customize_widgets(genres_labels):
|
@@ -274,9 +283,10 @@ def run_app():
|
|
274 |
init_time = time.time()
|
275 |
generation_button = centered_button(st.button, 'Generate playlist', n_columns=5)
|
276 |
if generation_button:
|
277 |
-
|
278 |
-
|
279 |
-
f'
|
|
|
280 |
f'Playlist generated by the EmotionPlaylist app: https://huggingface.co/spaces/ccolas/EmotionPlaylist.'
|
281 |
playlist_info = sp.user_playlist_create(user_id, playlist_name, public=True, collaborative=False, description=description)
|
282 |
playlist_uri = playlist_info['uri'].split(':')[-1]
|
|
|
32 |
st.session_state['login'] = (sp, user_id, legit_genres)
|
33 |
|
34 |
|
35 |
+
@st.cache(suppress_st_warning=True)
|
36 |
def get_user_playlists(users_links):
|
37 |
global sp
|
38 |
# Scanning users
|
|
|
40 |
all_uris, all_names = [], []
|
41 |
if users_links != "":
|
42 |
try:
|
43 |
+
print(users_links)
|
44 |
+
user_ids = extract_uris_from_links(users_links, url_type='user')
|
45 |
+
print(user_ids)
|
46 |
+
all_uris, all_names = get_all_playlists_uris_from_users(sp, user_ids)
|
47 |
n_playlists = len(all_uris)
|
48 |
except:
|
49 |
st.warning('Please enter a valid list of user names (one url per line)')
|
|
|
54 |
st.spinner(text="Scanning users..")
|
55 |
all_uris, all_names, n_playlists = get_user_playlists(user_links)
|
56 |
if n_playlists <= 1:
|
|
|
57 |
return all_uris
|
58 |
else:
|
59 |
# let the user uncheck playlists
|
|
|
76 |
for i_emc, emc in enumerate(empty_checkboxes):
|
77 |
st.session_state['checkboxes_playlists'][i_emc] = emc.checkbox(all_names[i_emc], value=st.session_state['checkboxes_playlists'][i_emc])
|
78 |
|
79 |
+
filter_playlist = centered_button(st.button, 'Update user playlists', n_columns=5)
|
80 |
if filter_playlist:
|
81 |
return list(np.array(all_uris)[np.where(st.session_state['checkboxes_playlists'])])
|
82 |
else:
|
83 |
return []
|
84 |
|
85 |
+
@st.cache(suppress_st_warning=True)
|
86 |
def get_non_user_playlists(playlist_links):
|
87 |
# Scanning playlists
|
88 |
new_playlist_uris = []
|
|
|
106 |
# Extract audio features
|
107 |
all_tracks_uris = np.array(list(data_tracks.keys()))
|
108 |
all_audio_features = [data_tracks[uri]['track']['audio_features'] for uri in all_tracks_uris]
|
109 |
+
valid_indexes = np.array([i for i in range(len(all_tracks_uris)) if all_audio_features[i] is not None])
|
110 |
+
all_tracks_uris = all_tracks_uris[valid_indexes]
|
111 |
+
all_audio_features = np.array(all_audio_features)[valid_indexes]
|
112 |
all_tracks_audio_features = dict(zip(relevant_audio_features, [[audio_f[k] for audio_f in all_audio_features] for k in relevant_audio_features]))
|
113 |
genres = dict()
|
114 |
for index, uri in enumerate(all_tracks_uris):
|
|
|
133 |
st.markdown("This can be done in two ways: \n"
|
134 |
"1. Get songs from a list of users (and their playlists)\n"
|
135 |
"2. Get songs from a list of playlists.\n"
|
136 |
+
"For this you'll need to collect user urls (e.g. https://open.spotify.com/user/bkayf) and/or playlist urls (e.g. "
|
137 |
"https://open.spotify.com/playlist/1H7a4q8JZArMQiidRy6qon) by clicking on 'Share' and copying the url. "
|
138 |
"You need to provide at least one source of music.")
|
139 |
|
140 |
+
users_playlists = "Add a list of user urls, one per line (optional)"
|
141 |
users_links = st.text_area(users_playlists, value="")
|
142 |
label_playlists = "Add a list of playlists urls, one per line (optional)"
|
143 |
playlist_links = st.text_area(label_playlists, value="https://open.spotify.com/playlist/1H7a4q8JZArMQiidRy6qon")
|
|
|
160 |
init_time = time.time()
|
161 |
new_playlist_uris = get_non_user_playlists(playlist_links)
|
162 |
playlist_uris += new_playlist_uris
|
163 |
+
n_users = len(users_links.split('\n'))
|
164 |
+
st.success(f'{len(playlist_uris)} new playlists added from {n_users} users.')
|
165 |
print(f'2. non user playlist: {time.time() - init_time:.2f}')
|
166 |
init_time = time.time()
|
167 |
if str(playlist_uris) in st.session_state.keys():
|
|
|
171 |
st.session_state[str(playlist_uris)] = data_tracks
|
172 |
print(f'3. track extraction: {time.time() - init_time:.2f}')
|
173 |
init_time = time.time()
|
174 |
+
if len(data_tracks.keys()) < 10:
|
175 |
+
st.warning('Please select more music sources.')
|
176 |
+
else:
|
177 |
+
all_tracks_uris, all_tracks_audio_features, genres, genres_labels = extract_audio_features(data_tracks, legit_genres)
|
178 |
+
print(f'4. audio feature extraction: {time.time() - init_time:.2f}')
|
179 |
+
print(f'\t total extraction: {time.time() - init_time_tot:.2f}')
|
180 |
+
st.success(f'{len(data_tracks.keys())} tracks found!')
|
181 |
return all_tracks_uris, all_tracks_audio_features, genres, genres_labels
|
182 |
|
183 |
def customize_widgets(genres_labels):
|
|
|
283 |
init_time = time.time()
|
284 |
generation_button = centered_button(st.button, 'Generate playlist', n_columns=5)
|
285 |
if generation_button:
|
286 |
+
target_mood = np.array(target_mood).flatten() * 100
|
287 |
+
description = f'Emotion Playlist for Valence: {int(target_mood[0])}, ' \
|
288 |
+
f'Energy: {int(target_mood[1])}, ' \
|
289 |
+
f'Danceability: {int(target_mood[2])}). ' \
|
290 |
f'Playlist generated by the EmotionPlaylist app: https://huggingface.co/spaces/ccolas/EmotionPlaylist.'
|
291 |
playlist_info = sp.user_playlist_create(user_id, playlist_name, public=True, collaborative=False, description=description)
|
292 |
playlist_uri = playlist_info['uri'].split(':')[-1]
|