import gradio as gr import pandas as pd import joblib import os import spotipy import pylast from spotipy.oauth2 import SpotifyClientCredentials from Levenshtein import distance final_model = joblib.load('final_model.pkl') print(final_model) # Set up authentication with the Spotify API sp = spotipy.Spotify(auth_manager=SpotifyClientCredentials(client_id=os.environ['SPOT_API'], client_secret=os.environ['SPOT_SECRET'])) network = pylast.LastFMNetwork(api_key=os.environ['LAST_API'], api_secret=os.environ['LAST_SECRET']) genre_list = ['acoustic', 'afrobeat', 'alt-rock', 'alternative', 'ambient', 'anime', 'black-metal', 'bluegrass', 'blues', 'brazil', 'breakbeat', 'british', 'cantopop', 'chicago-house', 'children', 'chill', 'classical', 'club', 'comedy', 'country', 'dance', 'dancehall', 'death-metal', 'deep-house', 'detroit-techno', 'disco', 'disney', 'drum-and-bass', 'dub', 'dubstep', 'edm', 'electro', 'electronic', 'emo', 'folk', 'forro', 'french', 'funk', 'garage', 'german', 'gospel', 'goth', 'grindcore', 'groove', 'grunge', 'guitar', 'happy', 'hard-rock', 'hardcore', 'hardstyle', 'heavy-metal', 'hip-hop', 'honky-tonk', 'house', 'idm', 'indian', 'indie-pop', 'indie', 'industrial', 'iranian', 'j-dance', 'j-idol', 'j-pop', 'j-rock', 'jazz', 'k-pop', 'kids', 'latin', 'latino', 'malay', 'mandopop', 'metal', 'metalcore', 'minimal-techno', 'mpb', 'new-age', 'opera', 'pagode', 'party', 'piano', 'pop-film', 'pop', 'power-pop', 'progressive-house', 'psych-rock', 'punk-rock', 'punk', 'r-n-b', 'reggae', 'reggaeton', 'rock-n-roll', 'rock', 'rockabilly', 'romance', 'sad', 'salsa', 'samba', 'sertanejo', 'show-tunes', 'singer-songwriter', 'ska', 'sleep', 'soul', 'spanish', 'study', 'swedish', 'synth-pop', 'tango', 'techno', 'trance', 'trip-hop', 'turkish', 'world-music'] def get_track_genre(track_id,artist_name,track_name): genres = [] track = sp.track(track_id) artist = sp.artist(track['artists'][0]['external_urls']['spotify']) album_id = track['album']['id'] album = sp.album(album_id) genres.extend(album['genres']) genres.extend(artist['genres']) track = network.get_track(artist_name, track_name) top_tags = track.get_top_tags(limit =5) tags_list = [tag.item.get_name() for tag in top_tags] genres.extend(tags_list) print(genres) return genres def find_most_similar_genre(my_genres, artist_genres): min_distance = float('inf') most_similar_genre = None for my_genre in my_genres: for artist_genre in artist_genres: d = distance(my_genre, artist_genre) if d < min_distance: min_distance = d most_similar_genre = my_genre return most_similar_genre def match_genres_to_list(track_id,artist_name,track_name): track_genres=get_track_genre(track_id,artist_name,track_name) return find_most_similar_genre(genre_list,track_genres) def search_songs(query): results = sp.search(q=query, type="track") songs = [f"{index}. {item['name']} by {item['artists'][0]['name']}" for index, item in enumerate(results["tracks"]["items"])] track_ids = [item["id"] for item in results["tracks"]["items"]] return songs, track_ids def get_song_features(song, track_ids): index = int(song.split(".")[0]) track_id = track_ids[index] track_info = sp.track(track_id) artist_name = track_info['artists'][0]['name'] track_name = track_info['name'] features = sp.audio_features([track_id])[0] genre = match_genres_to_list(track_id,artist_name,track_name) key_map = {0: 'C', 1: 'C#', 2: 'D', 3: 'D#', 4: 'E', 5: 'F', 6: 'F#', 7: 'G', 8: 'G#', 9: 'A', 10: 'A#', 11: 'B'} key = str(key_map[features['key']]) mode_map = { 1: "Major", 0: "Minor"} mode = mode_map[features['mode']] explicit_real = track_info['explicit'] features_list = [ features['duration_ms'], explicit_real, features['danceability'], features['energy'], key, features['loudness'], mode, features['speechiness'], features['acousticness'], features['instrumentalness'], features['liveness'], features['valence'], features['tempo'], str(features['time_signature']), genre ] return features_list theme = gr.themes.Monochrome( # text_size="text_lg", font=[gr.themes.GoogleFont('Neucha'), 'ui-sans-serif', 'system-ui', 'sans-serif'], ) with gr.Blocks(theme=theme) as demo: with gr.Row(): image = gr.HTML("