ccolas commited on
Commit
300f883
1 Parent(s): b7996a5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +25 -15
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
- all_uris, all_names = get_all_playlists_uris_from_users(users_links.split('\n'))
 
 
 
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('Update user playlists')
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 names (e.g. 'bkayf') and/or playlist urls (e.g. "
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 names, one per line (optional)"
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
- st.success(f'{len(new_playlist_uris)} new playlists added from {len(user_playlists)} users.')
 
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
- all_tracks_uris, all_tracks_audio_features, genres, genres_labels = extract_audio_features(data_tracks, legit_genres)
169
- print(f'4. audio feature extraction: {time.time() - init_time:.2f}')
170
- print(f'\t total extraction: {time.time() - init_time_tot:.2f}')
171
- st.success(f'{len(data_tracks.keys())} tracks found!')
 
 
 
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
- description = f'Emotion Playlist for Valence: {target_mood[0]}, ' \
278
- f'Energy: {target_mood[1]}, ' \
279
- f'Danceability: {target_mood[2]}). ' \
 
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]