예제 #1
0
def _annotate_tracks_with_echonest_data(tids):
    otids = tlib.annotate_tracks_from_cache('echonest', tids)
    if len(otids) > 0:
        stids = set(otids)
        uris = ['spotify:track:' + tid for tid in otids]
        try:
            if debug:
                print 'getting echonest info for', otids
            response = _get_en().get('song/profile',
                                     track_id=uris,
                                     bucket=_en_song_buckets)
            res = set()
            for song in response['songs']:
                for track in song['tracks']:
                    tid = utils.uri_to_id(track['foreign_id'])
                    if tid in stids:
                        res.add(tid)
                        tlib.annotate_track(tid, 'echonest',
                                            _flatten_en_song(song, tid))
            diff = stids - res
            if len(diff) > 0:
                pass
                #print 'requested', len(stids), 'collected', len(res)
        except pyen.PyenException as e:
            print 'annotate_tracks_with_echonest_data:no info for', otids
            print 'echonest error', e.http_status, e.code, e.msg
            for tid in otids:
                tlib.annotate_track(tid, 'echonest', {'empty': 'empty'})
예제 #2
0
def _annotate_tracks_with_spotify_data(tids):
    tids = tlib.annotate_tracks_from_cache('spotify', tids)
    if len(tids) > 0:
        print 'annotate tracks with spotify', tids
        results = _get_spotify().tracks(tids)
        for track in results['tracks']:
            tlib.annotate_track(track['id'], 'spotify', track)
예제 #3
0
def _annotate_tracks_with_spotify_data(tids):
    tids = tlib.annotate_tracks_from_cache('spotify', tids)
    if len(tids) > 0:
        print 'annotate tracks with spotify', tids
        results = _get_spotify().tracks(tids)
        for track in results['tracks']:
            tlib.annotate_track(track['id'], 'spotify', track)
예제 #4
0
def _annotate_tracks_with_echonest_data(tids):
    otids = tlib.annotate_tracks_from_cache('echonest', tids)
    if len(otids) > 0:
        stids = set(otids)
        uris = [ 'spotify:track:' + tid for tid in otids]
        try:
            if debug:
                print 'getting echonest info for', otids
            response = _get_en().get('song/profile', track_id=uris, bucket=_en_song_buckets)
            res = set()
            for song in response['songs']:
                for track in song['tracks']:
                    tid = utils.uri_to_id(track['foreign_id'])
                    if tid in stids:
                        res.add(tid)
                        tlib.annotate_track(tid, 'echonest', _flatten_en_song(song, tid))
            diff = stids - res
            if len(diff) > 0:
                pass
                #print 'requested', len(stids), 'collected', len(res)
        except pyen.PyenException as e:
            print 'annotate_tracks_with_echonest_data:no info for', otids
            print 'echonest error', e.http_status, e.code, e.msg
            for tid in otids:
                tlib.annotate_track(tid, 'echonest', {'empty': 'empty'})
예제 #5
0
def _annotate_tracks_with_spotify_data_full(tids):
    # full annotation
    print "spotify full annotate", len(tids)
    tids = tlib.annotate_tracks_from_cache('spotify', tids)
    if len(tids) > 0:
        # print 'annotate tracks with spotify', tids
        results = _get_spotify().tracks(tids)
        album_ids = set()
        artist_ids = set()
        for track in results['tracks']:
            album_ids.add(track['album']['id'])
            for artist in track['artists']:
                artist_ids.add(artist['id'])

        print "  spotify artist annotate", len(artist_ids)
        print "  spotify album annotate", len(album_ids)
        albums = get_albums(album_ids)
        artists = get_artists(artist_ids)


        for track in results['tracks']:
            ntrack = {}
            primary_artist = artists[track['artists'][0]['id']]
            album = albums[track['album']['id']]
            ntrack['duration_ms'] = track['duration_ms']
            ntrack['explicit'] = track['explicit']
            ntrack['popularity'] = track['popularity']
            ntrack['track_number'] = track['track_number']
            ntrack['disc_number'] = track['disc_number']

            ntrack['primary_artist_genres'] = album['genres']
            ntrack['primary_artist_popularity'] = primary_artist['popularity']
            ntrack['primary_artist_followers'] = primary_artist['followers']

            ntrack['album_name'] = album['name']
            ntrack['album_id'] = album['id']
            ntrack['album_genres'] = album['genres']
            ntrack['album_release_date'] = album['release_date']
            ntrack['album_popularity'] = album['popularity']
            ntrack['album_type'] = album['album_type']

            if False:
                ntrack['primary_artist'] = primary_artist
                full_artists = []
                for artist in track['artists']:
                    full_artists.append(artists[artist['id']])
                track['artists'] = full_artists

            tlib.annotate_track(track['id'], 'spotify', ntrack)
예제 #6
0
def _annotate_tracks_with_spotify_data_full(tids):
    # full annotation
    print "spotify full annotate", len(tids)
    tids = tlib.annotate_tracks_from_cache('spotify', tids)
    if len(tids) > 0:
        # print 'annotate tracks with spotify', tids
        results = _get_spotify().tracks(tids)
        album_ids = set()
        artist_ids = set()
        for track in results['tracks']:
            album_ids.add(track['album']['id'])
            for artist in track['artists']:
                artist_ids.add(artist['id'])

        print "  spotify artist annotate", len(artist_ids)
        print "  spotify album annotate", len(album_ids)
        albums = get_albums(album_ids)
        artists = get_artists(artist_ids)

        for track in results['tracks']:
            ntrack = {}
            primary_artist = artists[track['artists'][0]['id']]
            album = albums[track['album']['id']]
            ntrack['duration_ms'] = track['duration_ms']
            ntrack['explicit'] = track['explicit']
            ntrack['popularity'] = track['popularity']
            ntrack['track_number'] = track['track_number']
            ntrack['disc_number'] = track['disc_number']

            ntrack['primary_artist_genres'] = album['genres']
            ntrack['primary_artist_popularity'] = primary_artist['popularity']
            ntrack['primary_artist_followers'] = primary_artist['followers']

            ntrack['album_name'] = album['name']
            ntrack['album_id'] = album['id']
            ntrack['album_genres'] = album['genres']
            ntrack['album_release_date'] = album['release_date']
            ntrack['album_popularity'] = album['popularity']
            ntrack['album_type'] = album['album_type']

            if False:
                ntrack['primary_artist'] = primary_artist
                full_artists = []
                for artist in track['artists']:
                    full_artists.append(artists[artist['id']])
                track['artists'] = full_artists

            tlib.annotate_track(track['id'], 'spotify', ntrack)
예제 #7
0
def _annotate_tracks_with_audio_features(tids):
    otids = tlib.annotate_tracks_from_cache('audio', tids)
    if len(otids) > 0:
        stids = set(otids)
        try:
            results = _get_spotify().audio_features(otids)
            for track in results:
                if track and 'id' in track:
                    # print 'audio', json.dumps(track, indent=4)
                    tlib.annotate_track(track['id'], 'audio', track)
        except spotipy.SpotifyException as e:
            # we may get a 404 if we request features for a single
            # track and the track is missing. In this case we can
            # ignore the error
            if e.http_status >= 400 and e.http_status < 500:
                pass
            else:
                raise engine.PBLException(self, e.msg)
예제 #8
0
def _annotate_tracks_with_audio_features(tids):
    otids = tlib.annotate_tracks_from_cache('audio', tids)
    if len(otids) > 0:
        stids = set(otids)
        try:
            results = _get_spotify().audio_features(otids)
            for track in results:
                if track and 'id' in track:
                    # print 'audio', json.dumps(track, indent=4)
                    tlib.annotate_track(track['id'], 'audio', track)
        except spotipy.SpotifyException as e:
            # we may get a 404 if we request features for a single
            # track and the track is missing. In this case we can
            # ignore the error
            if e.http_status >= 400 and e.http_status < 500:
                pass
            else:
                raise engine.PBLException(self, e.msg)
예제 #9
0
def _add_track(source, track):
    dur = int(track['duration_ms'] / 1000.)
    tlib.make_track(track['id'], track['name'], 
                track['artists'][0]['name'], dur, source)
    tlib.annotate_track(track['id'], 'spotify', _flatten_track(track))
예제 #10
0
def _add_track(source, track):
    dur = int(track['duration_ms'] / 1000.)
    tlib.make_track(track['id'], track['name'], track['artists'][0]['name'],
                    dur, source)
    tlib.annotate_track(track['id'], 'spotify', _flatten_track(track))
예제 #11
0
def _add_song(source, song):
    id = utils.uri_to_id(song['tracks'][0]['foreign_id'])
    dur = int(song['audio_summary']['duration'])
    tlib.make_track(id, song['title'], song['artist_name'], dur, source)
    tlib.annotate_track(id, 'echonest', _flatten_en_song(song, id))
    return id
예제 #12
0
def _add_song(source, song):
    id = utils.uri_to_id(song['tracks'][0]['foreign_id'])
    dur = int(song['audio_summary']['duration'] )
    tlib.make_track(id, song['title'], song['artist_name'], dur, source)
    tlib.annotate_track(id, 'echonest', _flatten_en_song(song, id))
    return id