diff --git a/server.js b/server.js index 88af91f..3f1a140 100644 --- a/server.js +++ b/server.js @@ -3745,8 +3745,9 @@ function mapNugetFeedv2(pattern, offset, getInfo) { function mapNugetFeed(pattern, offset, getInfo) { var vRegex = new RegExp('^\\/' + pattern + '\\/v\\/(.*)\\.(svg|png|gif|jpg|json)$'); var vPreRegex = new RegExp('^\\/' + pattern + '\\/vpre\\/(.*)\\.(svg|png|gif|jpg|json)$'); + var dtRegex = new RegExp('^\\/' + pattern + '\\/dt\\/(.*)\\.(svg|png|gif|jpg|json)$'); - function getNugetVersion(apiUrl, id, includePre, request, done) { + function getNugetData(apiUrl, id, request, done) { // get service index document regularUpdate(apiUrl + '/index.json', // The endpoint changes once per year (ie, a period of n = 1 year). @@ -3761,22 +3762,20 @@ function mapNugetFeed(pattern, offset, getInfo) { function(buffer) { var data = JSON.parse(buffer); - var autocompleteResources = data.resources.filter(function(resource) { - return resource['@type'] === 'SearchAutocompleteService'; + var searchQueryResources = data.resources.filter(function(resource) { + return resource['@type'] === 'SearchQueryService'; }); - return autocompleteResources; + return searchQueryResources; }, - function(err, autocompleteResources) { + function(err, searchQueryResources) { if (err != null) { done(err); return; } // query autocomplete service - var randomEndpointIdx = Math.floor(Math.random() * autocompleteResources.length); - var reqUrl = autocompleteResources[randomEndpointIdx]['@id'] - + '?id=' + encodeURIComponent(id.toLowerCase()) // NuGet package id (lowercase) - + '&prerelease=true' // Include prerelease versions? - + '&skip=0' // Start at first package found - + '&take=5000'; // Max. number of results + var randomEndpointIdx = Math.floor(Math.random() * searchQueryResources.length); + var reqUrl = searchQueryResources[randomEndpointIdx]['@id'] + + '?q=packageid:' + encodeURIComponent(id.toLowerCase()) // NuGet package id (lowercase) + + '&prerelease=true'; // Include prerelease versions? request(reqUrl, function(err, res, buffer) { if (err != null) { @@ -3786,23 +3785,37 @@ function mapNugetFeed(pattern, offset, getInfo) { try { var data = JSON.parse(buffer); - var versions = data.data; - if (!includePre) { - // Remove prerelease versions. - var filteredVersions = versions.filter(function(version) { - return !/-/.test(version); - }); - if (filteredVersions.length > 0) { - versions = filteredVersions; - } + if (!Array.isArray(data.data) || data.data.length !== 1) { + done(new Error('Package not found in feed')); + return; } - var lastVersion = versions[versions.length - 1]; - done(null, lastVersion); + done(null, data.data[0]); } catch (e) { done(e); } }); }); } + function getNugetVersion(apiUrl, id, includePre, request, done) { + getNugetData(apiUrl, id, request, function(err, data) { + if (err) { + done(err); + return; + } + var versions = data.versions || []; + if (!includePre) { + // Remove prerelease versions. + var filteredVersions = versions.filter(function(version) { + return !/-/.test(version.version); + }); + if (filteredVersions.length > 0) { + versions = filteredVersions; + } + } + var lastVersion = versions[versions.length - 1]; + done(null, lastVersion.version); + }); + } + camp.route(vRegex, cache(function(data, match, sendBadge, request) { var info = getInfo(match); @@ -3864,6 +3877,34 @@ function mapNugetFeed(pattern, offset, getInfo) { } }); })); + + + camp.route(dtRegex, + cache(function(data, match, sendBadge, request) { + var info = getInfo(match); + var repo = match[offset + 1]; // eg, `Nuget.Core`. + var format = match[offset + 2]; + var apiUrl = info.feed; + var badgeData = getBadgeData('downloads', data); + getNugetData(apiUrl, repo, request, function(err, nugetData) { + if (err != null) { + badgeData.text[1] = 'inaccessible'; + sendBadge(format, badgeData); + return; + } + try { + // Official NuGet server uses "totalDownloads" whereas MyGet uses + // "totaldownloads" (lowercase D). Ugh. + var downloads = nugetData.totalDownloads || nugetData.totaldownloads || 0; + badgeData.text[1] = metric(downloads); + badgeData.colorscheme = downloadCountColor(downloads); + sendBadge(format, badgeData); + } catch(e) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + } + }); + })); } // Chocolatey diff --git a/try.html b/try.html index e9f5bf7..ebcc052 100644 --- a/try.html +++ b/try.html @@ -280,6 +280,18 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/chocolatey/dt/scriptcs.svg
https://img.shields.io/nuget/dt/Microsoft.AspNetCore.Mvc.svg
https://img.shields.io/myget/mongodb/dt/MongoDB.Driver.Core.svg
https://img.shields.io/dotnet.myget/dotnet-coreclr/dt/Microsoft.DotNet.CoreCLR.svg
https://img.shields.io/pypi/dm/Django.svg