private async Task <VideoDto> GetUpcomingLiveStream()
        {
            YouTubeService t = GetYoutubeService();

            SearchResource.ListRequest request = t.Search.List("id");
            request.ChannelId  = "UC_a1ZYZ8ZTXpjg9xUY9sj8w";
            request.EventType  = SearchResource.ListRequest.EventTypeEnum.Live;
            request.MaxResults = 1;
            request.Type       = "video";
            request.Fields     = "items(id(videoId))";
            SearchListResponse result = await request.ExecuteAsync();

            SearchResult livestream = result.Items.FirstOrDefault();

            return(new VideoDto()
            {
                VideoId = livestream?.Id.VideoId,
                StartTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Parse(livestream.Snippet.PublishedAt))
            });
        }
Example #2
0
        public override string GetVideoUrl(string i_SongName)
        {
            YouTubeService youtubeService = new YouTubeService(new BaseClientService.Initializer()
            {
                ApplicationName = this.GetType().ToString(),
                ApiKey          = k_YoutubeApiKey,
            });

            SearchResource.ListRequest listRequest = youtubeService.Search.List("snippet");

            listRequest.Q          = i_SongName;
            listRequest.MaxResults = 1;
            listRequest.Type       = "video";
            SearchListResponse resp     = listRequest.Execute();
            string             videoUrl = r_VideoWatchUrl + resp.Items[0].Id.VideoId;

            m_SongLink = videoUrl;

            return(videoUrl);
        }
        private void GetResults()
        {
            YouTubeService ys = new YouTubeService(new BaseClientService.Initializer()
            {
                ApiKey          = YoutubeHook.ApiKey,
                ApplicationName = "Butler-YoutubeViewer"
            });

            SearchResource.ListRequest req = new SearchResource.ListRequest(ys, "snippet")
            {
                Q          = searchQ,
                MaxResults = 50
            };

            SearchListResponse resp = req.Execute();

            _results = resp.Items.Where(itm => itm.Id.Kind == "youtube#video").ToList();

            Dispatcher.Invoke(UpdateItems);
        }
        internal async Task <string> GetLiveStream(YouTubeService ytService, string eventType)
        {
            try
            {
                SearchResource.ListRequest request = ytService.Search.List("id");
                request.ChannelId  = "UC_a1ZYZ8ZTXpjg9xUY9sj8w";
                request.EventType  = eventType.ToEnum <SearchResource.ListRequest.EventTypeEnum>();
                request.MaxResults = 1;
                request.Type       = "video";
                request.Fields     = "items(id(videoId))";
                SearchListResponse result = await request.ExecuteAsync();

                SearchResult livestream = result.Items.FirstOrDefault();
                return(livestream?.Id.VideoId);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, nameof(GetLiveStream));
                return(null);
            }
        }
Example #5
0
        public async Task <IActionResult> Get([FromQuery] string query, [FromQuery] string pageToken)
        {
            if (string.IsNullOrEmpty(query))
            {
                return(BadRequest("Please type a query to search"));
            }

            YouTubeService youtubeService = new YouTubeService(new BaseClientService.Initializer()
            {
                ApiKey = _youtubeApiSettingsOptions.ApiKey
            });

            SearchResource.ListRequest listRequest = youtubeService.Search.List("snippet");
            listRequest.Q          = query;
            listRequest.PageToken  = pageToken;
            listRequest.MaxResults = 24;
            listRequest.Order      = SearchResource.ListRequest.OrderEnum.Relevance;
            listRequest.Type       = "video";


            VideoSearchDto result = new VideoSearchDto();

            SearchListResponse searchResponse = await listRequest.ExecuteAsync();

            result.NextPage = searchResponse.NextPageToken;

            foreach (SearchResult searchResult in searchResponse.Items)
            {
                YoutubeVideo video = new YoutubeVideo
                {
                    Id        = searchResult.Id.VideoId,
                    Title     = searchResult.Snippet.Title,
                    Thumbnail = searchResult.Snippet.Thumbnails.Medium.Url
                };

                result.Videos.Add(video);
            }

            return(Ok(result));
        }
Example #6
0
        public List <string> SearchForVideosByChannel(string searchValue, int maxResultsCount)
        {
            SearchResource.ListRequest searchListRequest = client.Search.List("snippet");
            // searchListRequest.Q = searchValue;
            searchListRequest.MaxResults = maxResultsCount;
            searchListRequest.ChannelId  = searchValue;
            searchListRequest.Type       = "video";
            searchListRequest.Fields     = "description";


            SearchListResponse searchListResponse = searchListRequest.Execute();



            List <string> videos    = new List <string>();
            List <string> channels  = new List <string>();
            List <string> playlists = new List <string>();

            foreach (SearchResult searchResult in searchListResponse.Items)
            {
                switch (searchResult.Id.Kind)
                {
                case "youtube#video":
                    videos.Add(String.Format("{0} ({1})", searchResult.Snippet.Title, searchResult.Id.VideoId));

                    break;

                case "youtube#channel":
                    channels.Add(String.Format("{0} ({1})", searchResult.Snippet.Title, searchResult.Id.ChannelId));
                    break;

                case "youtube#playlist":
                    playlists.Add(String.Format("{0} ({1})", searchResult.Snippet.Title, searchResult.Id.PlaylistId));
                    break;
                }
            }

            return(videos);
        }
Example #7
0
        //For returning the youtube link based on movie title
        public string YoutubeRun(string title)
        {
            string         link    = "";
            YouTubeService youtube = new YouTubeService(new BaseClientService.Initializer()
            {
                //ApplicationName = " ";
                ApiKey = YOUTUBE_API_KEY,
            }
                                                        );

            SearchResource.ListRequest listRequest = youtube.Search.List("id");
            listRequest.Q          = title;
            listRequest.MaxResults = 1;
            listRequest.Type       = "video";
            SearchListResponse resp = listRequest.Execute();

            foreach (SearchResult result in resp.Items)
            {
                link = "https://www.youtube.com/v/" + result.Id.VideoId + "?version=3";
            }
            return(link);
        }
Example #8
0
        public static List <Videos> Buscars(string videoToSearch)
        {
            SearchVideos  videos = new SearchVideos();
            List <Videos> vvv    = new List <Videos>();

            try
            {
                YouTubeService youtube = new YouTubeService(new BaseClientService.Initializer {
                    ApiKey          = "AIzaSyBJjUKCgCuPP2BbXCl8fsvAAiuK1xdmId4",
                    ApplicationName = "Rockola-264715"
                }
                                                            );
                SearchResource.ListRequest searchListRequest = youtube.Search.List("snippet");
                searchListRequest.Q          = videoToSearch;
                searchListRequest.MaxResults = 40;
                SearchListResponse searchListResponse = searchListRequest.Execute();

                foreach (var searchResult in searchListResponse.Items)
                {
                    switch (searchResult.Id.Kind)
                    {
                    case "youtube#video":
                        vvv.Add(new Videos {
                            id        = searchResult.Id.VideoId,
                            Nombre    = searchResult.Snippet.Title,
                            Url       = "http://youtu.be/" + searchResult.Id.VideoId,
                            Thumbnail = "http://img.youtube.com/vi/" + searchResult.Id.VideoId + "/hqdefault.jpg"
                        });
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Exception x = ex;
            }
            return(vvv);
        }
        public async Task <SearchResultViewModel> Search(string searchText, string pageToken)
        {
            SearchResource.ListRequest listRequest = youTubeDataApiService.Search.List("snippet");

            listRequest.Q                 = searchText;
            listRequest.Order             = SearchResource.ListRequest.OrderEnum.Relevance;
            listRequest.SafeSearch        = SearchResource.ListRequest.SafeSearchEnum.None;
            listRequest.RegionCode        = "BR";
            listRequest.RelevanceLanguage = "PT-BR";
            listRequest.Type              = "video";
            listRequest.MaxResults        = 10;
            listRequest.PageToken         = pageToken;

            SearchListResponse searchResponse = listRequest.Execute();

            List <Models.Video> videos = new List <Models.Video>();

            foreach (SearchResult searchResult in searchResponse.Items)
            {
                var video = new Models.Video()
                {
                    Id          = searchResult.Id.VideoId,
                    Title       = searchResult.Snippet.Title,
                    Description = searchResult.Snippet.Description,
                    Url         = searchResult.Snippet.Thumbnails.Medium.Url
                };

                videos.Add(video);
                await SaveVideo(video);
            }
            return(new SearchResultViewModel()
            {
                nextPageToken = searchResponse.NextPageToken,
                prevPageToken = searchResponse.PrevPageToken,
                Videos = await LoadPlaylistsInVideo(videos),
                Playlists = await repository.PlaylistList()
            });
        }
Example #10
0
        private IEnumerable <YoutubeDTO> search(string filter)
        {
            SearchResource.ListRequest listRequest = _youtube.Search.List("snippet");
            listRequest.Q     = filter;
            listRequest.Order = SearchResource.ListRequest.OrderEnum.Relevance;

            SearchListResponse searchResponse = listRequest.Execute();

            foreach (SearchResult searchResult in searchResponse.Items)
            {
                if (searchResult.Id.Kind == "youtube#video")
                {
                    yield return(new YoutubeDTO
                    {
                        Filter = filter,
                        Title = searchResult.Snippet.Title,
                        Description = searchResult.Snippet.Description,
                        Url = searchResult.Snippet.Thumbnails.Default__.Url,
                        Id = searchResult.Id.VideoId,
                    });
                }
            }
        }
        public ActionResult Search(string keyWord)
        {
            YouTubeSearchVm model = new YouTubeSearchVm();

            model.Results = new List <SearchResultVm>();

            var youtubeService = new YouTubeService(new BaseClientService.Initializer()
            {
                ApiKey          = _ApiKey,
                ApplicationName = this.GetType().ToString()
            });

            SearchResource.ListRequest listRequest = youtubeService.Search.List("snippet");
            listRequest.Q          = keyWord;
            listRequest.MaxResults = 10;
            listRequest.Type       = "video";

            SearchListResponse resp = listRequest.Execute();

            foreach (var result in resp.Items)
            {
                SearchResultVm vid = new SearchResultVm();
                vid.Title       = result.Snippet.Title;
                vid.Description = result.Snippet.Description;
                vid.Thumbnail   = result.Snippet.Thumbnails.Default__.Url;
                vid.Channel     = result.Snippet.ChannelTitle;
                vid.Live        = result.Snippet.LiveBroadcastContent;
                vid.Url         = result.Id.VideoId;
                model.Results.Add(vid);
            }
            ;

            model.SearchTerm  = keyWord;
            model.ResultCount = resp.Items.Count;

            return(View("YoutubeSearch", model));
        }
        public ActionResult Video(string url)
        {
            VideoVm model = new VideoVm();

            model.RelatedVideos = new List <SearchResultVm>();
            model.Url           = url;

            //need to abstract code to helper class

            var youtubeService = new YouTubeService(new BaseClientService.Initializer()
            {
                ApiKey          = _ApiKey,
                ApplicationName = this.GetType().ToString()
            });

            SearchResource.ListRequest listRequest = youtubeService.Search.List("snippet");
            listRequest.RelatedToVideoId = url;
            listRequest.MaxResults       = 10;
            listRequest.Type             = "video";

            SearchListResponse resp = listRequest.Execute();

            foreach (var result in resp.Items)
            {
                SearchResultVm vid = new SearchResultVm();
                vid.Title       = result.Snippet.Title;
                vid.Description = result.Snippet.Description;
                vid.Thumbnail   = result.Snippet.Thumbnails.Default__.Url;
                vid.Channel     = result.Snippet.ChannelTitle;
                vid.Live        = result.Snippet.LiveBroadcastContent;
                vid.Url         = result.Id.VideoId;
                model.RelatedVideos.Add(vid);
            }
            ;

            return(View("WatchVideo", model));
        }
Example #13
0
        private async Task <string> SearchVideo(string name)
        {
            var youtubeService = new YouTubeService(new BaseClientService.Initializer
            {
                ApiKey          = _settings.YoutubeApiKey,
                ApplicationName = GetType()
                                  .ToString()
            });

            SearchResource.ListRequest searchListRequest = youtubeService.Search.List("snippet");
            searchListRequest.Q          = name;
            searchListRequest.MaxResults = 1;
            searchListRequest.Type       = "video";

            SearchListResponse searchListResponse = await searchListRequest.ExecuteAsync();

            SearchResult trailer = searchListResponse.Items.FirstOrDefault();

            if (trailer == null)
            {
                return(null);
            }
            return($"https://www.youtube.com/watch?v={trailer.Id.VideoId}");
        }
Example #14
0
        //λ‹€μŒ
        private void button2_Click(object sender, EventArgs e)
        {
            //dataGridView1.Rows.Clear();

            YouTubeService youtube = new YouTubeService(new BaseClientService.Initializer()
            {
                ApiKey          = "AIzaSyCcu-5qYc71UDjpY0JxOh0fGpfXdenZsw4",
                ApplicationName = "My YouTube Search"
            });

            SearchResource.ListRequest listRequest = youtube.Search.List("snippet");

            listRequest.Q          = txtSearch.Text;
            listRequest.MaxResults = 50;
            listRequest.PageToken  = NextPageToken;
            SearchListResponse searchResponse = listRequest.Execute();

            NextPageToken = searchResponse.NextPageToken;
            int count = 0;

            //dataGridView1.Rows.Add(49);
            foreach (SearchResult searchResult in searchResponse.Items)
            {
                switch (searchResult.Id.Kind)
                {
                case "youtube#video":
                    //videos.Add(String.Format("{0} ({1})", searchResult.Snippet.Title, searchResult.Id.VideoId));
                    //dataGridView1.Rows.Add();
                    //dataGridView1.Rows[count].Cells[0].Value = searchResult.Snippet.Title;
                    //dataGridView1.Rows[count].Cells[1].Value = searchResult.Id.VideoId;
                    dataGridView1.Rows.Add(searchResult.Snippet.Title, searchResult.Id.VideoId);
                    count++;
                    break;
                }
            }
        }
        private async Task <VideoDto> GetCurrentLiveStream()
        {
            YouTubeService t = new YouTubeService(new Google.Apis.Services.BaseClientService.Initializer()
            {
                ApiKey          = ApiKey,
                ApplicationName = "TimeStampBot"
            });

            SearchResource.ListRequest request = t.Search.List("id");
            request.ChannelId  = "UC_a1ZYZ8ZTXpjg9xUY9sj8w";
            request.EventType  = SearchResource.ListRequest.EventTypeEnum.Live;
            request.MaxResults = 1;
            request.Type       = "video";
            request.Fields     = "items(id(videoId))";
            SearchListResponse result = await request.ExecuteAsync();

            SearchResult livestream = result.Items.FirstOrDefault();

            return(new VideoDto()
            {
                VideoId = livestream?.Id.VideoId,
                StartTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Parse(livestream.Snippet.PublishedAt))
            });
        }
Example #16
0
        private async Task search(IClientServiceRequest request, String searchInfo, bool isNextPage, CancellationToken token)
        {
            SearchListResponse       searchResponse       = null;
            PlaylistItemListResponse playlistItemResponse = null;
            PlaylistListResponse     playlistResponse     = null;

            SearchResource.ListRequest        searchRequest        = request as SearchResource.ListRequest;
            PlaylistItemsResource.ListRequest playlistItemsRequest = request as PlaylistItemsResource.ListRequest;
            PlaylistsResource.ListRequest     playlistRequest      = request as PlaylistsResource.ListRequest;

            List <YoutubeItem> items = new List <YoutubeItem>();
            int relevance;

            if (isNextPage)
            {
                if (NextPageToken == null)
                {
                    // Final page
                    return;
                }

                if (searchRequest != null)
                {
                    searchRequest.PageToken = NextPageToken;
                }
                else if (playlistItemsRequest != null)
                {
                    playlistItemsRequest.PageToken = NextPageToken;
                }
                else if (playlistRequest != null)
                {
                    playlistRequest.PageToken = NextPageToken;
                }

                relevance = MediaState.UIMediaCollection.Count;
            }
            else
            {
                MediaState.clearUIState(searchInfo, DateTime.Now, MediaStateType.SearchResult);

                CurrentQuery = request;
                relevance    = 0;
            }

            // Call the search.list method to retrieve results matching the specified query term.
            if (searchRequest != null)
            {
                searchResponse = await searchRequest.ExecuteAsync(token);

                NextPageToken = searchResponse.NextPageToken;

                foreach (SearchResult searchResult in searchResponse.Items)
                {
                    YoutubeItem newItem = null;

                    switch (searchResult.Id.Kind)
                    {
                    case "youtube#video":
                        newItem = new YoutubeVideoItem(searchResult, relevance);
                        break;

                    case "youtube#channel":
                        newItem = new YoutubeChannelItem(searchResult, relevance);
                        break;

                    case "youtube#playlist":
                        newItem = new YoutubePlaylistItem(searchResult, relevance);
                        break;

                    default:
                        break;
                    }

                    if (newItem == null || MediaState.UIMediaCollection.Contains(newItem))
                    {
                        continue;
                    }

                    items.Add(newItem);

                    relevance++;
                }
            }

            if (playlistItemsRequest != null)
            {
                playlistItemResponse = await playlistItemsRequest.ExecuteAsync(token);

                NextPageToken = playlistItemResponse.NextPageToken;

                foreach (PlaylistItem playlistItem in playlistItemResponse.Items)
                {
                    YoutubeVideoItem newItem = new YoutubeVideoItem(playlistItem, relevance);

                    items.Add(newItem);

                    relevance++;
                }
            }

            if (playlistRequest != null)
            {
                playlistResponse = await playlistRequest.ExecuteAsync(token);

                NextPageToken = playlistResponse.NextPageToken;

                foreach (Playlist playlist in playlistResponse.Items)
                {
                    YoutubePlaylistItem newItem = new YoutubePlaylistItem(playlist, relevance);

                    if (!items.Contains(newItem))
                    {
                        items.Add(newItem);
                    }

                    relevance++;
                }
            }

            // Add each result to the appropriate list, and then display the lists of
            // matching videos, channels, and playlists.
            MediaState.addUIState(items);
        }
Example #17
0
        // We split this into another function because it's also used by the Radio
        public static async Task <Video> GetYoutubeVideoAsync(string search)
        {
            // Check if the search given in an URL
            string id    = null;
            Match  match = Regex.Match(search, "https:\\/\\/www.youtube.com\\/watch\\?v=([^&]+)");

            if (match.Success)
            {
                id = match.Groups[1].Value;
            }
            else
            {
                match = Regex.Match(search, "https:\\/\\/youtu.be\\/([^&]+)");
                if (match.Success)
                {
                    id = match.Groups[1].Value;
                }
                else // If the search is an ID
                {
                    match = Regex.Match(search, "^[0-9a-zA-Z_-]{11}$");
                    if (match.Success && match.Value.Length == 11)
                    {
                        id = search;
                    }
                }
            }

            Video result = null;

            if (id != null) // If managed to get the Id of the video thanks to the previous REGEX
            {
                VideosResource.ListRequest r = StaticObjects.YouTube.Videos.List("snippet,statistics,contentDetails");
                r.Id = id;
                var resp = (await r.ExecuteAsync()).Items;
                if (resp.Count != 0)
                {
                    result = resp[0];
                }
            }
            if (result == null)
            {
                SearchResource.ListRequest listRequest = StaticObjects.YouTube.Search.List("snippet");
                listRequest.Q          = search;
                listRequest.MaxResults = 5;
                var searchListResponse = (await listRequest.ExecuteAsync()).Items;
                if (searchListResponse.Count == 0) // The search returned no result
                {
                    throw new CommandFailed($"There is no video with these search terms.");
                }

                var correctVideos = searchListResponse.Where(x => x.Id.Kind == "youtube#video"); // We remove things that aren't videos from the search (like playlists)
                if (correctVideos.Count() == 0)
                {
                    throw new CommandFailed($"There is no video with these search terms.");
                }

                // For each video, we contact the statistics endpoint
                VideosResource.ListRequest videoRequest = StaticObjects.YouTube.Videos.List("snippet,statistics,contentDetails");
                videoRequest.Id = string.Join(",", correctVideos.Select(x => x.Id.VideoId));
                var   videoResponse = (await videoRequest.ExecuteAsync()).Items;
                ulong likes         = ulong.MinValue;
                // Sometimes the first result isn't the one we want, so compare the differents results and take the one with the best like/dislike ratio
                bool isExactSearch = false;
                var  lowerSearch   = search.ToLowerInvariant();
                foreach (Video res in videoResponse)
                {
                    ulong likeCount = ulong.MinValue;
                    if (res.Statistics.LikeCount != null)
                    {
                        likeCount = res.Statistics.LikeCount.Value;
                    }
                    if (res.Statistics.DislikeCount != null)
                    {
                        likeCount -= res.Statistics.DislikeCount.Value;
                    }
                    if (likeCount > likes || result == null)
                    {
                        // We get the best ratio if possible, but if the title match then it's more important
                        var lowerTitle = res.Snippet.Title.ToLowerInvariant();
                        if (isExactSearch && !lowerTitle.Contains(lowerSearch))
                        {
                            continue;
                        }
                        likes  = likeCount;
                        result = res;
                        if (!isExactSearch && lowerTitle.Contains(lowerSearch))
                        {
                            isExactSearch = true;
                        }
                    }
                }
            }
            return(result);
        }
Example #18
0
        /// <summary>
        /// Test the time elapsed in different API operations, in order to evaluate performance.
        /// </summary>
        /// <param name="maxItemsQuantity"></param>
        /// <returns></returns>
        public TimeElapsedResult TestOperationsTimeElapsed(int maxItemsQuantity, string searchTerm)
        {
            // Counters
            TimeElapsedResult result = new TimeElapsedResult();

            var youtube = new YouTubeService(new BaseClientService.Initializer());

            SearchResource.ListRequest listRequest = youtube.Search.List("snippet");
            listRequest.Fields     = "items(id, snippet(title, description, publishedAt, thumbnails, channelId, channelTitle))";
            listRequest.Key        = API_KEY;
            listRequest.Type       = ResourceTypes.Video;
            listRequest.MaxResults = MAX_RESULTS_PER_PAGE;

            if (!string.IsNullOrEmpty(LOCATION))
            {
                listRequest.Location = LOCATION;
            }
            if (!string.IsNullOrEmpty(LOCATION_RADIUS))
            {
                listRequest.LocationRadius = LOCATION_RADIUS;
            }
            listRequest.Q     = searchTerm;
            listRequest.Order = SearchResource.ListRequest.OrderEnum.Date;

            var stopwatch = Stopwatch.StartNew();
            SearchListResponse searchResponse = listRequest.Execute();

            result.ElapsedSearch.Add(stopwatch.ElapsedMilliseconds);
            List <SearchResult> results    = new List <SearchResult>();
            List <string>       videosIds  = new List <string>();
            List <string>       channelIds = new List <string>();
            int currentCounter             = 0;

            while (searchResponse.Items.Count > 0 && currentCounter < maxItemsQuantity)
            {
                videosIds.AddRange(searchResponse.Items.Select(v => v.Id.VideoId));
                channelIds.AddRange(searchResponse.Items.Select(v => v.Snippet.ChannelId));
                results.AddRange(searchResponse.Items);
                // Gets oldest element
                var oldest = searchResponse.Items.OrderBy(i => i.Snippet.PublishedAt).FirstOrDefault();
                // Avoids getting the oldest again
                listRequest.PublishedBefore = oldest.Snippet.PublishedAt.Value.AddSeconds(-1);
                currentCounter += searchResponse.Items.Count;
                if (currentCounter < maxItemsQuantity)
                {
                    // Performs the search
                    stopwatch      = Stopwatch.StartNew();
                    searchResponse = listRequest.Execute();
                    result.ElapsedSearch.Add(stopwatch.ElapsedMilliseconds);
                }
            }

            // Retrieves videos recording details (location)
            List <string> videosToRetrieve = videosIds.Take(50).ToList();

            videosIds = videosIds.Skip(50).ToList();
            while (videosToRetrieve.Count > 0)
            {
                VideosResource.ListRequest videosRequest = youtube.Videos.List("recordingDetails");
                videosRequest.Key        = API_KEY;
                videosRequest.MaxResults = MAX_RESULTS_PER_PAGE;
                videosRequest.Id         = string.Join(",", videosToRetrieve.ToArray());

                stopwatch = Stopwatch.StartNew();
                VideoListResponse videosResponse = videosRequest.Execute();
                result.ElapsedVideo.Add(stopwatch.ElapsedMilliseconds);

                videosToRetrieve = videosIds.Take(50).ToList();
                videosIds        = videosIds.Skip(50).ToList();
            }

            // Retrieves channels
            List <string> channelsToRetrieve = channelIds.Take(50).ToList();

            channelIds = channelIds.Skip(50).ToList();
            while (channelsToRetrieve.Count > 0)
            {
                ChannelsResource.ListRequest channelRequest = youtube.Channels.List("snippet");
                channelRequest.Key        = API_KEY;
                channelRequest.MaxResults = MAX_RESULTS_PER_PAGE;
                channelRequest.Id         = string.Join(",", channelsToRetrieve.ToArray());

                stopwatch = Stopwatch.StartNew();
                ChannelListResponse channelsResponse = channelRequest.Execute();
                result.ElapsedChannel.Add(stopwatch.ElapsedMilliseconds);

                channelsToRetrieve = channelIds.Take(50).ToList();
                channelIds         = channelIds.Skip(50).ToList();
            }

            result.Results = results;

            return(result);
        }
Example #19
0
        /// <summary>
        /// Retrieves a certain quantity of videos using oldest publish date criteria.
        /// </summary>
        /// <param name="maxItemsQuantity"></param>
        /// <returns></returns>
        public List <SearchResult> RetrieveVideosWithoutAPIPaging(int maxItemsQuantity, string searchTerm)
        {
            var youtube = new YouTubeService(new BaseClientService.Initializer());

            SearchResource.ListRequest listRequest = youtube.Search.List("snippet");
            listRequest.Fields     = "items(id, snippet(title, description, publishedAt, thumbnails, channelId, channelTitle))";
            listRequest.Key        = API_KEY;
            listRequest.Type       = ResourceTypes.Video;
            listRequest.MaxResults = MAX_RESULTS_PER_PAGE;

            if (!string.IsNullOrEmpty(LOCATION))
            {
                listRequest.Location = LOCATION;
            }
            if (!string.IsNullOrEmpty(LOCATION_RADIUS))
            {
                listRequest.LocationRadius = LOCATION_RADIUS;
            }
            listRequest.Q     = searchTerm;
            listRequest.Order = SearchResource.ListRequest.OrderEnum.Date;

            SearchListResponse  searchResponse      = listRequest.Execute();
            List <SearchResult> results             = new List <SearchResult>();
            List <string>       videosIds           = new List <string>();
            List <string>       channelsWithoutName = new List <string>();
            int amountWithoutChannelTitle           = 0;
            int amountWithoutChannelId = 0;
            int currentCounter         = 0;

            while (searchResponse.Items.Count > 0 && currentCounter < maxItemsQuantity)
            {
                foreach (var item in searchResponse.Items)
                {
                    videosIds.Add(item.Id.VideoId);
                    if (string.IsNullOrEmpty(item.Snippet.ChannelTitle))
                    {
                        channelsWithoutName.Add(item.Snippet.ChannelId);
                        amountWithoutChannelTitle++;
                    }
                    if (string.IsNullOrEmpty(item.Snippet.ChannelId))
                    {
                        amountWithoutChannelId++;
                    }
                }

                results.AddRange(searchResponse.Items);
                // Gets oldest element
                var oldest = searchResponse.Items.OrderBy(i => i.Snippet.PublishedAt).FirstOrDefault();
                // Avoids getting the oldest again
                listRequest.PublishedBefore = oldest.Snippet.PublishedAt.Value.AddSeconds(-1);
                currentCounter += searchResponse.Items.Count;
                if (currentCounter < maxItemsQuantity)
                {
                    // Performs the search
                    searchResponse = listRequest.Execute();
                }
            }

            // Retrieves videos recording details (location)
            VideosResource.ListRequest videosRequest = youtube.Videos.List("recordingDetails");
            videosRequest.Key        = API_KEY;
            videosRequest.MaxResults = MAX_RESULTS_PER_PAGE;
            videosRequest.Id         = string.Join(",", videosIds.Take(50).ToArray());
            VideoListResponse videosResponse = videosRequest.Execute();

            // Retrieves channels that don't have name
            List <string> channelsToRetrieve = channelsWithoutName.Take(50).ToList();

            channelsWithoutName = channelsWithoutName.Skip(50).ToList();
            while (channelsToRetrieve.Count > 0)
            {
                ChannelsResource.ListRequest channelRequest = youtube.Channels.List("snippet");
                channelRequest.Key        = API_KEY;
                channelRequest.MaxResults = MAX_RESULTS_PER_PAGE;
                channelRequest.Id         = string.Join(",", channelsToRetrieve.ToArray());
                ChannelListResponse channelsResponse = channelRequest.Execute();
                channelsToRetrieve  = channelsWithoutName.Take(50).ToList();
                channelsWithoutName = channelsWithoutName.Skip(50).ToList();
            }

            return(results);
        }
Example #20
0
        /// <summary>
        /// Checks result differences between two radius.
        /// </summary>
        /// <param name="smallRadius"></param>
        /// <param name="bigRadius"></param>
        /// <returns></returns>
        public RadiusComparerResult CheckVideosDifferentRadius(string smallRadius, string bigRadius, string searchTerm)
        {
            var youtube = new YouTubeService(new BaseClientService.Initializer());

            // Performs search operation for the small radius
            SearchResource.ListRequest listRequest = youtube.Search.List("snippet");
            listRequest.Fields     = "nextPageToken, prevPageToken, pageInfo, items(id,snippet(title, description, publishedAt, thumbnails, channelId, channelTitle))";
            listRequest.Key        = API_KEY;
            listRequest.Type       = ResourceTypes.Video;
            listRequest.MaxResults = MAX_RESULTS_PER_PAGE;
            if (!string.IsNullOrEmpty(LOCATION))
            {
                listRequest.Location = LOCATION;
            }
            if (!string.IsNullOrEmpty(LOCATION_RADIUS))
            {
                listRequest.LocationRadius = smallRadius;
            }
            listRequest.Q     = searchTerm;
            listRequest.Order = SearchResource.ListRequest.OrderEnum.Date;
            // Splits the query in days
            DateTime dateFrom = DateTime.ParseExact(PUBLISHED_FROM_DATE, "yyyy/MM/dd", CultureInfo.InvariantCulture);

            listRequest.PublishedAfter  = dateFrom;
            listRequest.PublishedBefore = dateFrom.AddMinutes(SMALL_RADIUS_FREQ_MINUTES);

            SearchListResponse  searchResponse     = null;
            List <SearchResult> resultsSmallRadius = new List <SearchResult>();
            string nextPageToken = string.Empty;

            while (listRequest.PublishedAfter < DateTime.Today)
            {
                searchResponse = listRequest.Execute();
                resultsSmallRadius.AddRange(searchResponse.Items);
                nextPageToken = searchResponse.NextPageToken;

                while (searchResponse.Items.Count == MAX_RESULTS_PER_PAGE && !string.IsNullOrEmpty(nextPageToken))
                {
                    listRequest.PageToken = nextPageToken;
                    searchResponse        = listRequest.Execute();
                    resultsSmallRadius.AddRange(searchResponse.Items);
                    nextPageToken = searchResponse.NextPageToken;
                }

                listRequest.PublishedAfter  = listRequest.PublishedAfter.Value.AddMinutes(SMALL_RADIUS_FREQ_MINUTES);
                listRequest.PublishedBefore = listRequest.PublishedBefore.Value.AddMinutes(SMALL_RADIUS_FREQ_MINUTES);
                listRequest.PageToken       = null;
            }

            // Performs search operation for the big radius
            listRequest.LocationRadius = bigRadius;
            listRequest.Order          = SearchResource.ListRequest.OrderEnum.Date;
            // Splits the query in days
            listRequest.PublishedAfter  = dateFrom;
            listRequest.PublishedBefore = dateFrom.AddMinutes(BIG_RADIUS_FREQ_MINUTES);

            List <SearchResult> resultsBigRadius = new List <SearchResult>();

            while (listRequest.PublishedAfter < DateTime.Today)
            {
                searchResponse = listRequest.Execute();
                resultsBigRadius.AddRange(searchResponse.Items);
                nextPageToken = searchResponse.NextPageToken;

                int totalItems = searchResponse.Items.Count;
                while (searchResponse.Items.Count == MAX_RESULTS_PER_PAGE && !string.IsNullOrEmpty(nextPageToken))
                {
                    listRequest.PageToken = nextPageToken;
                    searchResponse        = listRequest.Execute();
                    resultsBigRadius.AddRange(searchResponse.Items);
                    nextPageToken = searchResponse.NextPageToken;
                    totalItems   += searchResponse.Items.Count;
                }

                listRequest.PublishedAfter  = listRequest.PublishedAfter.Value.AddMinutes(BIG_RADIUS_FREQ_MINUTES);
                listRequest.PublishedBefore = listRequest.PublishedBefore.Value.AddMinutes(BIG_RADIUS_FREQ_MINUTES);
                listRequest.PageToken       = null;
            }

            // Checks for items that are in the small radius and aren't in big radius
            RadiusComparerResult result = new RadiusComparerResult();

            result.SmallRadiusItems = resultsSmallRadius;
            result.BigRadiusItems   = resultsBigRadius;

            return(result);
        }
        /// <summary>
        /// Refreshes the cached data in Cassandra for a given YouTube channel.
        /// </summary>
        internal async Task RefreshChannel(YouTubeVideoSource.VideosFromChannel channelSource)
        {
            // Since channel lists are sorted by date, try to be smart and see what the date is of the latest video we have for the channel
            PreparedStatement prepared =
                await _statementCache.NoContext.GetOrAddAsync("SELECT published_at FROM sample_data_youtube_videos WHERE sourceid = ? LIMIT 1");

            RowSet rowSet = await _session.ExecuteAsync(prepared.Bind(channelSource.UniqueId)).ConfigureAwait(false);

            Row            row = rowSet.SingleOrDefault();
            DateTimeOffset newestVideoWeHave = row == null ? Epoch : row.GetValue <DateTimeOffset>("published_at");

            // Statement for inserting the video into the sample table
            PreparedStatement preparedInsert = await _statementCache.NoContext.GetOrAddAsync(
                "INSERT INTO sample_data_youtube_videos (sourceid, published_at, youtube_video_id, name, description) VALUES (?, ?, ?, ?, ?)");

            bool   getMoreVideos = true;
            string nextPageToken = null;
            var    insertTasks   = new List <Task>();

            do
            {
                // Create search by channel request
                SearchResource.ListRequest searchRequest = _youTubeService.Search.List("snippet");
                searchRequest.MaxResults = MaxVideosPerRequest;
                searchRequest.ChannelId  = channelSource.ChannelId;
                searchRequest.Type       = "video";
                searchRequest.Order      = SearchResource.ListRequest.OrderEnum.Date;
                if (string.IsNullOrEmpty(nextPageToken) == false)
                {
                    searchRequest.PageToken = nextPageToken;
                }

                // Get the results and insert as rows in Cassandra
                SearchListResponse searchResults = await searchRequest.ExecuteAsync().ConfigureAwait(false);

                foreach (SearchResult searchResult in searchResults.Items)
                {
                    DateTimeOffset publishedAt = searchResult.Snippet.PublishedAt.HasValue
                                                     ? searchResult.Snippet.PublishedAt.Value.ToUniversalTime()
                                                     : Epoch;

                    // If we've reached the max or the video we're going to insert is older than our newest video, no need to continue
                    if (insertTasks.Count >= MaxVideosPerSource || publishedAt < newestVideoWeHave)
                    {
                        getMoreVideos = false;
                        break;
                    }

                    Task <RowSet> insertTask = _session.ExecuteAsync(preparedInsert.Bind(channelSource.UniqueId, publishedAt, searchResult.Id.VideoId,
                                                                                         searchResult.Snippet.Title, searchResult.Snippet.Description));
                    insertTasks.Add(insertTask);
                }

                // If we don't have a next page, we can bail
                nextPageToken = searchResults.NextPageToken;
                if (string.IsNullOrEmpty(nextPageToken))
                {
                    getMoreVideos = false;
                }
            } while (getMoreVideos);

            // Wait for any insert tasks to finish
            if (insertTasks.Count > 0)
            {
                await Task.WhenAll(insertTasks).ConfigureAwait(false);
            }
        }
Example #22
0
        public async Task Queue(CommandContext ctx, [Description("A search query or a direct link to the video."), RemainingText] string queryString)
        {
            if (string.IsNullOrWhiteSpace(queryString))
            {
                if (!GuildQueues.TryGetValue(ctx.Guild.Id, out List <JigglySong> resultSongs))
                {
                    await ctx.RespondAsync("There is nothing currently queued.");

                    return;
                }

                for (int i = 0; i < resultSongs.Count; i += 5)
                {
                    DiscordEmbedBuilder queueBuilder = new DiscordEmbedBuilder
                    {
                        Title = $"Current Queue {i + 1}-{i + 5}",
                        Color = DiscordColor.Aquamarine
                    };

                    string tracks = string.Empty;

                    for (int j = i; j < i + 5; j++)
                    {
                        if (j >= resultSongs.Count)
                        {
                            break;
                        }

                        JigglySong resultSong = resultSongs[j];

                        tracks += $"{j + 1}: [**{resultSong.Title}** by **{resultSong.Artist}**](https://www.youtube.com/watch?v={resultSong.Id})\n";
                    }

                    queueBuilder.Description = tracks;

                    await ctx.RespondAsync(string.Empty, false, queueBuilder.Build());
                }

                return;
            }

            if (ctx.Client.GetVoiceNext()?.GetConnection(ctx.Guild)?.Channel != null && ctx.Client.GetVoiceNext().GetConnection(ctx.Guild).Channel.Users.All(e => e.Id != ctx.User.Id))
            {
                throw new OutputException("You must join a voice channel to queue songs.");
            }

            YouTubeService youtubeService = new YouTubeService(new BaseClientService.Initializer
            {
                ApiKey          = Globals.BotSettings.YoutubeApiKey,
                ApplicationName = this.GetType().ToString()
            });

            try
            {
                Uri uri = new Uri(queryString);

                if (uri.Host != "youtu.be" && !uri.Host.ToLower().Contains("youtube"))
                {
                    throw new ArgumentException();
                }

                NameValueCollection query = HttpUtility.ParseQueryString(uri.Query);

                string id = query.AllKeys.Contains("v") ? query["v"] : uri.Segments.Last();

                VideosResource.ListRequest idSearch = youtubeService.Videos.List("id,snippet");
                idSearch.Id         = id;
                idSearch.MaxResults = 1;

                VideoListResponse videoListResponse = await idSearch.ExecuteAsync();

                if (videoListResponse.Items.Count == 0)
                {
                    await ctx.RespondAsync("Video link cannot be parsed.");

                    return;
                }

                if (!GuildQueues.ContainsKey(ctx.Guild.Id))
                {
                    GuildQueues.Add(ctx.Guild.Id, new List <JigglySong>());
                }

                Video parsedVideo = videoListResponse.Items.First();

                if (!string.IsNullOrWhiteSpace(parsedVideo.ContentDetails?.Duration) && XmlConvert.ToTimeSpan(parsedVideo.ContentDetails.Duration).Minutes > 15)
                {
                    await ctx.RespondAsync("This video is too long, please try to find something shorter than 15 minutes.");
                }

                Guid guid = Guid.NewGuid();

                AddSong(guid, parsedVideo.Snippet.Title, parsedVideo.Id, parsedVideo.Snippet.ChannelTitle, JigglySong.SongType.Youtube, ctx.Member);

                if (!DownloadHelper.GuildMusicTasks.ContainsKey(ctx.Guild.Id))
                {
                    DownloadHelper.GuildMusicTasks.Add(ctx.Guild.Id, new List <(Guid guid, Func <string> downloadTask)>());
                }

                DownloadHelper.GuildMusicTasks[ctx.Guild.Id].Add((guid, () => DownloadHelper.DownloadFromYouTube(ctx, queryString)));

                if (!DownloadHelper.IsDownloadLoopRunning)
                {
                    new Thread(() => DownloadHelper.DownloadQueue(ctx.Guild.Id)).Start();
                }

                DiscordEmbedBuilder confirmationBuilder = new DiscordEmbedBuilder
                {
                    Description = $"**βœ… Successfully added [{parsedVideo.Snippet.Title}](https://www.youtube.com/watch?v={parsedVideo.Id}) to queue position {GuildQueues[ctx.Guild.Id].Count}**"
                };

                await ctx.RespondAsync(null, false, confirmationBuilder.Build());
            }
            catch
            {
                SearchResource.ListRequest searchListRequest = youtubeService.Search.List("snippet");
                searchListRequest.Q          = queryString.Replace(" ", "+");
                searchListRequest.MaxResults = 10;
                searchListRequest.Type       = "video";

                // Call the search.list method to retrieve results matching the specified query term.
                SearchListResponse searchListResponse = await searchListRequest.ExecuteAsync();

                DiscordEmbedBuilder builder = new DiscordEmbedBuilder
                {
                    Title = "Enter the number of your selection."
                };

                List <JigglySong> videos     = new List <JigglySong>();
                string            selections = string.Empty;

                // Add each result to the appropriate list, and then display the lists of
                // matching videos, channels, and playlists.
                for (int i = 0; i < 5; i++)
                {
                    if (!searchListResponse.Items.Any())
                    {
                        await ctx.RespondAsync("No available tracks less than 15 minutes.");

                        return;
                    }

                    SearchResult searchResult = searchListResponse.Items[i];

                    VideosResource.ListRequest listRequest = youtubeService.Videos.List("snippet");
                    listRequest.Id = searchResult.Id.VideoId;

                    if (!string.IsNullOrWhiteSpace((await listRequest.ExecuteAsync()).Items.First().ContentDetails?.Duration) && XmlConvert.ToTimeSpan((await listRequest.ExecuteAsync()).Items.First().ContentDetails.Duration).Minutes > 15)
                    {
                        searchListResponse.Items.RemoveAt(i);
                        i--;
                        continue;
                    }

                    selections += $"{i + 1}: {searchResult.Snippet.Title}\n";
                    videos.Add(new JigglySong
                    {
                        Title  = searchResult.Snippet.Title,
                        Id     = searchResult.Id.VideoId,
                        Artist = searchResult.Snippet.ChannelTitle,
                        Type   = JigglySong.SongType.Youtube,
                        Queuer = ctx.Member
                    });
                }

                selections += "c: Cancel";

                builder.Description = selections;

                DiscordMessage resultsMessage = await ctx.RespondAsync(string.Empty, false, builder.Build());

                int result = -1;

                MessageContext msgContext = await ctx.Client.GetInteractivity().WaitForMessageAsync(e => e.Author.Id == ctx.Message.Author.Id && (e.Content.ToLower() == "c" || int.TryParse(e.Content, out result) && result > 0 && result <= videos.Count), TimeSpan.FromSeconds(30));

                if (msgContext == null)
                {
                    await ctx.RespondAsync($"πŸ–*Jigglypuff wrote on {ctx.User.Mention}'s face!*πŸ–\nMaybe they should have picked a song...");

                    await resultsMessage.DeleteAsync();

                    return;
                }

                result--;

                if (result >= 0)
                {
                    if ((await ctx.Guild.GetMemberAsync(ctx.Client.CurrentUser.Id)).PermissionsIn(ctx.Channel).HasPermission(Permissions.ManageMessages))
                    {
                        await msgContext.Message.DeleteAsync();
                    }

                    if (!GuildQueues.ContainsKey(ctx.Guild.Id))
                    {
                        GuildQueues.Add(ctx.Guild.Id, new List <JigglySong>());
                    }

                    JigglySong selectedSong = videos[result];

                    DiscordEmbedBuilder confirmationBuilder = new DiscordEmbedBuilder
                    {
                        Description = $"**βœ… Successfully added [{videos[result].Title}](https://www.youtube.com/watch?v={videos[result].Id}) to queue position {GuildQueues[ctx.Guild.Id].Count + 1}**"
                    };

                    if (GuildQueues[ctx.Guild.Id].Count == 0)
                    {
                        confirmationBuilder.Description += "\nPlease be patient; it takes a bit for the first song to cache.";
                    }

                    await ctx.RespondAsync(string.Empty, false, confirmationBuilder.Build());

                    if (!GuildMusicStatuses.TryGetValue(ctx.Guild.Id, out MusicStatus musicStatus))
                    {
                        GuildMusicStatuses.Add(ctx.Guild.Id, new MusicStatus
                        {
                            Skip = false
                        });
                    }

                    Guid guid = Guid.NewGuid();

                    AddSong(guid, selectedSong.Title, selectedSong.Id, selectedSong.Artist, selectedSong.Type, selectedSong.Queuer);

                    if (!DownloadHelper.GuildMusicTasks.ContainsKey(ctx.Guild.Id))
                    {
                        DownloadHelper.GuildMusicTasks.Add(ctx.Guild.Id, new List <(Guid guid, Func <string> downloadTask)>());
                    }

                    DownloadHelper.GuildMusicTasks[ctx.Guild.Id].Add((guid, () => DownloadHelper.DownloadFromYouTube(ctx, $"https://www.youtube.com/watch?v={videos[result].Id}")));

                    if (!DownloadHelper.IsDownloadLoopRunning)
                    {
                        new Thread(() => DownloadHelper.DownloadQueue(ctx.Guild.Id)).Start();
                    }
                }
                else
                {
                    DiscordEmbedBuilder confirmationBuilder = new DiscordEmbedBuilder
                    {
                        Title = "🚫 Canceled queue."
                    };

                    await ctx.RespondAsync(string.Empty, false, confirmationBuilder.Build());
                }
            }
        }
Example #23
0
        async void LoadMore()
        {
            if (nextPageToken != null && !searching)
            {
                try
                {
                    searching = true;
                    SearchResource.ListRequest searchResult = YoutubeManager.YoutubeService.Search.List("snippet");
                    searchResult.Q         = Query;
                    searchResult.PageToken = nextPageToken;
                    searchResult.TopicId   = "/m/04rlf";
                    switch (querryType)
                    {
                    case "All":
                        searchResult.Type      = "video,channel,playlist";
                        searchResult.EventType = null;
                        break;

                    case "Tracks":
                        searchResult.Type      = "video";
                        searchResult.EventType = null;
                        break;

                    case "Playlists":
                        searchResult.Type      = "playlist";
                        searchResult.EventType = null;
                        break;

                    case "Lives":
                        searchResult.Type      = "video";
                        searchResult.EventType = SearchResource.ListRequest.EventTypeEnum.Live;
                        break;

                    case "Channels":
                        searchResult.Type      = "channel";
                        searchResult.EventType = null;
                        break;

                    default:
                        searchResult.Type      = "video";
                        searchResult.EventType = null;
                        break;
                    }
                    searchResult.MaxResults = 50;

                    var searchReponse = await searchResult.ExecuteAsync();

                    nextPageToken = searchReponse.NextPageToken;

                    int loadPos = result.Count - 1;
                    result.RemoveAt(loadPos);
                    adapter.NotifyItemRemoved(loadPos);

                    foreach (var video in searchReponse.Items)
                    {
                        result.Add(GetYtFileFromSearchResult(video));
                    }

                    if (nextPageToken != null)
                    {
                        result.Add(new YtFile(new Song(), YtKind.Loading));
                    }

                    adapter.NotifyItemRangeInserted(loadPos, result.Count - loadPos);
                    searching = false;
                }
                catch (Exception ex)
                {
                    Console.WriteLine("&Exception catched in the youtube load more (search tab): " + ex.Source + " - " + ex.Message);
                    if (ex is System.Net.Http.HttpRequestException)
                    {
                        MainActivity.instance.Timout();
                    }
                }
            }
        }
Example #24
0
        public async Task Search(string search, string querryType, bool loadingBar)
        {
            if (search == null || search == "")
            {
                return;
            }

            searching = true;
            Query     = search;

            if (loadingBar)
            {
                adapter = null;
                ListView.SetAdapter(null);
                EmptyView.Visibility   = ViewStates.Gone;
                LoadingView.Visibility = ViewStates.Visible;
            }

            if (!await MainActivity.instance.WaitForYoutube())
            {
                ListView.SetAdapter(null);
                EmptyView.Text = MainActivity.instance.GetString(Resource.String.youtube_loading_error);
                EmptyView.SetTextColor(Color.Red);
                EmptyView.Visibility = ViewStates.Visible;
                return;
            }

            try
            {
                SearchResource.ListRequest searchResult = YoutubeManager.YoutubeService.Search.List("snippet");
                searchResult.Q       = search;
                searchResult.TopicId = "/m/04rlf";
                switch (querryType)
                {
                case "All":
                    searchResult.Type      = "video,channel,playlist";
                    searchResult.EventType = null;
                    break;

                case "Tracks":
                    searchResult.Type      = "video";
                    searchResult.EventType = null;
                    break;

                case "Playlists":
                    searchResult.Type      = "playlist";
                    searchResult.EventType = null;
                    break;

                case "Lives":
                    searchResult.Type      = "video";
                    searchResult.EventType = SearchResource.ListRequest.EventTypeEnum.Live;
                    break;

                case "Channels":
                    searchResult.Type      = "channel";
                    searchResult.EventType = null;
                    break;

                default:
                    searchResult.Type      = "video";
                    searchResult.EventType = null;
                    break;
                }
                searchResult.MaxResults = 50;

                var searchReponse = await searchResult.ExecuteAsync();

                nextPageToken = searchReponse.NextPageToken;
                result        = new List <YtFile>();

                foreach (var video in searchReponse.Items)
                {
                    result.Add(GetYtFileFromSearchResult(video));
                }

                LoadingView.Visibility = ViewStates.Gone;
                if (nextPageToken != null)
                {
                    result.Add(new YtFile(new Song(), YtKind.Loading));
                }

                if (result.Count > 0 && result[0].Kind == YtKind.Channel && result.Count(x => x.Kind == YtKind.Video && x.song.Artist == result[0].channel.Name) > 1)
                {
                    YtFile channelPreview = new YtFile(result[0].channel, YtKind.ChannelPreview);
                    result.Insert(0, channelPreview);
                }
                else if (result.Count > 0 && querryType == "All" || querryType == "Channels")
                {
                    IEnumerable <string> artist = result.GetRange(0, result.Count > 20 ? 20 : result.Count).GroupBy(x => x.song?.Artist).Where(x => x.Count() > 5).Select(x => x.Key);
                    if (artist.Count() == 1)
                    {
                        Channel channel = result.Find(x => x.Kind == YtKind.Channel && x.channel.Name == artist.First())?.channel;

                        if (channel != null)
                        {
                            YtFile channelPreview = new YtFile(channel, YtKind.ChannelPreview);
                            result.Insert(0, channelPreview);
                        }
                    }
                }

                adapter                = new YtAdapter(result);
                adapter.ItemClick     += ListView_ItemClick;
                adapter.ItemLongCLick += ListView_ItemLongClick;
                ListView.SetAdapter(adapter);
                searching = false;

                if (result.Count == 0)
                {
                    EmptyView.Visibility = ViewStates.Visible;
                    switch (querryType)
                    {
                    case "All":
                        EmptyView.Text = GetString(Resource.String.no_result) + " " + search;
                        break;

                    case "Tracks":
                        EmptyView.Text = GetString(Resource.String.no_track) + " " + search;
                        break;

                    case "Playlists":
                        EmptyView.Text = GetString(Resource.String.no_playlist) + " " + search;
                        break;

                    case "Lives":
                        EmptyView.Text = GetString(Resource.String.no_lives) + " " + search;
                        break;

                    case "Channels":
                        EmptyView.Text = GetString(Resource.String.no_channel) + " " + search;
                        break;

                    default:
                        break;
                    }
                }
                else
                {
                    EmptyView.Visibility = ViewStates.Gone;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("&Exception catched in the youtube search: " + ex.Source + " - " + ex.Message + " Inner: " + ex.InnerException.Message);
                EmptyView.Text         = GetString(Resource.String.timout);
                EmptyView.Visibility   = ViewStates.Visible;
                EmptyView.Visibility   = ViewStates.Visible;
                LoadingView.Visibility = ViewStates.Gone;
            }
        }
Example #25
0
        public void Process()
        {
            try
            {
                ChannelsResource.ListRequest channelListRequest = _youtube.Channels.List("id");

                // Test if user put user name instead of channel id
                channelListRequest.ForUsername = _channelId;
                ChannelListResponse channelsListResponse = channelListRequest.Execute();

                string channelId = "0";
                if (channelsListResponse.Items.Count != 0)
                {
                    channelId = channelsListResponse.Items[0].Id;
                }

                //User put correct channel ID
                SearchResource.ListRequest listRequest = _youtube.Search.List("snippet");
                if (channelId == "0")                   // cant find channel id from user name
                {
                    listRequest.ChannelId = _channelId; //
                }
                else // cand find channel id from user name
                {
                    listRequest.ChannelId = channelId;
                }

                listRequest.MaxResults      = 50;
                listRequest.Type            = "video";
                listRequest.PublishedAfter  = _assessment.StartDate;
                listRequest.PublishedBefore = _assessment.EndDate;


                // Get all uploaded videos and store to uploadedVideos
                SearchListResponse   resp           = listRequest.Execute();
                IList <SearchResult> uploadedVideos = resp.Items;
                string nextPageToken = resp.NextPageToken;
                while (nextPageToken != null)
                {
                    listRequest.PageToken = nextPageToken;
                    SearchListResponse respPage = listRequest.Execute();
                    var resultsPage             = respPage.Items;
                    foreach (SearchResult i in resultsPage)
                    {
                        uploadedVideos.Add(i);
                    }
                    nextPageToken = respPage.NextPageToken;
                    if (uploadedVideos.Count == Int32.Parse(Properties.Resources._api_youtube_maximum_videos))// Prevent excessive use of API calls
                    {
                        break;
                    }
                }


                // Aggregate data
                foreach (SearchResult video in uploadedVideos)
                {
                    // video.Id
                    VideosResource.ListRequest vidReq = _youtube.Videos.List("statistics");
                    vidReq.Id = video.Id.VideoId;
                    VideoListResponse vidResp = vidReq.Execute();
                    Video             item;
                    if (vidResp.Items.Count != 0)
                    {
                        item = vidResp.Items[0];
                        if (item.Statistics.LikeCount != null)
                        {
                            _totalLikes += (ulong)item.Statistics.LikeCount;
                        }
                        if (item.Statistics.DislikeCount != null)
                        {
                            _totalDislikes += (ulong)item.Statistics.DislikeCount;
                        }
                        if (item.Statistics.ViewCount != null)
                        {
                            _totalViews += (ulong)item.Statistics.ViewCount;
                        }
                    }
                }
                _totalVideos += uploadedVideos.Count;
                // Grab number of subscribers
                ChannelsResource.ListRequest channelReq = _youtube.Channels.List("statistics");
                channelReq.Id = channelId;
                ChannelListResponse channelResp = channelReq.Execute();
                if (channelResp.Items.Count != 0)
                {
                    if (channelResp.Items[0].Statistics.SubscriberCount != null)
                    {
                        _subscribers += (ulong)channelResp.Items[0].Statistics.SubscriberCount;
                    }
                }

                // Save to Excel
                SaveToExcelPackage();
            }
            catch (Exception ex)
            {
                Log.LogError(this.GetType().Name + " - " + System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
                throw ex;
            }
        }
Example #26
0
        public void Skype_MessageStatus(IChatMessage message, TChatMessageStatus status)
        {
            Match output = Regex.Match(message.Body, @"(?:youtube\.\w{2,3}\S+v=|youtu\.be/)([\w-]+)", RegexOptions.IgnoreCase);

            // Use non-breaking space as a marker for when to not show info.
            if (output.Success && !message.Body.Contains("Β "))
            {
                String youtubeId = output.Groups[1].Value;
                log.Info("Sending request to YouTube...");

                VideosResource.ListRequest request = youtubeService.Videos.List("snippet,contentDetails,statistics");
                request.Fields = "items(id,snippet(title,channelTitle),contentDetails/duration,statistics(likeCount,dislikeCount))";
                request.Id     = youtubeId;

                VideoListResponse response = request.Execute();
                Video             vid      = response.Items[0];
                String            title    = vid.Snippet.Title;
                String            user     = vid.Snippet.ChannelTitle;
                String            rating   = vid.Statistics.LikeCount + "πŸ‘ " + vid.Statistics.DislikeCount + "πŸ‘Ž";
                TimeSpan          duration = XmlConvert.ToTimeSpan(vid.ContentDetails.Duration);

                message.Chat.SendMessage(String.Format(@"YouTube: ""{0}"" (uploaded by: {1}) (duration: {2}) (rating: {3})", title, user, duration, rating));
                return;
            }

            output = Regex.Match(message.Body, @"^!youtube (.+)", RegexOptions.IgnoreCase);
            if (output.Success)
            {
                String query = output.Groups[1].Value;

                SearchResource.ListRequest request = youtubeService.Search.List("snippet");
                request.Fields     = "items(id)";
                request.Q          = query;
                request.Type       = "video";
                request.SafeSearch = SearchResource.ListRequest.SafeSearchEnum.None;
                request.MaxResults = 10;

                SearchListResponse response = request.Execute();
                int count = response.Items.Count;

                string url;
                if (count > 0)
                {
                    SearchResult result = response.Items[random.Next(count)];
                    url = "https://youtu.be/" + result.Id.VideoId;
                }
                else
                {
                    url = "No matches found.";
                }

                message.Chat.SendMessage(String.Format(@"YouTube search for ""{0}"": {1}", query, url));
                return;
            }

            output = Regex.Match(message.Body, @"^!youtube", RegexOptions.IgnoreCase);
            if (output.Success)
            {
                log.Debug("Got a request for a random video.");

                String url = randomCache.Count > 0 ? randomCache.Dequeue() : generateRandomVideos(true);

                message.Chat.SendMessage(String.Format(@"Random YouTube video: {0}", url));

                generateRandomVideos(false);
                return;
            }
        }
Example #27
0
        public async Task Youtube(SocketUserMessage message)
        {
            await message.Channel.SendMessageAsync("μœ νŠœλΈŒμ—μ„œ μ°Ύμ•„λ³Όκ²Œμš”!");

            await message.Channel.TriggerTypingAsync();

            string token = System.IO.File.ReadAllText("token/google.txt");

            string keyword = message.Content;

            if (message.Content.StartsWith("!youtube", StringComparison.OrdinalIgnoreCase))
            {
                if (keyword.Length < 9)
                {
                    await message.Channel.SendMessageAsync("검색어가 μ—†λ„€μš”?! \"!youtube 검색어\" λ°©μ‹μœΌλ‘œ 써 μ£Όμ„Έμš”!");

                    return;
                }

                keyword = message.Content.Substring(9);
            }
            else if (message.Content.StartsWith("!dbxbqm"))
            {
                if (keyword.Length < 8)
                {
                    await message.Channel.SendMessageAsync("검색어가 μ—†λ„€μš”?! \"!유튜브 검색어\" λ°©μ‹μœΌλ‘œ 써 μ£Όμ„Έμš”!");

                    return;
                }

                keyword = message.Content.Substring(8);
            }
            else if (message.Content.StartsWith("!유튜브"))
            {
                if (keyword.Length < 5)
                {
                    await message.Channel.SendMessageAsync("검색어가 μ—†λ„€μš”?! \"!유튜브 검색어\" λ°©μ‹μœΌλ‘œ 써 μ£Όμ„Έμš”!");

                    return;
                }

                keyword = message.Content.Substring(5);
            }

            //Console.WriteLine("Youtube Search");

            YouTubeService youtube = new YouTubeService(new BaseClientService.Initializer()
            {
                ApiKey = token
            });

            SearchResource.ListRequest listRequest = youtube.Search.List("snippet");
            listRequest.Type       = "video";                                        // λΉ„λ””μ˜€λ§Œ κ²€μƒ‰ν•©λ‹ˆλ‹€.
            listRequest.MaxResults = 3;                                              // 3κ°œκΉŒμ§€λ§Œ κ²€μƒ‰ν•©λ‹ˆλ‹€.
            listRequest.SafeSearch = SearchResource.ListRequest.SafeSearchEnum.None; // μ•ˆμ „ν•„ν„°? ν•„μš”μ—†μŠ΅λ‹ˆλ‹€.
            listRequest.Q          = keyword;                                        //= CommandLine.RequestUserInput<string>("Search term: ");
            listRequest.Order      = SearchResource.ListRequest.OrderEnum.Relevance;

            SearchListResponse searchResponse = listRequest.Execute();

            if (searchResponse.Items.Count != 0)
            {
                await message.Channel.SendMessageAsync($"http://youtu.be/{searchResponse.Items[0].Id.VideoId}\n");
            }
            else
            {
                await message.Channel.SendMessageAsync("μœ νŠœλΈŒμ— 검색 κ²°κ³Όκ°€ μ•ˆλ‚˜μ™€μš”! 헐!");
            }

            if (searchResponse.Items.Count > 1)
            {
                for (int i = 1; i < searchResponse.Items.Count; i++)
                {
                    EmbedBuilder embed = new EmbedBuilder()
                    {
                        //Color = new Color(79, 84, 92),
                        Color       = new Color(0, 150, 207),
                        Description = searchResponse.Items[i].Snippet.Title +
                                      $"\nhttp://youtu.be/{searchResponse.Items[i].Id.VideoId}\n"
                    };

                    await message.Channel.SendMessageAsync("", false, embed);
                }
            }
        }
Example #28
0
        public YoutubeViewModel(IRegionManager regionManager, IEventAggregator eventAggregator)
        {
            TokenSource = new CancellationTokenSource();

            RegionManager   = regionManager;
            EventAggregator = eventAggregator;
            NrColumns       = 4;

            MediaState = new MediaState();
            MediaStateCollectionView = new YoutubeCollectionView(MediaState);
            MediaState.clearUIState("Empty", DateTime.Now, MediaStateType.SearchResult);

            MediaStateCollectionView.SelectionChanged += mediaStateCollectionView_SelectionChanged;

            ViewCommand = new Command <SelectableMediaItem>((selectableItem) =>
            {
                if (selectableItem.Item.Metadata == null)
                {
                    return;
                }

                if (selectableItem.Item is YoutubeVideoItem)
                {
                    YoutubeVideoItem item = selectableItem.Item as YoutubeVideoItem;

                    if (item.IsEmbeddedOnly)
                    {
                        Process.Start("https://www.youtube.com/watch?v=" + item.VideoId);
                    }
                    else
                    {
                        YoutubeVideoStreamedItem video, audio;
                        item.getStreams(out video, out audio, (int)Properties.Settings.Default.MaxPlaybackResolution);

                        Shell.ShellViewModel.navigateToVideoView(video, null, audio);
                    }
                }
            });

            ViewChannelCommand = new AsyncCommand <SelectableMediaItem>(async(selectableItem) =>
            {
                if (selectableItem.Item.Metadata == null)
                {
                    return;
                }

                YoutubeItem item = selectableItem.Item as YoutubeItem;

                SearchResource.ListRequest searchListRequest = Youtube.Search.List("snippet");
                searchListRequest.ChannelId  = item.ChannelId;
                searchListRequest.MaxResults = YoutubeSearchViewModel.maxResults;
                searchListRequest.Order      = Google.Apis.YouTube.v3.SearchResource.ListRequest.OrderEnum.Date;

                MediaStateCollectionView.FilterModes.MoveCurrentToFirst();

                await searchAsync(searchListRequest, item.ChannelTitle, false);
            });

            ViewPlaylistCommand = new AsyncCommand <SelectableMediaItem>(async(selectableItem) =>
            {
                if (selectableItem.Item.Metadata == null)
                {
                    return;
                }

                YoutubePlaylistItem item = selectableItem.Item as YoutubePlaylistItem;

                PlaylistItemsResource.ListRequest searchListRequest = Youtube.PlaylistItems.List("snippet");
                searchListRequest.PlaylistId = item.PlaylistId;
                searchListRequest.MaxResults = YoutubeSearchViewModel.maxResults;

                MediaStateCollectionView.FilterModes.MoveCurrentToFirst();

                await searchAsync(searchListRequest, item.Name, false);
            });

            SubscribeCommand = new Command <SelectableMediaItem>((selectableItem) =>
            {
                YoutubeChannelItem item = selectableItem.Item as YoutubeChannelItem;

                EventAggregator.GetEvent <AddFavoriteChannelEvent>().Publish(item);
            });

            DownloadCommand = new AsyncCommand <SelectableMediaItem>(async(selectableItem) => {
                List <MediaItem> items = MediaStateCollectionView.getSelectedItems();
                if (items.Count == 0)
                {
                    items.Add(selectableItem.Item);
                }

                String outputPath = null;

                switch (YoutubePlugin.Properties.Settings.Default.VideoSaveMode)
                {
                case MediaViewer.Infrastructure.Constants.SaveLocation.Current:
                    {
                        outputPath = MediaFileWatcher.Instance.Path;
                        break;
                    }

                case MediaViewer.Infrastructure.Constants.SaveLocation.Ask:
                    {
                        DirectoryPickerView directoryPicker = new DirectoryPickerView();
                        directoryPicker.DirectoryPickerViewModel.InfoString   = "Select Output Directory";
                        directoryPicker.DirectoryPickerViewModel.SelectedPath = MediaFileWatcher.Instance.Path;

                        if (directoryPicker.ShowDialog() == false)
                        {
                            return;
                        }

                        outputPath = directoryPicker.DirectoryPickerViewModel.SelectedPath;

                        break;
                    }

                case MediaViewer.Infrastructure.Constants.SaveLocation.Fixed:
                    {
                        outputPath = YoutubePlugin.Properties.Settings.Default.FixedDownloadPath;
                        break;
                    }

                default:
                    break;
                }

                CancellableOperationProgressView progressView = new CancellableOperationProgressView();
                DownloadProgressViewModel vm = new DownloadProgressViewModel();
                progressView.DataContext     = vm;

                progressView.Show();
                vm.OkCommand.IsExecutable     = false;
                vm.CancelCommand.IsExecutable = true;

                await Task.Factory.StartNew(() =>
                {
                    vm.startDownload(outputPath, items);
                });

                vm.OkCommand.IsExecutable     = true;
                vm.CancelCommand.IsExecutable = false;
            });

            LoadNextPageCommand = new AsyncCommand(async() =>
            {
                await searchAsync(CurrentQuery, "", true);
            });

            SelectAllCommand = new Command(() =>
            {
                MediaStateCollectionView.selectAll();
            }, false);

            DeselectAllCommand = new Command(() =>
            {
                MediaStateCollectionView.deselectAll();
            });

            ShutdownCommand = new Command(() =>
            {
                Properties.Settings.Default.Save();
            });

            MediaState.UIMediaCollection.IsLoadingChanged += UIMediaCollection_IsLoadingChanged;

            MediaViewer.Model.Global.Commands.GlobalCommands.ShutdownCommand.RegisterCommand(ShutdownCommand);

            setupViews();

            EventAggregator.GetEvent <SearchEvent>().Subscribe(searchEvent);

            SearchTask = null;
        }
Example #29
0
        public List <string> SetVideoListInChannel(List <string> channelIdList, int loopCount)
        {
            logger.Info("/-----Youtube Service Save VideoList In Channel Start-----/");
            int savedCount = 0;

            videoIdList = new List <string>();

            try
            {
                // 유튜브 채널 아이디 μ‘΄μž¬ν•˜λ©΄,
                if (channelIdList.Count > 0)
                {
                    foreach (string channelId in channelIdList)
                    {
                        logger.Info("/-----Channel ID : " + channelId + " Save Start-----/");
                        string pageToken = string.Empty;
                        for (int i = 0; i < loopCount; i++)
                        {
                            SearchResource.ListRequest listRequest = youtube.Search.List("snippet");
                            listRequest.ChannelId      = channelId;
                            listRequest.MaxResults     = 50;
                            listRequest.PageToken      = pageToken;
                            listRequest.PublishedAfter = lastSavedPublishDate;

                            SearchListResponse searchResponse = listRequest.Execute();

                            foreach (SearchResult searchResult in searchResponse.Items)
                            {
                                // λ™μ˜μƒμ˜ 톡계 자료λ₯Ό λ„£κΈ° μœ„ν•΄ VideoIdλ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜
                                videoIdList.Add(searchResult.Id.VideoId);

                                switch (searchResult.Id.Kind)
                                {
                                case "youtube#video":
                                    // 데이터 μ €μž₯
                                    YoutubeT entity = new YoutubeT()
                                    {
                                        YoutubeId         = searchResult.Id.VideoId,
                                        ChannelName       = searchResult.Snippet.ChannelTitle,
                                        Title             = searchResult.Snippet.Title,
                                        ThumbnailImageUrl = searchResult.Snippet.Thumbnails.High.Url,
                                        // Url은 DB Insert ν• λ•Œ λ„£μ–΄μ£ΌλŠ” 거둜....
                                        /* Url = https://www.youtube.com/watch?v= + searchResult.Id.VideoId */
                                        PublishDatetime = searchResult.Snippet.PublishedAt
                                    };
                                    youtubeRepository.InsertYoutubeData(entity);

                                    savedCount++;
                                    break;
                                }
                            }
                            pageToken = searchResponse.NextPageToken;
                        }
                    }
                }
                logger.Info("/-----Youtube Service Save VideoList In Channel End! Saved Count : " + savedCount + " -----/");
                logger.Info("/-----Channel Save End-----/");
            }
            catch (Exception e)
            {
                logger.Error(e, "Youtube Service Step 1 Error");
            }

            return(videoIdList);
        }
Example #30
0
        public static async Task <FeatureRequest <Response.YouTube, Error.YouTube> > SearchYouTube(string[] args, YouTubeService service)
        {
            if (service == null)
            {
                return(new FeatureRequest <Response.YouTube, Error.YouTube>(null, Error.YouTube.InvalidApiKey));
            }
            if (args.Length == 0)
            {
                return(new FeatureRequest <Response.YouTube, Error.YouTube>(null, Error.YouTube.Help));
            }
            string id    = null;
            Match  match = Regex.Match(args[0], "https:\\/\\/www.youtube.com\\/watch\\?v=([^&]+)");

            if (match.Success)
            {
                id = match.Groups[1].Value;
            }
            match = Regex.Match(args[0], "https:\\/\\/youtu.be\\/([^&]+)");
            if (match.Success)
            {
                id = match.Groups[1].Value;
            }
            else if (Regex.Match(args[0], "^[0-9a-zA-Z_-]{11}$").Success)
            {
                id = args[0];
            }
            if (id != null)
            {
                VideosResource.ListRequest r = service.Videos.List("snippet");
                r.Id = id;
                var resp = (await r.ExecuteAsync()).Items;
                if (resp.Count() == 0)
                {
                    return(new FeatureRequest <Response.YouTube, Error.YouTube>(null, Error.YouTube.NotFound));
                }
                return(new FeatureRequest <Response.YouTube, Error.YouTube>(new Response.YouTube()
                {
                    url = "https://www.youtube.com/watch?v=" + resp[0].Id,
                    name = resp[0].Snippet.Title,
                    imageUrl = resp[0].Snippet.Thumbnails.High.Url
                }, Error.YouTube.None));
            }
            SearchResource.ListRequest listRequest = service.Search.List("snippet");
            listRequest.Q          = Utilities.AddArgs(args);
            listRequest.MaxResults = 5;
            IList <SearchResult> searchListResponse = (await listRequest.ExecuteAsync()).Items;

            if (searchListResponse.Count == 0)
            {
                return(new FeatureRequest <Response.YouTube, Error.YouTube>(null, Error.YouTube.NotFound));
            }
            IEnumerable <SearchResult> correctVideos = searchListResponse.Where(x => x.Id.Kind == "youtube#video");

            if (correctVideos.Count() == 0)
            {
                return(new FeatureRequest <Response.YouTube, Error.YouTube>(null, Error.YouTube.NotFound));
            }
            VideosResource.ListRequest videoRequest = service.Videos.List("snippet,statistics");
            videoRequest.Id = string.Join(",", correctVideos.Select(x => x.Id.VideoId));
            IList <Video> videoResponse = (await videoRequest.ExecuteAsync()).Items;
            Video         biggest       = null;
            ulong         likes         = ulong.MinValue;

            foreach (Video res in videoResponse)
            {
                ulong likeCount = ulong.MinValue;
                if (res.Statistics.LikeCount != null)
                {
                    likeCount = res.Statistics.LikeCount.Value;
                }
                if (res.Statistics.DislikeCount != null)
                {
                    likeCount -= res.Statistics.DislikeCount.Value;
                }
                if (likeCount > likes || biggest == null)
                {
                    likes   = likeCount;
                    biggest = res;
                }
            }
            return(new FeatureRequest <Response.YouTube, Error.YouTube>(new Response.YouTube()
            {
                url = "https://www.youtube.com/watch?v=" + biggest.Id,
                name = biggest.Snippet.Title,
                imageUrl = biggest.Snippet.Thumbnails.High.Url
            }, Error.YouTube.None));
        }