/// <summary> /// Add an array of youtube song to a playlist. /// </summary> /// <param name="items">The array of songs you want to add to the playlist. Will only add youtube file, if you input local file in this array, they will be ignored</param> /// <param name="PlaylistYtID">The id of the youtube playlist</param> public async static void AddToPlaylist(Song[] items, string PlaylistYtID) { Google.Apis.YouTube.v3.Data.PlaylistItem playlistItem = new Google.Apis.YouTube.v3.Data.PlaylistItem(); PlaylistItemSnippet snippet = new PlaylistItemSnippet { PlaylistId = PlaylistYtID }; foreach (Song item in items) { if (item != null && item.YoutubeID != null) { try { ResourceId resourceId = new ResourceId { Kind = "youtube#video", VideoId = item.YoutubeID }; snippet.ResourceId = resourceId; playlistItem.Snippet = snippet; var insertRequest = YoutubeService.PlaylistItems.Insert(playlistItem, "snippet"); await insertRequest.ExecuteAsync(); } catch (System.Net.Http.HttpRequestException) { MainActivity.instance.Timout(); } } } }
public MPlaylistItemSnippet(PlaylistItemSnippet playlistItemSnippet) { if (playlistItemSnippet != null) { ChannelId = playlistItemSnippet.ChannelId; ChannelTitle = playlistItemSnippet.ChannelTitle; Description = playlistItemSnippet.Description; PlaylistId = playlistItemSnippet.PlaylistId; Position = playlistItemSnippet.Position; PublishedAt = playlistItemSnippet.PublishedAt; PublishedAtRaw = playlistItemSnippet.PublishedAtRaw; ResourceId = new MResourceId(playlistItemSnippet.ResourceId); Thumbnails = new MThumbnailDetails(playlistItemSnippet.Thumbnails); Title = playlistItemSnippet.Title; return; } ResourceId = MResourceId.Empty; Thumbnails = MThumbnailDetails.Empty; ChannelId = playlistItemSnippet.ChannelId; ChannelTitle = playlistItemSnippet.ChannelTitle; Description = playlistItemSnippet.Description; PlaylistId = playlistItemSnippet.PlaylistId; Position = playlistItemSnippet.Position; PublishedAt = playlistItemSnippet.PublishedAt; PublishedAtRaw = playlistItemSnippet.PublishedAtRaw; ResourceId = new MResourceId(playlistItemSnippet.ResourceId); Thumbnails = new MThumbnailDetails(playlistItemSnippet.Thumbnails); Title = playlistItemSnippet.Title; }
private async Task <Video> UploadVideoToVk(VkApi api, Channel channel, PlaylistItemSnippet item) { await api.AuthorizeAsync(new ApiAuthParams() { AccessToken = channel.VkToken, ApplicationId = _settings.ApplicationId, UserId = long.Parse(channel.VkUserId) }); if (!api.IsAuthorized) { throw new Exception( $"Vk api client not authorized. YtName = {channel.YtName}, Video Id = {item.ResourceId.VideoId}"); } var sVideo = api.Video.Save(new VideoSaveParams() { Name = item.Title, Link = $"https://www.youtube.com/watch?v={item.ResourceId.VideoId}", Wallpost = false, GroupId = int.Parse(channel.VkGroupId) }); using (HttpClient client = new HttpClient()) using (var message = new HttpRequestMessage(HttpMethod.Get, sVideo.UploadUrl)) { var response = await client.SendAsync(message); if (!response.IsSuccessStatusCode) { throw new Exception( $"Error loading video {response.StatusCode}: {response.ReasonPhrase}: Yt id={item.ResourceId.VideoId} Vk id={sVideo.Id}"); } Logger.Info($"Video uploaded to vk. Yt id={item.ResourceId.VideoId} Vk id={sVideo.Id} Status: {response.StatusCode} Reason: {response.ReasonPhrase}"); } Thread.Sleep(300); var uploadedVideo = api.Video.Get(new VideoGetParams { Videos = new[] { new Video() { OwnerId = -long.Parse(channel.VkGroupId), Id = sVideo.Id } }, OwnerId = -long.Parse(channel.VkGroupId), Extended = true }).FirstOrDefault(); return(uploadedVideo); }
private void CheckForNewVideoFromSubscriptionsAsync(CancellationToken token, bool showNotifications = true) { if (!Common.HasInternetConnection()) { Log("!!NO INTERNET CONNECTION!!"); return; } if (Settings.Instance.SyncSubscriptionsWithYouTube) { YouTubeFunctions.UpdateYTSubscriptions().Wait(); } bool tempNotificationSetting = Settings.Instance.ShowNotifications; if (!showNotifications) { Settings.Instance.ShowNotifications = false; } foreach (Subscription sub in Common.TrackedSubscriptions) { if (token.IsCancellationRequested) { return; } List <PlaylistItem> newUploads = YouTubeFunctions.GetMostRecentUploadsAsync(sub, sub.LastVideoPublishDate).Result; foreach (PlaylistItem item in newUploads) { PlaylistItemSnippet newUploadDetails = item.Snippet; Log("New uploaded detected: " + sub.Title + " (" + newUploadDetails.Title + ")"); DoActionsForNewUpload(newUploadDetails, sub, token); } if (newUploads.Count > 0) { sub.LastVideoPublishDate = (DateTime)newUploads.First().Snippet.PublishedAt; } } Settings.Instance.ShowNotifications = tempNotificationSetting; Common.SerializeSubscriptions(); }
private void DoActionsForNewUpload(PlaylistItemSnippet newUpload, Subscription sub, CancellationToken downloadCancellation) { if (Settings.Instance.ShowNotifications) { ShowNotification(newUpload.Title, "New video from " + sub.Title, newUpload.Thumbnails?.Standard?.Url, Common.YOUTUBEVIDEOBASEURL + newUpload.ResourceId.VideoId); } if (Settings.Instance.DownloadVideos) { DownloadYouTubeVideo(newUpload.ResourceId.VideoId, Settings.Instance.DownloadDirectory, downloadCancellation); } if (Settings.Instance.AddToPocket) { AddYouTubeVideoToPocket(newUpload.ResourceId.VideoId); } }
private void CheckForNewVideoFromSubscriptions(CancellationToken token) { if (!CheckForInternetConnection()) { return; } foreach (Subscription sub in userSubscriptions) { List <PlaylistItem> newUploads = new List <PlaylistItem>(); try { newUploads = GetMostRecentUploads(sub, sub.LastVideoPublishDate); } catch (WebException ex) { Log("There was a problem contacting YouTube..."); continue; } catch (Google.GoogleApiException ex) { if (ex.HttpStatusCode == HttpStatusCode.InternalServerError || (ex.InnerException != null && ex.InnerException is WebException)) { Log("There was a problem contacting YouTube..."); continue; } else { throw; } } if (newUploads.Count >= 2) { PlaylistItem latestUpload = newUploads.OrderBy(p => p.Snippet.PublishedAt).ToList()[0]; PlaylistItem secondToLatestUpload = newUploads.OrderBy(p => p.Snippet.PublishedAt).ToList()[1]; newUploads.RemoveAt(0); //Sometimes we sense a new video twice in "newUploads". Not sure why, but this will prevent //notifying for that video twice if (latestUpload != null && secondToLatestUpload != null && latestUpload.Snippet.ResourceId.VideoId == secondToLatestUpload.Snippet.ResourceId.VideoId) { newUploads.RemoveAt(0); } } foreach (PlaylistItem item in newUploads.OrderBy(p => p.Snippet.PublishedAt)) //Loop through uploads backwards so that newest upload is last { PlaylistItemSnippet newUploadDetails = item.Snippet; ShowNotification(newUploadDetails.Title, "New video from " + sub.Title, newUploadDetails.Thumbnails?.Standard?.Url, "https://www.youtube.com/watch?v=" + newUploadDetails.ResourceId.VideoId); Log("New uploaded detected: " + sub.Title + " (" + newUploadDetails.Title + ")"); DownloadYouTubeVideo(newUploadDetails.ResourceId.VideoId, Settings.Instance.DownloadDirectory, token); AddYouTubeVideoToPocket(newUploadDetails.ResourceId.VideoId); } if (newUploads.Count > 0) { sub.LastVideoPublishDate = (DateTime)newUploads.First().Snippet.PublishedAt; } SerializeSubscriptions(); } }