【问题标题】:Efficiently get every video of every playlist of a channel有效获取频道每个播放列表的每个视频
【发布时间】:2021-03-16 13:55:17
【问题描述】:

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

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

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

所以这可以很快增加。对于包含

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

我的优化:

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

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

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. 每个播放列表的每个视频,因为我需要知道视频是否已经在播放列表中

【问题讨论】:

  • 考虑保存playlists_idsvideos_ids 的响应,以避免每次查询该特定用户时都调用它们。另请查看如何联系 YouTube 以增加配额 - 据我所知 - 尽管代码有所改进,但对于自定义查询/功能来说,配额是一个头痛。检查您是否可以使用其他工具来获得这些结果。

标签: youtube-api youtube-data-api


【解决方案1】:

如果您只通过脚本操作您的 YouTube 频道,那么您可以跟踪当前播放列表的视频状态。如果不是这种情况,只有多线程可以通过为每个播放列表使用一个线程来加快检查速度。 Here is 一种无配额且可能更快使用youtube-dl -j --flat-playlist 获取播放列表的每个视频 ID 的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2018-10-16
    • 2020-04-13
    相关资源
    最近更新 更多