private async Task <IEnumerable <PlaylistItem> > ExecuteYouTubeDataApiV3(IConfiguration youTubeConf, BloggingContext context, IWebHostEnvironment environment, CancellationToken token) { UserCredential credential; using (var stream = new FileStream(youTubeConf["ClientSecretsFileName"], FileMode.Open, FileAccess.Read)) { var store = new GoogleKeyContextStore(context, environment, token); var googl_secrets = await GoogleClientSecrets.FromStreamAsync(stream, token); credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( googl_secrets.Secrets, // This OAuth 2.0 access scope allows for read-only access to the authenticated // user's account, but not other types of account access. new[] { YouTubeService.Scope.YoutubeReadonly }, //Below scope is with higher access - use it here only for obtaining new/refresh token (browser access auth required) //new[] { YouTubeService.Scope.Youtube, YouTubeService.Scope.YoutubeUpload }, "user", token, store ); } using (var youtubeService = new YouTubeService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = youTubeConf["ApplicationName"] })) { var lst = new List <PlaylistItem>(365); var nextPageToken = ""; while (nextPageToken != null) { var playlistItemsListRequest = youtubeService.PlaylistItems.List("snippet"); playlistItemsListRequest.PlaylistId = youTubeConf["playlistId"]; // playlistItemsListRequest.Fields = "items(snippet(title,position,resourceId(videoId)))"; playlistItemsListRequest.MaxResults = 50; playlistItemsListRequest.PageToken = nextPageToken; // Retrieve the list of videos uploaded to the authenticated user's channel. var playlistItemsListResponse = await playlistItemsListRequest.ExecuteAsync(token); foreach (PlaylistItem item in playlistItemsListResponse.Items) { lst.Add(item); } nextPageToken = playlistItemsListResponse.NextPageToken; } return(lst); } //end using youtubeService }
private async Task <bool> ExecuteYouTubeDataApiV3(IConfiguration youTubeConf, string sharedSecretFolder, ILogger <YouTubeUploadOperation> logger, BloggingContext context, IWebHostEnvironment environment, CancellationToken token) { UserCredential credential; using (var stream = new FileStream(youTubeConf["ClientSecretsFileName"], FileMode.Open, FileAccess.Read)) { var store = new GoogleKeyContextStore(context, environment, token); var googl_secrets = await GoogleClientSecrets.FromStreamAsync(stream, token); credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( googl_secrets.Secrets, // This OAuth 2.0 access scope allows for read-write access to the authenticated // user's account, but not other types of account access. new[] { YouTubeService.Scope.Youtube, YouTubeService.Scope.YoutubeUpload }, "user", token, store ); } using (var youtubeService = new YouTubeService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = youTubeConf["ApplicationName"] })) { var lst = new List <PlaylistItem>(365); var nextPageToken = ""; while (nextPageToken != null) { var playlistItemsListRequest = youtubeService.PlaylistItems.List("snippet"); playlistItemsListRequest.PlaylistId = youTubeConf["playlistId"]; // playlistItemsListRequest.Fields = "items(snippet(description,publishedAt,title))"; playlistItemsListRequest.MaxResults = 50; playlistItemsListRequest.PageToken = nextPageToken; // Retrieve the list of videos uploaded to the authenticated user's channel. var playlistItemsListResponse = await playlistItemsListRequest.ExecuteAsync(token); foreach (var item in playlistItemsListResponse.Items) { lst.Add(item); } nextPageToken = playlistItemsListResponse.NextPageToken; } string new_video_title = $"timelapse {DateTime.Now.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)}"; bool already_uploaded = false; var year_ago_date = DateTime.Now.AddYears(-1); int delete_count = 10; foreach (var item in lst) { var date = item.Snippet.PublishedAt.GetValueOrDefault(); bool is_to_be_deleted = date < year_ago_date; if (!is_to_be_deleted) { logger.LogInformation("'{title}' [{description}] {publishedAt}", item.Snippet.Title, item.Snippet.Description, date.ToString("O")); } else if (delete_count > 0) { logger.LogWarning("DELETING '{title}' [{description}] {publishedAt}", item.Snippet.Title, item.Snippet.Description, date.ToString("O")); var playlistItemsDeleteRequest = youtubeService.PlaylistItems.Delete(item.Id); var delete_playlist_response = await playlistItemsDeleteRequest.ExecuteAsync(token); var videoDeleteRequest = youtubeService.Videos.Delete(item.Snippet.ResourceId.VideoId); var delete_video_response = await videoDeleteRequest.ExecuteAsync(token); delete_count--; } if (item.Snippet.Title == new_video_title) { already_uploaded = true; logger.LogWarning("'{title}' already uploaded aborting", item.Snippet.Title); break; } } #if DEBUG already_uploaded = true; #endif if (already_uploaded || string.IsNullOrEmpty(_videoFileNameToUpload)) { return(false); } //upload var video = new Video { Snippet = new VideoSnippet { Title = new_video_title, Description = $"Daily timelapse video taken on {DateTime.Now}", Tags = new string[] { "timelapse", "video", "webcam" }, //"1" -> "Film & Animation", see https://developers.google.com/youtube/v3/docs/videoCategories/list CategoryId = "1", }, Status = new VideoStatus { PrivacyStatus = "unlisted" // or "private" or "public" } }; string successVideoID = null; using (var fileStream = new FileStream(_videoFileNameToUpload, FileMode.Open, FileAccess.Read)) { var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, "video/*"); videosInsertRequest.ProgressChanged += (IUploadProgress progress) => { switch (progress.Status) { case UploadStatus.Uploading: logger.LogInformation("{bytesSent} bytes sent.", progress.BytesSent); break; case UploadStatus.Failed: logger.LogWarning("An error prevented the upload from completing.\n{exception}", progress.Exception); break; } }; videosInsertRequest.ResponseReceived += (Video uploadedVideo) => { successVideoID = uploadedVideo.Id; logger.LogInformation("Video id '{id}' was successfully uploaded.", uploadedVideo.Id); }; var uploaded = await videosInsertRequest.UploadAsync(token); if (uploaded.Status == UploadStatus.Completed && !string.IsNullOrEmpty(successVideoID)) { var newPlaylistItem = new PlaylistItem(); newPlaylistItem.Snippet = new PlaylistItemSnippet(); newPlaylistItem.Snippet.PlaylistId = youTubeConf["playlistId"]; newPlaylistItem.Snippet.ResourceId = new ResourceId(); newPlaylistItem.Snippet.ResourceId.Kind = "youtube#video"; newPlaylistItem.Snippet.ResourceId.VideoId = successVideoID; newPlaylistItem = await youtubeService.PlaylistItems.Insert(newPlaylistItem, "snippet") .ExecuteAsync(token); logger.LogInformation("Video id '{id}' was added to playlist id '{playlistID}'.", successVideoID, newPlaylistItem.Snippet.PlaylistId); return(true); } return(false); } //end using fileStream } //end using youtubeService }