2016-04-10 7 views
0

Ich versuche eine Android-Anwendung zu erstellen, die eine Funktion enthält, mit der Sie nach Spotify-Benutzern nach Namen suchen können. Wenn Sie Spotify verwenden, können Sie nach einem Benutzer anhand seiner ID oder seines Namens suchen. Momentan sehe ich jedoch keine Möglichkeit, dass die Spotify Web API die Suche nach Benutzern nach Namen unterstützt. Wenn Sie über die Benutzer-ID verfügen, können Sie über die Web-API auf ihr Profil zugreifen. Aber ich hatte gehofft, dass es eine Möglichkeit gibt, nach dem Benutzernamen zu suchen und ihre ID auf diese Weise zu erhalten.So suchen Sie mithilfe der Spotify Web API nach einem Benutzer mit Namen

Spotifys Web-API ermöglicht es Ihnen, nach einem "Titel" oder "Künstler" zu suchen, wo alle Suchergebnisse angezeigt werden. Warum können Sie das nicht mit Benutzernamen tun? Gibt es eine Möglichkeit, diese Arbeit zu machen, die ich gerade nicht sehe?

Antwort

1

Ich denke, das ist eine interessante Frage, da es Benutzerdaten einer großen Gemeinschaft betrifft, so werde ich versuchen, herauszufinden.

Erstens kann man deutlich sehen, dass der Spotify Web API Endpunkt search einen type Parameter hat, die nur die folgenden Arten gibt zu: artist, playlist und track. Versuchen wir es von hier aus laufen zu lassen (Anmerkung: siehe Promise.all Lösung, um Daten zu holen I here bin mit)

HINWEIS Aktuelle Spotify search APIs wird ein Zugriffstoken erfordert in den Request-Header angegeben werden:

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

A Diese Objekte sind selbstdefiniert, aber eins: playlist. In der Tat können wir aus dieser Antwort sehen, dass wir user Objekte wie (Beispiel) haben:

"owner" { 
    "external_urls": { 
    "spotify": "http://open.spotify.com/user/12345678" 
} 

Nizza !, die external_urls sind Benutzerprofile url, während die href Wiedergabelisten url sind (die eine Authentifizierung erfordern btw), so dass wir können sie zunächst von dieser json Reaktion greifen:

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 \t 
 
       response(request.responseText) 
 
       } else response(); 
 
      } 
 
      } 
 
      request.open('GET', what, true); 
 
      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) { 
 
      
 
      JSON.parse(result).playlists.items.map(function(item,index) { 
 
      var userProfileUrl = item.owner.href; 
 
      console.log(JSON.stringify(userProfileUrl, 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" />

An diesem Punkt y ou wird eine Liste von Spotify user Objekte Urls wie (zB URL)

"https://api.spotify.com/v1/users/12345678" 

So, jetzt können wir sehen, holen Benutzer url Profile (kein Auth erforderlich):

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 \t 
 
      response(request.responseText) 
 
      } else response(); 
 
     } 
 
     } 
 
     request.open('GET', what, true); 
 
     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) { 
 

 
     var profileUrls = JSON.parse(result).playlists.items.map(function(item, index) { 
 
     return item.owner.href; 
 
     }) 
 
     resolve(profileUrls); 
 
    } 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 profiles received " + results.length); 
 
    //console.log(JSON.stringify(results[0], null, 2)); 
 

 
    ///// promiseall again 
 

 
    var ExecutionProfileBlock = function(item, index, resolve, reject) { 
 
     SimpleRequest.call(item, function(result) { 
 
     if (result) { 
 
      var obj = JSON.parse(result); 
 
      resolve({ 
 
      name: obj.display_name , 
 
      followers: obj.followers.total, 
 
      url : obj.href 
 
      }); 
 
     }//result 
 
     }) 
 
    }//ExecutionProfileBlock 
 

 
promiseAll(results[0], function(item, index, resolve, reject) { 
 
       //console.log("Making request [" + index + "] " + item) 
 
       ExecutionProfileBlock(item, index, resolve, reject); 
 
      }, function(results) { // aggregated results 
 
       console.log("All response received " + results.length); 
 
       console.log(JSON.stringify(results, null, 2)); 
 
      } 
 

 
      ,function(error) { // error 
 
       console.log(error); 
 
      }) 
 

 

 

 
    ///// 
 

 

 
    }, 
 
    function(error) { // error 
 
    console.log(error); 
 
    });
<div id="console" />

Get es raus! An dieser Stelle können wir user Objekte mit display_name und followers Zahl wie (Beispiel json) sehen:

{ 
    "name": "Joe Deere", 
    "followers": 666, 
    "url": "https://api.spotify.com/v1/users/12345678" 
} 

also rekapitulieren, ist der Ausgangspunkt playlist Suchart bei der Suche api.Angesichts dessen können Sie Benutzerprofile ohne Authentifizierung erhalten. Wenn Sie gültige Oauth-Token erhalten, können Sie Top-Charts abrufen, um weitere Abfragen durchzuführen.

+0

Ich glaube, ich verstehe Ihren ersten Codeabschnitt nicht. Es sieht so aus, als ob du eine Wiedergabeliste mit den Schlagwörtern "Doom Metal" und "Adele" suchst. Soweit ich weiß, haben Sie Nutzer anhand dieser Wiedergabelistenergebnisse gefunden. Sind diese Benutzer mit Wiedergabelisten mit Adele oder Doom Metal verbunden? Bedeutet das, dass ich, um ein Benutzerprofil zu finden, Informationen über ihre Playlists wissen muss? Ich sehe nicht, wie dieser Code die Eingabeinfo "Benutzername" überhaupt verwendet, alles was ich sehe ist, dass die Playlist-Information die Eingabe ist. – OMGitzMidgar

+0

@OMGitzMidgar Ja dies ist die einzige Möglichkeit, Benutzer als Ausgabe zu haben, da es keine Möglichkeit gibt, nach Benutzernamen zu fragen, wenn Sie in der Antwort die einzigen Objekte, die Sie abfragen können, Künstler, Album, Track und Playlist sind. Aber bei Playlists können Sie Usera als Ausgabe haben, das ist die Hälfte des Problems;) – loretoparisi

Verwandte Themen