Buscando dados de video na API v3 do youtube pelo ID em Java

Se você está precisando comunicar com o youtube através da sua API v3 está no lugar certo. Recentemente tive que fazer essa integração da API com um serviço Rest onde seria enviado a URL contendo o ID do vídeo e então era necessário carregar as informações desse vídeo e fazer a persistência no banco de dados.

Antes de estudar e utilizar os recursos que a própria API v3 oferece eu criei as classes modelos “na raça” para serializar os objetos via Json através de uma chamada de uma URL(https://www.googleapis.com/youtube/v3/videos?). Então estou deixando duas formas de buscar informações de um vídeo através da sua URL do youtube.

Mas o que é API v3 Youtube?

A API v3 youtube permite aos usuários integrar seu programa com o YouTube e deixe-a executar muitas das operações disponíveis no site. Ele fornece a capacidade de procurar por vídeos, recuperar feeds padrão, e ver o conteúdo relacionado,  também pode autenticar como usuário para fazer upload de vídeos, modificar listas de usuários, e muito mais.

Esta integração pode ser usado para uma variedade de usos, tais como o desenvolvimento de uma aplicação web que permite aos usuários fazer upload de vídeo para o YouTube, ou um aplicativo de dispositivo ou desktop que traz a experiência do YouTube para uma nova plataforma.

A API de dados dá aos usuários acesso programático para o vídeo e informações do usuário armazenadas no YouTube. Isso pode ser usado para personalizar um site ou aplicação com informação existente do usuário, bem como realizar ações como comentar e vídeos de rating.

Vamos lá, mãos a obra!

Toda documentação sobre a API V3 youtube pode ser encontrada nesse link . O retorno dessas chamadas é em Json, caso não conheça sobre essa notação veja esse link e estude isso é muito importante!

Opção 1 – Chamada HTTP

Nesse código não utilizaremos a API em si no nosso código java e sim efetuaremos uma chamada HTTP para uma url onde será retornada o Json e então iremos serializar através das nossas classes modelo. A url para a chamada é a seguinte:

https://www.googleapis.com/youtube/v3/videos?id={IDVIDEO={SUACHAVE}&part=snippet,contentDetails,statistics,status

package br.com.kelvinsantiago.servicos;

import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Kelvin Santiago
 */
public class Youtube {

    private static final String API_URL = "https://www.googleapis.com/youtube/v3/videos?";
    private static final String KEY = "SUACHAVE";
    private static final String PART = "snippet,contentDetails,statistics,status";

    public static void main(String[] args) throws Exception {
        Youtube youtube = new Youtube();
        RespostaYoutube respostaYoutube = youtube.obterDadosVideo("https://www.youtube.com/watch?v=jdqsiFw74Jk");
        System.out.println(respostaYoutube.items.get(0).id);
    }

    public RespostaYoutube obterDadosVideo(String URL){

        Gson gson = new Gson();
        String retornoJson = null;
        try {
            // Faz o split para obter o ID do video
            String ID = URL.split("v=")[1];
            retornoJson = lerUrl(API_URL +
                                 "id="+ID +"&"+
                                 "key=" + KEY + "&" +
                                 "part=" + PART);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        return gson.fromJson(retornoJson, RespostaYoutube.class);
    }

    private static String lerUrl(String urlString) throws Exception {
        BufferedReader leitor = null;
        try {
            URL url = new URL(urlString);
            leitor = new BufferedReader(new InputStreamReader(url.openStream()));
            StringBuffer buffer = new StringBuffer();
            int read;
            char[] chars = new char[1024];
            while ((read = leitor.read(chars)) != -1)
                buffer.append(chars, 0, read);

            return buffer.toString();
        } finally {
            if (leitor != null)
                leitor.close();
        }

    }

    public class RespostaYoutube{
        public List<Items> items = new ArrayList<Items>();
    }

    public class Items{

        public Snippet snippet;
        public Statistics statistics;
        public String id;
    }

    public class Snippet{
        public String title;
        public String description;
        public Thumbnails thumbnails;
        public List<String> tags = new ArrayList<String>();
    }

    public class Statistics{
        public long likeCount;
        public long viewCount;
    }

    public class Thumbnails{
        Medium medium;
        High high;
    }

    public class Medium{
        String url;
        long width;
        long height;
    }

    public class High{
        String url;
        long width;
        long height;
    }

}

Opção 2 – Chamada através da API v3

Já neste código é utilizado a  a API do youtube, nós utilizamos a dependência “google-api-services-youtube”, que poderá ser encontrada no repositório do maven e inserida no seu arquivo pom.xml do seu projeto.

Dependência Maven

<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-youtube</artifactId>
<version>v3-rev178-1.22.0</version>
</dependency>

package br.com.kelvinsantiago.servicos;

import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.youtube.YouTube;
import com.google.api.services.youtube.model.Video;
import org.springframework.stereotype.Repository;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

/**
 * @author Kelvin Santiago
 */
@Repository
public class YoutubeAPI {

    public final String API_KEY = "SUACHAVE";

    private YouTube youtube;

    /**
     * Método responsável por buscar dados do video passando o ID.
     *
     * @param idVideo
     * @return
     */
    public Video buscarPeloIdVideo(String idVideo) {
        try {
            youtube = new YouTube.Builder(new NetHttpTransport(), new JacksonFactory(), new HttpRequestInitializer() {
                public void initialize(HttpRequest request) throws IOException {
                }
            }).setApplicationName("appAmaYoutube").build();

            // Definindo objeto com os atributos de retorno da busca.
            YouTube.Videos.List busca = youtube.videos().list("id,snippet,statistics");

            // Setando ID do video
            busca.setId(idVideo);

            // Setando KEY do Youtube.
            busca.setKey(API_KEY);

            // Executando busca.
            List<Video> respostaBuscaYoutube = busca.execute().getItems();

            // Imprimindo dado de resposta
            System.out.println(respostaBuscaYoutube);

            return respostaBuscaYoutube.get(0);

        } catch (GoogleJsonResponseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Throwable t) {
            t.printStackTrace();
        }

        return null;
    }

    /**
     * Método responsável por retornar apenas o ID da URL do Youtube
     *
     * @param URL
     * @return
     */
    public String splitURL(String URL) {
        try {
            return URL.split("v=")[1];
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * Método responsável por converter imagem de URL para Byte[]
     * @param linkURL
     * @return
     */
    public byte[] getBytesImagemURL(String linkURL) {
        URL imageURL = null;
        try {
            imageURL = new URL(linkURL);
            // Lendo imagem diretamente da URL
            BufferedImage originalImage = ImageIO.read(imageURL);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(originalImage, "jpg", baos);
            baos.flush();
            byte[] imageBytes = baos.toByteArray();
            return imageBytes;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;

    }

}

 

Concluindo

Espero que você tenha conseguido efetuar sua integração com a API v3 do youtube, caso você tenha alguma dúvida ou até mesmo queira deixar algum feedback, utilize o formulário de comentários abaixo.