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.
- A biblioteca AS3 que desenvolvi para consumir esses serviços da Web
- Documentação oficial da API YouTube Data
- Ambiente de desenvolvimento integrado do FlashDevelop para AS3
- Uma lista de quais eventos são disparados por chamada de solicitação feita no YouTubeClient
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 detotalResults
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
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.
Este trabalho está licenciado sob a
Licença Creative Commons Attribution 3.0 Estados Unidos.