Java tutorial
package com.xrdev.musicast.connection; import android.content.Context; import android.text.TextUtils; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.youtube.YouTube; import com.google.api.services.youtube.model.ResourceId; import com.google.api.services.youtube.model.SearchListResponse; import com.google.api.services.youtube.model.SearchResult; import com.google.api.services.youtube.model.Video; import com.google.api.services.youtube.model.VideoListResponse; import com.xrdev.musicast.Application; import com.xrdev.musicast.model.LocalQueue; import com.xrdev.musicast.model.TrackItem; import com.xrdev.musicast.model.VideoItem; import com.xrdev.musicast.utils.DatabaseHandler; import org.joda.time.Period; import org.joda.time.Seconds; import org.joda.time.format.ISOPeriodFormat; import org.joda.time.format.PeriodFormatter; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class YouTubeManager { private static final long NUMBER_OF_VIDEOS_RETURNED = 1; /** Global instance of the HTTP transport. */ private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = new JacksonFactory(); /** Global instance of Youtube object to make all API requests. */ private static YouTube youtube; //public static ArrayList<VideoItem> searchVideos(String searchTerm) { public static VideoItem searchVideo(String searchTerm) { //ArrayList<VideoItem> videoItemList = new ArrayList<VideoItem>(); VideoItem resultVideo = null; try { // Construir o objeto que ser a referncia para todas as solicitaes API. youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, new HttpRequestInitializer() { public void initialize(HttpRequest request) throws IOException { } }).setApplicationName("musicast").build(); System.out.println("[YoutubeHandler]: Conexo construda."); YouTube.Search.List search = youtube.search().list("id,snippet"); String apiKey = "AIzaSyBTXTaiH-BYye70pKDGc_Bpf1dkqiPDLcw"; search.setKey(apiKey); search.setQ(searchTerm); /* * We are only searching for videos (not playlists or channels). If we were searching for * more, we would add them as a string like this: "video,playlist,channel". */ search.setType("video"); /* * setFields: reduz as informaes retornadas para apenas os campos necessrios. */ // search.setFields("items(id/kind,id/videoId,snippet/title,snippet/description)"); --> Sem viewcount. search.setFields("items(id/kind,id/videoId)"); // Pega apenas o ID. Pegar o restante do objeto Video que ser encontrado. // Campos possveis: https://developers.google.com/youtube/v3/docs/search search.setMaxResults(NUMBER_OF_VIDEOS_RETURNED); System.out.println("[YouTubeHandler]: Iniciando busca."); SearchListResponse searchResponse = search.execute(); List<SearchResult> searchResultList = searchResponse.getItems(); List<String> videoIds = new ArrayList<String>(); /** * Pegar apenas os IDs dos vdeos encontrados. */ if (searchResultList != null) { Iterator resultsIterator = searchResultList.iterator(); while (resultsIterator.hasNext()) { SearchResult searchResult = (SearchResult) resultsIterator.next(); ResourceId rId = searchResult.getId(); // Pegar o ID do resultado. // Verifica se o resultado um video. Adiciona a lista de IDs. if (rId.getKind().equals("youtube#video")) { videoIds.add(rId.getVideoId()); System.out.println("[YouTubeHandler]: Video ID encontrado adicionado: " + rId.getVideoId()); /** String videoId = rId.getVideoId(); String title = searchResult.getSnippet().getTitle(); String description = searchResult.getSnippet().getDescription(); VideoListResponse videoListResponse = youtube.videos().list("statistics").setId(videoId).execute(); resultList.add(new VideoItem(videoId, title, description)); */ } // end if } // end while /** * Busca realizada, a lista videoId foi preenchida pelos IDs encontrados pela busca. */ /** * Fazer uma busca usando Videos.list da API. Esta lista retorna objetos "Video", uma representaao em Java * do objeto JSON enviado pelo servidor. * Por este objeto, possvel obter ttulo, descrio, estatsticas (como viewcount) e contentDetails (como durao). */ /** * Montar a Lista: * youtube.videos() - chamada da API * .list("id,snippet,statistics,contentDetails") - Informar quais atributos do JSON retornar - * https://developers.google.com/youtube/v3/docs/videos#resource * .setId - A nica forma de pesquisar os vdeos desta forma por ID. Juntar tudo usando vrgula como delimitador. * .execute() - Autoexplicativo. */ System.out.println("[YouTubeHandler]: Montando lista de Objetos Video com IDs encontrados"); // VideoListResponse vlr = youtube.videos().list("id,snippet,statistics,contentDetails") // Adicionado ,contentDetails - testar. VideoListResponse vlr = youtube.videos().list("id,contentDetails") .setId(TextUtils.join(",", videoIds)).setKey(apiKey).execute(); for (Video video : vlr.getItems()) { /** * Para cada video, buscar as informaes relevantes e instanciar um VideoItem. */ String videoId = video.getId(); //String title = video.getSnippet().getTitle(); //String description = video.getSnippet().getDescription(); //BigInteger viewCount = video.getStatistics().getViewCount(); String durationString = video.getContentDetails().getDuration(); boolean isLicensed = video.getContentDetails().getLicensedContent(); // Converter a durao do formato String enviado pela API para segundos. PeriodFormatter formatter = ISOPeriodFormat.standard(); Period p = formatter.parsePeriod(durationString); Seconds s = p.toStandardSeconds(); int durationInt = s.getSeconds(); // Adicionar o VideoItem ao Array. // videoItemList.add(new VideoItem(videoId, title, description, viewCount, durationInt)); resultVideo = new VideoItem(videoId, durationInt, isLicensed); System.out.println("[YouTubeHandler] Video adicionado lista para o View: " + videoId); } } } catch (Exception e) { e.printStackTrace(); } return resultVideo; } public static void associateYouTubeData(Context context, TrackItem item, LocalQueue queue) { String artists; String trackName; DatabaseHandler dbHandler = Application.getDbHandler(context); // Recuperar dados de um item. if (item.getArtists() == null) artists = ""; else artists = item.getArtists(); if (item.getName() == null) trackName = ""; else trackName = item.getName(); // Buscar no Youtube por vdeos correspondentes. VideoItem video = searchVideo(artists + " - " + trackName); if (video == null) { item.setYoutubeId(TrackItem.VIDEO_NOT_FOUND); return; } if (item.getTrackId() == null || item.getTrackId().equals("null")) { item.setYoutubeId(TrackItem.VIDEO_NOT_FOUND); return; } // Procurar correlao usando a durao dos vdeos. // Configurar a tolerncia na durao pelo if abaixo. if ((video.isLicensed()) || (video.getDurationInt() <= (item.getDuration() + 15) && video.getDurationInt() >= (item.getDuration() - 15))) { item.setYoutubeId(video.getVideoId()); // queue.addTrack(item); item.setQueueIndex(queue.getValidTracks().size() - 1); dbHandler.insertMatch(item); } else { item.setYoutubeId(TrackItem.VIDEO_NOT_FOUND); } queue.setPositions(); } }