2016-04-10 9 views
0

Spotifyユーザーを名前で検索できる機能を含むAndroidアプリケーションを作成しようとしています。 Spotifyを使用するときは、IDまたは名前でユーザを検索できます。しかし、現在、私はSpotify Web APIが名前でユーザを検索することはできません。ユーザーIDをお持ちの場合は、Web APIを使用してプロファイルにアクセスできます。しかし、私はあなたがUser nameの検索を実行してそのIDをそのように取得する方法があることを期待していました。Spotify Web APIを使用して名前でユーザーを検索する方法

SpotifyのWeb APIを使用すると、すべての検索結果を返す「トラック」または「アーティスト」を検索することができます。では、なぜあなたはユーザー名で同じことをすることができませんか?この作品を私が見ていないようにする方法はありますか?

答えて

1

巨大なコミュニティのユーザーデータを考慮しているので、これは興味深い質問だと思いますので、私は理解しようとします。 artistplaylist、およびtrack:まず

は、あなたは明らかに楽しんでるのWeb APIエンドポイントsearch のみ、次の種類を認めているtypeパラメータを持っていることがわかります。 NOTE 最近のSpotifyはsearch APIは、リクエストヘッダで指定されるアクセストークンが必要になります

: のはここから(私はhereを使用しているデータをフェッチするPromise.allソリューションを参照してください。注)を実行するためにそれを試してみましょう:

-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これらのオブジェクトは自己定義されていますが、1つはplaylistです。ように(ところで認証を必要とする)hrefは、プレイリストのURLをしている間

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

ナイス!external_urlsは、ユーザープロファイルのURLです: 実際に我々は(例)のようなuserオブジェクトがいることを、この応答から見ることができますこの時点yにおける

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

:私たちは、最初にこのjson応答からそれらをつかむことができます

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

取得:OU(URL例)

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

だから今、私たちはユーザープロファイルを取得できるURL(無認証は必要ありません)のようなSpotifyはuserオブジェクトのURLのリストが表示されますそれ!この時点で、我々は(たとえば、JSON)などのdisplay_namefollowersカウントがuserオブジェクトを参照することができます

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

を、おさらいに、出発点は、検索APIのplaylist検索タイプです。それで、認証なしでユーザープロファイルを取得できます。有効なoauthトークンを取得したと仮定して、上位のチャートをフェッチしてさらにクエリを実行できます。

+0

私はコードの最初の部分を理解していないと思います。キーワード「doom metal」と「Adele」でプレイリスト検索を行っているようです。私が理解しているところでは、プレイリストの結果に基づいてユーザーが見つかりました。これらのユーザーは、Adeleまたは運命の金属を含むプレイリストに所属していますか?これは、プレイリストに関する情報を知る必要のあるユーザープロフィールを見つけることを意味しますか?私は、このコードが入力情報 "user name"をどのように使用しているのか見当たりません。 – OMGitzMidgar

+0

@OMGitzMidgarはいこれは、ユーザー名を照会する方法がないので、ユーザーを出力として持つ唯一の方法です。答えがあれば、アーティスト、アルバム、トラック、プレイリストのみ照会できるオブジェクトです。しかし、プレイリストがあれば、あなたは出力としてuseraを持つことができます。それは問題の半分です;) – loretoparisi

関連する問題