From e5103a1781b0d95cd9426246d88db000ffc5595a Mon Sep 17 00:00:00 2001 From: sanemat Date: Tue, 5 Apr 2016 22:00:44 +0900 Subject: [PATCH] Add chrome extension support * Version, Downloads, Price, Rating and Rating Count for chrome app, chrome extension and chrome theme. * Google does not provide a public API for chrome web store. * Use `chrome-web-store-item-property`. * Gather meta information from chrome web store. see #505, #636 --- package.json | 3 ++- server.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ try.html | 20 ++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 0e44c43..31673a5 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "camp": "~16.0.0", "semver": "~4.3.3", "bower": "~1.4.1", - "promise": "~7.0.0" + "promise": "~7.0.0", + "chrome-web-store-item-property": "^1.1.2" }, "devDependencies": { "ass": "~0.0.6", diff --git a/server.js b/server.js index 13eab15..09930f8 100644 --- a/server.js +++ b/server.js @@ -4965,6 +4965,54 @@ cache(function(data, match, sendBadge, request) { }); })); +// Chrome web store integration +camp.route(/^\/chrome-web-store\/(v|d|price|rating|rating-count)\/(.*)\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var type = match[1]; + var storeId = match[2]; // eg, nimelepbpejjlbmoobocpfnjhihnpked + var format = match[3]; + var badgeData = getBadgeData('chrome web store', data); + var url = 'https://chrome.google.com/webstore/detail/' + storeId + '?hl=en&gl=US'; + var chromeWebStore = require('chrome-web-store-item-property'); + request(url, function(err, res, buffer) { + if (err != null) { + badgeData.text[1] = 'inaccessible'; + sendBadge(format, badgeData); + return; + } + chromeWebStore.convert(buffer) + .then(function (value) { + if (type === 'v') { + var vdata = versionColor(value.version); + badgeData.text[1] = vdata.version; + badgeData.colorscheme = vdata.color; + } else if (type === 'd') { + var downloads = value.interactionCount.UserDownloads; + badgeData.text[0] = 'downloads'; + badgeData.text[1] = metric(downloads) + ' total'; + badgeData.colorscheme = downloadCountColor(downloads); + } else if (type === 'price') { + badgeData.text[1] = value.price; + badgeData.colorscheme = 'brightgreen'; + } else if (type === 'rating') { + var rating = Math.round(value.ratingValue * 100) / 100; + badgeData.text[0] = 'rating'; + badgeData.text[1] = rating; + badgeData.colorscheme = floorCountColor(rating, 2, 3, 4); + } else if (type === 'rating-count') { + var ratingCount = value.ratingCount; + badgeData.text[0] = 'rating count'; + badgeData.text[1] = metric(ratingCount) + ' total'; + badgeData.colorscheme = floorCountColor(ratingCount, 5, 50, 500); + } + sendBadge(format, badgeData); + }).catch(function (err) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + }); + }); +})); + // Any badge. camp.route(/^\/(:|badge\/)(([^-]|--)*?)-(([^-]|--)*)-(([^-]|--)+)\.(svg|png|gif|jpg)$/, function(data, match, end, ask) { diff --git a/try.html b/try.html index eecf583..3956fbe 100644 --- a/try.html +++ b/try.html @@ -383,6 +383,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/packagecontrol/dt/Package%20Control.svg + Chrome Web Store: + + https://img.shields.io/chrome-web-store/d/nimelepbpejjlbmoobocpfnjhihnpked.svg +

Version

@@ -514,6 +518,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable + + + +
https://img.shields.io/dub/v/vibe-d.svg
Chrome Web Store: https://img.shields.io/chrome-web-store/v/nimelepbpejjlbmoobocpfnjhihnpked.svg

Social

@@ -754,6 +762,18 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/waffle/label/evancohen/smart-mirror/in%20progress.svg + Chrome Web Store: + + https://img.shields.io/chrome-web-store/price/nimelepbpejjlbmoobocpfnjhihnpked.svg + + Chrome Web Store: + + https://img.shields.io/chrome-web-store/rating/nimelepbpejjlbmoobocpfnjhihnpked.svg + + Chrome Web Store: + + https://img.shields.io/chrome-web-store/rating-count/nimelepbpejjlbmoobocpfnjhihnpked.svg +

Longer Miscellaneous