From 5b4fe8e68de4015dcaa10a8ca2fa5f644a394e7e Mon Sep 17 00:00:00 2001 From: Lukas Wolfsteiner Date: Sun, 26 Apr 2026 21:04:25 +0200 Subject: [PATCH] feat(route): add user likes activity for Hugging Face (#21838) Introduces a new route to fetch and display user likes activity from Hugging Face, including links to liked repositories and their types. The route is accessible via '/activity/:user/likes' and supports various repository types such as datasets, spaces, papers, and collections. This is done by parsing the JSON provided through the HuggingFace API. E.g.: `https://huggingface.co/api/users/dotwee/likes` --- lib/routes/huggingface/user-likes.ts | 80 ++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 lib/routes/huggingface/user-likes.ts diff --git a/lib/routes/huggingface/user-likes.ts b/lib/routes/huggingface/user-likes.ts new file mode 100644 index 000000000000..173292853436 --- /dev/null +++ b/lib/routes/huggingface/user-likes.ts @@ -0,0 +1,80 @@ +import type { Route } from '@/types'; +import ofetch from '@/utils/ofetch'; +import { parseDate } from '@/utils/parse-date'; + +interface LikedRepo { + name: string; + type: string; +} + +interface UserLike { + createdAt: string; + repo: LikedRepo; +} + +const getRepoLink = (repo: LikedRepo): string => { + switch (repo.type) { + case 'dataset': + return `https://huggingface.co/datasets/${repo.name}`; + case 'space': + return `https://huggingface.co/spaces/${repo.name}`; + case 'paper': + return `https://huggingface.co/papers/${repo.name}`; + case 'collection': + return `https://huggingface.co/collections/${repo.name}`; + default: + return `https://huggingface.co/${repo.name}`; + } +}; + +export const route: Route = { + path: '/activity/:user/likes', + categories: ['programming'], + example: '/huggingface/activity/dotwee/likes', + parameters: { + user: 'Hugging Face username', + }, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['huggingface.co/:user/activity/likes'], + target: '/activity/:user/likes', + }, + ], + name: 'User Likes Activity', + maintainers: ['dotwee'], + handler, + url: 'huggingface.co', +}; + +async function handler(ctx) { + const { user } = ctx.req.param(); + const link = `https://huggingface.co/${user}/activity/likes`; + + const likes = await ofetch(`https://huggingface.co/api/users/${user}/likes`); + + const items = likes.map((like) => { + const repoType = like.repo.type || 'model'; + + return { + title: `${user} liked ${like.repo.name}`, + link: getRepoLink(like.repo), + description: `${user} liked this ${repoType}.`, + category: [repoType], + pubDate: parseDate(like.createdAt), + }; + }); + + return { + title: `${user} - Likes Activity`, + link, + item: items, + }; +}