当前位置: 首页 > 知识库问答 >
问题:

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

轩辕佑运
2023-03-14

最初的计划是把这写成一篇博客文章,标题是“Spotify元数据应用编程接口的低效:或者,杰克逊5是如何杀死我的浏览器的”,但在最后一刻改变了主意,因为我有一个习惯,就是错过留档中显而易见的东西,也许是一个未记录的功能可能存在,我错过了,或者其他人已经解决了这个问题-因此这个问题有一定的博客帖子语气!

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

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

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

按艺术家搜索(获得特定艺术家的所有歌曲列表),但似乎是一个痛苦的-**!据我从文档中所知,这就是过程。

  1. 搜索艺术家:这将返回与查询匹配的艺术家列表
  2. 对于每个艺术家,查找他们的相册:这将返回一个相册列表
  3. 查找每个相册并检索曲目列表
  4. 如果与输出匹配,则将每个曲目的艺术家与搜索艺术家进行比较

第一步将返回艺术家比赛的小列表,Foo Fighters有2场,Silverchair 1场,Jackson 5场有4场。这个小列表变成了更多的专辑匹配——从内存中,Foo Fighters返回了112,然后变成了更多的曲目列表。从Javascript/JQuery的角度来看,这会导致对Spotify服务器的每一步以及每一步都会产生大量几乎并发的GET请求。

我写的初始版本作弊,使用同步AJAX,工作正常,因为每个请求必须在下一个开始之前完成,虽然,这将锁定浏览器一段时间,并消除了使用反馈给用户系统正在运行的可能性...然后我切换到异步请求,一切都失控了!您立即在Spotify端遇到速率限制问题,该问题返回502个坏网关(顺便说一下,在Spotify文档中没有列为状态)或503的resoponses,这两个问题都被JQuery解释为状态代码0,这很有趣,需要调试在Firebug我节流的请求下在客户端,我发现1每秒钟是正确的,以避免速率限制,并确保我得到一个响应包含数据每次,然而,这就导致大规模锁定在浏览器,因为它有超过30或者40个GET请求并行,几乎同时返回(尽管有些请求在15秒后响应!)然后解析所有JSON响应。

我研究了通过使用服务器端方法来减轻负载,尽管这也有缺点: 1.你不能避免基本问题,因为应用编程接口不能以有效的方式处理任务2.对于一个繁忙的网站,带宽使用将是针对服务器,这也将呈现一个单一的IP,对于多个用户,由于并行用户,您将很快达到速率限制

服务器端确实提供了缓存,虽然这可能是有益的,为此,我发现了一个PHP库元数据库(https://github.com/mikaelbr/metatune),被宣传为“Spotify元数据API的终极PHP包装器”,但不幸的是,它只提供了相同的基本查找/搜索作为Spotify元数据应用编程接口——即:没有艺术家所有歌曲的列表。

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

假设我没有错过任何东西,至少对我来说,这似乎不是一个有效的应用编程接口设计,因为它鼓励你向Spotify服务器发出大量请求,这对我作为客户端和Spotify都不好作为服务器。我不禁想到,如果有这样的要求:

ws.spotify.com/search/1/artist.json?q=foo

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

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

感谢阅读!花了很长时间才找到这些问题,但我觉得有必要提供尽可能多的理由来找到最佳解决方案,而且,这也说明了应用编程接口的不足,我希望Spotify的人会注意到这一点!

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

干杯偷袜子的

共有1个答案

叶修永
2023-03-14

除非我遗漏了什么,这是你想要的吗?

http://ws.spotify.com/search/1/track.json?q=artist:foo+fighters

artist:前缀告诉搜索服务只匹配artist。您可以在这里阅读有关高级搜索语法(在客户端也可以使用)的更多信息。

 类似资料:
  • 使用SpotifyAPI,我试图搜索艺术家的轨迹。我使用的查询正在运行,如下所示:

  • 我是Spotify API的新手。我正在试图弄清楚如何搜索一个艺术家和一个标题在同一时间。 我正在使用一个AJAX调用,同时带有艺术家和标题。如果任何一个是空白的,我可以简单地搜索另一个,但我似乎无法弄清楚如何搜索艺术家和标题在同一时间。这样做的目的是缩小结果以找到特定的轨迹。 以下是我的资料: 如前所述,如果我只搜索艺术家或标题,它就可以正常工作。我只是不知道如何使用Spotify的API同时搜

  • 我可以通过调用这个网址查看Spotify上的所有曲目: http://ws.spotify.com/search/1/track.json?q=xxx 示例响应包含每个曲目的艺术家数据,如: 从上面的响应中,我得到了艺术家ID:38IfmizrHTCxFjd8UKhWnp。 现在,有没有一种方法可以通过api调用获得上述艺术家(38IfmizrHTCxFjd8UKhWnp)的所有曲目? 我想做的是

  • 我已经找到了相关的问题(比如这一个),但没有什么能直接回答我的问题:我需要一种直接的方式将艺人名称和曲目名称转换为spotify链接。就像spotify对本地文件列表所做的那样(我认为有些是链接,有些不是,因为spotify没有这些曲目)。 我怎么能把像艺术家:“弗兰科林”和曲目名称:“医院之歌”这样的东西变成Spotify uri而不搜索它(它会返回多个结果,我不知道该使用哪个)。Spotify

  • 原文:Artist tutorial matplotlib API 有三个层级。 matplotlib.backend_bases.FigureCanvas是绘制图形的区域,matplotlib.backend_bases.Renderer是知道如何在ChartCanvas上绘制的对象,而matplotlib.artist.Artist是知道如何使用渲染器在画布上画图的对象。 FigureCanv

  • API流改变了吗? 我再也不能为搜索曲目或艺术家进行简单的公共API调用了? 此外,我在Spotify文档中看到,如果查询字符串中提供了market=from_token,则需要授权。否则,可选。