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.
- A biblioteca AS3 que desenvolvi para consumir esses serviços da Web
- Documentação oficial da API Data do YouTube
- IDE do FlashDevelop para AS3
- Uma lista dos eventos acionados por cada chamada de solicitação feita no YouTubeClient
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íficacount(): o número de resultados disponíveis para esse feed, diferente detotalResults
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
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.
Esta obra está licenciada de acordo com a
Licença Creative Commons Atribuição 3.0 dos Estados Unidos.