lib: Create base library fork with axios
This commit is contained in:
parent
9c95f6c220
commit
223632442b
|
@ -1 +1,3 @@
|
||||||
node_modules
|
node_modules
|
||||||
|
lib
|
||||||
|
.env
|
14
.jshintrc
14
.jshintrc
|
@ -1,14 +0,0 @@
|
||||||
{
|
|
||||||
"curly": true,
|
|
||||||
"eqeqeq": true,
|
|
||||||
"immed": true,
|
|
||||||
"latedef": "nofunc",
|
|
||||||
"newcap": true,
|
|
||||||
"noarg": true,
|
|
||||||
"sub": true,
|
|
||||||
"undef": true,
|
|
||||||
"unused": true,
|
|
||||||
"boss": true,
|
|
||||||
"eqnull": true,
|
|
||||||
"node": true
|
|
||||||
}
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
src
|
||||||
|
test
|
48
Gruntfile.js
48
Gruntfile.js
|
@ -1,48 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
module.exports = function(grunt) {
|
|
||||||
|
|
||||||
// Project configuration.
|
|
||||||
grunt.initConfig({
|
|
||||||
nodeunit: {
|
|
||||||
files: ['test/**/*_test.js'],
|
|
||||||
},
|
|
||||||
jshint: {
|
|
||||||
options: {
|
|
||||||
jshintrc: '.jshintrc'
|
|
||||||
},
|
|
||||||
gruntfile: {
|
|
||||||
src: 'Gruntfile.js'
|
|
||||||
},
|
|
||||||
lib: {
|
|
||||||
src: ['lib/**/*.js']
|
|
||||||
},
|
|
||||||
test: {
|
|
||||||
src: ['test/**/*.js']
|
|
||||||
},
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
gruntfile: {
|
|
||||||
files: '<%= jshint.gruntfile.src %>',
|
|
||||||
tasks: ['jshint:gruntfile']
|
|
||||||
},
|
|
||||||
lib: {
|
|
||||||
files: '<%= jshint.lib.src %>',
|
|
||||||
tasks: ['jshint:lib', 'nodeunit']
|
|
||||||
},
|
|
||||||
test: {
|
|
||||||
files: '<%= jshint.test.src %>',
|
|
||||||
tasks: ['jshint:test', 'nodeunit']
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// These plugins provide necessary tasks.
|
|
||||||
grunt.loadNpmTasks('grunt-contrib-nodeunit');
|
|
||||||
grunt.loadNpmTasks('grunt-contrib-jshint');
|
|
||||||
grunt.loadNpmTasks('grunt-contrib-watch');
|
|
||||||
|
|
||||||
// Default task.
|
|
||||||
grunt.registerTask('default', ['jshint', 'nodeunit']);
|
|
||||||
|
|
||||||
};
|
|
|
@ -2,6 +2,7 @@ Xeno-canto
|
||||||
A node.js implementation of Xeno-canto API 2.0
|
A node.js implementation of Xeno-canto API 2.0
|
||||||
|
|
||||||
Copyright (c) 2013 Patrick De Marta
|
Copyright (c) 2013 Patrick De Marta
|
||||||
|
Copyright (c) 2022 Samuel ORTION
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -19,7 +19,7 @@ listings relevant to the species named in the request."
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
```
|
```
|
||||||
$ npm install xeno-canto
|
$ npm install @unclesamulus/xeno-canto.js
|
||||||
```
|
```
|
||||||
## Usage
|
## Usage
|
||||||
```javascript
|
```javascript
|
||||||
|
|
|
@ -1,116 +0,0 @@
|
||||||
/*
|
|
||||||
* xeno-canto
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Copyright (c) 2013 Patrick De Marta
|
|
||||||
* Licensed under the GNU GPL license.
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/** @dependencies */
|
|
||||||
var request = require('request');
|
|
||||||
|
|
||||||
/** @constructor */
|
|
||||||
function XenoCanto(){
|
|
||||||
this.entity = {};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/** Search for name of advanced options*/
|
|
||||||
XenoCanto.prototype.search = function(query, success){
|
|
||||||
if (!!query) {
|
|
||||||
var url = 'http://www.xeno-canto.org/api/2/recordings?query=';
|
|
||||||
|
|
||||||
// Duck-typing args
|
|
||||||
if (typeof(query) === 'string') {
|
|
||||||
|
|
||||||
// Normal query search name in English, Latin, Family latin
|
|
||||||
url = url + query;
|
|
||||||
|
|
||||||
} else if (typeof(query) === 'object') {
|
|
||||||
/*
|
|
||||||
Advanced search parameters:
|
|
||||||
---------------------------
|
|
||||||
Genus gen:zonotrichia
|
|
||||||
Recordist rec:John
|
|
||||||
Country cnt:brazil.
|
|
||||||
Location loc:tambopata.
|
|
||||||
Recordist Remarks rmk:playback
|
|
||||||
Geographic Coordinates
|
|
||||||
lat, lon
|
|
||||||
box:LAT_MIN,LON_MIN,LAT_MAX,LON_MAX
|
|
||||||
Background Species also:formicariidae
|
|
||||||
Sound type type:song
|
|
||||||
Catalog number nr:76967 or range: nr:88888-88890
|
|
||||||
Recording Quality
|
|
||||||
q:A will return recordings with a quality rating of A.
|
|
||||||
q<:C will return recordings with a quality rating of D or E.
|
|
||||||
World area area:africa (, america, asia, australia, europe)
|
|
||||||
*/
|
|
||||||
var getCoords = function() {
|
|
||||||
if (!!query.coords) {
|
|
||||||
if (!!query.coords.lat && !!query.coords.lon) {
|
|
||||||
return 'lat:' + query.coords.lat + 'lon:' + query.coords.lon
|
|
||||||
} else if (!!query.coords.box) {
|
|
||||||
/** TODO box coordinates*/
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
var params_string = '';
|
|
||||||
var params = [
|
|
||||||
{ name:"" },
|
|
||||||
{ genus: 'gen:' },
|
|
||||||
{ recordist: 'rec:' },
|
|
||||||
{ country: 'cnt:' },
|
|
||||||
{ location: 'loc:' },
|
|
||||||
{ remarks: 'rmk:' },
|
|
||||||
{ coords: getCoords() },
|
|
||||||
{ also:'also:' },
|
|
||||||
{ type: 'type:' },
|
|
||||||
{ nr: 'nr:' },
|
|
||||||
{ quality: 'q:' },
|
|
||||||
{ qualitylt: 'q<:' },
|
|
||||||
{ area: 'area:' }
|
|
||||||
];
|
|
||||||
|
|
||||||
params.map(function(p){
|
|
||||||
var key = Object.keys(p)[0];
|
|
||||||
if (!!query[key]) {
|
|
||||||
params_string = params_string + p[key] + query[key] + " ";
|
|
||||||
};
|
|
||||||
});
|
|
||||||
url = url + params_string;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Make the request
|
|
||||||
get(this, url, success);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
throw("Null Query Error.")
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function get(that, url, success){
|
|
||||||
|
|
||||||
var opts = {
|
|
||||||
url: url,
|
|
||||||
method: 'GET',
|
|
||||||
timeout: (10*1000),
|
|
||||||
headers:
|
|
||||||
{
|
|
||||||
'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163 Safari/537.36'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
request(opts, function (err, res, url) {
|
|
||||||
// store response in instance var
|
|
||||||
that.entity = JSON.parse(res.body);
|
|
||||||
success(that);
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = XenoCanto;
|
|
File diff suppressed because it is too large
Load Diff
63
package.json
63
package.json
|
@ -1,47 +1,32 @@
|
||||||
{
|
{
|
||||||
"name": "xeno-canto",
|
"name": "@unclesamulus/xeno-canto-api",
|
||||||
"description": "Node.js API for xeno-canto database webservices",
|
"version": "0.0.0",
|
||||||
"version": "0.0.5",
|
"description": "Damn small node.js library to deal with v2 Xeno-Canto API",
|
||||||
"homepage": "https://github.com/UncleSamulus/xeno-canto",
|
"main": "lib/index.js",
|
||||||
|
"directories": {
|
||||||
|
"lib": "lib",
|
||||||
|
"test": "test"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "jest",
|
||||||
|
"build": "babel src -d lib"
|
||||||
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/tripitakit/xeno-canto"
|
"url": "https://forge.chapril.org/UncleSamulus/xeno-canto.js"
|
||||||
},
|
},
|
||||||
"bugs": {
|
"keywords": [
|
||||||
"url": "https://github.com/tripitakit/xeno-canto/issues"
|
"Xeno-Canto",
|
||||||
},
|
"birdsongs",
|
||||||
"licenses": [
|
"API"
|
||||||
{
|
|
||||||
"type": "GNU GPL",
|
|
||||||
"url": "http://www.gnu.org/licenses/"
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
"main": "lib/xeno-canto",
|
"author": "Samuel ORTION <samuel@ortion.fr>",
|
||||||
"scripts": {
|
"license": "GPL-3.0-or-later",
|
||||||
"test": "grunt nodeunit"
|
"devDependencies": {
|
||||||
|
"@babel/cli": "^7.18.10",
|
||||||
|
"jest": "^29.0.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"request": "^2.88.2"
|
"axios": "^0.27.2"
|
||||||
},
|
}
|
||||||
"devDependencies": {
|
|
||||||
"grunt": "^1.5.3",
|
|
||||||
"grunt-contrib-jshint": "^3.2.0",
|
|
||||||
"grunt-contrib-nodeunit": "^4.0.0",
|
|
||||||
"grunt-contrib-watch": "^1.1.0"
|
|
||||||
},
|
|
||||||
"directories": [
|
|
||||||
"lib",
|
|
||||||
"test"
|
|
||||||
],
|
|
||||||
"keywords": [
|
|
||||||
"bird",
|
|
||||||
"sound",
|
|
||||||
"database",
|
|
||||||
"webservice",
|
|
||||||
"api",
|
|
||||||
"science",
|
|
||||||
"biology",
|
|
||||||
"zoology",
|
|
||||||
"bioinformatics"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
const axios = require('axios');
|
||||||
|
|
||||||
|
const BASE_URL = "https://www.xeno-canto.org/api/2/recordings?query=";
|
||||||
|
|
||||||
|
function getCoords({ coords }) {
|
||||||
|
if (!!coords) {
|
||||||
|
if (!!coords.lat && !!coords.lon) {
|
||||||
|
return `lat:${coords.lat} lon:${coords.lon}`;
|
||||||
|
} else if (!!coords.box) {
|
||||||
|
/** TODO box coordinates*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function search(query) {
|
||||||
|
let url;
|
||||||
|
if (typeof (query) === 'string') {
|
||||||
|
url = BASE_URL + query;
|
||||||
|
} else if (typeof (query) === 'object') {
|
||||||
|
const xeno_params = [
|
||||||
|
{ name: "" },
|
||||||
|
{ genus: 'gen:' },
|
||||||
|
{ recordist: 'rec:' },
|
||||||
|
{ country: 'cnt:' },
|
||||||
|
{ location: 'loc:' },
|
||||||
|
{ remarks: 'rmk:' },
|
||||||
|
{ coords: getCoords(query) },
|
||||||
|
{ also: 'also:' },
|
||||||
|
{ type: 'type:' },
|
||||||
|
{ nr: 'nr:' },
|
||||||
|
{ quality: 'q:' },
|
||||||
|
{ qualitylt: 'q<:' },
|
||||||
|
{ area: 'area:' }
|
||||||
|
];
|
||||||
|
let url_params = xeno_params.reduce(function (acc, param) {
|
||||||
|
const key = Object.keys(param)[0];
|
||||||
|
if (!!query[key]) {
|
||||||
|
if (key === 'coords') {
|
||||||
|
acc += param[key] + " ";
|
||||||
|
} else {
|
||||||
|
acc += param[key] + query[key] + " ";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return acc;
|
||||||
|
}, "");
|
||||||
|
url = BASE_URL + url_params;
|
||||||
|
} else {
|
||||||
|
throw new Error("Null query error");
|
||||||
|
}
|
||||||
|
return axios.get(url).then(response => {
|
||||||
|
return response.data;
|
||||||
|
}).catch(error => {
|
||||||
|
throw error;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { search };
|
|
@ -0,0 +1,18 @@
|
||||||
|
const XenoCanto = require('../lib/index');
|
||||||
|
|
||||||
|
test('search red robin', () => {
|
||||||
|
return XenoCanto.search('Erithacus rubecula')
|
||||||
|
.then(data => {
|
||||||
|
expect(parseInt(data.numRecordings)).toBeGreaterThan(0);
|
||||||
|
}).catch(error => {
|
||||||
|
console.error(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('advanced search for london coordinates', () => {
|
||||||
|
return XenoCanto.search({ coords: { lat: 51.5073509, lon: -0.1277583 } }).then(data => {
|
||||||
|
expect(parseInt(data.numRecordings)).toBeGreaterThan(0);
|
||||||
|
}).catch(error => {
|
||||||
|
console.error(error);
|
||||||
|
});
|
||||||
|
}, 10000)
|
|
@ -1,40 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var XenoCanto = require('../lib/xeno-canto.js');
|
|
||||||
|
|
||||||
console.debug("WARNING: The hardcoded values used in this test may change, from xeno-canto database, please double check the current recording count for each query");
|
|
||||||
|
|
||||||
exports['xeno-canto-api'] = {
|
|
||||||
setUp: function(done) {
|
|
||||||
done();
|
|
||||||
},
|
|
||||||
|
|
||||||
'search bearded bellbird returns 74 recordings': function(test) {
|
|
||||||
test.expect(4);
|
|
||||||
var xeno_canto = new XenoCanto();
|
|
||||||
xeno_canto.search("bearded bellbird", function(self){
|
|
||||||
test.ok(!!self);
|
|
||||||
test.equal(typeof(self), 'object');
|
|
||||||
test.equal(typeof(self.entity), 'object');
|
|
||||||
test.equal(self.entity.numRecordings, 74);
|
|
||||||
test.done();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
'advanced search bearded bellbird cnt:Venezuela (27)': function(test) {
|
|
||||||
test.expect(4);
|
|
||||||
var xeno_canto = new XenoCanto();
|
|
||||||
var query = {
|
|
||||||
name:'bearded bellbird',
|
|
||||||
country: 'Venezuela',
|
|
||||||
};
|
|
||||||
|
|
||||||
xeno_canto.search(query, function(self){
|
|
||||||
test.ok(!!self);
|
|
||||||
test.equal(typeof(self), 'object');
|
|
||||||
test.equal(typeof(self.entity), 'object');
|
|
||||||
test.equal(self.entity.numRecordings, 27);
|
|
||||||
test.done();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
Loading…
Reference in New Issue