Recentemente, desenvolvi um pequeno aplicativo de linha de comando que permite que você baixe uma galeria inteira a partir do Flickr. Ele é chamado flickr-set-get, e você pode encontrá-lo no NPM e no GitHub.
Por quê?
Para ser honesto, eu mesmo tive a necessidade de baixar um grande conjunto de fotos (mais de 400 fotos) do Flickr e eu não queria fazer isso manualmente. Eu também não consegui, depois de uma rápida pesquisa, encontrar algo simples para resolver essa tarefa. Já que eu tenho me aprofundado em Node.js, esta foi a oportunidade perfeita para desenvolver algo prático.
Como ele foi feito?
Como eu disse, usei Node.js. Como parte do meu processo de aprendizagem, eu tentei não reinventar a roda e seguir “o caminho Node”, então eu usei alguns módulos muito bons como a fundação para construir este app:
- Commander, Cli e Prompt para as instalações de linha de comando (Opções/Argumentos de parse, gerar ajuda, barra de progresso, receber input do usuário).
- Request: para simplificar a criação da solicitação HTTP para chamar as APIs Flickr.
- Async: para gerenciar todas as tarefas assíncronas em paralelo e com um nível configurável de simultaneidade (um dos recursos que na minha humilde opinião fazem node/javascript se destacarem da multidão das linguagens de programação interpretadas).
Como ferramentas de desenvolvimento, eu também usei:
- JSCs: para verificar o padrão de código que adotei.
- Mocha e Chai: executor de testes e declaração de frameworks para o teste unitário.
- Nock: módulo incrível para fazer “mock” das solicitações HTTP e evitar acertar os servidores do Flickr em meus testes.
- Istanbul: para a cobertura de código.
- Travis CI: serviço de integração contínua.
- Coveralls: serviço para manter o controle das mudanças de cobertura após cada novo commit.
- Gemnasium: serviço que verifica as dependências e alerta se ficar desatualizado.
Tornando-se assíncrono e executando solicitações em paralelo
Para fazer download de uma foto do Flickr, a partir de uma galeria, você precisa fazer várias chamadas de API antes de ter a URL correta de baixar a foto.
Antes de tudo, você precisa chamar o método flickr.photosets.getPhotos da API para descobrir as IDs de todas as fotos do conjunto.
Então, para descobrir a URL de cada foto, você precisa chamar o flickr.photos.getSizes. Esse método lhe dá todas as URLs para baixar todos os diferentes tamanhos de uma determinada foto. Uma vez que você tem a URL, você pode simplesmente usar isso para fazer download de uma foto em seu computador.
A primeira chamada de API é o ponto de partida e, em seguida, uma vez que agora você tem todas as IDs, você pode fazer todas as outras solicitações em paralelo.
Graças a Async, foi muito fácil criar uma função task que descobrisse a URL específica de uma determinada foto e, em seguida, fizesse o download. Então eu só precisava replicar essa tarefa para cada foto e executar todas elas em paralelo. Graças à função Async.parallelLimit(), é ainda possível executar as tarefas com um nível de simultaneidade configurável.
Você pode descobrir como eu implementei essa lógica específica no GitHub.
Como usar?
Se você estiver interessado em usar o app, eu sugiro que você leia a documentação oficial no GitHub, mas deve ser bastante fácil de entender e usá-lo se você é um desenvolvedor (ele não foi feito para ser usado por outras pessoas que estão confortáveis com a linha de comando!).
Situação atual
O projeto foi desenvolvido em um fim de semana como um “projeto de aprendizagem” e testado apenas por mim em algumas galerias do Flickr. Considere uma qualidade ALPHA, e a minha expectativa é de que ele esteja totalmente cheio de erros.
É um pequeno projeto paralelo, então eu não espero colocar tanto esforço nele novamente, a menos que seja adotado por um número relevante de pessoas (o que, francamente, é muito improvável que aconteça).
Sendo um projeto open source, obviamente, eu tentei colocar em prática toda a infraestrutura básica (testes, padrões de código, repositório, controle de versão etc.) para tornar mais fácil para as outras pessoas trabalharem para melhorar isso. Mais uma vez, informações mais precisas estão incluídas na documentação oficial.
Opiniões
Para mim, tem sido uma boa experiência de aprendizagem, especialmente considerando o fato de que era um bom cenário para usar código assíncrono lidando com várias solicitações HTTP paralelas.
Como eu ainda o considero uma experiência de aprendizado, eu realmente adoraria que você (que provavelmente é mais experiente do que eu com Node.js) desse algumas opiniões, críticas, ideias novas. Eu ofereço caixa de comentários abaixo para essa causa.
***
Luciano Mammino faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: http://loige.co/introducing-flickr-set-get-a-command-line-app-to-download-photos/