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



我将C#.NET与YouTubeAPI Nuget Package一起使用,但这并不重要,因为我可以应用各种语言的概念。

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

问题是,这需要很长时间,因为我首先必须获得所有播放列表(每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.每个播放列表的每个视频,因为我需要知道视频是否已经在播放列表中

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

最新更新