UNPKG

node-doodles

Version:

This is a small module with which you can harness the REST API for google images known as doodles, can get images specifying the year and month of the doodle you want.

160 lines (114 loc) 4.43 kB
#!/usr/bin/env node var errorCode = require("./error.json") , doodles = require("commander") , clui = require('clui') , mkdirp = require("mkdirp") , _ = require("underscore") , fs = require("fs") , util = require("util") , path = require("path") , request = require("request") , clui = require('clui') , clc = require('cli-color'); var doodlesDir = "./doodles"; var msg = clc.xterm(15).bgXterm(34); var name = clc.xterm(15).bgXterm(161); var done = clc.xterm(15).bgXterm(12); function range (val) { var ranges = val.split('..').map(Number);//[min,max] return _.range( _.min(ranges) , _.max(ranges)+1 ); /* TEST 1- var ranges = '2010..2012'; range(ranges) //[2010,2011,2012,2013] 2- var ranges = '2012..2010'; range(ranges) //[2010,2011,2012,2013] */ };//return range from a to b numbers doodles .version(require('../package').version) .description("fetch all doodles of an specific month in a year") .option("-y, --year <n>", "Year")//get and save year in doodle from the arguments .option("-m, --month <n>", "Month")//get and save month in doodle from the arguments .option("-M, --MONTHS <a>..<b>", "range of month to get doodles separated by ..", range) .option("-Y, --YEARS <a>..<b>", "ret b number separated by ..", range) .parse(process.argv); //promise things var toJson = function(json){ try { return JSON.parse(json); } catch (e) { console.error( color.error("There was a problem processing the doodles response: %s"), err.message); }; }//parse string As Json var noDoodles = function() { console.error(errorCode.status["404"] ,doodles.year, doodles.month); process.exit(1); };//The program ends when no images var formatSizeUnits = function(bytes) { if (bytes>=1000000000) {bytes=(bytes/1000000000).toFixed(2)+' GB';} else if (bytes>=1000000) {bytes=(bytes/1000000).toFixed(2)+' MB';} else if (bytes>=1000) {bytes=(bytes/1000).toFixed(2)+' KB';} else if (bytes>1) {bytes=bytes+' bytes';} else if (bytes==1) {bytes=bytes+' byte';} else {bytes='0 byte';} return bytes; };//convert for human var download = function(doodle,index,matrix) { var url = util.format("http:%s", doodle.url) //url doesn't have the protocol information , fsExtention = url.slice(url.length - 3, url.length) //gif,jpg,png... , filename = path.join(doodlesDir, util.format("%s.%s", doodle["name"], fsExtention)); var Spinner = new clui.Spinner("Working..."); Spinner.start(); request.get(url) .on("response",function(res) { this.size = res.headers['content-length']; }) .on("end", function() { Spinner.stop(); console.log(done(" Done "),"|",name(" name "),doodle.name); var size = msg(util.format("%s %s %s"," size ","|",formatSizeUnits(this.size))); console.log(clc.move(55,-1),size,"\n"); }) .pipe(fs.createWriteStream(filename)); };//download the doodles into the doodles folder var getDoodles = function(dir,url) { request(url,function(err,res,body) { if (!err && res.statusCode === 200) { var PicDoodles = toJson(body);// PicDoodles is an array with all the doodles information if (_.isEmpty(PicDoodles)) noDoodles(); PicDoodles.forEach(download); }else { console.error(errorCode.status["500"], url); }; }); };//main function var getMultiples = function () { doodles.YEARS.forEach(function(year) { doodles.MONTHS.forEach(function(month) { var googleProvider = util.format("http://www.google.com/doodles/json/%s/%s?hl=es_419", year, month); getDoodles(doodlesDir,googleProvider); }); }); }; var makeDir = function(err) { if (err) { console.error( "There was an error creating the doodles folder: %s", err.message); process.exit(1); }else if(doodles.MONTHS && doodles.YEARS){ getMultiples(); }else { if(!doodles.year) { console.error("Please provide a year"); process.exit(1); } if(!doodles.month) { console.error( "Please provide a month" ); process.exit(1); } var googleProvider = util.format("http://www.google.com/doodles/json/%s/%s?hl=es_419", doodles.year, doodles.month); getDoodles(doodlesDir, googleProvider); //normal way } } mkdirp(doodlesDir,makeDir);