【问题标题】:Return Top Track Spotify API返回热门曲目 Spotify API
【发布时间】:2013-11-14 17:21:35
【问题描述】:

我正在尝试创建一个帮助文件,该文件将返回任何艺术家相关艺术家的热门曲目。我想做的只是使用 1 个艺术家 URI 来显示他们相关艺术家的姓名、人气和热门曲目。而且我想将最重要的轨道功能分离到一个单独的文件中,我可以随时调用。

但是,我似乎无法弄清楚如何正确返回相关艺术家的热门曲目。

在我的“get-toptrack.js”文件中:

   require([
      '$api/models',
      '$api/toplists#Toplist'
    ], function(models, Toplist) {
      'use strict';

      var doGetTopTrack = function(uri, num) {
        var artistURI = uri;
        var artist = models.Artist.fromURI(artistURI);
        var artistTopList = Toplist.forArtist(artist);

        artistTopList.tracks.snapshot().done(function(snapshot){

          snapshot.loadAll('name').done(function(tracks) {
            var i, num_toptracks;
            num_toptracks = num;

              for(i = 0; i < num_toptracks; i++){
                console.log("top track: " + tracks[i].name);
                // WHERE DO I RETURN THE TOP TRACKS??
              }
          });
        });
      };

      exports.doGetTopTrack = doGetTopTrack;
    });

在我的“artist.js”文件中:

require([
    '$api/models',
    'scripts/get-toptrack'
  ], function(models, getTopTrack) {
    'use strict';

    var showRelated = function() {
      var artist_properties = ['name', 'popularity','related', 'uri'];

      models.Artist
        .fromURI('spotify:artist:11FY888Qctoy6YueCpFkXT')
        .load(artist_properties)
        .done(function(artist){

          artist.related.snapshot().done(function(snapshot){
            snapshot.loadAll('name').done(function(artists) {

              for(var i = 0; i < artists.length; i++){
                var u, p, n, t, listItem;

                // store artist details
                p = artists[i].popularity;
                n = artists[i].name;
                u = artists[i].uri;

                // am I missing something here?
                t = getTopTrack.doGetTopTrack(u, 1);

                listItem = document.createElement("li");
                listItem.innerHTML = "<strong>Name</strong>: " + n.decodeForText() + " | <strong>Popularity: </strong> " + p + " | <strong>Top Track: </strong>" + t;

                // undefined name
                $('#artistsContainer').append(listItem);

              }
            });

          });
        });
    };

    exports.showArtists = showArtists;
  });

在“main.js”文件中,我调用了艺术家函数开始。

require([
  '$api/models',
  'scripts/artist'
], function(models, initArtist) {
  'use strict';

  initArtist.showRelated();
});

【问题讨论】:

    标签: javascript api spotify spotify-app


    【解决方案1】:

    无法评论多个 .js 文件,因为我尚未将我的应用重构为多个文件。

    就返回而言,您是在异步应用程序中工作,所以您不能。您必须使用回调,否则 Spotify Promise 可能会使您的 api 与 Spotify 的更一致。查看 Promise.each() 的文档。

    这里是回调方法的一个实现。更改了一些内容以使我更容易进行测试。相反,让艺术家更容易让生活变得更容易。此外,由于第二位艺术家的排行榜可能比第一位更快地返回,因此无法保证他们会出现的顺序。如果您想保持秩序,则需要添加更多代码。

    function doGetTopTrack(artist, num, callback) {
        var artistTopList = Toplist.forArtist(artist);
    
        artistTopList.tracks.snapshot(0,num).done(function (snapshot) { //only get the number of tracks we need
    
            snapshot.loadAll('name').done(function (tracks) {
                var i, num_toptracks;
                num_toptracks = num; //this probably should be minimum of num and tracks.length
    
                for (i = 0; i < num_toptracks; i++) {
                    callback(artist, tracks[i]);
                }
            });
        });
    };
    
    function showRelated() {
        var artist_properties = ['name', 'popularity', 'related', 'uri'];
    
        models.Artist
          .fromURI('spotify:artist:11FY888Qctoy6YueCpFkXT')
          .load(artist_properties)
          .done(function (artist) {
    
              artist.related.snapshot().done(function (snapshot) {
                  snapshot.loadAll('name').done(function (artists) {
    
                      for (var i = 0; i < artists.length; i++) {
                          // am I missing something here?
                          doGetTopTrack(artists[i], 1, function (artist, toptrack) {
                                  console.log("top track: " + toptrack.name);
    
                                  var p = artist.popularity;
                                  var n = artist.name;
                                  var u = artist.uri;
    
                                  //listItem = document.createElement("li");
                                  console.log("<strong>Name</strong>: " + n.decodeForText() + " | <strong>Popularity: </strong> " + p + " | <strong>Top Track: </strong>" + toptrack.name);
    
                                  //// undefined name
                                  //$('#artistsContainer').append(listItem);
                          });
                      }
                  });
    
              });
          });
    };
    showRelated();
    

    【讨论】:

    • 谢谢你。解释了很多!
    • 是否有特殊的理由来保持“秩序”而不是抓住轨道?如果是这样,您能否指出我在 Spotify 文档中查找内容的正确方向?
    • 在这种情况下,我看不出有任何维持秩序的理由。但是,如果您真的想确保您的艺术家列表条目与“相关”的顺序相同,那么您需要重做逻辑来存储每个曲目并在最后将它们全部输出。
    • 如果我想创建这些热门曲目的“列表”,我是否必须完全重构上面的代码?
    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 2021-07-22
    • 2013-01-04
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多