0
//  This is a first attempt at using YouTube's v3 API. It doesn't require authentication.
getAutoGeneratedPlaylistData: function() {

    gapi.client.setApiKey('{API_KEY}');
    gapi.client.load('youtube', 'v3', function () {

        var request = gapi.client.youtube.playlistItems.list({
            part: 'contentDetails',
            maxResults: 50,
            playlistId: 'ALYL4kY05133rTMhTulSaXKj_Y6el9q0JH',
            fields: 'items/contentDetails'
        });

        request.execute(function (response) {
            console.log("Response:", response);
        });

    });

}

此代码采用自动生成的 YouTube 播放列表的 playlistId 并从中检索前 50 个项目。

提供的响应的 contentDetails 包含每个视频的 ID。

似乎如果我想检索自动生成的播放列表的所有视频信息,我需要向 youtube 发出 2N 个请求?N 请求从播放列表中检索所有视频 ID,每组不超过 50 个。一旦我拥有了所有视频 ID……然后我需要向 YouTube 询问所有视频的视频信息。我可以在一个请求中获取 50 个视频的数据......所以这是另一个 N 请求 YouTube 检索所有视频?

这似乎是一个糟糕的设计决定。以前,使用 v2 API,如果我正在检索播放列表的所有信息,我可以在初始请求中发送视频的所有必要信息。

这是否不再可能使用 V3 API?我是否应该承担 O(2N) 网络成本...?真的吗?

4

1 回答 1

1

您还需要哪些额外的视频信息?如果您需要发布日期、标题、描述、缩略图、在播放列表中的位置等,那是在 playlistItem 的片段中,而不是在 contentDetails 中。实际上,该片段还包含一个 resourceId,它又包含 videoId,因此您无论如何都可以忽略 contentDetails 并执行以下操作:

var request = gapi.client.youtube.playlistItems.list({
    part: 'snippet',
    maxResults: 50,
    playlistId: 'ALYL4kY05133rTMhTulSaXKj_Y6el9q0JH'
});

(可能使用 fields 参数仅选择您所追求的片段的那些部分)。

如果除了片段中的字段之外,您还需要视频信息,那么您必须拨打另一组电话(每批 50 个)是正确的。这实际上是一个非常好的设计决策。几乎所有播放列表项请求的用例都只需要片段中的信息,因此它们可以显着减少将一大堆数据发送到一大堆忽略它的应用程序。它确实要求,在那些需要额外数据的用例中,必须进行额外的调用,但整个系统的效率会变得更好(一个非常实用的工程选择)。

于 2013-08-23T17:24:28.350 回答