最初的计划是将这篇文章写成博客文章,名为" Spotify元数据API中的效率低下:或者,杰克逊5如何杀死我的浏览器"但是在最后一刻改变了我的想法,因为我有一个习惯在文档中遗漏了明显的东西,也许可能存在一个我没有记错的无证特征,或者其他人已经解决了这个问题 - 因此这个问题有一定的博客帖子关于它的语气!
我正在开发一个小型网络应用程序,主要面向一小群人,这将允许任何人更新Spotify播放列表。由于并非每个人都有Spotify(虽然我不知道为什么!),该页面将使用歌曲更新数据库,因为我的笔记本电脑上的Spotify中运行的应用程序会轮询数据库以获取更新,然后使用Spotify应用程序API,播放列表已更新,订阅播放列表的任何人都会获得更新。这没关系,虽然我想使用推送而不是民意调查,但那是另一天的话题。
我在周围搜索了一个与Spotify Metadata API一起使用的Javascript库,并找到了一个(https://github.com/palmerj3/SpotifyJS)虽然它基本上是一个包装器,但仍然需要你自己解析JSON。我想我可以更好地为最常见的领域(标题,艺术家,专辑,Spotify URI)进行一些基本的解析。我开始研究我自己的库/ JQuery插件。
按轨道搜索不是问题,它是对spotify元数据API的单次调用,结果很容易解析,将返回的艺术家与请求的艺术家(如果存在)匹配,可以按标题轻松搜索/艺术家。
艺术家搜索(获取特定艺术家的所有歌曲列表)虽然看起来很痛苦,但 * *!从文档中可以看出,这就是过程。
第一步将返回一小部分艺术家比赛,Foo Fighters有2,Silverchair 1和The Jackson 5有4.这个小名单变成了更多的专辑比赛 - 来自记忆Foo Fighters返回112,然后变成更大数量的曲目列表。从Javascript / JQuery的角度来看,这会导致菊花链式的AJAX请求,每个步骤,以及每一步,针对Spotify服务器的大量,几乎并发的GET请求。
我写的初始版本被欺骗并使用了同步AJAX,并且工作正常,因为每个请求必须在下一个请求开始之前完成,但这会将浏览器锁定一段时间,并且删除了使用反馈到系统正在运行的用户。然后我切换到异步请求,一切都崩溃了!您立即在Spotify端遇到速率限制问题,它返回带有502坏网关的resoponses(顺便说一下,它没有在spotify文档中列为状态),或者503 - 两者都将JQuery解释为状态代码0 - 这很有趣,需要在Firebug中进行调试。我在客户端扼杀了请求,我发现每秒一次是正确的,以避免速率限制并确保每次都得到包含数据的响应,然而,这会导致浏览器中的大量锁定,因为它已经向上并行的30或40个GET请求,几乎同时返回(尽管一些请求在15秒后响应!)然后解析所有JSON响应。
我考虑使用服务器端方法减轻负载,但这也有缺点: 1.您不能避免基本问题,因为API无法以有效的方式处理任务 2.对于繁忙的站点,带宽使用量将针对服务器,这也将呈现单个IP,对于多个用户,您将很快达到并行用户的速率限制
服务器端确实提供了缓存,虽然这可能是有益的,为此我发现了一个PHP库 - metatune(https://github.com/mikaelbr/metatune)作为" Spotify元数据API的终极PHP包装器&#34广告;但不幸的是,它只提供与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换了Flash,但性能仍然差!其他人都有同感吗?
干杯! sockThief
答案 0 :(得分:4)
除非我遗漏了什么,否则这样做是否符合要求?
http://ws.spotify.com/search/1/track.json?q=artist:foo+fighters
artist:
前缀告诉搜索服务仅匹配艺术家。您可以阅读有关高级搜索语法(也适用于客户端)here。