* 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
* 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>
* 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
* 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): 少量修复内容
* 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
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.
* 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
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>
- 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>
* 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
* 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
* 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
* 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`
* 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.
* 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
---------
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>
- 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>
- 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>
* 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>
* 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.
* fix(route/patreon): support creator under /cw/
* fix(route/patreon): improve regex
* fix(route/patreon): streamline creator data extraction from Patreon API
* 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
---------
* 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
* 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
---------
* 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>
* 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>
* 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
* 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>
* 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
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).
* 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.
* 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
* 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
* 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>
* 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>
* 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.
* 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
* 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>
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.
* 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>
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
* 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>
* 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
* feat(route): add ctinews
* fix(handler): adjust publication date timezone for video items
* fix(handler): correct timezone function import for publication date
* 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
* 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>
---------