如何使用C#结合YouTube Data API获取个人YouTube频道视频状态
问题修复方案
你代码无法获取视频状态是两个配置问题导致的,按以下步骤修改即可:
核心问题原因
- 调用
PlaylistItems.List接口时,part参数仅传入了snippet,未添加status字段,接口不会返回状态相关数据 - 若需要获取视频本身的原生状态(而非视频在播放列表中的状态),需要额外调用
Videos.List接口查询对应视频ID的详情
修改后代码
private async Task Editvideo() { UserCredential credential; using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read)) { credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, new[] { YouTubeService.Scope.YoutubeReadonly }, "user", CancellationToken.None, new FileDataStore(this.GetType().ToString()) ); } var youtubeService = new YouTubeService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = this.GetType().ToString() }); var channelsListRequest = youtubeService.Channels.List("contentDetails"); channelsListRequest.Mine = true; var channelsListResponse = await channelsListRequest.ExecuteAsync(); foreach (var channel in channelsListResponse.Items) { var uploadsListId = channel.ContentDetails.RelatedPlaylists.Uploads; Console.WriteLine("Videos in list {0}", uploadsListId); var nextPageToken = ""; while (nextPageToken != null) { // 修改1:part参数添加status,获取播放列表项的状态 var playlistItemsListRequest = youtubeService.PlaylistItems.List("snippet,status"); playlistItemsListRequest.PlaylistId = uploadsListId; playlistItemsListRequest.MaxResults = 50; playlistItemsListRequest.PageToken = nextPageToken; var playlistItemsListResponse = await playlistItemsListRequest.ExecuteAsync(); // 如果需要获取视频本身的状态,批量收集视频ID调用Videos接口 var videoIdList = playlistItemsListResponse.Items.Select(x => x.Snippet.ResourceId.VideoId).ToList(); var videosListRequest = youtubeService.Videos.List("status"); videosListRequest.Id = string.Join(",", videoIdList); var videosListResponse = await videosListRequest.ExecuteAsync(); var videoStatusDict = videosListResponse.Items.ToDictionary(x => x.Id, x => x.Status); foreach (var playlistItem in playlistItemsListResponse.Items) { // 播放列表项的状态 string playlistItemStatus = playlistItem.Status.PrivacyStatus; // 视频本身的状态 videoStatusDict.TryGetValue(playlistItem.Snippet.ResourceId.VideoId, out var videoStatus); string videoPrivacyStatus = videoStatus?.PrivacyStatus; string videoUploadStatus = videoStatus?.UploadStatus; Console.WriteLine("标题:{0} 视频ID:{1} 播放列表状态:{2} 视频原生状态:{3} 上传状态:{4}", playlistItem.Snippet.Title, playlistItem.Snippet.ResourceId.VideoId, playlistItemStatus, videoPrivacyStatus, videoUploadStatus); } nextPageToken = playlistItemsListResponse.NextPageToken; } } }
修改说明
- 无需调整授权范围,原有
YoutubeReadonly权限已经满足查询需求 - 仅需要视频在上传播放列表中的状态,直接使用
playlistItem.Status即可,不需要额外调用Videos.List接口 - 要获取视频的审核状态、上传失败原因、版权状态等信息,必须通过
Videos.List接口查询
内容的提问来源于stack exchange,提问作者Duy Nguyen
相关产品推荐
相关产品推荐

