YouTube 数据 API v3:ChannelListResponse、PlaylistListResponse 和 PlaylistItemListResponse 的 etag 实现中断
YouTube Data API v3: etag implementation broken for ChannelListResponse, PlaylistListResponse and PlaylistItemListResponse
我已于 2019 年 7 月 23 日在 Google's bug tracker 上提出以下问题,但从未得到答案是否会在 YouTube 的数据 API v3.
中得到解决
问题是,YouTube 数据 API v3 的当前 etag 实现不适用于 ChannelListResponse、PlaylistListResponse 和 PlaylistItemListResponse,因为 etag 在每次请求时都会发生变化,即使相应请求背后的数据也是如此没有改变。这使得无法缓存此数据并减少 API 请求的数量。 linked Whosebug 回答解释了这种行为的原因可能是 API 根据请求以另一个顺序返回项目,因此设置了一个新的 etag。
如何重现:
- 点击this link并查看etag
- 再次(多次)点击link,您会看到etag不时发生变化
此 etag 行为在 PlaylistItemListResponse.Item 实体(实际上是视频)上正常工作,只要视频数据未更改,etag 始终保持不变。因此,在 YouTube 数据 API v3.
上处理 etag 的方式显然有不同的实现方式
知道是否有解决方法或者此问题是否有一天会得到解决?
我将尝试回答以下问题:
Are there workarounds for the well-known issues of the etag
properties of Channels.list
, Playlists.list
and PlaylistItems.list
API endpoints?
1. Channels.list
端点
在 Channels.list
的情况下,事情很简单(但并非微不足道),因为此端点 returns 最多 50 个 Channel resources. (Usually only one, but when one is setting the value of id
参数作为逗号分隔的列表 --最多 50 个 -- 通道 ID,然后 he/she 将从端点获取多个此类资源。)
简单性来自这样一个事实,即任何此类通道资源都可以在本地缓存(以从端点接收的原始 JSON 文本形式,或者以保留此所有属性的任何其他形式资源)。然后,在为当前服务器存储的资源调用端点时,可以应用结构(简单但并非微不足道)差异操作来查看该资源是否已更改并确定发生的确切更改。
2。 Playlists.list
端点
在Playlists.list
的情况下,事情与第1点w.r.t的情况完全相似。 Channels.list
端点。
3。 PlaylistItems.list
端点
当需要跟踪发生的更改时,事情会变得更加复杂 w.r.t。任何给定播放列表的项目。 PlaylistItems.list
端点就是在这种情况下使用的,但不幸的是,在这种情况下出现了几个问题:
实际上一个播放列表可以变得很大(如果只考虑某些频道的上传播放列表,有数十万个条目)。
根据设计,当查询给定频道的上传播放列表时,an upper 20000 limit 设置了通过 PlaylistItems.list
返回的项目数。
由于上面的前两个项目符号,在某些情况下,计算本地缓存和远程存储的播放列表项目列表之间的集合论差异是不可行的,甚至是不可能的。因此,在一般情况下(即当不考虑某些播放列表的特殊性时),我们无法准确地说出 从中删除、添加和保留在 中的项目是什么播放列表。
YouTube 数据 API 无法让用户确定从给定播放列表中删除了哪些视频项目以及何时删除。然而,该用户可以通过使用 Activities.list
端点很好地确定哪些项目被添加到播放列表以及何时发生。
因此,跟踪播放列表发生的变化的用户只能部分回答集合论差异问题,该问题理想地解决了 his/her 问题。
使用 Activities.list
端点的注意事项如下:端点 returns 发生的一整套活动类型 w.r.t。给定的通道(由 Activities resource 指定)。 type
属性 将它们全部列举出来:
snippet.type (string)
The type of activity that the resource describes.
Valid values for this property are: channelItem, comment (not currently returned), favorite, like, playlistItem, promotedItem, recommendation, social, subscription, upload, bulletin (deprecated).
因此,在监视 Activities.list
时,当 API 用户只对 playlistItem
活动感兴趣时,从端点获得的结果集很可能包含大量噪音。
我已于 2019 年 7 月 23 日在 Google's bug tracker 上提出以下问题,但从未得到答案是否会在 YouTube 的数据 API v3.
中得到解决问题是,YouTube 数据 API v3 的当前 etag 实现不适用于 ChannelListResponse、PlaylistListResponse 和 PlaylistItemListResponse,因为 etag 在每次请求时都会发生变化,即使相应请求背后的数据也是如此没有改变。这使得无法缓存此数据并减少 API 请求的数量。 linked Whosebug 回答解释了这种行为的原因可能是 API 根据请求以另一个顺序返回项目,因此设置了一个新的 etag。
如何重现:
- 点击this link并查看etag
- 再次(多次)点击link,您会看到etag不时发生变化
此 etag 行为在 PlaylistItemListResponse.Item 实体(实际上是视频)上正常工作,只要视频数据未更改,etag 始终保持不变。因此,在 YouTube 数据 API v3.
上处理 etag 的方式显然有不同的实现方式知道是否有解决方法或者此问题是否有一天会得到解决?
我将尝试回答以下问题:
Are there workarounds for the well-known issues of the
etag
properties ofChannels.list
,Playlists.list
andPlaylistItems.list
API endpoints?
1. Channels.list
端点
在 Channels.list
的情况下,事情很简单(但并非微不足道),因为此端点 returns 最多 50 个 Channel resources. (Usually only one, but when one is setting the value of id
参数作为逗号分隔的列表 --最多 50 个 -- 通道 ID,然后 he/she 将从端点获取多个此类资源。)
简单性来自这样一个事实,即任何此类通道资源都可以在本地缓存(以从端点接收的原始 JSON 文本形式,或者以保留此所有属性的任何其他形式资源)。然后,在为当前服务器存储的资源调用端点时,可以应用结构(简单但并非微不足道)差异操作来查看该资源是否已更改并确定发生的确切更改。
2。 Playlists.list
端点
在Playlists.list
的情况下,事情与第1点w.r.t的情况完全相似。 Channels.list
端点。
3。 PlaylistItems.list
端点
当需要跟踪发生的更改时,事情会变得更加复杂 w.r.t。任何给定播放列表的项目。 PlaylistItems.list
端点就是在这种情况下使用的,但不幸的是,在这种情况下出现了几个问题:
实际上一个播放列表可以变得很大(如果只考虑某些频道的上传播放列表,有数十万个条目)。
根据设计,当查询给定频道的上传播放列表时,an upper 20000 limit 设置了通过
PlaylistItems.list
返回的项目数。由于上面的前两个项目符号,在某些情况下,计算本地缓存和远程存储的播放列表项目列表之间的集合论差异是不可行的,甚至是不可能的。因此,在一般情况下(即当不考虑某些播放列表的特殊性时),我们无法准确地说出 从中删除、添加和保留在 中的项目是什么播放列表。
YouTube 数据 API 无法让用户确定从给定播放列表中删除了哪些视频项目以及何时删除。然而,该用户可以通过使用 Activities.list
端点很好地确定哪些项目被添加到播放列表以及何时发生。
因此,跟踪播放列表发生的变化的用户只能部分回答集合论差异问题,该问题理想地解决了 his/her 问题。
使用 Activities.list
端点的注意事项如下:端点 returns 发生的一整套活动类型 w.r.t。给定的通道(由 Activities resource 指定)。 type
属性 将它们全部列举出来:
snippet.type (string)
The type of activity that the resource describes.Valid values for this property are: channelItem, comment (not currently returned), favorite, like, playlistItem, promotedItem, recommendation, social, subscription, upload, bulletin (deprecated).
因此,在监视 Activities.list
时,当 API 用户只对 playlistItem
活动感兴趣时,从端点获得的结果集很可能包含大量噪音。