* feat(route): support fulltext mode for nyaa
* feat(route): replace parameter name
* feat(route): migrate from query parameters to route paths
* feat(route): use mode=fulltext as trigger and update namespace
* delete fulltext routes
* feat(route): add /humanlayer/blog route
Add RSS feed for HumanLayer blog (www.humanlayer.dev/blog), scraping
blog listing and full article content with cheerio.
via [HAPI](https://hapi.run)
Co-Authored-By: HAPI <noreply@hapi.run>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* refactor(route): use CSS :not() selector instead of JS filter for humanlayer blog
Address PR review feedback: move /blog/tags/ exclusion into the CSS selector
instead of using a separate .filter() call.
via [HAPI](https://hapi.run)
Co-Authored-By: HAPI <noreply@hapi.run>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(route): extract tags into category field for humanlayer blog
Parse #-prefixed tags from the meta line and populate the category field.
via [HAPI](https://hapi.run)
Co-Authored-By: HAPI <noreply@hapi.run>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(route): address review feedback for humanlayer blog
- Remove redundant :not() selector (tag links use different class)
- Simplify tag extraction from parts.slice(3).join() to parts[3]
- Fix tag regex to match hyphenated tags like best-practices
via [HAPI](https://hapi.run)
Co-Authored-By: HAPI <noreply@hapi.run>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(route): remove custom limit for humanlayer blog, use built-in
via [HAPI](https://hapi.run)
Co-Authored-By: HAPI <noreply@hapi.run>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: HAPI <noreply@hapi.run>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: zj1123581321 <zj1123581321@users.noreply.github.com>
* feat(route): make GitHub pulls title and docs consistent with issues
I'm not really a coder, but I use RSSHub to bridge GitHub updates into IRC for my community. I noticed that the `pulls.ts` route didn't show the "Open/Closed" state in the feed title like the `issues.ts` route does, which was making my users a bit confused!
I tried my best to replicate the logic and metadata structure from `issues.ts` over to `pulls.ts`.
Changes:
- Updated the feed title to dynamically show the state (Open/Closed/All) and any labels.
- Updated the parameter metadata so the documentation looks as clean and organized as the Issues page.
I've tested this locally and it’s working perfectly for my IRC tracker. Hopefully, this helps keep things consistent across the GitHub routes!
Closes#21902
* Fix title formatting in pull request response
* Comment out media object in rss_item
Comment out media object in rss_item construction
* Disable voiceInfo handling in RSS item
Comment out voiceInfo handling logic in RSS item creation.
* Update description extraction to exclude report view
* Refactor description logic in common.tsx
Refactor description extraction to remove specific images and report view paragraphs.
* Handle missing featured image in description logic
* Improve description extraction in common.tsx
Refactor description extraction logic to handle cases without a featured image more cleanly.
* feat(route): add 国际能源网 (in-en.com) news route
Add RSS route for in-en.com (国际能源网), a major Chinese energy news portal.
Supported channels via /in-en/news/:type:
- solar — 光伏太阳能
- wind — 风电
- chuneng — 储能
- h2 — 氢能
- chd — 充换电
- newenergy — 新能源综合
- power — 电力
- huanbao — 环保
Features: fetches article list from each subdomain's news page,
then retrieves full article body via detail page (cached).
Handles Chinese relative timestamps (X分钟/小时/天前).
* fix(in-en): add maintainer, fix timezone double-shift, translate comments to English
* fix(in-en): correct news paths for h2/chd/huanbao, drop date-only pubDate override
* fix(in-en): sort imports, fix numeric separators, add category field, use trueUA
* fix(in-en): address review comments
- Remove config.trueUA, use default UA
- Remove custom parseRelTime, use parseDate directly
- Fix title text extraction without cloning element
- Remove unnecessary .first() on pubDate
- Fix author: handle both em.ly and plain-text source via .prompt > span
- Simplify category field (remove redundant length check)
- Fix description selector: .article-body → #article
- Fix detail author selector: .article-meta .source a → p.source a
- Remove try-catch around detail fetch
* fix(in-en): fix author including category text and handle relative pubDate formats
* fix(in-en): use parseRelativeDate, simplify selectors, drop redundant fallbacks
- Replace hand-rolled relative-date logic with parseRelativeDate (covers
"刚刚 / N分钟前 / N小时前 / 今天 HH:MM / 昨天 HH:MM / YYYY-MM-DD"). Fixes
Invalid Date on the first few entries and resolves the two oxlint findings
(no-useless-undefined, numeric-separators-style).
- Drop the `.first()` on `.listTxt .prompt i` — each `ul.infoList > li` carries
exactly one `<i>` (date), confirmed against https://solar.in-en.com/news/.
- Author selector: `.prompt > span:first-of-type`, then strip leading "来源:".
Cheerio's `.text()` flattens `<em class="ly">…</em>` into the same string,
so this matches both shapes shown on https://solar.in-en.com/news/
(plain text vs. wrapped in em.ly).
- Category selector: `.prompt > span:not(:first-of-type) em a`, scoped to the
second span so author text never leaks in.
- Drop `|| undefined` on author and `?? ''` on description (redundant —
DataItem already accepts undefined).
- Add an HTML-shape comment pointing to the live sample URL so future
reviewers can verify the layout assumptions.
* fix(in-en): drop dead default + use new-media category
- Hono treats `:type` as compulsory (path is `/news/:type`), so users without
it never reach the handler — the `?? 'solar'` fallback was unreachable.
Replace with a non-null assertion to keep the type narrow.
- categories: 'traditional-media' → 'new-media' per review suggestion.
* feat(route/fjrb): add Fujian Daily route and namespace configuration
* feat(route/fjrb): update route to support date parameter and improve error handling
* fix(route/fjrb): standardize root URL constant usage
* fix(route/fjrb): address review comments for Fujian Daily route
* fix(route/fjrb): refactor media source retrieval to use getNodeSrc function
* fix(route/fjrb): update Fujian Daily URL to use the second level domain
* feat(route/fjdaily): add Fujian Daily route and namespace configuration
* fix(route/fjdaily): add Fujian Daily route and namespace configuration
* fix(cache): call JSON.stringify when storing value in cache.tryGet
The value is returned as-is, so we may assume that it's not JSON
stringified inside `getValueFunc`. Otherwise, the caller already needs
to distinguish between values that are either JSON parsed or not.
* Revert "fix(routes/mastodon): don't refresh account ID cache (#20663)"
This reverts commit c2cff410fa.
* test: add test
* test: lint
* feat(route/bilibili): add video-browser route using Puppeteer for video list extraction
Replace broken real-browser API dependency with getPuppeteerPage + browserless
to render Bilibili space pages and extract video data via DOM parsing. Includes
username extraction from page title and cover image detection.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(route/bilibili): fix video title extraction picking stats over actual titles
The candidate selection logic was preferring longer text (e.g. "8.3万23907:45")
over real titles (e.g. "爆肝三天,我总结了 GPT Image 2 全网最实用的玩法")
because stats strings passed the hasTitle check. Now prefer candidates that
contain Chinese characters and don't start with digits, falling back to
longest hasTitle candidate. Fixes 11/35 UIDs returning empty results.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(route/bilibili): add /user/video-browser route using Puppeteer + XHR interception
Close#20406
Bilibili upgraded anti-crawler (WBI signing) on /x/space/wbi/arc/search
in Nov 2025, causing existing /user/video/:uid to return 412.
This new route bypasses it by intercepting the browser's own API response
via Puppeteer, extracting structured JSON data (title, bvid, pic, created
timestamp, author, play/comment counts) instead of fragile DOM scraping.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(route/bilibili): fold browser mode into video route
---------
Co-authored-by: gqy20 <qingyu_ge@foxmail.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
<!--
If you have any difficulties in filling out this form, please refer to https://docs.rsshub.app/joinus/new-rss/submit-route
如果你在填写此表单时遇到任何困难,请参考 https://docs.rsshub.app/zh/joinus/new-rss/submit-route
-->
## Involved Issue / 该 PR 相关 Issue
## Example for the Proposed Route(s) / 路由地址示例
<!--
请在 `routes` 区域填写以 / 开头的完整路由地址,否则你的 PR 将会被无条件关闭。
如果路由包含在文档中列出可以完全穷举的参数(例如分类),请依次全部列出。
Please include route starts with /, with all required and optional parameters in the `routes` section. Fail to comply will result in your pull request being closed automatically.
```route
/some/route
/some/other/route
/dont/use/this/or/modify/it
/use/the/fenced/code/block/below
```
如果你的 PR 与路由无关, 请在 `routes` 区域填写 `NOROUTE`,而不是直接删除 `routes` 区域。否则你的 PR 将会被无条件关闭。
If your changes are not related to route, please fill in `routes` with `NOROUTE`. Fail to comply will result in your PR being closed.
-->
```
/nuaa/jwc/tzgg
```
## New RSS Route Checklist / 新 RSS 路由检查表
- [ ] New Route / 新的路由
- [ ] Follows [Script Standard](https://docs.rsshub.app/joinus/advanced/script-standard) / 跟随 [路由规范](https://docs.rsshub.app/zh/joinus/advanced/script-standard)
- [x] Documentation / 文档说明
- [x] Full text / 全文获取
- [ ] Use cache / 使用缓存
- [x] Anti-bot or rate limit / 反爬/频率限制
- [ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?
- [ ] [Date and time](https://docs.rsshub.app/joinus/advanced/pub-date) / [日期和时间](https://docs.rsshub.app/zh/joinus/advanced/pub-date)
- [ ] Parsed / 可以解析
- [ ] Correct time zone / 时区正确
- [ ] New package added / 添加了新的包
- [ ] `Puppeteer`
## Note / 说明
更新了 DOM 元素的解析,适配了新的南航教务处页面样式
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`
* fix(route/huxiu): fix article detail fetching
- Introduced `extractArticleId` function to extract article IDs from links.
- Added `fetchArticleDetail` function to retrieve article details using the extracted ID.
- Updated `fetchItem` to first attempt fetching article details before falling back to the original link.
- Enhanced error handling for API requests and parsing failures.
* refactor(route/huxiu): enhance data fetching and processing
- Introduced `prefixHuxiu` function to standardize titles and descriptions.
- Updated `fetchData` to handle icon URLs more robustly.
- Simplified `fetchItem` logic for better error handling and data retrieval.
- Removed unused `parseInitialState` function to clean up the codebase.
* refactor(route/huxiu): enhance data fetching and metadata building
- Replaced `fetchData` with `fetchApiRouteData` for improved data retrieval across multiple routes.
- Introduced `buildFeedMetadata` and `buildHuxiuRouteTitlePrefix` functions to standardize metadata construction.
- Updated various route handlers to utilize the new data fetching and metadata building methods, improving consistency and maintainability.
- Removed the `prefixHuxiu` function as its functionality is now integrated into the new metadata building process.