How to search for a user by name using Spotify Web API
I'm trying to create an Android application that contains a feature where you can search for Spotify users by name. When using Spotify, you can search for a user by their ID or by their name. However, currently, I see no way that the Spotify Web API supports searching users by name. If you have the User ID, you can access their profile using the Web API. But I was hoping there was a way that you could run a search for the User name and get their ID that way.
Spotify's Web API allows you to search for a "track" or "artist", where they will return all of the search results. So why can't you do the same with User names? Is there any way to make this work that I'm just not seeing?
I think this is an interesting question, since it regards user data of a huge community, so I will try to figure out.
First, you can clearly see that the Spotify Web API endpoint search
has a type
parameter that admits only the following types: artist
, playlist
, and track
. Let's try it out to run from here (note: see the Promise.all
solution to fetch data I'm using here)
NOTE Recent Spotify search
APIs will require an access token to be specified in the request headers:
-H "Authorization: Bearer {your access token}"
var spotifyAccessToken = "YourSpotifyAccessToken";
var console = {
log: function(s) {
document.getElementById("console").innerHTML += s + "<br/>"
}
}
// Simple XMLHttpRequest
// based on https://davidwalsh.name/xmlhttprequest
SimpleRequest = {
call: function(what, response) {
var request;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {
try {
request = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e) {}
}
}
// state changes
request.onreadystatechange = function() {
if (request.readyState === 4) { // done
if (request.status === 200) { // complete
response(request.responseText)
} else response();
}
}
request.open('GET', what, true);
request.setRequestHeader("Authorization", "Bearer " + spotifyAccessToken);
request.send(null);
}
}
//PromiseAll
var promiseAll = function(items, block, done, fail) {
var self = this;
var promises = [],
index = 0;
items.forEach(function(item) {
promises.push(function(item, i) {
return new Promise(function(resolve, reject) {
if (block) {
block.apply(this, [item, index, resolve, reject]);
}
});
}(item, ++index))
});
Promise.all(promises).then(function AcceptHandler(results) {
if (done) done(results);
}, function ErrorHandler(error) {
if (fail) fail(error);
});
}; //promiseAll
// LP: deferred execution block
var ExecutionBlock = function(item, index, resolve, reject) {
var url="https://api.spotify.com/v1/"
url+=item;
SimpleRequest.call(url, function(result) {
if (result) {
console.log( JSON.stringify( result, null, 2)
.replace(/n/g,"<br>").replace(/"/g,'"'));
resolve(result);
} else {
reject(new Error("call error"));
}
})
}
arr = [
"search?type=playlist&q=%22doom%20metal%22",
"search?type=playlist&q=Adele"]
promiseAll(arr, function(item, index, resolve, reject) {
console.log("Making request [" + index + "]")
ExecutionBlock(item, index, resolve, reject);
}, function(results) { // aggregated results
console.log("All response received " + results.length);
//console.log(JSON.stringify(results));
}, function(error) { // error
console.log(error);
});
<div id="console" />
链接地址: http://www.djcxy.com/p/1632.html