Commit Graph

8725 Commits

Author SHA1 Message Date
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
ChenShiYu 5b144a6692
fix(route/nuist): update bulletin route for new website structure (#21004)
* Update bulletin.ts

* style: auto format

* Update bulletin.ts

* style: auto format

* Refactor bulletin route to improve data extraction

fix: apply code review suggestions (selector, radar, author)

* style: auto format

* Update lib/routes/nuist/bulletin.ts

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

* Update lib/routes/nuist/bulletin.ts

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

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-01-29 13:59:38 +00:00
MMA 07cd821cd2
feat(route): add support for dailypush.dev (#20972)
* add support for dailypush.dev

* fix base url

* use map over push

* remove unnecessary option

* remove unnecessary option

* change tag route

* fix

* fix base url
2026-01-27 23:39:14 +08:00
后稷 05437e4252
feat(route/zzu math & sxy): add math and business department route (#20970)
* feat(route/zzu math & sxy): add math and business department route
- Add new route for Zhengzhou University School of Mathematics
- Add new route for Zhengzhou University Business School

* fix(zzu/sxy): 少量修复内容
2026-01-27 08:49:45 +08:00
Donie Leigh 3feaff89fd
feat(route): Add ChatGPT Atlas release notes route (#20969)
* Add ChatGPT Atlas release notes route

- Add route: /openai/chatgpt-atlas/release-notes
- Parse release notes from OpenAI help center
- Use Puppeteer to bypass Cloudflare protection
- Extract build version, date, and content sections
- Cache results for 24 hours
- Proper resource cleanup (browser.close())

* Add ChatGPT Atlas release notes route

- Add route: /openai/chatgpt-atlas/release-notes
- Parse release notes from OpenAI help center
- Use Puppeteer to bypass Cloudflare protection
- Extract build version, date, and content sections
- Cache results for 24 hours
- Proper resource cleanup (browser.close())
2026-01-27 01:48:26 +08:00
dreaifekks 895672f5ea
docs: Clarify YouTube API key(YouTube Data API v3 enable) requirement for live route (#20974)
* Add CLI script for youtube live lookup

* Make youtube live debug script standalone

* Update YouTube API key requirement docs

* Clarify YouTube API key requirement for live route

* Adjust YouTube live API key docs

* Enhance YOUTUBE_KEY description with API link

Updated the description for the YOUTUBE_KEY configuration to include a link to the YouTube Data API v3.

* Update youtube Data API v3 enable doc url
2026-01-26 22:26:21 +08:00
Circloud 7ae15a88bc
feat(route): add XJTLU news route (#20966)
* feat(route): add XJTLU news route

* feat(route): update feed title format

* refactor(route/xjtlu): move "all" category into categories object

* fix(route/xjtlu): remove unnecessary category parameter from radar rules

* fix(route/xjtlu): replace generic error handling with custom one
2026-01-26 13:00:05 +08:00
Circloud 2e756e027d
fix(route/baoyu): handle HTTP redirect for feed.xml (#20968) 2026-01-25 19:18:39 +08:00
sheetung ad3acba9ce
feat(route): add gzjy routes (#20954)
* add gzjy routes

* Update lib/routes/gov/guizhou/jyt.ts
2026-01-25 03:37:24 +08:00
Donie Leigh 8ce077182a
fix(route/perplexity): update changelog title selector for new page structure (#20964)
The page now uses h4 instead of p for titles. Updated selector from
`[data-framer-name="Title"] p` to `[data-framer-name="Title"]` and added
URL slug fallback when title element is not found.
2026-01-25 02:26:22 +08:00
jxtan 71d5ded520
feat(route): add maoyan (猫眼电影) routes (#20956)
* feat(route): add LinuxDo RSS routes

- Add /linux-do/posts route for latest posts
- Add /linux-do/top/:period route for trending topics with period filter
- Optimize /linux-do/latest route
- Update namespace documentation with descriptions
- Handle Zstandard compression by using Accept-Encoding: identity

* revert: remove linux-do routes (PR rejected)

* feat(route): add codefather (编程导航) routes

- Add posts route with hot/new/recommend sorting and category filter
- Add questions route with new/hot sorting
- Support for 编程导航 programming community

* fix: address all PR review comments

- Reorder path params: category before sort
- Remove config.trueUA (not needed)
- Use upvotes/comments fields instead of description
- Remove title slicing
- Change default sort to 'new'
- Remove title from description
- Remove content truncation

* feat(route): add maoyan (猫眼电影) routes

Add three new routes for Maoyan:
- /maoyan/box - Real-time box office ranking
- /maoyan/hot - Currently showing movies
- /maoyan/coming - Upcoming movies

* fix: address PR review comments

- Remove author field from box.ts (releaseInfo is not author)
- Remove unnecessary mobile User-Agent from coming.ts and hot.ts
2026-01-24 13:43:07 +08:00
后稷 417b943241
feat(route): add ZZU (Zhengzhou University) routes (#20941)
* feat(route): add ZZU (Zhengzhou University) routes

Add routes for Zhengzhou University departments:
- news: 新闻网 (要闻速递、教学科研、基层动态、媒体郑大)
- tzhb: 党委统战部 (工作动态、通知公告)
- dzb: 党政办 (新闻资讯、通知公告)
- dwzzb: 党委组织部 (党建工作、干部工作、人才工作、乡村振兴工作)
- xuan: 党委宣传部 (工作动态、通知公告)
- rsc: 人事部 (人事要闻、通知公告、招聘公告)
- jwc: 教务部 (新闻快递、通知公告)
- student: 学生处 (新闻资讯、通知公告)
- kjc: 科研院 (新闻资讯、通知公告)
- ss: 社科院 (新闻资讯、通知公告)
- zcycwb: 资产与财务部 (新闻资讯、通知公告)
- gs: 研究生院 (新闻资讯、通知公告)
- xbx: 校长办 (新闻资讯、通知公告)

* refactor(routes): replace puppeteer with API in dwzzb and fix code style issues

- refactor(dwzzb): use /mp/portal/article/list API endpoint instead of puppeteer
- refactor(all zzu routes): rename type_dict to typeDict (camelCase)
- refactor(dzb, tzhb): remove useless mapping operations
- fix: update maintainers from 'misty' to 'amandus1990'

* refactor(routes/zzu): optimize code style and fix date format

- refactor(student): convert date format from 'yyyy年mm月dd日' to RFC 2822
- fix(tzhb): correct radar URL (hhttps -> https)
- refactor: simplify typeDict formatting across all routes
- refactor: adjust slice limits for better pagination (20 -> 10/15)
- refactor(gs, jwc): simplify title extraction and date cleaning

* fix(routes/zzu): fix date parsing and radar source URLs

- fix(ss): handle different date formats for xwzx (MM-DD) and tzgg (yyyy-mm-dd)
- fix(student): parse Chinese date format (yyyy年mm月dd日) using regex instead of Date constructor
- refactor(all zzu routes): remove protocol from radar[].source URLs
- radar rules can only match URL pathname, not protocol or query strings
2026-01-24 07:53:17 +08:00
Donie Leigh 70576d03a8
feat(route): fetch full content for changelog items (#20953)
* feat(perplexity): fetch full content for changelog items

- Fetch full article content for each changelog item
- Use Puppeteer to render JavaScript-rendered pages
- Remove hero image from description
- Cache parsed content using cache.tryGet

* fix(perplexity): resolve review comments
- Simplify CSS selector for content extraction
- Fix dangling promises issue by properly returning and using Promise results
- Ensure cache mechanism works correctly by returning new objects instead of mutating
- Remove redundant fallback logic
2026-01-24 01:18:15 +08:00
Tony 803c6fc547
fix(route/slashdot): fix import typo 2026-01-24 00:33:13 +08:00
DIYgod c90e71c359
feat(xiaohongshu): add proxy configuration support (#20952)
Allow xiaohongshu routes to bypass anti-scraping measures by routing requests through a configurable proxy. When XIAOHONGSHU_PROXY is set, all xiaohongshu HTTP requests (user, board, notes) will be routed through the proxy endpoint instead of using Puppeteer.

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-22 17:17:04 +08:00
jxtan 4c4cbbad1a
feat(route): add codefather (编程导航) routes (#20922)
* feat(route): add LinuxDo RSS routes

- Add /linux-do/posts route for latest posts
- Add /linux-do/top/:period route for trending topics with period filter
- Optimize /linux-do/latest route
- Update namespace documentation with descriptions
- Handle Zstandard compression by using Accept-Encoding: identity

* revert: remove linux-do routes (PR rejected)

* feat(route): add codefather (编程导航) routes

- Add posts route with hot/new/recommend sorting and category filter
- Add questions route with new/hot sorting
- Support for 编程导航 programming community

* fix: address all PR review comments

- Reorder path params: category before sort
- Remove config.trueUA (not needed)
- Use upvotes/comments fields instead of description
- Remove title slicing
- Change default sort to 'new'
- Remove title from description
- Remove content truncation
2026-01-22 11:52:22 +08:00
Tony e9e8cb0845
feat(route): add typeless changelog (#20943) 2026-01-22 09:30:02 +08:00
Tony 02826c6d9c
feat(route): add slashdot (#20942)
* feat(route): add slashdot

* chore: apply changes
2026-01-22 07:02:53 +08:00
Radon Rosborough 685598f0f8
feat(route): add bvisness.me blog route (#20929) 2026-01-21 00:36:03 +00:00
DIYgod 25cd9f1a28
feat: add Cloudflare Containers deployment support (#20932)
- Create Container Worker entry point with load balancing (20 instances)
- Add wrangler-container.toml configuration with KV binding for environment variables
- Configure container to use standard-1 instance type with Chromium support
- Implement dynamic environment variable loading from Cloudflare KV

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-20 15:29:13 +08:00
Donie Leigh 77b7763cd7
feat(route): add perplexity changelog route (#20919)
* feat(route): add perplexity changelog route

* fix: address review comments

- Use ^= instead of *= for href selector
- Remove CSS-in-JS class selector (framer-styles-preset-16bzrdu)
- Use map instead of each + push
- Remove HTML caching (per review feedback)
- Fix date format parsing (MM.DD.YY not YY.MM.DD)
- Fix summary selector fallback logic
- Update maintainer to xbot
2026-01-20 03:13:50 +08:00
Shirley Yi dd5e1ffcf8
feat(route): Add GanjingWorld (#20086)
* Created route for channel videos

* chore: updated route name

* feat: add short video route

* Added Article Route

* Added Posts Route

* chore: change file name

* chore: reorder folder structure

* Update lib/routes/ganjingworld/namespace.ts

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

* fix(route/ganjingworld): fix target url; fix repeated name, fix redundant parsing, fix video poster attribute, fix naming convention

* fix(route/ganjingworld) fix examples

* fix(route/ganjingworld) fix optional empty string

* chore(route/ganjingworld): fix example link

* style: auto format

* New files from Fly.io Launch

* Revert "New files from Fly.io Launch"

This reverts commit 71d9f42f5f0073f35bc34ac4e9417e4a4a1d94fc.

* Fix: resolved requested changes

* fix: implement suggested changes

* fix: fix variable names

* fix: update error messages and improve data handling in Ganjing World routes

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Fly.io <noreply@fly.io>
Co-authored-by: fly-io[bot] <52462049+fly-io[bot]@users.noreply.github.com>
2026-01-20 01:14:22 +08:00
Tony ac1a0230ce
feat(route): discord quests (#20911)
* feat(route): discord quests

* fix(route): handle missing Discord authorization config
2026-01-18 08:58:27 +08:00
Chen Yang 4c7e027ff3
feat(route): add mrinalxdev blog RSS route (#20909)
Co-authored-by: Mike Chen <yang.chen.mike@gojek.com>
2026-01-18 03:25:24 +08:00
redwood9 06858d215d
feat(route): add ai-bot daily-ai-news route (#20851)
* feat(route): add ai-bot daily-ai-news route

* feat(route): add ai-bot daily-ai-news route

* refactor(route/ai-bot): use flatMap and parseDate utility

- Replace push with flatMap for cleaner code
- Use RSSHub's parseDate utility instead of custom Date creation

* refactor(route/ai-bot): use timezone utility instead of hardcoded time
2026-01-17 21:05:01 +08:00
Pilgrim Lyieu 8bb3d6f019
feat(bilibili): add messages routes (#20890)
* feat(bilibili): add messages routes

* fix(bilibili/message): do not display summary when no unread messages

* fix(bilibili/message): update cache duration to use configurable routeExpire
2026-01-16 01:34:43 +00:00
Tony c21c82fc05
feat(route/digg): add digg community posts (#20900)
* feat(route/digg): add digg community posts

* Update lib/routes/digg/community.tsx

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

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-15 22:01:16 +08:00
Vanilla 3ecf9ee350
fix(lib/registry.ts): Allow hide debug info. (#20891) 2026-01-15 19:33:36 +08:00
YuRuiH bef22f9500
feat(route): add some nowcoder route (#20712)
* feat(route): add nowcoder hots content route

* refactor(nowcoder): use query param for hots size

* feat(route): add nowcoder interview experience

* fix(nowcoder/interview): align interview route with RSSHub conventions

* fix(nowcoder/hots): align hots router with RSShub conventions

* fix(nowcoder): polish hots route
2026-01-15 17:03:49 +08:00
Tony 671f05e645
fix(route/rsshub): route updates (#20888)
* fix(route/rsshub): route updates

* fix(handler): simplify data parsing and improve route link formatting
2026-01-15 05:40:50 +08:00
Samuel.G 1f3b11c919
feat(route): add lancedb blog route (#20886)
* feat: add lancedb blog

* resolve comment
2026-01-15 03:04:11 +08:00
Pilgrim Lyieu 0e48234e14
fix(github): allow empty notifications feed (#20875)
* fix(github): allow empty notifications feed

* fix(github): set `allowEmpty` to be always true
2026-01-13 23:07:20 +08:00
Pesy Wu 8225bb113a
feat(route): Adapt to the latest parameters of GDUT oas site and correct the name of the site (#20860)
* feat: Adapt to the latest parameters of GDUT oas site and correct the site name

* docs: Add more information for GDUT oas route

* style: removed unused property `publish`

* fix: change the wrong key name of publish date that causes incorrect time in feed

* style: removed useless remark after removing `publish`
2026-01-13 11:12:45 +08:00
Tony b22fdd8c91
fix(route): remove rejectUnauthorized option (#20864)
ofetch and undici simply ignore it
2026-01-13 10:35:10 +08:00
Tony af2592b10a style: fix no-useless-concat 2026-01-13 03:53:08 +08:00
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
tmr d4b865a4f2
feat(route): add Read Something Wonderful (#20696)
* feat(route): add anthropic research

* feat(route): simplify code

* feat: add route for Read Something Wonderful articles

* refactor: remove ID-based sorting from results.

* refactor(routes/readsomethingwonderful): simplify API request

Simplify the API request by removing unnecessary headers and adding format parameter.

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

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-12-16 00:05:40 +08:00
Zhenlong Huang 5a240fee65
feat(routes/techflowpost): add featured featured route (#20695)
* feat(routes/techflowpost): add featured featured route

* fix: use path parameter instead of query parameter

* fix(routes/techflowpost): update featured title for clarity

* fix(routes/techflowpost): enhance featured route with category mapping
2025-12-15 22:32:02 +08:00
Blank0120 bdabe6929c
fix(route/sspai): add body_extends in sspai tag route (#20709) 2025-12-15 18:59:19 +08:00
Ethan Shen 32288b6bb2
feat(route): add TheBrain Blog (#20697) 2025-12-15 01:39:09 +08:00
Zhenlong Huang 9f09c37c30
fix(routes/anthropic): fix page parsing logic (#20693)
* fix(routes/anthropic): fix page parsing logic

* fix(routes/anthropic): update content selector for improved page parsing
2025-12-13 13:37:44 +08:00
Elijah Lopez 6ba2c5f82a
feat(route): add canada.ca (#20680) 2025-12-13 12:07:18 +08:00
Tony dd7382a419
feat(route/carousell): add carousell (#20677)
* feat(route/carousell): add carousell

* feat(route/carousell): update search title format to include region
2025-12-11 21:21:39 +08:00
Tony caef0fe811
fix(route/twitch): update gql hash (#20670) 2025-12-10 15:12:58 +08:00
Yufan You e5ae378fe9
fix(routes/lovelive-anime): update full text CSS selector (#20665) 2025-12-10 13:40:52 +08:00
Ethan Shen 781da24210
feat(route): add 数字尾巴标签 (#20618)
* feat(route): add 数字尾巴标签

* fix typo
2025-12-10 00:25:03 +08:00
Yufan You c2cff410fa
fix(routes/mastodon): don't refresh account ID cache (#20663)
The account ID may change, so the cache should not be refreshed indefinitely.
2025-12-09 22:31:16 +08:00
Yufan You 7fc7a62a25
fix(routes/mercari): set cache max age to routeExpire (#20653)
Item description and price may change, and it can be critical to get the
latest price, otherwise the item may be bought by others.

However, it's still useful to cache the result, as it might be used by
other routes (e.g. different keywords or sorting parameters).
2025-12-09 20:29:06 +08:00
Dzming Li dbb692462d
chore: add Nix flake and NixOS module support (#20597)
* feat(nix): add flake module and offline-friendly build

* chore(nix): upgrade to Node.js 24 and pnpm 10

Update devenv.nix to match project dependencies:
- Upgrade Node.js from 22 to 24 (aligns with Dockerfile node:24-bookworm)
- Upgrade pnpm from 9 to 10 (aligns with package.json pnpm@10.22.0)

* test: fix buffer-get test timeout

Replace external URL with mock server endpoint to prevent test timeout.
The test was trying to fetch from http://example.com which is not mocked,
causing it to timeout. Now uses http://rsshub.test/headers which is
properly mocked in the test setup.
2025-12-09 19:43:06 +08:00
Tony 24612ee4d8
fix(route/tiktok): fix route (#20648)
* fix(route/tiktok): fix route

* fix(route/tiktok): clarify comment on officalItem property
2025-12-08 01:00:47 +08:00
Stephen Zhou fd98be1027
chore: fix art template on vercel (#20647) 2025-12-08 00:21:14 +08:00
iamsnn 531f8a1249
feat(route): add bntnews (#20638)
* add routes for bntnews

* fix reviews
2025-12-07 20:23:08 +08:00
WuNein fd12cf8e75
fix(route/huggingface): add huggingface group models detail (#20646)
* Adding Huggingface Model details

* more robust

* fix deepscan's problem, shall not be a problem !!!!! 404 should be a proper state !!!!!

* md2html and image url fix
2025-12-07 17:40:02 +08:00
Stephen Zhou add80cdb57
chore: fix vercel serve static 2025-12-06 23:50:22 +08:00
WuNein dd142bff03
feat(route): add huggingface group models route (#20631)
* feat(route): add huggingface group models route

* feat(route): add huggingface group models route , eslint fix

* feat(route): add huggingface group models route , eslint fix

* remove Unnecessary  fliter

* remove no use date
2025-12-06 10:59:39 +08:00
Jinghao Tu 7196256dcd
fix(route/huggingface): fix getting blog links and community blog author data handling. (#20644)
* fix(route/huggingface): fix getting blog links and community blog author data handling.

* fix(route/huggingface): fix property error.
2025-12-06 01:04:10 +08:00
Stephen Zhou 601ce1a72e
feat(route/hupu): news route for teams 2025-12-05 23:09:12 +08:00
sk22 c78612645f
feat(route/oevw): add route for oevw.at (#20595)
* feat(route/oevw): add route for oevw.at

* chore(route/oevw): improve parameter documentation

* fix(route/oevw): decode url-encoded param

---------

Co-authored-by: Samuel Kaiser <samuel.kaiser@timetoact.at>
2025-12-05 22:33:13 +08:00
fishyo a8b004eb64
feat(route): add supercell game blog routes (#20545)
* feat(route): add supercell game blog routes

- Add support for 5 supercell games (Clash Royale, Brawl Stars, Clash of Clans, Boom Beach, Hay Day)
- Support 12 languages (en, zh, zh-hans, fr, de, id, it, ja, ko, pt, ru, es)
- Extract blog posts from __NEXT_DATA__ JSON
- Cache full article content with fallback to summary

* feat: add Supercell game blog route

* fix(supercell): use regex to extract __NEXT_DATA__ JSON, remove cheerio dependency

* fix(supercell): use bodyCollection to render content, fix namespace capitalization

* fix: improve supercell blog route to extract full content from bodyCollection

- Implement renderRichText and renderNodeContent functions to properly parse rich text JSON format
- Handle both TextBlock and FeatureBlock types from bodyCollection
- Support text formatting marks (bold, italic, underline, code)
- Add proper type annotations to handler function and variables
- Use Next.js JSON endpoint instead of HTML parsing for better performance
- Add error handling with fallback to description if full content extraction fails

* feat(supercell): add ImageBlock and CarouselBlock support for multi-game content extraction

* fix(supercell): use else-if chain and for-of loop for block handling

* refactor(supercell): extract renderBlock function to reduce complexity

* fix(supercell): use switch statement for block type handling
2025-12-04 23:59:51 +08:00
sk22 75480d248e
feat(route): Add route for BWSG.at (#20542)
* feat(category): add housing category

* feat(route): Add route for bwsg.at

* fix(route/bwsg): improve feed title

* Revert "feat(category): add housing category"

This reverts commit 953f59421717592dc5d8f2e0d8c42b5d54c77c72.

* fix(route/bwsg): change category

* fix(route/bwsg): fetch all pages

* fix(route/bwsg): fix eslint rules

* chore(route/bwsg): only fetch first page

---------

Co-authored-by: Samuel Kaiser <samuel.kaiser@timetoact.at>
2025-12-04 04:46:15 +08:00
Andvari 5ea6b7a724
fix(route/huxiu): Replace API endpoint for `moment` route (#20388) 2025-12-03 22:59:47 +08:00
千代有希= 81b0d3ef9d
feat(route): add 12 more route of ECNU's insititutes (#20582)
* 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

---------

Co-authored-by: FrozenStarrrr <frozenstars@qq.com>
2025-12-03 21:37:24 +08:00
Tony be0b608d1b
fix(route/springer): handle authz manually (#20629) 2025-12-03 16:38:14 +08:00
PolarisStarnor 8fcbaac983
feat(route/tumblr): Add Tumblr tagged route (#20576)
* tumblr.com: Code to access tagged/ endpoint

* tumblr.com: Change processPost for tagged endpoint

* Tumblr.com: "Tagged" response is a list of posts

* tumblr.com: removed unnecessary link

* tumblr.com: fixing api key auth as per https://www.tumblr.com/docs/en/api/v2#authentication

* tumblr.com: user query params properly

* tumblr.com: compliance with Script Standard

* tumblr.com: ensuring `api_key` works for posts.ts

* tumblr: don't mess up the types this time

* tumblr/tagged/:tag Feed Description + Link

* /tumblr Can now parse blog answers

* /tumblr "answer" is the correct type

* /tumblr: Better format for blog answers

* /tumblr: fixed misplaced </p> tag

* lib/routes/tumblr/tagged.ts: Removed unnecessary template literals

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

* /tumblr/tagged: Only one category

* /tumblr: Fixed how the asker's url is handled

* Ran ESLint

---------

Co-authored-by: Tony <TonyRL@users.noreply.github.com>
2025-12-03 13:13:09 +08:00
Tony e108a0772b
fix(route/thepaper): add cookie (#20615)
* fix(route/thepaper): add cookie

* fix(route/thepaper): migrate from got to ofetch for API requests
2025-12-02 15:51:17 +08:00
Tony 15c703cafd
fix(route/nhk): add manual authz (#20612) 2025-12-02 14:54:45 +08:00
Rongrong 3158a46956
fix(route/weibo/utils): tryWithCookies: Cookies expiration not detected (#20583)
* feat(route/weibo/utils): getCookies: Add cooldown time

Signed-off-by: Rongrong <i@rong.moe>

* fix(route/weibo/utils): tryWithCookies: Cookies expiration not detected

Signed-off-by: Rongrong <i@rong.moe>

---------

Signed-off-by: Rongrong <i@rong.moe>
2025-12-02 11:59:52 +08:00
Jinghao Tu d81a7b2b32
fix(route/huggingface): restore article list and author parsing (#20599)
* fix(route/huggingface): restore article list and author parsing

- lib/routes/huggingface/blog-zh.ts: Read articles from data.props.allBlogs and construct /blog/zh/:slug links; use authorsData (fullname or name) for author names.
- lib/routes/huggingface/blog.ts: Read articles from data.props.allBlogs and switch author parsing to authorsData (fullname or name); preserve upvotes and thumbnail handling.
- lib/routes/huggingface/daily-papers.ts: Relax selector to read data.props from div[data-target="DailyPapers"] so DailyPapers props can be retrieved.

* fix(route/huggingface): use api instead of http; title is at right property.
2025-12-01 23:57:43 +08:00
DIYgod 7f5ae64a2f
feat(twitter): add UserMedia support and enhance pagination logic 2025-12-01 22:57:09 +08:00
Ethan Shen 295a4f845e
feat(route): add Produce Report (#20596) 2025-12-01 21:54:05 +08:00
github-actions[bot] b6dbafe33e style: auto format 2025-11-28 16:22:58 +00:00
sk22 a590f9a723
feat(route/wogem): Add route for WOGEM.at housing cooperative (#20555)
* feat(category): add housing category

* feat(route/wogem): add route for wogem.at

* Revert "feat(category): add housing category"

This reverts commit 953f59421717592dc5d8f2e0d8c42b5d54c77c72.

* feat(route/wogem): change category

* fix(route/wogem): remove redundant filter parameter

---------

Co-authored-by: Samuel Kaiser <samuel.kaiser@timetoact.at>
2025-11-28 00:15:13 +08:00
github-actions[bot] edfac9f24c style: auto format 2025-11-27 05:54:33 +00:00
github-actions[bot] 838eb3c7ff style: auto format 2025-11-27 05:49:33 +00:00
Ethan Shen 4e4c058ad6
feat(route): add 数字尾巴兴趣 (#20463)
* feat(route): add 数字尾巴兴趣

* fix typo

* Update lib/routes/dgtle/feed.ts

* style: reorder imports for better organization

---------
2025-11-27 11:39:44 +08:00
Tony 21984b58c6 style: fix import statement formatting 2025-11-27 11:29:49 +08:00
Tony bf9f4b5961 style: fix import 2025-11-27 11:22:19 +08:00
Stephen Zhou d5e4fba8b2
style: format 2025-11-27 11:04:48 +08:00
github-actions[bot] a28890a135 style: auto format 2025-11-27 02:55:46 +00:00
Stephen Zhou 411bf6e445
fix(package): no fallback serve for package mode 2025-11-27 03:33:44 +08:00
Stephen Zhou da5f5080fe
fix(package): import namespaces dynamically 2025-11-27 03:18:35 +08:00
Stephen Zhou 399627cb65
feat(package): export utils 2025-11-27 02:18:00 +08:00
Stephen Zhou c83f27bd44
feat(package): register route 2025-11-27 02:06:18 +08:00
Stephen Zhou 69a859ca9d
refactor(package): simple type solution 2025-11-27 01:21:20 +08:00
Stephen Zhou bc86bda10d
fix(package): allow empty conf 2025-11-26 21:48:35 +08:00
Stephen Zhou b4a2aa5e70
fix(core): package mode (#20580) 2025-11-26 20:44:18 +08:00
Cason Kervis 87bb77ca4c
fix(route/sspai/index): fix order (#20575) 2025-11-26 20:12:05 +08:00
Ethan Shen 68fdac3ea2
feat(route): add 中国百货商业协会 (#20571)
* feat(route): add 中国百货商业协会

* fix typo
2025-11-26 09:13:42 +08:00
Serhii Hospodarchuk 81b03f2d8a
fix(route/substack): use ofetch directly to avoid xml parse errors (#20564)
* fix(route/substack): clean up xml before parsing

* fix(route/substack): use ofetch directly to avoid xml parse errors

* fix(route/substack): use isValidHost to validate the user
2025-11-26 04:54:21 +08:00
Tony fb3ae13f79 fix: update import statements to use local ofetch utility 2025-11-26 03:38:50 +08:00
Tony 87641236b8
fix(route/iwara): use ofetch (#20572) 2025-11-26 03:37:24 +08:00
sk22 d8c2be5710
feat(route): Add route for wiensued.at cooperative housing (#20552)
* feat(category): add housing category

* feat(route/wiensued): add route for wiensued.at

* Revert "feat(category): add housing category"

This reverts commit 953f59421717592dc5d8f2e0d8c42b5d54c77c72.

* feat(route/wiensued): change category

---------

Co-authored-by: Samuel Kaiser <samuel.kaiser@timetoact.at>
2025-11-26 03:09:22 +08:00
sk22 cbff05689a
feat(route): Add WBV-GPA Austrian communal housing search (#20544)
* feat(category): add housing category

* feat(route): Add WBV-GPA housing search

* fix(route/wbv-gpa): fix import

* fix(route/wbv-gpa): fix feed title

* Revert "feat(category): add housing category"

This reverts commit 953f59421717592dc5d8f2e0d8c42b5d54c77c72.

* feat(route/wbv-gpa): change category

---------

Co-authored-by: Samuel Kaiser <samuel.kaiser@timetoact.at>
2025-11-26 01:53:31 +08:00
sk22 36b6b34ffc
feat(route): Add route for gesiba.at (#20538)
* feat(category): add housing category

* feat(route): Add gesiba.at route

* fix(route/gesiba): improve feed, fix imports

* fix(route/gesiba): fix feed title

* Revert "feat(category): add housing category"

This reverts commit 953f59421717592dc5d8f2e0d8c42b5d54c77c72.

* fix(route/gesiba): change category

---------

Co-authored-by: Samuel Kaiser <samuel.kaiser@timetoact.at>
2025-11-25 23:36:44 +08:00
sk22 9946c99ff6
feat(route): Add route for oesw.at (#20537)
* feat(category): add housing category

* feat(route): add oesw.at housing search

* fix(route/oesw): append count to guid instead of link

* fix(route/oesw): fix feed title and imports

* Revert "feat(category): add housing category"

This reverts commit 953f59421717592dc5d8f2e0d8c42b5d54c77c72.

* feat(route/oesw): change category

---------

Co-authored-by: Samuel Kaiser <samuel.kaiser@timetoact.at>
2025-11-25 22:12:44 +08:00
Saif Azmi ad79cc6870
docs(route/linkedin/posts): update Puppeteer requirement to true (#20551) 2025-11-23 22:02:00 +08:00
AiraNadih ea262406ac
fix(route/kemono): fallback to added date if published date is missing (#20548)
Co-authored-by: AiraNadih <AiraNadih@users.noreply.github.com>
2025-11-23 21:48:24 +08:00
Tony 934d95a4ed
fix(route/1point3acres): handle optional tags in category assignment (#20547) 2025-11-23 13:11:09 +08:00
Zhengyi 98014554ca
fix(route/qidian/chapter): Add User Agent (#20513) 2025-11-23 04:44:10 +08:00
Ethan Shen 4caa9f65a3
feat(route): add 北青网 (#20539)
* feat(route): add 北青网

* fix typo
2025-11-22 22:19:15 +08:00
千代有希= e0aee671fb
feat(route): add some insitutes' routes of ECNU (#20532)
* 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

---------

Co-authored-by: FrozenStarrrr <frozenstars@qq.com>
2025-11-22 22:06:51 +08:00
Rongrong 6eb460c33b
feat(route/weibo): Fetch visitor Cookies before accessing some APIs (#20534)
* feat(route/weibo): Fetch visitor Cookies before accessing some APIs

Signed-off-by: Rongrong <i@rong.moe>

* fix(route/weibo/utils): getCookies: return too early on slow connection

Signed-off-by: Rongrong <i@rong.moe>

* fix(route/weibo/utils): getCookies: Redirection assertion is too loose

Signed-off-by: Rongrong <i@rong.moe>

---------

Signed-off-by: Rongrong <i@rong.moe>
2025-11-22 06:04:14 +08:00
IChengHo 8c7cd6832e
fix(route/phoronix): Use `ofetch` and `parseString` for reliable feed fetching (#20543)
The `rss-parser`'s internal `parseURL` method can fail with an "Error:
Non-whitespace before first tag" on feeds that are gzipped or contain a
Byte Order Mark (BOM), as it lacks robust decompression and encoding
handling.

This change switches the Phoronix route to:

Fetch the raw XML string using `ofetch`, which handles compression and
encoding correctly.

Pass the resulting clean string to `parser.parseString()`.

This resolves the parsing issue and ensures the route is reliable.
2025-11-22 04:33:29 +08:00
Rongrong 3ede128c55
fix(route/picnob): bring back support for diygod/rsshub:chromium-bundled (#20504)
* ci(docker-release): enable ZRAM to reduce memory pressure

This should hopefully help reduce stuck build jobs. Note that this can't
completely eliminate stuck builds since this is usually caused by
synchronization issues in QEMU.

Signed-off-by: Rongrong <i@rong.moe>

* build(Dockerfile): Add support for puppeteer-real-browser

Sets CHROMIUM_EXECUTABLE_PATH on AMD64 and installs essential
dependencies.

Signed-off-by: Rongrong <i@rong.moe>

* fix(route/picnob): bring back support for diygod/rsshub:chromium-bundled

The support for puppeteer-real-browser on diygod/rsshub:chromium-bundled
was improperly implemented in 400fb1fa49 ("fix(route/picnob): use
puppeteer-real-browser to pass cf check (#20478)") and was then removed
in 2cb11d7c7e ("fix(route/picnob): support img not in slide").

With proper support for puppeteer-real-browser added to Dockerfile, this
patch brings back the support for diygod/rsshub:chromium-bundled.

This partially reverts commit 2cb11d7c7e ("fix(route/picnob): support
img not in slide").

Signed-off-by: Rongrong <i@rong.moe>

* chore(route/picnob): add myself as maintainer

This route explicitly consult CHROMIUM_EXECUTABLE_PATH from the docker
image variant `diygod/rsshub:chromium-bundled`. Since I am the author of
the image variant, add myself as one of route maintainers so that I am
mentioned when the route is broken.

Signed-off-by: Rongrong <i@rong.moe>

# Conflicts:
#	lib/routes/picnob/user.ts

---------

Signed-off-by: Rongrong <i@rong.moe>
2025-11-21 01:23:22 +08:00
千代有希= 28bc65d0be
feat(route): add ECNU Software Engineering Insitute notices route (#20531)
* 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

---------

Co-authored-by: FrozenStarrrr <frozenstars@qq.com>
2025-11-21 00:32:29 +08:00
Ethan Shen d91d4681a0
feat(route): add Cloudflare Status (#20514)
* feat(route): add Cloudflare Status

* fix: missing type
2025-11-20 00:09:54 +08:00
FrozenStar 46086571b9
feat(route): add East China Normal University Undergraduate Office notice (#20515)
* feat(route): add East China Normal University Undergraduate Office notices

Co-authored-by: Yuki Chiyo <chiyo.uk@outlook.com>

* fix(route): delete a useless option and modified outdated url

Co-authored-by: Yuki Chiyo <chiyo.uk@outlook.com>

---------

Co-authored-by: Yuki Chiyo <chiyo.uk@outlook.com>
2025-11-19 21:57:07 +08:00
Tony d5cd095599
feat(route): add picnob.info (#20517) 2025-11-19 03:02:28 +08:00
Tony 5f80a3001f
fix(route/google): replace puppeteer with google-play-scraper (#20516)
* feat(route/google): replace puppeteer with google-play-scraper

* fix: override more deps

* fix(route/google/play): correct import casing for google-play-scraper
2025-11-19 02:54:37 +08:00
Keo ccfca1ad19
fix(route/ntrblog): use utils/got to get feed content (#20511) 2025-11-19 01:55:34 +08:00
surwall 1ffd371dfe
feat(route): add Google Play Store (#20231)
Co-authored-by: Xinhao Luo <neverbehave@fastmail.com>
2025-11-17 13:32:10 -08:00
Andvari ed51422824
fix(route/initium): replace got with ofetch and handle dead link (#20494)
* fix(route/initium): replace got with ofetch and handle dead link

* fix(route/theinitium): update fetchWebPage to handle new article structure
2025-11-18 01:29:51 +08:00
Stephen Zhou 4ab0547d9d
fix(route/picnob): ignore detail page error 2025-11-17 12:24:20 +08:00
Ethan Shen 87e2225139
fix(route): 中国炼焦行业协会 (#20493) 2025-11-17 00:13:31 +08:00
Liao-Ke 6e5409d7eb
feat(route): add AI 博客 (#20488)
* feat(route): add AI 博客

新增了一个归档路由处理函数,用于抓取AI博客的所有文章归档。

- 定义了一个新的路由配置对象`route`,路径为`/archives`,属于`blog`类别。
- 使用`ofetch`获取归档页面内容,并通过`cheerio`解析HTML。
- 遍历每个月份分组内的每篇文章,提取标题、链接、发布时间,并存储在列表中。
- 对列表中的每个条目,使用`cache.tryGet`缓存文章详情,若无缓存则再次使用`ofetch`获取,并解析出文章的主要内容。
- 返回处理后的结果对象,包含优化后的标题、归档页面链接以及过滤无效数据后的文章列表。

新增了一个命名空间配置对象`namespace`,用于定义AI博客的基本信息。

- 定义了一个新的命名空间配置对象`namespace`,包含站点名称、URL和语言。

* refactor(handler): 优化归档页面处理逻辑

- 使用 `toArray()` 和 `flatMap()` 方法简化了遍历每个月份分组和提取文章信息的代码逻辑。
- 修正了 `link` 属性的处理,确保当链接不存在时返回空字符串。
- 添加了 `author` 和 `description` 属性到文章对象中,以便更完整地描述文章内容。
- 精简了每个文章项的 `description` 构建,去除了不必要的 HTML 结构复制。
2025-11-16 23:48:33 +08:00
DIYgod 92032a8c51
fix(twitter): update proxy agent implementation to use new Client and HttpCookieAgentCookie 2025-11-15 09:37:48 +08:00
DIYgod d03f5697a4
fix(twitter): replace zstd decompression with gzip for third-party API requests 2025-11-15 09:01:46 +08:00
Tony e3c18adc71
chore: bump to node 24 (#20486) 2025-11-15 03:56:04 +08:00
github-actions[bot] 099fde307f style: auto format 2025-11-14 17:58:02 +00:00
Tony daf9460e6a
fix(router/twitter): replace zstd decoder with native zlib decompression (#20485)
* fix(twitter): replace zstd decoder with native zlib decompression

* fix(twitter): update node version compatibility and enable experimental features
2025-11-15 01:56:23 +08:00
Ethan Shen d9d807ab12
feat(route): add 数字尾巴视频 (#20470)
* feat(route): add 数字尾巴视频

* fix pubDate
2025-11-15 00:15:22 +08:00
Stephen Zhou 2cb11d7c7e
fix(route/picnob): support img not in slide 2025-11-14 22:10:32 +08:00
Stephen Zhou 400fb1fa49
fix(route/picnob): use puppeteer-real-browser to pass cf check (#20478) 2025-11-14 15:32:09 +08:00
DIYgod a07565d356
feat(api): implement zstd decoding for third-party API responses 2025-11-14 14:13:18 +08:00
DIYgod 6e29199fd2
fix(cache): update request URL for cookie retrieval in getCookie function 2025-11-14 12:08:13 +08:00
IChengHo 6969cf1bcb
fix(route/twreporter): Prevent crash when hero_image or og_image is missing (#20481)
The original code directly accessed nested properties on
`post.hero_image`, which is not guaranteed to exist.
This cause a TypeError when the image object was nil.

This commit introduces safe access by:
- Prioritizing `hero_image` but falling back to `og_image`
- Only rendering the banner if a valid image URL was resolved
2025-11-14 11:22:13 +08:00
Tony 2ae10a7a02
feat: replace rand-user-agent with header-generator (#20480)
* Initial plan

* Replace @tonyrl/rand-user-agent with header-generator and add sec-ch-* headers

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

* Extract unwanted UA validation into standalone isValidUserAgent function

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

* Add headerGeneratorPreset option to got and ofetch utilities

* Replace randUserAgent usage in lib/routes with headerGeneratorPreset option

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

* chore: pin header-generator to exact match

* fix: replace randUserAgent with a static user agent string in config

* Remove deprecated _randUserAgent function and related tests

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

* refactor: rename to header-generator

* Changes before error encountered

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

* fix: update generateHeaders parameter type to Partial<HeaderGeneratorOptions>

* fix: add ios preset

* fix: rename headerGeneratorPreset to headerGeneratorOptions

* feat: add MODERN_IOS preset and update header-generator patch hash

* fix: use ios preset

* fix: update FetchOptions to include headerGeneratorOptions type

* refactor: simplify header generation and update header inclusion list

* fix: remove header-generator patch

* refactor: update user-agent handling in requests and tests

* test: remove redundant headerGeneratorOptions test and add new ofetch header preset test

* test: add custom user-agent test for ofetch

* test: update user-agent expectation in ofetch headers test

* Update lib/utils/ofetch.ts

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

* refactor: replace hardcoded headers with generatedHeaders in fetch and get request handlers

* refactor: rename test suite from rand-user-agent to header-generator and remove unused dependency

* Update lib/utils/header-generator.ts

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

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: TonyRL <11386903+TonyRL@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-14 00:49:41 +08:00
Ethan Shen 60ad86b6f6
fix(route): 艾瑞咨询研究报告 (#20450)
* fix(route): 艾瑞咨询研究报告

* fix loop

* fix typo

* fix typo
2025-11-13 00:15:25 +08:00
Kenny Fong bea6da0dd2
feat(route/futunn): add live, topic and video (#20464)
* add live, topic and video

* fix issues

* Update lib/routes/futunn/topic.ts
2025-11-12 22:26:35 +08:00
Tony 4e247a46ae
fix(route/youtube): ensure youtubei is not invoked when using google api (#20469) 2025-11-11 21:54:48 +08:00
Tony dac672d3bb
fix(route/youtube): ensure youtubei is not invoked when using google api (#20465) 2025-11-11 15:27:47 +08:00
Tony da32313da8
feat(route): add netflix (#20453)
* feat(route): add netflix

* feat: add research

* fix: remove migrated entries

* fix: clean up

* fix: remove optional chaining for embedLink and title in render function

* fix: remove optional chaining for embedLink

* fix: image url

* fix: remove empty target field in radar configuration
2025-11-09 23:00:07 +08:00
Aicnal Liueic f0f561a894
feat(router): add router of Capital Normal University (#20430) 2025-11-07 18:28:16 +08:00
Ethan Shen 83f7013951
feat(route): add 数字尾巴文章 (#20435) 2025-11-06 00:59:15 +08:00
Tony 13e7784944
fix(route): apple app store (#20427) 2025-11-05 05:11:28 +08:00
Tony 9e3ca7471c
fix(route): bilibili ranking (#20426)
* fix(route): bilibili ranking

* fix: split apiUrl for signing

* feat(route): add radar mapping for ranking redirects
2025-11-04 22:47:28 +08:00
Ethan Shen efd864446d
feat(route): add 中国炼焦行业协会栏目 (#20418) 2025-11-04 09:04:53 +08:00
Tony d2c310c66c
feat(route): add ctinews (#20419)
* feat(route): add ctinews

* fix(handler): adjust publication date timezone for video items

* fix(handler): correct timezone function import for publication date
2025-11-04 01:20:14 +08:00
AhsokaTano26 36eb792493
feat(route): add CQU jwc notification (#19468) 2025-11-03 22:00:35 +08:00
DIYgod 8d560d18f4
fix(route/bilibili/video): update Referer and origin headers for API request 2025-11-03 11:30:10 +08:00
Tony ec0d80d91f
fix(route/tophub): fix selectors (#20408)
* fix(route/tophub): fix selectors

* fix(route/tophub): include image in response
2025-11-03 04:18:27 +08:00
Ethan Shen 64399c50d1
feat(route): add 星林社区 (#20403)
* feat(route): add 星林社区

* fix typo
2025-11-02 16:18:31 +08:00
Tony 4e93cf357b
fix(route): apple iap (#20404) 2025-11-02 01:30:43 +08:00
HappyZhu99 77b07b3b47
feat(router/aiaa): rebuild rss from official (#20390)
* feature(route/aiaa): new router added

* feature(router/aiaa): rebuild rss from official

* feature(route/aiaa): new to old pudate list with preprint and current issue

* feature(route/aiaa): fix example

* feat(route/aiaa): fix path

* feat(route/aiaa): fix path

* feat(route/aiaa): reuse DataItem and other optimization

* delete empty file

* fix namespace
2025-10-30 14:31:31 +08:00
HappyZhu99 b93555f1ff
fix(route/ieee): add full abstract (#20391)
* fix(route/ieee): add full abstract

* fix(route/ieee): get full abstract elegantly

* better performance
2025-10-30 13:57:03 +08:00
Tony 9810bf7618
fix(route/mymusicsheet): update urls (#20395)
* fix(route/mymusicsheet): update urls

* fix(route/mymusicsheet): update isFree logic to handle freeOnly parameter correctly
2025-10-30 05:01:39 +08:00
Tony c33c9b1762
fix(route): add youtube referer (#20396) 2025-10-30 04:56:32 +08:00
Tony e6cef5ad4c
fix(middleware): ensure referrerpolicy is set only if not already defined (#20394) 2025-10-30 04:40:05 +08:00
Ethan Shen b9c1f81f9d
feat(route): add 数字尾巴鲸闻 (#20384)
* feat(route): add 数字尾巴鲸闻

* fix typo
2025-10-30 00:05:19 +08:00
dependabot[bot] 64a3b06d16
chore(deps): bump ofetch from 1.4.1 to 1.5.0 (#20392)
* chore(deps): bump ofetch from 1.4.1 to 1.5.0

Bumps [ofetch](https://github.com/unjs/ofetch) from 1.4.1 to 1.5.0.
- [Release notes](https://github.com/unjs/ofetch/releases)
- [Changelog](https://github.com/unjs/ofetch/blob/v1.5.0/CHANGELOG.md)
- [Commits](https://github.com/unjs/ofetch/compare/v1.4.1...v1.5.0)

---
updated-dependencies:
- dependency-name: ofetch
  dependency-version: 1.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

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

* fix: use `query` instead of deprecated `params`

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-29 21:09:00 +08:00
AnitsuriW 283cc9cb93
feat(route): add AzurLane JP news (#20374)
* feat(route): add AzurLane JP news

* fix(route): azurlane jp incorrect namespace

* Update lib/routes/azurlane/news.ts
2025-10-29 19:53:58 +08:00
Stephen Zhou a0c5b08936
fix(route/bilibili): only get subtitle for jsonfeed (#20377)
* fix(route/bilibili): only get subtitle for jsonfeed

* Update lib/middleware/cache.ts

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

* Update lib/middleware/cache.ts

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

---------
2025-10-29 15:32:20 +08:00