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)) }); }
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); } }
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)); }
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); }
//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); }
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() }); }
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)); }
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}"); }
//다음 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)) }); }
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); }
// 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); }
/// <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); }
/// <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); }
/// <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); } }
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()); } } }
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(); } } } }
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; } }
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; } }
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; } }
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); } } }
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; }
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); }
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)); }