2016-04-10 44 views
0

Spotify kullanıcılarını ada göre arayabileceğiniz bir özellik içeren bir Android uygulaması oluşturmaya çalışıyorum. Spotify'ı kullanırken, bir kullanıcının kimliğine veya adlarına göre arama yapabilirsiniz. Ancak, şu anda Spotify Web API'sının kullanıcıları aramaya göre desteklemesini hiçbir şekilde göremiyorum. Kullanıcı kimliğiniz varsa, Web API'sını kullanarak profillerine erişebilirsiniz. Ama Kullanıcı adı için arama yapıp kimliklerini bu şekilde alabilmenin bir yolu olduğunu umuyordum.Spotify Web API'sini kullanarak bir adı nasıl arayabilirim?

Spotify Web API'si, bir "parça" ya da "sanatçı" araması yaparak, tüm arama sonuçlarını döndürmelerini sağlar. Öyleyse neden aynı kullanıcı isimleri ile yapamazsın? Görmediğim bu işi yapmanın bir yolu var mı?

cevap

1

Bu çok ilginç bir soru, bence çok büyük bir topluluğun kullanıcı verilerini dikkate aldığından, anlamaya çalışacağım. artist, playlist ve track: Birinci

, açıkça Spotify Web API son nokta search yalnızca şu türleri itiraf bir type parametresi vardır görebiliriz. buralı çalıştırmayı deneyelim (not: Ben here kullanıyorum veri getirmek için Promise.all çözüm bakınız) bir erişim belirteci gerektirir Son Spotify search API'ler istek başlıklarına belirtilmesi

NOT:

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

bir Bu nesneler kendiliğinden tanımlanır, ancak bir: playlist. Böylece,

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

Güzel !, external_urls kullanıcı url profilleri vardır href çalma url iken (btw kimlik doğrulaması gerektiren): Aslında biz (örneğin) gibi user nesneleri sahip oldukları bu yanıttan görebilirsiniz öncelikle bu json yanıtı onları yakala:

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

bu nokta y At ou (örnek url) Şimdi biz kullanıcı url profilleri getirebilir

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

gibi spotify user nesneler URL'lerin listesini göreceksiniz (hayır auth gerekli):

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

alın Bu dışarı! Başlangıç ​​noktası arama API içinde playlist arama türüdür

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

, özetlemek gerekirse: Bu noktada display_name ile user nesneleri ve (örnek json) gibi followers sayımı görebilirsiniz.Bunu göz önünde bulundurarak, kullanıcı profillerini kimlik doğrulaması olmadan alabilirsiniz. Geçerli oauth jetonları aldığınız varsayıldığında, daha fazla sorgu yapmak için en iyi grafikleri getirebilirsiniz.

+0

Sanırım ilk kod bölümünüzü anlamıyorum. "Doom metal" ve "Adele" anahtar kelimelerini içeren bir oynatma listesi araması yapıyorsunuz gibi görünüyor. Anladığım kadarıyla, kullanıcıları bu oynatma listesi sonuçlarına göre buldunuz. Adele veya doom metali içeren oynatma listelerine bağlı olan bu kullanıcılar mı? Bu, kullanıcı profillerini bulmak için çalma listeleri hakkındaki bilgileri bilmem gerektiği anlamına mı geliyor? Bu kodun "kullanıcı adı" giriş bilgisini nasıl kullandığını göremiyorum, tek gördüğüm girdi olarak çalma listesi bilgisi. – OMGitzMidgar

+0

@OMGitzMidgar Evet, kullanıcı olarak çıktı olarak kullanmanın tek yolu budur, çünkü kullanıcı isimlerini sorgulamanın bir yolu yoktur, eğer cevabınız varsa, sorgulayabileceğiniz tek nesneler sanatçı, albüm, parça ve çalma listesidir. Ancak, çalma listeleri verilen, çıktı olarak usera sahip olabilirsiniz, bu sorunun yarısı;) – loretoparisi