为什么曲目名称中的点会混淆通过 Spotify Web API 进行的搜索?

Why are dots in track name confusing searches via Spotify Web API?

例如,我们要搜索曲目Sixx:A.M. Life Is Beautiful。为此,请转到 Spotify Consoletotal int 响应为零。没有找到。

现在,转到该站点。将相同的文本 Sixx:A.M. Life Is Beautiful 粘贴到搜索字段中。结果不止一个。

有什么问题?

Description 搜索请求

回应:

{
  "tracks": {
    "href": "https://api.spotify.com/v1/search?query=Sixx%3AA.M.+Life+Is+Beautiful&type=track&offset=0&limit=1",
    "items": [],
    "limit": 1,
    "next": null,
    "offset": 0,
    "previous": null,
    "total": 0
  }
}

站点url:

https://open.spotify.com/search/Sixx%3AA.M.%20Life%20Is%20Beautiful

更新

如果从字符串中删除点 - Sixx:AM Life Is Beautiful - Spotify Console returns 需要的曲目!但是例如 P.O.D. Find My Way - 点不干扰,结果与它们一起给出。我不明白它是如何工作的...

因为query参数不是像网站那样简单的"search string"。是一个包含字段和运算符的字符串,如您在 the documentation 中所读。将用户输入直接作为 query 参数传递可能会导致问题,因为用户可以在不知情的情况下为运算符编写过滤器。您应该:

  • 将此事通知用户。用户将编写运算符等知道他在做什么。
  • 解析收到的字符串并创建适当的 query 参数。

我猜 Spotify 不喜欢他们查询中的奇怪字符,例如点等(例如 Google 相同,但 Google 过滤它们),所以我建议只解析字符串,删除点,将所有非字母数字字符转换为空格并使所有字符串小写,因此没有运算符(如文档所述,运算符为大写)。所以:

function cleanQuery(str) {
  return encodeURIComponent(str.replace(/\./g, "").replace(/[^0-9a-z]/gi, " ").toLowerCase());
}

console.log("Clean \"Sixx:A.M. Life Is Beautiful\":", cleanQuery("Sixx:A.M. Life Is Beautiful"));

我用返回的结果进行了查询,结果有效:

请注意,这是一个快速测试。我注意到点的问题在于它们不是 第一个词 。也许有更多字符有问题,例如破折号。这将是一个反复试验的过程,因为文档有点含糊(例如,没有记录点)。