-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathXenoCantoRestApi.py
94 lines (84 loc) · 3.33 KB
/
XenoCantoRestApi.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import requests
import sys
import json
import time
import os
from http.client import responses
from tqdm import tqdm
class XenoCantoRestApi:
directoryJson = "xenocantoApiResult"
dirSound = "xenocantoSound"
filename = "sample"
def requestXenoCanto(self, url, verbose=False):
r = requests.get(url)
if verbose:
print("Request: " + url + " Status:" + str(r.status_code))
if r.status_code == 200:
return r
else:
print("Issue with the request check url on return code.")
print("url: " + url)
print("status code: " + str(r.status_code) + " (" + responses[r.status_code] + ")")
return None
def requestOnePageFromXenoCanto(self, index, verbose=False):
site = "https://xeno-canto.org/api/2/recordings?query=cnt:france"
url = ""
if index == 1:
url = site
else:
url = site + "&page="+str(index)
return self.requestXenoCanto(url, verbose)
def writeOnePageFromXenoCanto(self, index, r):
fileTowrite = self.directoryJson + "/" + self.filename + "_" + str(index) + ".json"
with open(fileTowrite, "w") as f:
f.write(r.text)
def retrieveXenoCantoAPISampleList(self):
rootR = self.requestOnePageFromXenoCanto(1)
if rootR != None:
if not os.path.exists(self.directoryJson):
os.makedirs(self.directoryJson)
self.writeOnePageFromXenoCanto(1, rootR)
samples = json.loads(rootR.text)
numOfRequest = samples["numPages"]
for idx in range(2, numOfRequest + 1):
time.sleep(1) #Xeno canto API take max 1 request by sec
r = self.requestOnePageFromXenoCanto(idx, True)
if r != None:
self.writeOnePageFromXenoCanto(idx, r)
return 0
def downloadAllFilesFound(self, mapOfAllFile):
for espece, sousEspecesFiles in tqdm(mapOfAllFile.items()):
for sousEspece, files in tqdm(sousEspecesFiles.items(), leave=False):
idx=0
for file in tqdm(files, leave=False):
if idx < 30:
path = espece + "/" + sousEspece
url = file
fName = str(idx) + ".mp3"
self.downloadOneFile(url, path, fName)
idx+=1
def downloadExtractSoundForCorvus(self):
#temporary hard code
espece = "Corvus"
sousEspece = "corone"
for idx in range(1,21):
path = espece + "/" + sousEspece
url = self.downloadFile[espece][sousEspece][idx]
fName = str(idx) + ".mp3"
self.downloadOneFile(url, path, fName)
def downloadOneFile(self, url, path, filename ):
time.sleep(0.1) #Xeno canto API take max 1 request by sec
absPath = self.dirSound + "/" + path
if not os.path.exists( absPath ):
os.makedirs(absPath )
r = self.requestXenoCanto(url, False)
if r != None:
fileToWrite = absPath + "/" + filename
with open(fileToWrite, "wb") as f:
f.write(r.content)
f.close()
def main():
r = XenoCantoRestApi()
#map = r.retrieveXenoCantoAPISampleList()
if __name__ == '__main__':
sys.exit(main())