Skip to content

Commit 4d2b666

Browse files
authored
feat: Add monthly HF downloads, add scheduler (#20)
* Add hf downloads * Add schedule
1 parent d51c402 commit 4d2b666

File tree

4 files changed

+65
-2
lines changed

4 files changed

+65
-2
lines changed

.github/workflows/deploy.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ on:
44
push:
55
branches: [main]
66
workflow_dispatch:
7+
schedule:
8+
- cron: '0 6 * * 1'
79

810
permissions:
911
contents: read
@@ -22,6 +24,9 @@ jobs:
2224
uses: actions/checkout@v5
2325
- name: Install, build, and upload site
2426
uses: withastro/action@v5
27+
env:
28+
MINISH_GITHUB_TOKEN: ${{ secrets.MINISH_GITHUB_TOKEN }}
29+
PEPY_API_KEY: ${{ secrets.PEPY_API_KEY }}
2530

2631
deploy:
2732
needs: build

src/components/home/HomepageSocialProof.astro

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,16 @@ const totals = await getHomepageTotals();
2929
<span class="hero-proof-label">Package downloads</span>
3030
</span>
3131
</span>
32+
{typeof totals.monthlyModelDownloads === 'number' && totals.monthlyModelDownloads > 0 && (
33+
<span
34+
class="hero-proof-chip hero-proof-chip-hf"
35+
title={`${formatExactNumber(totals.monthlyModelDownloads)} model downloads in the last 30 days on Hugging Face`}
36+
>
37+
<span class="hero-proof-icon hero-proof-icon-downloads" aria-hidden="true"></span>
38+
<span class="hero-proof-copy">
39+
<span class="hero-proof-value">{formatCompactNumber(totals.monthlyModelDownloads)}+</span>
40+
<span class="hero-proof-label">Monthly model downloads</span>
41+
</span>
42+
</span>
43+
)}
3244
</div>

src/data/homepageMetrics.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,20 @@ type PepyResponse = {
103103
total_downloads?: number;
104104
};
105105

106+
type HuggingFaceModelResponse = {
107+
downloads?: number;
108+
};
109+
106110
const PEPY_API_KEY = import.meta.env.PEPY_API_KEY;
107111
const GITHUB_TOKEN = import.meta.env.MINISH_GITHUB_TOKEN;
108112
const REQUEST_HEADERS = {
109113
Accept: 'application/json',
110114
'User-Agent': 'minish-docs-build',
111115
};
116+
const HUGGING_FACE_AUTHOR = 'minishlab';
112117

113118
let homepageMetricsPromise: Promise<HomepagePackageMetrics[]> | undefined;
119+
let huggingFaceMonthlyDownloadsPromise: Promise<number | undefined> | undefined;
114120

115121
async function fetchJson<T>(url: string, extraHeaders: Record<string, string> = {}) {
116122
const response = await fetch(url, {
@@ -153,6 +159,19 @@ async function fetchDownloads(source: DownloadSource) {
153159
return typeof data.total_downloads === 'number' ? data.total_downloads : undefined;
154160
}
155161

162+
async function fetchHuggingFaceMonthlyDownloads() {
163+
const params = new URLSearchParams({
164+
author: HUGGING_FACE_AUTHOR,
165+
limit: '100',
166+
full: 'true',
167+
});
168+
const models = await fetchJson<HuggingFaceModelResponse[]>(
169+
`https://huggingface.co/api/models?${params.toString()}`,
170+
);
171+
172+
return models.reduce((sum, model) => sum + (model.downloads ?? 0), 0);
173+
}
174+
156175
async function resolvePackageMetrics(pkg: HomepagePackageDefinition): Promise<HomepagePackageMetrics> {
157176
const [stars, downloads] = await Promise.all([
158177
fetchGithubStars(pkg.githubRepo).catch(() => undefined),
@@ -172,13 +191,23 @@ export async function getHomepagePackageMetrics() {
172191
}
173192

174193
export async function getHomepageTotals() {
175-
const packages = await getHomepagePackageMetrics();
194+
const [packages, monthlyModelDownloads] = await Promise.all([
195+
getHomepagePackageMetrics(),
196+
(huggingFaceMonthlyDownloadsPromise ??=
197+
fetchHuggingFaceMonthlyDownloads().catch(() => undefined)),
198+
]);
199+
176200
return packages.reduce(
177201
(totals, pkg) => ({
178202
stars: totals.stars + pkg.stars,
179203
downloads: totals.downloads + pkg.downloads,
204+
monthlyModelDownloads: totals.monthlyModelDownloads,
180205
}),
181-
{ stars: 0, downloads: 0 },
206+
{
207+
stars: 0,
208+
downloads: 0,
209+
monthlyModelDownloads,
210+
},
182211
);
183212
}
184213

src/styles/custom.css

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,12 @@ main:has(.pkg-list) .hero {
148148
rgba(74, 82, 70, 0.045);
149149
}
150150

151+
.hero-proof-chip-hf {
152+
background:
153+
linear-gradient(180deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.04) 100%),
154+
rgba(34, 151, 94, 0.045);
155+
}
156+
151157
.hero-proof-copy {
152158
display: flex;
153159
flex-direction: column;
@@ -222,6 +228,12 @@ main:has(.pkg-list) .hero {
222228
rgba(226, 236, 228, 0.024);
223229
}
224230

231+
[data-theme='dark'] .hero-proof-chip-hf {
232+
background:
233+
linear-gradient(180deg, rgba(255, 255, 255, 0.014) 0%, rgba(255, 255, 255, 0) 100%),
234+
rgba(126, 216, 148, 0.03);
235+
}
236+
225237
[data-theme='dark'] .hero-proof-value {
226238
color: rgba(238, 244, 238, 0.94);
227239
}
@@ -919,6 +931,11 @@ main:has(.pkg-list) .hero {
919931
line-height: 1.15;
920932
}
921933

934+
.hero-proof-chip-hf {
935+
grid-column: 1 / -1;
936+
justify-self: start;
937+
}
938+
922939
.pkg-row {
923940
flex-direction: column;
924941
align-items: flex-start;

0 commit comments

Comments
 (0)