-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathsearchitunes.js
118 lines (93 loc) · 2.34 KB
/
searchitunes.js
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
Name: searchitunes
Description: Search the Apple iTunes Store and App Store.
Author: Franklin (https://fvdm.com)
Source: https://github.com/fvdm/nodejs-searchitunes
License: Unlicense (Public Domain, see UNLICENSE file)
*/
/**
* Send HTTP request
*
* @return {Promise<object|array>}
*
* @param {object} params Parameters to send along
* @param {number} [params.timeout=5000] Wait timeout in ms
* @param {string} [params.userAgent] Custom User-Agent header
* @param {bool} [params.throwEmpty=true] Throw 'no results' instead of returning an empty array
*/
module.exports = async function SearchItunes ( {
timeout = 5000,
userAgent = 'searchitunes.js',
throwEmpty = true,
trackId,
} ) {
let params = arguments[0];
let url = 'https://itunes.apple.com/search';
let options = {
signal: AbortSignal.timeout( parseInt( timeout, 10 ) ),
headers: {
'Accept': 'application/json',
'User-Agent': userAgent,
},
};
delete params.timeout;
delete params.userAgent;
delete params.throwEmpty;
// Convert trackId from a search response
if ( trackId ) {
params.id = trackId;
delete params.trackId;
}
// Lookup API
const idKeys = [
'amgAlbumId',
'amgArtistId',
'amgVideoId',
'id',
'isbn',
'upc',
];
let bulkRequest = false;
let idKey = false;
let key;
for ( let i = 0; i < idKeys.length; i++ ) {
key = idKeys[i];
if ( params[key] ) {
idKey = true;
url = 'https://itunes.apple.com/lookup';
// Bulk request
if ( Array.isArray( params[key] ) ) {
bulkRequest = true;
params[key] = params[key].join( ',' );
}
break;
}
}
// Process
params = new URLSearchParams( params );
url += '?' + params.toString();
const res = await fetch( url, options );
const data = await res.json();
// API error
if ( data.errorMessage ) {
throw new Error( `API: ${data.errorMessage}` );
}
// Empty result
if ( ! data.results || ! data.results.length ) {
if ( throwEmpty ) {
throw new Error( 'no results' );
}
return [];
}
// Lookup response
if ( idKey ) {
// Bulk lookup
if ( bulkRequest ) {
return data.results;
}
// Single lookup
return data.results[0];
}
// Search response
return data;
};