예제 #1
0
        /// <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();
                    }
                }
            }
        }
예제 #2
0
 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;
 }
예제 #3
0
        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);
        }
예제 #4
0
        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();
        }
예제 #5
0
        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();
            }
        }