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
|