* feat(route/sjtu): add CS school academic activities
* refactor(route/sjtu/cs/xshd): use JSX for description and respect dedicated item fields
- Switch to .tsx with renderToString (Rule 25)
- Move 时间→pubDate (with HH:mm), 报告人→author, 封面→image (Rule 11)
- Drop hand-written referrerpolicy attributes (Rule 39)
- pubDate now preserves hour/minute when source provides it
* fix(route/sjtu/cs/xshd): separate publish date from event time
- pubDate now reflects announcement publish date:
- in-site articles: detail page 发布日期 (authoritative)
- WeChat-redirect items: extracted from image URL path /upload/image/YYYYMMDD/
- 举办时间 (event time) moved back into description (no longer duplicates pubDate)
* fix(route/sjtu/cs/xshd): remove manual title trimming (Rule 16)
* fix(route/sjtu/cs/xshd): address review comments
- Use response URL to detect WeChat redirect
- Fetch WeChat MP content via fetchArticle
- Remove try-catch around detail requests
- Remove dangerouslySetInnerHTML from JSX rendering
* fix(route/sjtu/cs/xshd): use ofetch consistently
* fix(route/sjtu/cs/xshd): fallback on WeChat MP WAF errors
* fix(route/sjtu/cs/xshd): fallback when detail enrichment fails
The route enriches list items by fetching detail pages, but some SJTU
detail URLs are redirect stubs to WeChat MP. In CI, those intermediate
detail requests can fail with no response before the route reaches the
WeChat MP parser, causing Promise.all to reject and the whole feed to
return 503.
Switch detail enrichment aggregation from Promise.all to
Promise.allSettled and fall back to list-page metadata for only the
failed item. Successful items are still enriched with in-site article
content or WeChat MP content.
This follows the existing resilient detail-fetching pattern in
lib/routes/usenix/usenix.ts and keeps the scoped WeChatMpError fallback
around fetchArticle(), similar to lib/routes/wechat/sogou.ts.
|
||
|---|---|---|
| .devcontainer | ||
| .github | ||
| .husky | ||
| .idx | ||
| assets | ||
| eslint-plugins | ||
| lib | ||
| logs | ||
| patches | ||
| public | ||
| scripts | ||
| .codecov.yml | ||
| .dockerignore | ||
| .editorconfig | ||
| .envrc | ||
| .gitignore | ||
| .npmrc | ||
| .oxfmtrc.json | ||
| .oxlintrc.ci.json | ||
| .oxlintrc.json | ||
| AGENTS.md | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| Dockerfile | ||
| LICENSE | ||
| README.md | ||
| SECURITY.md | ||
| app.json | ||
| devenv.nix | ||
| docker-compose.yml | ||
| eslint.config.mjs | ||
| flake.lock | ||
| flake.nix | ||
| fly.toml | ||
| package.json | ||
| pnpm-lock.yaml | ||
| tailwind.config.js | ||
| tsconfig.json | ||
| tsdown-container.config.ts | ||
| tsdown-lib.config.ts | ||
| tsdown-vercel.config.ts | ||
| tsdown-worker.config.ts | ||
| tsdown.config.ts | ||
| vercel.json | ||
| vitest.config.ts | ||
| wrangler-container.toml | ||
| wrangler.toml | ||
README.md
RSSHub
🧡 Everything is RSSible
Introduction
RSSHub is the world's largest RSS network, consisting of over 5,000 global instances.
RSSHub delivers millions of contents aggregated from all kinds of sources, our vibrant open source community is ensuring the deliver of RSSHub's new routes, new features and bug fixes.
RSSHub pairs especially well with Folo, an AI RSS reader for feed discovery and modern reading workflows. The project is also open source on GitHub.
Documentation | Folo | Telegram Group | Telegram Channel | X (Twitter)
Related Projects
- Folo | An AI RSS reader that works especially well with RSSHub. Source code: GitHub.
- RSSHub Radar | A browser extension that can help you quickly discover and subscribe to the RSS and RSSHub of current websites.
- RSSBud | RSSHub Radar for iOS platform, designed specifically for mobile ecosystem optimization.
- RSSAid | RSSHub Radar for Android platform built with Flutter.
- DocSearch | Link RSSHub DocSearch into Raycast.
- Awesome RSSHub Routes | Curated list of RSS feeds and RSSHub routes.
Contribute
We welcome all pull requests. Suggestions and feedback are also welcomed here.
Refer to Quick Start
Deployment
Refer to Deployment
Special Thanks
Author
RSSHub © DIYgod, Released under the AGPL-3.0 License.
Authored and maintained by DIYgod with help from contributors (list).
Blog @DIYgod · GitHub @DIYgod · X (Twitter) @DIYgod · Telegram Channel @awesomeDIYgod


