返回热门曲目 Spotify API

Posted

技术标签:

【中文标题】返回热门曲目 Spotify API【英文标题】:Return Top Track 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();
);

【问题讨论】:

【参考方案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 文档中查找内容的正确方向? 在这种情况下,我看不出有任何维持秩序的理由。但是,如果您真的想确保您的艺术家列表条目与“相关”的顺序相同,那么您需要重做逻辑来存储每个曲目并在最后将它们全部输出。 如果我想创建这些热门曲目的“列表”,我是否必须完全重构上面的代码? ***.com/questions/19781876/…

以上是关于返回热门曲目 Spotify API的主要内容,如果未能解决你的问题,请参考以下文章

使用 spotify-web-api-js 在 javascript 中获取 Spotify 艺术家的热门曲目

如何在 Spotify 中自动播放热门曲目?

如何在 Spotify 上获取艺术家的所有歌曲?

如何获取 Spotify 跟踪 uri?

当 Python 中的一个与另一个互补时,如何使用 2 个 spotify 端点?

尝试播放某些曲目时出现 cocoalibspotify 错误