Commit Graph

8725 Commits

Author SHA1 Message Date
Tony a2861cdd4f
fix: update rss-parser patch to support other compressions (#21561) 2026-03-30 22:22:24 +00:00
Tony 7d2baa89e5
fix(routes): remove hard-coded UA and use header presets (#21559) 2026-03-31 00:40:26 +08:00
Luke D Williams 482ad1cb80
feat(route/locals): add content feed (#21542)
* feat(route/locals): add authenticated feed route

Add a Locals route with auth_token-based feed fetching, classic-to-beta URL fallback, and support for community, home, content, and content_plus feed views. Parse feed pages into RSS items using shared post selectors while surfacing clear errors when access is unavailable.

* feat(route/locals): add content feed

Add a Locals content route that uses the authenticated session-backed server functions instead of brittle page scraping. Support tier filters and media-type filters so paid and content-library posts can be subscribed to reliably.

* fix(route/locals): include content thumbnails

Use Locals preview and audio image fields so content and podcast entries expose thumbnails consistently. Render the image into item descriptions and standard image fields for better feed reader compatibility.

* fix(route/locals): include regular content posts

Keep Locals content feeds from dropping regular text and photo posts that arrive as no_content entries with real body content. Preserve image handling while leaving plus feeds unchanged when the source only returns five content-plus items.

* fix(route/locals): prefer content poster images

Prefer Locals poster-style preview images over raw first-frame captures when both are available. Keep the raw frame fallback for posts where the API does not expose a styled poster image.

* fix(route/locals): resolve runtime action ids

Derive the Locals feed action id from the current runtime assets instead of hardcoding build-specific server function ids. Tighten option validation with own-key checks and align the radar source with supported matching rules.

* fix(config): sort locals session settings

Move the Locals session env key and config blocks into alphabetical order so the route-specific configuration matches the repository's config layout rules.

* fix(config): reorder locals session settings

* fix(route/locals): simplify route and request handling

* fix(config): restore locals config ordering

* fix(config): sort security key entry

* fix(route/locals): adjust message clarity of path parameter necessity
2026-03-30 05:44:45 +08:00
Tony 6ae3f644bf
fix(route/kyodonews): update page selectors (#21549)
* fix(route/kyodonews): update page selectors

* Apply suggestion from @TonyRL

* Update lib/routes/kyodonews/index.tsx
2026-03-30 03:57:29 +08:00
Tony 63633560d1
fix(route/typst): fix typst (#21547) 2026-03-29 23:38:38 +08:00
Tony 7ab0d1eff4
fix(ua): ensure header-generator and custom ua are effective with each other (#21546)
* fix(ua): ensure header-generator and custom ua are effective with each other

* fix(ua): review comment
2026-03-29 22:47:56 +08:00
pseudoyu cacb6e46c6
feat(route/joneslanglasalle): add hk support 2026-03-28 20:30:40 +08:00
pseudoyu 0ef804c931
fix(route/nhentai): fetch failed issue 2026-03-28 19:46:34 +08:00
pseudoyu 898dcc1d18
chore: add missing maintainers 2026-03-28 19:25:45 +08:00
pseudoyu 16d80122c6
fix(route/joneslanglasalle): migrate to new website 2026-03-28 19:25:30 +08:00
pseudoyu 574fb663c2
fix(route/qiche365): use set cookie to fix fetch failed issue 2026-03-28 18:48:32 +08:00
pseudoyu 8ed4034b09
fix(route/caus): migrate to wordpress api 2026-03-28 16:17:17 +08:00
pseudoyu 881a9d895f
fix(route/qidian): anticrawl issue 2026-03-28 15:58:28 +08:00
pseudoyu f85a159881
fix(route/rfi): parsing result logics 2026-03-28 15:29:55 +08:00
pseudoyu 6fc6b9cccf
fix(route/discuz): cannot read properties of undefined 2026-03-28 15:19:23 +08:00
pseudoyu 1e7f5a65f8
fix(route/digitalpolicyalert): result parsing logics 2026-03-28 15:10:11 +08:00
pseudoyu 6daac07f55
feat(route/the): migrate to river.to 2026-03-28 14:41:02 +08:00
Tony a48ad7b4ae chore: bump transitive deps
brace-expansion
2026-03-28 01:43:37 +08:00
pseudoyu e9e9546d75
fix(route/18comic): result filter issue 2026-03-27 20:52:43 +08:00
pseudoyu 614a466a6d
fix(route/theinitium): migrate to ghost cms api 2026-03-27 20:39:04 +08:00
pseudoyu 8988948f0a
fix(route/jinse): use jinse.com.cn domain 2026-03-27 19:26:44 +08:00
pseudoyu ba09c4da6c
fix(route/jiemian): wrong articles from list 2026-03-27 19:13:43 +08:00
pseudoyu ab63633b95
fix(route/udn): use new api 2026-03-27 18:27:30 +08:00
pseudoyu a7ca7c558c
fix(route/fanbox): add withPinned query param 2026-03-27 18:12:15 +08:00
Tony 5ae7432b26
fix(ofetch): use late-binding fetch in ofetch to ensure request-rewriter intercepts bundled builds (#21518) 2026-03-26 21:24:46 +08:00
TimoYoung 3086b7784f
fix(route/2048): fix captcha handling and update cookie management (#21512)
* fix(route/2048): fix captcha handling and update cookie management

- Removed outdated cookie handling logic and replaced it with safeid extraction from the captcha HTML.
- Updated the response structure to use safeid instead of safe18Pass for cookie management.
- Enhanced enclosure extraction logic to support new sources。

* chore(route/2048): remove unused renderToString import

Made-with: Cursor

* fix(route/2048): prioritize magnet-text and reuse read_tpc node

Made-with: Cursor
2026-03-26 18:41:35 +08:00
studyinglover 4200769d1a
feat(route/xupt): add XUPT JYC notifications route (#21451) 2026-03-26 18:02:55 +08:00
FeCCC a0e75a2f10
fix(route/iwara): use puppeteer to fix subscriptions route (#21495)
* fix(route/iwara): use puppeteer to fix subscriptions route

* style: auto format

* style(route/iwara): remove unnecessary async keyword in fetchApi

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-26 03:06:13 +08:00
Zhenlong Huang 6dd8e83105
feat(route): Add route of dewu tech blogs (#21504) 2026-03-25 23:36:21 +08:00
Tony d0c386f9a6
chore: unpin jsdom (#21505)
* fix(server): update export syntax for app-bootstrap import

* chore(deps): upgrade jsdom to version 29.0.1 and related type definitions

* chore(vercel): remove unused functions configuration from vercel.json

* chore: add vercel cli

* fix: cleanup

* chore: unpin jsdom
2026-03-25 23:16:40 +08:00
github-actions[bot] 6e134d32d5 style: auto format 2026-03-25 10:35:56 +00:00
Tony 79a525cbd3 refactor: add GraphQL annotation to queries for auto formatting in oxfmt v0.42
0fe46fe333
2026-03-25 18:34:13 +08:00
github-actions[bot] 0fe46fe333 style: auto format 2026-03-25 09:24:21 +00:00
dependabot[bot] df6b73d866
chore(deps-dev): bump msw from 2.4.3 to 2.12.14 (#21483)
* chore(deps-dev): bump msw from 2.4.3 to 2.12.14

Bumps [msw](https://github.com/mswjs/msw) from 2.4.3 to 2.12.14.
- [Release notes](https://github.com/mswjs/msw/releases)
- [Changelog](https://github.com/mswjs/msw/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mswjs/msw/compare/v2.4.3...v2.12.14)

---
updated-dependencies:
- dependency-name: msw
  dependency-version: 2.12.14
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: remove supertest

MSW's setupServer() works by patching Node's http module (via @mswjs/interceptors) to intercept outgoing requests. supertest's requests to http://127.0.0.1:1200 go through the same patched http module which causes server bad request

* chore(patch): add patch for @mswjs/interceptors@0.41.3

* fix(server): update server listen options to bypass unhandled requests

* chore: update patch for @mswjs/interceptors

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
2026-03-25 02:31:42 +08:00
Tony 86088852ab
test(header-generator): improve header validation (#21492) 2026-03-24 23:37:28 +08:00
LinxHex 697c3d6edb
fix(route/landiannews): sanitize rendered titles (#21461)
* fix(route/landiannews): sanitize rendered titles

* refactor(route/landiannews): use sanitize-html for titles
2026-03-24 21:39:50 +08:00
Qiang Huang e3a0e74254
fix(route/likeshop): Likeshop API now supports title attribute (#21484) 2026-03-24 04:15:08 +08:00
Enoch Ma 122a5343cb
feat(route/aeon): improve compatibility by enforcing the correct jpg enclosure type (#21470)
* Enforce enclosure type

* remove trailing space
2026-03-23 09:58:57 +08:00
Solitudinis e86c679a92
feat(route/cursor): support localized blog and changelog routes (#21390) 2026-03-20 23:15:55 +08:00
LinxHex f69c416291
feat(apple): add full-text Apple Newsroom route (#21384)
* feat(apple): add full-text Apple Newsroom route

Add /apple/newsroom for the official Apple Newsroom China feed.
Fetch article pages to provide full-text content with cached detail requests, and normalize article metadata and media URLs.
Remove gallery navigation, download buttons, video playback controls, empty wrapper nodes, and other non-content UI elements from articles.
Format image and video captions as distinct descriptions, and drop duplicate captions when their text matches the article body.

* fix(apple): sanitize dangerous media URLs in newsroom route

* fix(route): refine Apple Newsroom route metadata and request handling

* fix(route): simplify Apple Newsroom description cleanup
2026-03-20 22:18:15 +08:00
Yang Zhi d097ce525a
feat(route): add perplexity blog (#21436)
* feat(route): add perplexity blog

Add route for Perplexity blog at /perplexity/blog, scraping
perplexity.ai/hub with Puppeteer. Extracts featured and regular
articles using data-framer-name selectors, deduplicates responsive
layout copies, and fetches full article text from detail pages.

* fix(route/perplexity): deduplicate article body text from Framer responsive copies

* fix(route/perplexity): return HTML content instead of plain text for article descriptions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 19:34:12 +08:00
Enoch Ma 9780b3ed02
fix(route/nautil): change url (#21452) 2026-03-20 03:50:04 +00:00
Enoch Ma d6f8ca5b33
feat(route/openalex): Filter out news articles from research articles (#21444) 2026-03-19 12:24:10 +08:00
Tony a3f06e485c
feat: esm directory import (#21428) 2026-03-18 15:15:28 +08:00
DIYgod 4568a6a6ab feat: add promotion 2026-03-17 15:59:10 +08:00
Tony ed6b1924c9 fix(route): update language parameter regex in zhonglun route 2026-03-17 02:05:38 +08:00
Zdenek Stursa d2d4955b18
feat(route): add Inception Labs blog route (#21386)
* feat(routes): add Inception Labs blog route

Adds RSS feed for https://www.inceptionlabs.ai/blog/

The page is built with Framer and served as SSR HTML, so no Puppeteer
is required — a regular HTTP fetch with a browser User-Agent suffices.

Two distinct blog card layouts are handled:
- Standard card: date and category in [data-framer-name="Date"] elements
- Featured card: date inside a <mark> element, category in [data-framer-name="Category"]

Each item includes title, publication date, author, category, and the
full article body extracted from [data-framer-name="Content"].

Route: /inceptionlabs/blog
Example: /inceptionlabs/blog

* refactor(routes/inceptionlabs): address review feedback

- Fix categories: technology -> programming (valid Category type)
- Remove redundant radar source (inceptionlabs.ai redirects to www)
- Add maintainer GitHub ID
- Replace custom PostMeta interface with existing DataItem type
- Use [data-framer-name="Desktop"] selector to avoid SSR duplicates
- Refactor card collection from .each()/push to .map()/.filter()

---------

Co-authored-by: Zdenek <tvuj-email@example.com>
2026-03-16 23:20:37 +08:00
LinxHex c97a5a286f
feat(weibo): apply description render params to comments (#21389) 2026-03-16 21:09:59 +08:00
Dachein 85b5444d07
fix(route/apple/podcast): adapt to new serialized-server-data structure (#21387)
Apple Podcasts changed the `#serialized-server-data` element from a
direct array to an object wrapper `{ data: [...], userTokenHash }`.

This broke the route with:
  TypeError: Cannot read properties of undefined (reading 'data')

Changes:
- Handle both old (array) and new (object with `data` key) formats
  using `Array.isArray()` check for backward compatibility
- Add defensive optional chaining on the `channel` relationship
  access chain to prevent crashes when episodes lack channel data

Fixes the same underlying issue reported by yt-dlp (yt-dlp/yt-dlp#15926).

Made-with: Cursor

Co-authored-by: xbankeradmin <admin@xbanker.ai>
2026-03-16 19:58:24 +08:00
Tony bb98fff269 fix(radar): update radar sources for multiple routes 2026-03-16 12:23:24 +08:00
tmr f9c5068797
fix(jike): update radar source for user and topic (#21395)
* fix(jike): update radar source for user and topic

* fix: split fqdn
2026-03-16 11:55:48 +08:00
tmr 9497007109
feat(routes/cognition): add category support to cognition blog route (#21394)
* feat(routes/cognition): add category support to blog route

- Add optional category parameter to blog route path
- Update radar configuration to support category routes
- Add new maintainer ttttmr
- Modify handler to handle category parameter

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove unused Data import and add missing parameters field

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-03-15 22:18:03 +08:00
github-actions[bot] 4fc49da946 style: auto format 2026-03-13 15:58:11 +00:00
LinxHex df6572b659
fix(routes/miyuki): format news titles with bracketed categories and keep full-text body-only (#21377)
* fix(routes/miyuki): format news titles with bracketed categories and keep full-text body-only

* fix(routes/miyuki): clean news body extraction and normalize images

- Updated lib/routes/miyuki/news.ts to keep item titles as plain article titles and store category information only in the `category` field.
- Switched the route to use the canonical Miyuki domain and added the route `url` metadata.
- Refined full-text extraction so `description` keeps only the main article body and excludes page header metadata such as section title, article title, date, and category.
- Fixed malformed article-body handling for pages like `10217`, where the source HTML structure breaks the original body selector.
- Normalized article images by deduplicating `for_pc` / `for_sp` duplicates, converting relative image URLs to absolute URLs, and replacing list-based photo blocks with plain containers so RSS readers do not render black bullets.
- Resolved the related CodeFactor/lint issues and verified the file with `oxlint` and `eslint`.

* feat(apple): add full-text Apple Newsroom route

Add /apple/newsroom for the official Apple Newsroom China feed.
Fetch article pages to provide full-text content with cached detail requests, and normalize article metadata and media URLs.
Remove gallery navigation, download buttons, video playback controls, empty wrapper nodes, and other non-content UI elements from articles.
Format image and video captions as distinct descriptions, and drop duplicate captions when their text matches the article body.

* fix(routes/miyuki): simplify image handling in news descriptions

* Remove unrelated changes from PR
2026-03-13 23:57:36 +08:00
Tony 3046b6c8c5 fix: update CryptoJS import path in hqsz route 2026-03-13 01:55:24 +08:00
Sauce dcbe25be59
fix(route/bilibili/weekly): await all async items before storing in cache (#21365) 2026-03-12 16:46:18 +00:00
Zhenlong Huang d59c3eed55
feat(route): add claude blog route (#21348)
* feat(route/claude): Add claude.ai blog rss

Made-with: Cursor

* fix maintainer
2026-03-11 14:37:57 +08:00
Rigo 09a2886506
feat(route/claude): add claude code changelog route (#21347)
* feat(route/claude): add claude code changelog route

* fix: route title rule#2

* Update lib/routes/claude/code-changelog.ts

---------
2026-03-11 13:58:18 +08:00
Tony 8637e63dec feat: redirect `/picnob` to `/picnob.info` 2026-03-11 02:03:34 +08:00
YuruShiMaShiMaRin e2c991a0ed
feat(comic-walker.com): 新添一个路由 (#21310)
* add route

* style: auto format

* Update manga.ts

* Update manga.ts

* ts -> tsx

* Update manga.tsx

* 没法了,这是我最后的手段了(

* Update manga.ts

* Update manga.ts

* Update manga.ts

* Update manga.ts

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-11 00:44:18 +08:00
niuyi b55864eed0
feat(route/sdu): 添加山东大学研究生招生信息网路由 (#21331)
* feat(route/sdu): 添加山东大学研究生招生信息网路由

* feat(route/sdu): 更新山东大学研究生招生信息网路由信息

* feat(route/sdu): 更新研究生招生信息网名称
2026-03-10 23:33:45 +08:00
Tony 085a0ea8ff
fix(route/yahoo): remove ads (#21330) 2026-03-10 02:30:50 +08:00
Leslie Leung 626d289580
fix: parse VXNA entry date (#21325) 2026-03-09 08:11:48 +00:00
lucky13820 8d8a435a48
fix(route/theinitium): rewrite for Ghost CMS after site migration (#21071)
* refactor(theinitium): rewrite routes for Ghost CMS, add cookie support

- Rewrite all routes to use Ghost Content API (old API deprecated)
- Add INITIUM_MEMBER_COOKIE env var for paid article full-text
- Add features block with requireConfig to all route files
- Add url field and radar rules per RSSHub standards
- Strip -zh-hans suffix from author/category display names
- Update namespace with English name and zh translations
- Mark follow route as deprecated (Ghost doesn't support it)
- Fix hostname binding to 0.0.0.0 for LAN access

* fix(theinitium): use routeExpire with refresh=false to prevent stale cache

Cache was never expiring because refresh=true (default) extends TTL on every hit.
Now uses 5-min routeExpire and won't extend on access.

* refactor(theinitium): address review feedback

- Remove unused INITIUM_USERNAME/PASSWORD/BEARER_TOKEN env keys
- Remove hardcoded User-Agent (use RSSHub's internal UA)
- Remove fragile html.length > 500 check
- Remove refresh: false from cache.tryGet
- Hoist stripLangSuffix to module scope (dedupe with cleanName)

* fix(theinitium): detect paywall CTA instead of length check

If cookie is invalid/expired, scrape returns paywall HTML.
Check for .gh-post-upgrade-cta to detect this and fall back
to cleaner Ghost API preview.

* revert(index): restore '::' hostname per #16513

* feat(theinitium): clean Ghost Koenig card HTML for RSS output

* fix(theinitium): use redirected Ghost API URL, remove unused config types

* fix(theinitium): remove unrelated neureality config changes

---------

Co-authored-by: Ryan Yao <ryanyao@Macmini.lan>
Co-authored-by: Ryan Yao <ryanyao@Ryans-Mac-mini.lan>
Co-authored-by: Ryan Yao <ryanyao@Ryans-Mac-mini.local>
2026-03-09 04:13:25 +08:00
github-actions[bot] 5277218f01 style: auto format 2026-03-08 19:29:14 +00:00
acidicxjrl 7c5c66a75b
feat(routes): Add img=1 option to pornhub handlers to pass through images (#21324)
* Add img=1 option to pornhub handlers to pass through images

* Move img=1 to a path parameter, and add clarifications on :lang, etc because each must be set to set the following

---------

Co-authored-by: acidicxjrl <acidicxjrl>
2026-03-09 03:28:42 +08:00
github-actions[bot] 1ad606f40f style: auto format 2026-03-08 07:53:45 +00:00
Hualiang 8bf78f5316
feat(route): add news.qq.com user homepage route (#21280)
* add user.ts

* remove async

* use relative path

* update

* fix timestamp

* use parseDate

* try to fix import-sort?
2026-03-08 15:53:10 +08:00
Dzming Li 5469b02b2b
fix(route/zhihu): auto-fetch `__zse_ck` when absent from `ZHIHU_COOKIES` (#21321)
When ZHIHU_COOKIES is configured without __zse_ck, automatically fetch
the value from Zhihu's public static JS (static.zhihu.com/zse-ck/v3.js).

__zse_ck is a site-wide token (not user-specific) that Zhihu embeds in
a static JS file and rotates periodically. When it expires, routes that
scrape HTML pages (e.g. /zhihu/posts/people/:id) return 403, while
API-only routes are unaffected.

Users can now omit __zse_ck from ZHIHU_COOKIES and it will be fetched
and cached automatically, eliminating manual cookie rotation for this
token. Existing configs that include __zse_ck are unchanged.
2026-03-07 10:27:43 +08:00
chesha1 1c5e4b3702
fix(route/openai): 重构 research 路由,使用 RSS 源替代已失效的 TWILL API (#21309)
* fix(route/openai): 重构 research 路由,使用 RSS 源替代已失效的 TWILL API

- 移除旧的 getApiUrl 和 parseArticle 函数
- 为 fetchArticles 添加 category 过滤参数
- 提取文章作者信息
- 清理未使用的依赖(got, raw, renderToString)

* fix(route/openai): 使用 parseDate 解析 pubDate 日期字符串

* fix(route/openai): 使用重定向后的 URL 作为文章链接

使用 ofetch.raw() 获取响应,捕获重定向后的最终 URL,
避免输出中包含会被重定向的旧链接。

* fix(route/openai): 补全 URL 尾部斜杠以避免 301 重定向

在请求文章详情前为 URL 补上尾部斜杠,直接请求最终地址,
避免每篇文章都触发一次 301 重定向,减少不必要的 HTTP 请求。
2026-03-06 13:53:14 +08:00
Lipeng 6e2ca63189
feat(route): add Meritalk latest articles (#21282)
* feat: add route and namespace for MeriTalk articles

* feat: update articles route to support pagination and add description rendering

* feat: enhance articles route with improved description and error handling

* feat(meritalk): add articles route with pagination limit

- Add latest articles route for Meritalk
- Update route example and parameter description
- Implement pagination limit to avoid Cloudflare anti-bot

* fix(meritalk): remove nums param and fetch only first page

* fix(meritalk): update route category to new-media

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* fix(meritalk): remove the post-processing of items and modify some of the logic in the handler

- Remove unnecessary sorting.
- Remove custom limit logic.

---------
2026-03-05 11:41:55 +08:00
Tony c09dacac5b
feat(api): add cache probing (#21300)
* feat(api): add cache probing

* fix(tests): correct query parameter from 'path' to 'requestPath' in status tests

* feat(cache): add has to workers kv
2026-03-05 02:36:53 +08:00
github-actions[bot] 1093ce6522 style: auto format 2026-03-03 20:45:21 +00:00
Hualiang 4dec5ee309
feat(route): add gamersky.com user dynamics route (#21279)
* add user.ts

* Replace substring with slice.

* fix something
2026-03-04 04:44:46 +08:00
Radon Rosborough bcba35b41c
feat(route): add aschmelyun.com blog route (#21271) 2026-03-04 03:48:13 +08:00
Dzming Li 0ac1e409d8
feat(route/gcores): add user content routes with filtering (#21258)
* feat(route/gcores): add user content routes with filtering

- Add user-talks route for user social posts, excluding podcasts and videos
- Add user-radios route for user podcasts with exclude_albums parameter to filter out specific albums
- Update cache middleware to include exclude_albums in cache key for proper cache separation

* chore(gcores): appease codefactor by simplifying radios handler

* Update lib/routes/gcores/user-radios.ts

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* Update lib/routes/gcores/user-talks.ts

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* fix: address PR review - add maintainer ID and remove inferrable types

* refactor(route/gcores): replace exclude_albums with album category for common param filtering

---------
2026-03-04 03:30:48 +08:00
Tony 8043a5a819 style: update oxlint to use simple-import-sort 2026-03-04 03:13:57 +08:00
霁岫微岚 b6660ed585
fix(route): update ncu jwc selector (#21250)
* fix(university): update ncu jwc selector for new site version

* fix(university): update ncu jwc selector for new site version

* fix(ncu): use config.trueUA to comply with Rule 21

* fix(ncu): use config.trueUA to comply with Rule 21

* fix(ncu): simplify URL handling and fulfill route metadata
2026-03-04 02:08:42 +08:00
choury fc5d346451
fix(route): 8kcos selectors for latest/cat/tag pages (#21269)
* fix(route): 8kcos selectors for latest/cat/tag pages

* fix: add maintainer info from #7237

* fix: use wordpress api

---------

Co-authored-by: choury <choury@users.noreply.github.com>
2026-03-03 06:17:34 +08:00
Dzming Li 18548f831d
fix(route/zhihu): fix missing images in answers and zhuanlan routes (#21257)
Images were not displaying in RSS feeds because the processImage function
was not being called to convert Zhihu's special image attributes
(data-actualsrc, data-original) to standard src attributes.
2026-03-02 23:16:19 +08:00
karasu a1d266888c
fix(route/ff14): 修复部分「公告」条目缺失的问题 (#21261)
* fix(route/ff14): 追加「公告」类型编码

* style(ff14): rename type_number to typeNumber for camelCase consistency
2026-03-02 13:21:57 +08:00
github-actions[bot] c205eeb107 style: auto format 2026-03-01 19:10:30 +00:00
Andvari 2f9d18ccea
fix(route/reuters): Fix empty authors & prevent unintended fallback (#21256)
* fix(route/reuters): Fix empty authors & prevent unintended fallback

* Update lib/routes/reuters/common.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix error handling for FetchError in common.tsx

* Update common.tsx

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-02 03:09:53 +08:00
choury 1520f4f30c
fix(route/zhihu): use v4 API for daily route (#21255)
The homepage of daily.zhihu.com was redesigned and no longer contains
.box elements with story links. Additionally, the v7 /stories/latest
endpoint now requires authentication (returns 401).

Fix by switching to the publicly accessible v4 API:
- GET /api/4/stories/latest to list today's stories
- GET /api/4/story/:id for full story content (still public)

Also set antiCrawler: false since the v4 API is open.

Co-authored-by: choury <choury@users.noreply.github.com>
2026-03-02 01:32:46 +08:00
CaoMeiYouRen233 ea2fefd5e6
feat: 添加 Iwara 排行功能,支持视频和图片的排序与筛选 (#21251)
* feat: 添加 Iwara 排行功能,支持视频和图片的排序与筛选

* fix: 更新维护者信息

* feat: 使用 Puppeteer 优化 Iwara 排行数据获取

* fix: 修复链接生成逻辑以正确处理 slug

* refactor: 提取公共常量和函数到 utils.ts 文件以简化代码结构

* fix: 修复 Iwara URL 以确保正确访问网站
2026-03-01 18:08:40 +08:00
Bush2021 144d60b80f
fix(route/423down): exclude ad entries (#21254)
Some list entries are ad posts that redirect to
external domains with problematic TLS certificate
chains, causing detail fetch to fail and break the
route.
2026-03-01 06:07:14 +08:00
Thomas 7465febbdf
feat(route/youtube): Allow configuring custom embed url (#21248) 2026-03-01 00:28:45 +08:00
heisenshark e935df5bc6
feat(route): add 4chan (#21249)
* feat: added 4chan route

* feat: renamed board to catalog

* refactor(route/4chan): added util.ts for handling catalog processing

* feat(route/4chan): added break after the reply count

* refactor(route/4chan):functions to arrow functions

* feat(route/4chan): utc pubdate, route params to parameters

* fix(route/4chan): removed explicit category set, changed radar rules

* fix(route/4chan): changed pubdate handling to timezone>parseDate

* fix(route/4chan): added spoilers back, changed links to absolute URLs, changed html stripping in title, removed force timezone setting, removed referrerpolicy from img

* fix(route/4chan): fix https typo

* fix(route/4chan): radar route namespace prefix

* Apply suggestions from code review
2026-03-01 00:20:52 +08:00
Tony 1acb805799
style: migrate eslint to oxlint (#21224)
* chore: add oxlint support

* style: apply autofix

* style: apply autofix for toSorted

* style: use alternative api for nsfw-flag jsPlugins

* fix: git diff

* fix: codeql

* test: console.log

* style: update lint workflow to use Checkstyle SARIF converter

* style: remove debug log from extractDateFromURL function

* chore: use oxlint-json-to-sarif

* test: console.log

* test: remove console.log

* test: update cookie data expectation in getCookies test

https://github.com/mccutchen/go-httpbin/pull/235 breaks this

* style: type-aware linting

* style: enable type-aware linting for oxlint
2026-02-28 21:23:11 +08:00
shcw0405 5ddd2080b0
fix(cursor/changelog): fix changelog route (#21237)
* fix cursor/changelog

* fix(cursor/changelog): deduplicate feed entries

---------

Co-authored-by: 蔡旭 <caixu@caixudeMacBook-Air.local>
2026-02-27 03:18:59 +08:00
github-actions[bot] e21e74addc style: auto format 2026-02-25 16:54:10 +00:00
9k001 9cb29513b4
fix(route/zhihu): enable processImage for people/answers to fix lazy-loaded images (#18671) (#21153) 2026-02-26 00:52:06 +08:00
Mervyn Zhan 79c8adcca7
fix(route/bbc): deal with the mixed bbc news data (#21228)
* fix(route/bbc): deal with the mixed bbc news data

fix #21227

* Update lib/routes/bbc/utils.tsx

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

---------
2026-02-25 21:09:48 +08:00
Summer⛱ b11b9e727a
feat(route): 豆瓣即将播出的剧集 (#21214)
* feat(route): 豆瓣即将播出的剧集

* fix: 增加反爬/限频错误处理

* fix(route): address review feedback for douban tv coming route

- switch route config from query params to path params (:sortBy/:count)
- replace globalThis.crypto with node:crypto webcrypto
- use config.cache.routeExpire instead of hardcoded cache ttl
- normalize naming to camelCase (sortBy/requestCount)
- replace newline rendering with HTML <br/> in description
- simplify renderDescription without array join

* Apply suggestion from TonyRL

---------
2026-02-25 20:48:40 +08:00
occam-7 7d2bd7ced1
feat(route/bestblogs): Add route for weekly selection (#21226)
* feat(route/bestblogs): Add route for weekly selection

* fix(route/thepaper): Linebreak style
2026-02-25 16:07:01 +08:00
loopy03 8be22cb8f6
feat: add route for Le Phocéen (#21205)
* feat: add route for Le Phocéen

* fix: use embedded json

* Fix: lint errors (imports order and parseDate)
2026-02-23 20:04:09 +08:00
github-actions[bot] 83391205cb style: auto format 2026-02-23 01:28:59 +00:00
YuruShiMaShiMaRin ff4ae56a20
feat(comic-fuz.com): add new routes (#21193)
* comicfuz pr

* fix lint

* fix lint error

* ofetch support

* 1

* fix some question

* fix some question

* using TonyRL‘s suggetion version 1

* ver 2

* fix some question

* ver 3

* 非必要的修改 最后的版本

* fix: missing rename

* fix: remove duplicated name

---------
2026-02-23 09:27:19 +08:00
Tony 7785a7bde4
style: update eslint rules (#21207)
* style: update eslint rules

* style: fix prefer-object-spread

* style: fix no-lonely-if

* fix: typescript-eslint/no-unnecessary-template-expression

* fix: sort import

* style: apply file filtering to config presets

* revert: changes on pkg

* style: revert

* style: use defineConfig

* style: reorder js plugin in eslint config

* chore: remove obsolete override

* style: fix CodeQL initialization to ensure language matrix is used
2026-02-23 08:17:37 +08:00
Tsung-Han Yu f7bea67c63
fix(route): remove elements for screen readers (#21206) 2026-02-23 04:20:25 +08:00
Tony 3349076afe
fix(route/anthropic): update selectors (#21200) 2026-02-22 00:46:35 +08:00
TROJAN 3ef013659e
fix(route/showstart): enable `allowEmpty` to allow subscribing to artists who currently have no performances (#21198) 2026-02-21 09:47:35 +08:00
flameleaf 12e5f3ef71
feat(route/chub): support markdown and move thumbnail image to description (#21184)
* Update api url

* remove trailing '

* feat(route/chub): support markdown and move thumbnail image to description

* style: auto format

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-21 05:34:53 +08:00
shcw0405 0b056eba75
fix(route/manus): fix blog route (#21195)
* fix(route/manus): fix blog route

* style: refactor with flatMap and map per review

---------

Co-authored-by: 蔡旭 <caixu@caixudeMacBook-Air.local>
2026-02-21 02:30:18 +08:00
Tony ba0f1ad292
style(eslint): fix `no-unassigned-vars` `no-useless-assignment` `preserve-caught-error` (#21175)
* fix: fix no-unassigned-vars

* fix: fix preserve-caught-error

* fix: fix no-useless-assignment

* fix: update variable types for better type safety

* fix: replace nullish coalescing with logical OR for limit assignment

* fix: add DataItem type import for better type safety
2026-02-18 22:25:14 +08:00
Tony a56e6299d6
feat(route/ainvest): rework article and news (#21154) 2026-02-15 21:47:54 +08:00
Tony da15d11d1d
chore: replace postlight/parser with jocmp/mercury-parser (#21152) 2026-02-15 01:27:25 +08:00
github-actions[bot] 97e8291140 style: auto format 2026-02-14 16:25:56 +00:00
occam-7 1db6d77c17
feat(route/thepaper): Add route for government accounts (#21151)
* feat(route/thepaper): Add route for government accounts

* fix(route/thepaper): object-shorthand

* fix(route/thepaper): object-shorthand
2026-02-15 00:23:30 +08:00
CutCut 4c4339c625
feat(route/twitter): support official api with user credentials (#21139)
* feat(route/twitter): support official api with user credentials (act as a logged user) support

* fix: update namespace docs

* fix(route/twitter): use optional chaining for access tokens
2026-02-14 13:32:44 +08:00
github-actions[bot] da080891d9 style: auto format 2026-02-13 17:25:16 +00:00
Tony f1164b516b
feat(route/bbc): topic (#21140)
* feat(route/bbc): topic

* feat(route/bbc): clean item links by removing query parameters

* feat(route/bbc): add sport

* feat(route/bbc): refactor content fetching logic to use fetchBbcContent utility

* Apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* feat(route/bbc): improve content description fallback logic

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-14 01:23:35 +08:00
Qiang Huang 91ff6e28df
fix(route/smartlink): Remove HTML from the title for cnbc (#21130) 2026-02-13 16:00:58 +08:00
Yuzhong Zhang e43f570306
feat(route/sina): add finance rollnews (#21124)
Co-authored-by: betterandbetterii <betterandbetterii@github.com>
2026-02-12 19:56:49 +08:00
Chris Sauermann 6e16f90bfb
feat(route): add elamigos games route (#21111)
* feat(route): add elamigos games route

* fix(route): update elamigos security vulnerabilities + codefactor complex method error

* fix(route): update elamigos reduce extractGames complexity

* fix(route): update elamigos  required changes to adhere to coding standard

* fix(route): update elamigos remove parseLimit, let user decide limit, default at 40
2026-02-11 22:41:08 +08:00
MMA fbe69a773a
fix(route/dailypush): author and date (#21110) 2026-02-11 20:36:07 +08:00
Qiang Huang 4b9ef7b723
fix(route/smartlink): API returns application/json (#21112) 2026-02-11 17:52:25 +08:00
Tony 2f6303fcaf
feat(route/twitter): official api support (#21109)
* feat(route/twitter): official api support

* fix: update namespace docs
2026-02-10 22:32:13 +08:00
Pieter 48d6b1a42a
fix(route/linkedin): construct link for reposts from activity URN (#21105)
Co-authored-by: Pieter Hollander <git@pieterhollander.nl>
2026-02-10 03:47:22 +08:00
Tony 8df1da9029
fix(route/coolapk): update response handling (#21089) 2026-02-09 00:26:11 +08:00
alterkey c8be7b6061
feat(route): add snnu routes (#21088)
* feat(route): add snnu routes

* fix: use the default UA

* Revert "fix: use the default UA"

This reverts commit b8a41b98681cac2d0cb83f666f2a7a8cb9f152e2.

* fix: use the default UA

---------

Co-authored-by: alterk <alterkey@qq.com>
2026-02-08 21:30:03 +08:00
ChuYinan2023 86a0015096
feat(route): add TCTMD conference news (#21072)
* feat(route): add TCTMD conference news

Add RSS route for TCTMD (tctmd.com) Conference News section,
covering interventional cardiology conference coverage.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix(route): address review feedback for TCTMD conference news

- Use www.tctmd.com instead of tctmd.com in url and radar source
- Fetch from search page (SEE ALL) to get 20 articles instead of 6
- Remove unused selector fallbacks (.field--name-body, .field--name-field-body, .field--name-field-subhead)
- Remove try-catch wrapper, let errors propagate properly
- Delete redundant radar.ts (radar rules already in route definition)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: ChuYinan2023 <ChuYinan2023@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 22:46:23 +08:00
Ethan Shen f4130d4c1a
fix(utils): refactor parseRelativeDate to support dynamic reference (#21054)
* fix(utils): refactor parseRelativeDate to support dynamic reference and semantic formats

* test: add issue test case

---------
2026-02-06 21:44:49 +08:00
Tony ebd22831bf
fix(route/zaobao): zaobao sg (#21080) 2026-02-06 19:56:52 +08:00
github-actions[bot] 33effffa1a style: auto format 2026-02-06 07:59:48 +00:00
Skylwn 8388a4db51
feat(route): add huitun route (#21056)
* add huitun xiaohongshu route

* refactor: add cache for getNoteLink

* fix: sort imports
2026-02-06 15:58:04 +08:00
chris zheng f30f27b9a6
feat(route): add route for ccmn.cn (#21070)
* feat: add route for maven central

* fix: change sort api to Array#toSorted

* Update lib/routes/maven/central.ts

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* fix: update url for maven namespace

* fix: use category to tag items

- remove custom query param
- add categories for route

* fix: ensure pubDate contained in data item

* fix: extract date regex into a constant for better readability

* feat(route): add route for ccmn.cn

* Update lib/routes/ccmn/price-adjustment.tsx

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* fix: use default generated ua

---------
2026-02-06 01:37:00 +08:00
Enoch Ma 6bd478f489
feat(route/nautil): improve reading experience (#21065) 2026-02-05 16:42:26 +08:00
Enoch Ma 5634303363
feat(route/bbc): improve bbc (cn) (#21066) 2026-02-05 16:25:53 +08:00
Enoch Ma 982193cde2
fix(route/aeon): audio type is inaccessible (#21067) 2026-02-05 14:10:30 +08:00
Tony 5c416b8475
fix(route/2048): update target URL to ensure proper redirection (#21064) 2026-02-04 18:25:10 +08:00
Tony d648da5549
fix(route/javtrailers): replace ofetch with puppeteer for API requests (#21055) 2026-02-04 05:27:22 +08:00
wsmbsbbz dc68ecb875
feat(route): add support for f95zone.to (#21042)
* feat(route): add f95zone routes

* fix(route): fix f95zone threads route for folo parse

* fix(route): parse f95zone thread guid from [YYYY-MM-DD] in title

* fix(route): use update date in thread title as pubDate

* fix(route/f95zone): revert image URL processing

* fix(route/f95zone): reenable image URL processing for telegram-bot

* feat(route/f95zone): support post and thread route

* feat(route/f95zone): optimize title

* feat(route/f95zone): optimize image display

* feat(route/f95zone): optimize image display

* feat(route/f95zone): reoptimize img-elements processing

* feat(route/f95zone): reset to the original route pattern

* feat(route/f95zone): optimize routes

* feat(route/f95zone): optimize content processing

* feat(route/f95zone): reduce code

* fix(route/f95zone): use parseDate for proper date handling

* fix(route/f95zone): remove broken radar

* fix(route/f95zone): remove invalid radar config and improve docs

- Remove radar config from post route (postId is in URL hash, cannot be extracted)
- Add empty radar array to prevent Folo parsing error
- Add detailed URL format documentation for both routes
- Explain how to convert browser URL to subscription URL

* fix(route/f95zone): fix invalid example URL

* fix(route/f95zone): use internally generated UA

* fix(route/f95zone): only fetch the first and the last page

* fix(route/f95zone): remove unnecessary sorting logic
2026-02-04 02:43:36 +08:00
Chih-Hsuan Yen 5ae169a201
feat(route/cna): support headlines (#21053)
* feat(route/cna): declare headlines as supported

https://www.cna.com.tw/list/headlines.aspx works the same as other
categories (aall, aipl, ...) - the same HTML structure and API

* fix(route/cna): ignore youtube links during full-text extraction

Sometimes a youtube link instead of a news page is used directly as a
news item (ex: 晚間影音新聞 during 6~7pm UTC+8 on weekdays). That
may result in HTTP 429. Full-text extraction returns nothing, anyway.

* fix(route/cna): note about where the API is from
2026-02-04 02:28:25 +08:00
Tony 55ca8bbb2b
feat(router/36kr): add WAF token handling (#21051) 2026-02-03 18:55:55 +08:00
Enoch Ma ee161b72e4
feat(route/openalex): initial support of openalex (#21032)
* initial support of openalex

* remove parseDate

* add caches and change paths
2026-02-03 02:29:48 +08:00
Enoch Ma 4047e341e2
fix: quanta magazine (#21031)
* exclude economist

* fix: use String.fromCodePoint instead of fromCharCode

* delete old version

* Update lib/routes/quantamagazine/archive.ts

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* obtain the author information differently

---------
2026-02-03 02:13:39 +08:00
Enoch Ma e6598a0d91
fix(route): AEON (#21030)
* fix aeon

* improve layout

* remove escape chars

* Apply suggestion from TonyRL
2026-02-03 01:25:27 +08:00
Tony a4db4c217d
feat(route): add gitkraken release note (#21044) 2026-02-03 00:50:36 +08:00
Thomas 8be09381e6
fix(route/picuki): Fix video source (#21043) 2026-02-03 00:04:43 +08:00
Jaya d9a611a574
fix(route/njxzc): handle absolute URLs and update library page selectors (#21028)
* fix(route/njxzc): handle absolute URLs and update library page selectors

- Fix URL concatenation in utils to handle absolute URLs properly
- Rewrite lib.ts handler for new library page layout with updated selectors

* fix(route/njxzc): address PR review feedback

- Remove unnecessary padStart for day (already padded)
- Remove invalid response.status check (ofetch returns body directly)
- Extract PDF attachment URL instead of showing generic message

* fix(route/njxzc): handle multiple attachments in wp_articlecontent

- Remove separate wp_pdf_player handling since it's inside wp_articlecontent
- Convert wp_pdf_player iframes to download links within content
- Preserve all attachment links (PDFs, docs, etc.) in the content
- Remove invalid response.status check from utils
2026-02-02 10:26:21 +08:00
Thomas 3583fba2e8
fix(route/picuki): Fix getting video id (#21029) 2026-02-02 05:43:27 +08:00
Zhang Yan bb1d219d5f
fix(route/cool18): fix broken search parsing & add global search (#21024)
* fix(route/cool18): fix broken search parsing & add global search

* fix(route/cool18): add missing await in fetchArticleDetail

* fix(route/cool18): add extractGoldList to handle gold posts

* fix: example path

---------
2026-02-01 16:51:10 +08:00
Tony 4dc4c165d4
fix(route/coolapk): handle shareUrl (#21027)
* fix(route/coolapk): handle shareUrl

* Update lib/routes/coolapk/utils.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-01 02:34:56 +08:00
Kota 45cf28a6c3
feat(route): add Scratch routes (#21025)
* add scratch routes

* add users'projects route

* refactor(route): remove old Scratch routes and add new MIT routes for user comments and projects
2026-02-01 01:08:27 +08:00
Tony 27869d9e3c
fix(route/oschina): migrate to oschinapi (#21026)
* fix(route/oschina): migrate to oschinapi

* fix(oschina): correct API path formatting in news and utils
2026-01-31 18:34:04 +08:00
Tony e5016e8ea7
feat(route/tiktok): add live (#21015)
* feat(route/tiktok): add live

* Apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-30 12:25:36 +08:00
Tony 0b51e055b7
fix(route/typeless): add android platform support in changelog handler (#21014) 2026-01-30 10:44:10 +08:00
Tony 8f4392d32a
feat(route/nea): add nea bureaux (#21013)
* feat(route/nea): add nea bureaux

* Update lib/routes/gov/nea/bureau.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-30 10:28:21 +08:00
Donie Leigh 9ae9d53d2e
fix(route/openai): fix chatgpt release notes extraction (#20971)
* fix(route/openai): fix chatgpt release notes extraction

- Use Puppeteer to bypass Cloudflare protection
- Extract content from rendered HTML instead of React Router data
- Use .html() to preserve formatting, links and styles in descriptions
- Support h2-h6, ul/ol, p, and other HTML elements

* refactor(route/openai): use ofetch instead of puppeteer for chatgpt release notes

- Use ofetch to fetch page content
- Simplify description extraction with prop('outerHTML')
- Use map() instead of each() + push()
- Use config.cache.routeExpire for cache duration

* fix: use first h2 as title, fallback to h1 date if h2 missing
2026-01-30 00:27:18 +08:00