API YouTube Data para ActionScript 3.0: primeiros passos

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


Martin Legris
Março de 2008

Introdução

Neste tutorial, vou mostrar como, com menos de 10 linhas de código AS3, você pode recuperar os vídeos mais populares do YouTube dos últimos day, week, month ou all_time. Você pode usar qualquer um dos feeds padrão:

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

A biblioteca usada neste exemplo é de tipo fixo, ou seja, depois de receber os dados, você pode usar o recurso de preenchimento automático em ambientes de desenvolvimento integrados (IDEs) como FlashDevelop, Flex IDE, Eclipse com FDT, IntelliJ Idea e muito mais.

Recursos importantes

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

Digging In

Como fazer sua primeira solicitação

O código a seguir está bem comentado. No entanto, vou descrever a funcionalidade um pouco antes de nos aprofundar. O ponto de partida de todas as solicitações é uma classe com o nome YouTubeClient. Essa classe é um Singleton ao qual você tem acesso fazendo o seguinte:

// 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 do último mês, com resultados de 1 a 10 (observe que há um máximo de 50 resultados por chamada). Fácil!

Como processar os resultados

Agora, como faço para acessar esses resultados? Como o paradigma de webservice do tipo REST é assíncrono, é mais fácil usar eventos para lidar com 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 toda vez 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. Ele vai usar um parâmetro, uma variável do tipo StandardVideoFeedEvent. Isso segue o padrão no AS3. Vamos declarar isso e rastrear algumas coisas sobre os vídeos que recebemos. Vamos rastrear a 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.

Há muitos tipos de feeds, e 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(): recebe um resultado em uma posição específica
  • count(): o número de resultados disponíveis para esse feed, diferente de totalResults

Ao chegar ao fim dos resultados, next() retorna um valor nulo. A mesma coisa da etapa anterior, quando você chegar ao primeiro resultado, a próxima chamada para previous() retornará null.

Os dados nos feeds (por exemplo, categorias) são agrupados em Iterators. Assim, você pode usar as mesmas funções para percorrer as categorias disponíveis.

Código-fonte completo

Confira a seguir o código-fonte completo deste exemplo. Você pode fazer o download de um arquivo ZIP que contém tudo o que você precisa para executar o exemplo no Flash CS3. No entanto, é melhor atualizar a biblioteca caso corrigimos bugs ou atualizemos recursos. 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 a ponta do iceberg, ele dará uma boa ideia de como é simples consultar a API de dados do YouTube usando esta biblioteca. Como eu me dei ao trabalho de digitar tudo, é muito fácil descobrir quais dados estão disponíveis em cada resposta do feed. Ela ainda não é compatível com as novas funcionalidades de gravação e upload, mas se você quiser contribuir com a biblioteca, acesse a página do projeto.

Biografia do autor


AUTHORNAME

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

Licença Creative Commons
Esta obra está licenciada de acordo com a Licença Creative Commons Atribuição 3.0 dos Estados Unidos.