Как искать пользователя по имени с помощью Spotify Web API

Я пытаюсь создать приложение для Android, которое содержит функцию, в которой вы можете искать пользователей Spotify по имени. При использовании Spotify вы можете искать пользователя по их идентификатору или по имени. Однако в настоящее время я не вижу, чтобы Spotify Web API поддерживал поиск пользователей по имени. Если у вас есть идентификатор пользователя, вы можете получить доступ к своему профилю с помощью веб-API. Но я надеялся, что вы можете запустить поиск имени пользователя и получить свой идентификатор таким образом.

Spotify Web API позволяет вам искать "дорожку" или "художник", где они возвратят все результаты поиска. Итак, почему вы не можете сделать то же самое с именами пользователей? Есть ли способ сделать эту работу, которую я просто не вижу?

Ответ 1

Я думаю, что это интересный вопрос, поскольку он касается пользовательских данных огромного сообщества, поэтому я постараюсь выяснить.

Во-первых, вы можете четко видеть, что конечная точка Spotify Web API search имеет параметр type, который допускает только следующие типы: artist, playlist и track. Попробуйте запустить его здесь (примечание: см. Решение Promise.all для получения данных, которые я использую здесь)

Примечание В последних API-интерфейсах Spotify search для заголовков запросов должен быть указан токен доступа:

-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" />