【发布时间】: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_ids和videos_ids的响应,以避免每次查询该特定用户时都调用它们。另请查看如何联系 YouTube 以增加配额 - 据我所知 - 尽管代码有所改进,但对于自定义查询/功能来说,配额是一个头痛。检查您是否可以使用其他工具来获得这些结果。
标签: youtube-api youtube-data-api