yading@7: yading@7: yading@7: import os yading@7: import sys yading@7: import pickle yading@7: yading@7: from xml.dom import minidom yading@7: import urllib2 #call url function yading@7: import time yading@7: import sqlite3 yading@7: import cPickle yading@7: yading@7: import pyechonest # import echonest API yading@7: import pylast # import last.fm API yading@7: from pyechonest import artist, catalog, config, playlist # How it works instead of pyechonest yading@7: yading@7: yading@7: #change the path to 7-digital python library yading@7: sys.path.append("7digital-python/lib/") yading@7: import py7digital yading@7: yading@7: """ API Key from echonest """ yading@7: #Your API Key: SFXNKMTRAZ3ULHK6U yading@7: #Your Consumer Key: 54a06c9bd235d47f787d8cf614577a94 yading@7: #Your Shared Secret: aiPUaTToTpixW4Ttaf4O9A yading@7: yading@7: """API key from 7 digital""" yading@7: # oauth_consumer_key=7dbpa63h3y3d yading@7: # oauth_consumer_secret=zz48d4epsqmrsuvp yading@7: yading@7: """API key from last.fm""" yading@7: # Your API Key is bd1cb09de31188b43aa46f39b8e40614 yading@7: # Your secret is d2537b0ce8bc859a6068833c5e2a72a7 yading@7: yading@7: """"*********************************************************************************""" yading@7: yading@7: # Echo Nest API key yading@7: config.ECHO_NEST_API_KEY="SFXNKMTRAZ3ULHK6U " yading@7: yading@7: # 7 digital API key yading@7: DIGITAL7_API_KEY = '7dbpa63h3y3d' yading@7: yading@7: """The use of last.fm API""" yading@7: API_KEY = "bd1cb09de31188b43aa46f39b8e40614" yading@7: API_SECRET = "d2537b0ce8bc859a6068833c5e2a72a7" yading@7: yading@7: """Authentication, username and password""" yading@7: username = "QMYading" yading@7: password_hash = pylast.md5("123456") yading@7: network = pylast.LastFMNetwork(api_key = API_KEY, api_secret = yading@7: API_SECRET, username = username, password_hash = password_hash) yading@7: yading@7: def url_call(url): yading@7: """ yading@7: ***This method is from get_preview_url.py by Thierry Bertin-Mahieux*** yading@7: Do a simple request to the 7digital API yading@7: We assume we don't do intense querying, this function is not robust yading@7: Return the answer as na xml document yading@7: """ yading@7: stream = urllib2.urlopen(url) yading@7: xmldoc = minidom.parse(stream).documentElement yading@7: stream.close() yading@7: return xmldoc yading@7: yading@7: def get_trackid_from_text_search(title,artistname=''): yading@7: """ yading@7: ***This method is from get_preview_url.py by Thierry Bertin-Mahieux*** yading@7: Search for an artist + title using 7digital search API yading@7: Return None if there is a problem, or tuple (title,trackid) yading@7: """ yading@7: url = 'http://api.7digital.com/1.2/track/search?' yading@7: url += 'oauth_consumer_key='+DIGITAL7_API_KEY yading@7: query = title yading@7: if artistname != '': yading@7: query = artistname + ' ' + query yading@7: query = urllib2.quote(query) yading@7: url += '&q='+query yading@7: xmldoc = url_call(url) yading@7: status = xmldoc.getAttribute('status') yading@7: if status != 'ok': yading@7: return None yading@7: resultelem = xmldoc.getElementsByTagName('searchResult') yading@7: if len(resultelem) == 0: yading@7: return None yading@7: track = resultelem[0].getElementsByTagName('track')[0] yading@7: tracktitle = track.getElementsByTagName('title')[0].firstChild.data yading@7: trackid = int(track.getAttribute('id')) yading@7: return (tracktitle,trackid) yading@7: yading@7: def get_preview_from_trackid(trackid): yading@7: """ yading@7: ***This method is from get_preview_url.py by Thierry Bertin-Mahieux*** yading@7: Ask for the preview to a particular track, get the XML answer yading@7: After calling the API with a given track id, yading@7: we get an XML response that looks like: yading@7: yading@7: yading@7: yading@7: http://previews.7digital.com/clips/34/6804688.clip.mp3 yading@7: yading@7: yading@7: yading@7: We parse it for the URL that we return, or '' if a problem yading@7: """ yading@7: url = 'http://api.7digital.com/1.2/track/preview?redirect=false' yading@7: url += '&trackid='+str(trackid) yading@7: url += '&oauth_consumer_key='+DIGITAL7_API_KEY yading@7: xmldoc = url_call(url) yading@7: status = xmldoc.getAttribute('status') yading@7: if status != 'ok': yading@7: return '' yading@7: urlelem = xmldoc.getElementsByTagName('url')[0] yading@7: preview = urlelem.firstChild.nodeValue yading@7: return preview yading@7: yading@7: #function that downloads a file yading@7: def download_file(file_url, file_name): yading@7: # open the url yading@7: mp3file = urllib2.urlopen(file_url) yading@7: yading@7: # open the local file for writing yading@7: local_file = open(file_name, "wb") yading@7: # write to file yading@7: local_file.write(mp3file.read()) yading@7: local_file.close() yading@7: yading@7: yading@7: yading@7: yading@7: # get artist object yading@7: # artist_object = network.get_artist("System of a Down") yading@7: yading@7: # get the mbid for the tracks yading@7: # print(artist_object.get_mbid()) yading@7: yading@7: # print(os.getcwd()) #print current working directory yading@7: # artist_object.shout("Artist object created successful!") yading@7: yading@7: # get track object yading@7: # track_object = network.get_track("Iron Maiden", "The Nomad") yading@7: # track_object.add_tags(("awesome", "favorite")) # add tags to the tracks yading@7: yading@7: #get get_album object yading@7: #album_object = network.get_album("Adele","21") yading@7: yading@7: # get tags object yading@7: #os.chdir('./NEW_Tagsets/') # change current working directory yading@7: #tag_classification = ["Happy", "Sad", "Angry", "Relax","Sport", "Study","Entertainment","Travelling"] yading@7: #tag_classification = ["Happy", "Sad", "Angry", "Relax","Sport", "Study","Entertainment","Travel"] yading@7: #tag_classification = ["Sad", "Angry", "Relax","Sport", "Study","Entertainment","Travel"] yading@7: #tag_classification = ["Travel"] yading@7: yading@7: tag_classification = ["wake me up"] yading@7: yading@7: #tag_classification = ["Passionate","Rollicking","Literate","Humorous","Aggressive"] yading@7: #tag_classification = ["Joy","Fun","Cheerful","Pleasing","Pleasant"] yading@7: #tag_classification = ["Romantic","Love"] yading@7: yading@7: #tag_classification = ["silly", "campy", "quirky", "whimsical", "witty", "wry"] yading@7: #tag_classification = ["fiery","tense","anxious","intense", "volatile","visceral"] yading@7: #tag_classification = ["poignant","wistful", "bittersweet", "autumnal", "brooding"] yading@7: #tag_classification = ["rousing", "confident","boisterous", "rowdy"] yading@7: #tag_classification = ["sweet", "amiable","good natured"] yading@7: yading@7: yading@7: track = network.track yading@7: yading@7: # search for similar tag according to the seeds in tag_classification yading@7: for tags_name in tag_classification: yading@7: tags = network.search_for_tag(tags_name) yading@7: # filtering the results yading@7: tags_search = tags.get_next_page() yading@7: tag_file_name = tags_name + "_tags_results.txt" yading@7: yading@7: # print the tag name, i.e happy_tag_results.txt yading@7: print(tag_file_name) yading@7: yading@7: print("successfully written in the file") yading@7: yading@7: tag_data = open(tag_file_name, 'wb') # open and write the file for top tags yading@7: yading@7: os.makedirs(str(tags_name)) yading@7: os.chdir('./' + str(tags_name) + '/') yading@7: yading@7: # write the similar with a topic yading@7: for each_letter in tags_search: yading@7: # store the each lexical into the file. i.e 'happy' 'very happy' yading@7: tag_data.write("%s\n" % each_letter) yading@7: # create a directory with tag name yading@7: os.makedirs(str(each_letter)) yading@7: os.chdir('./' + str(each_letter) + '/') yading@7: yading@7: # store each lexical tag as a tag_object yading@7: tag_object = network.get_tag(each_letter) yading@7: tracks_results = tag_object.get_top_tracks() yading@7: yading@7: track_file_name = str(each_letter) + "_results.txt" yading@7: tag_track_file = open(track_file_name,'wb') # open and write the file for tracks with tag yading@7: yading@7: print(track_file_name) yading@7: yading@7: # write the tracks result with special tags yading@7: for each_line in tracks_results: yading@7: tag_track_file.write("%s%s\n" % each_line) yading@7: yading@7: tag_track_file.close() yading@7: yading@7: artist_file_name = str(each_letter) + "_artist.txt" yading@7: title_file_name = str(each_letter) + "_title.txt" yading@7: #id_file_name = str(each_letter) + "_id.txt" yading@7: yading@7: # open the track info file yading@7: newdata = open(track_file_name) yading@7: artist_data = open(artist_file_name,'wb') yading@7: title_data = open(title_file_name,'wb') yading@7: #id_file = open(id_file_name,"wb") yading@7: yading@7: yading@7: for each_row in newdata: yading@7: yading@7: (artist,title) = each_row.split('-',1) yading@7: title = title.strip() #delete the extra space yading@7: title = title.rstrip('0') #get rid of the 0 at the end yading@7: yading@7: artist_data.write("%s\n" % artist) yading@7: title_data.write("%s\n" % title) yading@7: yading@7: print artist yading@7: print title yading@7: yading@7: try: yading@7: (tracktitle,trackid) = get_trackid_from_text_search(title,artist) yading@7: yading@7: if trackid is not None: yading@7: # fetch the url yading@7: audio_url = get_preview_from_trackid(trackid) yading@7: print(audio_url) yading@7: # fetch the audio and save in the correct folder yading@7: yading@7: file_name = tracktitle + u'.wav' yading@7: file_name = file_name.replace(u'/', u' ') yading@7: #file_name = t.title + u'.mp3' yading@7: print file_name yading@7: print("downloading") yading@7: yading@7: # download_path = os.path.join(file_path, file_name) yading@7: path_name = './' + file_name yading@7: mp3 = download_file(audio_url, path_name) yading@7: except: yading@7: pass yading@7: yading@7: yading@7: yading@7: # id_file_name.close() yading@7: artist_data.close() yading@7: title_data.close() yading@7: newdata.close() yading@7: parent_path = '../' yading@7: os.chdir(parent_path) yading@7: yading@7: os.chdir(parent_path) yading@7: yading@7: tag_data.close() yading@7: yading@7: # check the directory, write to the current directory, yading@7: # if it doens't exist, create a new one