我测试了YouTube的PlaylistItems.list
API,以获取频道的默认播放列表。
在响应有效载荷中,2020-10-14T20:22:24Z发布的视频在第一个对象中,然后2020-10-21T17:54:05Z发布的下一个视频在第二个对象中。
在这个答案中提到:
从播放列表查询返回的publishedAt是视频已添加到播放列表中,而不是视频的日期发布在YouTube 上
我的情况可能是什么原因?
是否为该API维护了任何特定的排序顺序?
您看到您示例的排序的原因有两个(尽管您没有提到您的播放列表ID,以便其他人验证您的声明(。
1.视频的发布时间很可能与其上传时间不同
首先是以下内容:根据视频资源的publishedAt
属性的官方文档(以下重点是我的(:
snippet.publishedAt
(日期时间(视频发布的日期和时间请注意,这个时间可能与上传视频的时间不同例如,如果视频作为私人视频上传,然后在以后公开,则此属性将指定视频公开的时间。
有几个特殊情况:
- 如果视频作为私人视频上传,并且视频元数据由频道所有者检索,则属性值指定视频上传的日期和时间
- 如果视频是作为未列出的视频上载的,则属性值还会指定上载视频的日期和时间。在这种情况下,任何知道视频的唯一视频ID的人都可以检索视频元数据
该值以ISO 8601格式指定。
因此,在某些情况下,给定的视频很可能具有不同的上传时间和发布时间。
此外,PlaylistItems资源的官方文档显示以下w.r.t.两个相关属性:
snippet.publishedAt
(日期时间(项目添加到播放列表的日期和时间。该值以ISO 8601格式指定。
contentDetails.videoPublishedAt
(日期时间(视频发布到YouTube的日期和时间。该值以ISO 8601格式指定。
根据snippet.publishedAt
的规范,在播放列表是给定频道的上传播放列表的情况下(即ID形式为UU...
的播放列表;注意,通常频道ID及其相应的上传播放表ID通过s/^UC([0-9a-zA-Z_-]{22})$/UU1/
相关,尽管没有正式记录(,snippet.publishedAt
的值是该视频的上传日期。
第二个规范指示contentDetails.videoPublishedAt
的值是相应视频资源的snippet.publishedAt
的值,即该视频的发布时间。
2.对于频道的上传播放列表,PlaylistItems.list
API端点返回的项目(必须(按contentDetails.videoPublishedAt
的逆时间顺序排列
事实上,排序条件似乎是真的。这个特性没有正式记录,但根据我的经验,上面的语句适用于从PlaylistItems.list
端点获得的每个结果集。
我可以在这里提出以下论点来证明调用PlaylistItems.list
端点时产生的项目由contentDetails.videoPublishedAt
按逆时间顺序(最新的第一个(排序的必要性:
这个论点是一种务实的论点:如果PlaylistItems.list
的结果集没有按照前面提到的那样排序,那么这个端点就变得无用了。
这是因为,在这种情况下,要获得最近发布的视频,必须在本地获取所有上传的项目(其数量根据设计限制为20000(,然后扫描该结果集以查找最近的项目。为了获得最新的项目而被迫获取所有上传的项目实际上是无稽之谈。如果给定频道的上传次数超过20000的限制,那么最新的视频可能会超出这一界限;因此,对于此类频道,根本无法从API获得最近发布的视频。
因此,通过矛盾的方式,结果集必须按照contentDetails.videoPublishedAt
的逆时间顺序进行排序。