返回热门曲目 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 艺术家的热门曲目