首页 > 解决方案 > 获取频道N个最新视频的正确方法:搜索vs playlistItem vs活动端点

问题描述

我正在开发一个需要检索用户(频道)的最后 10 个视频的网络应用程序。

第一种方法

是使用带有按日期排序的参数“forMine”的搜索端点,但后来我想也许该参数可以检索用户在不同频道或其他任何地方上传的视频......

带有频道 ID 和日期的第一个结果 - 第一次方法

第二种方法

是使用参数“channelId”按日期排序的搜索端点,但后来我意识到描述不完整,最重要的是,与第一种方法相比,缺少一些视频,即使丢失的视频属于同一频道(如图所示)链接)

带有频道 ID 和日期的第一个结果 - 第二种方法

所以,然后我用谷歌搜索找到了一些解决方案并找到了其他方法。

第三种方法

是使用我在 Google 中找到的 playlistItem 端点,并且看起来还可以(我想),因为它返回了第一次接近的相同视频并且消耗的配额更少,但是这种方法让我产生了疑问,因为我不知道这些视频是否会是最新的,或者它们可能会按播放列表中的位置排序,并且不能被认为是最新的

也就是说,从一个频道获取 N 个最新视频的正确方法是什么?不考虑配额消耗(当然,配额越少越好,但准确的结果是必不可少的)

我对 API 响应感到非常困惑......

太感谢了!


-- 已编辑:新方法和进一步调查 --

第四种方法

正如@stvar 在他的回答中所说的那样使用活动端点。我发现这种方式,与第二种方法相比,与第一种和第三种方法相比,缺少一些视频,并且需要在没有'maxResults'参数的情况下检索所有内容,因为存在与视频上传无关的活动,强制执行分页并在检索响应后按“上传”类型进行自我过滤以获得 N 个视频(或有信心在前 50 个检索项目中上传 N 个视频)

自我调查

进一步的调查和测试使我对某些方法的“缺少视频”问题做出了回应。丢失的视频的状态是“未列出”,所以它们是上传到频道的视频,频道的属性,由频道用户上传......但没有被某些似乎只检索“公共”视频的方法检索到“未列出”(隐藏)或“私人”。

注意:我使用 Google API PHP 客户端库进行了测试,此行为似乎不在“尝试此 API”上,因为它仅返回“公共”项目,因此请小心信任“尝试此 API”结果,因为它似乎使用一些隐藏的过滤器或其他东西......

我还测试了频道上传播放列表,以验证顺序不能更改并且具有 LIFO 排序


结论

在这一点上,我的自我结论是,没有适当的方法来解决这个问题,而是根据状态要求和免费配额的数量来解决这个问题

搜索端点似乎可以正常工作,如果您有大量未使用的配额(每次调用 100 个),这是直接方式和最简单的方式,因为您可以根据需要对它进行排序和过滤,注意使用 '如果您需要每个上传的视频,则为 forMine' 参数;如果您只需要 'listed' 和 'public' 视频,则为 'channelId'。

如果您处于配额危机(每次调用 1 个),PlaylistItems 端点是一种正确的方法,因为结果按最近日期排序,如果只需要“公共”视频,请注意进行分页和后过滤,直到检索到所需数量的视频ids,否则你可以一路轻松。

请注意,用于订购的日期是上传日期而不是发布日期(感谢@stvar 引起注意)

活动端点,也适用于配额危机(每次调用 1 个),但如果您只想要公共视频(它是按最近的“首次发布日期”排序的,因此 100% 也不准确),它可能比其他更准确,适合我提供更多工作的那个,因为它检索“视频上传”以外的活动,因此您不能跳过分页和后过滤来检索所需数量的视频 ID,除此之外,如前所述,您只能访问公共视频(如果满足您的需求,那很好)。

无论如何,如果您需要超过 50 个 id,则无论使用哪种方法都需要进行分页。

希望这对其他人有所帮助,非常感谢贡献者

PS:负责YouTube API的人,也许按州过滤会很有趣,谢谢!!!

标签: youtube-data-apigoogle-apis-explorer

解决方案


您可以使用Activities.listAPI 端点,通过以下方式查询:

  • mine=true,
  • part=snippet,contentDetails,
  • fields=items(snippet(type),contentDetails(upload)), 和
  • maxResults=50.

要获得所需的N上传,您必须实施pagination。也就是说,您必须连续调用端点,直到您到达与 相等的N结果集项目。snippet.typeupload

请注意,如果您对由其 ID而不是您自己的频道标识的频道的最新上传感兴趣,则可以使用channelId=CHANNEL_ID代替。mine=trueCHANNEL_ID

根据文档,您将从该端点获得一个由Activities resource包含以下信息的项目组成的结果集:

contentDetails.upload (object)
上传对象包含有关上传视频的信息。此属性仅在 为 时才snippet.type存在upload

contentDetails.upload.videoId (string)
YouTube 用来唯一标识上传视频的 ID。

官方文档指出,对Activities.list端点的每次调用都有一个单位的配额成本


此外,在获取一组视频 ID 后,您可以Videos.list使用正确分配的id参数调用端点,以便从端点获取您感兴趣的每个视频所需的所有详细信息。

请注意,如果您有一组 cardinality 的视频 ID K,由于可以将 endpoint 的参数id指定为以Videos.list逗号分隔的视频 ID 列表,那么您可以通过适当使用just提及。Videos.listKfloor(K / 50) + (K % 50 ? 1 : 0)id

根据官方文档,对Videos.list端点的每次调用也有一个单位的配额成本


应 OP 要求的澄清

问号 1Activities.list端点只产生由活动资源指定的活动。该type属性将它们全部枚举:

snippet.type (string)
资源描述的活动类型。

此属性的有效值为:channelItemcomment(当前未返回)、favoritelikeplaylistItempromotedItemRecommendationsocialsubscriptionuploadbulletin(已弃用)。

确实你的说法是正确的。例如,在获取最近的10上传内容时,您可能需要扫描多页P结果集,使用P >= 2, 直到您收集到所需的10上传项目。(实际测试证实我这是事实。)

问号 2Activities.list端点产生按publishedAt;排序的项目 只需将以上内容替换为fields

fields=items(snippet(type,publishedAt),contentDetails(upload))

亲眼看看。

我可以在这里提出以下论点,证明调用Activities.list端点时产生的项目必须按时间顺序排列publishedAt(最新的在前)。有人可能会注意到,实际上,上面引用的官方文档并没有明确指定我刚才提到的订购条件;但与我裸露了一段时间:

我的论点是务实的:如果结果集Activities.list没有按上述顺序排列,那么这个端点就变得无用了。之所以如此,是因为在这种情况下,要获得最近的上传活动,必须在本地获取所有上传活动,然后扫描该结果集以查找最近的上传活动。被迫获取所有上传活动只是为了获得最新的活动实际上是无稽之谈。因此,作为矛盾,结果集必须按时间顺序排列,publishedAt最新的排在第一位。

问号 3:确实Search.list不精确——它有一个模糊的行为。我可以根据自己的经验确认这一点;但不幸的是,我无法向您指出承认并解释这种行为的官方文档(来自 Google 或 YouTube)。不幸的是,它的用户Search.list是完全不透明的。

另一方面,Activities.list是精确的——它必须是这样的;如果它不准确,那么这是实现中的一个严重错误(在我的受过教育的观点中)。


推荐阅读