Spotify 网络钩子?
Posted
技术标签:
【中文标题】Spotify 网络钩子?【英文标题】:Spotify Webhooks? 【发布时间】:2019-01-02 20:35:18 【问题描述】:Spotify 平台是否计划为第三方开发者提供任何 webhook 以监听用户库、播放列表或播放器的变化?
如果 webhook 不存在,有哪些已知的解决方法?
【问题讨论】:
2020 年,spotify 仍然没有提供 webhook 支持。确实需要。 【参考方案1】:Web API 中没有 webhook,我认为要添加该功能还需要一段时间 https://github.com/spotify/web-api/issues/538
Spotify 上的播放列表由snapshot_id
进行版本控制。当您向get a playlist 发出API 请求时,返回的字段之一是snapshot_id
,它标识播放列表版本。如果您为每个播放列表存储此版本 ID,则可以检查自上次检查后播放列表是否已远程更改(如果是,snapshot_id
会更改)
请务必记住,您所做的任何更改也会影响snapshot_id
。所以你需要:
-
获取播放列表
您本地保存的
snapshot_id
与播放列表中当前的snapshot_id
是否不同?
如果是这样,也许做一些改变
进行更改后,再次获取播放列表
在您进行更改后从“获取播放列表”中存储 snapshot_id
我认为用户库不支持snapshot_id
- 您可以检查用户库的子集以检测任何添加(例如,如果库中的前 50 首歌曲没有' t 更改,然后没有添加新歌曲,您只需发出一个 API 请求而不是无数次),但如果您只这样做,您将错过从库的其余部分中删除的内容。您还可以检查库中歌曲的数量,这会告诉您何时添加或删除歌曲,除非在添加和删除相同数量的歌曲的极端情况下。但这意味着他们已经添加了一首歌曲,检查库中的前 50 首歌曲就会发现这一点。
您可以轮询当前播放和最近播放的歌曲。如果您想跟踪用户收听的每首歌曲,您可以通过至少每 30 * 50 秒(25 分钟)轮询最近播放来实现此目的。 30 是在 Spotify 将歌曲记录为收听之前听一首歌曲所需的秒数,而 50 是它将为您提供的最近播放歌曲的最大数量。
【讨论】:
【参考方案2】:要知道曲目何时结束播放,我设置了一个 await 函数来等待该曲目的持续时间,然后在之后继续播放
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
【讨论】:
如果用户跳过或手动切换歌曲会怎样? 就我而言,播放、暂停和跳过功能也可以通过 API 工作,因此我可以在任何调用后重置“计时器”。为了捕捉播放器的变化,我认为没有优雅的方法,只有另一个功能可以不时检查。以上是关于Spotify 网络钩子?的主要内容,如果未能解决你的问题,请参考以下文章