Commit Graph
8787 Commits
Author SHA1 Message Date
github-actions[bot] ce4ffa75b0 style: auto format 2026-06-16 12:14:09 +00:00
dependabot[bot] f4a49d429e chore(deps-dev): bump the oxc group across 1 directory with 4 updates (#22282)
* chore(deps-dev): bump the oxc group across 1 directory with 4 updates

Bumps the oxc group with 4 updates in the / directory: [@oxlint/plugins](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint-plugins), [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt), [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) and [oxlint-plugin-eslint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint-plugin-eslint).


Updates `@oxlint/plugins` from 1.69.0 to 1.70.0
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/apps_v1.70.0/npm/oxlint-plugins)

Updates `oxfmt` from 0.54.0 to 0.55.0
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.55.0/npm/oxfmt)

Updates `oxlint` from 1.69.0 to 1.70.0
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.70.0/npm/oxlint)

Updates `oxlint-plugin-eslint` from 1.69.0 to 1.70.0
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint-plugin-eslint/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/apps_v1.70.0/npm/oxlint-plugin-eslint)

---
updated-dependencies:
- dependency-name: "@oxlint/plugins"
  dependency-version: 1.70.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: oxc
- dependency-name: oxfmt
  dependency-version: 0.55.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: oxc
- dependency-name: oxlint
  dependency-version: 1.70.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: oxc
- dependency-name: oxlint-plugin-eslint
  dependency-version: 1.70.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: oxc
...

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

* chore: update oxlint-plugin-eslint js plugin name

https://github.com/oxc-project/oxc/pull/23495
https://github.com/oxc-project/oxc/pull/23335

* chore: use native no-array-fill-with-reference-type, prefer-export-from, prefer-single-call

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 20:12:39 +08:00
Tony ff27ed8ab6 refactor: remove dead code 2026-06-16 19:10:47 +08:00
github-actions[bot] 9f37d05ab6 style: auto format 2026-06-16 06:45:07 +00:00
dependabot[bot]andTony 873618e99d chore(deps-dev): bump eslint-plugin-unicorn from 65.0.1 to 66.0.0 (#22274)
* chore(deps-dev): bump eslint-plugin-unicorn from 65.0.1 to 66.0.0

Bumps [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) from 65.0.1 to 66.0.0.
- [Release notes](https://github.com/sindresorhus/eslint-plugin-unicorn/releases)
- [Commits](https://github.com/sindresorhus/eslint-plugin-unicorn/compare/v65.0.1...v66.0.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-unicorn
  dependency-version: 66.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

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

* style: fix unicorn-js/prefer-url-href

* style: oxlint disable

* style: fix unicorn-js/no-useless-else

* style: no-unsafe-string-replacement

* style: fix no-duplicate-loops

* style: fix prefer-number-is-safe-integer

* style: fix prefer-single-array-predicate

* style: fix no-object-methods-with-collections

* style: fix no-useless-boolean-cast

* style: fix no-useless-template-literals

* style: fix no-negated-array-predicate

* style: fix prefer-direct-iteration

* style: fix consistent-optional-chaining

* style: fix prefer-simple-sort-comparator

* style: fix prefer-global-number-constants

* style: fix prefer-type-literal-last

* style: fix require-array-sort-compare.

* style: fix prefer-early-return

* style: fix prefer-short-arrow-method

* style: fix prefer-array-from-map

* style: fix prefer-scoped-selector

* style: fix no-global-object-property-assignment

* style: fix no-unnecessary-global-this

* style: fix no-unreadable-object-destructuring

* style: fix no-invalid-argument-count

* style: fix prefer-smaller-scope

* style: fix prefer-iterator-to-array.

* style: fix prefer-object-iterable-methods

* style: fix typo

* style: fix max-nested-calls

* style: fix no-incorrect-template-string-interpolation

* style: fix no-break-in-nested-loop

* style: fix prefer-await

* style: fix no-computed-property-existence-check

* style: fix prefer-number-coercion

* style: fix no-empty-file

* style: update eslint unicorn v66 recommended preset

* style: add unicorn/prefer-spread to oxlint-disable comments

* style: fix no-array-reduce

* style: delete github/no-then as it's covered by unicorn/prefer-await

---------

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-06-16 14:43:42 +08:00
github-actions[bot] 4d2e5fe799 style: auto format 2026-06-16 04:08:27 +00:00
Jagger.H b10a33b191 fix(route): repair u3c3 search and drop sticky promo rows (#22268)
* fix(route): repair u3c3 search and drop sticky promo rows

The handler destructured `keywoard` (typo for `keyword`), so the search
branch never ran and every query fell through to the homepage listing.
u3c3 has also added an anti-scrape token (`search2=<token>`, rotated and
embedded in the homepage `search21()` JS) — `?search=<kw>` alone silently
returns the homepage, so scrape the token live with a graceful fallback.

Also skip the sticky promo rows (category-nav and external-ad rows, e.g.
the "國產原创" entries) shown on every page including search; real torrent
rows always link to /view.

* refactor(route): use filter+map instead of flatMap in u3c3

Address review feedback: the flatMap returning []/[obj] was just a
filter+map in disguise. Skip non-/view rows up front, then map.
2026-06-16 12:07:12 +08:00
Tony adbe1b59bb docs: fix example namespace 2026-06-15 04:27:54 +08:00
Tony 0f8f12a891 docs: fix table 2026-06-15 03:09:40 +08:00
Tony 3f9eb757b5 fix(route): update route path syntax 2026-06-15 00:53:33 +08:00
Tony a1946363f5 fix: correct GUID generation for routes 2026-06-13 03:11:03 +08:00
Jiamin c453c3323f fix: modify list for now/future to get the right data (#22256) 2026-06-12 22:48:42 +08:00
JiaminandBian Jiamin d3086acfe0 feat(route): add Shan Dong Museum exhibition and news route (#22187)
* feat(route): add Shan Dong Museum exhibition and news route

* fix: replaceAll to replace

* fix: replace for fullDurationDate

* fix: change xmlmode to xml

* fix: oxlint warning

---------

Co-authored-by: Bian Jiamin <jiamin@BiandeMac-mini.local>
2026-06-12 12:20:38 +08:00
cdf95e67fe feat(route): add Hebei Museum Exhibition route (#22185)
* WIP: transfer

* feat(route): add Hebei Museum Exhibition route

* fix: Apply suggestions from code review

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

* fix: oxlint warning

---------

Co-authored-by: Bian Jiamin <jiamin@BiandeMac-mini.local>
2026-06-12 12:09:50 +08:00
Tony 7c229947f7 perf: lazyload sentry (#22249) 2026-06-12 12:01:11 +08:00
github-actions[bot] 77e742edd4 style: auto format 2026-06-11 06:48:23 +00:00
Tony 3a56432e3f feat: allow nested namespace (#22243) 2026-06-11 14:47:00 +08:00
20c832842f feat(route): add EFE Noticias route (#22165)
* feat(route): add EFE Noticias route

Add route for EFE (Agencia EFE) Spanish news agency with 10 categories:
mundo, espana, economia, cultura, ciencia-y-tecnologia, deportes,
salud, medio-ambiente, educacion, euro-efe.

Features:
- Article images via enclosure and inline in description
- Ad filtering (auto-banner, srr-main, promotional logos)
- Clean img attributes for RSS reader compatibility
- Configurable item limit via query parameter

* fix(route/efe): address review comments

- Remove `limit` from `parameters` (query param, not path param)
- Scope article link selector to `.elementor-loop-container` to avoid anti-pattern #1
- Remove unnecessary `.first()` on `.elementor-widget-theme-post-content`
- Remove `.srr-main` from cleanup (not inside content area), keep `decoding`/`loading` on images

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

* fix: address review comments for EFE route

- Fix parameters to structured object with only path params
- Scope selector to .elementor-post article links only
- Remove unnecessary .first() on title
- Stop stripping image attributes (decoding, loading, width, etc.)

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

* fix: revert overly specific selector that broke all routes

.elementor-post class doesn't exist on EFE site, use attribute
selector to pre-filter article URLs instead.

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

* fix: fetch articles sequentially to avoid 429 rate limiting

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

* fix: suppress no-await-in-loop lint for sequential rate-limited fetches

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

* fix: use specific selector for article title links only

Select only .elementor-widget-theme-post-title a inside .e-loop-item
to avoid matching image links, category links, or duplicate entries.

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

* fix: use single quotes for static string (oxlint stylistic/quotes)

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

* fix: use Promise.all and remove Set (selector matches once per article)

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

* refactor: use Array.map instead of push for link collection

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

* fix(efe): use pMap to limit concurrency and avoid 429 rate limiting

---------

Co-authored-by: mlkgrnt <mlkgrnt@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-09 03:10:50 +00:00
github-actions[bot] a5573cdcac style: auto format 2026-06-08 16:09:35 +00:00
dependabot[bot]andTony 07834413f5 chore(deps-dev): bump eslint-plugin-unicorn from 64.0.0 to 65.0.0 (#22219)
* chore(deps-dev): bump eslint-plugin-unicorn from 64.0.0 to 65.0.0

Bumps [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) from 64.0.0 to 65.0.0.
- [Release notes](https://github.com/sindresorhus/eslint-plugin-unicorn/releases)
- [Commits](https://github.com/sindresorhus/eslint-plugin-unicorn/compare/v64.0.0...v65.0.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-unicorn
  dependency-version: 65.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

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

* fix: no-array-from-fill

* fix: unicorn-js/no-duplicate-set-values

* fix: no-this-outside-of-class

* fix: no-unnecessary-nested-ternary

* fix: prefer-array-last-methods

* fix: prefer-queue-microtask

* fix: prefer-split-limit

* fix: no-array-from-fill

* fix: no-unused-array-method-return

* fix: prefer-single-call

* fix: prefer-includes-over-repeated-comparisons

* fix: consistent-compound-words

* fix: prefer-includes-over-repeated-comparisons

* chore: add eslint-plugin-unicorn v65 recommended preset

* fix: correct duration parsing logic in parseDuration function

* fix: update oxlint-disable

---------

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-06-09 00:08:15 +08:00
slowmande ad4b89c3d9 feat(route): add Naver search RSS route (#22025)
* route(naver): add Naver search RSS route

Supports all search categories: all (통합검색), blog (블로그), cafe (카페), news (뉴스), video (동영상)

* fix: use string replaceAll instead of regex in cleanText

Replace regex patterns with plain strings to satisfy oxlint unicorn/prefer-string-replace-all rule.

* fix: remove console.log and fix cleanText double-unescaping

- Remove console.log to satisfy oxlint no-console rule
- Use single-pass regex replaceAll to prevent HTML entity double-unescaping (CodeQL)

* fix(naver): address review comments and fix cafe/all category bugs

- Fix ALL category: use templateIds array to extract all content types (web, blog, news, video) instead of only webItem
- Fix CAFE category: change URL to ssc=tab.m_cafe.all format and use cheerio HTML parsing since cafe page returns pure HTML instead of JSON SSR
- Address Rule 11: move author/source metadata from description to dedicated author field
- Address Rule 14: return undefined for unparseable dates instead of fake current time
- Use single route path instead of array
- Add maintainer GitHub ID
- Fix cleanText double-unescaping issue with single-pass regex callback

* refactor(naver): split extractItems to reduce cyclomatic complexity

Split the 37-complexity extractItems into extractVideoItem and extractGenericItem.
Fixes CodeFactor "Complex Method" warning.

* refactor(naver): split functions to pass CodeFactor complexity check

Extract extractLink, buildItemFromTemplate, buildVideoDescription, and
buildVideoResult helpers to bring all methods under complexity threshold.

* fix(route): address review - use DataItem, Array.map, and entities package

- Replace manual item type with DataItem from @/types
- Use toArray().map().filter() instead of each() + push()
- Use decodeHTML from 'entities' instead of manual replaceAll

* fix(route): fix oxlint regex warnings

- Use non-capturing groups for regex used only with .test()
- Escape { } in regex literal
- Use character class [분일주] for single-char alternatives
2026-06-08 12:23:11 +08:00
Tony 4390cabb21 feat(utils/playwright): add PLAYWRIGHT_CDP_ENDPOINT support (#22212)
* feat(utils/playwright): add PLAYWRIGHT_CDP_ENDPOINT support

* fix: close browser
2026-06-08 10:31:39 +08:00
Kovin 983ee11419 feat(route): add Grupo Animal (#22196)
* feat(route): add Animal Politico

* fix(route/animalpolitico): shorter name for politica route, replaced correct feed link

* fix(route/animalpolitico): shorter name for estados route

* fix(route/animalpolitico): replaced wrong route category

* fix(route/animalpolitico): used template literals for better readability on GraphQL query

* fix(route/animalpolitico): change namespace (1/2)

* fix(route/animalpolitico): change namespace (2/2)
2026-06-07 06:13:49 +08:00
Tony 66d05d2644 docs: fix picnob metadata 2026-06-07 04:47:50 +08:00
Tony 055c5b7c9e fix: restore picnob (#22204)
* fix: restore picnob

* feat: redirect `/picnob.info` to `/picnob`

* style: fix indent
2026-06-07 04:44:20 +08:00
Tony cfcdc34e1f refactor: replace playwright with patchright (#21976)
* refactor: use patchwright

* refactor: migrate setRequestInterception and waitUntil

* fix: overwrite ua

* refactor: drop puppeteer cookie/requestfinished shims

Migrate page.cookies/setCookie and browser.cookies/setCookie call sites to the native context APIs (page.context().cookies/addCookies), rewrite requestfinished handlers to await request.response() instead of consuming the synchronous puppeteer-shaped payload, and remove the now-redundant browser.close context-cleanup wrapper. Playwright already handles all of these natively; the shims existed only for the puppeteer -> playwright migration.

* refactor: remove page.authenticate, page.setUserAgent,  browser.newPage(), browser.userAgent() shims

update cookie utility tests

* refactor: replace browser instance with context in Playwright usage across multiple routes

- Updated all instances of `browser` to `context` in Playwright-related functions for consistency and improved resource management.
- Ensured proper closure of context after operations to prevent memory leaks.
- Adjusted request interception methods to utilize the new context variable.

* fix: direct type import

* refactor: remove Puppeteer compatibility layers and unify page handling with Playwright

* fix: test case

* chore: bump patchright to v1.60.0

* chore: pin patchright to 1.59.1

nft can't resolve browser.json due to https://github.com/microsoft/playwright/pull/40093

* chore: pin to node 24.15 for playwright

browser install on node 24.16 stucks due to https://github.com/microsoft/playwright/issues/40724

* fix: update patchright and patchright-core to version 1.60.2 and adjust minify-docker.js for compatibility

* fix: import BrowserContext from patchright
2026-06-07 02:43:20 +08:00
6886265f1b feat(route): add Le Monde & Le Monde in English (#22175)
* feat(route): add Le Monde route

* feat(route): add Le Monde in English route

Add English version of Le Monde RSS route with 40+ categories
covering World, Europe, France, Economy, Culture, Sports, etc.

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

* fix(route/le-monde): remove unnecessary cache.tryGet wrapper

cache.tryGet was wrapping a synchronous callback with no async work,
making it a no-op. The items are already fully parsed from the RSS
feed, so direct assignment is sufficient.

* fix: address review comments for Le Monde route

- Rename namespace from le-monde/le-monde-en to lemonde
- Remove unnecessary .first() calls on RSS elements
- Remove default ofetch responseType option
- Use static cheerio import instead of dynamic import
- Extract <category> tags into category field

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

* fix: sort imports to satisfy oxlint

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

* fix: update example paths to match lemonde namespace

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

* chore: trigger CI to re-test with updated route paths

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

* fix: remove non-existent <content> element fallback from image URL

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

---------

Co-authored-by: mlkgrnt <mlkgrnt@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-06 23:16:17 +08:00
an-leeandCursor cae03809c0 fix(route/patreon): creator ID extraction and render content from JSON (#22188)
* fix(route/patreon): Fix creator ID extraction

* fix(route/patreon): render content from content_json_string

* fix(route/patreon): satisfy oxlint and use trueUA for creator fetches

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(route/patreon): resolve review comments

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-06 12:54:26 +08:00
BeaCox 6c52888af2 fix(route/sjtu/cs/tzgg): add category description table for docs (#22197) 2026-06-06 12:14:47 +08:00
TinkoandTinko 5542e787e3 feat(route): add Shanghai weather alert (#22087)
* feat: add Shanghai weather alert

* chore: update `updated` field by alert deactivate time

* chore: fix import path

* chore: remove cache time

* fix: disable cache age extend

---------

Co-authored-by: Tinko <24890691+TinkoLiu@users.noreply.github.com>
2026-06-06 11:33:59 +08:00
BeaCox 7386c170c0 feat(route/sjtu/cs/tzgg): add SJTU CS department notice route (#22194)
* feat(route/sjtu/cs/tzgg): add CS department notice route

* fix(route/sjtu/cs/tzgg): remove unnecessary date padding
2026-06-06 02:16:18 +08:00
Tony 75d43dd086 chore: add eslint-plugin-regexp (#22189)
* chore: add eslint-plugin-regexp

* chore: autofix

* chore: fix no-useless-flag

* chore: fix optimal-lookaround-quantifier

* chore: fix no-lazy-ends

* chore: fix no-contradiction-with-assertion

* chore: fix no-useless-assertions

* chore: fix no-useless-quantifier

* chore: fix remaining regexp issues

* fix: regex for WFU news link validation
2026-06-05 20:04:39 +08:00
3567ced4d2 fix: transform json number item link (#22168)
* fix: transform json number item link

* docs(route/rsshub): use concrete json transform example

* Revert "docs(route/rsshub): use concrete json transform example"

This reverts commit e4d916451a.

---------

Co-authored-by: jack <jack@example.com>
Co-authored-by: jack <jack@jacks-MacBook-Air.local>
2026-06-05 03:51:04 +08:00
Andvari 6135a6db71 fix(route/apnews): Adapt to new author format (#22184) 2026-06-04 21:50:02 +08:00
Andvari 6c037dd734 fix(route/apnews): Change default path for mobile API (#22105)
* fix(route/apnews): Change default path for mobile API

* Update mobile-api.ts

* Update mobile-api.ts
2026-06-04 21:15:03 +08:00
TonyRL 0a2e5b91db fix: fromCodePoint RangeError error
#22172
2026-06-03 22:50:26 +00:00
Jiamin 7a8c5c6c62 feat(route): add Henan Museum exhibition route (#22138)
* feat(route): add Henan Museum exhibition route

* fix: remove trim for title
2026-06-04 06:03:31 +08:00
CaoMeiYouRen233 f5dc400cb2 fix(route/iwara): 修复 apiRootUrl 引用错误 (#22176) 2026-06-04 05:30:53 +08:00
Tony fbe1a46018 fix(route/twitter): throw exception on invalid user 2026-06-04 05:25:46 +08:00
Tony 8eaa2e06f9 fix(route/cls): fix telegraph api (#22171) 2026-06-03 11:45:31 +08:00
Jiamin 7931a8d4ce fix(route): fix zh name for shanximuseum (#22169) 2026-06-03 02:18:32 +08:00
Jiamin f82a357623 feat: add shanxi museum temporary exhibition route (#22046)
* feat: add shanxi museum temporary exhibition route

* chore: trigger ci

* fix: remove pubDate if no return information

* fix: remove redundancy

* fix:fix the timezone error and refactor the resData and list

* fix: remove ! check for imgurl

* fix: remove empty message and add trycatch
2026-06-02 22:18:47 +08:00
BeaCox 575f71abde feat(route/sjtu): add CS school academic activities (#22050)
* 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.
2026-06-01 05:33:37 +08:00
github-actions[bot] d486205245 style: auto format 2026-05-30 03:38:43 +00:00
Jsongcloudandroot db1e74c6f9 fix(route/twitter): handle TweetPreviewDisplay for subscriber-only posts (#21957)
* fix(twitter): handle TweetPreviewDisplay for subscriber-only posts

* fix(twitter): remove unused screenName variable

* fix(twitter): fix indentation and use English comments

* fix(twitter): fix indentation and remove unused variables

* fix(twitter): revert mobile-api changes as mobile API is disabled

* fix(twitter): add configurable prefix options for subscriber-only posts

---------

Co-authored-by: root <root@exquisite-echo-2.localdomain>
2026-05-30 11:37:37 +08:00
Tony 9a34eef2af docs: fix description 2026-05-30 05:49:25 +08:00
Jiamin 5ac2c937a6 feat(route): add shanghai museum news route (#22049)
* feat: add shanghai museum news route

* feat: add shanghai museum news route

* fix: update radar

* fix: remove redundancy and fix the time zone
2026-05-30 05:25:54 +08:00
github-actions[bot] 99e35563c4 style: auto format 2026-05-26 23:10:33 +00:00
Jiamin 9446e707ff feat(route): add the Palace Museum route (#21960)
* feat(route): add the Palace Museum route

* fix: fix trailing space, array and radar target

* fix: fix array

* fix: follow rule22

* refactor(dpm): migrate exhibitions route to JSX format (.tsx)

* fix(dpm): use arrow function in cheerio filter

* fix: update example

* fix: remove redundancy and fix error for endDate and fullduration

* chore: trigger gh actions retry

* fix: remove trim for fullduration

* fix:remove ! check for imgurl and fullduration

* fix: remove exhibition_item
2026-05-27 07:09:21 +08:00
dependabot[bot] 2c349add50 chore(deps-dev): bump the oxc group across 1 directory with 4 updates (#22107)
* chore(deps-dev): bump the oxc group across 1 directory with 4 updates

Bumps the oxc group with 4 updates in the / directory: [@oxlint/plugins](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint-plugins), [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt), [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) and [oxlint-plugin-eslint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint-plugin-eslint).


Updates `@oxlint/plugins` from 1.66.0 to 1.67.0
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/apps_v1.67.0/npm/oxlint-plugins)

Updates `oxfmt` from 0.51.0 to 0.52.0
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.52.0/npm/oxfmt)

Updates `oxlint` from 1.66.0 to 1.67.0
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.67.0/npm/oxlint)

Updates `oxlint-plugin-eslint` from 1.66.0 to 1.67.0
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint-plugin-eslint/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/apps_v1.67.0/npm/oxlint-plugin-eslint)

---
updated-dependencies:
- dependency-name: "@oxlint/plugins"
  dependency-version: 1.67.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: oxc
- dependency-name: oxfmt
  dependency-version: 0.52.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: oxc
- dependency-name: oxlint
  dependency-version: 1.67.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: oxc
- dependency-name: oxlint-plugin-eslint
  dependency-version: 1.67.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: oxc
...

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

* chore: use native unicorn/import-style

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-27 00:51:12 +08:00