Search Spotify元数据API:按艺术家搜索

Search Spotify元数据API:按艺术家搜索,search,metadata,spotify,Search,Metadata,Spotify,最初的计划是以博客的形式写这篇文章,题为“Spotify元数据API的低效:或者,Jackson 5如何杀死我的浏览器”,但在最后一刻改变了主意,因为我有一个习惯,就是忽略文档中明显的内容,也许存在一个我忽略的未记录的功能,或者其他人已经解决了这个问题——因此这个问题有一定的博客语调 我正在开发一个小型web应用程序,主要是为一小群人开发的,它允许任何人更新Spotify播放列表。由于并非每个人都有Spotify(尽管我不知道为什么!),该页面将用歌曲更新数据库,因为在我的笔记本电脑上的Spot

最初的计划是以博客的形式写这篇文章,题为“Spotify元数据API的低效:或者,Jackson 5如何杀死我的浏览器”,但在最后一刻改变了主意,因为我有一个习惯,就是忽略文档中明显的内容,也许存在一个我忽略的未记录的功能,或者其他人已经解决了这个问题——因此这个问题有一定的博客语调

我正在开发一个小型web应用程序,主要是为一小群人开发的,它允许任何人更新Spotify播放列表。由于并非每个人都有Spotify(尽管我不知道为什么!),该页面将用歌曲更新数据库,因为在我的笔记本电脑上的Spotify中运行的应用程序会轮询数据库以获取更新,然后使用Spotify应用程序API更新播放列表,任何订阅播放列表的人都会获得更新。这没关系,虽然我想使用推送而不是投票,但这是另一天的话题

我四处搜索了一个Javascript库来与Spotify元数据API一起使用,发现了一个()尽管它基本上是一个包装器,仍然需要您自己解析JSON。考虑到我可以做得更好,并对最常见的字段(标题、艺术家、专辑、SpotifyURI)进行一些基本的解析,我开始开发自己的library/JQuery插件

按曲目搜索不是问题,只需对spotify元数据API进行一次调用,结果很容易解析,将返回的艺术家与请求的艺术家(如果存在)匹配,就可以轻松地按标题/艺术家进行搜索

按艺术家搜索(获取特定艺术家的所有歌曲列表)虽然,似乎是一个痛苦的-**!从文件中我可以看出,这就是过程

  • 搜索艺术家:这将返回与查询匹配的艺术家列表
  • 对于每个艺术家,查找他们的相册:这将返回一个相册列表
  • 查找每个相册并检索曲目列表
  • 如果与输出匹配,则将每个曲目的艺术家与搜索艺术家进行比较
  • 第一步将返回艺术家比赛的小列表,Foo Fighters有2场,Silverchair 1场,Jackson 5场有4场。这个小列表变成了更多的专辑匹配——从内存中,Foo Fighters返回了112,然后变成了更多的曲目列表。从Javascript/JQuery的角度来看,这会导致对Spotify服务器的每一步以及每一步都会产生大量几乎并发的GET请求

    我编写的初始版本欺骗并使用了同步AJAX,并且工作正常,因为每个请求都必须在下一个请求开始之前完成,但是,这会将浏览器锁定一段时间,并且消除了使用系统正在运行的用户反馈的可能性。然后我切换到异步请求,所有的麻烦都爆发了!您立即遇到了Spotify端的速率限制问题,它返回502 bad gateway(顺便说一句,在Spotify文档中没有作为状态列出)或503(这两种情况JQuery都解释为状态代码0)的响应,这很有趣,需要在Firebug中调试。我在客户端限制了请求,我发现每秒1次是正确的,以避免速率限制并确保每次都得到包含数据的响应,但是,这会导致浏览器中大量锁定,因为它有30或40个以上的并行GET请求,几乎同时返回(尽管有些请求在15秒后响应!),然后解析所有JSON响应

    我研究了通过使用服务器端方法来减轻负载,尽管这也有缺点: 1.您无法避免基本问题,因为API无法有效地处理任务 2.对于繁忙的站点,带宽使用将针对服务器,服务器也将提供单个IP,对于多个用户,由于并行用户,您将很快达到速率限制

    服务器端确实提供了缓存,但这可能是有益的,为此,我发现了一个PHP库——metatune(),被宣传为“Spotify元数据API的最终PHP包装器”,但不幸的是,它只提供了与Spotify元数据API相同的基本查找/搜索功能——即:没有艺术家列出的所有歌曲

    因此,我现在禁用了艺术家的搜索,直到我找到合适的解决方案

    假设我没有遗漏任何东西,至少在我看来,这似乎不是一个高效的API设计,因为它鼓励您向Spotify服务器发出大量请求,这对我作为客户端和Spotify作为服务器都不好。我不禁想,如果有这样的请求:

    ws.spotify.com/search/1/artist.json?q=foo+fighters&extras=tracks

    然后,这里讨论的问题将得到缓解,一个请求将涵盖当前需要3组多个请求的内容;速率限制将不是一个大问题;在客户端处理数据的开销将大大减少;Spotify处理的开销将减少,整个服务将更高效。请求将返回非常大的数据集这一事实不是问题,因为API已经将数据拆分为“页面”

    因此,我要向观众提问: 1.我是否遗漏了文档中明显的内容,或者是否有秘密请求? 2.在没有API请求的情况下,是否有人对如何提高我的系统效率提出建议? 3.以前有人解决过这个问题吗

    感谢阅读!我花了很长时间来回答这些问题,但我觉得有必要提供尽可能多的理由来找到最佳解决方案,同时,它也说明了API中的缺陷,我希望Spotify的人会注意到这一点

    最后顺便说一句,像这样的项目让我觉得我们已经用Flash换了Javascript,但性能仍然很差!还有其他人有同样的感觉吗

    干杯! 袜子贼

    除非我错过了什么
    http://ws.spotify.com/search/1/track.json?q=artist:foo+fighters