Commit Graph

8441 Commits

Author SHA1 Message Date
Tony 6dba3aa744
style: fix eslint issues (#20862)
* style: fix n/no-deprecated-api

* style: fix no-useless-escape

* style: fix default-case

* style: fix unicorn/prefer-string-slice

* feat!: remove informedainews

the site is gone
2026-01-13 03:25:37 +08:00
Tony 242bba6713
fix(route/javbus): remove avgle api usage (#20861) 2026-01-13 00:38:10 +08:00
Stephen Zhou f733a033a4
chore: migrate to oxfmt (#20735)
* chore: migrate to oxfmt

* update

* chore: update

* chore: update

* chore: update
2026-01-13 00:06:06 +08:00
dependabot[bot] 12eece429c
chore(deps): bump otplib from 12.0.1 to 13.0.2 (#20855)
* chore(deps): bump otplib from 12.0.1 to 13.0.2

Bumps [otplib](https://github.com/yeojz/otplib/tree/HEAD/packages/otplib) from 12.0.1 to 13.0.2.
- [Release notes](https://github.com/yeojz/otplib/releases)
- [Commits](https://github.com/yeojz/otplib/commits/v13.0.2/packages/otplib)

---
updated-dependencies:
- dependency-name: otplib
  dependency-version: 13.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

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

* fix: migrate to otplib v13

---------

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-01-12 23:49:56 +08:00
TimoYoung 1851236be6
fix(route/huxiu): adapt to Nuxt 3 data structure and update API endpoints (#20843)
* fix(route/huxiu): adapt to Nuxt 3 data structure and update API endpoints

- fix article parsing by adding suppmort for Nuxt 3 __NUXT_DATA__ format
- Update channel, club and tag's API endpoints and channel route
- Remove deprecated brief-column route

* set antiCrawler tag, disable bt support tag

* fix(route/huxiu): handle request failures gracefully in fetchItem; add maintainer info

* refactor(route/huxiu): remove unused fetchBriefColumnData and update club example

* refactor(route/huxiu): reduce function complexity in util.ts

- Extract buildCategories() for category array construction
- Extract resolveItemIdentifiers() for guid/link resolution
- Extract extractCounts() for upvotes/downvotes/comments extraction
- Extract extractAuthor() for author field extraction
- Extract extractImageSrc() for image URL extraction
- Extract mapItem() to simplify processItems() map callback
- Simplify fetchItem() by using direct object return
- Simplify processItems() control flow with boolean variables

These changes reduce cyclomatic complexity reported by CodeFactor
for functions at lines 164-218 and 440-490.
2026-01-11 00:39:52 +08:00
Tony 2079d36765 test: double worker test timeout 2026-01-09 23:12:27 +08:00
King-of-Infinite-Space 18c78d538b
fix(route/douban): support new status card format (#20827) 2026-01-09 06:48:17 +08:00
Tony 69d022c89f
fix(route/18comic): update apiDomain (#20835)
* fix(route/18comic): update apiDomain

* docs: add back maintainer information from #8588

* Update utils.ts
2026-01-09 06:35:29 +08:00
chris zheng 3f7f5848ba
feat: add route for maven central (#20820)
* feat: add route for maven central

* fix: change sort api to Array#toSorted

* Update lib/routes/maven/central.ts

* 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

---------
2026-01-08 01:13:27 +08:00
H. Kamran 7ec4876202
feat(route): add NYC Mayor's Office news (#20811)
* feat(route): add NYC Mayor's Office news

* feat(route/nyc): add types and categories to path

* feat(route/nyc): use `en-us` language

* feat(route/nyc): use parameter object

* feat(route/nyc): add article image

* feat(route/nyc): update radar rules

* fix(route/nyc): update extension assignment, add base URL prefix

* feat(route/nyc): update feed link with types and categories

* Add category

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

* Remove extension to prevent redirect

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

* Update namespace name

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

* fix(route/nyc): remove duplicate `categories` key

* feat(route/nyc): use common title-case function

---------
2026-01-07 12:09:37 +08:00
sddiky b173c13614
fix(route/50forum): 匹配变更后的文章列表网址和样式 (#20815)
* 修复中国经济50人论坛专家文章(/50forum),匹配变更后的文章列表网址和样式。

* Update lib/routes/50forum/zhuanjia.ts

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

* Update lib/routes/50forum/zhuanjia.ts

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

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-07 11:45:19 +08:00
Shine d6a665b772
fix: Update Shopify App search description selector (#20814) 2026-01-05 23:26:24 +08:00
DIYgod ffb226c32c
fix: increase worker integration test timeout to 60s (#20810)
The first two integration tests were timing out in CI environments because the Worker initialization takes longer than 30 seconds. This change increases the timeout from 30 seconds to 60 seconds for these tests.

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

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-04 18:00:09 +08:00
DIYgod d40f812563
refactor: deploy all routes to Cloudflare Workers (#20809)
- Remove Worker-specific route filtering (worker_namespaces) to include all 1537 namespaces in Worker builds
- Remove popularity analytics logic (foloAnalysisTop100) as Worker can now handle all routes
- Update node:child_process alias in tsdown config to use dedicated shim file
- Inline child_process shim in node-module.ts to avoid import cycles
- Fix tough-cookie import in telecompaper route (use named import CookieJar)
- Remove ESModule rules from wrangler.toml (not needed)

This enables full RSSHub functionality on Cloudflare Workers with no memory/size limitations.

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

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-04 17:33:55 +08:00
DIYgod 7b96e82f1c
feat(worker): implement KV-based caching for Cloudflare Workers (#20806)
- Add Cloudflare Workers KV cache implementation with TTL support
- Create xxhash-wasm shim using Web Crypto API to replace incompatible WebAssembly
- Unify cache middleware to use single cache.ts via tsdown-worker.config.ts alias
- Update dependencies: wrangler, @cloudflare/puppeteer, @cloudflare/workers-types
- Configure automatic KV namespace provisioning without manual ID configuration

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

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-04 11:29:33 +08:00
DIYgod 1131350b5f
feat: deploy RSSHub to Cloudflare Workers (#20804)
* feat: deploy RSSHub to Cloudflare Workers

- Create Worker entry point (lib/worker.ts) with polyfills
- Implement Worker-specific app configuration (lib/app.worker.tsx)
- Add automatic .worker.ts resolution plugin for cleaner config
- Simplify build configuration with only 3 essential shims
- Enable static asset serving via Cloudflare Static Assets feature
- Support dynamic route loading with proper module aliasing

🤖 Generated with Claude Code

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

* feat(worker): add puppeteer and request-rewriter support

- Add @cloudflare/puppeteer for Browser Rendering API support
- Create puppeteer.worker.ts with Cloudflare Browser binding
- Add request-rewriter Worker version with static browser headers
- Add vm module shim to node-module.ts for JSDOM compatibility
- Configure __dirname/__filename in tsdown for CommonJS compat
- Update wrangler.toml with BROWSER binding configuration
- Dynamically extract namespaces from foloAnalysisTop100 for routes

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

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

* fix(cache): restore synchronous initialization for tests

The async initialization caused cache tests to fail because the cache
module wasn't ready when tests ran. Restored synchronous imports while
keeping Worker-specific no-op behavior.

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

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

* test(worker): add automated Worker integration tests

- Add miniflare for Worker environment simulation
- Create lib/worker.worker.test.ts with integration tests
- Test basic routes (/test/1, /, unknown routes)
- Test RSS feed routes (hackernews, v2ex)
- Test error handling for puppeteer routes without BROWSER binding
- Add worker-test npm script

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

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

* refactor(worker): use test routes for Worker integration tests

- Replace third-party routes (hackernews, v2ex, weibo) with /test/* routes
- Remove miniflare dependency (wrangler includes it internally)
- Simplify test setup using wrangler's unstable_dev API

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

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

* fix(test): make header-generator test less flaky

The header-generator library may return different platform values due to
internal randomness. Update test to check for valid format instead of
exact value.

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

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

* fix(test): exclude worker tests from vitest coverage run

Worker tests require the dist-worker bundle to be built first,
which is not part of the regular CI test workflow. These tests
should be run separately using 'pnpm worker-test'.

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

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

* test(worker): add automated Worker integration tests

- Add worker-build step to CI workflow before running tests
- Revert exclusion of worker tests from vitest coverage run
- Worker tests now run as part of the regular test suite

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

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

* fix(worker): fix routes.js alias path in worker build config

Change alias key from absolute path to relative import path to match
how it's imported in lib/registry.ts. This fixes the worker build
failing with "Could not resolve '../assets/build/routes.js'" error.

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

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

* ci: trigger CI re-run

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

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

* fix(ci): build worker routes before worker-build

The worker build requires routes-worker.js which is generated by
running build:routes with WORKER_BUILD=true. This was missing in CI,
causing the worker build to fail with "Could not resolve routes.js".

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

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

* fix(test): increase timeout for Worker integration tests

Worker tests need more time in CI environments. Increase individual
test timeouts from default 10s to 30s for each test case.

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

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

---------

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-04 09:22:05 +08:00
moss-xxh 472082e3b1
feat(route): add Always Control news route (#20522)
* fix(route/alwayscontrol): correct import order to pass ESLint check

- Move cheerio import to first line (external dependencies first)
- Add blank line after external imports
- Keep type imports before other internal imports
- Maintain alphabetical order for @/ imports

This fixes the ESLint import/order error that was blocking PR #20522

* feat(route/alwayscontrol): add namespace file

Add required namespace.ts file for alwayscontrol route as requested by reviewer.
2026-01-04 09:21:38 +08:00
Sven 49679f657c
feat(route/anthropic): add frontier red team (#20800)
* add red.anthropic.com

* Do not repeat namespace name in route name
2026-01-03 22:14:53 +08:00
Tony 9aa55f54af
fix(route/patreon): use Patreon API (#20803)
* fix(route/patreon): support creator under /cw/

* fix(route/patreon): improve regex

* fix(route/patreon): streamline creator data extraction from Patreon API
2026-01-03 09:22:32 +08:00
Tony 6b38e2ceeb
fix(route/patreon): support creator under /cw/ (#20802)
* fix(route/patreon): support creator under /cw/

* fix(route/patreon): improve regex
2026-01-03 08:53:09 +08:00
github-actions[bot] 2f37d73a24 style: auto format 2026-01-02 01:44:18 +00:00
Tony b84bb92a8a
style: replace unicorn/no-for-loop w/ typescript/prefer-for-of (#20798)
* style: replace unicorn/no-for-loop w/ typescript/prefer-for-of

* style: fix typescript-eslint/prefer-for-of

* style: fix typescript/no-inferrable-types

* style: fix typescript-eslint/consistent-generic-constructors

* style: typescript-eslint/consistent-type-assertions

* style: fix typescript-eslint/array-type

* fix: revert .entries() in d96ca62d3d80806b0475a54e749decfc07b24701
2026-01-02 09:42:24 +08:00
Ethan Shen 4b6c445f73
feat(route): add CoStar Press Releases (#20791)
* feat(route): add CoStar Press Releases

* fix typo
2026-01-01 01:48:27 +08:00
Tony eee59e49f2
fix(route/douyu): simplify item creation for live stream titles (#20792) 2026-01-01 00:30:54 +08:00
pseudoyu c135b8dfdd
fix(route/tingshuitz): update jlwater url 2025-12-31 10:21:16 +08:00
Tony b832b97bac
fix(route/2048): update cookie handling (#20785)
* fix(route/2048): update cookie handling

* Update lib/routes/2048/index.tsx

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

* fix(route/2048): improve null value checks in filter function

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-31 00:00:22 +08:00
Yufan You fb07a7f2e5
fix: add summary field in JSON output format (#20778)
* fix: add summary field in JSON output format

This fixes that the summary/description was not included in the feed.

As a side-note, we cannot remove the content_html field even if only the
summary/description is present.

> content_html and content_text are each optional strings — but one or
> both must be present.

* test: add JSON view tests

---------
2025-12-30 21:57:51 +08:00
DIYgod d12fa2ed12
feat: revamp binance announcement route
- Map legacy types to catalog IDs

- Support language suffix and remove messages route
2025-12-29 22:20:30 +08:00
DIYgod 5caccabfd9
feat: add binance messages announcement route 2025-12-29 21:27:25 +08:00
DIYgod 81ff849337
feat(tests): add comprehensive unit tests for various utility functions and views (#20779)
* feat(tests): add comprehensive unit tests for various utility functions and views

- Implement tests for cache utility to ensure proper behavior with no cache and TTL keys.
- Add tests for common utilities including string manipulation and path handling.
- Introduce tests for directory import functionality to validate file imports and pattern matching.
- Create tests for git hash retrieval to handle fallback scenarios.
- Develop tests for deprecated got utility to verify response handling and retry logic.
- Enhance got utility tests to include request hooks and search parameter handling.
- Mock header generator tests to validate user agent handling.
- Expand helpers tests to cover current path retrieval and duration parsing.
- Implement tests for ofetch utility to ensure proper proxy handling and logging.
- Add OpenTelemetry metric tests to validate metric serialization.
- Create proxy tests to verify multi-proxy selection and failure handling.
- Introduce request rewriter tests to validate fetch and get wrapper functionality.
- Add timezone utility tests to handle various input types.
- Implement view tests for Atom and RSS rendering to ensure correct output.
- Create index view tests to validate debug information display based on configuration.

* refactor: remove deprecated got implementation and associated tests

* test: expand coverage for api, middleware, and utils
2025-12-29 17:34:48 +08:00
DIYgod cf4e772de8
refactor: replace art template with jsx (#20777)
* refactor: replace art template with jsx

* fix: tsx files

* fix: renderToString import

* fix: hono html raw import

* feat: remove art
2025-12-29 12:27:32 +08:00
github-actions[bot] dc8aa664e1 style: auto format 2025-12-28 15:40:07 +00:00
Weirdo 3813afad84
feat(route): 添加BTBTLA指定剧名详情路由 (#20766)
* feat(route): 添加BT影视更新列表路由

* 更新 gxlist.ts

* feat(route): 添加BTBTLA指定剧名详情路由

- 新增 /detail/:name 路由用于获取指定电影或电视剧的详细信息
- 实现通过剧名搜索获取ID并解析详情页内容的功能
- 添加磁力链接获取功能,使用缓存优化性能
- 更新命名空间描述,完善URL格式
- 优化最近更新页面标题显示格式

* fix(route): 修正 btbtla 详情页路由示例

- 修复了路由示例路径缺少 btbtla 前缀的问题
- 确保示例路径与实际路由配置保持一致

* refactor(btbtla): 优化详情页路由和磁力链接处理

- 使用路由参数替代路径解析获取名称
- 导入配置模块以使用缓存过期设置
- 优化磁力链接获取逻辑并添加缓存
- 改进链接和磁力链接的返回值处理
- 添加种子文件下载支持和类型标识
- 简化空值检查逻辑

* 更新 detail.ts

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

* 更新 detail.ts

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

---------

Co-authored-by: pull[bot] <39814207+pull[bot]@users.noreply.github.com>
2025-12-28 23:35:16 +08:00
Outvi V af886e3f43
feat(route): 添加電音部新闻及组合新闻相关路由 (#20770)
* feat: denonbu

* chore: UPPER_SNAKE_CASE for constants

* fix: timezone

* fix: extract a title if none is given

* fix: typo

* fix: handle special media fields

testcase: /denonbu/news/daiba

* fix: naming

* feat: cache token

* chore: remove manual `...` (RSSHub will add it)

* chore: simplify checks

shall be safe to guess the site won't have sid === 0

* Apply suggestion from TonyRL

---------
2025-12-28 23:17:36 +08:00
DIYgod 0db4c9cef9
docs: update license 2025-12-28 18:39:22 +08:00
Tony 99639882ce
feat(route/foodtalks): add tag (#20771)
* feat(route): add tag

* fix: replace 'referrer' with 'referer' in http header

* fix(route): update tag path

* fix(utils): update pubDate parsing to include timezone

* Apply suggestions from code review

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

* fix: update image source to use favicon.ico for foodtalks routes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-28 05:36:35 +08:00
github-actions[bot] 71837553ca style: auto format 2025-12-27 16:17:36 +00:00
千代有希= bd4ac7bd54
feat(route): add two new routes of ECNU (#20690)
* fix(route): fix wrong title of /ecnu/bksy

Co-authored-by: FrozenStarrrr <frozenstars@qq.com>

* feat(route): add ECNU Software Engineering Insitute notices route

* fix(route): modify wrong radar target

* add School of Computer Science and Technology ECNU notices route

* add School of data science and engineering notices route

* add School of Comm. & Elec. Engineering notices route

* add School of Geospace A.I. Engineering ECNU notices route

* add ECNU faculty of Edu. notices route

* add ECNU faculty of Earth Sci. notices route

* add ECNU Meng Xiancheng notices route

* add ECNU Guanghua notices route

* fix(route): add empty line at the end of files.

* add department of history ECNU notices route

* add department of Philo. ECNU notices route

* fix(route): add maintainer of /ecnu/bksy

* fix(route): delete unnecessary try-catch statment, modified incorrect url, fix image url.

* fix(route): fix unnecessary try-catch, description, condition and wrond url

* fix(route): fix image display

* fix(route): fix problems in bksy.ts

* feat(route): add ecnu/pharm

* feat(route): add art insititute of ECNU

* feat(route): add route of school of Stat. ECNU

* feat(route): add route of school of Phy. & Elec., ECNU

* feat(route): add route of school of Chem. & Mol., ECNU

* feat(route): add route of school of Eco. & Envir., ECNU

* feat(route): add route of school of Comm., ECNU

* feat(route): add route of school of International Chinese Studies, ECNU

* feat(route): add route of school of Psy. & cognitive Sci., ECNU

* feat(route): add route of college of Phy. Edu. & health , ECNU

* feat(route): add route of college of public management, ECNU

* feat(route): add route of college of Marxismus, ECNU

* fix(routes): fix incorrect time display and remove unnecessary codes

* fix(foute): format the code

* add cxcy

* feat(routes): add ecnu/jiaoliu

* feat(route): add two new routes of ECNU

* feat(route): add info of /ecnu/cxcy

* fix(route): replace links with baseUrl and update the method to query dom element

* Update lib/routes/ecnu/cxcy.ts

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

---------

Co-authored-by: FrozenStarrrr <frozenstars@qq.com>
2025-12-28 00:15:43 +08:00
Ethan Shen e2a7209ed2
feat(route): add Semiconductor Industry Association (#20760) 2025-12-27 22:43:12 +08:00
karasu 220a6842d5
fix(route/ff14-zh): add a default news link to items where the link is empty (#20762) 2025-12-26 18:01:11 +08:00
Ethan Shen 27bdccbd71
feat(route): add 多知网 (#20750) 2025-12-24 20:58:48 +08:00
Tony c982d6474b
fix(route/famitsu): add support for new renderJSON cases (#20749) 2025-12-23 22:31:29 +08:00
grenade 3f42a429ee
fix(route/huggingface): Add allowEmpty option to huggingface daily papers response (#20739)
Fixes https://github.com/DIYgod/RSSHub/issues/20738
2025-12-22 09:54:51 +00:00
Ethan Shen 24aac5c00d
feat(route): add 中央气象台产品 (#20728)
* feat(route): add 中央气象台产品

* fix typo
2025-12-22 00:18:50 +08:00
Weirdo e703cb76ff
feat(route): 添加BT影视更新列表路由 (#20737)
* feat(route): 添加BT影视更新列表路由

* 更新 gxlist.ts
2025-12-21 20:15:26 +08:00
Tony 14757b8d5e test(header): add wait after each test to prevent race conditions 2025-12-20 23:54:41 +08:00
Yufan You 60ec93ad40
fix(routes/mercari): use item updated time in cache key (#20726)
* Revert "fix(routes/mercari): set cache max age to routeExpire (#20653)"

This reverts commit 7fc7a62a25.

* fix(routes/mercari): use item updated time in cache key
2025-12-20 23:46:57 +08:00
Bin Wang 1efb6d0cbe
fix(routes/cbc): fix CBC route to exclude text to speech widget (#20734)
CBC articles have a text to speech widget at the beginning of every
article, which is useless and add lots of noise. This PR removes it.
2025-12-20 23:13:41 +08:00
Stephen Zhou ec5460614b
feat(hupu): game result 2025-12-20 13:40:30 +08:00
Ethan Shen 3ebb7d6932
feat(route): add X410 News (#20718) 2025-12-17 18:17:29 +08:00