def get_song_ids_from_db(): con = mdb.connect(ADDRESS, USERNAME, PASSWORD, SCHEMA) musixmatch = Musixmatch(MM_API_KEY) with con: cur = con.cursor() cur.execute( "SELECT DISTINCT song_name, artist_name, artist_id FROM popular_songs, artists WHERE popular_songs.artist_name = artists.name AND song_id = -1") set_of_new_songs = set() dict_of_updates_popular = dict() for i in range(cur.rowcount): row = cur.fetchone() song_name, artist_name, artist_id = row[0], row[1], row[2] set_of_new_songs.add((song_name, artist_name, artist_id)) for song_name, artist_name, artist_id in set_of_new_songs: cur.execute( "SELECT song_id FROM songs WHERE title = %s AND artist_id = %s", (song_name, artist_id)) if cur.rowcount > 0: song_id = cur.fetchone()[0] dict_of_updates_popular.update({(song_name, artist_name): song_id}) else: try: message = musixmatch.matcher_track_get(song_name, artist_name).get('message') if message.get('header').get('status_code') == 200: track = message.get('body').get('track') song_id = track.get('track_id') lyrics_id = track.get('lyrics_id') album_id = track.get('album_id') rating = track.get('track_rating') insert_new_song_mm(con, song_id, song_name, lyrics_id, album_id, artist_id, rating) except Exception as e: print "error occurred: couldn't get song " + song_name print e.message update_popular_songs(cur, dict_of_updates_popular)
class TestMusixmatch(unittest.TestCase): def setUp(self): self.musixmatch = Musixmatch(os.environ.get('APIKEY')) self.url = 'http://api.musixmatch.com/ws/1.1/' def test_get_url(self): self.assertEqual( self.musixmatch._get_url('chart.artists.get?' 'page=1&page_size=1&country=us' '&format=json'), self.url + 'chart.artists.get?' 'page=1&page_size=1' '&country=us&format=json&apikey={}'.format( os.environ.get('APIKEY'))) def test_apikey(self): self.assertEqual(self.musixmatch._apikey, os.environ.get('APIKEY')) def test_chart_artists(self): self.assertEqual( self.musixmatch.chart_artists(1, 1)['message']['body'] ['artist_list'][0]['artist']['artist_vanity_id'], 'Ed-Sheeran') self.assertEqual( self.musixmatch.chart_artists(1, 1)['message']['body'] ['artist_list'][0]['artist']['artist_mbid'], 'b8a7c51f-362c-4dcb-a259-bc6e0095f0a6') def test_chart_tracks_get(self): self.assertEqual( self.musixmatch.chart_tracks_get( 1, 1, 1)['message']['body']['track_list'][0]['track']['album_name'], '2U (feat. Justin Bieber)') self.assertEqual( self.musixmatch.chart_tracks_get( 1, 1, 1)['message']['body']['track_list'][0]['track']['track_name'], '2U') def test_track_search(self): self.assertEqual( self.musixmatch.track_search( q_track='Let Me Love You', q_artist='justinbieber', page_size=10, page=1, s_track_rating='desc')['message']['body']['track_list'], []) def test_track_get(self): self.assertEqual( self.musixmatch.track_get(15445219)['message']['body']['track'] ['artist_name'], 'Lady Gaga') self.assertEqual( self.musixmatch.track_get(15445219)['message']['body']['track'] ['album_name'], 'The Fame Monster') def test_track_lyrics_get(self): self.assertEqual( self.musixmatch.track_lyrics_get(15953433)['message']['body'] ['lyrics']['lyrics_language'], 'en') self.assertEqual( self.musixmatch.track_lyrics_get(15953433)['message']['body'] ['lyrics']['lyrics_language_description'], 'English') self.assertEqual( self.musixmatch.track_lyrics_get(15953433)['message']['body'] ['lyrics']['lyrics_id'], 15912802) def test_track_snippet_get(self): self.assertEqual( self.musixmatch.track_snippet_get(16860631)['message']['body'] ['snippet']['snippet_id'], 16229519) self.assertEqual( self.musixmatch.track_snippet_get(16860631)['message']['body'] ['snippet']['snippet_body'], "You shoot me down, but I won't fall") def test_track_subtitle_get(self): self.assertEqual( self.musixmatch.track_subtitle_get(14201829)['message']['body'], '') def test_track_richsync_get(self): self.assertEqual( self.musixmatch.track_richsync_get(114837357)['message']['body'] ['richsync']['richsync_id'], 6) self.assertEqual( self.musixmatch.track_richsync_get(114837357)['message']['body'] ['richsync']['richsync_length'], 230) def test_track_lyrics_post(self): self.assertEqual( self.musixmatch.track_lyrics_post( 1471157, 'test')['message']['header']['status_code'], 200) self.assertEqual( self.musixmatch.track_lyrics_post(1471157, 'test')['message']['body'], '') def test_track_lyrics_feedback_post(self): self.assertEqual( self.musixmatch.track_lyrics_post( 1471157, 4193713, 'wrong_verses')['message']['body'], '') def test_matcher_lyrics_get(self): self.assertEqual( self.musixmatch.matcher_lyrics_get('Sexy and I know it', 'LMFAO')['message']['body'] ['lyrics']['lyrics_language_description'], 'English') self.assertEqual( self.musixmatch.matcher_lyrics_get( 'Sexy and I know it', 'LMFAO')['message']['body']['lyrics']['lyrics_language'], 'en') def test_matcher_track_get(self): self.assertEqual( self.musixmatch.matcher_track_get( 'Lose Yourself (soundtrack)', 'Eminem')['message']['body']['track']['track_name'], 'Lose Yourself - ' 'Soundtrack Version' ' (Explicit)') self.assertEqual( self.musixmatch.matcher_track_get( 'Lose Yourself (soundtrack)', 'Eminem')['message']['body']['track']['album_name'], 'Curtain Call') def test_matcher_subtitle_get(self): self.assertEqual( self.musixmatch.matcher_subtitle_get('Sexy and I know it', 'LMFAO', 200, 3)['message']['body'], '') def test_artist_get(self): self.assertEqual( self.musixmatch.artist_get(118)['message']['body']['artist'] ['artist_name'], 'Queen') self.assertEqual( self.musixmatch.artist_get(118)['message']['body']['artist'] ['artist_mbid'], '5eecaf18-02ec-47af-a4f2-7831db373419') def test_artist_search(self): self.assertEqual( self.musixmatch.artist_search( 'prodigy', 1, 1, 16439, '4a4ee089-93b1-4470-af9a-6ff575d32704')['message']['body'] ['artist_list'][0]['artist']['artist_id'], 16439) self.assertEqual( self.musixmatch.artist_search( 'prodigy', 1, 1, 16439, '4a4ee089-93b1-4470-af9a-6ff575d32704')['message']['body'] ['artist_list'][0]['artist']['artist_name'], 'The Prodigy') def test_artist_albums_get(self): self.assertEqual( self.musixmatch.artist_albums_get(1039, 1, 1, 1, 'desc')['message'] ['body']['album_list'][0]['album']['album_id'], 25660826) self.assertEqual( self.musixmatch.artist_albums_get(1039, 1, 1, 1, 'desc')['message'] ['body']['album_list'][0]['album']['album_name'], 'Kaleidoscope') def test_artist_related_get(self): self.assertEqual( self.musixmatch.artist_related_get( 56, 1, 1)['message']['body']['artist_list'][0]['artist']['artist_id'], 298) self.assertEqual( self.musixmatch.artist_related_get(56, 1, 1)['message']['body'] ['artist_list'][0]['artist']['artist_name'], 'Outkast') def test_album_get(self): self.assertEqual( self.musixmatch.album_get(14250417)['message']['body']['album'] ['album_id'], 14250417) self.assertEqual( self.musixmatch.album_get(14250417)['message']['body']['album'] ['album_name'], 'Party Rock') def test_album_tracks_get(self): self.assertEqual( self.musixmatch.album_tracks_get( 13750844, 1, 1, '')['message']['body']['track_list'][0]['track']['track_id'], 30057052) self.assertEqual( self.musixmatch.album_tracks_get( 13750844, 1, 1, '')['message']['body']['track_list'][0]['track']['track_name'], "Don't Panic") def test_tracking_url_get(self): self.assertEqual( self.musixmatch.tracking_url_get('www.mylyricswebsite.com') ['message']['header']['status_code'], 200) def test_catalogue_dump_get(self): self.assertEqual( self.musixmatch.catalogue_dump_get('test')['message']['body'], '')
def post_facebook_message(fbid, recevied_message): musixmatch = Musixmatch('e66da512f0d41fb64642d7ddc47ab311') track = recevied_message #name of the song answer = "" result = musixmatch.matcher_track_get(track, "") body = result.get('message').get('body') user_details_url = "https://graph.facebook.com/v2.6/%s" % fbid user_details_params = { 'fields': 'first_name,last_name,profile_pic', 'access_token': PAGE_ACCESS_TOKEN } user_details = requests.get(user_details_url, user_details_params).json() objUsr = UsersBot() objUsr.user_id = user_details['id'] objUsr.first_name = user_details['first_name'] objUsr.last_name = user_details['last_name'] users_bot = UsersBot.objects.all() if objUsr in users_bot: objUsr.save() if (body != ''): track_id = body.get('track').get('track_id') res_lyrics = musixmatch.track_lyrics_get(track_id) lyr_body = res_lyrics.get('message').get('body') if (lyr_body != ''): lyrics = lyr_body.get('lyrics').get('lyrics_body') cl_lyrics = lyrics.split("*****") answer = cl_lyrics[0] else: answer = "Lyrics not found!" else: answer = "Lyrics not found!" objConv = Conversations() objConv.user_id = user_details['id'] objConv.message_in = recevied_message objConv.message_out = answer objConv.save() #cursor.execute('INSERT INTO words VALUES (?)', [recevied_message]) post_message_url = 'https://graph.facebook.com/v2.6/me/messages?access_token=%s' % PAGE_ACCESS_TOKEN response_msg = json.dumps({ "recipient": { "id": fbid }, "message": { "text": answer } }) status = requests.post(post_message_url, headers={"Content-Type": "application/json"}, data=response_msg)
class MusiXMatchAPI: def __init__(self, key): self.MM = Musixmatch(key) self.track_not_found = 0 self.total_count = 0 self.error_codes = [] def get_song_data(self, artist_name: str, track_title: str) -> dict: """ Gets song data from musixmatch api. Using the free API means access to only 30% of the lyrics body, so that's a no go. We can still use the API to augment our datasets with the album name, release date, and genres. :param artist_name: name of track artist (str) :param track_title: name of track title (str) :return: dict of form { "Album_name": str, "Release_date": "yyyy-MM-dd, "Genres": list of strs } """ self.total_count += 1 result = self.MM.matcher_track_get(q_artist=artist_name, q_track=track_title) result = result["message"] if result["header"]["status_code"] != 200 or \ result["body"]["track"]["has_lyrics"] != 1: self.track_not_found += 1 self.error_codes.append(result["header"]["status_code"]) return {} result = result["body"]["track"] return { "Album_name": result["album_name"], "Release_date": result["first_release_date"].split("T")[0], "Genres": [ x["music_genre"]["music_genre_name"] for x in result["primary_genres"]["music_genre_list"] ] } def get_usage_report(self) -> dict: """ Returns usage report of the spotify scraperr :return: dict of form { "Musixmatch_Usage_Reports": { "Missed_Searches": int, "Total_Attempts": int } } """ usage = { "Musixmatch_Usage_Reports": { "Missed_Searches": self.track_not_found, "Total_Attempts": self.total_count } } return usage def clear_usage_stats(self): self.song_not_found_count = 0 self.total_attempts = 0
conn.commit() ########################################################################################### musixmatch = Musixmatch('a8910b91fed84a97ec71b4023e102863') temp_tracks_list = sp.tracks(seed_tracks) artist_names_original = [] track_names_original = [] for track in temp_tracks_list['tracks']: artist_names_original.append(track['artists'][0]['name']) track_names_original.append(track['name']) artist_id_musixmatch = [] for i in range(5): temp = musixmatch.matcher_track_get(q_track = track_names_original[i], q_artist = artist_names_original[i], _format='json' ) if temp['message']['body'] == '': pass else: artist_id_musixmatch.append(temp['message']['body']['track']['artist_id']) new_artists_id = [] for id in artist_id_musixmatch: new_artists = musixmatch.artist_related_get(artist_id = id, page = 1, page_size = 4) for temp_artist in new_artists['message']['body']['artist_list']: new_artists_id.append(temp_artist['artist']['artist_id']) new_song_tuples = [] new_artists_names = [] new_artists_genres = [] for id in new_artists_id:
class TestMusixmatch(unittest.TestCase): def setUp(self): self.musixmatch = Musixmatch(os.environ.get("APIKEY")) self.url = "http://api.musixmatch.com/ws/1.1/" def test_get_url(self): self.assertEqual( self.musixmatch._get_url("chart.artists.get?" "page=1&page_size=1&country=us" "&format=json"), self.url + "chart.artists.get?" "page=1&page_size=1" "&country=us&format=json&apikey={}".format( os.environ.get("APIKEY")), ) def test_apikey(self): self.assertEqual(self.musixmatch._apikey, os.environ.get("APIKEY")) def test_chart_artists(self): self.assertEqual( self.musixmatch.chart_artists(1, 1)["message"]["body"] ["artist_list"][0]["artist"]["artist_vanity_id"], "Ed-Sheeran", ) self.assertEqual( self.musixmatch.chart_artists(1, 1)["message"]["body"] ["artist_list"][0]["artist"]["artist_mbid"], "b8a7c51f-362c-4dcb-a259-bc6e0095f0a6", ) def test_chart_tracks_get(self): self.assertEqual( self.musixmatch.chart_tracks_get( 1, 1, 1)["message"]["body"]["track_list"][0]["track"]["album_name"], "2U (feat. Justin Bieber)", ) self.assertEqual( self.musixmatch.chart_tracks_get( 1, 1, 1)["message"]["body"]["track_list"][0]["track"]["track_name"], "2U", ) def test_track_search(self): self.assertEqual( self.musixmatch.track_search( q_track="Let Me Love You", q_artist="justinbieber", page_size=10, page=1, s_track_rating="desc", )["message"]["body"]["track_list"], [], ) def test_track_get(self): self.assertEqual( self.musixmatch.track_get(15445219)["message"]["body"]["track"] ["artist_name"], "Lady Gaga", ) self.assertEqual( self.musixmatch.track_get(15445219)["message"]["body"]["track"] ["album_name"], "The Fame Monster", ) def test_track_lyrics_get(self): self.assertEqual( self.musixmatch.track_lyrics_get(15953433)["message"]["body"] ["lyrics"]["lyrics_language"], "en", ) self.assertEqual( self.musixmatch.track_lyrics_get(15953433)["message"]["body"] ["lyrics"]["lyrics_language_description"], "English", ) self.assertEqual( self.musixmatch.track_lyrics_get(15953433)["message"]["body"] ["lyrics"]["lyrics_id"], 15912802, ) def test_track_snippet_get(self): self.assertEqual( self.musixmatch.track_snippet_get(16860631)["message"]["body"] ["snippet"]["snippet_id"], 16229519, ) self.assertEqual( self.musixmatch.track_snippet_get(16860631)["message"]["body"] ["snippet"]["snippet_body"], "You shoot me down, but I won't fall", ) def test_track_subtitle_get(self): self.assertEqual( self.musixmatch.track_subtitle_get(14201829)["message"]["body"], "") def test_track_richsync_get(self): self.assertEqual( self.musixmatch.track_richsync_get(114837357)["message"]["body"] ["richsync"]["richsync_id"], 6, ) self.assertEqual( self.musixmatch.track_richsync_get(114837357)["message"]["body"] ["richsync"]["richsync_length"], 230, ) def test_track_lyrics_post(self): self.assertEqual( self.musixmatch.track_lyrics_post( 1471157, "test")["message"]["header"]["status_code"], 200, ) self.assertEqual( self.musixmatch.track_lyrics_post(1471157, "test")["message"]["body"], "") def test_track_lyrics_feedback_post(self): self.assertEqual( self.musixmatch.track_lyrics_post( 1471157, 4193713, "wrong_verses")["message"]["body"], "", ) def test_matcher_lyrics_get(self): self.assertEqual( self.musixmatch.matcher_lyrics_get("Sexy and I know it", "LMFAO") ["message"]["body"]["lyrics"]["lyrics_language_description"], "English", ) self.assertEqual( self.musixmatch.matcher_lyrics_get( "Sexy and I know it", "LMFAO")["message"]["body"]["lyrics"]["lyrics_language"], "en", ) def test_matcher_track_get(self): self.assertEqual( self.musixmatch.matcher_track_get( "Lose Yourself (soundtrack)", "Eminem")["message"]["body"]["track"]["track_name"], "Lose Yourself - " "Soundtrack Version" " (Explicit)", ) self.assertEqual( self.musixmatch.matcher_track_get( "Lose Yourself (soundtrack)", "Eminem")["message"]["body"]["track"]["album_name"], "Curtain Call", ) def test_matcher_subtitle_get(self): self.assertEqual( self.musixmatch.matcher_subtitle_get("Sexy and I know it", "LMFAO", 200, 3)["message"]["body"], "", ) def test_artist_get(self): self.assertEqual( self.musixmatch.artist_get(118)["message"]["body"]["artist"] ["artist_name"], "Queen", ) self.assertEqual( self.musixmatch.artist_get(118)["message"]["body"]["artist"] ["artist_mbid"], "5eecaf18-02ec-47af-a4f2-7831db373419", ) def test_artist_search(self): self.assertEqual( self.musixmatch.artist_search( "prodigy", 1, 1, 16439, "4a4ee089-93b1-4470-af9a-6ff575d32704") ["message"]["body"]["artist_list"][0]["artist"]["artist_id"], 16439, ) self.assertEqual( self.musixmatch.artist_search( "prodigy", 1, 1, 16439, "4a4ee089-93b1-4470-af9a-6ff575d32704") ["message"]["body"]["artist_list"][0]["artist"]["artist_name"], "The Prodigy", ) def test_artist_albums_get(self): self.assertEqual( self.musixmatch.artist_albums_get(1039, 1, 1, 1, "desc")["message"] ["body"]["album_list"][0]["album"]["album_id"], 25660826, ) self.assertEqual( self.musixmatch.artist_albums_get(1039, 1, 1, 1, "desc")["message"] ["body"]["album_list"][0]["album"]["album_name"], "Kaleidoscope", ) def test_artist_related_get(self): self.assertEqual( self.musixmatch.artist_related_get( 56, 1, 1)["message"]["body"]["artist_list"][0]["artist"]["artist_id"], 298, ) self.assertEqual( self.musixmatch.artist_related_get(56, 1, 1)["message"]["body"] ["artist_list"][0]["artist"]["artist_name"], "Outkast", ) def test_album_get(self): self.assertEqual( self.musixmatch.album_get(14250417)["message"]["body"]["album"] ["album_id"], 14250417, ) self.assertEqual( self.musixmatch.album_get(14250417)["message"]["body"]["album"] ["album_name"], "Party Rock", ) def test_album_tracks_get(self): self.assertEqual( self.musixmatch.album_tracks_get( 13750844, 1, 1, "")["message"]["body"]["track_list"][0]["track"]["track_id"], 30057052, ) self.assertEqual( self.musixmatch.album_tracks_get( 13750844, 1, 1, "")["message"]["body"]["track_list"][0]["track"]["track_name"], "Don't Panic", ) def test_tracking_url_get(self): self.assertEqual( self.musixmatch.tracking_url_get("www.mylyricswebsite.com") ["message"]["header"]["status_code"], 200, ) def test_catalogue_dump_get(self): self.assertEqual( self.musixmatch.catalogue_dump_get("test")["message"]["body"], "")