diivien commited on
Commit
f3f6f6f
·
1 Parent(s): a6e9bd9

added new genre comparing method

Browse files
Files changed (2) hide show
  1. app.py +43 -30
  2. requirements.txt +2 -2
app.py CHANGED
@@ -6,7 +6,8 @@ import spotipy
6
  import pylast
7
  import discogs_client
8
  from spotipy.oauth2 import SpotifyClientCredentials
9
- from Levenshtein import distance
 
10
 
11
  final_model = joblib.load('final_model.pkl')
12
  # Set up authentication with the Spotify API
@@ -39,48 +40,60 @@ genre_list = ['acoustic', 'afrobeat', 'alt-rock', 'alternative', 'ambient',
39
 
40
 
41
  def get_track_genre(track_id,artist_name,track_name):
42
- genres = []
43
  track_spot = sp.track(track_id)
44
  artist = sp.artist(track_spot['artists'][0]['external_urls']['spotify'])
45
  album_id = track_spot['album']['id']
46
  album = sp.album(album_id)
47
- genres.extend(album['genres'])
48
- genres.extend(artist['genres'])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
 
50
 
51
- track_last = network.get_track(artist_name, track_name)
52
- top_tags = track_last.get_top_tags(limit =5)
53
- tags_list = [tag.item.get_name() for tag in top_tags]
54
- genres.extend(tags_list)
55
-
56
- # results = d.search(track_name, artist=artist_name, type='release')
57
- # if results:
58
- # release = results[0]
59
- # if release.genres:
60
- # genres.extend(release.genres)
61
- # if release.styles:
62
- # genres.extend(release.styles)
63
 
64
 
 
 
 
65
 
66
- print(genres)
67
-
68
- return genres
 
 
 
 
 
 
 
 
 
 
69
 
70
- def find_most_similar_genre(my_genres, artist_genres):
71
- min_distance = float('inf')
72
- most_similar_genre = None
73
- for my_genre in my_genres:
74
- for artist_genre in artist_genres:
75
- d = distance(my_genre, artist_genre)
76
- if d < min_distance:
77
- min_distance = d
78
- most_similar_genre = my_genre
79
- return most_similar_genre
80
 
81
  def match_genres_to_list(track_id,artist_name,track_name):
82
  track_genres=get_track_genre(track_id,artist_name,track_name)
83
- return find_most_similar_genre(genre_list,track_genres)
84
 
85
  def search_songs(query):
86
  results = sp.search(q=query, type="track")
 
6
  import pylast
7
  import discogs_client
8
  from spotipy.oauth2 import SpotifyClientCredentials
9
+ from queue import PriorityQueue
10
+ from fuzzywuzzy import fuzz
11
 
12
  final_model = joblib.load('final_model.pkl')
13
  # Set up authentication with the Spotify API
 
40
 
41
 
42
  def get_track_genre(track_id,artist_name,track_name):
43
+ genres = {}
44
  track_spot = sp.track(track_id)
45
  artist = sp.artist(track_spot['artists'][0]['external_urls']['spotify'])
46
  album_id = track_spot['album']['id']
47
  album = sp.album(album_id)
48
+ genres.update({genre: 100 for genre in album['genres']})
49
+ genres.update({genre: 100 for genre in artist['genres']})
50
+
51
+ try:
52
+ if network.get_track(artist_name, track_name):
53
+ track_last = network.get_track(artist_name, track_name)
54
+ top_tags = track_last.get_top_tags(limit=5)
55
+ tags_list = {tag.item.get_name(): int(tag.weight) for tag in top_tags}
56
+ genres.update(tags_list)
57
+ except pylast.WSError as e:
58
+ if str(e) == "Track not found":
59
+ # Handle the error here
60
+ pass
61
+
62
+ results = d.search(track_name, artist=artist_name, type='release')
63
+ if results:
64
+ release = results[0]
65
+ if release.genres:
66
+ genres.update({genre: 50 for genre in release.genres})
67
+ if release.styles:
68
+ genres.update({genre: 50 for genre in release.styles})
69
 
70
 
71
+ print(genres)
72
+ return genres
 
 
 
 
 
 
 
 
 
 
73
 
74
 
75
+ def similar(genre1, genre2):
76
+ score = fuzz.token_set_ratio(genre1, genre2)
77
+ return genre1 if score >85 else None
78
 
79
+ def find_genre(genres, scraped_genres):
80
+ pq = PriorityQueue()
81
+ for genre, weight in scraped_genres.items():
82
+ pq.put((-weight, genre))
83
+ while not pq.empty():
84
+ weight, genre = pq.get()
85
+ if genre in genres:
86
+ return genre
87
+ else:
88
+ for g in genres:
89
+ if similar(g, genre):
90
+ return g
91
+ return None
92
 
 
 
 
 
 
 
 
 
 
 
93
 
94
  def match_genres_to_list(track_id,artist_name,track_name):
95
  track_genres=get_track_genre(track_id,artist_name,track_name)
96
+ return find_genre(genre_list,track_genres)
97
 
98
  def search_songs(query):
99
  results = sp.search(q=query, type="track")
requirements.txt CHANGED
@@ -1,5 +1,4 @@
1
  spotipy
2
- Levenshtein
3
  joblib
4
  gradio
5
  imblearn
@@ -8,4 +7,5 @@ catboost
8
  scikit-learn
9
  pylast
10
  pandas < 2.0.0
11
- python3-discogs-client
 
 
1
  spotipy
 
2
  joblib
3
  gradio
4
  imblearn
 
7
  scikit-learn
8
  pylast
9
  pandas < 2.0.0
10
+ python3-discogs-client
11
+ fuzzywuzzy