annotate Yading/new_track_data.py @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 8c29444cb5fd
children
rev   line source
yading@7 1
yading@7 2
yading@7 3 import os
yading@7 4 import sys
yading@7 5 import pickle
yading@7 6
yading@7 7 from xml.dom import minidom
yading@7 8 import urllib2 #call url function
yading@7 9 import time
yading@7 10 import sqlite3
yading@7 11 import cPickle
yading@7 12
yading@7 13 import pyechonest # import echonest API
yading@7 14 import pylast # import last.fm API
yading@7 15 from pyechonest import artist, catalog, config, playlist # How it works instead of pyechonest
yading@7 16
yading@7 17
yading@7 18 #change the path to 7-digital python library
yading@7 19 sys.path.append("7digital-python/lib/")
yading@7 20 import py7digital
yading@7 21
yading@7 22 """ API Key from echonest """
yading@7 23 #Your API Key: SFXNKMTRAZ3ULHK6U
yading@7 24 #Your Consumer Key: 54a06c9bd235d47f787d8cf614577a94
yading@7 25 #Your Shared Secret: aiPUaTToTpixW4Ttaf4O9A
yading@7 26
yading@7 27 """API key from 7 digital"""
yading@7 28 # oauth_consumer_key=7dbpa63h3y3d
yading@7 29 # oauth_consumer_secret=zz48d4epsqmrsuvp
yading@7 30
yading@7 31 """API key from last.fm"""
yading@7 32 # Your API Key is bd1cb09de31188b43aa46f39b8e40614
yading@7 33 # Your secret is d2537b0ce8bc859a6068833c5e2a72a7
yading@7 34
yading@7 35 """"*********************************************************************************"""
yading@7 36
yading@7 37 # Echo Nest API key
yading@7 38 config.ECHO_NEST_API_KEY="SFXNKMTRAZ3ULHK6U "
yading@7 39
yading@7 40 # 7 digital API key
yading@7 41 DIGITAL7_API_KEY = '7dbpa63h3y3d'
yading@7 42
yading@7 43 """The use of last.fm API"""
yading@7 44 API_KEY = "bd1cb09de31188b43aa46f39b8e40614"
yading@7 45 API_SECRET = "d2537b0ce8bc859a6068833c5e2a72a7"
yading@7 46
yading@7 47 """Authentication, username and password"""
yading@7 48 username = "QMYading"
yading@7 49 password_hash = pylast.md5("123456")
yading@7 50 network = pylast.LastFMNetwork(api_key = API_KEY, api_secret =
yading@7 51 API_SECRET, username = username, password_hash = password_hash)
yading@7 52
yading@7 53 def url_call(url):
yading@7 54 """
yading@7 55 ***This method is from get_preview_url.py by Thierry Bertin-Mahieux***
yading@7 56 Do a simple request to the 7digital API
yading@7 57 We assume we don't do intense querying, this function is not robust
yading@7 58 Return the answer as na xml document
yading@7 59 """
yading@7 60 stream = urllib2.urlopen(url)
yading@7 61 xmldoc = minidom.parse(stream).documentElement
yading@7 62 stream.close()
yading@7 63 return xmldoc
yading@7 64
yading@7 65 def get_trackid_from_text_search(title,artistname=''):
yading@7 66 """
yading@7 67 ***This method is from get_preview_url.py by Thierry Bertin-Mahieux***
yading@7 68 Search for an artist + title using 7digital search API
yading@7 69 Return None if there is a problem, or tuple (title,trackid)
yading@7 70 """
yading@7 71 url = 'http://api.7digital.com/1.2/track/search?'
yading@7 72 url += 'oauth_consumer_key='+DIGITAL7_API_KEY
yading@7 73 query = title
yading@7 74 if artistname != '':
yading@7 75 query = artistname + ' ' + query
yading@7 76 query = urllib2.quote(query)
yading@7 77 url += '&q='+query
yading@7 78 xmldoc = url_call(url)
yading@7 79 status = xmldoc.getAttribute('status')
yading@7 80 if status != 'ok':
yading@7 81 return None
yading@7 82 resultelem = xmldoc.getElementsByTagName('searchResult')
yading@7 83 if len(resultelem) == 0:
yading@7 84 return None
yading@7 85 track = resultelem[0].getElementsByTagName('track')[0]
yading@7 86 tracktitle = track.getElementsByTagName('title')[0].firstChild.data
yading@7 87 trackid = int(track.getAttribute('id'))
yading@7 88 return (tracktitle,trackid)
yading@7 89
yading@7 90 def get_preview_from_trackid(trackid):
yading@7 91 """
yading@7 92 ***This method is from get_preview_url.py by Thierry Bertin-Mahieux***
yading@7 93 Ask for the preview to a particular track, get the XML answer
yading@7 94 After calling the API with a given track id,
yading@7 95 we get an XML response that looks like:
yading@7 96
yading@7 97 <response status="ok" version="1.2" xsi:noNamespaceSchemaLocation="http://api.7digital.com/1.2/static/7digitalAPI.xsd">
yading@7 98 <url>
yading@7 99 http://previews.7digital.com/clips/34/6804688.clip.mp3
yading@7 100 </url>
yading@7 101 </response>
yading@7 102
yading@7 103 We parse it for the URL that we return, or '' if a problem
yading@7 104 """
yading@7 105 url = 'http://api.7digital.com/1.2/track/preview?redirect=false'
yading@7 106 url += '&trackid='+str(trackid)
yading@7 107 url += '&oauth_consumer_key='+DIGITAL7_API_KEY
yading@7 108 xmldoc = url_call(url)
yading@7 109 status = xmldoc.getAttribute('status')
yading@7 110 if status != 'ok':
yading@7 111 return ''
yading@7 112 urlelem = xmldoc.getElementsByTagName('url')[0]
yading@7 113 preview = urlelem.firstChild.nodeValue
yading@7 114 return preview
yading@7 115
yading@7 116 #function that downloads a file
yading@7 117 def download_file(file_url, file_name):
yading@7 118 # open the url
yading@7 119 mp3file = urllib2.urlopen(file_url)
yading@7 120
yading@7 121 # open the local file for writing
yading@7 122 local_file = open(file_name, "wb")
yading@7 123 # write to file
yading@7 124 local_file.write(mp3file.read())
yading@7 125 local_file.close()
yading@7 126
yading@7 127
yading@7 128
yading@7 129
yading@7 130 # get artist object
yading@7 131 # artist_object = network.get_artist("System of a Down")
yading@7 132
yading@7 133 # get the mbid for the tracks
yading@7 134 # print(artist_object.get_mbid())
yading@7 135
yading@7 136 # print(os.getcwd()) #print current working directory
yading@7 137 # artist_object.shout("Artist object created successful!")
yading@7 138
yading@7 139 # get track object
yading@7 140 # track_object = network.get_track("Iron Maiden", "The Nomad")
yading@7 141 # track_object.add_tags(("awesome", "favorite")) # add tags to the tracks
yading@7 142
yading@7 143 #get get_album object
yading@7 144 #album_object = network.get_album("Adele","21")
yading@7 145
yading@7 146 # get tags object
yading@7 147 #os.chdir('./NEW_Tagsets/') # change current working directory
yading@7 148 #tag_classification = ["Happy", "Sad", "Angry", "Relax","Sport", "Study","Entertainment","Travelling"]
yading@7 149 #tag_classification = ["Happy", "Sad", "Angry", "Relax","Sport", "Study","Entertainment","Travel"]
yading@7 150 #tag_classification = ["Sad", "Angry", "Relax","Sport", "Study","Entertainment","Travel"]
yading@7 151 #tag_classification = ["Travel"]
yading@7 152
yading@7 153 tag_classification = ["wake me up"]
yading@7 154
yading@7 155 #tag_classification = ["Passionate","Rollicking","Literate","Humorous","Aggressive"]
yading@7 156 #tag_classification = ["Joy","Fun","Cheerful","Pleasing","Pleasant"]
yading@7 157 #tag_classification = ["Romantic","Love"]
yading@7 158
yading@7 159 #tag_classification = ["silly", "campy", "quirky", "whimsical", "witty", "wry"]
yading@7 160 #tag_classification = ["fiery","tense","anxious","intense", "volatile","visceral"]
yading@7 161 #tag_classification = ["poignant","wistful", "bittersweet", "autumnal", "brooding"]
yading@7 162 #tag_classification = ["rousing", "confident","boisterous", "rowdy"]
yading@7 163 #tag_classification = ["sweet", "amiable","good natured"]
yading@7 164
yading@7 165
yading@7 166 track = network.track
yading@7 167
yading@7 168 # search for similar tag according to the seeds in tag_classification
yading@7 169 for tags_name in tag_classification:
yading@7 170 tags = network.search_for_tag(tags_name)
yading@7 171 # filtering the results
yading@7 172 tags_search = tags.get_next_page()
yading@7 173 tag_file_name = tags_name + "_tags_results.txt"
yading@7 174
yading@7 175 # print the tag name, i.e happy_tag_results.txt
yading@7 176 print(tag_file_name)
yading@7 177
yading@7 178 print("successfully written in the file")
yading@7 179
yading@7 180 tag_data = open(tag_file_name, 'wb') # open and write the file for top tags
yading@7 181
yading@7 182 os.makedirs(str(tags_name))
yading@7 183 os.chdir('./' + str(tags_name) + '/')
yading@7 184
yading@7 185 # write the similar with a topic
yading@7 186 for each_letter in tags_search:
yading@7 187 # store the each lexical into the file. i.e 'happy' 'very happy'
yading@7 188 tag_data.write("%s\n" % each_letter)
yading@7 189 # create a directory with tag name
yading@7 190 os.makedirs(str(each_letter))
yading@7 191 os.chdir('./' + str(each_letter) + '/')
yading@7 192
yading@7 193 # store each lexical tag as a tag_object
yading@7 194 tag_object = network.get_tag(each_letter)
yading@7 195 tracks_results = tag_object.get_top_tracks()
yading@7 196
yading@7 197 track_file_name = str(each_letter) + "_results.txt"
yading@7 198 tag_track_file = open(track_file_name,'wb') # open and write the file for tracks with tag
yading@7 199
yading@7 200 print(track_file_name)
yading@7 201
yading@7 202 # write the tracks result with special tags
yading@7 203 for each_line in tracks_results:
yading@7 204 tag_track_file.write("%s%s\n" % each_line)
yading@7 205
yading@7 206 tag_track_file.close()
yading@7 207
yading@7 208 artist_file_name = str(each_letter) + "_artist.txt"
yading@7 209 title_file_name = str(each_letter) + "_title.txt"
yading@7 210 #id_file_name = str(each_letter) + "_id.txt"
yading@7 211
yading@7 212 # open the track info file
yading@7 213 newdata = open(track_file_name)
yading@7 214 artist_data = open(artist_file_name,'wb')
yading@7 215 title_data = open(title_file_name,'wb')
yading@7 216 #id_file = open(id_file_name,"wb")
yading@7 217
yading@7 218
yading@7 219 for each_row in newdata:
yading@7 220
yading@7 221 (artist,title) = each_row.split('-',1)
yading@7 222 title = title.strip() #delete the extra space
yading@7 223 title = title.rstrip('0') #get rid of the 0 at the end
yading@7 224
yading@7 225 artist_data.write("%s\n" % artist)
yading@7 226 title_data.write("%s\n" % title)
yading@7 227
yading@7 228 print artist
yading@7 229 print title
yading@7 230
yading@7 231 try:
yading@7 232 (tracktitle,trackid) = get_trackid_from_text_search(title,artist)
yading@7 233
yading@7 234 if trackid is not None:
yading@7 235 # fetch the url
yading@7 236 audio_url = get_preview_from_trackid(trackid)
yading@7 237 print(audio_url)
yading@7 238 # fetch the audio and save in the correct folder
yading@7 239
yading@7 240 file_name = tracktitle + u'.wav'
yading@7 241 file_name = file_name.replace(u'/', u' ')
yading@7 242 #file_name = t.title + u'.mp3'
yading@7 243 print file_name
yading@7 244 print("downloading")
yading@7 245
yading@7 246 # download_path = os.path.join(file_path, file_name)
yading@7 247 path_name = './' + file_name
yading@7 248 mp3 = download_file(audio_url, path_name)
yading@7 249 except:
yading@7 250 pass
yading@7 251
yading@7 252
yading@7 253
yading@7 254 # id_file_name.close()
yading@7 255 artist_data.close()
yading@7 256 title_data.close()
yading@7 257 newdata.close()
yading@7 258 parent_path = '../'
yading@7 259 os.chdir(parent_path)
yading@7 260
yading@7 261 os.chdir(parent_path)
yading@7 262
yading@7 263 tag_data.close()
yading@7 264
yading@7 265 # check the directory, write to the current directory,
yading@7 266 # if it doens't exist, create a new one