高效获取频道每个播放列表的每个视频

时间:2021-03-16 13:55:17

标签: youtube-api youtube-data-api

我将 C# .NET 与 YouTubeAPI-Nuget 包一起使用,但这不应该那么重要,因为我可以应用每种语言的概念。

我需要经常获取一个频道的所有播放列表(特别是登录频道,使用“我的”参数)以及每个播放列表的每个视频,我已经尝试尽可能少地这样做,但它仍然必须经常发生。

问题是这需要很长时间,因为我首先必须获取所有播放列表(每 50 个播放列表调用 1 个 API),然后每个播放列表获取每个视频(每个播放列表每 50 个视频调用 1 个 API)。

所以这可以很快地繁殖。对于 39 个播放列表,每个播放列表都小于 50 个视频,每次都需要几秒钟。

所以我的问题是:有没有更好/更有效的方法?

我的优化:

  • 尽量少这样做
  • 不要在第二步中包含“喜欢的视频”、“上传的”和类似的不需要的播放列表(我会排除它们,但由于某种原因它们并未首先包含在内)

我目前如何做的代码示例:

private async Task InitPlaylists()
{
    var playlists = new Dictionary<string, string>();
    var page = "";
    while (true)
    {
        var request = _youTubeService.Playlists.List("snippet");
        request.Mine = true;
        request.PageToken = page;
        request.MaxResults = 50;
        var result = await request.ExecuteAsync();
        foreach (var playlist in result.Items) playlists.Add(playlist.Id, playlist.Snippet.Title);
        if (result.NextPageToken == null) break;
        page = result.NextPageToken;
    }
    foreach (var (id, title) in playlists)
    {
        var videos = new List<PlaylistItem>();
        page = "";
        while (true)
        {
            var listRequest = _youTubeService.PlaylistItems.List("id,snippet");
            listRequest.PageToken = page;
            listRequest.MaxResults = 50;
            listRequest.PlaylistId = id;
            var listResult = await listRequest.ExecuteAsync();
            videos.AddRange(listResult.Items);
            if (listResult.NextPageToken == null) break;
            page = listResult.NextPageToken;
        }

        Playlists.Add(new Playlist(id, title, videos.ToDistinctDictionary()));
    }
}

编辑:如果我说我为什么需要这个,也许会有帮助,也许有人知道如何以这种方式切断一些电话:

我希望能够在播放列表中添加和删除视频,例如在 youtube 工作室编辑页面上。

所以我需要 A. 频道的每个播放列表和 B. 每个播放列表的每个视频,因为我需要知道视频是否已经在播放列表中

0 个答案:

没有答案