Spotify 网络挂钩?

Spotify Webhooks?

Spotify 平台是否计划为第三方开发者提供任何 webhook 来监听用户库、播放列表或播放器的变化?

如果 webhook 不存在,有哪些已知的解决方法?

Web 中没有 webhooks API 我认为添加该功能还需要一段时间 https://github.com/spotify/web-api/issues/538

Spotify 上的播放列表由 snapshot_id 进行版本控制。当您向 get a playlist 发出 API 请求时,返回的字段之一是 snapshot_id,它标识播放列表版本。如果您为每个播放列表存储此版本 ID,您可以检查自上次检查以来播放列表是否已远程更改(如果是,snapshot_id 会更改)

请务必记住,您所做的任何更改也会影响 snapshot_id。所以你需要:

  1. 获取播放列表
  2. 您本地保存的 snapshot_id 与当前播放列表的不同吗?
  3. 如果是这样,可能会做一些改变
  4. 进行更改后,再次获取播放列表
  5. 更改后从“获取播放列表”存储 snapshot_id

我认为 snapshot_id 不支持用户的图书馆 - 您可以检查用户图书馆的子集以检测任何 添加 (例如,如果第一个库中的 50 首歌曲没有更改,则没有添加新歌曲,您只需提出一个 API 请求而不是无数首),但如果您只做这个。您还可以检查库中的歌曲数量,这会告诉您何时添加或删除了歌曲,除非在极端情况下添加和删除的歌曲数量相同。但这意味着他们添加了一首歌曲,检查曲库中的前 50 首歌曲就会发现这一点。

您可以轮询当前正在播放和最近播放的歌曲。如果您想跟踪用户收听的每一首歌曲,您可以通过至少每 30 * 50 秒(25 分钟)轮询最近播放一次来实现。 30 是在 Spotify 将歌曲记录为 Listen 之前收听歌曲所需的秒数,50 是它将为您服务的最近播放歌曲的最大数量。

为了知道一首曲目何时播放完毕,我设置了一个等待函数来等待该曲目的持续时间,然后在播放结束后继续

const delay = ms => new Promise(resolve => setTimeout(resolve, ms))

//start playing a track
    
let device_status = await spotifyApi.getMyCurrentPlaybackState().then(result =>{
      return result.body;
    })

 let time_left = device_status.item.duration_ms - device_status.progress_ms;
 await delay(time_left)

//whatever needs to be done after