private synchronized boolean setupNextKey() { if (keyQueue.size() > 0) { String key = keyQueue.poll(); if (key != null) { search.setKey(key); hasValidKey = true; return true; } } hasValidKey = false; return false; }
search.setKey( apiKey ); search.setQ( queryTerm ); search.setType( "video" ); search.setFields( "items(id/kind,id/videoId,snippet/title,snippet/description,snippet/thumbnails/default/url)" ); search.setMaxResults( NUMBER_OF_VIDEOS_RETURNED ); SearchListResponse searchResponse = search.execute(); List<SearchResult> searchResultList = searchResponse.getItems();
public List<SimpleResult> getResults(String query, int numresults) { List<SimpleResult> urls = new ArrayList<>(); search.setQ(query); search.setMaxResults((long) numresults); SearchListResponse searchResponse; try { searchResponse = search.execute(); List<SearchResult> searchResultList = searchResponse.getItems(); searchResultList.forEach((sr) -> urls.add(new SimpleResult(sr.getId().getVideoId(), sr.getSnippet().getTitle()))); } catch (GoogleJsonResponseException e) { if (e.getMessage().contains("quotaExceeded") || e.getMessage().contains("keyInvalid")) { if (setupNextKey()) { return getResults(query, numresults); } } else { Launcher.logToDiscord(e, "youtube-search-error", "<--", "code", e.getDetails().getCode(), "message", e.getDetails().getMessage()); } } catch (IOException ex) { DiscordBot.LOGGER.error("YTSearch failure: " + ex.toString()); return null; } return urls; }
public List<SimpleResult> getPlayListItems(String playlistCode) { List<SimpleResult> playlist = new ArrayList<>(); try { YouTube.PlaylistItems.List playlistRequest = youtube.playlistItems().list("id,contentDetails,snippet"); playlistRequest.setPlaylistId(playlistCode); playlistRequest.setKey(search.getKey()); playlistRequest.setFields("items(contentDetails/videoId,snippet/title,snippet/publishedAt),nextPageToken,pageInfo"); String nextToken = ""; do { playlistRequest.setPageToken(nextToken); PlaylistItemListResponse playlistItemResult = playlistRequest.execute(); playlist.addAll(playlistItemResult.getItems().stream().map(playlistItem -> new SimpleResult(playlistItem.getContentDetails().getVideoId(), playlistItem.getSnippet().getTitle())).collect(Collectors.toList())); nextToken = playlistItemResult.getNextPageToken(); } while (nextToken != null); } catch (IOException e) { e.printStackTrace(); } return playlist; }
public YTSearch() { keyQueue = new LinkedList<>(); Collections.addAll(keyQueue, BotConfig.GOOGLE_API_KEY); youtube = new YouTube.Builder(new NetHttpTransport(), new JacksonFactory(), (HttpRequest request) -> { }).setApplicationName(BotConfig.BOT_NAME).build(); YouTube.Search.List tmp = null; try { tmp = youtube.search().list("id,snippet"); tmp.setOrder("relevance"); tmp.setVideoCategoryId("10"); } catch (IOException ex) { DiscordBot.LOGGER.error("Failed to initialize search: " + ex.toString()); } search = tmp; if (search != null) { search.setType("video"); search.setFields("items(id/kind,id/videoId,snippet/title)"); } setupNextKey(); }
/** * Returns a collection of search results that match the query parameters specified in the API * request. By default, a search result set identifies matching video, channel, and playlist * resources, but you can also configure queries to only retrieve a specific type of resource. * * Create a request for the method "search.list". * * This request holds the parameters needed by the youtube server. After setting any optional * parameters, call the {@link List#execute()} method to invoke the remote operation. * * @param part The part parameter specifies a comma-separated list of one or more search resource properties that * the API response will include. Set the parameter value to snippet. * @return the request */ public List list(java.lang.String part) throws java.io.IOException { List result = new List(part); initialize(result); return result; }