Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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'], '')
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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
Exemplo n.º 5
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:
Exemplo n.º 6
0
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"], "")