API de dados do YouTube para ActionScript 3.0 : primeiras etapas

Este artigo foi escrito e enviado por um desenvolvedor externo. A equipe de APIs e ferramentas do YouTube agradece a Martin Legris pelo seu tempo e conhecimento.


Martin Legris
Março de 2008

Introdução

Neste tutorial, você verá como, com menos de 10 linhas de código AS3, é possível recuperar os vídeos mais assistidos no YouTube para os últimos day, week, month ou all_time. Você pode acessar qualquer um dos feeds padrão:

  • Mais assistidos
  • Mais recentes
  • Mais comentados
  • Mais conectados
  • Mais respondidos
  • Destaques recentes
  • Bem avaliados
  • Mais adotados como favoritos
  • Vídeos para celulares

A biblioteca usada neste exemplo é digitada na íntegra, o que significa que, depois de receber os dados, você pode usar o recurso de preenchimento automático em ambientes de desenvolvimento integrado, como FlashDevelop, Flex IDE, Eclipse w/FDT, IntelliJ Idea e outros.

Recursos importantes

Antes de começarmos, veja a lista de recursos disponíveis para você, o desenvolvedor AS3 interessado em usar dados da API do YouTube.

Explorar

Como fazer sua primeira solicitação

O código a seguir é bem comentado. No entanto, vou descrever a funcionalidade um pouco antes de começar. O ponto de partida para todas as solicitações é uma classe chamada YouTubeClient. Essa classe é um Singleton ao qual você pode acessar da seguinte maneira:

// first you import it
import ca.newcommerce.youtube.webservice.YouTubeClient;

// then you get a reference to it
var client:YouTubeClient = YouTubeClient.getInstance();

Agora estamos prontos para fazer uma solicitação:

client.getStandardFeed(YouTubeClient.STD_TOP_RATED, 
                                 YouTubeClient.TIME_MONTH,
                                 1, 
                                 10);

Acabei de solicitar os vídeos mais bem avaliados no último mês, com os resultados de 1 a 10. Há um máximo de 50 resultados por chamada. Isso é fácil!

Como processar os resultados

Agora, como faço para acessar esses resultados? Como o paradigma do tipo de serviço da Web REST é assíncrono, é mais fácil usar eventos para processar os resultados em vez de interromper o código enquanto os resultados são buscados. Nesse caso, precisamos declarar um listener de eventos para o evento StandardVideoFeedEvent.STANDARD_VIDEO_DATA_RECEIVED. Nossa função será chamada sempre que o YouTubeClient receber uma resposta para um feed padrão.

client.addEventListener(StandardVideoFeedEvent.STANDARD_VIDEO_DATA_RECEIVED, 
                        doVideosReceived);

A função a ser chamada será doVideosReceived. Será necessário um parâmetro, uma variável do tipo StandardVideoFeedEvent. Isso segue o padrão no AS3. Vamos fazer a declaração e rastrear alguns dados sobre os vídeos que recebemos. Rastrearemos na saída padrão:

  • o título do vídeo,
  • o URL do SWF para incorporar o vídeo,
  • a contagem de visualizações;
  • a contagem de comentários;
  • a duração do vídeo;
  • e o nome do autor.
function doVideosReceived(evt:StandardVideoFeedEvent):void
{
	// get a reference to the feed containing the videos
	var feed:VideoFeed = evt.feed;
	
	// variable to hold each video retreived on the feed
	var video:VideoData;
	
	// iterate through the availabe results
	while(video = feed.next())
	{
		  // trace a newline followed by the video title
		  trace("\nvideo title:"+video.title);
		  
		  // trace the url to use to embed the flash player with this video playing in it..
		  trace("player url:"+video.swfUrl);
		  
		  // the view count
		  trace("viewCount:"+video.viewCount);
		  
		  // the comment count
		  trace("commentCount:"+video.commentCount);
		  
		  // the duration
		  trace("duration:"+video.duration);
		  
		  // the author
		  trace("author:"+video.authors.first().name);
	}
}

Algumas observações sobre a biblioteca e os feeds

Quase todos os eventos têm uma propriedade .feed. ProfileEvent é a única exceção. Ele tem uma propriedade .profile, já que há apenas um registro retornado por essa chamada.

Existem muitos tipos de feed, todos eles implementam os seguintes métodos:

  • first(): recupera o primeiro registro e aponta para ele.
  • next(): recupera o próximo registro disponível.
  • last(): recupera o último registro e aponta para ele.
  • previous(): recupera o registro anterior no feed.
  • getAt(): acessa um resultado em uma posição específica.
  • count(): o número de resultados disponíveis para este feed, diferente do número de totalResults

Quando você chegar ao fim dos resultados, next() retornará um valor nulo. O mesmo que no caso anterior, quando você chegar ao primeiro resultado, a próxima chamada para previous() retornará null.

Os dados dentro dos feeds (por exemplo, categorias) são encapsulados dentro de Iterators. Assim, é possível usar as mesmas funções para percorrer as categorias disponíveis.

Código-fonte completo

Veja a seguir o código-fonte completo deste exemplo. Você pode fazer o download de um zip que contém tudo o que você precisa para executar o exemplo dentro do Flash CS3. No entanto, é melhor atualizar a biblioteca, caso tenhamos corrigido os bugs ou os recursos da atualização. Clique aqui para fazer o download da biblioteca.

package
{
    // first import dependencies (You can be more specific than this if you want)
    import ca.newcommerce.youtube.data.*;
    import ca.newcommerce.youtube.events.*;
    import ca.newcommerce.youtube.feeds.*;
    import ca.newcommerce.youtube.iterators.*;
    import ca.newcommerce.youtube.webservice.YouTubeClient;

    public class ytTest()
    {
        // some class variables
        protected var _ws:YouTubeClient;
        protected var _requestId:Number;

        public function ytTest()
        {
            // now inside of an init function
            _ws = YouTubeClient.getInstance();

            // register to list to the events you are interested in
            _ws.addEventListener(StandardVideoFeedEvent.STANDARD_VIDEO_DATA_RECEIVED, doVideosReceived);

            // do your call.. get the Top Rated videos for the last month
            // results 1 to 10; it returns a requestId
            _requestId = _ws.getStandardFeed(YouTubeClient.STD_TOP_RATED,
                                                YouTubeClient.TIME_MONTH, 
                                                1,
                                                10);
        }

        protected function doVideosReceived(evt:StandardVideoFeedEvent):void
        {

            // get a reference to the feed containing the videos
            var feed:VideoFeed = evt.feed;

            // variable to hold each video retrieved on the feed
            var video:VideoData;

            while(video = feed.next())
            {
                // trace a newline followed by the video title
                trace("\nvideo title:"+video.title);

                // trace the swf URL (used for embedding)
                trace("player url:"+video.swfUrl);

                // the view count
                trace("viewCount:"+video.viewCount);

                // the comment count
                trace("commentCount:"+video.commentCount);

                // the duration
                trace("duration:"+video.duration);

                // the author
                trace("author:"+video.authors.first().name);
             }

        }

    }

}

Conclusão

Embora este artigo mal toque na ponta do iceberg, você terá uma boa ideia de como é simples consultar a API de dados do YouTube usando essa biblioteca. Como eu dediquei muito tempo para digitar tudo, é muito fácil explorar quais dados estão disponíveis em cada resposta do feed. Ela ainda não oferece suporte à nova funcionalidade de gravação e upload. Se você quiser contribuir com a biblioteca, acesse a página do projeto.

Biografia do autor


AUTORIZAÇÃO

Martin Legris conta com 12 anos de desenvolvimento ativo de software. Atualmente, ele se concentra principalmente na pesquisa de interface do usuário, e sua ferramenta favorita é o Flash, com ActionScript. Confira o blog dele em blog.martinlegris.com e o site (pode estar desatualizado) em www.newcommerce.ca.

Licença Creative Commons
Este trabalho está licenciado sob a Licença Creative Commons Attribution 3.0 Estados Unidos.