* feat(route/locals): add authenticated feed route
Add a Locals route with auth_token-based feed fetching, classic-to-beta URL fallback, and support for community, home, content, and content_plus feed views. Parse feed pages into RSS items using shared post selectors while surfacing clear errors when access is unavailable.
* feat(route/locals): add content feed
Add a Locals content route that uses the authenticated session-backed server functions instead of brittle page scraping. Support tier filters and media-type filters so paid and content-library posts can be subscribed to reliably.
* fix(route/locals): include content thumbnails
Use Locals preview and audio image fields so content and podcast entries expose thumbnails consistently. Render the image into item descriptions and standard image fields for better feed reader compatibility.
* fix(route/locals): include regular content posts
Keep Locals content feeds from dropping regular text and photo posts that arrive as no_content entries with real body content. Preserve image handling while leaving plus feeds unchanged when the source only returns five content-plus items.
* fix(route/locals): prefer content poster images
Prefer Locals poster-style preview images over raw first-frame captures when both are available. Keep the raw frame fallback for posts where the API does not expose a styled poster image.
* fix(route/locals): resolve runtime action ids
Derive the Locals feed action id from the current runtime assets instead of hardcoding build-specific server function ids. Tighten option validation with own-key checks and align the radar source with supported matching rules.
* fix(config): sort locals session settings
Move the Locals session env key and config blocks into alphabetical order so the route-specific configuration matches the repository's config layout rules.
* fix(config): reorder locals session settings
* fix(route/locals): simplify route and request handling
* fix(config): restore locals config ordering
* fix(config): sort security key entry
* fix(route/locals): adjust message clarity of path parameter necessity
* fix(route/2048): fix captcha handling and update cookie management
- Removed outdated cookie handling logic and replaced it with safeid extraction from the captcha HTML.
- Updated the response structure to use safeid instead of safe18Pass for cookie management.
- Enhanced enclosure extraction logic to support new sources。
* chore(route/2048): remove unused renderToString import
Made-with: Cursor
* fix(route/2048): prioritize magnet-text and reuse read_tpc node
Made-with: Cursor
* fix(route/iwara): use puppeteer to fix subscriptions route
* style: auto format
* style(route/iwara): remove unnecessary async keyword in fetchApi
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(apple): add full-text Apple Newsroom route
Add /apple/newsroom for the official Apple Newsroom China feed.
Fetch article pages to provide full-text content with cached detail requests, and normalize article metadata and media URLs.
Remove gallery navigation, download buttons, video playback controls, empty wrapper nodes, and other non-content UI elements from articles.
Format image and video captions as distinct descriptions, and drop duplicate captions when their text matches the article body.
* fix(apple): sanitize dangerous media URLs in newsroom route
* fix(route): refine Apple Newsroom route metadata and request handling
* fix(route): simplify Apple Newsroom description cleanup
* feat(route): add perplexity blog
Add route for Perplexity blog at /perplexity/blog, scraping
perplexity.ai/hub with Puppeteer. Extracts featured and regular
articles using data-framer-name selectors, deduplicates responsive
layout copies, and fetches full article text from detail pages.
* fix(route/perplexity): deduplicate article body text from Framer responsive copies
* fix(route/perplexity): return HTML content instead of plain text for article descriptions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(routes): add Inception Labs blog route
Adds RSS feed for https://www.inceptionlabs.ai/blog/
The page is built with Framer and served as SSR HTML, so no Puppeteer
is required — a regular HTTP fetch with a browser User-Agent suffices.
Two distinct blog card layouts are handled:
- Standard card: date and category in [data-framer-name="Date"] elements
- Featured card: date inside a <mark> element, category in [data-framer-name="Category"]
Each item includes title, publication date, author, category, and the
full article body extracted from [data-framer-name="Content"].
Route: /inceptionlabs/blog
Example: /inceptionlabs/blog
* refactor(routes/inceptionlabs): address review feedback
- Fix categories: technology -> programming (valid Category type)
- Remove redundant radar source (inceptionlabs.ai redirects to www)
- Add maintainer GitHub ID
- Replace custom PostMeta interface with existing DataItem type
- Use [data-framer-name="Desktop"] selector to avoid SSR duplicates
- Refactor card collection from .each()/push to .map()/.filter()
---------
Co-authored-by: Zdenek <tvuj-email@example.com>
Apple Podcasts changed the `#serialized-server-data` element from a
direct array to an object wrapper `{ data: [...], userTokenHash }`.
This broke the route with:
TypeError: Cannot read properties of undefined (reading 'data')
Changes:
- Handle both old (array) and new (object with `data` key) formats
using `Array.isArray()` check for backward compatibility
- Add defensive optional chaining on the `channel` relationship
access chain to prevent crashes when episodes lack channel data
Fixes the same underlying issue reported by yt-dlp (yt-dlp/yt-dlp#15926).
Made-with: Cursor
Co-authored-by: xbankeradmin <admin@xbanker.ai>
* feat(routes/cognition): add category support to blog route
- Add optional category parameter to blog route path
- Update radar configuration to support category routes
- Add new maintainer ttttmr
- Modify handler to handle category parameter
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: remove unused Data import and add missing parameters field
---------
Co-authored-by: Claude <noreply@anthropic.com>
* fix(routes/miyuki): format news titles with bracketed categories and keep full-text body-only
* fix(routes/miyuki): clean news body extraction and normalize images
- Updated lib/routes/miyuki/news.ts to keep item titles as plain article titles and store category information only in the `category` field.
- Switched the route to use the canonical Miyuki domain and added the route `url` metadata.
- Refined full-text extraction so `description` keeps only the main article body and excludes page header metadata such as section title, article title, date, and category.
- Fixed malformed article-body handling for pages like `10217`, where the source HTML structure breaks the original body selector.
- Normalized article images by deduplicating `for_pc` / `for_sp` duplicates, converting relative image URLs to absolute URLs, and replacing list-based photo blocks with plain containers so RSS readers do not render black bullets.
- Resolved the related CodeFactor/lint issues and verified the file with `oxlint` and `eslint`.
* feat(apple): add full-text Apple Newsroom route
Add /apple/newsroom for the official Apple Newsroom China feed.
Fetch article pages to provide full-text content with cached detail requests, and normalize article metadata and media URLs.
Remove gallery navigation, download buttons, video playback controls, empty wrapper nodes, and other non-content UI elements from articles.
Format image and video captions as distinct descriptions, and drop duplicate captions when their text matches the article body.
* fix(routes/miyuki): simplify image handling in news descriptions
* Remove unrelated changes from PR
* refactor(theinitium): rewrite routes for Ghost CMS, add cookie support
- Rewrite all routes to use Ghost Content API (old API deprecated)
- Add INITIUM_MEMBER_COOKIE env var for paid article full-text
- Add features block with requireConfig to all route files
- Add url field and radar rules per RSSHub standards
- Strip -zh-hans suffix from author/category display names
- Update namespace with English name and zh translations
- Mark follow route as deprecated (Ghost doesn't support it)
- Fix hostname binding to 0.0.0.0 for LAN access
* fix(theinitium): use routeExpire with refresh=false to prevent stale cache
Cache was never expiring because refresh=true (default) extends TTL on every hit.
Now uses 5-min routeExpire and won't extend on access.
* refactor(theinitium): address review feedback
- Remove unused INITIUM_USERNAME/PASSWORD/BEARER_TOKEN env keys
- Remove hardcoded User-Agent (use RSSHub's internal UA)
- Remove fragile html.length > 500 check
- Remove refresh: false from cache.tryGet
- Hoist stripLangSuffix to module scope (dedupe with cleanName)
* fix(theinitium): detect paywall CTA instead of length check
If cookie is invalid/expired, scrape returns paywall HTML.
Check for .gh-post-upgrade-cta to detect this and fall back
to cleaner Ghost API preview.
* revert(index): restore '::' hostname per #16513
* feat(theinitium): clean Ghost Koenig card HTML for RSS output
* fix(theinitium): use redirected Ghost API URL, remove unused config types
* fix(theinitium): remove unrelated neureality config changes
---------
Co-authored-by: Ryan Yao <ryanyao@Macmini.lan>
Co-authored-by: Ryan Yao <ryanyao@Ryans-Mac-mini.lan>
Co-authored-by: Ryan Yao <ryanyao@Ryans-Mac-mini.local>
* Add img=1 option to pornhub handlers to pass through images
* Move img=1 to a path parameter, and add clarifications on :lang, etc because each must be set to set the following
---------
Co-authored-by: acidicxjrl <acidicxjrl>
When ZHIHU_COOKIES is configured without __zse_ck, automatically fetch
the value from Zhihu's public static JS (static.zhihu.com/zse-ck/v3.js).
__zse_ck is a site-wide token (not user-specific) that Zhihu embeds in
a static JS file and rotates periodically. When it expires, routes that
scrape HTML pages (e.g. /zhihu/posts/people/:id) return 403, while
API-only routes are unaffected.
Users can now omit __zse_ck from ZHIHU_COOKIES and it will be fetched
and cached automatically, eliminating manual cookie rotation for this
token. Existing configs that include __zse_ck are unchanged.
* feat: add route and namespace for MeriTalk articles
* feat: update articles route to support pagination and add description rendering
* feat: enhance articles route with improved description and error handling
* feat(meritalk): add articles route with pagination limit
- Add latest articles route for Meritalk
- Update route example and parameter description
- Implement pagination limit to avoid Cloudflare anti-bot
* fix(meritalk): remove nums param and fetch only first page
* fix(meritalk): update route category to new-media
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
* fix(meritalk): remove the post-processing of items and modify some of the logic in the handler
- Remove unnecessary sorting.
- Remove custom limit logic.
---------
* feat(route/gcores): add user content routes with filtering
- Add user-talks route for user social posts, excluding podcasts and videos
- Add user-radios route for user podcasts with exclude_albums parameter to filter out specific albums
- Update cache middleware to include exclude_albums in cache key for proper cache separation
* chore(gcores): appease codefactor by simplifying radios handler
* Update lib/routes/gcores/user-radios.ts
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
* Update lib/routes/gcores/user-talks.ts
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
* fix: address PR review - add maintainer ID and remove inferrable types
* refactor(route/gcores): replace exclude_albums with album category for common param filtering
---------
* fix(university): update ncu jwc selector for new site version
* fix(university): update ncu jwc selector for new site version
* fix(ncu): use config.trueUA to comply with Rule 21
* fix(ncu): use config.trueUA to comply with Rule 21
* fix(ncu): simplify URL handling and fulfill route metadata
* fix(route): 8kcos selectors for latest/cat/tag pages
* fix: add maintainer info from #7237
* fix: use wordpress api
---------
Co-authored-by: choury <choury@users.noreply.github.com>
Images were not displaying in RSS feeds because the processImage function
was not being called to convert Zhihu's special image attributes
(data-actualsrc, data-original) to standard src attributes.
The homepage of daily.zhihu.com was redesigned and no longer contains
.box elements with story links. Additionally, the v7 /stories/latest
endpoint now requires authentication (returns 401).
Fix by switching to the publicly accessible v4 API:
- GET /api/4/stories/latest to list today's stories
- GET /api/4/story/:id for full story content (still public)
Also set antiCrawler: false since the v4 API is open.
Co-authored-by: choury <choury@users.noreply.github.com>
Some list entries are ad posts that redirect to
external domains with problematic TLS certificate
chains, causing detail fetch to fail and break the
route.
* fix(route/bbc): deal with the mixed bbc news data
fix#21227
* Update lib/routes/bbc/utils.tsx
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
---------
* 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>
* 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
* 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>
* 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
---------
* 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
* 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
* 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
---------
* 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