def get_context_data(self, **kwargs): query = self.request.GET.get('query', '') parts = query.lower().split() artists, songs = [], [] if any(p in moods for p in parts): for part in parts: if part in moods: artists.extend(eartist.similar(mood=part, results=15)) if any(p in styles for p in parts): for part in parts: if part in styles: artists.extend(eartist.similar(style=part, results=15)) random.shuffle(artists) extracted = eartist.extract(query) if extracted: for artist in extracted: artists.insert(0, eartist.Artist(id=artist.id)) artists.extend(eartist.similar(ids=[art.id for art in extracted], results=15)) if artists: songs = list(flatten_iterator(a.get_songs() for a in artists)) #random.shuffle(songs) real = {} for song in songs: real[song.title] = song retval = [{ 'track': s.title, 'artist': s.artist_name, 'album': '' } for s in real.values()[:15]] print retval, len(retval) info = requests.get('http://api.jamendo.com/get2/id+name+duration+stream+album_name+artist_name/track/json/track_album+album_artist/', params={'searchquery': query, 'streamencoding': 'ogg2', 'n': 5}) items = [{ 'track': s['name'], 'artist': s['artist_name'], 'album': s['album_name'] } for s in json.loads(info.content)] for item in items: retval.append(item) return retval
def crawl(): while len(queue) > 0: hot, id, fid, name = get_hottest() sfid = short_fid(fid) if id in sim_done: continue print "%4d %4d %.3f %s" % (len(sim_done), len(queue), hot, name) print >> outfile, "artist", S, id, S, name, S, sfid, S, hot try: sims = artist.similar( ids=[id], results=12, buckets=["hotttnesss", "familiarity", "id:" + idspace], limit=True, min_hotttnesss=min_hotttnesss, ) for s in sims: proc_artist(s) for s in sims: simfid = s.get_foreign_id(idspace=idspace) ssimfid = short_fid(simfid) try: print >> outfile, "sim", S, id, S, name, S, s.id, S, s.name, S, s.hotttnesss, S, ssimfid if s.id not in sim_done: queue.append((s.hotttnesss, s.id, simfid, s.name)) except UnicodeDecodeError: print "skipping artist because of unicode error", s.id sim_done.add(id) except urllib2.URLError: time.sleep(10) except util.EchoNestAPIError: time.sleep(5)
def crawl(): while len(queue) > 0: hot, id, fid, name = get_hottest() sfid = short_fid(fid) if id in sim_done: continue print "%4d %4d %.3f %s" % (len(sim_done), len(queue), hot, name) print >> outfile, 'artist', S, id, S, name, S, sfid, S, hot try: sims = artist.similar( ids=[id], results=12, buckets=['hotttnesss', 'familiarity', 'id:' + idspace], limit=True, min_hotttnesss=min_hotttnesss) for s in sims: proc_artist(s) for s in sims: simfid = s.get_foreign_id(idspace=idspace) ssimfid = short_fid(simfid) try: print >> outfile, 'sim', S, id, S, name, S, s.id, S, s.name, S, s.hotttnesss, S, ssimfid if s.id not in sim_done: queue.append((s.hotttnesss, s.id, simfid, s.name)) except UnicodeDecodeError: print "skipping artist because of unicode error", s.id sim_done.add(id) except urllib2.URLError: time.sleep(10) except util.EchoNestAPIError: time.sleep(5)
def GET(self, name): out_names = [] try: similar = artist.similar(name) except util.EchoNestAPIError: return "error" for a in similar: out_names.append(a.name) return json.dumps(out_names)
def suggest_artist(pos_seeds, neg_seeds, fame): # fame_level 0-10, 1 is Justin Bieber, 0 is a Tufts band. fame_level = fame / 10.0 print pos_seeds print neg_seeds pos_artists = [artist.Artist(a) for a in pos_seeds] if pos_seeds else None neg_artists = [artist.Artist(a) for a in neg_seeds] if neg_seeds else None #Totally arbitrary, but it maintains a good level of hotttnesss. hot_level = (1 - fame_level)/2 + 0.1 similars = [] dissimilars = [] # Decreases needed hotness level and increases familiarity upper bound # until a band is found. if pos_artists and neg_artists: while len(similars) < 1: similars = artist.similar(ids =[a.id for a in pos_artists], results = 20, max_familiarity = fame_level, min_hotttnesss = hot_level) dissimilars = artist.similar(ids = [a.id for a in neg_artists], results = 20, max_familiarity = fame_level, min_hotttnesss = hot_level) hot_level -= 0.05 fame_level += 0.025 similars = [a for a in similars if not a in dissimilars] else: while len(similars) < 1: similars = artist.similar(ids =[a.id for a in pos_artists], results = 20, max_familiarity = fame_level, min_hotttnesss = hot_level) hot_level -= 0.05 fame_level += 0.025 r = randint(0,len(similars)-1) return similars[r]
def get_en_similar(artist): similar_list = [] similars = echonest_artist.similar(artist['echonest_data']['echonest_id'], results=99) if len(similars) > 0: for similar in similars: print "Echonest similar: {0}".format(similar) similar_insert = find_insert({"echonest_data.echonest_id":similar.id}, {"name":similar.name, "echonest_data":{"echonest_id":similar.id}}, False, False) similar_list.append(similar_insert['_id']) update = db.artist.update({"_id" : artist['_id']}, {"$set": {"echonest_data.echonest_similar": similar_list}})
def relatedArtist(artist_id): listArtist = [] ##try: bk = artist.Artist(artist_id) ##except WebServiceError as exc: ## print("Something went wrong with the request: %s" % exc) ##else: similar = artist.similar(ids=bk.id, results=5) for similar_artist in similar: listArtist.append((similar_artist.name, similar_artist.id, "similar")) return listArtist
def makePlaylist(searchArtist, chordProgression): # Create the playlist playlist = [] # Choose from similar artists similarArtists = artist.similar(names=searchArtist); for i in range(len(chordProgression)): randArtist = random.randint(0, len(similarArtists) - 1) artistName = similarArtists[randArtist].name # Search for a song by the chosen artist in the specified key or mode playSongs = song.search(artist=artistName, key=chordProgression[i]['key'], mode=chordProgression[i]['mode'], buckets=["tracks","id:7digital"], limit="true") #playSongs = song.search(artist=artistName, key=chordProgression[i]['key'], mode=chordProgression[i]['mode'], buckets=["tracks","id:rdio-us-streaming"], limit="true") #if len(playSongs) == 0: # print chordProgression[i]['name'], artistName, "NOT FOUND" #else: # print chordProgression[i]['name'], artistName, playSongs[0].title playTrack = playSongs[0].get_tracks("7digital") #playTrack = playSongs[0].get_foreign_ids("rdio-us-streaming"); if len(playSongs) > 0 and len(playTrack) > 0 : playlist.append({'chord' : chordProgression[i]['name'], 'artist' : artistName, 'title' : playSongs[0].title, 'key' : chordProgression[i]['key'], 'mode' : chordProgression[i]['mode'], 'mp3' : playTrack[0]['preview_url'], 'image' : playTrack[0]['release_image'] }) #'rdio' : playTrack[0]['foreign_id'] }) elif len(playSongs) > 0 : playlist.append({'chord' : chordProgression[i]['name'], 'artist' : artistName, 'title' : playSongs[0].title, 'key' : chordProgression[i]['key'], 'mode' : chordProgression[i]['mode'], 'mp3' : "NOT FOUND", 'image' : "NOT FOUND"}) #'rdio' : "NOT FOUND" }) return playlist
def makePlaylist(searchArtist, chordProgression): # Create the playlist playlist = [] # Choose from similar artists similarArtists = artist.similar(names=searchArtist); for i in range(len(chordProgression)): randArtist = random.randint(0, len(similarArtists) - 1) artistName = similarArtists[randArtist].name # Search for a song by the chosen artist in the specified key or mode playSongs = song.search(artist=artistName, key=chordProgression[i]['key'], mode=chordProgression[i]['mode'], buckets=["tracks",catalogId], limit="true") if len(playSongs) > 0: playTrack = playSongs[0].get_tracks(catalog) if len(playSongs) > 0 and len(playTrack) > 0 : playlist.append({'chord' : chordProgression[i]['name'], 'artist' : artistName, 'title' : playSongs[0].title, 'key' : chordProgression[i]['key'], 'mode' : chordProgression[i]['mode'], 'mp3' : playTrack[0]['preview_url'], 'image' : playTrack[0]['release_image'] }) elif len(playSongs) > 0 : playlist.append({'chord' : chordProgression[i]['name'], 'artist' : artistName, 'title' : playSongs[0].title, 'key' : chordProgression[i]['key'], 'mode' : chordProgression[i]['mode'], 'mp3' : "NOT FOUND", 'image' : "NOT FOUND"}) return playlist
def search(self,search_artist,user,new_search): cherrypy.response.headers['Content-Type'] = 'application/json' # This doesn't quite work yet, commented out for purpose of demonstration #if user=='1': # if similar.__len__>1: # if new_search=='1': # del similar[0:len(similar)] # if similar.__len__==5: # print "Length is 5" # del similar[1] # if search_artist not in [art.name for art in similar]: # similar.append(artist.Artist(search_artist)) # else: # similar.append(artist.Artist(search_artist)) #print [art.name for art in similar] similarArtists=artist.similar(names=artist.Artist(search_artist),results=50) random.shuffle(similarArtists) currentImage=artist.Artist(search_artist).get_images(results=50) random.shuffle(currentImage) currentImageURL = currentImage[0]['url'] tracks=song.search(artist=search_artist,song_min_hotttnesss=0.5,results=50) self.currentName = search_artist random.shuffle(tracks) currentArtist = artist.Artist(search_artist).name #print currentTrackName, currentArtist image1=similarArtists[0].get_images(results=50) random.shuffle(image1) image2=similarArtists[1].get_images(results=50) random.shuffle(image2) image3=similarArtists[2].get_images(results=50) random.shuffle(image3) #print image1, image2, image3 if(len(tracks)== 0): tracks = song.search(artist=search_artist, results=10) if(len(tracks) == 0): currentTrackName = "No Track Found!" else: currentTrackName = tracks[0].title else: currentTrackName=tracks[0].title for t in tracks: streamLink = self.play_song(t.title, currentArtist) currentTrackName = t.title if(streamLink is None or streamLink is ""): continue else: print "Stream link getting returned is: " + streamLink if streamLink.__len__==0: status="error" else: status="success" return simplejson.dumps(dict(currentTrack=currentTrackName,currentArtistName=currentArtist,currentArtistImage=currentImageURL,simArtist1Name=similarArtists[0].name,simArtist1Image=image1[0]['url'],simArtist2Name=similarArtists[1].name,simArtist2Image=image2[0]['url'],simArtist3Name=similarArtists[2].name,simArtist3Image=image3[0]['url'],streamURL=streamLink,status=status)) streamLink = self.play_song(currentTrackName, currentArtist)
# Uncomment to set the API key explicitly. Otherwise Pyechonest will # look in the ECHO_NEST_API_KEY environment variable for the key. #from pyechonest import config #config.ECHO_NEST_API_KEY='YOUR API KEY' from pyechonest import artist hottt_artists = artist.top_hottt(results=3) similar_artists = artist.similar(names=[hottt_artist.name for hottt_artist in hottt_artists]) for similar_artist in similar_artists: similar_to = [] for hottt_artist in hottt_artists: if similar_artist in hottt_artist.similar: similar_to.append(hottt_artist.name) print '%-30s %16s %s' % (similar_artist.name[0:30], similar_artist.hotttnesss, '...is in the top 15 similars of: ' + ', '.join(similar_to))
print "<li><a href='#%s'>%s<a>" % (art.name,art.name) print "<li><a href='#similar'>Similar Artists</a></ul>" for i in range(len(artists)): art = artists[i] bios = art.biographies largest = 0 # Uses longest biography for b in range(len(bios)): if len(bios[b]['text']) > len(bios[largest]['text']): largest = b bio = bios[largest]['text'] img = art.images[2]['url'] print "<br><a id='%s'><br><h1>%s</h1>" % (art.name,art.name) print "</h1><img src='%s' style='height:300px'>" % img.encode('utf-8') print bio.encode('utf-8') print "<br><a id='similar'><br><h1>Similar Artists</h1><ul>" for s in similar: print "<li>%s" % s print "</ul>" print "</body></html>" if __name__ == '__main__': if len(sys.argv) < 4: print "Usage:\n\t$ python %s [artist1] [artist2] [artist3] [...] > output.html" % sys.argv[0] else: artists = [] for i in range(1,len(sys.argv)): artists.append(queryArtist(sys.argv[i])) similar = artist.similar(names=artists) printHTML(artists,similar)
# Uncomment to set the API key explicitly. Otherwise Pyechonest will # look in the ECHO_NEST_API_KEY environment variable for the key. #from pyechonest import config #config.ECHO_NEST_API_KEY='YOUR API KEY' from pyechonest import artist hottt_artists = artist.top_hottt(results=3) similar_artists = artist.similar( names=[hottt_artist.name for hottt_artist in hottt_artists]) for similar_artist in similar_artists: similar_to = [] for hottt_artist in hottt_artists: if similar_artist in hottt_artist.similar: similar_to.append(hottt_artist.name) print '%-30s %16s %s' % ( similar_artist.name[0:30], similar_artist.hotttnesss, '...is in the top 15 similars of: ' + ', '.join(similar_to))
def search(self, search_artist, user, new_search): cherrypy.response.headers['Content-Type'] = 'application/json' # This doesn't quite work yet, commented out for purpose of demonstration #if user=='1': # if similar.__len__>1: # if new_search=='1': # del similar[0:len(similar)] # if similar.__len__==5: # print "Length is 5" # del similar[1] # if search_artist not in [art.name for art in similar]: # similar.append(artist.Artist(search_artist)) # else: # similar.append(artist.Artist(search_artist)) #print [art.name for art in similar] similarArtists = artist.similar(names=artist.Artist(search_artist), results=50) random.shuffle(similarArtists) currentImage = artist.Artist(search_artist).get_images(results=50) random.shuffle(currentImage) currentImageURL = currentImage[0]['url'] tracks = song.search(artist=search_artist, song_min_hotttnesss=0.5, results=50) self.currentName = search_artist random.shuffle(tracks) currentArtist = artist.Artist(search_artist).name #print currentTrackName, currentArtist image1 = similarArtists[0].get_images(results=50) random.shuffle(image1) image2 = similarArtists[1].get_images(results=50) random.shuffle(image2) image3 = similarArtists[2].get_images(results=50) random.shuffle(image3) #print image1, image2, image3 if (len(tracks) == 0): tracks = song.search(artist=search_artist, results=10) if (len(tracks) == 0): currentTrackName = "No Track Found!" else: currentTrackName = tracks[0].title else: currentTrackName = tracks[0].title for t in tracks: streamLink = self.play_song(t.title, currentArtist) currentTrackName = t.title if (streamLink is None or streamLink is ""): continue else: print "Stream link getting returned is: " + streamLink if streamLink.__len__ == 0: status = "error" else: status = "success" return simplejson.dumps( dict(currentTrack=currentTrackName, currentArtistName=currentArtist, currentArtistImage=currentImageURL, simArtist1Name=similarArtists[0].name, simArtist1Image=image1[0]['url'], simArtist2Name=similarArtists[1].name, simArtist2Image=image2[0]['url'], simArtist3Name=similarArtists[2].name, simArtist3Image=image3[0]['url'], streamURL=streamLink, status=status)) streamLink = self.play_song(currentTrackName, currentArtist)
def getSimilarArtists(Artist, min_results=15, results=15): similar = artist.similar(Artist.name, buckets = ["familiarity", "hotttnesss"], min_results=min_results, results=results) return similar
def similar_artists(): artists = [artist.Artist("spotify-WW:artist:2SHhfs4BiDxGQ3oxqf0UHY"), artist.Artist("spotify-WW:artist:0LcJLqbBmaGUft1e9Mm8HV")] print "Artists similar to", ", ".join([a.name for a in artists]) for a in artist.similar(ids=[a.id for a in artists], buckets=["id:spotify-WW"]): print "-", a.name, "(%s)" % a.get_foreign_id("spotify-WW").replace("spotify-WW", "spotify")