From f23b2a41fac466d421d4fa0657e2697d4e2750ee Mon Sep 17 00:00:00 2001 From: Sagie Gur-Ari Date: Thu, 27 Aug 2015 16:39:45 +0300 Subject: [PATCH] add npm total download badge via /npm/dt/{pkg} --- server.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/server.js b/server.js index b6e5eb7..b734ed1 100644 --- a/server.js +++ b/server.js @@ -1236,6 +1236,42 @@ cache(function(data, match, sendBadge, request) { }); })); +// npm total download integration. +camp.route(/^\/npm\/dt\/(.*)\.(svg|png|gif|jpg|json)$/, +cache(function (data, match, sendBadge, request) { + var pkg = encodeURIComponent(match[1]); // eg, "express" or "@user/express" + var format = match[2]; + var apiUrl = 'https://api.npmjs.org/downloads/range/1000-01-01:3000-01-01/' + pkg; // use huge range, will need to fix this in year 3000 :) + var badgeData = getBadgeData('downloads', data); + request(apiUrl, function (err, res, buffer) { + if (err != null) { + badgeData.text[1] = 'inaccessible'; + sendBadge(format, badgeData); + return; + } + + var totalDownloads = 0; + try { + var downloads = JSON.parse(buffer).downloads; + var index; + for (index = 0; index < downloads.length; index++) { + totalDownloads = totalDownloads + downloads[index].downloads; + } + } catch (e) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + return; + } + badgeData.text[1] = metric(totalDownloads) + '/total'; + if (totalDownloads === 0) { + badgeData.colorscheme = 'red'; + } else { + badgeData.colorscheme = 'brightgreen'; + } + sendBadge(format, badgeData); + }); +})); + // npm version integration. camp.route(/^\/npm\/v\/(.*)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) {