diff --git a/Dockerfile b/Dockerfile
index 8f8c30ab1a..df961ca513 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -11,7 +11,7 @@ ARG PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1;
RUN ln -sf /bin/bash /bin/sh
-RUN apt-get update && apt-get install -yq libgconf-2-4 apt-transport-https git dumb-init --no-install-recommends && apt-get clean \
+RUN apt-get update && apt-get install -yq libgconf-2-4 apt-transport-https git dumb-init python make g++ build-essential --no-install-recommends && apt-get clean \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
diff --git a/docs/design.md b/docs/design.md
index 7be30d95a5..5b35b64762 100644
--- a/docs/design.md
+++ b/docs/design.md
@@ -83,6 +83,29 @@ Behance 用户主页 URL 获取用户名,如
+## Notefolio
+
+### Works
+
+
+
+| 分类 | 韩文分类名 | 中文分类名 |
+| ---- | --------------- | --------------- |
+| all | 전체 | 全部 |
+| A7 | 공예 | 工艺品 |
+| J7 | 그래픽 디자인 | 平面设计 |
+| B7 | 디지털 아트 | 数字艺术 |
+| C7 | 영상/모션그래픽 | 视频 / 图形动画 |
+| D7 | 브랜딩/편집 | 品牌创建 / 编辑 |
+| E7 | 산업 디자인 | 工业设计 |
+| F7 | UI/UX | UI/UX |
+| G7 | 일러스트레이션 | 插画 |
+| K7 | 타이포그래피 | 字体 |
+| H7 | 파인아트 | 纯艺术 |
+| I7 | 포토그래피 | 摄影 |
+
+
+
## UI 中国
### 推荐文章
diff --git a/docs/en/design.md b/docs/en/design.md
index e945105cb0..7f96898568 100644
--- a/docs/en/design.md
+++ b/docs/en/design.md
@@ -77,6 +77,29 @@ Default is under 'https://www.methodstudios.com/en/features'.
+## Notefolio
+
+### Works
+
+
+
+| Category | Name in Korean | Name in English |
+| -------- | -------------- | --------------- |
+| all | 전체 | All |
+| A7 | 공예 | Crafts |
+| J7 | 그래픽 디자인 | Graphic Design |
+| B7 | 디지털 아트 | Digital Art |
+| C7 | 영상/모션그래픽 | Video / Motion Graphics |
+| D7 | 브랜딩/편집 | Branding / Editing |
+| E7 | 산업 디자인 | Industrial Design |
+| F7 | UI/UX | UI/UX |
+| G7 | 일러스트레이션 | Illustration |
+| K7 | 타이포그래피 | Typography |
+| H7 | 파인아트 | Fine Art |
+| I7 | 포토그래피 | Photography |
+
+
+
## Unit Image
### Films
diff --git a/docs/en/finance.md b/docs/en/finance.md
index c8e7a8938b..935b14710b 100644
--- a/docs/en/finance.md
+++ b/docs/en/finance.md
@@ -15,3 +15,19 @@ pageClass: routes
### US Stock News
+
+## World Economic Forum
+
+### Report
+
+
+
+Languages
+
+| English | Español | Français | 中文 | 日本語 |
+| ------- | ------- | -------- | ---- | ------ |
+| en | es | fr | cn | jp |
+
+See filters in [Report](https://www.weforum.org/reports) for Year and Platform these two parameters.
+
+
diff --git a/docs/en/other.md b/docs/en/other.md
index 5fd2fa50e5..5bc5e6a04e 100644
--- a/docs/en/other.md
+++ b/docs/en/other.md
@@ -117,6 +117,18 @@ Official Website: [https://www.ssm.gov.mo/apps1/PreventWuhanInfection/en.aspx](h
+## Nobel Prize
+
+### List
+
+
+
+| Physics | Chemistry | Physiology or Medicine | Literature | Peace | Economic Science |
+| ------- | --------- | ---------------------- | ---------- | ----- | ----------------- |
+| physics | chemistry | physiology-or-medicine | literature | peace | economic-sciences |
+
+
+
## Parcel Tracking
### Hermes UK
diff --git a/docs/en/parameter.md b/docs/en/parameter.md
index 2407c06362..24d629963b 100644
--- a/docs/en/parameter.md
+++ b/docs/en/parameter.md
@@ -74,7 +74,13 @@ Output Sci-hub link in scientific journal routes, this supports major journals o
- scihub: set to any value
-举例:
+Eg:
+
+## Conversion between Traditional and Simplified Chinese
+
+- opencc: s2t (Simplified Chinese to Traditional Chinese)、t2s (Traditional Chinese to Simplified Chinese), other optional values refer to [OpenCC - Configurations](https://github.com/BYVoid/OpenCC#configurations-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6)
+
+Eg:
## Output Formats
diff --git a/docs/finance.md b/docs/finance.md
index c6b8cebb3b..49653029eb 100644
--- a/docs/finance.md
+++ b/docs/finance.md
@@ -62,6 +62,22 @@ pageClass: routes
<Route author="nczitzk" example="/gelonghui/keyword/ 早报" path="/gelonghui/keyword/:keyword" :paramsDesc="[' 搜索关键字']/>
+## 世界经济论坛
+
+### 报告
+
+
+
+语言
+
+| English | Español | Français | 中文 | 日本語 |
+| ------- | ------- | -------- | ---- | ------ |
+| en | es | fr | cn | jp |
+
+年份 和 平台 这两个参数请参见 [报告页](https://www.weforum.org/reports) 过滤条件处。
+
+
+
## 淘股吧股票论坛
### 论坛总版
diff --git a/docs/game.md b/docs/game.md
deleted file mode 100644
index f57268ddde..0000000000
--- a/docs/game.md
+++ /dev/null
@@ -1,485 +0,0 @@
----
-pageClass: routes
----
-
-# 游戏
-
-## 3DMGame
-
-### 新闻中心
-
-
-
-### 游戏资讯
-
-
-
-| 新闻 | 攻略 | 下载资源 | 区块链快讯 |
-| ---- | ---- | -------- | ---------- |
-| news | gl | resource | blockchain |
-
-
-
-## 4Gamers 新闻
-
-### 分类
-
-
-
-### 标签
-
-
-
-### 主題
-
-
-
-## a9vgNews 游戏新闻
-
-### a9vgNews 游戏新闻
-
-
-
-## dekudeals
-
-### 分类
-
-
-
-## Epic Games Store
-
-### 免费游戏
-
-
-
-## Fate Grand Order
-
-### News
-
-
-
-## GNN.tw 游戏新闻
-
-### GNN.tw 游戏新闻
-
-
-
-## Indienova
-
-### indienova 文章
-
-
-
-## Maxjia News
-
-### Dota 2
-
-
-
-## Metacritic
-
-### 新游发行
-
-
-
-支持的主机平台:
-
-| PS 4 | Xbox One | Switch | PC | Wii U | 3DS | PS Vita | iOS |
-| ---- | -------- | ------ | -- | ----- | --- | ------- | --- |
-| ps4 | xboxone | switch | pc | wii-u | 3ds | vita | ios |
-
-发行类型,默认为 `new`:
-
-| 新游发行 | 即将发行 | 全部 |
-| -------- | -------- | ---- |
-| new | coming | all |
-
-排序类型,默认为`date`:
-
-| 日期 | Metacritic 评分 | 用户评分 |
-| ---- | --------------- | --------- |
-| date | metascore | userscore |
-
-
-
-## Minecraft
-
-### Java 版游戏更新
-
-
-
-### CurseForge Mod 更新
-
-
-
-## Nintendo
-
-### eShop 新发售游戏
-
-
-
-### 首页资讯(香港)
-
-
-
-### 首页资讯(中国)
-
-
-
-### 直面会
-
-
-
-### Switch 本体更新情报(日本)
-
-
-
-## PlayStation
-
-### PlayStation Store 游戏列表
-
-
-
-适用于 URL 如 的列表页,比如 [PSN 每月免费游戏](https://store.playstation.com/zh-hans-hk/grid/STORE-MSF86012-PLUS_FTT_CONTENT) 的 gridName 为 STORE-MSF86012-PLUS_FTT_CONTENT
-
-
-
-### PlayStation Store 游戏折扣 | 价格
-
-
-
-地区语言如 `zh-hans-hk` 代表香港区简体中文, `zh-hant-tw` 为台湾繁体中文。不同地区游戏 gridName 不同,非中文地区使用英文提示。
-
-适用于 URL 如 的游戏。
-
-比如 PlayStation Store 香港简体中文区的 [《赛博朋克 2077》](https://store.playstation.com/zh-hans-hk/product/HP4497-CUSA16570_00-ASIAFULLGAME0000) 的 lang 为 `zh-hans-hk`, gridName 为 `HP4497-CUSA16570_00-ASIAFULLGAME0000`
-
-
-
-### PlayStation Network 用户奖杯
-
-
-
-### PlayStation 4 系统更新纪录
-
-
-
-## psnine
-
-### 首页 - 白金攻略 / 游戏开箱
-
-
-
-### 新闻 - 游戏资讯
-
-
-### 数折-折扣信息推送
-
-
-### 闲游-二手盘信息
-
-
-### 游戏-新游戏奖杯信息
-
-
-
-## Rockstar Games Social Club
-
-### 在线活动
-
-
-
-| 游戏代码 | 游戏名称 |
-| -------- | ------------ |
-| GTAV | 侠盗猎车手 5 |
-| RDR2 | 荒野大镖客 2 |
-
-
-
-## ScoreSaber
-
-### 用户动态
-
-
-
-## Steam
-
-### Steam search
-
-
-
-参数 params 请从 Steam 的 URL 取得
-
-Example: `https://store.steampowered.com/search/?specials=1&term=atelier` 中的 params 是 `specials=1&term=atelier`,将它填入 RSSHub 的路由就好
-
-
-
-### Steam news
-
-
-
-## SteamGifts
-
-### Discussions
-
-
-
-## TapTap
-
-::: warning 注意
-
-由于区域限制,需要在有国内 IP 的机器上自建才能正常获取 RSS
-
-:::
-
-### 游戏论坛
-
-
-
-| 全部 | 精华 | 官方 |
-| ---- | ----- | -------- |
-| all | elite | official |
-
-### 游戏更新
-
-
-
-### 游戏评价
-
-
-
-| 最新 | 最热 | 游戏时长 |
-| ------ | ---- | -------- |
-| update | hot | spent |
-
-## 二柄 APP
-
-### 新闻
-
-
-
-## 公主链接
-
-### 日服公告
-
-
-
-### 台服公告
-
-
-
-### 国服公告
-
-
-
-## 篝火营地
-
-### 游戏资讯
-
-
-
-| 精选 | 海外 | 原创 | PS4 | Xboxone | PC | Switch | 掌机 | 手游 | 新闻 | 评测 | 文化 | 视频 | 音频 | 折扣 |
-| ---------- | -------- | ------- | --- | ------- | -- | ------ | -------- | ---------- | ---- | ------ | ------- | ----- | ----- | -------- |
-| choiceness | overseas | orignal | ps4 | xboxone | pc | switch | handheld | mobilegame | news | review | culture | video | audio | discount |
-
-
-
-### 游戏攻略
-
-
-
-## 怪物猎人世界
-
-### 更新情报
-
-
-
-### 最新消息
-
-
-
-## 旅法师营地
-
-### 旅法师营地
-
-
-
-| 主页资讯 | 炉石传说 | 万智牌 | 昆特牌 | 游戏王 | 电子游戏 | 手机游戏 | 桌面游戏 |
-| -------- | -------- | ------ | ------ | ------ | -------- | -------- | -------- |
-| 1 | 2 | 3 | 14 | 16 | 4 | 22 | 9 |
-
-| 影之诗 | Artifact | 玩家杂谈 | 营地电台 | 2047 | 魂武 |
-| ------ | -------- | -------- | -------- | ---- | ---- |
-| 17 | 67 | 21 | 5 | 62 | 68 |
-
-
-
-## 米哈游
-
-### 崩坏 2 - 游戏公告
-
-
-
-| 最新公告 | 版本信息 | 祈愿信息 | 活动介绍 |
-| -------- | -------- | -------- | -------- |
-| new | version | gach | event |
-
-
-
-### 崩坏 3 - 游戏公告
-
-
-
-| 最新 | 动态 | 公告 | 活动 | 补给 |
-| ------ | ---- | ------ | -------- | -------- |
-| latest | news | notice | activity | strategy |
-
-
-
-## 明日方舟
-
-### 游戏公告与新闻
-
-
-
-## 奶牛关
-
-### 元素文章
-
-
-
-## 网易大神
-
-### 用户发帖
-
-
-
-## 王者荣耀
-
-### 新闻中心
-
-
-
-## 小黑盒
-
-### 用户动态
-
-
-
-### 游戏新闻
-
-
-
-### 游戏折扣信息
-
-
-
-| Steam | PlatStation4 | Switch |
-| ----- | ------------ | ------ |
-| pc | ps4 | switch |
-
-
-
-## 英雄联盟
-
-### 新闻中心
-
-
-
-## 游民星空
-
-### 游民星空今日推荐
-
-
-
-### 游民娱乐
-
-
-
-| 趣囧时间 | 游民影院 | 游观天下 | 壁纸图库 | 游民盘点 | 游民福利 |
-| -------- | -------- | -------- | -------- | -------- | -------- |
-| qysj | ymyy | ygtx | bztk | ympd | ymfl |
-
-
-
-## 游戏打折情报
-
-### 游戏折扣
-
-
-
-| Steam 最新折扣 | Steam 热门游戏折扣 | Steam 热门中文游戏折扣 | Steam 历史低价 | Steam 中文游戏历史低价 |
-| -------------- | ------------------ | ---------------------- | -------------- | ---------------------- |
-| new | hot | hot_chinese | low | low_chinese |
-
-
-
-## 游戏时光
-
-### 游戏时光新闻
-
-
-
-### 游戏时光游戏发售表
-
-
-
-### 关键词资讯
-
-
-
-## 游研社
-
-### 游研社
-
-
-
-| 推游 | 游戏史 | 大事件 | 文化 | 趣闻 | 经典回顾 |
-| --------- | ------- | ------ | ------- | ---- | -------- |
-| recommend | history | big | culture | news | retro |
-
-
-
-## 掌上英雄联盟
-
-### 推荐
-
-
-
-## 最终幻想 14
-
-### 最终幻想 14 国服
-
-
-
-| 新闻 | 公告 | 活动 | 广告 | 所有 |
-| ---- | -------- | ------ | --------- | ---- |
-| news | announce | events | advertise | all |
-
-## きららファンタジア|奇拉拉幻想曲
-
-### 公告
-
-
-
-## マギアレコード(Magia Record, 魔法纪录)
-
-### 游戏公告
-
-
-
-### 游戏横幅
-
-
-
-## 巴哈姆特
-
-### GNN新闻
-
-
-
-暂无图片
-
-| 首页 | PC | TV 掌機 | 手機遊戲 | 動漫畫 | 主題報導 | 活動展覽 | 電競 |
-| ---- | -- | ------ | -------- | ----- | ------- | -------- | ------ |
-| 缺省 | 1 | 3 | 4 | 5 | 9 | 11 | 13 |
diff --git a/docs/government.md b/docs/government.md
index 206cd3aadd..fdf5ca977b 100644
--- a/docs/government.md
+++ b/docs/government.md
@@ -380,6 +380,12 @@ pageClass: routes
* * *
+#### 马来西亚 `MY`
+
+- 大使馆: `/embassy/my`
+
+* * *
+
#### 新加坡 `SG`
- 大使馆: `/embassy/sg`
@@ -412,6 +418,12 @@ pageClass: routes
| 贝尔法斯特 | `/embassy/uk/belfast` |
| 曼彻斯特 | `/embassy/uk/manchester` |
+## 中華民國國防部
+
+### 即時軍事動態
+
+
+
## 中华人民共和国海关总署
### 拍卖信息 / 海关法规
diff --git a/docs/multimedia.md b/docs/multimedia.md
index 50cb939d5a..f2d128e227 100644
--- a/docs/multimedia.md
+++ b/docs/multimedia.md
@@ -131,6 +131,116 @@ pageClass: routes
+## JavDB
+
+### 主页
+
+
+
+分类
+
+| 有碼 | 無碼 | 歐美 | FC2 |
+| -------- | ---------- | ------- | --- |
+| censored | uncensored | western | fc2 |
+
+排序
+
+| 发布日期排序 | 磁鏈更新排序 |
+| ------------ | ------------ |
+| 1 | 2 |
+
+过滤
+
+| 全部 | 可下载 | 含字幕 | 含短評 |
+| ---- | ------ | ------ | ------ |
+| 0 | 1 | 2 | 3 |
+
+
+
+### 分類
+
+
+
+::: tip 提示
+
+在 [分類](https://javdb.com/tags) 中选定分类后,URL 中 `tags?` 后的字段即为筛选参数。
+
+如 中 `c2=5&c10=1` 为筛选参数。
+
+:::
+
+分类
+
+| 有碼 | 無碼 | 歐美 | FC2 |
+| -------- | ---------- | ------- | --- |
+| censored | uncensored | western | fc2 |
+
+
+
+### 排行榜
+
+
+
+分类
+
+| 有碼 | 無碼 | 歐美 | FC2 |
+| -------- | ---------- | ------- | --- |
+| censored | uncensored | western | fc2 |
+
+时间
+
+| 日榜 | 週榜 | 月榜 |
+| ----- | ------ | ------- |
+| daily | weekly | monthly |
+
+
+
+### 搜索
+
+
+
+| 全部 | 可播放 | 單體作品 | 演員 | 片商 | 導演 | 系列 | 番號 | 可下載 | 字幕 | 預覽圖 |
+| ---- | -------- | -------- | ----- | ----- | -------- | ------ | ---- | -------- | ----- | ------- |
+| | playable | single | actor | maker | director | series | code | download | cnsub | preview |
+
+
+
+### 演員
+
+
+
+| 全部 | 可播放 | 單體作品 | 可下載 | 含字幕 |
+| ---- | ------ | -------- | ------ | ------ |
+| | p | s | d | c |
+
+所有演员编号参见 [演員庫](https://javdb.com/actors)
+
+
+
+### 系列
+
+
+
+| 全部 | 可播放 | 單體作品 | 可下載 | 字幕 | 預覽圖 |
+| ---- | -------- | -------- | -------- | ----- | ------- |
+| | playable | single | download | cnsub | preview |
+
+所有系列编号参见 [系列庫](https://javdb.com/series)
+
+
+
+### 片商
+
+
+
+| 全部 | 可播放 | 單體作品 | 可下載 | 字幕 | 預覽圖 |
+| ---- | -------- | -------- | -------- | ----- | ------- |
+| | playable | single | download | cnsub | preview |
+
+所有片商编号参见 [片商庫](https://javdb.com/makers)
+
+
+
## JavLibrary
### 影片
diff --git a/docs/other.md b/docs/other.md
index 6822829170..36f6b48ad4 100644
--- a/docs/other.md
+++ b/docs/other.md
@@ -521,6 +521,18 @@ type 为 all 时,category 参数不支持 cost 和 free
+## 诺贝尔奖
+
+### 获奖名单
+
+
+
+| 物理学 | 化学 | 生理学或医学 | 文学 | 和平 | 经济学 |
+| ------- | --------- | ---------------------- | ---------- | ----- | ----------------- |
+| physics | chemistry | physiology-or-medicine | literature | peace | economic-sciences |
+
+
+
## 且听风吟福利
### 分类
diff --git a/docs/parameter.md b/docs/parameter.md
index 0288126e17..6fb7dc407b 100644
--- a/docs/parameter.md
+++ b/docs/parameter.md
@@ -77,6 +77,12 @@ Telegram 即时预览模式需要在官网制作页面处理模板,请前往[
举例:
+## 中文简繁体转换
+
+- opencc: s2t 简体转繁体、t2s 繁体转简体,其它可选值见 [OpenCC - Configurations](https://github.com/BYVoid/OpenCC#configurations-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6)
+
+举例:
+
## 输出格式
RSSHub 同时支持 RSS 2.0 和 Atom 输出格式,在路由末尾添加 `.rss` 或 `.atom` 即可请求对应输出格式,缺省为 RSS 2.0
diff --git a/docs/traditional-media.md b/docs/traditional-media.md
deleted file mode 100644
index 197fed109e..0000000000
--- a/docs/traditional-media.md
+++ /dev/null
@@ -1,770 +0,0 @@
----
-pageClass: routes
----
-
-# 传统媒体
-
-## 21 财经
-
-### 频道
-
-
-
-## AP News
-
-### 话题
-
-
-
-## BBC
-
-### BBC 英文
-
-
-
-通过提取文章全文,以提供比官方源更佳的阅读体验.
-
-支持大部分频道,频道名称见[BBC 官方 RSS](https://www.bbc.co.uk/news/10628494)。
-
-- 频道为单一路径,如 `https://feeds.bbci.co.uk/news/business/rss.xml` 则为 `/bbc/business`.
-- 频道包含多重路径,如 `https://feeds.bbci.co.uk/news/world/asia/rss.xml` 则替换 `/` 为 `-` `/bbc/world-asia`.
-
-
-
-### BBC 中文网
-
-
-
-通过提取文章全文,以提供比官方源更佳的阅读体验.
-
-支持大部分频道,频道名称见[BBC 中文网官方 RSS](https://www.bbc.com/zhongwen/simp/services/2009/09/000000_rss)。
-
-简体版:
-
-- 频道,如金融财经 `http://www.bbc.co.uk/zhongwen/simp/business/index.xml` 则为 `/bbc/chinese/business`.
-
-繁体版:
-
-- 频道,如金融财经 `http://www.bbc.co.uk/zhongwen/trad/business/index.xml` 则为 `/bbc/traditionalchinese/business`.
-
-
-
-## Boston.com
-
-### 新闻
-
-
-
-生成官方未提供的全文订阅点。
-有哪些 tag 请参考 [Boston.com 官网上的订阅页面](https://www.boston.com/rss-feeds)。例如,`https://www.boston.com/tag/local-news/?feed=rss` 对应 RSSHub 路由 `/boston/local-news`。
-
-
-
-## CBC
-
-通过提取文章全文,以提供比官方源更佳的阅读体验。
-
-
-
-## Chicago Tribune
-
-### 新闻
-
-
-
-相比官方 RSS,多提供全文。
-目录分类[见其网站](https://www.chicagotribune.com/about/ct-chicago-tribune-rss-feeds-htmlstory.html)。例如,`https://www.chicagotribune.com/arcio/rss/category/nation-world/` 对应的 RSSHub 路由是 `/chicagotribune/nation-world`。由于官方源的部分路由有两级,因此这里也相应需要填写子分类。
-
-
-
-## e 公司
-
-### 快讯
-
-
-
-## FT 中文网
-
-### FT 中文网
-
-
-
-::: tip 提示
-
-- 不支持付费文章.
-- 由于未知原因 FT 中文网的 SSL 证书不被信任 (参见[SSL Labs 报告](https://www.ssllabs.com/ssltest/analyze.html?d=www.ftchinese.com&latest)), 所有文章通过 http 协议获取.
-
-:::
-
-通过提取文章全文,以提供比官方源更佳的阅读体验.
-
-支持所有频道,频道名称见[官方频道 RSS](http://www.ftchinese.com/channel/rss.html).
-
-- 频道为单一路径,如 `http://www.ftchinese.com/rss/news` 则为 `/ft/chinese/news`.
-- 频道包含多重路径,如 `http://www.ftchinese.com/rss/column/007000002` 则替换 `/` 为 `-` `/ft/chinese/column-007000002`.
-
-
-
-## NHK
-
-### News Web Easy
-
-
-
-## Solidot
-
-### 最新消息
-
-
-
-::: tip 提示
-
-Solidot 提供的 feed:
-
--
-
-:::
-
-| 全部 | 创业 | Linux | 科学 | 科技 | 移动 | 苹果 | 硬件 | 软件 | 安全 | 游戏 | 书籍 | ask | idle | 博客 | 云计算 |
-| ---- | ------- | ----- | ------- | ---------- | ------ | ----- | -------- | -------- | -------- | ----- | ----- | --- | ---- | ---- | ------ |
-| www | startup | linux | science | technology | mobile | apple | hardware | software | security | games | books | ask | idle | blog | cloud |
-
-
-
-## Telecompaper
-
-### News
-
-
-
-可选分类如下
-
-| WIRELESS | BROADBAND | VIDEO | GENERAL | IT | INDUSTRY RESOURCES |
-| -------- | --------- | --------- | ------- | -- | ------------------ |
-| mobile | internet | boardcast | general | it | industry-resources |
-
-::: tip 提示
-
-若 `country` 或 `type` 参数包含空格,则用 `-` 替代。如 `United States` 更换为 `United-States`,`White paper` 更换为 `White-paper`
-
-[INDUSTRY RESOURCES](https://www.telecompaper.com/industry-resources) 分类页的 Filter 仅提供了 `Content Type` 选择器,对应路由中 `type` 参数。`year` 和 `country` 参数则对该分类无效。
-
-:::
-
-
-
-## The Economist
-
-### 分类
-
-
-
-### GRE Vocabulary
-
-
-
-## Yahoo
-
-### 新聞
-
-
-
-`地区`
-
-| 香港 | 台灣 | 美國 |
-| ---- | ---- | ---- |
-| hk | tw | en |
-
-`类別`
-
-| 新聞總集 | 兩岸國際 | 財經 | 娛樂 | 體育 | 健康 |
-| -------- | -------- | -------- | ------------- | ------ | ------ |
-| (空) | world | business | entertainment | sports | health |
-
-
-
-## 半月谈
-
-### 板块
-
-
-
-## 北极星电力网
-
-### 北极星环保
-
-
-
-## 财新网
-
-> 网站部分内容需要付费订阅,RSS 仅做更新提醒,不含付费内容.
-
-### 新闻分类
-
-
-
-Column 列表:
-
-| 经济 | 金融 | 政经 | 环科 | 世界 | 观点网 | 文化 | 周刊 |
-| ------- | ------- | ----- | ------- | ------------- | ------- | ------- | ------ |
-| economy | finance | china | science | international | opinion | culture | weekly |
-
-以金融板块为例的 category 列表: (其余 column 以类似方式寻找)
-
-| 监管 | 银行 | 证券基金 | 信托保险 | 投资 | 创新 | 市场 |
-| ---------- | ---- | -------- | --------------- | ---------- | ---------- | ------ |
-| regulation | bank | stock | insurance_trust | investment | innovation | market |
-
-Category 列表:
-
-| 封面报道 | 开卷 | 社论 | 时事 | 编辑寄语 | 经济 | 金融 | 商业 | 环境与科技 | 民生 | 副刊 |
-| ---------- | ----- | --------- | --------------- | ----------- | ------- | ------- | -------- | ---------------------- | ------- | ------ |
-| coverstory | first | editorial | current_affairs | editor_desk | economy | finance | business | environment_technology | cwcivil | column |
-
-
-
-### 首页新闻
-
-
-
-## 第一财经
-
-### 直播区
-
-
-
-## 东方网
-
-### 上海新闻
-
-
-
-## 端传媒
-
-### 端传媒
-
-
-
-::: warning 注意
-
-付费内容全文需要登陆获取,详情见部署页面的配置模块。
-
-:::
-
-Type 栏目:
-
-| 深度 | What’s New | 广场 | Pick-Up |
-| ------- | ---------- | ----------------- | ------- |
-| feature | news-brief | notes-and-letters | pick_up |
-
-通过提取文章全文,以提供比官方源更佳的阅读体验.
-
-
-
-## 多维新闻网
-
-### 要闻
-
-
-
-| 全部 | 国际 | 中国 | 香港 | 台湾 | 经济 | 视觉 |
-| ------ | ------ | ----- | -------- | ------ | ------ | ------ |
-| yaowen | global | china | hongkong | taiwan | jingji | shijue |
-
-
-
-### 24 小时新闻排行榜
-
-
-
-## 华尔街见闻
-
-### 华尔街见闻
-
-
-
-## 极客公园
-
-### 全球快讯
-
-
-
-## 界面新闻
-
-### 栏目
-
-
-
-## 经济观察网
-
-### 分类资讯
-
-
-
-category 对应的关键词有
-
-| 时事 | 政策 | 证券 | 资本 | 理财 | 新科技 | 大健康 | 房产 | 汽车 | 消费 | 影视 | 娱乐 | 体育 | 教育 | 观察家 | 专栏 | 书评 | 个人历史 | 宏观 |
-| ---- | ---- | ---- | ---- | ---- | ------ | ------ | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ------ | ---- | ---- | -------- | ---- |
-| 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
-
-
-
-## 靠谱新闻
-
-### 新闻聚合
-
-
-
-## 联合早报
-
-### 即时新闻
-
-
-
-| 中国 | 新加坡 | 国际 | 财经 |
-| ----- | --------- | ----- | -------- |
-| china | singapore | world | zfinance |
-
-
-
-### 新闻
-
-
-
-| 中国 | 新加坡 | 东南亚 | 国际 | 体育 | 早报现在 |
-| ----- | --------- | ------ | ----- | ------ | -------- |
-| china | singapore | sea | world | sports | fukan |
-
-
-
-### 其他栏目
-
-除了上面两个兼容规则之外,联合早报网站里所有页面形如 这样的栏目都能被这个规则解析到,早报的大部分栏目都是这个样式的。你可以测试之后再订阅。
-
-
-
-## 连线 Wired
-
-非订阅用户每月有阅读全文次数限制。
-
-### 标签
-
-
-
-## 路透社
-
-### 实时资讯
-
-
-
-### 频道
-
-
-
-支持语言列表
-
-- 中国分站 `cn`:
-
- - 主频道:
-
- | 深度分析 | 时事要闻 | 生活 | 投资 |
- | -------- | ----------- | ---- | --------- |
- | analyses | generalnews | life | investing |
-
- - 资讯子频道:
-
- | 中国财经 | 国际财经 | 新闻人物 | 财经视点 |
- | -------- | --------------------- | --------- | -------- |
- | china | internationalbusiness | newsmaker | opinions |
-
- - 专栏子频道:
-
- | 中国财经专栏 | 国际财经专栏 | 大宗商品专栏 |
- | ------------ | ------------ | ------------ |
- | CnColumn | IntColumn | ComColumn |
-
-- 美国分站 `us`:
-
- - 主频道:
-
- | Business | Markets | World | Politics | Tech | Breakingviews | Wealth | Life |
- | -------- | ------- | ----- | -------- | ---------- | ------------- | ------ | --------- |
- | business | markets | world | politics | technology | breakingviews | wealth | lifestyle |
-
-- 英国分站 `uk`:
-
- - 主频道:
-
- | Business | Markets | World | UK | Tech | Money | Breakingviews | Sport | Life |
- | -------- | ------- | ----- | -- | ---------- | --------------- | ------------- | ------ | --------- |
- | business | markets | world | uk | technology | personalFinance | breakingviews | sports | lifestyle |
-
-
-
-## 每经网
-
-### 重磅原创
-
-
-
-## 南方周末
-
-### 新闻分类
-
-
-
-下面给出部分参考:
-
-| 推荐 | 新闻 | 观点 | 文化 | 人物 | 影像 | 专题 | 生活 | 视频 |
-| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
-| 1 | 2 | 3 | 4 | 7 | 8 | 6 | 5 | 131 |
-
-
-
-## 南华早报 SCMP
-
-### 新闻
-
-
-
-栏目分类对应的数字编号见[官方 RSS](https://www.scmp.com/rss)。相比官方提供的 RSS,多提供了全文输出。
-
-
-
-## 纽约时报
-
-### 新闻
-
-
-
-通过提取文章全文,以提供比官方源更佳的阅读体验。
-
-| 默认中文 | 中英对照 | 英文 | 中英对照 (繁体中文) | 繁体中文 |
-| -------- | -------- | ---- | ----------------------- | ------------------ |
-| (空) | dual | en | dual-traditionalchinese | traditionalchinese |
-
-
-
-### 每日简报
-
-
-
-## 澎湃新闻
-
-### 首页头条
-
-
-
-### 频道
-
-
-
-### 澎湃美数组作品集
-
-
-
-| 视频 | 交互 | 信息图 | 数据故事 |
-| ---- | ---- | ------ | -------- |
-| 2 | 4 | 3 | 453 |
-
-
-
-## 齐鲁晚报
-
-### 新闻
-
-
-
-### 今日城市
-
-
-
-| 今日临沂 | 今日德州 | 今日威海 | 今日枣庄 | 今日淄博 | 今日烟台 | 今日潍坊 | 今日菏泽 | 今日日照 | 今日泰山 | 今日聊城 | 今日济宁 |
-| -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | -------- | -------- | --------- | -------- |
-| linyi | dezhou | weihai | zaozhuang | zibo | yantai | weifang | heze | rizhao | taishan | liaocheng | jining |
-
-
-
-## 人民日报
-
-### 观点
-
-
-
-### 环保频道
-
-
-
-### 习近平系列重要讲话
-
-
-
-## 人民日报社 国际金融报
-
-### 栏目
-
-
-
-`cid`可在对应栏目的 url 后的参数中获取,如`热点快报`的栏目 url 为`http://www.ifnews.com/column.html?cid=48`, `cid`即为`48`.
-
-
-
-## 日本経済新聞
-
-### ホームページ
-
-
-
-日文版首页
-
-
-
-## 网易新闻专栏
-
-### 栏目
-
-
-
-| 轻松一刻 | 槽值 | 人间 | 大国小民 | 三三有梗 | 数读 | 看客 | 下划线 | 谈心社 | 哒哒 | 胖编怪聊 | 曲一刀 | 今日之声 | 浪潮 | 沸点 |
-| -------- | ---- | ---- | -------- | -------- | ---- | ---- | ------ | ------ | ---- | -------- | ------ | -------- | ---- | ---- |
-| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
-
-
-
-## 卫报 The Guardian
-
-通过提取文章全文,以提供比官方源更佳的阅读体验。
-
-### Editorial
-
-
-
-### China
-
-
-
-## 文汇报
-
-### 分类
-
-
-
-## 香港 01
-
-### 热门
-
-
-
-### 栏目
-
-
-
-### 子栏目
-
-
-
-### 专题
-
-
-
-### 标签
-
-
-
-## 香港電台
-
-### 新聞
-
-香港電台官方已有提供全文 RSS,詳細可前往官方網站:
-
-此路由主要補回官方 RSS 缺少的圖片以及 Link 元素。(官方 RSS 沒有 Link 元素可能導致某些 RSS 客戶端出現問題)
-
-
-
-| local | greaterchina | international | finance | sport |
-| -------- | ------------ | ------------- | -------- | -------- |
-| 本地新聞 | 大中華新聞 | 國際新聞 | 財經新聞 | 體育新聞 |
-
-
-
-## 新京报
-
-### 栏目
-
-
-
-### 电子报
-
-
-
-## 新浪科技
-
-### 科学探索
-
-
-
-分类:
-
-| zx | twhk | dwzw | zrdl | lskg | smyx | shbk | kjqy |
-| ---- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
-| 最新 | 天文航空 | 动物植物 | 自然地理 | 历史考古 | 生命医学 | 生活百科 | 科技前沿 |
-
-
-
-### 滚动新闻
-
-
-
-## 央视新闻
-
-### 新闻联播
-
-
-
-新闻联播内容摘要。
-
-
-
-### 专题
-
-
-
-| 新闻 | 国内 | 国际 | 社会 | 法治 | 文娱 | 科技 | 生活 | 教育 | 每周质量报告 |
-| ---- | ----- | ----- | ------- | ---- | ---- | ---- | ---- | ---- | ------------ |
-| news | china | world | society | law | ent | tech | life | edu | mzzlbg |
-
-
-
-### 新闻联播文字版
-
-
-
-### 新闻联播文字版全文
-
-
-
-## 朝日新聞中文網(繁體中文版)
-
-### 新聞分類
-
-
-
-版块:
-
-| society | politics_economy | cool_japan | travel | sports | business | technology | world | opinion | whatsnew |
-| -------- | ---------------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | -------- |
-| 國內綜合 | 政治・經濟 | 文化・生活 | 旅遊・活動 | 體育・奧運 | 商業・商品 | IT ・科技 | 國際・東亞 | 評論・專欄 | 最新消息 |
-
-版块 `cool_japan` 和 `travel` 包含子版块:
-
-`cool_japan`:
-
-| entertainment | anime | life | style_culture |
-| ------------- | ----- | ---------- | ------------- |
-| 藝能 | 動漫 | 生活・美食 | 時尚・藝文 |
-
-`travel`:
-
-| news | scenery | topic | move |
-| ---- | ------- | ----- | ---- |
-| 資訊 | 風景 | 體驗 | 交通 |
-
-
-
-## 朝日新聞中文网(简体中文版)
-
-### 新闻分类
-
-
-
-版块:
-
-| society | politics_economy | cool_japan | travel | sports | business | technology | world | opinion | whatsnew |
-| -------- | ---------------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | -------- |
-| 日本社会 | 政治・经济 | 文娱・生活 | 旅游・活动 | 体育・奥运 | 商务・商品 | IT ・科技 | 国际・东亚 | 观点・专栏 | 最新 |
-
-版块 `cool_japan` 和 `travel` 包含子版块:
-
-`cool_japan`:
-
-| entertainment | anime | life | style_culture |
-| ------------- | ----- | ---------- | ------------- |
-| 艺能 | 动漫 | 生活・美食 | 时尚・文化 |
-
-`travel`:
-
-| news | scenery | topic | move |
-| ---- | ------- | ----- | ---- |
-| 资讯 | 风景 | 体验 | 交通 |
-
-
-
-## 中国日报
-
-### 英语点津
-
-
-
-目录分类
-
-| 最新 | 双语 | 热词 | 口语 | 译词 | 视频 | 听力 | 专栏 | 文件 | 考试 |
-| --------- | -------------- | ------------- | --------------- | ------------- | ----------- | -------- | --------- | ------------------------ | ------------ |
-| thelatest | news_bilingual | news_hotwords | practice_tongue | trans_collect | video_links | audio_cd | columnist | 5af95d44a3103f6866ee845c | englishexams |
-
-
-
-## 中時電子報
-
-### 新聞
-
-
-
-| realtimenews | politic | opinion | life | star | money | society | hottopic | tube | world | armament | chinese | fashion | sports | technologynews | travel | album |
-| ------------ | ------- | ------- | ---- | ---- | ----- | ------- | -------- | ------- | ----- | -------- | ------- | ------- | ------ | -------------- | ------ | ----- |
-| 即時 | 政治 | 言論 | 生活 | 娛樂 | 財經 | 社會 | 話題 | 快點 TV | 國際 | 軍事 | 兩岸 | 時尚 | 體育 | 科技 | 玩食 | 專輯 |
-
-
-
-## 中外对话
-
-### 主题
-
-
-
-| 商业 | 城市化 | 气候变化与能源 | 自然保护 | 管制与法律 | 健康与食品 | 自然灾害 | 污染 | 科学与技术 | 安全 | 水 |
-| -------- | ------ | ------------------------- | ------------ | ------------------ | --------------- | ----------------- | --------- | ---------------- | -------- | ----- |
-| business | cities | climate-change-and-energy | conservation | governance-and-law | health-and-food | natural-disasters | pollution | science-and-tech | security | water |
-
-
-
-### 栏目
-
-
-
-| 文章 | 博客 | 文化 | 报告 |
-| ------- | ---- | ------- | ------- |
-| article | blog | culture | reports |
-
-
-
-### 福建新闻
-
-
-
-### 福州新闻
-
-
-
-### 九江新闻
-
-
-
-## 読売新聞
-
-### 新聞
-
-
-
-| 総合 | 社会 | 政治 | 経済 | スポーツ | 国際 | 科学・IT | 選挙・世論調査 | エンタメ・文化 | 囲碁・将棋 | ライフ | 地域 | 社説 |
-| ---- |--------- | -------- | ------- | ------- | ----- | -------- | ------------- | ------------- | ---------- | ------ | ----- | --------- |
-| news | national | politics | economy | sports | world | science | election | culture | igoshougi | life | local | editorial |
\ No newline at end of file
diff --git a/docs/university.md b/docs/university.md
index 193aafc34b..3676fe8168 100644
--- a/docs/university.md
+++ b/docs/university.md
@@ -1547,9 +1547,9 @@ type 列表:
全文内容需使用校园网或 VPN 获取
:::
-| 全部 | 信息发布 | 通知公告 | 教务信息 | 教学研究 | 教学实践 | 招生信息 | 质量监控 |
-| :--: | :------: | :------: | :------: | :------: | :------: | :------: | :------: |
-| all | xxfb | tzgg | jwxx | jxyj | jxsj | zsxx | zljk |
+| 全部 | 教学信息 | 教学研究 | 实践教学 | 质量监控 | 通知公告 |
+| :--: | :------: | :------: | :------: | :------: | :------: |
+| all | jxxx | jxyj | sjjx | zljk | tzgg |
diff --git a/lib/app.js b/lib/app.js
index 904adf3001..61ad7129e6 100644
--- a/lib/app.js
+++ b/lib/app.js
@@ -39,15 +39,13 @@ app.use(favicon(__dirname + '/favicon.png'));
// global error handing
app.use(onerror);
-// 1 set header
-app.use(header);
-
app.use(accessControl);
-// 6 debug
+// 7 debug
app.context.debug = {
hitCache: 0,
request: 0,
+ etag: 0,
paths: [],
routes: [],
ips: [],
@@ -56,6 +54,9 @@ app.context.debug = {
};
app.use(debug);
+// 6 set header
+app.use(header);
+
// 5 fix incorrect `utf-8` characters
app.use(utf8);
diff --git a/lib/middleware/debug.js b/lib/middleware/debug.js
index e30854fe8f..d3c41ae9dc 100644
--- a/lib/middleware/debug.js
+++ b/lib/middleware/debug.js
@@ -23,4 +23,8 @@ module.exports = async (ctx, next) => {
}
ctx.state.debuged = true;
+
+ if (ctx.status === 304) {
+ ctx.debug.etag++;
+ }
};
diff --git a/lib/middleware/header.js b/lib/middleware/header.js
index e1118af539..ff4272cbf4 100644
--- a/lib/middleware/header.js
+++ b/lib/middleware/header.js
@@ -19,8 +19,7 @@ module.exports = async (ctx, next) => {
await next();
- let body = ctx.body;
- if (!body || typeof body !== 'string' || ctx.response.get('ETag')) {
+ if (!ctx.body || typeof ctx.body !== 'string' || ctx.response.get('ETag')) {
return;
}
@@ -29,14 +28,17 @@ module.exports = async (ctx, next) => {
return;
}
- const match = body.match(/(.*)<\/lastBuildDate>/);
- if (match) {
- ctx.set({
- 'Last-Modified': body.match(/(.*)<\/lastBuildDate>/)[1],
- });
+ ctx.set('ETag', etagCalculate(ctx.body.replace(/(.*)<\/lastBuildDate>/, '').replace(//, '')));
+
+ if (ctx.fresh) {
+ ctx.status = 304;
+ ctx.body = null;
+ } else {
+ const match = ctx.body.match(/(.*)<\/lastBuildDate>/);
+ if (match) {
+ ctx.set({
+ 'Last-Modified': match[1],
+ });
+ }
}
-
- body = body.replace(/(.*)<\/lastBuildDate>/, '');
-
- ctx.response.etag = etagCalculate(body);
};
diff --git a/lib/middleware/parameter.js b/lib/middleware/parameter.js
index c37037f045..3d3be62615 100644
--- a/lib/middleware/parameter.js
+++ b/lib/middleware/parameter.js
@@ -1,6 +1,7 @@
const he = require('he');
const mercury_parser = require('@postlight/mercury-parser');
const cheerio = require('cheerio');
+const OpenCC = require('opencc');
const got = require('@/utils/got');
const config = require('@/config').value;
@@ -224,6 +225,16 @@ module.exports = async (ctx, next) => {
return item;
});
}
+
+ // opencc
+ if (ctx.query.opencc) {
+ const converter = new OpenCC(`${ctx.query.opencc}.json`);
+ const tasks = ctx.state.data.item.map(async (item) => {
+ item.title = await converter.convertPromise(item.title);
+ item.description = await converter.convertPromise(item.description);
+ });
+ await Promise.all(tasks);
+ }
}
}
};
diff --git a/lib/router.js b/lib/router.js
deleted file mode 100644
index be56e55dc5..0000000000
--- a/lib/router.js
+++ /dev/null
@@ -1,3246 +0,0 @@
-const Router = require('@koa/router');
-const config = require('@/config').value;
-const router = new Router();
-
-// 遍历整个 routes 文件夹,导入模块路由 router.js 和 router-custom.js 文件
-// 格式参考用例:routes/epicgames/router.js
-const RouterPath = require('require-all')({
- dirname: __dirname + '/routes',
- filter: /^.*router([-_]custom[s]?)?\.js$/,
-});
-
-// 将收集到的自定义模块路由进行合并
-for (const project in RouterPath) {
- for (const routerName in RouterPath[project]) {
- const proRouter = RouterPath[project][routerName]();
- proRouter.stack.forEach((nestedLayer) => {
- router.stack.push(nestedLayer);
- });
- }
-}
-
-// index
-router.get('/', require('./routes/index'));
-
-router.get('/robots.txt', async (ctx) => {
- if (config.disallowRobot) {
- ctx.set('Content-Type', 'text/plain');
- ctx.body = 'User-agent: *\nDisallow: /';
- } else {
- ctx.throw(404, 'Not Found');
- }
-});
-
-// test
-router.get('/test/:id', require('./routes/test'));
-
-// RSSHub
-router.get('/rsshub/rss', require('./routes/rsshub/routes')); // 弃用
-router.get('/rsshub/routes', require('./routes/rsshub/routes'));
-router.get('/rsshub/sponsors', require('./routes/rsshub/sponsors'));
-
-// 1draw
-router.get('/1draw', require('./routes/1draw/index'));
-
-// quicker
-router.get('/quicker/qa', require('./routes/quicker/qa.js'));
-router.get('/quicker/update', require('./routes/quicker/update.js'));
-router.get('/quicker/user/action/:uid/:person', require('./routes/quicker/person.js'));
-router.get('/quicker/user/:uid/:person', require('./routes/quicker/person.js'));
-
-// bilibili
-router.get('/bilibili/user/video/:uid/:disableEmbed?', require('./routes/bilibili/video'));
-router.get('/bilibili/user/article/:uid', require('./routes/bilibili/article'));
-router.get('/bilibili/user/fav/:uid/:disableEmbed?', require('./routes/bilibili/userFav'));
-router.get('/bilibili/user/coin/:uid/:disableEmbed?', require('./routes/bilibili/coin'));
-router.get('/bilibili/user/dynamic/:uid/:disableEmbed?', require('./routes/bilibili/dynamic'));
-router.get('/bilibili/user/followers/:uid', require('./routes/bilibili/followers'));
-router.get('/bilibili/user/followings/:uid', require('./routes/bilibili/followings'));
-router.get('/bilibili/user/bangumi/:uid/:type?', require('./routes/bilibili/user_bangumi'));
-router.get('/bilibili/partion/:tid/:disableEmbed?', require('./routes/bilibili/partion'));
-router.get('/bilibili/partion/ranking/:tid/:days?/:disableEmbed?', require('./routes/bilibili/partion-ranking'));
-router.get('/bilibili/bangumi/:seasonid', require('./routes/bilibili/bangumi')); // 弃用
-router.get('/bilibili/bangumi/media/:mediaid', require('./routes/bilibili/bangumi'));
-router.get('/bilibili/video/page/:bvid/:disableEmbed?', require('./routes/bilibili/page'));
-router.get('/bilibili/video/reply/:bvid', require('./routes/bilibili/reply'));
-router.get('/bilibili/video/danmaku/:bvid/:pid?', require('./routes/bilibili/danmaku'));
-router.get('/bilibili/link/news/:product', require('./routes/bilibili/linkNews'));
-router.get('/bilibili/live/room/:roomID', require('./routes/bilibili/liveRoom'));
-router.get('/bilibili/live/search/:key/:order', require('./routes/bilibili/liveSearch'));
-router.get('/bilibili/live/area/:areaID/:order', require('./routes/bilibili/liveArea'));
-router.get('/bilibili/fav/:uid/:fid/:disableEmbed?', require('./routes/bilibili/fav'));
-router.get('/bilibili/blackboard', require('./routes/bilibili/blackboard'));
-router.get('/bilibili/mall/new/:category?', require('./routes/bilibili/mallNew'));
-router.get('/bilibili/mall/ip/:id', require('./routes/bilibili/mallIP'));
-router.get('/bilibili/ranking/:rid?/:day?/:arc_type?/:disableEmbed?', require('./routes/bilibili/ranking'));
-router.get('/bilibili/user/channel/:uid/:cid/:disableEmbed?', require('./routes/bilibili/userChannel'));
-router.get('/bilibili/topic/:topic', require('./routes/bilibili/topic'));
-router.get('/bilibili/audio/:id', require('./routes/bilibili/audio'));
-router.get('/bilibili/vsearch/:kw/:order?/:disableEmbed?', require('./routes/bilibili/vsearch'));
-router.get('/bilibili/followings/video/:uid/:disableEmbed?', require('./routes/bilibili/followings_video'));
-router.get('/bilibili/followings/article/:uid', require('./routes/bilibili/followings_article'));
-router.get('/bilibili/readlist/:listid', require('./routes/bilibili/readlist'));
-router.get('/bilibili/weekly', require('./routes/bilibili/weekly_recommend'));
-router.get('/bilibili/manga/update/:comicid', require('./routes/bilibili/manga_update'));
-
-// bangumi
-router.get('/bangumi/calendar/today', require('./routes/bangumi/calendar/today'));
-router.get('/bangumi/subject/:id/:type', require('./routes/bangumi/subject'));
-router.get('/bangumi/person/:id', require('./routes/bangumi/person'));
-router.get('/bangumi/topic/:id', require('./routes/bangumi/group/reply'));
-router.get('/bangumi/group/:id', require('./routes/bangumi/group/topic'));
-router.get('/bangumi/subject/:id', require('./routes/bangumi/subject'));
-router.get('/bangumi/user/blog/:id', require('./routes/bangumi/user/blog'));
-
-// 微博
-router.get('/weibo/user/:uid/:displayVideo?', require('./routes/weibo/user'));
-router.get('/weibo/keyword/:keyword', require('./routes/weibo/keyword'));
-router.get('/weibo/search/hot', require('./routes/weibo/search/hot'));
-router.get('/weibo/super_index/:id', require('./routes/weibo/super_index'));
-router.get('/weibo/oasis/user/:userid', require('./routes/weibo/oasis/user'));
-
-// 贴吧
-router.get('/tieba/forum/:kw', require('./routes/tieba/forum'));
-router.get('/tieba/forum/good/:kw/:cid?', require('./routes/tieba/forum'));
-router.get('/tieba/post/:id', require('./routes/tieba/post'));
-router.get('/tieba/post/lz/:id', require('./routes/tieba/post'));
-
-// 网易云音乐
-router.get('/ncm/playlist/:id', require('./routes/ncm/playlist'));
-router.get('/ncm/user/playlist/:uid', require('./routes/ncm/userplaylist'));
-router.get('/ncm/artist/:id', require('./routes/ncm/artist'));
-router.get('/ncm/djradio/:id', require('./routes/ncm/djradio'));
-
-// 掘金
-router.get('/juejin/category/:category', require('./routes/juejin/category'));
-router.get('/juejin/tag/:tag', require('./routes/juejin/tag'));
-router.get('/juejin/trending/:category/:type', require('./routes/juejin/trending'));
-router.get('/juejin/books', require('./routes/juejin/books'));
-router.get('/juejin/pins', require('./routes/juejin/pins'));
-router.get('/juejin/posts/:id', require('./routes/juejin/posts'));
-router.get('/juejin/collections/:userId', require('./routes/juejin/favorites'));
-router.get('/juejin/collection/:collectionId', require('./routes/juejin/collection'));
-router.get('/juejin/shares/:userId', require('./routes/juejin/shares'));
-
-// 自如
-router.get('/ziroom/room/:city/:iswhole/:room/:keyword', require('./routes/ziroom/room'));
-
-// 简书
-router.get('/jianshu/home', require('./routes/jianshu/home'));
-router.get('/jianshu/trending/:timeframe', require('./routes/jianshu/trending'));
-router.get('/jianshu/collection/:id', require('./routes/jianshu/collection'));
-router.get('/jianshu/user/:id', require('./routes/jianshu/user'));
-
-// 知乎
-router.get('/zhihu/collection/:id', require('./routes/zhihu/collection'));
-router.get('/zhihu/people/activities/:id', require('./routes/zhihu/activities'));
-router.get('/zhihu/people/answers/:id', require('./routes/zhihu/answers'));
-router.get('/zhihu/people/posts/:id', require('./routes/zhihu/posts'));
-router.get('/zhihu/zhuanlan/:id', require('./routes/zhihu/zhuanlan'));
-router.get('/zhihu/daily', require('./routes/zhihu/daily'));
-router.get('/zhihu/daily/section/:sectionId', require('./routes/zhihu/daily_section'));
-router.get('/zhihu/hotlist', require('./routes/zhihu/hotlist'));
-router.get('/zhihu/pin/hotlist', require('./routes/zhihu/pin/hotlist'));
-router.get('/zhihu/question/:questionId', require('./routes/zhihu/question'));
-router.get('/zhihu/topic/:topicId', require('./routes/zhihu/topic'));
-router.get('/zhihu/people/pins/:id', require('./routes/zhihu/pin/people'));
-router.get('/zhihu/bookstore/newest', require('./routes/zhihu/bookstore/newest'));
-router.get('/zhihu/pin/daily', require('./routes/zhihu/pin/daily'));
-router.get('/zhihu/weekly', require('./routes/zhihu/weekly'));
-
-// 妹子图
-router.get('/mzitu/home/:type?', require('./routes/mzitu/home'));
-router.get('/mzitu/tags', require('./routes/mzitu/tags'));
-router.get('/mzitu/category/:category', require('./routes/mzitu/category'));
-router.get('/mzitu/post/:id', require('./routes/mzitu/post'));
-router.get('/mzitu/tag/:tag', require('./routes/mzitu/tag'));
-
-// pixiv
-router.get('/pixiv/user/bookmarks/:id', require('./routes/pixiv/bookmarks'));
-router.get('/pixiv/user/illustfollows', require('./routes/pixiv/illustfollow'));
-router.get('/pixiv/user/:id', require('./routes/pixiv/user'));
-router.get('/pixiv/ranking/:mode/:date?', require('./routes/pixiv/ranking'));
-router.get('/pixiv/search/:keyword/:order?/:r18?', require('./routes/pixiv/search'));
-
-// pixiv-fanbox
-router.get('/fanbox/:user?', require('./routes/fanbox/main'));
-
-// 豆瓣
-router.get('/douban/movie/playing', require('./routes/douban/playing'));
-router.get('/douban/movie/playing/:score', require('./routes/douban/playing'));
-router.get('/douban/movie/playing/:score/:city', require('./routes/douban/playing'));
-router.get('/douban/movie/later', require('./routes/douban/later'));
-router.get('/douban/movie/ustop', require('./routes/douban/ustop'));
-router.get('/douban/movie/weekly', require('./routes/douban/weekly_best'));
-router.get('/douban/movie/classification/:sort?/:score?/:tags?', require('./routes/douban/classification.js'));
-router.get('/douban/group/:groupid', require('./routes/douban/group'));
-router.get('/douban/explore', require('./routes/douban/explore'));
-router.get('/douban/music/latest/:area?', require('./routes/douban/latest_music'));
-router.get('/douban/book/latest', require('./routes/douban/latest_book'));
-router.get('/douban/event/hot/:locationId', require('./routes/douban/event/hot'));
-router.get('/douban/commercialpress/latest', require('./routes/douban/commercialpress/latest'));
-router.get('/douban/bookstore', require('./routes/douban/bookstore'));
-router.get('/douban/book/rank/:type?', require('./routes/douban/book/rank'));
-router.get('/douban/doulist/:id', require('./routes/douban/doulist'));
-router.get('/douban/explore/column/:id', require('./routes/douban/explore_column'));
-router.get('/douban/people/:userid/status', require('./routes/douban/people/status.js'));
-router.get('/douban/replies/:uid', require('./routes/douban/replies'));
-router.get('/douban/topic/:id/:sort?', require('./routes/douban/topic.js'));
-router.get('/douban/channel/:id/:nav?', require('./routes/douban/channel/topic.js'));
-router.get('/douban/channel/:id/subject/:nav', require('./routes/douban/channel/subject.js'));
-router.get('/douban/celebrity/:id/:sort?', require('./routes/douban/celebrity.js'));
-
-// 法律白話文運動
-router.get('/plainlaw/archives', require('./routes/plainlaw/archives.js'));
-
-// 煎蛋
-router.get('/jandan/:sub_model', require('./routes/jandan/pic'));
-
-// 喷嚏
-router.get('/dapenti/tugua', require('./routes/dapenti/tugua'));
-router.get('/dapenti/subject/:id', require('./routes/dapenti/subject'));
-
-// Dockone
-router.get('/dockone/weekly', require('./routes/dockone/weekly'));
-
-// 开发者头条
-router.get('/toutiao/today', require('./routes/toutiao/today'));
-router.get('/toutiao/user/:id', require('./routes/toutiao/user'));
-
-// 众成翻译
-router.get('/zcfy', require('./routes/zcfy/index'));
-router.get('/zcfy/index', require('./routes/zcfy/index')); // 废弃
-router.get('/zcfy/hot', require('./routes/zcfy/hot'));
-
-// 今日头条
-router.get('/jinritoutiao/keyword/:keyword', require('./routes/jinritoutiao/keyword'));
-
-// Disqus
-router.get('/disqus/posts/:forum', require('./routes/disqus/posts'));
-
-// Twitter
-router.get('/twitter/user/:id/:type?', require('./routes/twitter/user'));
-router.get('/twitter/list/:id/:name', require('./routes/twitter/list'));
-router.get('/twitter/likes/:id', require('./routes/twitter/likes'));
-router.get('/twitter/followings/:id', require('./routes/twitter/followings'));
-router.get('/twitter/keyword/:keyword', require('./routes/twitter/keyword'));
-router.get('/twitter/trends/:woeid?', require('./routes/twitter/trends'));
-
-// Youtube
-router.get('/youtube/user/:username/:embed?', require('./routes/youtube/user'));
-router.get('/youtube/channel/:id/:embed?', require('./routes/youtube/channel'));
-router.get('/youtube/playlist/:id/:embed?', require('./routes/youtube/playlist'));
-
-// 极客时间
-router.get('/geektime/column/:cid', require('./routes/geektime/column'));
-router.get('/geektime/news', require('./routes/geektime/news'));
-
-// 界面新闻
-router.get('/jiemian/list/:cid', require('./routes/jiemian/list.js'));
-
-// 好奇心日报
-router.get('/qdaily/:type/:id', require('./routes/qdaily/index'));
-
-// 爱奇艺
-router.get('/iqiyi/dongman/:id', require('./routes/iqiyi/dongman'));
-router.get('/iqiyi/user/video/:uid', require('./routes/iqiyi/video'));
-
-// 南方周末
-router.get('/infzm/:id', require('./routes/infzm/news'));
-
-// Dribbble
-router.get('/dribbble/popular/:timeframe?', require('./routes/dribbble/popular'));
-router.get('/dribbble/user/:name', require('./routes/dribbble/user'));
-router.get('/dribbble/keyword/:keyword', require('./routes/dribbble/keyword'));
-
-// 斗鱼
-router.get('/douyu/room/:id', require('./routes/douyu/room'));
-
-// 虎牙
-router.get('/huya/live/:id', require('./routes/huya/live'));
-
-// 浪Play(原kingkong)直播
-router.get('/kingkong/room/:id', require('./routes/langlive/room'));
-router.get('/langlive/room/:id', require('./routes/langlive/room'));
-
-// SHOWROOM直播
-router.get('/showroom/room/:id', require('./routes/showroom/room'));
-
-// v2ex
-router.get('/v2ex/topics/:type', require('./routes/v2ex/topics'));
-router.get('/v2ex/post/:postid', require('./routes/v2ex/post'));
-router.get('/v2ex/tab/:tabid', require('./routes/v2ex/tab'));
-
-// Telegram
-router.get('/telegram/channel/:username/:searchQuery?', require('./routes/telegram/channel'));
-router.get('/telegram/stickerpack/:name', require('./routes/telegram/stickerpack'));
-router.get('/telegram/blog', require('./routes/telegram/blog'));
-
-// readhub
-router.get('/readhub/category/:category', require('./routes/readhub/category'));
-
-// GitHub
-router.get('/github/repos/:user', require('./routes/github/repos'));
-router.get('/github/trending/:since/:language?', require('./routes/github/trending'));
-router.get('/github/issue/:user/:repo/:state?/:labels?', require('./routes/github/issue'));
-router.get('/github/pull/:user/:repo', require('./routes/github/pulls'));
-router.get('/github/user/followers/:user', require('./routes/github/follower'));
-router.get('/github/stars/:user/:repo', require('./routes/github/star'));
-router.get('/github/search/:query/:sort?/:order?', require('./routes/github/search'));
-router.get('/github/branches/:user/:repo', require('./routes/github/branches'));
-router.get('/github/file/:user/:repo/:branch/:filepath+', require('./routes/github/file'));
-router.get('/github/starred_repos/:user', require('./routes/github/starred_repos'));
-router.get('/github/contributors/:user/:repo/:order?/:anon?', require('./routes/github/contributors'));
-
-// f-droid
-router.get('/fdroid/apprelease/:app', require('./routes/fdroid/apprelease'));
-
-// konachan
-router.get('/konachan/post/popular_recent', require('./routes/konachan/post_popular_recent'));
-router.get('/konachan.com/post/popular_recent', require('./routes/konachan/post_popular_recent'));
-router.get('/konachan.net/post/popular_recent', require('./routes/konachan/post_popular_recent'));
-router.get('/konachan/post/popular_recent/:period', require('./routes/konachan/post_popular_recent'));
-router.get('/konachan.com/post/popular_recent/:period', require('./routes/konachan/post_popular_recent'));
-router.get('/konachan.net/post/popular_recent/:period', require('./routes/konachan/post_popular_recent'));
-
-// PornHub
-router.get('/pornhub/category/:caty', require('./routes/pornhub/category'));
-router.get('/pornhub/search/:keyword', require('./routes/pornhub/search'));
-router.get('/pornhub/category_url/:url?', require('./routes/pornhub/category_url'));
-router.get('/pornhub/users/:username', require('./routes/pornhub/users'));
-router.get('/pornhub/model/:username/:sort?', require('./routes/pornhub/model'));
-router.get('/pornhub/pornstar/:username/:sort?', require('./routes/pornhub/pornstar'));
-
-// yande.re
-router.get('/yande.re/post/popular_recent', require('./routes/yande.re/post_popular_recent'));
-router.get('/yande.re/post/popular_recent/:period', require('./routes/yande.re/post_popular_recent'));
-
-// 纽约时报
-router.get('/nytimes/morning_post', require('./routes/nytimes/morning_post'));
-router.get('/nytimes/:lang?', require('./routes/nytimes/index'));
-
-// 3dm
-router.get('/3dm/:name/:type', require('./routes/3dm/game'));
-router.get('/3dm/news', require('./routes/3dm/news_center'));
-
-// 旅法师营地
-router.get('/lfsyd/:typecode', require('./routes/lfsyd/index'));
-
-// 喜马拉雅
-router.get('/ximalaya/album/:id/:all?', require('./routes/ximalaya/album'));
-
-// EZTV
-router.get('/eztv/torrents/:imdb_id', require('./routes/eztv/imdb'));
-
-// 什么值得买
-router.get('/smzdm/keyword/:keyword', require('./routes/smzdm/keyword'));
-router.get('/smzdm/ranking/:rank_type/:rank_id/:hour', require('./routes/smzdm/ranking'));
-router.get('/smzdm/haowen/:day?', require('./routes/smzdm/haowen'));
-router.get('/smzdm/haowen/fenlei/:name/:sort?', require('./routes/smzdm/haowen_fenlei'));
-router.get('/smzdm/article/:uid', require('./routes/smzdm/article'));
-router.get('/smzdm/baoliao/:uid', require('./routes/smzdm/baoliao'));
-
-// 新京报
-router.get('/bjnews/:cat', require('./routes/bjnews/news'));
-router.get('/bjnews/epaper/:cat', require('./routes/bjnews/epaper'));
-
-// 停水通知
-router.get('/tingshuitz/hangzhou', require('./routes/tingshuitz/hangzhou'));
-router.get('/tingshuitz/xiaoshan', require('./routes/tingshuitz/xiaoshan'));
-router.get('/tingshuitz/dalian', require('./routes/tingshuitz/dalian'));
-router.get('/tingshuitz/guangzhou', require('./routes/tingshuitz/guangzhou'));
-router.get('/tingshuitz/dongguan', require('./routes/tingshuitz/dongguan'));
-router.get('/tingshuitz/xian', require('./routes/tingshuitz/xian'));
-router.get('/tingshuitz/yangjiang', require('./routes/tingshuitz/yangjiang'));
-router.get('/tingshuitz/nanjing', require('./routes/tingshuitz/nanjing'));
-router.get('/tingshuitz/wuhan', require('./routes/tingshuitz/wuhan'));
-
-// 米哈游
-router.get('/mihoyo/bh3/:type', require('./routes/mihoyo/bh3'));
-router.get('/mihoyo/bh2/:type', require('./routes/mihoyo/bh2'));
-
-// 新闻联播
-router.get('/cctv/xwlb', require('./routes/cctv/xwlb'));
-// 央视新闻
-router.get('/cctv/:category', require('./routes/cctv/category'));
-
-// 财新博客
-router.get('/caixin/blog/:column', require('./routes/caixin/blog'));
-// 财新
-router.get('/caixin/:column/:category', require('./routes/caixin/category'));
-// 财新首页
-router.get('/caixin/article', require('./routes/caixin/article'));
-
-// 草榴社区
-router.get('/t66y/post/:tid', require('./routes/t66y/post'));
-router.get('/t66y/:id/:type?', require('./routes/t66y/index'));
-
-// 色中色
-router.get('/sexinsex/:id/:type?', require('./routes/sexinsex/index'));
-
-// 机核
-router.get('/gcores/category/:category', require('./routes/gcores/category'));
-
-// 国家地理
-router.get('/natgeo/dailyphoto', require('./routes/natgeo/dailyphoto'));
-router.get('/natgeo/:cat/:type?', require('./routes/natgeo/natgeo'));
-
-// 一个
-router.get('/one', require('./routes/one/index'));
-
-// Firefox
-router.get('/firefox/release/:platform', require('./routes/firefox/release'));
-router.get('/firefox/addons/:id', require('./routes/firefox/addons'));
-
-// Thunderbird
-router.get('/thunderbird/release', require('./routes/thunderbird/release'));
-
-// tuicool
-router.get('/tuicool/mags/:type', require('./routes/tuicool/mags'));
-
-// Hexo
-router.get('/hexo/next/:url', require('./routes/hexo/next'));
-router.get('/hexo/yilia/:url', require('./routes/hexo/yilia'));
-
-// cpython
-router.get('/cpython/:pre?', require('./routes/cpython'));
-
-// 小米
-router.get('/mi/golden', require('./routes/mi/golden'));
-router.get('/mi/crowdfunding', require('./routes/mi/crowdfunding'));
-router.get('/mi/youpin/crowdfunding', require('./routes/mi/youpin/crowdfunding'));
-router.get('/mi/youpin/new', require('./routes/mi/youpin/new'));
-router.get('/miui/:device/:type?/:region?', require('./routes/mi/miui/index'));
-router.get('/mi/bbs/board/:boardId', require('./routes/mi/board'));
-
-// Keep
-router.get('/keep/user/:id', require('./routes/keep/user'));
-
-// 起点
-router.get('/qidian/chapter/:id', require('./routes/qidian/chapter'));
-router.get('/qidian/forum/:id', require('./routes/qidian/forum'));
-router.get('/qidian/free/:type?', require('./routes/qidian/free'));
-router.get('/qidian/free-next/:type?', require('./routes/qidian/free-next'));
-
-// 纵横
-router.get('/zongheng/chapter/:id', require('./routes/zongheng/chapter'));
-
-// 刺猬猫
-router.get('/ciweimao/chapter/:id', require('./routes/ciweimao/chapter'));
-
-// 中国美术馆
-router.get('/namoc/announcement', require('./routes/namoc/announcement'));
-router.get('/namoc/news', require('./routes/namoc/news'));
-router.get('/namoc/media', require('./routes/namoc/media'));
-router.get('/namoc/exhibition', require('./routes/namoc/exhibition'));
-router.get('/namoc/specials', require('./routes/namoc/specials'));
-
-// 懂球帝
-router.get('/dongqiudi/daily', require('./routes/dongqiudi/daily'));
-router.get('/dongqiudi/result/:team', require('./routes/dongqiudi/result'));
-router.get('/dongqiudi/team_news/:team', require('./routes/dongqiudi/team_news'));
-router.get('/dongqiudi/player_news/:id', require('./routes/dongqiudi/player_news'));
-router.get('/dongqiudi/special/:id', require('./routes/dongqiudi/special'));
-router.get('/dongqiudi/top_news/:id?', require('./routes/dongqiudi/top_news'));
-
-// 维基百科 Wikipedia
-router.get('/wikipedia/mainland', require('./routes/wikipedia/mainland'));
-
-// 联合国 United Nations
-router.get('/un/scveto', require('./routes/un/scveto'));
-
-// e 公司
-router.get('/egsea/flash', require('./routes/egsea/flash'));
-
-// 选股宝
-router.get('/xuangubao/subject/:subject_id', require('./routes/xuangubao/subject'));
-
-// 雪球
-router.get('/xueqiu/user/:id/:type?', require('./routes/xueqiu/user'));
-router.get('/xueqiu/favorite/:id', require('./routes/xueqiu/favorite'));
-router.get('/xueqiu/user_stock/:id', require('./routes/xueqiu/user_stock'));
-router.get('/xueqiu/fund/:id', require('./routes/xueqiu/fund'));
-router.get('/xueqiu/stock_info/:id/:type?', require('./routes/xueqiu/stock_info'));
-router.get('/xueqiu/snb/:id', require('./routes/xueqiu/snb'));
-router.get('/xueqiu/hots', require('./routes/xueqiu/hots'));
-
-// Greasy Fork
-router.get('/greasyfork/:language/:domain?', require('./routes/greasyfork/scripts'));
-
-// LinkedKeeper
-router.get('/linkedkeeper/:type/:id?', require('./routes/linkedkeeper/index'));
-
-// 开源中国
-router.get('/oschina/news/:category?', require('./routes/oschina/news'));
-router.get('/oschina/user/:id', require('./routes/oschina/user'));
-router.get('/oschina/u/:id', require('./routes/oschina/u'));
-router.get('/oschina/topic/:topic', require('./routes/oschina/topic'));
-
-// 安全客
-router.get('/aqk/vul', require('./routes/aqk/vul'));
-router.get('/aqk/:category', require('./routes/aqk/category'));
-
-// 腾讯游戏开发者社区
-router.get('/gameinstitute/community/:tag?', require('./routes/tencent/gameinstitute/community'));
-
-// 腾讯视频 SDK
-router.get('/qcloud/mlvb/changelog', require('./routes/tencent/qcloud/mlvb/changelog'));
-
-// 腾讯吐个槽
-router.get('/tucaoqq/post/:project/:key', require('./routes/tencent/tucaoqq/post'));
-
-// Bugly SDK
-router.get('/bugly/changelog/:platform', require('./routes/tencent/bugly/changelog'));
-
-// wechat
-router.get('/wechat/wemp/:id', require('./routes/tencent/wechat/wemp'));
-router.get('/wechat/csm/:id', require('./routes/tencent/wechat/csm'));
-router.get('/wechat/ce/:id', require('./routes/tencent/wechat/ce'));
-router.get('/wechat/announce', require('./routes/tencent/wechat/announce'));
-router.get('/wechat/miniprogram/plugins', require('./routes/tencent/wechat/miniprogram/plugins'));
-router.get('/wechat/tgchannel/:id', require('./routes/tencent/wechat/tgchannel'));
-router.get('/wechat/uread/:userid', require('./routes/tencent/wechat/uread'));
-router.get('/wechat/ershicimi/:id', require('./routes/tencent/wechat/ershcimi'));
-router.get('/wechat/wjdn/:id', require('./routes/tencent/wechat/wjdn'));
-router.get('/wechat/mp/homepage/:biz/:hid/:cid?', require('./routes/tencent/wechat/mp'));
-router.get('/wechat/mp/msgalbum/:biz/:aid', require('./routes/tencent/wechat/msgalbum'));
-
-// All the Flight Deals
-router.get('/atfd/:locations/:nearby?', require('./routes/atfd/index'));
-
-// Fir
-router.get('/fir/update/:id', require('./routes/fir/update'));
-
-// Nvidia Web Driver
-router.get('/nvidia/webdriverupdate', require('./routes/nvidia/webdriverupdate'));
-
-// Google
-router.get('/google/citations/:id', require('./routes/google/citations'));
-router.get('/google/scholar/:query', require('./routes/google/scholar'));
-router.get('/google/doodles/:language?', require('./routes/google/doodles'));
-router.get('/google/album/:id', require('./routes/google/album'));
-router.get('/google/sites/:id', require('./routes/google/sites'));
-
-// 每日环球展览 iMuseum
-router.get('/imuseum/:city/:type?', require('./routes/imuseum'));
-
-// AppStore
-router.get('/appstore/update/:country/:id', require('./routes/apple/appstore/update'));
-router.get('/appstore/price/:country/:type/:id', require('./routes/apple/appstore/price'));
-router.get('/appstore/iap/:country/:id', require('./routes/apple/appstore/in-app-purchase'));
-router.get('/appstore/xianmian', require('./routes/apple/appstore/xianmian'));
-router.get('/appstore/gofans', require('./routes/apple/appstore/gofans'));
-
-// Hopper
-router.get('/hopper/:lowestOnly/:from/:to?', require('./routes/hopper/index'));
-
-// 马蜂窝
-router.get('/mafengwo/note/:type', require('./routes/mafengwo/note'));
-router.get('/mafengwo/ziyouxing/:code', require('./routes/mafengwo/ziyouxing'));
-
-// 中国地震局震情速递(与地震台网同步更新)
-router.get('/earthquake/:region?', require('./routes/earthquake'));
-
-// 中国地震台网
-router.get('/earthquake/ceic/:type', require('./routes/earthquake/ceic'));
-
-// 小说
-router.get('/novel/biquge/:id', require('./routes/novel/biquge'));
-router.get('/novel/biqugeinfo/:id/:limit?', require('./routes/novel/biqugeinfo'));
-router.get('/novel/uukanshu/:uid', require('./routes/novel/uukanshu'));
-router.get('/novel/wenxuemi/:id1/:id2', require('./routes/novel/wenxuemi'));
-router.get('/novel/booksky/:id', require('./routes/novel/booksky'));
-router.get('/novel/shuquge/:id', require('./routes/novel/shuquge'));
-router.get('/novel/ptwxz/:id1/:id2', require('./routes/novel/ptwxz'));
-router.get('/novel/zhaishuyuan/:id', require('./routes/novel/zhaishuyuan'));
-
-// 中国气象网
-router.get('/weatheralarm/:province?', require('./routes/weatheralarm'));
-
-// Gitlab
-router.get('/gitlab/explore/:type', require('./routes/gitlab/explore'));
-
-// 忧郁的loli
-router.get('/mygalgame', require('./routes/galgame/hhgal')); // 废弃
-router.get('/mmgal', require('./routes/galgame/hhgal')); // 废弃
-router.get('/hhgal', require('./routes/galgame/hhgal'));
-
-// say花火
-router.get('/sayhuahuo', require('./routes/galgame/sayhuahuo'));
-
-// 终点分享
-router.get('/zdfx', require('./routes/galgame/zdfx'));
-
-// 北京林业大学
-router.get('/bjfu/grs', require('./routes/universities/bjfu/grs'));
-router.get('/bjfu/kjc', require('./routes/universities/bjfu/kjc'));
-router.get('/bjfu/jwc/:type', require('./routes/universities/bjfu/jwc/index'));
-router.get('/bjfu/news/:type', require('./routes/universities/bjfu/news/index'));
-
-// 北京理工大学
-router.get('/bit/jwc', require('./routes/universities/bit/jwc/jwc'));
-router.get('/bit/cs', require('./routes/universities/bit/cs/cs'));
-
-// 大连工业大学
-router.get('/dpu/jiaowu/news/:type?', require('./routes/universities/dpu/jiaowu/news'));
-router.get('/dpu/wlfw/news/:type?', require('./routes/universities/dpu/wlfw/news'));
-
-// 东南大学
-router.get('/seu/radio/academic', require('./routes/universities/seu/radio/academic'));
-router.get('/seu/yzb/:type', require('./routes/universities/seu/yzb'));
-router.get('/seu/cse/:type?', require('./routes/universities/seu/cse'));
-
-// 南京工业大学
-router.get('/njtech/jwc', require('./routes/universities/njtech/jwc'));
-
-// 南京航空航天大学
-router.get('/nuaa/jwc/:type?', require('./routes/universities/nuaa/jwc/jwc'));
-router.get('/nuaa/cs/:type?', require('./routes/universities/nuaa/cs/index'));
-router.get('/nuaa/yjsy/:type?', require('./routes/universities/nuaa/yjsy/yjsy'));
-
-// 河海大学
-router.get('/hhu/libNews', require('./routes/universities/hhu/libNews'));
-// 河海大学常州校区
-router.get('/hhu/libNewsc', require('./routes/universities/hhu/libNewsc'));
-
-// 哈尔滨工业大学
-router.get('/hit/jwc', require('./routes/universities/hit/jwc'));
-router.get('/hit/today/:category', require('./routes/universities/hit/today'));
-
-// 哈尔滨工业大学(威海)
-router.get('/hitwh/today', require('./routes/universities/hitwh/today'));
-
-// 上海科技大学
-router.get('/shanghaitech/activity', require('./routes/universities/shanghaitech/activity'));
-router.get('/shanghaitech/sist/activity', require('./routes/universities/shanghaitech/sist/activity'));
-
-// 上海交通大学
-router.get('/sjtu/seiee/academic', require('./routes/universities/sjtu/seiee/academic'));
-router.get('/sjtu/seiee/bjwb/:type', require('./routes/universities/sjtu/seiee/bjwb'));
-router.get('/sjtu/seiee/xsb/:type?', require('./routes/universities/sjtu/seiee/xsb'));
-
-router.get('/sjtu/gs/tzgg/:type?', require('./routes/universities/sjtu/gs/tzgg'));
-router.get('/sjtu/jwc/:type?', require('./routes/universities/sjtu/jwc'));
-router.get('/sjtu/tongqu/:type?', require('./routes/universities/sjtu/tongqu/activity'));
-router.get('/sjtu/yzb/zkxx/:type', require('./routes/universities/sjtu/yzb/zkxx'));
-
-// 江南大学
-router.get('/ju/jwc/:type?', require('./routes/universities/ju/jwc'));
-
-// 洛阳理工学院
-router.get('/lit/jwc', require('./routes/universities/lit/jwc'));
-router.get('/lit/xwzx/:name?', require('./routes/universities/lit/xwzx'));
-router.get('/lit/tw/:name?', require('./routes/universities/lit/tw'));
-
-// 清华大学
-router.get('/thu/career', require('./routes/universities/thu/career'));
-router.get('/thu/:type', require('./routes/universities/thu/index'));
-
-// 北京大学
-router.get('/pku/eecs/:type?', require('./routes/universities/pku/eecs'));
-router.get('/pku/rccp/mzyt', require('./routes/universities/pku/rccp/mzyt'));
-router.get('/pku/cls/lecture', require('./routes/universities/pku/cls/lecture'));
-router.get('/pku/bbs/hot', require('./routes/universities/pku/bbs/hot'));
-
-// 上海海事大学
-router.get('/shmtu/www/:type', require('./routes/universities/shmtu/www'));
-router.get('/shmtu/jwc/:type', require('./routes/universities/shmtu/jwc'));
-
-// 上海海洋大学
-router.get('/shou/www/:type', require('./routes/universities/shou/www'));
-
-// 西南科技大学
-router.get('/swust/jwc/news', require('./routes/universities/swust/jwc_news'));
-router.get('/swust/jwc/notice/:type?', require('./routes/universities/swust/jwc_notice'));
-router.get('/swust/cs/:type?', require('./routes/universities/swust/cs'));
-
-// 华南师范大学
-router.get('/scnu/jw', require('./routes/universities/scnu/jw'));
-router.get('/scnu/library', require('./routes/universities/scnu/library'));
-router.get('/scnu/cs/match', require('./routes/universities/scnu/cs/match'));
-
-// 广东工业大学
-router.get('/gdut/news', require('./routes/universities/gdut/news'));
-
-// 中国科学院
-router.get('/cas/sim/academic', require('./routes/universities/cas/sim/academic'));
-router.get('/cas/mesalab/kb', require('./routes/universities/cas/mesalab/kb'));
-
-// 中国传媒大学
-router.get('/cuc/yz', require('./routes/universities/cuc/yz'));
-
-// 南京邮电大学
-router.get('/njupt/jwc/:type?', require('./routes/universities/njupt/jwc'));
-
-// 南昌航空大学
-router.get('/nchu/jwc/:type?', require('./routes/universities/nchu/jwc'));
-
-// 哈尔滨工程大学
-router.get('/heu/ugs/news/:author?/:category?', require('./routes/universities/heu/ugs/news'));
-router.get('/heu/yjsy/:type?', require('./routes/universities/heu/yjsy'));
-router.get('/heu/gongxue/:type?', require('./routes/universities/heu/news'));
-router.get('/heu/news/:type?', require('./routes/universities/heu/news'));
-router.get('/heu/shuisheng/:type?', require('./routes/universities/heu/uae'));
-router.get('/heu/uae/:type?', require('./routes/universities/heu/uae'));
-router.get('/heu/job/:type?', require('./routes/universities/heu/job'));
-
-// 重庆大学
-router.get('/cqu/jwc/announcement', require('./routes/universities/cqu/jwc/announcement'));
-router.get('/cqu/news/jzyg', require('./routes/universities/cqu/news/jzyg'));
-router.get('/cqu/news/tz', require('./routes/universities/cqu/news/tz'));
-router.get('/cqu/youth/:category', require('./routes/universities/cqu/youth/info'));
-router.get('/cqu/sci/:category', require('./routes/universities/cqu/sci/info'));
-router.get('/cqu/net/:category', require('./routes/universities/cqu/net/info'));
-
-// 南京信息工程大学
-router.get('/nuist/bulletin/:category?', require('./routes/universities/nuist/bulletin'));
-router.get('/nuist/jwc/:category?', require('./routes/universities/nuist/jwc'));
-router.get('/nuist/yjs/:category?', require('./routes/universities/nuist/yjs'));
-router.get('/nuist/xgc', require('./routes/universities/nuist/xgc'));
-router.get('/nuist/scs/:category?', require('./routes/universities/nuist/scs'));
-router.get('/nuist/lib', require('./routes/universities/nuist/library/lib'));
-router.get('/nuist/sese/:category?', require('./routes/universities/nuist/sese'));
-router.get('/nuist/cas/:category?', require('./routes/universities/nuist/cas'));
-
-// 成都信息工程大学
-router.get('/cuit/cxxww/:type?', require('./routes/universities/cuit/cxxww'));
-
-// 郑州大学
-router.get('/zzu/news/:type', require('./routes/universities/zzu/news'));
-router.get('/zzu/soft/news/:type', require('./routes/universities/zzu/soft/news'));
-
-// 郑州轻工业大学
-router.get('/zzuli/campus/:type', require('./routes/universities/zzuli/campus'));
-router.get('/zzuli/yjsc/:type', require('./routes/universities/zzuli/yjsc'));
-
-// 重庆科技学院
-router.get('/cqust/jw/:type?', require('./routes/universities/cqust/jw'));
-router.get('/cqust/lib/:type?', require('./routes/universities/cqust/lib'));
-
-// 常州大学
-router.get('/cczu/jwc/:category?', require('./routes/universities/cczu/jwc'));
-router.get('/cczu/news/:category?', require('./routes/universities/cczu/news'));
-
-// 南京理工大学
-router.get('/njust/jwc/:type', require('./routes/universities/njust/jwc'));
-router.get('/njust/cwc/:type', require('./routes/universities/njust/cwc'));
-router.get('/njust/gs/:type', require('./routes/universities/njust/gs'));
-router.get('/njust/eo/:grade?/:type?', require('./routes/universities/njust/eo'));
-
-// 四川旅游学院
-router.get('/sctu/xgxy', require('./routes/universities/sctu/information-engineer-faculty/index'));
-router.get('/sctu/xgxy/:id', require('./routes/universities/sctu/information-engineer-faculty/context'));
-router.get('/sctu/jwc/:type?', require('./routes/universities/sctu/jwc/index'));
-router.get('/sctu/jwc/:type/:id', require('./routes/universities/sctu/jwc/context'));
-
-// 电子科技大学
-router.get('/uestc/jwc/:type?', require('./routes/universities/uestc/jwc'));
-router.get('/uestc/news/:type?', require('./routes/universities/uestc/news'));
-router.get('/uestc/auto/:type?', require('./routes/universities/uestc/auto'));
-router.get('/uestc/cs/:type?', require('./routes/universities/uestc/cs'));
-
-// 云南大学
-router.get('/ynu/grs/zytz', require('./routes/universities/ynu/grs/zytz'));
-router.get('/ynu/grs/qttz/:category', require('./routes/universities/ynu/grs/qttz'));
-router.get('/ynu/jwc/:category', require('./routes/universities/ynu/jwc/zytz'));
-router.get('/ynu/home', require('./routes/universities/ynu/home/main'));
-
-// 昆明理工大学
-router.get('/kmust/jwc/:type?', require('./routes/universities/kmust/jwc'));
-router.get('/kmust/job/careers/:type?', require('./routes/universities/kmust/job/careers'));
-router.get('/kmust/job/jobfairs', require('./routes/universities/kmust/job/jobfairs'));
-
-// 武汉大学
-router.get('/whu/cs/:type', require('./routes/universities/whu/cs'));
-router.get('/whu/news/:type?', require('./routes/universities/whu/news'));
-
-// 华中科技大学
-router.get('/hust/auto/notice/:type?', require('./routes/universities/hust/aia/notice'));
-router.get('/hust/auto/news', require('./routes/universities/hust/aia/news'));
-router.get('/hust/aia/news', require('./routes/universities/hust/aia/news'));
-router.get('/hust/aia/notice/:type?', require('./routes/universities/hust/aia/notice'));
-
-// 井冈山大学
-router.get('/jgsu/jwc', require('./routes/universities/jgsu/jwc'));
-
-// 中南大学
-router.get('/csu/job/:type?', require('./routes/universities/csu/job'));
-
-// 山东大学
-router.get('/sdu/sc/:type?', require('./routes/universities/sdu/sc'));
-router.get('/sdu/cs/:type?', require('./routes/universities/sdu/cs'));
-router.get('/sdu/cmse/:type?', require('./routes/universities/sdu/cmse'));
-router.get('/sdu/mech/:type?', require('./routes/universities/sdu/mech'));
-router.get('/sdu/epe/:type?', require('./routes/universities/sdu/epe'));
-
-// 中国海洋大学
-router.get('/ouc/it/:type?', require('./routes/universities/ouc/it'));
-
-// 大连大学
-router.get('/dlu/jiaowu/news', require('./routes/universities/dlu/jiaowu/news'));
-
-// 东莞理工学院
-router.get('/dgut/jwc/:type?', require('./routes/universities/dgut/jwc'));
-router.get('/dgut/xsc/:type?', require('./routes/universities/dgut/xsc'));
-
-// 同济大学
-router.get('/tju/sse/:type?', require('./routes/universities/tju/sse/notice'));
-
-// 华南理工大学
-router.get('/scut/jwc/notice/:category?', require('./routes/universities/scut/jwc/notice'));
-router.get('/scut/jwc/news', require('./routes/universities/scut/jwc/news'));
-
-// 温州商学院
-router.get('/wzbc/:type?', require('./routes/universities/wzbc/news'));
-
-// 河南大学
-router.get('/henu/:type?', require('./routes/universities/henu/news'));
-
-// 天津大学
-router.get('/tjpyu/ooa/:type?', require('./routes/universities/tjpyu/ooa'));
-
-// 南开大学
-router.get('/nku/jwc/:type?', require('./routes/universities/nku/jwc/index'));
-
-// 北京航空航天大学
-router.get('/buaa/news/:type', require('./routes/universities/buaa/news/index'));
-
-// 浙江工业大学
-router.get('/zjut/:type', require('./routes/universities/zjut/index'));
-router.get('/zjut/design/:type', require('./routes/universities/zjut/design'));
-
-// 上海大学
-router.get('/shu/jwc/:type?', require('./routes/universities/shu/jwc'));
-
-// 北京科技大学天津学院
-router.get('/ustb/tj/news/:type?', require('./routes/universities/ustb/tj/news'));
-
-// 深圳大学
-router.get('/szu/yz/:type?', require('./routes/universities/szu/yz'));
-
-// 中国石油大学(华东)
-router.get('/upc/main/:type?', require('./routes/universities/upc/main'));
-router.get('/upc/jsj/:type?', require('./routes/universities/upc/jsj'));
-
-// 华北水利水电大学
-router.get('/ncwu/notice', require('./routes/universities/ncwu/notice'));
-
-// 太原师范学院
-router.get('/tynu', require('./routes/universities/tynu/tynu'));
-
-// 中北大学
-router.get('/nuc/:type', require('./routes/universities/nuc/index'));
-
-// 安徽农业大学
-router.get('/ahau/cs_news/:type', require('./routes/universities/ahau/cs_news/index'));
-router.get('/ahau/jwc/:type', require('./routes/universities/ahau/jwc/index'));
-router.get('/ahau/main/:type', require('./routes/universities/ahau/main/index'));
-
-// 安徽医科大学研究生学院
-router.get('/ahmu/news', require('./routes/universities/ahmu/news'));
-
-// 安徽工业大学
-router.get('/ahut/news', require('./routes/universities/ahut/news'));
-router.get('/ahut/jwc', require('./routes/universities/ahut/jwc'));
-router.get('/ahut/cstzgg', require('./routes/universities/ahut/cstzgg'));
-
-// 上海理工大学
-router.get('/usst/jwc', require('./routes/universities/usst/jwc'));
-
-// 临沂大学
-router.get('/lyu/news/:type', require('./routes/universities/lyu/news/index'));
-
-// ifanr
-router.get('/ifanr/:channel?', require('./routes/ifanr/index'));
-
-// 果壳网
-router.get('/guokr/scientific', require('./routes/guokr/scientific'));
-router.get('/guokr/:channel', require('./routes/guokr/calendar'));
-
-// 联合早报
-router.get('/zaobao/realtime/:section?', require('./routes/zaobao/realtime'));
-router.get('/zaobao/znews/:section?', require('./routes/zaobao/znews'));
-router.get('/zaobao/:type/:section', require('./routes/zaobao/index'));
-
-// Apple
-router.get('/apple/exchange_repair/:country?', require('./routes/apple/exchange_repair'));
-
-// IPSW.me
-router.get('/ipsw/index/:ptype/:pname', require('./routes/ipsw/index'));
-
-// Minecraft CurseForge
-router.get('/curseforge/files/:project', require('./routes/curseforge/files'));
-
-// 少数派 sspai
-router.get('/sspai/series', require('./routes/sspai/series'));
-router.get('/sspai/shortcuts', require('./routes/sspai/shortcutsGallery'));
-router.get('/sspai/matrix', require('./routes/sspai/matrix'));
-router.get('/sspai/column/:id', require('./routes/sspai/column'));
-router.get('/sspai/author/:id', require('./routes/sspai/author'));
-router.get('/sspai/topics', require('./routes/sspai/topics'));
-router.get('/sspai/topic/:id', require('./routes/sspai/topic'));
-router.get('/sspai/tag/:keyword', require('./routes/sspai/tag'));
-router.get('/sspai/activity/:slug', require('./routes/sspai/activity'));
-
-// 异次元软件世界
-router.get('/iplay/home', require('./routes/iplay/home'));
-
-// xclient.info
-router.get('/xclient/app/:name', require('./routes/xclient/app'));
-
-// 中国驻外使领事馆
-router.get('/embassy/:country/:city?', require('./routes/embassy/index'));
-
-// 澎湃新闻
-router.get('/thepaper/featured', require('./routes/thepaper/featured'));
-router.get('/thepaper/channel/:id', require('./routes/thepaper/channel'));
-
-// 澎湃美数课
-router.get('/thepaper/839studio', require('./routes/thepaper/839studio/studio.js'));
-router.get('/thepaper/839studio/:id', require('./routes/thepaper/839studio/category.js'));
-
-// 电影首发站
-router.get('/dysfz', require('./routes/dysfz/index'));
-router.get('/dysfz/index', require('./routes/dysfz/index')); // 废弃
-
-// きららファンタジア
-router.get('/kirara/news', require('./routes/kirara/news'));
-
-// 电影天堂
-router.get('/dytt', require('./routes/dytt/index'));
-router.get('/dytt/index', require('./routes/dytt/index')); // 废弃
-
-// BT之家
-router.get('/btzj/:type?', require('./routes/btzj/index'));
-
-// 人生05电影网
-router.get('/rs05/rs05', require('./routes/rs05/rs05'));
-
-// 人人影视 (评测推荐)
-router.get('/rrys/review', require('./routes/rrys/review'));
-
-// 人人影视(每日更新)
-router.get('/yyets/todayfilelist', require('./routes/yyets/todayfilelist'));
-
-// 趣头条
-router.get('/qutoutiao/category/:cid', require('./routes/qutoutiao/category'));
-
-// NHK NEW WEB EASY
-router.get('/nhk/news_web_easy', require('./routes/nhk/news_web_easy'));
-
-// BBC
-router.get('/bbc/:site?/:channel?', require('./routes/bbc/index'));
-
-// FT 中文网
-router.get('/ft/:language/:channel?', require('./routes/ft/channel'));
-
-// The Verge
-router.get('/verge', require('./routes/verge/index'));
-
-// 看雪
-router.get('/pediy/topic/:category?/:type?', require('./routes/pediy/topic'));
-
-// 多维新闻网
-router.get('/dwnews/yaowen/:region?', require('./routes/dwnews/yaowen'));
-router.get('/dwnews/rank/:type?/:range?', require('./routes/dwnews/rank'));
-
-// 知晓程序
-router.get('/miniapp/article/:category', require('./routes/miniapp/article'));
-router.get('/miniapp/store/newest', require('./routes/miniapp/store/newest'));
-
-// 后续
-router.get('/houxu/live/:id/:timeline?', require('./routes/houxu/live'));
-router.get('/houxu/events', require('./routes/houxu/events'));
-router.get('/houxu/lives/:type', require('./routes/houxu/lives'));
-
-// 老司机
-router.get('/laosiji/hot', require('./routes/laosiji/hot'));
-router.get('/laosiji/feed', require('./routes/laosiji/feed'));
-router.get('/laosiji/hotshow/:id', require('./routes/laosiji/hotshow'));
-
-// Scientific American 60-Second Science
-router.get('/60s-science/transcript', require('./routes/60s-science/transcript'));
-
-// 99% Invisible
-router.get('/99percentinvisible/transcript', require('./routes/99percentinvisible/transcript'));
-
-// 青空文庫
-router.get('/aozora/newbook/:count?', require('./routes/aozora/newbook'));
-
-// solidot
-router.get('/solidot/:type?', require('./routes/solidot/main'));
-
-// Hermes UK
-router.get('/parcel/hermesuk/:tracking', require('./routes/parcel/hermesuk'));
-
-// 数字尾巴
-router.get('/dgtle', require('./routes/dgtle/index'));
-router.get('/dgtle/whale/category/:category', require('./routes/dgtle/whale'));
-router.get('/dgtle/whale/rank/:type/:rule', require('./routes/dgtle/whale_rank'));
-router.get('/dgtle/trade/:typeId?', require('./routes/dgtle/trade'));
-router.get('/dgtle/trade/search/:keyword', require('./routes/dgtle/keyword'));
-
-// 抽屉新热榜
-router.get('/chouti/top/:hour?', require('./routes/chouti/top'));
-router.get('/chouti/:subject?', require('./routes/chouti'));
-
-// 西安电子科技大学
-router.get('/xidian/jwc/:category?', require('./routes/universities/xidian/jwc'));
-
-// Westore
-router.get('/westore/new', require('./routes/westore/new'));
-
-// 优酷
-router.get('/youku/channel/:channelId/:embed?', require('./routes/youku/channel'));
-
-// 油价
-router.get('/oilprice/:area', require('./routes/oilprice'));
-
-// nHentai
-router.get('/nhentai/search/:keyword/:mode?', require('./routes/nhentai/search'));
-router.get('/nhentai/:key/:keyword/:mode?', require('./routes/nhentai/other'));
-
-// 龙腾网
-router.get('/ltaaa/:type?', require('./routes/ltaaa/main'));
-
-// AcFun
-router.get('/acfun/bangumi/:id', require('./routes/acfun/bangumi'));
-router.get('/acfun/user/video/:uid', require('./routes/acfun/video'));
-
-// Auto Trader
-router.get('/autotrader/:query', require('./routes/autotrader'));
-
-// 极客公园
-router.get('/geekpark/breakingnews', require('./routes/geekpark/breakingnews'));
-
-// 百度
-router.get('/baidu/doodles', require('./routes/baidu/doodles'));
-router.get('/baidu/topwords/:boardId?', require('./routes/baidu/topwords'));
-router.get('/baidu/daily', require('./routes/baidu/daily'));
-
-// 搜狗
-router.get('/sogou/doodles', require('./routes/sogou/doodles'));
-
-// 香港天文台
-router.get('/hko/weather', require('./routes/hko/weather'));
-
-// sankakucomplex
-router.get('/sankakucomplex/post', require('./routes/sankakucomplex/post'));
-
-// 技术头条
-router.get('/blogread/newest', require('./routes/blogread/newest'));
-
-// gnn游戏新闻
-router.get('/gnn/gnn', require('./routes/gnn/gnn'));
-
-// a9vg游戏新闻
-router.get('/a9vg/a9vg', require('./routes/a9vg/a9vg'));
-
-// IT桔子
-router.get('/itjuzi/invest', require('./routes/itjuzi/invest'));
-router.get('/itjuzi/merge', require('./routes/itjuzi/merge'));
-
-// 探物
-router.get('/tanwu/products', require('./routes/tanwu/products'));
-
-// GitChat
-router.get('/gitchat/newest/:category?/:selected?', require('./routes/gitchat/newest'));
-
-// The Guardian
-router.get('/guardian/:type', require('./routes/guardian/guardian'));
-
-// 下厨房
-router.get('/xiachufang/user/cooked/:id', require('./routes/xiachufang/user/cooked'));
-router.get('/xiachufang/user/created/:id', require('./routes/xiachufang/user/created'));
-router.get('/xiachufang/popular/:timeframe?', require('./routes/xiachufang/popular'));
-
-// 经济观察报
-router.get('/eeo/:category?', require('./routes/eeo/index'));
-
-// 腾讯视频
-router.get('/tencentvideo/playlist/:id', require('./routes/tencent/video/playlist'));
-
-// 看漫画
-router.get('/manhuagui/comic/:id', require('./routes/manhuagui/comic'));
-// 動漫狂
-router.get('/cartoonmad/comic/:id', require('./routes/cartoonmad/comic'));
-// Vol
-router.get('/vol/:mode?', require('./routes/vol/lastupdate'));
-// 咚漫
-router.get('/dongmanmanhua/:category/:name/:id', require('./routes/dongmanmanhua/comic'));
-// webtoons
-router.get('/webtoons/:lang/:category/:name/:id', require('./routes/webtoons/comic'));
-router.get('/webtoons/naver/:id', require('./routes/webtoons/naver'));
-
-// Tits Guru
-router.get('/tits-guru/home', require('./routes/titsguru/home'));
-router.get('/tits-guru/daily', require('./routes/titsguru/daily'));
-router.get('/tits-guru/category/:type', require('./routes/titsguru/category'));
-router.get('/tits-guru/model/:name', require('./routes/titsguru/model'));
-
-// typora
-router.get('/typora/changelog', require('./routes/typora/changelog'));
-router.get('/typora/changelog-dev/:os?', require('./routes/typora/changelog-dev'));
-
-// TSSstatus
-router.get('/tssstatus/:board/:build', require('./routes/tssstatus'));
-
-// Anime1
-router.get('/anime1/anime/:time/:name', require('./routes/anime1/anime'));
-router.get('/anime1/search/:keyword', require('./routes/anime1/search'));
-
-// gitea
-router.get('/gitea/blog', require('./routes/gitea/blog'));
-
-// iDownloadBlog
-router.get('/idownloadblog', require('./routes/idownloadblog/index'));
-
-// 9to5
-router.get('/9to5/:subsite/:tag?', require('./routes/9to5/subsite'));
-
-// TesterHome
-router.get('/testerhome/newest', require('./routes/testerhome/newest'));
-
-// 刷屏
-router.get('/weseepro/newest', require('./routes/weseepro/newest'));
-router.get('/weseepro/newest-direct', require('./routes/weseepro/newest-direct'));
-router.get('/weseepro/circle', require('./routes/weseepro/circle'));
-
-// 玩物志
-router.get('/coolbuy/newest', require('./routes/coolbuy/newest'));
-
-// NGA
-router.get('/nga/forum/:fid/:recommend?', require('./routes/nga/forum'));
-router.get('/nga/post/:tid', require('./routes/nga/post'));
-
-// Nautilus
-router.get('/nautilus/topic/:tid', require('./routes/nautilus/topics'));
-
-// JavBus
-router.get('/javbus/home', require('./routes/javbus/home'));
-router.get('/javbus/genre/:gid', require('./routes/javbus/genre'));
-router.get('/javbus/star/:sid', require('./routes/javbus/star'));
-router.get('/javbus/series/:seriesid', require('./routes/javbus/series'));
-router.get('/javbus/uncensored/home', require('./routes/javbus/uncensored/home'));
-router.get('/javbus/uncensored/genre/:gid', require('./routes/javbus/uncensored/genre'));
-router.get('/javbus/uncensored/star/:sid', require('./routes/javbus/uncensored/star'));
-router.get('/javbus/uncensored/series/:seriesid', require('./routes/javbus/uncensored/series'));
-router.get('/javbus/western/home', require('./routes/javbus/western/home'));
-router.get('/javbus/western/genre/:gid', require('./routes/javbus/western/genre'));
-router.get('/javbus/western/star/:sid', require('./routes/javbus/western/star'));
-router.get('/javbus/western/series/:seriesid', require('./routes/javbus/western/series'));
-
-// 中山大学
-router.get('/sysu/sdcs', require('./routes/universities/sysu/sdcs'));
-
-// 動畫瘋
-router.get('/anigamer/new_anime', require('./routes/anigamer/new_anime'));
-router.get('/anigamer/anime/:sn', require('./routes/anigamer/anime'));
-
-// Apkpure
-router.get('/apkpure/versions/:region/:pkg', require('./routes/apkpure/versions'));
-
-// 豆瓣美女
-router.get('/dbmv/:category?', require('./routes/dbmv/index'));
-
-// 中国药科大学
-router.get('/cpu/home', require('./routes/universities/cpu/home'));
-router.get('/cpu/jwc', require('./routes/universities/cpu/jwc'));
-router.get('/cpu/yjsy', require('./routes/universities/cpu/yjsy'));
-
-// 字幕组
-router.get('/zimuzu/resource/:id?', require('./routes/zimuzu/resource'));
-router.get('/zimuzu/top/:range/:type', require('./routes/zimuzu/top'));
-
-// 虎嗅
-router.get('/huxiu/tag/:id', require('./routes/huxiu/tag'));
-router.get('/huxiu/search/:keyword', require('./routes/huxiu/search'));
-router.get('/huxiu/author/:id', require('./routes/huxiu/author'));
-router.get('/huxiu/article', require('./routes/huxiu/article'));
-router.get('/huxiu/collection/:id', require('./routes/huxiu/collection'));
-
-// Steam
-router.get('/steam/search/:params', require('./routes/steam/search'));
-router.get('/steam/news/:appids', require('./routes/steam/news'));
-
-// Steamgifts
-router.get('/steamgifts/discussions/:category?', require('./routes/steam/steamgifts/discussions'));
-
-// 扇贝
-router.get('/shanbay/checkin/:id', require('./routes/shanbay/checkin'));
-router.get('/shanbay/footprints/:category?', require('./routes/shanbay/footprints'));
-
-// Facebook
-router.get('/facebook/page/:id', require('./routes/facebook/page'));
-
-// 币乎
-router.get('/bihu/activaties/:id', require('./routes/bihu/activaties'));
-
-// 停电通知
-router.get('/tingdiantz/nanjing', require('./routes/tingdiantz/nanjing'));
-
-// 36kr
-router.get('/36kr/search/article/:keyword', require('./routes/36kr/search/article'));
-router.get('/36kr/newsflashes', require('./routes/36kr/newsflashes'));
-router.get('/36kr/news/:caty', require('./routes/36kr/news'));
-router.get('/36kr/user/:uid', require('./routes/36kr/user'));
-router.get('/36kr/motif/:mid', require('./routes/36kr/motif'));
-
-// PMCAFF
-router.get('/pmcaff/list/:typeid', require('./routes/pmcaff/list'));
-router.get('/pmcaff/feed/:typeid', require('./routes/pmcaff/feed'));
-router.get('/pmcaff/user/:userid', require('./routes/pmcaff/user'));
-
-// icourse163
-router.get('/icourse163/newest', require('./routes/icourse163/newest'));
-
-// patchwork.kernel.org
-router.get('/patchwork.kernel.org/comments/:id', require('./routes/patchwork.kernel.org/comments'));
-
-// 京东众筹
-router.get('/jingdong/zhongchou/:type/:status/:sort', require('./routes/jingdong/zhongchou'));
-
-// 淘宝众筹
-router.get('/taobao/zhongchou/:type?', require('./routes/taobao/zhongchou'));
-
-// All Poetry
-router.get('/allpoetry/:order?', require('./routes/allpoetry/order'));
-
-// 华尔街见闻
-router.get('/wallstreetcn/news/global', require('./routes/wallstreetcn/news'));
-
-// 多抓鱼搜索
-router.get('/duozhuayu/search/:wd', require('./routes/duozhuayu/search'));
-
-// 创业邦
-router.get('/cyzone/author/:id', require('./routes/cyzone/author'));
-router.get('/cyzone/label/:name', require('./routes/cyzone/label'));
-
-// 政府
-router.get('/gov/zhengce/zuixin', require('./routes/gov/zhengce/zuixin'));
-router.get('/gov/zhengce/wenjian/:pcodeJiguan?', require('./routes/gov/zhengce/wenjian'));
-router.get('/gov/zhengce/govall/:advance?', require('./routes/gov/zhengce/govall'));
-router.get('/gov/province/:name/:category', require('./routes/gov/province'));
-router.get('/gov/city/:name/:category', require('./routes/gov/city'));
-router.get('/gov/statecouncil/briefing', require('./routes/gov/statecouncil/briefing'));
-router.get('/gov/news/:uid', require('./routes/gov/news'));
-router.get('/gov/shuju/:caty/:item', require('./routes/gov/shuju'));
-router.get('/gov/xinwen/tujie/:caty', require('./routes/gov/xinwen/tujie'));
-
-// 苏州
-router.get('/gov/suzhou/news/:uid', require('./routes/gov/suzhou/news'));
-router.get('/gov/suzhou/doc', require('./routes/gov/suzhou/doc'));
-
-// 江苏
-router.get('/gov/jiangsu/eea/:type?', require('./routes/gov/jiangsu/eea'));
-
-// 山西
-router.get('/gov/shanxi/rst/:category', require('./routes/gov/shanxi/rst'));
-
-// 湖南
-router.get('/gov/hunan/notice/:type', require('./routes/gov/hunan/notice'));
-
-// 中华人民共和国-海关总署
-router.get('/gov/customs/list/:gchannel', require('./routes/gov/customs/list'));
-
-// 中华人民共和国生态环境部
-router.get('/gov/mee/gs', require('./routes/gov/mee/gs'));
-
-// 中华人民共和国教育部
-router.get('/gov/moe/:type', require('./routes/gov/moe/moe'));
-
-// 中华人民共和国外交部
-router.get('/gov/fmprc/fyrbt', require('./routes/gov/fmprc/fyrbt'));
-
-// 中华人民共和国住房和城乡建设部
-router.get('/gov/mohurd/policy', require('./routes/gov/mohurd/policy'));
-
-// 国家新闻出版广电总局
-router.get('/gov/sapprft/approval/:channel/:detail?', require('./routes/gov/sapprft/7026'));
-
-// 国家新闻出版署
-router.get('/gov/nppa/:channel', require('./routes/gov/nppa/channels'));
-router.get('/gov/nppa/:channel/:content', require('./routes/gov/nppa/contents'));
-
-// 北京卫生健康委员会
-router.get('/gov/beijing/mhc/:caty', require('./routes/gov/beijing/mhc'));
-
-// 北京考试院
-router.get('/gov/beijing/bjeea/:type', require('./routes/gov/beijing/eea'));
-
-// 广东省教育厅
-router.get('/gov/guangdong/edu/:caty', require('./routes/gov/guangdong/edu'));
-
-// 日本国外務省記者会見
-router.get('/go.jp/mofa', require('./routes/go.jp/mofa/main'));
-
-// 小黑盒
-router.get('/xiaoheihe/user/:id', require('./routes/xiaoheihe/user'));
-router.get('/xiaoheihe/news', require('./routes/xiaoheihe/news'));
-router.get('/xiaoheihe/discount/:platform?', require('./routes/xiaoheihe/discount'));
-
-// 惠誉评级
-router.get('/fitchratings/site/:type', require('./routes/fitchratings/site'));
-
-// 移动支付
-router.get('/mpaypass/news', require('./routes/mpaypass/news'));
-router.get('/mpaypass/main/:type?', require('./routes/mpaypass/main'));
-
-// 新浪科技探索
-router.get('/sina/discovery/:type', require('./routes/sina/discovery'));
-
-// 新浪科技滚动新闻
-router.get('/sina/rollnews', require('./routes/sina/rollnews'));
-
-// 新浪专栏创事记
-router.get('/sina/csj', require('./routes/sina/chuangshiji'));
-
-// 新浪财经-国內
-router.get('/sina/finance', require('./routes/sina/finance'));
-
-// Animen
-router.get('/animen/news/:type', require('./routes/animen/news'));
-
-// D2 资源库
-router.get('/d2/daily', require('./routes/d2/daily'));
-
-// ebb
-router.get('/ebb', require('./routes/ebb'));
-
-// Indienova
-router.get('/indienova/:type', require('./routes/indienova/article'));
-
-// JPMorgan Chase Institute
-router.get('/jpmorganchase', require('./routes/jpmorganchase/research'));
-
-// 美拍
-router.get('/meipai/user/:uid', require('./routes/meipai/user'));
-
-// 多知网
-router.get('/duozhi', require('./routes/duozhi'));
-
-// Docker Hub
-router.get('/dockerhub/build/:owner/:image/:tag?', require('./routes/dockerhub/build'));
-
-// 人人都是产品经理
-router.get('/woshipm/popular', require('./routes/woshipm/popular'));
-router.get('/woshipm/wen', require('./routes/woshipm/wen'));
-router.get('/woshipm/bookmarks/:id', require('./routes/woshipm/bookmarks'));
-router.get('/woshipm/user_article/:id', require('./routes/woshipm/user_article'));
-router.get('/woshipm/latest', require('./routes/woshipm/latest'));
-
-// 高清电台
-router.get('/gaoqing/latest', require('./routes/gaoqing/latest'));
-
-// 轻小说文库
-router.get('/wenku8/chapter/:id', require('./routes/wenku8/chapter'));
-
-// 鲸跃汽车
-router.get('/whalegogo/home', require('./routes/whalegogo/home'));
-router.get('/whalegogo/portal/:type_id/:tagid?', require('./routes/whalegogo/portal'));
-
-// 爱思想
-router.get('/aisixiang/column/:id', require('./routes/aisixiang/column'));
-router.get('/aisixiang/ranking/:type?/:range?', require('./routes/aisixiang/ranking'));
-router.get('/aisixiang/thinktank/:name/:type?', require('./routes/aisixiang/thinktank'));
-
-// Hacker News
-router.get('/hackernews/:section/:type?', require('./routes/hackernews/story'));
-
-// LeetCode
-router.get('/leetcode/articles', require('./routes/leetcode/articles'));
-router.get('/leetcode/submission/us/:user', require('./routes/leetcode/check-us'));
-router.get('/leetcode/submission/cn/:user', require('./routes/leetcode/check-cn'));
-
-// segmentfault
-router.get('/segmentfault/channel/:name', require('./routes/segmentfault/channel'));
-router.get('/segmentfault/user/:name', require('./routes/segmentfault/user'));
-
-// 虎扑
-router.get('/hupu/bxj/:id/:order?', require('./routes/hupu/bbs'));
-router.get('/hupu/bbs/:id/:order?', require('./routes/hupu/bbs'));
-router.get('/hupu/all/:caty', require('./routes/hupu/all'));
-router.get('/hupu/dept/:dept', require('./routes/hupu/dept'));
-
-// 牛客网
-router.get('/nowcoder/discuss/:type/:order', require('./routes/nowcoder/discuss'));
-router.get('/nowcoder/schedule/:propertyId?/:typeId?', require('./routes/nowcoder/schedule'));
-router.get('/nowcoder/recommend', require('./routes/nowcoder/recommend'));
-router.get('/nowcoder/jobcenter/:recruitType?/:city?/:type?/:order?/:latest?', require('./routes/nowcoder/jobcenter'));
-
-// Xiaomi.eu
-router.get('/xiaomieu/releases', require('./routes/xiaomieu/releases'));
-
-// sketch.com
-router.get('/sketch/beta', require('./routes/sketch/beta'));
-router.get('/sketch/updates', require('./routes/sketch/updates'));
-
-// 每日安全
-router.get('/security/pulses', require('./routes/security/pulses'));
-
-// DoNews
-router.get('/donews/:column?', require('./routes/donews/index'));
-
-// WeGene
-router.get('/wegene/column/:type/:category', require('./routes/wegene/column'));
-router.get('/wegene/newest', require('./routes/wegene/newest'));
-
-// instapaper
-router.get('/instapaper/person/:name', require('./routes/instapaper/person'));
-
-// UI 中国
-router.get('/ui-cn/article', require('./routes/ui-cn/article'));
-router.get('/ui-cn/user/:id', require('./routes/ui-cn/user'));
-
-// Dcard
-router.get('/dcard/:section/:type?', require('./routes/dcard/section'));
-
-// 12306
-router.get('/12306/zxdt/:id?', require('./routes/12306/zxdt'));
-
-// 北京天文馆每日一图
-router.get('/bjp/apod', require('./routes/bjp/apod'));
-
-// 洛谷
-router.get('/luogu/daily/:id?', require('./routes/luogu/daily'));
-router.get('/luogu/contest', require('./routes/luogu/contest'));
-router.get('/luogu/user/feed/:uid', require('./routes/luogu/userFeed'));
-
-// 决胜网
-router.get('/juesheng', require('./routes/juesheng'));
-
-// 播客IBCラジオ イヤーマイッタマイッタ
-router.get('/maitta', require('./routes/maitta'));
-
-// 一些博客
-// 敬维-以认真的态度做完美的事情: https://jingwei.link/
-router.get('/blogs/jingwei.link', require('./routes/blogs/jingwei_link'));
-
-// 王垠的博客-当然我在扯淡
-router.get('/blogs/wangyin', require('./routes/blogs/wangyin'));
-
-// 王五四文集
-router.get('/blogs/wang54/:id?', require('./routes/blogs/wang54'));
-
-// WordPress
-router.get('/blogs/wordpress/:domain/:https?', require('./routes/blogs/wordpress'));
-
-// 裏垢女子まとめ
-router.get('/uraaka-joshi', require('./routes/uraaka-joshi/uraaka-joshi'));
-router.get('/uraaka-joshi/:id', require('./routes/uraaka-joshi/uraaka-joshi-user'));
-
-// 西祠胡同
-router.get('/xici/:id?', require('./routes/xici'));
-
-// 淘股吧论坛
-router.get('/taoguba/index', require('./routes/taoguba/index'));
-router.get('/taoguba/user/:uid', require('./routes/taoguba/user'));
-
-// 今日热榜
-router.get('/tophub/:id', require('./routes/tophub'));
-
-// 游戏时光
-router.get('/vgtime/news', require('./routes/vgtime/news.js'));
-router.get('/vgtime/release', require('./routes/vgtime/release'));
-router.get('/vgtime/keyword/:keyword', require('./routes/vgtime/keyword'));
-
-// MP4吧
-router.get('/mp4ba/:param', require('./routes/mp4ba'));
-
-// anitama
-router.get('/anitama/:channel?', require('./routes/anitama/channel'));
-
-// 親子王國
-router.get('/babykingdom/:id/:order?', require('./routes/babykingdom'));
-
-// 四川大学
-router.get('/scu/jwc/notice', require('./routes/universities/scu/jwc'));
-router.get('/scu/xg/notice', require('./routes/universities/scu/xg'));
-
-// 浙江工商大学
-router.get('/zjgsu/tzgg', require('./routes/universities/zjgsu/tzgg/scripts'));
-router.get('/zjgsu/gsgg', require('./routes/universities/zjgsu/gsgg/scripts'));
-router.get('/zjgsu/xszq', require('./routes/universities/zjgsu/xszq/scripts'));
-
-// 大众点评
-router.get('/dianping/user/:id?', require('./routes/dianping/user'));
-
-// 半月谈
-router.get('/banyuetan/:name', require('./routes/banyuetan'));
-
-// 人民日报
-router.get('/people/opinion/:id', require('./routes/people/opinion'));
-router.get('/people/env/:id', require('./routes/people/env'));
-router.get('/people/xjpjh/:keyword?/:year?', require('./routes/people/xjpjh'));
-
-// 北极星电力网
-router.get('/bjx/huanbao', require('./routes/bjx/huanbao'));
-
-// gamersky
-router.get('/gamersky/news', require('./routes/gamersky/news'));
-router.get('/gamersky/ent/:category', require('./routes/gamersky/ent'));
-
-// 游研社
-router.get('/yystv/category/:category', require('./routes/yystv/category'));
-
-// psnine
-router.get('/psnine/index', require('./routes/psnine/index'));
-router.get('/psnine/shuzhe', require('./routes/psnine/shuzhe'));
-router.get('/psnine/trade', require('./routes/psnine/trade'));
-router.get('/psnine/game', require('./routes/psnine/game'));
-router.get('/psnine/news', require('./routes/psnine/news'));
-
-// 浙江大学
-router.get('/zju/list/:type', require('./routes/universities/zju/list'));
-router.get('/zju/physics/:type', require('./routes/universities/zju/physics'));
-router.get('/zju/grs/:type', require('./routes/universities/zju/grs'));
-router.get('/zju/career/:type', require('./routes/universities/zju/career'));
-router.get('/zju/cst/:type', require('./routes/universities/zju/cst'));
-router.get('/zju/cst/custom/:id', require('./routes/universities/zju/cst/custom'));
-
-// 浙江大学城市学院
-router.get('/zucc/news/latest', require('./routes/universities/zucc/news'));
-router.get('/zucc/cssearch/latest/:webVpn/:key', require('./routes/universities/zucc/cssearch'));
-
-// 华中师范大学
-router.get('/ccnu/career', require('./routes/universities/ccnu/career'));
-
-// Infoq
-router.get('/infoq/recommend', require('./routes/infoq/recommend'));
-router.get('/infoq/topic/:id', require('./routes/infoq/topic'));
-
-// checkee
-router.get('/checkee/:dispdate', require('./routes/checkee/index'));
-
-// 艾瑞
-router.get('/iresearch/report', require('./routes/iresearch/report'));
-
-// ZAKER
-router.get('/zaker/:type/:id', require('./routes/zaker/source'));
-router.get('/zaker/focusread', require('./routes/zaker/focusread'));
-
-// Matters
-router.get('/matters/topics', require('./routes/matters/topics'));
-router.get('/matters/latest', require('./routes/matters/latest'));
-router.get('/matters/hot', require('./routes/matters/hot'));
-router.get('/matters/tags/:tid', require('./routes/matters/tags'));
-router.get('/matters/author/:uid', require('./routes/matters/author'));
-
-// MobData
-router.get('/mobdata/report', require('./routes/mobdata/report'));
-
-// 谷雨
-router.get('/tencent/guyu/channel/:name', require('./routes/tencent/guyu/channel'));
-
-// 古诗文网
-router.get('/gushiwen/recommend/:annotation?', require('./routes/gushiwen/recommend'));
-
-// 电商在线
-router.get('/imaijia/category/:category', require('./routes/imaijia/category'));
-
-// 21财经
-router.get('/21caijing/channel/:name', require('./routes/21caijing/channel'));
-
-// 北京邮电大学
-router.get('/bupt/yz/:type', require('./routes/universities/bupt/yz'));
-router.get('/bupt/grs', require('./routes/universities/bupt/grs'));
-router.get('/bupt/portal', require('./routes/universities/bupt/portal'));
-router.get('/bupt/news', require('./routes/universities/bupt/news'));
-router.get('/bupt/funbox', require('./routes/universities/bupt/funbox'));
-
-// VOCUS 方格子
-router.get('/vocus/publication/:id', require('./routes/vocus/publication'));
-router.get('/vocus/user/:id', require('./routes/vocus/user'));
-
-// 一亩三分地 1point3acres
-router.get('/1point3acres/user/:id/threads', require('./routes/1point3acres/threads'));
-router.get('/1point3acres/user/:id/posts', require('./routes/1point3acres/posts'));
-router.get('/1point3acres/offer/:year?/:major?/:school?', require('./routes/1point3acres/offer'));
-router.get('/1point3acres/post/:category', require('./routes/1point3acres/post'));
-
-// 广东海洋大学
-router.get('/gdoujwc', require('./routes/universities/gdou/jwc/jwtz'));
-
-// 中国高清网
-router.get('/gaoqingla/:tag?', require('./routes/gaoqingla/latest'));
-
-// 马良行
-router.get('/mlhang', require('./routes/mlhang/latest'));
-
-// PlayStation Store
-router.get('/ps/list/:gridName', require('./routes/ps/list'));
-router.get('/ps/trophy/:id', require('./routes/ps/trophy'));
-router.get('/ps/ps4updates', require('./routes/ps/ps4updates'));
-router.get('/ps/:lang?/product/:gridName', require('./routes/ps/product'));
-
-// Quanta Magazine
-router.get('/quantamagazine/archive', require('./routes/quantamagazine/archive'));
-
-// Nintendo
-router.get('/nintendo/eshop/jp', require('./routes/nintendo/eshop_jp'));
-router.get('/nintendo/eshop/hk', require('./routes/nintendo/eshop_hk'));
-router.get('/nintendo/eshop/us', require('./routes/nintendo/eshop_us'));
-router.get('/nintendo/eshop/cn', require('./routes/nintendo/eshop_cn'));
-router.get('/nintendo/news', require('./routes/nintendo/news'));
-router.get('/nintendo/news/china', require('./routes/nintendo/news_china'));
-router.get('/nintendo/direct', require('./routes/nintendo/direct'));
-router.get('/nintendo/system-update', require('./routes/nintendo/system-update'));
-
-// 世界卫生组织
-router.get('/who/news-room/:type', require('./routes/who/news-room'));
-
-// 福利资源-met.red
-router.get('/metred/fuli', require('./routes/metred/fuli'));
-
-// MIT
-router.get('/mit/graduateadmissions/:type/:name', require('./routes/universities/mit/graduateadmissions'));
-
-// 毕马威
-router.get('/kpmg/insights', require('./routes/kpmg/insights'));
-
-// Saraba1st
-router.get('/saraba1st/thread/:tid', require('./routes/saraba1st/thread'));
-
-// gradcafe
-router.get('/gradcafe/result/:type', require('./routes/gradcafe/result'));
-router.get('/gradcafe/result', require('./routes/gradcafe/result'));
-
-// The Economist
-router.get('/the-economist/gre-vocabulary', require('./routes/the-economist/gre-vocabulary'));
-router.get('/the-economist/:endpoint', require('./routes/the-economist/full'));
-
-// 鼠绘漫画
-router.get('/shuhui/comics/:id', require('./routes/shuhui/comics'));
-
-// 朝日新聞中文网(简体中文版)
-router.get('/asahichinese-j/:category/:subCate', require('./routes/asahichinese-j/index'));
-router.get('/asahichinese-j/:category', require('./routes/asahichinese-j/index'));
-
-// 朝日新聞中文網(繁體中文版)
-router.get('/asahichinese-f/:category/:subCate', require('./routes/asahichinese-f/index'));
-router.get('/asahichinese-f/:category', require('./routes/asahichinese-f/index'));
-
-// 7x24小时快讯
-router.get('/fx678/kx', require('./routes/fx678/kx'));
-
-// SoundCloud
-router.get('/soundcloud/tracks/:user', require('./routes/soundcloud/tracks'));
-
-// dilidili
-router.get('/dilidili/fanju/:id', require('./routes/dilidili/fanju'));
-
-// 且听风吟福利
-router.get('/qtfyfl/:category', require('./routes/qtfyfl/category'));
-
-// 派代
-router.get('/paidai', require('./routes/paidai/index'));
-router.get('/paidai/bbs', require('./routes/paidai/bbs'));
-router.get('/paidai/news', require('./routes/paidai/news'));
-
-// 中国银行
-router.get('/boc/whpj/:format?', require('./routes/boc/whpj'));
-
-// 漫画db
-router.get('/manhuadb/comics/:id', require('./routes/manhuadb/comics'));
-
-// 装备前线
-router.get('/zfrontier/postlist/:type', require('./routes/zfrontier/postlist'));
-router.get('/zfrontier/board/:boardId', require('./routes/zfrontier/board_postlist'));
-
-// 观察者风闻话题
-router.get('/guanchazhe/topic/:id', require('./routes/guanchazhe/topic'));
-router.get('/guanchazhe/personalpage/:uid', require('./routes/guanchazhe/personalpage'));
-router.get('/guanchazhe/index/:type', require('./routes/guanchazhe/index'));
-
-// Hpoi 手办维基
-router.get('/hpoi/info/:type?', require('./routes/hpoi/info'));
-router.get('/hpoi/:category/:words', require('./routes/hpoi'));
-router.get('/hpoi/user/:user_id/:caty', require('./routes/hpoi/user'));
-
-// 通用CurseForge
-router.get('/curseforge/:gameid/:catagoryid/:projectid/files', require('./routes/curseforge/generalfiles'));
-
-// 西南财经大学
-router.get('/swufe/seie/:type?', require('./routes/universities/swufe/seie'));
-
-// Wired
-router.get('/wired/tag/:tag', require('./routes/wired/tag'));
-
-// 语雀文档
-router.get('/yuque/doc/:repo_id', require('./routes/yuque/doc'));
-
-// 飞地
-router.get('/enclavebooks/category/:id?', require('./routes/enclavebooks/category'));
-router.get('/enclavebooks/user/:uid', require('./routes/enclavebooks/user.js'));
-router.get('/enclavebooks/collection/:uid', require('./routes/enclavebooks/collection.js'));
-
-// 色花堂
-router.get('/dsndsht23/picture/:subforumid', require('./routes/dsndsht23/index'));
-router.get('/dsndsht23/bt/:subforumid?', require('./routes/dsndsht23/index'));
-router.get('/dsndsht23/:subforumid?/:type?', require('./routes/dsndsht23/index'));
-router.get('/dsndsht23/:subforumid?', require('./routes/dsndsht23/index'));
-router.get('/dsndsht23', require('./routes/dsndsht23/index'));
-
-// 数英网最新文章
-router.get('/digitaling/index', require('./routes/digitaling/index'));
-
-// 数英网文章专题
-router.get('/digitaling/articles/:category/:subcate', require('./routes/digitaling/article'));
-
-// 数英网项目专题
-router.get('/digitaling/projects/:category', require('./routes/digitaling/project'));
-
-// Bing壁纸
-router.get('/bing', require('./routes/bing/index'));
-
-// Maxjia News - DotA 2
-router.get('/maxnews/dota2', require('./routes/maxnews/dota2'));
-
-// 柠檬 - 私房歌
-router.get('/ningmeng/song', require('./routes/ningmeng/song'));
-
-// 紫竹张
-router.get('/zzz', require('./routes/zzz/index'));
-
-// AEON
-router.get('/aeon/:cid', require('./routes/aeon/category'));
-
-// AlgoCasts
-router.get('/algocasts', require('./routes/algocasts/all'));
-
-// aqicn
-router.get('/aqicn/:city', require('./routes/aqicn/index'));
-
-// 猫眼电影
-router.get('/maoyan/hot', require('./routes/maoyan/hot'));
-router.get('/maoyan/upcoming', require('./routes/maoyan/upcoming'));
-
-// cnBeta
-router.get('/cnbeta', require('./routes/cnbeta/home'));
-
-// 国家退伍士兵信息
-router.get('/gov/veterans/:type', require('./routes/gov/veterans/china'));
-
-// 河北省退伍士兵信息
-router.get('/gov/veterans/hebei/:type', require('./routes/gov/veterans/hebei'));
-
-// Dilbert Comic Strip
-router.get('/dilbert/strip', require('./routes/dilbert/strip'));
-
-// 游戏打折情报
-router.get('/yxdzqb/:type', require('./routes/yxdzqb'));
-
-// 怪物猎人
-router.get('/monsterhunter/update', require('./routes/mhw/update'));
-router.get('/mhw/update', require('./routes/mhw/update'));
-router.get('/mhw/news', require('./routes/mhw/news'));
-
-// 005.tv
-router.get('/005tv/zx/latest', require('./routes/005tv/zx'));
-
-// Polimi News
-router.get('/polimi/news/:language?', require('./routes/polimi/news'));
-
-// dekudeals
-router.get('/dekudeals/:type', require('./routes/dekudeals'));
-
-// 直播吧
-router.get('/zhibo8/forum/:id', require('./routes/zhibo8/forum'));
-router.get('/zhibo8/post/:id', require('./routes/zhibo8/post'));
-router.get('/zhibo8/more/:caty', require('./routes/zhibo8/more'));
-
-// 东方网-上海
-router.get('/eastday/sh', require('./routes/eastday/sh'));
-
-// Metacritic
-router.get('/metacritic/release/:platform/:type/:sort?', require('./routes/metacritic/release'));
-
-// 快科技(原驱动之家)
-router.get('/kkj/news', require('./routes/kkj/news'));
-
-// Outage.Report
-router.get('/outagereport/:name/:count?', require('./routes/outagereport/service'));
-
-// sixthtone
-router.get('/sixthtone/news', require('./routes/sixthtone/news'));
-
-// AI研习社
-router.get('/aiyanxishe/:id/:sort?', require('./routes/aiyanxishe/home'));
-
-// 活动行
-router.get('/huodongxing/explore', require('./routes/hdx/explore'));
-
-// 飞客茶馆优惠信息
-router.get('/flyertea/preferential', require('./routes/flyertea/preferential'));
-router.get('/flyertea/creditcard/:bank', require('./routes/flyertea/creditcard'));
-
-// 中国广播
-router.get('/radio/:channelname/:name', require('./routes/radio/radio'));
-
-// TOPYS
-router.get('/topys/:category', require('./routes/topys/article'));
-
-// 巴比特作者专栏
-router.get('/8btc/:authorid', require('./routes/8btc/author'));
-router.get('/8btc/news/flash', require('./routes/8btc/news/flash'));
-
-// VueVlog
-router.get('/vuevideo/:userid', require('./routes/vuevideo/user'));
-
-// 证监会
-router.get('/csrc/news/:suffix?', require('./routes/csrc/news'));
-router.get('/csrc/fashenwei', require('./routes/csrc/fashenwei'));
-router.get('/csrc/auditstatus/:apply_id', require('./routes/csrc/auditstatus'));
-
-// LWN.net Alerts
-router.get('/lwn/alerts/:distributor', require('./routes/lwn/alerts'));
-
-// 唱吧
-router.get('/changba/:userid', require('./routes/changba/user'));
-
-// 英雄联盟
-router.get('/lol/newsindex/:type', require('./routes/lol/newsindex'));
-
-// 掌上英雄联盟
-router.get('/lolapp/recommend', require('./routes/lolapp/recommend'));
-
-// 左岸读书
-router.get('/zreading', require('./routes/zreading/home'));
-
-// NBA
-router.get('/nba/app_news', require('./routes/nba/app_news'));
-
-// 天津产权交易中心
-router.get('/tprtc/cqzr', require('./routes/tprtc/cqzr'));
-router.get('/tprtc/qyzc', require('./routes/tprtc/qyzc'));
-router.get('/tprtc/news', require('./routes/tprtc/news'));
-
-// ArchDaily
-router.get('/archdaily', require('./routes/archdaily/home'));
-
-// aptonic Dropzone actions
-router.get('/aptonic/action/:untested?', require('./routes/aptonic/action'));
-
-// 印记中文周刊
-router.get('/docschina/jsweekly', require('./routes/docschina/jsweekly'));
-
-// im2maker
-router.get('/im2maker/:channel?', require('./routes/im2maker/index'));
-
-// 巨潮资讯
-router.get('/cninfo/announcement/:code?/:category?', require('./routes/cninfo/announcement'));
-router.get('/cninfo/stock_announcement/:code', require('./routes/cninfo/stock_announcement'));
-router.get('/cninfo/fund_announcement/:code?/:searchkey?', require('./routes/cninfo/fund_announcement'));
-
-// 中央纪委国家监委网站
-router.get('/ccdi/scdc', require('./routes/ccdi/scdc'));
-
-// 中华人民共和国农业农村部
-router.get('/gov/moa/sjzxfb', require('./routes/gov/moa/sjzxfb'));
-router.get('/gov/moa/:suburl(.*)', require('./routes/gov/moa/moa'));
-
-// 香水时代
-router.get('/nosetime/:id/:type/:sort?', require('./routes/nosetime/comment'));
-router.get('/nosetime/home', require('./routes/nosetime/home'));
-
-// 涂鸦王国
-router.get('/gracg/:user/:love?', require('./routes/gracg/user'));
-
-// 大侠阿木
-router.get('/daxiaamu/home', require('./routes/daxiaamu/home'));
-
-// 美团技术团队
-router.get('/meituan/tech/home', require('./routes//meituan/tech/home'));
-
-// 码农网
-router.get('/codeceo/home', require('./routes/codeceo/home'));
-router.get('/codeceo/:type/:category?', require('./routes/codeceo/category'));
-
-// BOF
-router.get('/bof/home', require('./routes/bof/home'));
-
-// 爱发电
-router.get('/afdian/explore/:type?/:category?', require('./routes/afdian/explore'));
-router.get('/afdian/dynamic/:uid', require('./routes/afdian/dynamic'));
-
-// Simons Foundation
-router.get('/simonsfoundation/articles', require('./routes/simonsfoundation/articles'));
-router.get('/simonsfoundation/recommend', require('./routes/simonsfoundation/recommend'));
-
-// 王者荣耀
-router.get('/pvp/newsindex/:type', require('./routes/pvp/newsindex'));
-
-// 《明日方舟》游戏
-router.get('/arknights/news', require('./routes/arknights/news'));
-
-// ff14
-router.get('/ff14/ff14_zh/:type', require('./routes/ff14/ff14_zh'));
-
-// 学堂在线
-router.get('/xuetangx/course/:cid/:type', require('./routes/xuetangx/course_info'));
-router.get('/xuetangx/course/list/:mode/:credential/:status/:type?', require('./routes/xuetangx/course_list'));
-
-// wikihow
-router.get('/wikihow/index', require('./routes/wikihow/index.js'));
-router.get('/wikihow/category/:category/:type', require('./routes/wikihow/category.js'));
-
-// 正版中国
-router.get('/getitfree/category/:category?', require('./routes/getitfree/category.js'));
-router.get('/getitfree/search/:keyword?', require('./routes/getitfree/search.js'));
-
-// 万联网
-router.get('/10000link/news/:category?', require('./routes/10000link/news'));
-
-// 站酷
-router.get('/zcool/recommend/:type', require('./routes/zcool/recommend'));
-router.get('/zcool/top/:type', require('./routes/zcool/top'));
-router.get('/zcool/top', require('./routes/zcool/top')); // 兼容老版本
-router.get('/zcool/user/:uid', require('./routes/zcool/user'));
-
-// 第一财经
-router.get('/yicai/brief', require('./routes/yicai/brief.js'));
-
-// 一兜糖
-router.get('/yidoutang/index', require('./routes/yidoutang/index.js'));
-router.get('/yidoutang/guide', require('./routes/yidoutang/guide.js'));
-router.get('/yidoutang/mtest', require('./routes/yidoutang/mtest.js'));
-router.get('/yidoutang/case/:type', require('./routes/yidoutang/case.js'));
-
-// 开眼
-router.get('/kaiyan/index', require('./routes/kaiyan/index'));
-
-// 龙空
-router.get('/lkong/forum/:id/:digest?', require('./routes/lkong/forum'));
-router.get('/lkong/thread/:id', require('./routes/lkong/thread'));
-// router.get('/lkong/user/:id', require('./routes/lkong/user'));
-
-// 坂道系列资讯
-// 坂道系列官网新闻
-router.get('/nogizaka46/news', require('./routes/nogizaka46/news'));
-router.get('/keyakizaka46/news', require('./routes/keyakizaka46/news'));
-router.get('/hinatazaka46/news', require('./routes/hinatazaka46/news'));
-router.get('/keyakizaka46/blog', require('./routes/keyakizaka46/blog'));
-router.get('/hinatazaka46/blog', require('./routes/hinatazaka46/blog'));
-
-// 酷安
-router.get('/coolapk/tuwen', require('./routes/coolapk/tuwen'));
-router.get('/coolapk/tuwen-xinxian', require('./routes/coolapk/tuwen'));
-router.get('/coolapk/huati/:tag', require('./routes/coolapk/huati'));
-router.get('/coolapk/user/:uid/dynamic', require('./routes/coolapk/userDynamic'));
-router.get('/coolapk/dyh/:dyhId', require('./routes/coolapk/dyh'));
-
-// 模型网
-router.get('/moxingnet', require('./routes/moxingnet'));
-
-// 湖北大学
-router.get('/hubu/news/:type', require('./routes/universities/hubu/news'));
-
-// 大连海事大学
-router.get('/dlmu/news/:type', require('./routes/universities/dlmu/news'));
-router.get('/dlmu/grs/zsgz/:type', require('./routes/universities/dlmu/grs/zsgz'));
-
-// Rockstar Games Social Club
-router.get('/socialclub/events/:game?', require('./routes/socialclub/events'));
-
-// CTFHub Event Calendar
-router.get('/ctfhub/calendar/:limit?/:form?/:class?/:title?', require('./routes/ctfhub'));
-
-// 阿里云
-router.get('/aliyun/database_month', require('./routes/aliyun/database_month'));
-router.get('/aliyun/notice/:type?', require('./routes/aliyun/notice'));
-router.get('/aliyun/developer/group/:type', require('./routes/aliyun/developer/group'));
-
-// 礼物说
-router.get('/liwushuo/index', require('./routes/liwushuo/index.js'));
-
-// 故事fm
-router.get('/storyfm/index', require('./routes/storyfm/index.js'));
-
-// 中国日报
-router.get('/chinadaily/english/:category', require('./routes/chinadaily/english.js'));
-
-// leboncoin
-router.get('/leboncoin/ad/:query', require('./routes/leboncoin/ad.js'));
-
-// DHL
-router.get('/dhl/:id', require('./routes/dhl/shipment-tracking'));
-
-// Japanpost
-router.get('/japanpost/:reqCode/:locale?', require('./routes/japanpost/index'));
-
-// 中华人民共和国商务部
-router.get('/mofcom/article/:suffix', require('./routes/mofcom/article'));
-
-// 字幕库
-router.get('/zimuku/:type?', require('./routes/zimuku/index'));
-
-// 品玩
-router.get('/pingwest/status', require('./routes/pingwest/status'));
-router.get('/pingwest/tag/:tag/:type', require('./routes/pingwest/tag'));
-router.get('/pingwest/user/:uid/:type?', require('./routes/pingwest/user'));
-
-// Hanime
-router.get('/hanime/video', require('./routes/hanime/video'));
-
-// 篝火营地
-router.get('/gouhuo/news/:category', require('./routes/gouhuo'));
-router.get('/gouhuo/strategy', require('./routes/gouhuo/strategy'));
-
-// Soul
-router.get('/soul/:id', require('./routes/soul'));
-router.get('/soul/posts/hot', require('./routes/soul/hot'));
-
-// 单向空间
-router.get('/owspace/read/:type?', require('./routes/owspace/read'));
-
-// 天涯论坛
-router.get('/tianya/index/:type', require('./routes/tianya/index'));
-router.get('/tianya/user/:userid', require('./routes/tianya/user'));
-router.get('/tianya/comments/:userid', require('./routes/tianya/comments'));
-
-// eleme
-router.get('/eleme/open/announce', require('./routes/eleme/open/announce'));
-router.get('/eleme/open-be/announce', require('./routes/eleme/open-be/announce'));
-
-// 微信开放社区
-router.get('/wechat-open/community/:type', require('./routes/tencent/wechat/wechat-open/community/announce'));
-// 微信支付 - 商户平台公告
-router.get('/wechat-open/pay/announce', require('./routes/tencent/wechat/wechat-open/pay/announce'));
-router.get('/wechat-open/community/:type/:category', require('./routes/tencent/wechat/wechat-open/community/question'));
-
-// 微店
-router.get('/weidian/goods/:id', require('./routes/weidian/goods'));
-
-// 有赞
-router.get('/youzan/goods/:id', require('./routes/youzan/goods'));
-// 币世界快讯
-router.get('/bishijie/kuaixun', require('./routes/bishijie/kuaixun'));
-
-// 顺丰丰桥
-router.get('/sf/sffq-announce', require('./routes/sf/sffq-announce'));
-
-// 缺书网
-router.get('/queshu/sale', require('./routes/queshu/sale'));
-router.get('/queshu/book/:bookid', require('./routes/queshu/book'));
-
-// MITRE
-router.get('/mitre/publications', require('./routes/mitre/publications'));
-
-// SANS
-router.get('/sans/summit_archive', require('./routes/sans/summit_archive'));
-
-// LaTeX 开源小屋
-router.get('/latexstudio/home', require('./routes/latexstudio/home'));
-
-// 上证债券信息网 - 可转换公司债券公告
-router.get('/sse/convert/:query?', require('./routes/sse/convert'));
-router.get('/sse/renewal', require('./routes/sse/renewal'));
-router.get('/sse/inquire', require('./routes/sse/inquire'));
-
-// 上海证券交易所
-router.get('/sse/disclosure/:query?', require('./routes/sse/disclosure'));
-
-// 深圳证券交易所
-router.get('/szse/notice', require('./routes/szse/notice'));
-router.get('/szse/inquire/:type', require('./routes/szse/inquire'));
-router.get('/szse/rule', require('./routes/szse/rule'));
-
-// 前端艺术家每日整理&&飞冰早报
-router.get('/jskou/:type?', require('./routes/jskou/index'));
-
-// 国家应急广播
-router.get('/cneb/yjxx', require('./routes/cneb/yjxx'));
-router.get('/cneb/guoneinews', require('./routes/cneb/guoneinews'));
-
-// 邮箱
-router.get('/mail/imap/:email', require('./routes/mail/imap'));
-
-// 好队友
-router.get('/network360/jobs', require('./routes/network360/jobs'));
-
-// 智联招聘
-router.get('/zhilian/:city/:keyword', require('./routes/zhilian/index'));
-
-// 电鸭社区
-router.get('/eleduck/jobs', require('./routes/eleduck/jobs'));
-
-// 北华航天工业学院 - 新闻
-router.get('/nciae/news', require('./routes/universities/nciae/news'));
-
-// 北华航天工业学院 - 通知公告
-router.get('/nciae/tzgg', require('./routes/universities/nciae/tzgg'));
-
-// 北华航天工业学院 - 学术信息
-router.get('/nciae/xsxx', require('./routes/universities/nciae/xsxx'));
-
-// cfan
-router.get('/cfan/news', require('./routes/cfan/news'));
-
-// 搜狐 - 搜狐号
-router.get('/sohu/mp/:id', require('./routes/sohu/mp'));
-
-// 腾讯企鹅号
-router.get('/tencent/news/author/:mid', require('./routes/tencent/news/author'));
-
-// 腾讯柠檬精选
-router.get('/tencent/lemon', require('./routes/tencent/lemon/index'));
-
-// 奈菲影视
-router.get('/nfmovies/:id?', require('./routes/nfmovies/index'));
-
-// 书友社区
-router.get('/andyt/:view?', require('./routes/andyt/index'));
-
-// 品途商业评论
-router.get('/pintu360/:type?', require('./routes/pintu360/index'));
-
-// engadget中国版
-router.get('/engadget-cn', require('./routes/engadget/home'));
-
-// engadget
-router.get('/engadget/:lang?', require('./routes/engadget/home'));
-
-// 吹牛部落
-router.get('/chuiniu/column/:id', require('./routes/chuiniu/column'));
-router.get('/chuiniu/column_list', require('./routes/chuiniu/column_list'));
-
-// leemeng
-router.get('/leemeng', require('./routes/blogs/leemeng'));
-
-// 中国地质大学
-router.get('/cug/graduate', require('./routes/cug/graduate'));
-router.get('/cug/undergraduate', require('./routes/cug/undergraduate'));
-router.get('/cug/xgxy', require('./routes/cug/xgxy'));
-
-// 网易 - 网易号
-router.get('/netease/dy/:id', require('./routes/netease/dy'));
-
-// 海猫吧
-router.get('/haimaoba/:id?', require('./routes/haimaoba/comics'));
-
-// 路透社
-router.get('/reuters/channel/:site/:channel', require('./routes/reuters/channel'));
-
-// 蒲公英
-router.get('/pgyer/:app?', require('./routes/pgyer/app'));
-
-// 微博个人时间线
-router.get('/weibo/timeline/:uid/:feature?', require('./routes/weibo/timeline'));
-
-// TAPTAP
-router.get('/taptap/topic/:id/:label?', require('./routes/taptap/topic'));
-router.get('/taptap/changelog/:id', require('./routes/taptap/changelog'));
-router.get('/taptap/review/:id/:order?', require('./routes/taptap/review'));
-
-// lofter
-router.get('/lofter/tag/:name/:type?', require('./routes/lofter/tag'));
-router.get('/lofter/user/:username', require('./routes/lofter/posts'));
-
-// 米坛社区表盘
-router.get('/watchface/:watch_type?/:list_type?', require('./routes/watchface/update'));
-
-// CNU视觉联盟
-router.get('/cnu/selected', require('./routes/cnu/selected'));
-router.get('/cnu/discovery/:type?/:category?', require('./routes/cnu/discovery'));
-
-// 战旗直播
-router.get('/zhanqi/room/:id', require('./routes/zhanqi/room'));
-
-// 酒云网
-router.get('/wineyun/:category', require('./routes/wineyun'));
-
-// 小红书
-router.get('/xiaohongshu/user/:user_id/:category', require('./routes/xiaohongshu/user'));
-router.get('/xiaohongshu/board/:board_id', require('./routes/xiaohongshu/board'));
-
-// 重磅原创-每经网
-router.get('/nbd/daily', require('./routes/nbd/article'));
-
-// 快知
-router.get('/kzfeed/topic/:id', require('./routes/kzfeed/topic'));
-
-// 腾讯新闻较真查证平台
-router.get('/factcheck', require('./routes/tencent/factcheck'));
-
-// X-MOL化学资讯平台
-router.get('/x-mol/news/:tag?', require('./routes/x-mol/news.js'));
-router.get('/x-mol/paper/:type/:magazine', require('./routes/x-mol/paper'));
-
-// 知识分子
-router.get('/zhishifenzi/news/:type?', require('./routes/zhishifenzi/news'));
-router.get('/zhishifenzi/depth', require('./routes/zhishifenzi/depth'));
-router.get('/zhishifenzi/innovation/:type?', require('./routes/zhishifenzi/innovation'));
-
-// 電撃Online
-router.get('/dengekionline/:type?', require('./routes/dengekionline/new'));
-
-// 4Gamers
-router.get('/4gamers/category/:category', require('./routes/4gamers/category'));
-router.get('/4gamers/tag/:tag', require('./routes/4gamers/tag'));
-router.get('/4gamers/topic/:topic', require('./routes/4gamers/topic'));
-
-// 大麦网
-router.get('/damai/activity/:city/:category/:subcategory/:keyword?', require('./routes/damai/activity'));
-
-// 桂林电子科技大学新闻资讯
-router.get('/guet/xwzx/:type?', require('./routes/guet/news'));
-
-// はてな匿名ダイアリー
-router.get('/hatena/anonymous_diary/archive', require('./routes/hatena/anonymous_diary/archive'));
-
-// kaggle
-router.get('/kaggle/discussion/:forumId/:sort?', require('./routes/kaggle/discussion'));
-router.get('/kaggle/competitions/:category?', require('./routes/kaggle/competitions'));
-router.get('/kaggle/user/:user', require('./routes/kaggle/user'));
-
-// PubMed Trending
-router.get('/pubmed/trending', require('./routes/pubmed/trending'));
-
-// 领科 (linkresearcher.com)
-router.get('/linkresearcher/:params', require('./routes/linkresearcher/index'));
-
-// eLife [Sci Journal]
-router.get('/elife/:tid', require('./routes/elife/index'));
-
-// IEEE Xplore [Sci Journal]
-router.get('/ieee/author/:aid/:sortType/:count?', require('./routes/ieee/author'));
-
-// PNAS [Sci Journal]
-router.get('/pnas/:topic?', require('./routes/pnas/index'));
-
-// cell [Sci Journal]
-router.get('/cell/cell/:category', require('./routes/cell/cell/index'));
-router.get('/cell/cover', require('./routes/cell/cover'));
-
-// nature + nature 子刊 [Sci Journal]
-router.get('/nature/research/:journal?', require('./routes/nature/research'));
-router.get('/nature/news-and-comment/:journal?', require('./routes/nature/news-and-comment'));
-router.get('/nature/cover', require('./routes/nature/cover'));
-router.get('/nature/news', require('./routes/nature/news'));
-router.get('/nature/highlight', require('./routes/nature/highlight'));
-
-// science [Sci Journal]
-router.get('/sciencemag/current/:journal?', require('./routes/sciencemag/current'));
-router.get('/sciencemag/cover', require('./routes/sciencemag/cover'));
-router.get('/sciencemag/early/science', require('./routes/sciencemag/early'));
-
-// dlsite
-router.get('/dlsite/new/:type', require('./routes/dlsite/new'));
-router.get('/dlsite/campaign/:type/:free?', require('./routes/dlsite/campaign'));
-
-// mcbbs
-router.get('/mcbbs/forum/:type', require('./routes/mcbbs/forum'));
-router.get('/mcbbs/post/:tid/:authorid?', require('./routes/mcbbs/post'));
-
-// Pocket
-router.get('/pocket/trending', require('./routes/pocket/trending'));
-
-// HK01
-router.get('/hk01/zone/:id', require('./routes/hk01/zone'));
-router.get('/hk01/channel/:id', require('./routes/hk01/channel'));
-router.get('/hk01/issue/:id', require('./routes/hk01/issue'));
-router.get('/hk01/tag/:id', require('./routes/hk01/tag'));
-router.get('/hk01/hot', require('./routes/hk01/hot'));
-
-// 码农周刊
-router.get('/manong-weekly', require('./routes/manong-weekly/issues'));
-
-// 每日猪价
-router.get('/pork-price', require('./routes/pork-price'));
-
-// NOI 全国青少年信息学奥林匹克竞赛
-router.get('/noi', require('./routes/noi'));
-router.get('/noi/winners-list', require('./routes/noi/winners-list'));
-router.get('/noi/province-news', require('./routes/noi/province-news'));
-router.get('/noi/rg-news', require('./routes/noi/rg-news'));
-
-// 中国工业化和信息部
-router.get('/gov/miit/zcwj', require('./routes/gov/miit/zcwj'));
-router.get('/gov/miit/wjgs', require('./routes/gov/miit/wjgs'));
-router.get('/gov/miit/zcjd', require('./routes/gov/miit/zcjd'));
-
-// 中国国家认证认可监管管理员会
-router.get('/gov/cnca/jgdt', require('./routes/gov/cnca/jgdt'));
-router.get('/gov/cnca/hydt', require('./routes/gov/cnca/hydt'));
-
-router.get('/gov/cnca/zxtz', require('./routes/gov/cnca/zxtz'));
-
-// clickme
-router.get('/clickme/:site/:grouping/:name', require('./routes/clickme'));
-
-// 文汇报
-router.get('/whb/:category', require('./routes/whb/zhuzhan'));
-
-// 三界异次元
-router.get('/3ycy/home', require('./routes/3ycy/home.js'));
-
-// Emi Nitta official website
-router.get('/emi-nitta/:type', require('./routes/emi-nitta/home'));
-
-// Alter China
-router.get('/alter-cn/news', require('./routes/alter-cn/news'));
-
-// Visual Studio Code Marketplace
-router.get('/vscode/marketplace/:type?', require('./routes/vscode/marketplace'));
-
-// 饭否
-router.get('/fanfou/user_timeline/:uid', require('./routes/fanfou/user_timeline'));
-router.get('/fanfou/home_timeline', require('./routes/fanfou/home_timeline'));
-router.get('/fanfou/favorites/:uid', require('./routes/fanfou/favorites'));
-router.get('/fanfou/trends', require('./routes/fanfou/trends'));
-router.get('/fanfou/public_timeline/:keyword', require('./routes/fanfou/public_timeline'));
-
-// ITSlide
-router.get('/itslide/new', require('./routes/itslide/new'));
-
-// Remote Work
-router.get('/remote-work/:caty?', require('./routes/remote-work/index'));
-
-// China Times
-router.get('/chinatimes/:caty', require('./routes/chinatimes/index'));
-
-// TransferWise
-router.get('/transferwise/pair/:source/:target', require('./routes/transferwise/pair'));
-
-// chocolatey
-router.get('/chocolatey/software/:name?', require('./routes/chocolatey/software'));
-
-// Nyaa
-router.get('/nyaa/search/:query?', require('./routes/nyaa/search'));
-
-// 片源网
-router.get('/pianyuan/:media?', require('./routes/pianyuan/app'));
-
-// ITHome
-router.get('/ithome/:caty', require('./routes/ithome/index'));
-router.get('/ithome/ranking/:type', require('./routes/ithome/ranking'));
-
-// 巴哈姆特
-router.get('/bahamut/creation/:author/:category?', require('./routes/bahamut/creation'));
-router.get('/bahamut/creation_index/:category?/:subcategory?/:type?', require('./routes/bahamut/creation_index'));
-
-// CentBrowser
-router.get('/centbrowser/history', require('./routes/centbrowser/history'));
-
-// 755
-router.get('/755/user/:username', require('./routes/755/user'));
-
-// IKEA
-router.get('/ikea/uk/new', require('./routes/ikea/uk/new'));
-router.get('/ikea/uk/offer', require('./routes/ikea/uk/offer'));
-
-// Mastodon
-router.get('/mastodon/timeline/:site/:only_media?', require('./routes/mastodon/timeline_local'));
-router.get('/mastodon/remote/:site/:only_media?', require('./routes/mastodon/timeline_remote'));
-router.get('/mastodon/account_id/:site/:account_id/statuses/:only_media?', require('./routes/mastodon/account_id'));
-router.get('/mastodon/acct/:acct/statuses/:only_media?', require('./routes/mastodon/acct'));
-
-// Kernel Aliyun
-router.get('/aliyun-kernel/index', require('./routes/aliyun-kernel/index'));
-
-// Vulture
-router.get('/vulture/:tag/:excludetags?', require('./routes/vulture/index'));
-
-// xinwenlianbo
-router.get('/xinwenlianbo/index', require('./routes/xinwenlianbo/index'));
-
-// Paul Graham - Essays
-router.get('/blogs/paulgraham', require('./routes/blogs/paulgraham'));
-
-// invisionapp
-router.get('/invisionapp/inside-design', require('./routes/invisionapp/inside-design'));
-
-// producthunt
-router.get('/producthunt/today', require('./routes/producthunt/today'));
-
-// mlog.club
-router.get('/mlog-club/topics/:node', require('./routes/mlog-club/topics'));
-router.get('/mlog-club/projects', require('./routes/mlog-club/projects'));
-
-// Chrome 网上应用店
-router.get('/chrome/webstore/extensions/:id', require('./routes/chrome/extensions'));
-
-// RTHK
-router.get('/rthk-news/:lang/:category', require('./routes/rthk-news/index'));
-
-// yahoo
-router.get('/yahoo-news/:region/:category?', require('./routes/yahoo-news/index'));
-
-// Yahoo!テレビ
-router.get('/yahoo-jp-tv/:query', require('./routes/yahoo-jp-tv/index'));
-
-// 白鲸出海
-router.get('/baijing', require('./routes/baijing'));
-
-// 低端影视
-router.get('/ddrk/update/:name/:season?', require('./routes/ddrk/index'));
-router.get('/ddrk/tag/:tag', require('./routes/ddrk/list'));
-router.get('/ddrk/category/:category', require('./routes/ddrk/list'));
-router.get('/ddrk/index', require('./routes/ddrk/list'));
-
-// avgle
-router.get('/avgle/videos/:order?/:time?/:top?', require('./routes/avgle/videos.js'));
-router.get('/avgle/search/:keyword/:order?/:time?/:top?', require('./routes/avgle/videos.js'));
-
-// 公主链接公告
-router.get('/pcr/news', require('./routes/pcr/news'));
-router.get('/pcr/news-tw', require('./routes/pcr/news-tw'));
-router.get('/pcr/news-cn', require('./routes/pcr/news-cn'));
-
-// project-zero issues
-router.get('/project-zero-issues', require('./routes/project-zero-issues/index'));
-
-// 平安银河实验室
-router.get('/galaxylab', require('./routes/galaxylab/index'));
-
-// NOSEC 安全讯息平台
-router.get('/nosec/:keykind?', require('./routes/nosec/index'));
-
-// Hex-Rays News
-router.get('/hex-rays/news', require('./routes/hex-rays/index'));
-
-// 新趣集
-router.get('/xinquji/today', require('./routes/xinquji/today'));
-router.get('/xinquji/today/internal', require('./routes/xinquji/internal'));
-
-// 英中协会
-router.get('/gbcc/trust', require('./routes/gbcc/trust'));
-
-// Associated Press
-router.get('/apnews/topics/:topic', require('./routes/apnews/topics'));
-
-// CBC
-router.get('/cbc/topics/:topic?', require('./routes/cbc/topics'));
-
-// discuz
-router.get('/discuz/:ver([7|x])/:cid([0-9]{2})/:link(.*)', require('./routes/discuz/discuz'));
-router.get('/discuz/:ver([7|x])/:link(.*)', require('./routes/discuz/discuz'));
-router.get('/discuz/:link(.*)', require('./routes/discuz/discuz'));
-
-// China Dialogue 中外对话
-router.get('/chinadialogue/topics/:topic', require('./routes/chinadialogue/topics'));
-router.get('/chinadialogue/:column', require('./routes/chinadialogue/column'));
-
-// 人民日报社 国际金融报
-router.get('/ifnews/:cid', require('./routes/ifnews/column'));
-
-// Scala Blog
-router.get('/scala/blog/:part?', require('./routes/scala-blog/scala-blog'));
-
-// Minecraft Java版游戏更新
-router.get('/minecraft/version', require('./routes/minecraft/version'));
-
-// 微信更新日志
-router.get('/weixin/miniprogram/release', require('./routes/tencent/wechat/miniprogram/framework')); // 基础库更新日志
-router.get('/weixin/miniprogram/framework', require('./routes/tencent/wechat/miniprogram/framework')); // 基础库更新日志
-router.get('/weixin/miniprogram/devtools', require('./routes/tencent/wechat/miniprogram/devtools')); // 开发者工具更新日志
-router.get('/weixin/miniprogram/wxcloud/:caty?', require('./routes/tencent/wechat/miniprogram/wxcloud')); // 云开发更新日志
-
-// 武汉肺炎疫情动态
-router.get('/coronavirus/caixin', require('./routes/coronavirus/caixin'));
-router.get('/coronavirus/dxy/data/:province?/:city?', require('./routes/coronavirus/dxy-data'));
-router.get('/coronavirus/dxy', require('./routes/coronavirus/dxy'));
-router.get('/coronavirus/scmp', require('./routes/coronavirus/scmp'));
-router.get('/coronavirus/nhc', require('./routes/coronavirus/nhc'));
-router.get('/coronavirus/mogov-2019ncov/:lang', require('./routes/coronavirus/mogov-2019ncov'));
-router.get('/coronavirus/qq/fact', require('./routes/tencent/factcheck'));
-router.get('/coronavirus/sg-moh', require('./routes/coronavirus/sg-moh'));
-
-// 南京林业大学教务处
-router.get('/njfu/jwc/:category?', require('./routes/universities/njfu/jwc'));
-
-// 日本経済新聞
-router.get('/nikkei/index', require('./routes/nikkei/index'));
-
-// MQube
-router.get('/mqube/user/:user', require('./routes/mqube/user'));
-router.get('/mqube/tag/:tag', require('./routes/mqube/tag'));
-router.get('/mqube/latest', require('./routes/mqube/latest'));
-router.get('/mqube/top', require('./routes/mqube/top'));
-
-// Letterboxd
-router.get('/letterboxd/user/diary/:username', require('./routes/letterboxd/userdiary'));
-router.get('/letterboxd/user/followingdiary/:username', require('./routes/letterboxd/followingdiary'));
-
-// 网易大神
-router.get('/netease/ds/:id', require('./routes/netease/ds'));
-
-// javlibrary
-router.get('/javlibrary/users/:uid/:utype', require('./routes/javlibrary/users'));
-router.get('/javlibrary/videos/:vtype', require('./routes/javlibrary/videos'));
-router.get('/javlibrary/stars/:sid', require('./routes/javlibrary/stars'));
-router.get('/javlibrary/bestreviews', require('./routes/javlibrary/bestreviews'));
-
-// Last.FM
-router.get('/lastfm/recent/:user', require('./routes/lastfm/recent'));
-router.get('/lastfm/loved/:user', require('./routes/lastfm/loved'));
-router.get('/lastfm/top/:country?', require('./routes/lastfm/top'));
-
-// piapro
-router.get('/piapro/user/:pid', require('./routes/piapro/user'));
-router.get('/piapro/public/:type/:tag?/:category?', require('./routes/piapro/public'));
-
-// 凤凰网
-router.get('/ifeng/feng/:id/:type', require('./routes/ifeng/feng'));
-
-// 网易公开课
-router.get('/open163/vip', require('./routes/netease/open/vip'));
-router.get('/open163/latest', require('./routes/netease/open/latest'));
-
-// 第一版主
-router.get('/novel/d1bz/:category/:id', require('./routes/d1bz/novel'));
-
-// 爱下电子书
-router.get('/axdzs/:id1/:id2', require('./routes/novel/axdzs'));
-
-// HackerOne
-router.get('/hackerone/hacktivity', require('./routes/hackerone/hacktivity'));
-
-// 奶牛关
-router.get('/cowlevel/element/:id', require('./routes/cowlevel/element'));
-
-// 2048
-router.get('/2048/bbs/:fid', require('./routes/2048/bbs'));
-
-// Google News
-router.get('/google/news/:category/:locale', require('./routes/google/news'));
-
-// 虛詞
-router.get('/p-articles/section/:section', require('./routes/p-articles/section'));
-router.get('/p-articles/contributors/:author', require('./routes/p-articles/contributors'));
-
-// finviz
-
-router.get('/finviz/news/:ticker', require('./routes/finviz/news'));
-
-// 好好住
-router.get('/haohaozhu/whole-house/:keyword?', require('./routes/haohaozhu/whole-house'));
-router.get('/haohaozhu/discover/:keyword?', require('./routes/haohaozhu/discover'));
-
-// 东北大学
-router.get('/neu/news/:type', require('./routes/universities/neu/news'));
-
-// 快递100
-router.get('/kuaidi100/track/:number/:id/:phone?', require('./routes/kuaidi100/index'));
-router.get('/kuaidi100/company', require('./routes/kuaidi100/supported_company'));
-
-// 稻草人书屋
-router.get('/dcrsw/:name/:count?', require('./routes/novel/dcrsw'));
-
-// 魔法纪录
-router.get('/magireco/announcements', require('./routes/magireco/announcements'));
-router.get('/magireco/event_banner', require('./routes/magireco/event_banner'));
-
-// wolley
-router.get('/wolley', require('./routes/wolley/index'));
-router.get('/wolley/user/:id', require('./routes/wolley/user'));
-router.get('/wolley/host/:host', require('./routes/wolley/host'));
-
-// 西安交大
-router.get('/xjtu/gs/tzgg', require('./routes/universities/xjtu/gs/tzgg'));
-router.get('/xjtu/dean/:subpath+', require('./routes/universities/xjtu/dean'));
-router.get('/xjtu/international/:subpath+', require('./routes/universities/xjtu/international'));
-
-// booksource
-router.get('/booksource', require('./routes/booksource/index'));
-
-// ku
-router.get('/ku/:name?', require('./routes/ku/index'));
-
-// 我有一片芝麻地
-router.get('/blogs/hedwig/:type', require('./routes/blogs/hedwig'));
-
-// LoveHeaven
-router.get('/loveheaven/update/:slug', require('./routes/loveheaven/update'));
-
-// 拉勾
-router.get('/lagou/jobs/:position/:city', require('./routes/lagou/jobs'));
-
-// 扬州大学
-router.get('/yzu/home/:type', require('./routes/universities/yzu/home'));
-router.get('/yzu/yjszs/:type', require('./routes/universities/yzu/yjszs'));
-
-// 国家自然科学基金委员会
-router.get('/nsfc/news/:type?', require('./routes/nsfc/news'));
-
-// 德国新闻社卫健新闻
-router.get('/krankenkassen', require('./routes/krankenkassen'));
-
-// 桂林航天工业学院
-router.get('/guat/news/:type?', require('./routes/guat/news'));
-
-// 国家留学网
-router.get('/csc/notice/:type?', require('./routes/csc/notice'));
-
-// LearnKu
-router.get('/learnku/:community/:category?', require('./routes/learnku/topic'));
-
-// NEEA
-router.get('/neea/:type', require('./routes/neea'));
-
-// 中国农业大学
-router.get('/cauyjs', require('./routes/universities/cauyjs/cauyjs'));
-
-// 南方科技大学
-router.get('/sustyjs', require('./routes/universities/sustyjs/sustyjs'));
-
-// 广州大学
-router.get('/gzyjs', require('./routes/universities/gzyjs/gzyjs'));
-
-// 深圳大学
-router.get('/szuyjs', require('./routes/universities/szuyjs/szuyjs'));
-
-// 中国传媒大学
-router.get('/cucyjs', require('./routes/universities/cucyjs/cucyjs'));
-
-// 中国农业大学信电学院
-router.get('/cauele', require('./routes/universities/cauyjs/cauyjs'));
-
-// moxingfans
-router.get('/moxingfans', require('./routes/moxingfans'));
-
-// Chiphell
-router.get('/chiphell/forum/:forumId?', require('./routes/chiphell/forum'));
-
-// 华东理工大学研究生院
-router.get('/ecustyjs', require('./routes/universities/ecustyjs/ecustyjs'));
-
-// 同济大学研究生院
-router.get('/tjuyjs', require('./routes/universities/tjuyjs/tjuyjs'));
-
-// 中国石油大学研究生院
-router.get('/upcyjs', require('./routes/universities/upcyjs/upcyjs'));
-
-// 中国海洋大学研究生院
-router.get('/outyjs', require('./routes/universities/outyjs/outyjs'));
-
-// 中科院人工智能所
-router.get('/zkyai', require('./routes/universities/zkyai/zkyai'));
-
-// 中科院自动化所
-router.get('/zkyyjs', require('./routes/universities/zkyyjs/zkyyjs'));
-
-// 中国海洋大学信电学院
-router.get('/outele', require('./routes/universities/outele/outele'));
-
-// 华东师范大学研究生院
-router.get('/ecnuyjs', require('./routes/universities/ecnuyjs/ecnuyjs'));
-
-// 考研帮调剂信息
-router.get('/kaoyan', require('./routes/kaoyan/kaoyan'));
-
-// 华中科技大学研究生院
-router.get('/hustyjs', require('./routes/universities/hustyjs/hustyjs'));
-
-// 华中师范大学研究生院
-router.get('/ccnuyjs', require('./routes/universities/ccnu/ccnuyjs'));
-
-// 华中师范大学计算机学院
-router.get('/ccnucs', require('./routes/universities/ccnu/ccnucs'));
-
-// 华中师范大学伍论贡学院
-router.get('/ccnuwu', require('./routes/universities/ccnu/ccnuwu'));
-
-// WEEX
-router.get('/weexcn/news/:typeid', require('./routes/weexcn/index'));
-
-// 天天基金
-router.get('/eastmoney/user/:uid', require('./routes/eastmoney/user'));
-
-// 紳士漫畫
-router.get('/ssmh', require('./routes/ssmh'));
-
-// 武昌首义学院
-router.get('/wsyu/news/:type?', require('./routes/universities/wsyu/news'));
-
-// 华南师范大学研究生学院
-router.get('/scnuyjs', require('./routes/universities/scnu/scnuyjs'));
-
-// 华南师范大学软件学院
-router.get('/scnucs', require('./routes/universities/scnu/scnucs'));
-
-// 华南理工大学研究生院
-router.get('/scutyjs', require('./routes/universities/scut/scutyjs'));
-
-// 华南农业大学研究生院通知公告
-router.get('/scauyjs', require('./routes/universities/scauyjs/scauyjs'));
-
-// 北京大学研究生招生网通知公告
-router.get('/pkuyjs', require('./routes/universities/pku/pkuyjs'));
-
-// 北京理工大学研究生通知公告
-router.get('/bityjs', require('./routes/universities/bit/bityjs'));
-
-// 湖南科技大学教务处
-router.get('/hnust/jwc', require('./routes/universities/hnust/jwc/index'));
-router.get('/hnust/computer', require('./routes/universities/hnust/computer/index'));
-router.get('/hnust/art', require('./routes/universities/hnust/art/index'));
-router.get('/hnust/graduate/:type?', require('./routes/universities/hnust/graduate/index'));
-
-// 西南交通大学
-router.get('/swjtu/tl/news', require('./routes/swjtu/tl/news'));
-
-// AGE动漫
-router.get('/agefans/detail/:id', require('./routes/agefans/detail'));
-
-// Checkra1n
-router.get('/checkra1n/releases', require('./routes/checkra1n/releases'));
-
-// 四川省科学技术厅
-router.get('/sckjt/news/:type?', require('./routes/sckjt/news'));
-
-// 绝对领域
-router.get('/jdlingyu/:type', require('./routes/jdlingyu/index'));
-
-// Hi, DIYgod
-router.get('/blogs/diygod/animal-crossing', require('./routes/blogs/diygod/animal-crossing'));
-router.get('/blogs/diygod/gk', require('./routes/blogs/diygod/gk'));
-
-// 湖北工业大学
-router.get('/hbut/news/:type', require('./routes/universities/hbut/news'));
-router.get('/hbut/cs/:type', require('./routes/universities/hbut/cs'));
-
-// acwifi
-router.get('/acwifi', require('./routes/acwifi'));
-
-// a岛匿名版
-router.get('/adnmb/:pid', require('./routes/adnmb/index'));
-
-// MIT科技评论
-router.get('/mittrchina/article', require('./routes/mittrchina'));
-
-// 消费者报道
-router.get('/ccreports/article', require('./routes/ccreports'));
-
-// iYouPort
-router.get('/iyouport/article', require('./routes/iyouport'));
-router.get('/iyouport/:category?', require('./routes/iyouport'));
-
-// girlimg
-router.get('/girlimg/album/:tag?/:mode?', require('./routes/girlimg/album'));
-
-// etoland
-router.get('/etoland/:bo_table', require('./routes/etoland/board'));
-
-// 辽宁工程技术大学教务在线公告
-router.get('/lntu/jwnews', require('./routes/universities/lntu/jwnews'));
-
-// 51voa
-router.get('/51voa/:channel', require('./routes/51voa/channel'));
-
-// zhuixinfan
-router.get('/zhuixinfan/list', require('./routes/zhuixinfan/list'));
-
-// scoresaber
-router.get('/scoresaber/user/:id', require('./routes/scoresaber/user'));
-
-// blur-studio
-router.get('/blur-studio', require('./routes/blur-studio/index'));
-
-// method-studios
-router.get('/method-studios/:menu?', require('./routes/method-studios/index'));
-
-// blow-studio
-router.get('/blow-studio', require('./routes/blow-studio/work'));
-
-// axis-studios
-router.get('/axis-studios/:type/:tag?', require('./routes/axis-studios/work'));
-
-// 人民邮电出版社
-router.get('/ptpress/book/:type?', require('./routes/ptpress/book'));
-
-// uniqlo styling book
-router.get('/uniqlo/stylingbook/:category?', require('./routes/uniqlo/stylingbook'));
-
-// 本地宝焦点资讯
-router.get('/bendibao/news/:city', require('./routes/bendibao/news'));
-
-// unit-image
-router.get('/unit-image/films/:type?', require('./routes/unit-image/films'));
-
-// digic-picture
-router.get('/digic-pictures/:menu/:tags?', require('./routes/digic-pictures/index'));
-
-// cve.mitre.org
-router.get('/cve/search/:keyword', require('./routes/cve/search'));
-
-// Xposed Module Repository
-router.get('/xposed/module/:mod', require('./routes/xposed/module'));
-
-// Microsoft Edge
-router.get('/edge/addon/:crxid', require('./routes/edge/addon'));
-
-// 上海立信会计金融学院
-router.get('/slu/tzgg/:id', require('./routes/universities/slu/tzgg'));
-router.get('/slu/jwc/:id', require('./routes/universities/slu/jwc'));
-router.get('/slu/tyyjkxy/:id', require('./routes/universities/slu/tyyjkxy'));
-router.get('/slu/kjxy/:id', require('./routes/universities/slu/kjxy'));
-router.get('/slu/xsc/:id', require('./routes/universities/slu/xsc'));
-router.get('/slu/csggxy/:id', require('./routes/universities/slu/csggxy'));
-
-// Ruby China
-router.get('/ruby-china/topics/:type?', require('./routes/ruby-china/topics'));
-router.get('/ruby-china/jobs', require('./routes/ruby-china/jobs'));
-
-// 中国人事考试网
-router.get('/cpta/notice', require('./routes/cpta/notice'));
-
-// 广告网
-router.get('/adquan/:type?', require('./routes/adquan/index'));
-
-// 齐鲁晚报
-router.get('/qlwb/news', require('./routes/qlwb/news'));
-router.get('/qlwb/city/:city', require('./routes/qlwb/city'));
-
-// 蜻蜓FM
-router.get('/qingting/channel/:id', require('./routes/qingting/channel'));
-
-// 金色财经
-router.get('/jinse/lives', require('./routes/jinse/lives'));
-router.get('/jinse/timeline', require('./routes/jinse/timeline'));
-router.get('/jinse/catalogue/:caty', require('./routes/jinse/catalogue'));
-
-// deeplearning.ai
-router.get('/deeplearningai/thebatch', require('./routes/deeplearningai/thebatch'));
-
-// Fate Grand Order
-router.get('/fgo/news', require('./routes/fgo/news'));
-
-// RF技术社区
-router.get('/rf/article', require('./routes/rf/article'));
-
-// University of Massachusetts Amherst
-router.get('/umass/amherst/ecenews', require('./routes/umass/amherst/ecenews'));
-router.get('/umass/amherst/csnews', require('./routes/umass/amherst/csnews'));
-router.get('/umass/amherst/ipoevents', require('./routes/umass/amherst/ipoevents'));
-router.get('/umass/amherst/ipostories', require('./routes/umass/amherst/ipostories'));
-
-// 飘花电影网
-router.get('/piaohua/hot', require('./routes/piaohua/hot'));
-
-// 快媒体
-router.get('/kuai', require('./routes/kuai/index'));
-router.get('/kuai/:id', require('./routes/kuai/id'));
-
-// 生物帮
-router.get('/biobio/:id', require('./routes/biobio/index'));
-router.get('/biobio/:column/:id', require('./routes/biobio/others'));
-
-// 199it
-router.get('/199it', require('./routes/199it/index'));
-router.get('/199it/category/:caty', require('./routes/199it/category'));
-router.get('/199it/tag/:tag', require('./routes/199it/tag'));
-
-// 唧唧堂
-router.get('/jijitang/article/:id', require('./routes/jijitang/article'));
-router.get('/jijitang/publication', require('./routes/jijitang/publication'));
-
-// 新闻联播
-router.get('/xwlb', require('./routes/xwlb/index'));
-
-// 网易新闻专栏
-router.get('/netease/news/special/:type?', require('./routes/netease/news/special'));
-
-// 端传媒
-router.get('/initium/:type?/:language?', require('./routes/initium/full'));
-
-// Grub Street
-router.get('/grubstreet', require('./routes/grubstreet/index'));
-
-// 漫画堆
-router.get('/manhuadui/manhua/:name/:serial?', require('./routes/manhuadui/manhua'));
-
-// 风之漫画
-router.get('/fzdm/manhua/:id', require('./routes/fzdm/manhua'));
-
-// Aljazeera 半岛网
-router.get('/aljazeera/news', require('./routes/aljazeera/news'));
-
-// CFD indices dividend adjustment
-router.get('/cfd/gbp_div', require('./routes/cfd/gbp_div'));
-
-// 中国人民银行
-router.get('/pbc/goutongjiaoliu', require('./routes/pbc/goutongjiaoliu'));
-router.get('/pbc/tradeAnnouncement', require('./routes/pbc/tradeAnnouncement'));
-
-// Monotype
-router.get('/monotype/article', require('./routes/monotype/article'));
-
-// Stork
-router.get('/stork/keyword/:trackID/:displayKey', require('./routes/stork/keyword'));
-
-// 致美化
-router.get('/zhutix/latest', require('./routes/zhutix/latest'));
-
-// arXiv
-router.get('/arxiv/:query', require('./routes/arxiv/query'));
-
-// 生物谷
-router.get('/shengwugu/:uid?', require('./routes/shengwugu/index'));
-
-// 环球律师事务所文章
-router.get('/law/hq', require('./routes/law/hq'));
-
-// 海问律师事务所文章
-router.get('/law/hw', require('./routes/law/hw'));
-
-// 国枫律师事务所文章
-router.get('/law/gf', require('./routes/law/gf'));
-
-// 通商律师事务所文章
-router.get('/law/ts', require('./routes/law/ts'));
-
-// 锦天城律师事务所文章
-router.get('/law/jtc', require('./routes/law/jtc'));
-
-// 中伦律师事务所文章
-router.get('/law/zl', require('./routes/law/zl'));
-
-// 君合律师事务所文章
-router.get('/law/jh', require('./routes/law/jh'));
-
-// 德恒律师事务所文章
-router.get('/law/dh', require('./routes/law/dh'));
-
-// 金诚同达律师事务所文章
-router.get('/law/jctd', require('./routes/law/jctd'));
-
-// Mobilism
-router.get('/mobilism/release', require('./routes/mobilism/release'));
-
-// 三星盖乐世社区
-router.get('/samsungmembers/latest', require('./routes/samsungmembers/latest'));
-
-// 东莞教研网
-router.get('/dgjyw/:type', require('./routes/dgjyw/index'));
-
-// 中国信息通信研究院
-router.get('/gov/caict/bps', require('./routes/gov/caict/bps'));
-router.get('/gov/caict/qwsj', require('./routes/gov/caict/qwsj'));
-router.get('/gov/caict/caictgd', require('./routes/gov/caict/caictgd'));
-
-// 中证网
-router.get('/cs/news/:caty', require('./routes/cs/news'));
-
-// 财联社
-router.get('/cls/telegraph', require('./routes/cls/telegraph'));
-router.get('/cls/depth', require('./routes/cls/depth'));
-router.get('/cls/depth/:caty', require('./routes/cls/depth'));
-
-// hentai-cosplays
-router.get('/hentai-cosplays/:type?/:name?', require('./routes/hentai-cosplays/hentai-cosplays'));
-router.get('/porn-images-xxx/:type?/:name?', require('./routes/hentai-cosplays/porn-images-xxx'));
-
-// dcinside
-router.get('/dcinside/board/:id', require('./routes/dcinside/board'));
-
-// 企鹅电竞
-router.get('/egameqq/room/:id', require('./routes/tencent/egame/room'));
-
-// 国家税务总局
-router.get('/gov/chinatax/latest', require('./routes/gov/chinatax/latest'));
-
-// 荔枝FM
-router.get('/lizhi/user/:id', require('./routes/lizhi/user'));
-
-// 富途牛牛
-router.get('/futunn/highlights', require('./routes/futunn/highlights'));
-
-// 外接大脑
-router.get('/waijiedanao/article/:caty', require('./routes/waijiedanao/article'));
-
-// 即刻
-router.get('/jike/topic/:id', require('./routes/jike/topic'));
-router.get('/jike/topic/text/:id', require('./routes/jike/topicText'));
-router.get('/jike/user/:id', require('./routes/jike/user'));
-
-// 网易新闻
-router.get('/netease/news/rank/:category?/:type?/:time?', require('./routes/netease/news/rank'));
-
-// Boston.com
-router.get('/boston/:tag?', require('./routes/boston/index'));
-
-// 中国邮政速递物流
-router.get('/ems/news', require('./routes/ems/news'));
-
-// 场库
-router.get('/changku', require('./routes/changku/index'));
-// SCMP
-router.get('/scmp/:category_id', require('./routes/scmp/index'));
-
-// 上海市生态环境局
-router.get('/gov/shanghai/sthj', require('./routes/gov/shanghai/sthj'));
-
-// 才符
-router.get('/91ddcc/user/:user', require('./routes/91ddcc/user'));
-router.get('/91ddcc/stage/:stage', require('./routes/91ddcc/stage'));
-
-// BookwalkerTW热门新书
-router.get('/bookwalkertw/news', require('./routes/bookwalkertw/news'));
-
-// Chicago Tribune
-router.get('/chicagotribune/:category/:subcategory?', require('./routes/chicagotribune/index'));
-
-// Amazfit Watch Faces
-router.get('/amazfitwatchfaces/fresh/:model/:type?/:lang?', require('./routes/amazfitwatchfaces/fresh'));
-router.get('/amazfitwatchfaces/updated/:model/:type?/:lang?', require('./routes/amazfitwatchfaces/updated'));
-router.get('/amazfitwatchfaces/top/:model/:type?/:time?/:sortBy?/:lang?', require('./routes/amazfitwatchfaces/top'));
-router.get('/amazfitwatchfaces/search/:model/:keyword?/:sortBy?', require('./routes/amazfitwatchfaces/search'));
-
-// 猫耳FM
-router.get('/missevan/drama/:id', require('./routes/missevan/drama'));
-
-// Go语言爱好者周刊
-router.get('/go-weekly', require('./routes/go-weekly'));
-
-// popiask提问箱
-router.get('/popiask/:sharecode/:pagesize?', require('./routes/popiask/questions'));
-
-// AMD
-router.get('/amd/graphicsdrivers/:id/:rid?', require('./routes/amd/graphicsdrivers'));
-
-// 二柄APP
-router.get('/erbingapp/news', require('./routes/erbingapp/news'));
-
-// 电商报
-router.get('/dsb/area/:area', require('./routes/dsb/area'));
-
-// 靠谱新闻
-router.get('/kaopunews/all', require('./routes/kaopunews/all'));
-
-// Reuters
-router.get('/reuters/theWire', require('./routes/reuters/theWire'));
-
-// 格隆汇
-router.get('/gelonghui/user/:id', require('./routes/gelonghui/user'));
-router.get('/gelonghui/subject/:id', require('./routes/gelonghui/subject'));
-router.get('/gelonghui/keyword/:keyword', require('./routes/gelonghui/keyword'));
-
-// 光谷社区
-router.get('/guanggoo/:caty', require('./routes/guanggoo/index'));
-
-// 万维读者
-router.get('/creaders/headline', require('./routes/creaders/headline'));
-
-// 金山词霸
-router.get('/iciba/:days?/:img_type?', require('./routes/iciba/index'));
-
-// 重庆市两江新区信息公开网
-router.get('/gov/chongqing/ljxq/dwgk', require('./routes/gov/chongqing/ljxq/dwgk'));
-router.get('/gov/chongqing/ljxq/zwgk/:caty', require('./routes/gov/chongqing/ljxq/zwgk'));
-
-// 国家突发事件预警信息发布网
-router.get('/12379', require('./routes/12379/index'));
-
-// 鸟哥笔记
-router.get('/ngbj/today', require('./routes/niaogebiji/today'));
-router.get('/ngbj/cat/:cat', require('./routes/niaogebiji/cat'));
-
-// 梅花网
-router.get('/meihua/shots/:caty', require('./routes/meihua/shots'));
-router.get('/meihua/article/:caty', require('./routes/meihua/article'));
-
-// 看点快报
-router.get('/kuaibao', require('./routes/kuaibao/index'));
-
-// SocialBeta
-router.get('/socialbeta/home', require('./routes/socialbeta/home'));
-router.get('/socialbeta/hunt', require('./routes/socialbeta/hunt'));
-
-// 东方我乐多丛志
-router.get('/touhougarakuta/:language/:type', require('./routes/touhougarakuta'));
-
-// 猎趣TV
-router.get('/liequtv/room/:id', require('./routes/liequtv/room'));
-
-// Behance
-router.get('/behance/:user', require('./routes/behance/index'));
-
-// furstar.jp
-router.get('/furstar/characters/:lang?', require('./routes/furstar/index'));
-router.get('/furstar/artists/:lang?', require('./routes/furstar/artists'));
-router.get('/furstar/archive/:lang?', require('./routes/furstar/archive'));
-
-// 北京物资学院
-router.get('/bwu/news', require('./routes/universities/bwu/news'));
-
-// Picuki
-router.get('/picuki/profile/:id/:displayVideo?', require('./routes/picuki/profile'));
-
-// 新榜
-router.get('/newrank/wechat/:wxid', require('./routes/newrank/wechat'));
-router.get('/newrank/douyin/:dyid', require('./routes/newrank/douyin'));
-
-// 漫小肆
-router.get('/manxiaosi/book/:id', require('./routes/manxiaosi/book'));
-
-// 吉林大学校内通知
-router.get('/jlu/oa', require('./routes/universities/jlu/oa'));
-
-// 小宇宙
-router.get('/xiaoyuzhou', require('./routes/xiaoyuzhou/pickup'));
-
-// 合肥工业大学
-router.get('/hfut/tzgg', require('./routes/universities/hfut/tzgg'));
-
-// Darwin Awards
-router.get('/darwinawards/all', require('./routes/darwinawards/articles'));
-
-// 四川职业技术学院
-router.get('/scvtc/xygg', require('./routes/universities/scvtc/xygg'));
-
-// OneJAV
-router.get('/onejav/:type/:key?', require('./routes/onejav/one'));
-
-// CuriousCat
-router.get('/curiouscat/user/:id', require('./routes/curiouscat/user'));
-
-// Telecompaper
-router.get('/telecompaper/news/:caty/:year?/:country?/:type?/:keyword?', require('./routes/telecompaper/news'));
-
-// 水木社区
-router.get('/newsmth/account/:id', require('./routes/newsmth/account'));
-router.get('/newsmth/section/:section', require('./routes/newsmth/section'));
-
-// Kotaku
-router.get('/kotaku/story/:type', require('./routes/kotaku/story'));
-
-// 梅斯医学
-router.get('/medsci/recommend', require('./routes/medsci/recommend'));
-
-// Wallpaperhub
-router.get('/wallpaperhub', require('./routes/wallpaperhub/index'));
-
-// 悟空问答
-router.get('/wukong/user/:id/:type?', require('./routes/wukong/user'));
-
-// 腾讯大数据
-router.get('/tencent/bigdata', require('./routes/tencent/bigdata/index'));
-
-// 搜韵网
-router.get('/souyun/today', require('./routes/souyun/today'));
-
-// 生物谷
-router.get('/bioon/latest', require('./routes/bioon/latest'));
-
-// soomal
-router.get('/soomal/topics/:category/:language?', require('./routes/soomal/topics'));
-
-// NASA
-router.get('/nasa/apod', require('./routes/nasa/apod'));
-router.get('/nasa/apod-ncku', require('./routes/nasa/apod-ncku'));
-router.get('/nasa/apod-cn', require('./routes/nasa/apod-cn'));
-
-// 爱Q生活网
-router.get('/iqshw/latest', require('./routes/3k8/latest'));
-router.get('/3k8/latest', require('./routes/3k8/latest'));
-
-// JustRun
-router.get('/justrun', require('./routes/justrun/index'));
-
-// 上海电力大学
-router.get('/shiep/:type', require('./routes/universities/shiep/index'));
-
-// 福建新闻
-router.get('/fjnews/:city/:limit', require('./routes/fjnews/fznews'));
-router.get('/fjnews/jjnews', require('./routes/fjnews/jjnews'));
-
-// 孔夫子旧书网
-router.get('/kongfz/people/:id', require('./routes/kongfz/people'));
-router.get('/kongfz/shop/:id/:cat?', require('./routes/kongfz/shop'));
-
-// XMind
-router.get('/xmind/mindmap/:lang?', require('./routes/xmind/mindmap'));
-
-// 小刀娱乐网
-router.get('/x6d/:id?', require('./routes/x6d/index'));
-
-// 思维导图社区
-router.get('/edrawsoft/mindmap/:classId?/:order?/:sort?/:lang?/:price?/:search?', require('./routes/edrawsoft/mindmap'));
-
-// 它惠网
-router.get('/tahui/rptlist', require('./routes/tahui/rptlist'));
-
-// Guiltfree
-router.get('/guiltfree/onsale', require('./routes/guiltfree/onsale'));
-
-// 消费明鉴
-router.get('/mingjian', require('./routes/mingjian/index'));
-
-// hentaimama
-router.get('/hentaimama/videos', require('./routes/hentaimama/videos'));
-
-// 无讼
-router.get('/itslaw/judgements/:conditions', require('./routes/itslaw/judgements'));
-
-// 文学城
-router.get('/wenxuecity/blog/:id', require('./routes/wenxuecity/blog'));
-router.get('/wenxuecity/bbs/:cat/:elite?', require('./routes/wenxuecity/bbs'));
-router.get('/wenxuecity/hot/:cid', require('./routes/wenxuecity/hot'));
-
-// 不安全
-router.get('/buaq', require('./routes/buaq/index'));
-
-// 快出海
-router.get('/kchuhai', require('./routes/kchuhai/index'));
-
-// i春秋资讯
-router.get('/ichunqiu', require('./routes/ichunqiu/index'));
-
-// 冰山博客
-router.get('/bsblog123', require('./routes/bsblog123/index'));
-
-// 纳威安全导航
-router.get('/navisec', require('./routes/navisec/index'));
-
-// 安全师
-router.get('/secshi', require('./routes/secshi/index'));
-
-// 出海笔记
-router.get('/chuhaibiji', require('./routes/chuhaibiji/index'));
-
-// 建宁闲谈
-router.get('/blogs/jianning', require('./routes/blogs/jianning'));
-
-// 妖火网
-router.get('/yaohuo/:type?', require('./routes/yaohuo/index'));
-
-// 互动吧
-router.get('/hudongba/:city/:id', require('./routes/hudongba/index'));
-
-// 差评
-router.get('/chaping/banner', require('./routes/chaping/banner'));
-router.get('/chaping/news/:caty?', require('./routes/chaping/news'));
-
-// 飞雪娱乐网
-router.get('/feixuew/:id?', require('./routes/feixuew/index'));
-
-// 1X
-router.get('/1x/:type?/:caty?', require('./routes/1x/index'));
-
-// GQ
-router.get('/gq/tw/:caty?/:subcaty?', require('./routes/gq/tw/index'));
-
-// 泉州市跨境电子商务协会
-router.get('/qzcea/:caty?', require('./routes/qzcea/index'));
-
-// 福利年
-router.get('/fulinian/:caty?', require('./routes/fulinian/index'));
-
-// CGTN
-router.get('/cgtn/most/:type?/:time?', require('./routes/cgtn/most'));
-
-// AppSales
-router.get('/appsales/:caty?/:time?', require('./routes/appsales/index'));
-
-// CGTN
-router.get('/cgtn/top', require('./routes/cgtn/top'));
-
-// 读卖新闻
-router.get('/yomiuri/:category?', require('./routes/yomiuri/news'));
-
-// 巴哈姆特
-// GNN新闻
-router.get('/gamer/gnn/:category?', require('./routes/gamer/gnn_index'));
-
-module.exports = router;
diff --git a/lib/routes/bbc/utils.js b/lib/routes/bbc/utils.js
index ad669dc1c2..8b3122d7d7 100644
--- a/lib/routes/bbc/utils.js
+++ b/lib/routes/bbc/utils.js
@@ -76,6 +76,11 @@ const ProcessFeed = ($, link) => {
content = $('div.story-body');
}
+ if (content.length === 0) {
+ // chinese version has different structure
+ content = $('main[role="main"]');
+ }
+
// remove useless DOMs
content.find('div.bbccom_slot, .off-screen, .embed-report-link').each((i, e) => {
$(e).remove();
diff --git a/lib/routes/caixin/article.js b/lib/routes/caixin/article.js
index 800e3bfa85..29fd6d70a0 100644
--- a/lib/routes/caixin/article.js
+++ b/lib/routes/caixin/article.js
@@ -3,7 +3,11 @@ const got = require('@/utils/got');
module.exports = async (ctx) => {
const response = await got({
method: 'get',
- url: 'https://mappsv5.caixin.com/index_page_v5/index_page_1.json',
+ url: 'http://mapiv5.caixin.com//m/api/getWapIndexListByPage?page=1&callback=&_=1560140003179',
+ headers: {
+ Referer: `http://mapiv5.caixin.com/`,
+ Host: 'mapiv5.caixin.com',
+ },
});
const data = response.data.data.list;
diff --git a/lib/routes/cctv/special.js b/lib/routes/cctv/special.js
new file mode 100644
index 0000000000..1abde6003b
--- /dev/null
+++ b/lib/routes/cctv/special.js
@@ -0,0 +1,109 @@
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+
+module.exports = async (ctx) => {
+ ctx.params.id = ctx.params.id || '315';
+
+ let rootUrl;
+
+ if (ctx.params.id === '315') {
+ rootUrl = `https://315.cctv.com`;
+ } else {
+ rootUrl = `https://news.cctv.com/special/${ctx.params.id}/index.shtml`;
+ }
+
+ const response = await got({
+ method: 'get',
+ url: rootUrl,
+ });
+
+ const $ = cheerio.load(response.data);
+ const list = $('h3>a, h4>a')
+ .slice(0, 10)
+ .map((_, item) => {
+ item = $(item);
+ return {
+ title: item.text(),
+ link: item.attr('href'),
+ };
+ })
+ .get();
+
+ const items = await Promise.all(
+ list.map(
+ async (item) =>
+ await ctx.cache.tryGet(item.link, async () => {
+ let date;
+
+ if (item.link.indexOf('photo.cctv.com') > 0) {
+ const imageLink = item.link.split('.shtml')[0] + '.xml?randomNum=26';
+ const imageResponse = await got({
+ method: 'get',
+ url: imageLink,
+ });
+ const images = cheerio.load(imageResponse.data);
+
+ let description;
+
+ item.description = '';
+
+ images('li')
+ .get()
+ .forEach((i) => {
+ i = images(i);
+ item.description += `
`;
+ date = i.attr('time').replace(/年/g, '-').replace(/月/g, '-').replace(/日/g, '');
+ description = i.html();
+ });
+
+ item.description += `${description}
`;
+ } else {
+ const detailResponse = await got({
+ method: 'get',
+ url: item.link,
+ });
+ const content = cheerio.load(detailResponse.data);
+ const match = detailResponse.data.match(/publishDate ="(.*)";/);
+
+ if (match === null) {
+ let dateSpan;
+
+ if (content('div.info span').html() !== null) {
+ dateSpan = content('div.info span').text();
+ } else if (content('div.info1').html() !== null) {
+ dateSpan = content('div.info1').text().split(' | ')[1];
+ } else {
+ dateSpan = content('span.time').text();
+ }
+
+ date = dateSpan.replace(/年/g, '-').replace(/月/g, '-').replace(/日/g, '');
+ } else {
+ const dateString = match[1];
+ date = `${dateString.slice(0, 4)}-${dateString.slice(4, 6)}-${dateString.slice(6, 8)} ${dateString.slice(8, 10)}:${dateString.slice(10, 12)}:${dateString.slice(12, 14)}`;
+ }
+
+ if (content('#content_area').html() !== null) {
+ item.description = content('#content_area').html();
+ } else if (content('div.cnt_bd').html() !== null) {
+ content('div.function,h1,h2').remove();
+ item.description = content('div.cnt_bd').html();
+ } else if (content('#text_area').html() !== null) {
+ item.description = content('#text_area').html();
+ } else {
+ item.description = content('div.con').html();
+ }
+ }
+
+ item.pubDate = new Date(date + ' GMT+8').toUTCString();
+
+ return item;
+ })
+ )
+ );
+
+ ctx.state.data = {
+ title: `${$('title').text().split('_')[0]} - 新闻专题 - 央视网`,
+ link: rootUrl,
+ item: items,
+ };
+};
diff --git a/lib/routes/embassy/supportedList.js b/lib/routes/embassy/supportedList.js
index 1a37e2e122..e2327ff6b7 100644
--- a/lib/routes/embassy/supportedList.js
+++ b/lib/routes/embassy/supportedList.js
@@ -147,6 +147,15 @@ module.exports = {
},
},
},
+ my: {
+ country: 'my',
+ countryCN: '马来西亚',
+ link: 'http://my.china-embassy.org/chn/zytz/',
+ list: 'div[class=nbox_ul] > ul a',
+ title: '#News_Body_Title',
+ description: '#News_Body_Txt_A',
+ pubDate: '#News_Body_Time',
+ },
sg: {
country: 'sg',
countryCN: '新加坡',
diff --git a/lib/routes/github/follower.js b/lib/routes/github/follower.js
index c87869cdf2..2121d3d915 100644
--- a/lib/routes/github/follower.js
+++ b/lib/routes/github/follower.js
@@ -42,6 +42,7 @@ module.exports = async (ctx) => {
link: host,
item: data.map((follower) => ({
title: `${follower.node.login} started following ${user}`,
+ author: follower.node.login,
description: `${follower.node.login}
`,
link: `https://github.com/${follower.node.login}`,
})),
diff --git a/lib/routes/github/pulls.js b/lib/routes/github/pulls.js
index b711b54700..b97b745309 100644
--- a/lib/routes/github/pulls.js
+++ b/lib/routes/github/pulls.js
@@ -33,6 +33,7 @@ module.exports = async (ctx) => {
link: host,
item: data.map((item) => ({
title: item.title,
+ author: item.user.login,
description: item.body ? md.render(item.body) : 'No description',
pubDate: new Date(item.created_at).toUTCString(),
link: `${link}/${item.number}`,
diff --git a/lib/routes/github/search.js b/lib/routes/github/search.js
index 9c5e861e59..8ed783bdd1 100644
--- a/lib/routes/github/search.js
+++ b/lib/routes/github/search.js
@@ -24,6 +24,7 @@ module.exports = async (ctx) => {
const a = $(this).find('.f4.text-normal > a');
const single = {
title: a.text(),
+ author: a.text().split('/')[0].trim(),
link: host.concat(a.attr('href')),
description: $(this).find('div p').text().trim(),
};
diff --git a/lib/routes/github/star.js b/lib/routes/github/star.js
index 1cb97c44dd..d44ea03bd3 100644
--- a/lib/routes/github/star.js
+++ b/lib/routes/github/star.js
@@ -43,6 +43,7 @@ module.exports = async (ctx) => {
link: host,
item: data.map((follower) => ({
title: `${follower.node.login} starred ${user}/${repo}`,
+ author: follower.node.login,
description: `${follower.node.login}
`,
link: `https://github.com/${follower.node.login}`,
})),
diff --git a/lib/routes/github/starred_repos.js b/lib/routes/github/starred_repos.js
index 13ee4c2919..ffd1a6a32f 100644
--- a/lib/routes/github/starred_repos.js
+++ b/lib/routes/github/starred_repos.js
@@ -52,6 +52,7 @@ module.exports = async (ctx) => {
description: `${user}’s starred repositories`,
item: data.map((repo) => ({
title: `${user} starred ${repo.node.name}`,
+ author: user,
description: `${repo.node.description === null ? 'no description' : repo.node.description}
primary language: ${
repo.node.primaryLanguage === null ? 'no primary language' : repo.node.primaryLanguage.name
}
stargazers: ${repo.node.stargazers.totalCount}
`,
diff --git a/lib/routes/github/trending.js b/lib/routes/github/trending.js
index 9a44def32d..a2518e2302 100644
--- a/lib/routes/github/trending.js
+++ b/lib/routes/github/trending.js
@@ -29,6 +29,7 @@ module.exports = async (ctx) => {
item = $(item);
return {
title: item.find('h1').text(),
+ author: item.find('h1').text().split('/')[0].trim(),
description: `${item.find('.pr-4').text()}
Language: ${item.find('span[itemprop="programmingLanguage"]').text() || 'unknown'}
Star: ${item.find('.muted-link').eq(0).text()}
diff --git a/lib/routes/gitlab/explore.js b/lib/routes/gitlab/explore.js
index ca7d43f79e..6feb623481 100644
--- a/lib/routes/gitlab/explore.js
+++ b/lib/routes/gitlab/explore.js
@@ -26,6 +26,7 @@ module.exports = async (ctx) => {
item = $(item);
return {
title: item.find('.project-full-name').text(),
+ author: item.find('.namespace-name').text().slice(0, -1).split('\n').join('').trim(),
description: item.find('.description').text(),
link: `https://gitlab.com${item.find('a.text-plain').attr('href')}`,
};
diff --git a/lib/routes/gov/taiwan/mnd.js b/lib/routes/gov/taiwan/mnd.js
new file mode 100644
index 0000000000..5bb84abcfe
--- /dev/null
+++ b/lib/routes/gov/taiwan/mnd.js
@@ -0,0 +1,64 @@
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+
+module.exports = async (ctx) => {
+ const rootUrl = 'https://www.mnd.gov.tw';
+ const currentUrl = `${rootUrl}/PublishTable.aspx?Types=即時軍事動態&title=國防消息`;
+
+ const response = await got({
+ method: 'get',
+ url: currentUrl,
+ });
+ const $ = cheerio.load(response.data);
+
+ const list = $('table.newstitles tbody tr')
+ .map((_, item) => {
+ item = $(item);
+ const a = item.find('a');
+ const dateSplit = item.find('td.w-10').text().split('/');
+ dateSplit[0] = (parseInt(dateSplit[0]) + 1911).toString();
+
+ return {
+ title: a.text(),
+ link: a.attr('id').replace(/_/g, '$'),
+ pubDate: new Date(dateSplit.join('-') + ' GMT+8').toUTCString(),
+ };
+ })
+ .get();
+
+ const items = await Promise.all(
+ list.map(
+ async (item) =>
+ await ctx.cache.tryGet(item.link, async () => {
+ const detailResponse = await got({
+ method: 'post',
+ url: currentUrl,
+ headers: {
+ Referer: 'https://www.mnd.gov.tw/',
+ },
+ form: {
+ __EVENTTARGET: item.link,
+ __EVENTARGUMENT: '',
+ __VIEWSTATE: response.data.match(/id="__VIEWSTATE" value="(.*)" \/>/)[1],
+ __VIEWSTATEGENERATOR: response.data.match(/id="__VIEWSTATEGENERATOR" value="(.*)" \/>/)[1],
+ __EVENTVALIDATION: response.data.match(/id="__EVENTVALIDATION" value="(.*)" \/>/)[1],
+ TbSearch2: '',
+ TbSearch: '',
+ },
+ });
+ const content = cheerio.load(detailResponse.data);
+
+ item.description = content('div.thisPages').html();
+ item.link = content('form[name="aspnetForm"]').attr('action').replace('.', `${rootUrl}`);
+
+ return item;
+ })
+ )
+ );
+
+ ctx.state.data = {
+ title: '即時軍事動態 - 中華民國國防部',
+ link: currentUrl,
+ item: items,
+ };
+};
diff --git a/lib/routes/gq/tw/index.js b/lib/routes/gq/tw/index.js
index 4509bccfd6..1b2a67f248 100644
--- a/lib/routes/gq/tw/index.js
+++ b/lib/routes/gq/tw/index.js
@@ -40,11 +40,17 @@ module.exports = async (ctx) => {
item.title = content('h1').text();
+ const article = content('section[data-test-id="ArticleBodyContent"]').html();
+ const gallery = content('section[data-test-id="GalleryImage"]').html();
+
if (ctx.params.caty === 'video') {
item.description = content('div[data-test-id="EmbedIframe"]').html() + content('p[data-test-id="DekText"]').parent().html();
item.pubDate = new Date(detailResponse.data.match(/pubDate":"(.*?)","channel/)[1]).toUTCString();
+ } else if (gallery !== null) {
+ item.description = gallery;
+ item.pubDate = new Date(detailResponse.data.match(/pubDate":"(.*?)","items/)[1]).toUTCString();
} else {
- item.description = content('section[data-test-id="ArticleBodyContent"]').html();
+ item.description = article;
item.pubDate = new Date(detailResponse.data.match(/pubDate":"(.*?)","publishedRevisions/)[1]).toUTCString();
}
diff --git a/lib/routes/huxiu/utils.js b/lib/routes/huxiu/utils.js
index bc871bc0d4..4d0af4ea4d 100644
--- a/lib/routes/huxiu/utils.js
+++ b/lib/routes/huxiu/utils.js
@@ -32,9 +32,19 @@ const ProcessFeed = async (list, cache) => {
});
$('img.dialog_add_wxxy_qrcode_icon').remove();
+ let description = '';
+
+ const videoMatch = response.data.match(/"hd_link":"(.*)","duration/);
+ if (videoMatch !== null) {
+ description += ``;
+ }
+ if ($('.top-img').html() !== null) {
+ description += $('.top-img').html();
+ }
+
return {
title: $('.article__title').text().trim(),
- description: $('.article__top-img-video') + $('.article__content').html(),
+ description: description + $('.article__content').html(),
pubDate: date($('.article__time').text(), 8),
author: $('.author-info__username').text(),
link,
diff --git a/lib/routes/index.js b/lib/routes/index.js
index 3688cbb719..22fb4f740a 100644
--- a/lib/routes/index.js
+++ b/lib/routes/index.js
@@ -71,56 +71,60 @@ module.exports = async (ctx) => {
debug: [
config.nodeName
? {
- name: 'node name',
+ name: 'Node Name',
value: config.nodeName,
}
: null,
{
- name: 'git hash',
+ name: 'Git Hash',
value: gitHash,
},
{
- name: 'request amount',
+ name: 'Request Amount',
value: ctx.debug.request,
},
{
- name: 'request frequency',
- value: ((ctx.debug.request / (stats.elapsed / 1000)) * 60).toFixed(3) + ' 次/分钟',
+ name: 'Request Frequency',
+ value: ((ctx.debug.request / (stats.elapsed / 1000)) * 60).toFixed(3) + ' times/minute',
},
{
- name: 'cache hit ratio',
+ name: 'Cache Hit Ratio',
value: ctx.debug.request ? (ctx.debug.hitCache / ctx.debug.request).toFixed(3) : 0,
},
{
- name: 'memory usage',
+ name: 'ETag Matched',
+ value: ctx.debug.etag,
+ },
+ {
+ name: 'Memory Usage',
value: stats.memory / 1000000 + ' MB',
},
{
- name: 'CPU usage',
+ name: 'CPU Usage',
value: stats.cpu + '%',
},
{
- name: 'run time',
- value: (stats.elapsed / 3600000).toFixed(2) + ' 小时',
+ name: 'Run Time',
+ value: (stats.elapsed / 3600000).toFixed(2) + ' hour(s)',
},
{
- name: 'hot routes',
+ name: 'Hot Routes',
value: hotRoutesValue,
},
{
- name: 'hot paths',
+ name: 'Hot Paths',
value: hotPathsValue,
},
{
- name: 'hot IP',
+ name: 'Hot IP',
value: hotIPsValue,
},
{
- name: 'hot error routes',
+ name: 'Hot Error Routes',
value: hotErrorRoutesValue,
},
{
- name: 'hot error paths',
+ name: 'Hot Error Paths',
value: hotErrorPathsValue,
},
],
diff --git a/lib/routes/ithome/index.js b/lib/routes/ithome/index.js
index 66a41d2263..7dc1a49df3 100644
--- a/lib/routes/ithome/index.js
+++ b/lib/routes/ithome/index.js
@@ -43,7 +43,7 @@ module.exports = async (ctx) => {
});
const $ = cheerio.load(response.data);
- const list = $('div.wrap_left_top div.mf div.new-list-1 li[class!="top"] span.title a')
+ const list = $('#list > div.fl > ul > li > div > h2 > a')
.slice(0, 10)
.map((_, item) => {
item = $(item);
@@ -60,16 +60,15 @@ module.exports = async (ctx) => {
await ctx.cache.tryGet(item.link, async () => {
const res = await got({ method: 'get', url: item.link });
const content = cheerio.load(res.data);
- const post = content('div#con div.content');
- const paragraph = post.find('div#paragraph');
- paragraph.find('img[data-original]').each((_, ele) => {
+ const post = content('#paragraph');
+ post.find('img[data-original]').each((_, ele) => {
ele = $(ele);
ele.attr('src', ele.attr('data-original'));
ele.removeAttr('class');
ele.removeAttr('data-original');
});
- item.description = paragraph.html();
- item.pubDate = new Date(post.find('span#pubtime_baidu').text() + ' GMT+8').toUTCString();
+ item.description = post.html();
+ item.pubDate = new Date(content('#pubtime_baidu').text() + ' GMT+8').toUTCString();
return item;
})
)
diff --git a/lib/routes/javdb/actors.js b/lib/routes/javdb/actors.js
new file mode 100644
index 0000000000..0815709c5d
--- /dev/null
+++ b/lib/routes/javdb/actors.js
@@ -0,0 +1,19 @@
+const utils = require('./utils');
+
+module.exports = async (ctx) => {
+ ctx.params.filter = ctx.params.filter || '';
+
+ const currentUrl = `${utils.rootUrl}/actors/${ctx.params.id}?t=${ctx.params.filter}`;
+
+ const filter = {
+ '': '',
+ p: '可播放',
+ s: '單體作品',
+ d: '可下載',
+ c: '含字幕',
+ };
+
+ const title = `JavDB${filter[ctx.params.filter] === '' ? '' : ` - ${filter[ctx.params.filter]}`} `;
+
+ ctx.state.data = await utils.ProcessItems(ctx, currentUrl, title);
+};
diff --git a/lib/routes/javdb/home.js b/lib/routes/javdb/home.js
new file mode 100644
index 0000000000..8d49953c30
--- /dev/null
+++ b/lib/routes/javdb/home.js
@@ -0,0 +1,32 @@
+const utils = require('./utils');
+
+module.exports = async (ctx) => {
+ ctx.params.caty = ctx.params.caty || 'censored';
+ ctx.params.sort = ctx.params.sort || '2';
+ ctx.params.filter = ctx.params.filter || '1';
+
+ const currentUrl = `${utils.rootUrl}/${ctx.params.caty === 'censored' ? '' : ctx.params.caty}?vft=${ctx.params.filter}&vst=${ctx.params.sort}`;
+
+ const category = {
+ censored: '有碼',
+ uncensored: '無碼',
+ western: '歐美',
+ fc2: 'FC2',
+ };
+
+ const filter = {
+ 0: '',
+ 1: '可下载',
+ 2: '含字幕',
+ 3: '含短評',
+ };
+
+ const sort = {
+ 1: '发布日期排序',
+ 2: '磁鏈更新排序',
+ };
+
+ const title = `${category[ctx.params.caty]} - JavDB - ${filter[ctx.params.filter] === '' ? '|' : `${filter[ctx.params.filter]} | `}${sort[ctx.params.sort]}`;
+
+ ctx.state.data = await utils.ProcessItems(ctx, currentUrl, title);
+};
diff --git a/lib/routes/javdb/makers.js b/lib/routes/javdb/makers.js
new file mode 100644
index 0000000000..c6b06f95f0
--- /dev/null
+++ b/lib/routes/javdb/makers.js
@@ -0,0 +1,20 @@
+const utils = require('./utils');
+
+module.exports = async (ctx) => {
+ ctx.params.filter = ctx.params.filter || '';
+
+ const currentUrl = `${utils.rootUrl}/makers/${ctx.params.id}?f=${ctx.params.filter}`;
+
+ const filter = {
+ '': '',
+ playable: '可播放',
+ single: '單體作品',
+ download: '可下載',
+ cnsub: '字幕',
+ preview: '預覽圖',
+ };
+
+ const title = `JavDB${filter[ctx.params.filter] === '' ? '' : ` - ${filter[ctx.params.filter]}`} `;
+
+ ctx.state.data = await utils.ProcessItems(ctx, currentUrl, title);
+};
diff --git a/lib/routes/javdb/rankings.js b/lib/routes/javdb/rankings.js
new file mode 100644
index 0000000000..ee429abc26
--- /dev/null
+++ b/lib/routes/javdb/rankings.js
@@ -0,0 +1,12 @@
+const utils = require('./utils');
+
+module.exports = async (ctx) => {
+ ctx.params.caty = ctx.params.caty || 'censored';
+ ctx.params.time = ctx.params.time || 'daily';
+
+ const currentUrl = `${utils.rootUrl}/rankings/video_${ctx.params.caty}?period=${ctx.params.time}`;
+
+ const title = 'JavDB';
+
+ ctx.state.data = await utils.ProcessItems(ctx, currentUrl, title);
+};
diff --git a/lib/routes/javdb/search.js b/lib/routes/javdb/search.js
new file mode 100644
index 0000000000..bdf0bc5ef0
--- /dev/null
+++ b/lib/routes/javdb/search.js
@@ -0,0 +1,26 @@
+const utils = require('./utils');
+
+module.exports = async (ctx) => {
+ ctx.params.filter = ctx.params.filter || '';
+ ctx.params.keyword = ctx.params.keyword || '';
+
+ const currentUrl = `${utils.rootUrl}/search?q=${ctx.params.keyword}&f=${ctx.params.filter}`;
+
+ const filter = {
+ '': '',
+ playable: '可播放',
+ single: '單體作品',
+ actor: '演員',
+ maker: '片商',
+ director: '導演',
+ series: '系列',
+ code: '番號',
+ download: '可下載',
+ cnsub: '字幕',
+ preview: '預覽圖',
+ };
+
+ const title = `關鍵字 ${ctx.params.keyword} ${filter[ctx.params.filter] === '' ? '' : `+ ${filter[ctx.params.filter]}`} 搜索結果 - JavDB `;
+
+ ctx.state.data = await utils.ProcessItems(ctx, currentUrl, title);
+};
diff --git a/lib/routes/javdb/series.js b/lib/routes/javdb/series.js
new file mode 100644
index 0000000000..9189c21bea
--- /dev/null
+++ b/lib/routes/javdb/series.js
@@ -0,0 +1,20 @@
+const utils = require('./utils');
+
+module.exports = async (ctx) => {
+ ctx.params.filter = ctx.params.filter || '';
+
+ const currentUrl = `${utils.rootUrl}/series/${ctx.params.id}?f=${ctx.params.filter}`;
+
+ const filter = {
+ '': '',
+ playable: '可播放',
+ single: '單體作品',
+ download: '可下載',
+ cnsub: '字幕',
+ preview: '預覽圖',
+ };
+
+ const title = `JavDB${filter[ctx.params.filter] === '' ? '' : ` - ${filter[ctx.params.filter]}`} `;
+
+ ctx.state.data = await utils.ProcessItems(ctx, currentUrl, title);
+};
diff --git a/lib/routes/javdb/tags.js b/lib/routes/javdb/tags.js
new file mode 100644
index 0000000000..efec484cb8
--- /dev/null
+++ b/lib/routes/javdb/tags.js
@@ -0,0 +1,12 @@
+const utils = require('./utils');
+
+module.exports = async (ctx) => {
+ ctx.params.caty = ctx.params.caty || 'censored';
+ ctx.params.query = ctx.params.query || '';
+
+ const currentUrl = `${utils.rootUrl}/tags${ctx.params.caty === 'censored' ? '' : `/${ctx.params.caty}`}?${ctx.params.query}`;
+
+ const title = `JavDB${ctx.params.query === '' ? '' : ` - ${ctx.params.query}`} `;
+
+ ctx.state.data = await utils.ProcessItems(ctx, currentUrl, title);
+};
diff --git a/lib/routes/javdb/utils.js b/lib/routes/javdb/utils.js
new file mode 100644
index 0000000000..78e5ad8ee2
--- /dev/null
+++ b/lib/routes/javdb/utils.js
@@ -0,0 +1,72 @@
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+
+const rootUrl = 'https://javdb.com';
+
+module.exports = {
+ rootUrl: rootUrl,
+ ProcessItems: async (ctx, currentUrl, title) => {
+ const response = await got({
+ method: 'get',
+ url: currentUrl,
+ });
+
+ const $ = cheerio.load(response.data);
+
+ $('.tags').remove();
+
+ const list = $('.grid-item a')
+ .slice(0, 5)
+ .map((_, item) => {
+ item = $(item);
+ return {
+ title: item.text(),
+ link: `${rootUrl}${item.attr('href')}`,
+ pubDate: new Date(item.find('.meta').text()).toUTCString(),
+ };
+ })
+ .get();
+
+ const items = await Promise.all(
+ list.map(
+ async (item) =>
+ await ctx.cache.tryGet(item.link, async () => {
+ const detailResponse = await got({
+ method: 'get',
+ url: item.link,
+ });
+ const content = cheerio.load(detailResponse.data);
+
+ item.enclosure_url = content('#magnets-content button[data-clipboard-text]').eq(0).attr('data-clipboard-text');
+ item.enclosure_type = 'application/x-bittorrent';
+
+ content('icon, .review-buttons, .copy-to-clipboard').remove();
+ content('#modal-review-watched, #modal-save-list').remove();
+ content('.video-cover').eq(1).remove();
+
+ content('img.video-cover').attr('src', content(this).parent().attr('href'));
+
+ content('.preview-images img').each(function () {
+ content(this).removeAttr('data-src');
+ content(this).attr('src', content(this).parent().attr('href'));
+ });
+
+ content('#preview-video').css('display', 'block');
+
+ item.description = content('.movie-info-panel .columns').html() + content('#magnets-content').html() + content('.preview-images').html();
+
+ return item;
+ })
+ )
+ );
+
+ const htmlTitle = $('title').text();
+ const subject = htmlTitle.indexOf('|') === -1 ? '' : htmlTitle.split('|')[0];
+
+ return {
+ title: subject === '' ? title : `${subject} - ${title}`,
+ link: currentUrl,
+ item: items,
+ };
+ },
+};
diff --git a/lib/routes/juejin/utils.js b/lib/routes/juejin/utils.js
index 0fad946bac..e21b22f23a 100644
--- a/lib/routes/juejin/utils.js
+++ b/lib/routes/juejin/utils.js
@@ -31,14 +31,14 @@ const ProcessFeed = async (list, caches) =>
await Promise.all(
list.map(async (item) => {
// 解析时间,补偿时区offset
- const pubdate = new Date(parseInt(item.article_info.ctime) * 1000 - 8 * 60 * 60 * 1000);
- const link = `https://juejin.im/post/${item.article_id}`;
+ const pubdate = new Date(parseInt(item.item_info.ctime || item.item_info.article_info.ctime) * 1000 - 8 * 60 * 60 * 1000);
+ const link = item.item_info.url || `https://juejin.im/post/${item.item_info.article_info.article_id}`;
// 列表上提取到的信息
const single = {
- title: item.article_info.title,
+ title: item.item_info.title || item.item_info.article_info.title,
description: `${(item.content || item.summaryInfo || '无描述').replace(/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]/g, '')}`,
pubDate: pubdate.toUTCString(),
- author: item.author_user_info.user_name,
+ author: item.item_info.author_name || item.item_info.author_user_info.user_name,
link,
};
diff --git a/lib/routes/jx3/news.js b/lib/routes/jx3/news.js
new file mode 100644
index 0000000000..cbeebe9b56
--- /dev/null
+++ b/lib/routes/jx3/news.js
@@ -0,0 +1,59 @@
+const url = require('url');
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+
+module.exports = async (ctx) => {
+ ctx.params.caty = ctx.params.caty || 'allnews';
+
+ let query;
+
+ if (ctx.params.caty === 'hd') {
+ query = 'div.article_list article div h3 a';
+ } else {
+ query = 'div.article_list ul li a';
+ }
+
+ const rootUrl = 'https://jx3.xoyo.com';
+ const currentUrl = `${rootUrl}/${ctx.params.caty}`;
+ const response = await got({
+ method: 'get',
+ url: currentUrl,
+ });
+
+ const $ = cheerio.load(response.data);
+
+ const list = $(query)
+ .slice(0, 10)
+ .map((_, item) => {
+ item = $(item);
+ return {
+ title: item.text(),
+ link: url.resolve(rootUrl, item.attr('href')),
+ };
+ })
+ .get();
+
+ const items = await Promise.all(
+ list.map(
+ async (item) =>
+ await ctx.cache.tryGet(item.link, async () => {
+ const detailResponse = await got({
+ method: 'get',
+ url: item.link,
+ });
+ const content = cheerio.load(detailResponse.data);
+
+ item.description = content('div.detail_con').html();
+ item.pubDate = new Date(content('p.detail_time').text() + ' GMT+8').toUTCString();
+
+ return item;
+ })
+ )
+ );
+
+ ctx.state.data = {
+ title: `${$('ul.allnews_list_ul li.active').text()} - 剑网3`,
+ link: currentUrl,
+ item: items,
+ };
+};
diff --git a/lib/routes/nobelprize/index.js b/lib/routes/nobelprize/index.js
new file mode 100644
index 0000000000..c7a59b5066
--- /dev/null
+++ b/lib/routes/nobelprize/index.js
@@ -0,0 +1,79 @@
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+
+const config = {
+ physics: {
+ link: 'all-nobel-prizes-in-physics',
+ title: 'Physics',
+ },
+ chemistry: {
+ link: 'all-nobel-prizes-in-chemistry',
+ title: 'Chemistry',
+ },
+ 'physiology-or-medicine': {
+ link: 'all-nobel-laureates-in-physiology-or-medicine',
+ title: 'Physiology or Medicine',
+ },
+ literature: {
+ link: 'all-nobel-prizes-in-literature',
+ title: 'Literature',
+ },
+ peace: {
+ link: 'all-nobel-peace-prizes',
+ title: 'Peace',
+ },
+ 'economic-sciences': {
+ link: 'all-prizes-in-economic-sciences',
+ title: 'Economic Science',
+ },
+};
+
+module.exports = async (ctx) => {
+ let rootUrl = 'https://www.nobelprize.org/prizes/lists/all-nobel-prizes/';
+
+ const cfg = config[ctx.params.caty];
+ if (cfg) {
+ rootUrl = `https://www.nobelprize.org/prizes/lists/${cfg.link}/`;
+ }
+
+ const response = await got({
+ method: 'get',
+ url: rootUrl,
+ });
+
+ const $ = cheerio.load(response.data);
+
+ const items = $('div.by_year h3')
+ .map((_, item) => {
+ item = $(item);
+ if (item.text().length === 4) {
+ return Promise.resolve('');
+ }
+
+ const a = item.find('a');
+
+ let description = '';
+
+ item.nextAll().each(function () {
+ if ($(this).get(0).tagName === 'p') {
+ description += `${$(this).html()}
`;
+ return true;
+ }
+ return false;
+ });
+
+ return {
+ title: a.text(),
+ link: a.attr('href'),
+ pubDate: new Date(`${a.text().match(/([0-9]{4})/)[1]}-01-01 00:00:00 GMT+0`).toUTCString(),
+ description,
+ };
+ })
+ .get();
+
+ ctx.state.data = {
+ title: $('title').eq(0).text(),
+ link: rootUrl,
+ item: items,
+ };
+};
diff --git a/lib/routes/notefolio/index.js b/lib/routes/notefolio/index.js
new file mode 100644
index 0000000000..c92317858f
--- /dev/null
+++ b/lib/routes/notefolio/index.js
@@ -0,0 +1,68 @@
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+
+module.exports = async (ctx) => {
+ const caty = ctx.params.caty || 'all';
+ const order = ctx.params.order || 'pick';
+ const time = ctx.params.time || 'all';
+ const query = ctx.params.query || '';
+
+ const rootUrl = `https://notefolio.net/?work_categories=${caty === 'all' ? '' : caty}&order=${order}&from=${time}&q=${query}`;
+ const response = await got({
+ method: 'get',
+ url: rootUrl,
+ });
+
+ const $ = cheerio.load(response.data);
+
+ $('div.mobile-category-order').remove();
+
+ const list = $('div.work-list div.work-list-item')
+ .slice(0, 5)
+ .map((_, item) => {
+ item = $(item);
+ const a = item.find('a.go-to-work-info').eq(0);
+ return {
+ title: item.find('div.title').text(),
+ link: `https://notefolio.net${a.attr('href')}`,
+ author: item.find('span.go-profile-area').text(),
+ };
+ })
+ .get();
+
+ const items = await Promise.all(
+ list.map(
+ async (item) =>
+ await ctx.cache.tryGet(item.link, async () => {
+ const detailResponse = await got({
+ method: 'get',
+ url: item.link,
+ });
+
+ const content = cheerio.load(detailResponse.data);
+
+ item.description = '';
+
+ content('li.block-image a img').each((_, i) => {
+ i = content(i);
+ item.description += `})
`;
+ });
+
+ content('li.block-video iframe').each((_, i) => {
+ i = content(i);
+ item.description += ``;
+ });
+
+ item.description += `- ${content('li.block-text').html()}
`;
+
+ return item;
+ })
+ )
+ );
+
+ ctx.state.data = {
+ title: `${$('title').text()}`,
+ link: rootUrl,
+ item: items,
+ };
+};
diff --git a/lib/routes/smzdm/ranking.js b/lib/routes/smzdm/ranking.js
index 5a9985db58..e66f54c777 100644
--- a/lib/routes/smzdm/ranking.js
+++ b/lib/routes/smzdm/ranking.js
@@ -1,4 +1,5 @@
const got = require('@/utils/got');
+const date = require('@/utils/date');
module.exports = async (ctx) => {
const { rank_type, rank_id, hour } = ctx.params;
@@ -31,7 +32,7 @@ module.exports = async (ctx) => {
item: list.map((item) => ({
title: `${item.article_title} - ${item.article_price}`,
description: `${item.article_title} - ${item.article_price}
`,
- pubDate: new Date(item.article_pubdate).toUTCString(),
+ pubDate: date(item.article_pubdate, 8),
link: item.article_url,
})),
};
diff --git a/lib/routes/test/index.js b/lib/routes/test/index.js
index cac465b99d..0c76ab6b0b 100644
--- a/lib/routes/test/index.js
+++ b/lib/routes/test/index.js
@@ -126,6 +126,14 @@ module.exports = async (ctx) => {
pubDate: 1546272000000,
author: `DIYgod0`,
});
+ } else if (ctx.params.id === 'opencc') {
+ item.push({
+ title: '小可愛',
+ description: '宇宙無敵',
+ link: `/DIYgod/RSSHub/issues/0`,
+ pubDate: new Date(1546272000000).toUTCString(),
+ author: `DIYgod0`,
+ });
}
for (let i = 1; i < 6; i++) {
diff --git a/lib/routes/thepaper/utils.js b/lib/routes/thepaper/utils.js
index 5b991a3899..9d76f24647 100644
--- a/lib/routes/thepaper/utils.js
+++ b/lib/routes/thepaper/utils.js
@@ -7,12 +7,12 @@ module.exports = {
const res = await got.get(link);
const $ = cheerio.load(res.data);
- const list = $('.t_news').slice(0, 10).get();
+ const list = $('.list_item').slice(0, 10).get();
return await Promise.all(
list.map(async (item) => {
const $ = cheerio.load(item);
- const itemUrlID = $(item).find('.news_tit02 a').attr('href');
+ const itemUrlID = $(item).find('.list_item_title a').attr('href');
const itemUrl = `https://m.thepaper.cn/${itemUrlID}`;
const cache = await ctx.cache.get(itemUrl);
if (cache) {
@@ -25,11 +25,11 @@ module.exports = {
content('.contheight').replaceWith('
');
const single = {
- title: content('h1.t_newsinfo').text(),
+ title: content('.news_video_name').text() || content('.title').text(),
link: itemUrl,
- description: $(content('.news_part_limit div')[0]).html(),
- pubDate: date($(content('.about_news')[1]).text().trim()),
- author: $(content('.about_news')[0]).text(),
+ description: content('#vdetail_sum_p').html() || content('.news_part_limit div').html(),
+ pubDate: date(content('.date').text().trim()),
+ author: content('.author').text(),
};
return Promise.resolve(single);
})
diff --git a/lib/routes/universities/xidian/jwc.js b/lib/routes/universities/xidian/jwc.js
index 8041a99383..cd41edabfc 100644
--- a/lib/routes/universities/xidian/jwc.js
+++ b/lib/routes/universities/xidian/jwc.js
@@ -7,25 +7,41 @@ module.exports = async (ctx) => {
method: 'get',
url: 'https://jwc.xidian.edu.cn',
});
- const arrC = ['信息发布', '通知公告', '教务信息', '教学研究', '教学实践', '招生信息', '质量监控'];
- const arrE = ['xxfb', 'tzgg', 'jwxx', 'jxyj', 'jxsj', 'zsxx', 'zljk'];
+ const arrC = ['教学信息', '教学研究', '实践教学', '质量监控', '通知公告'];
+ const arrE = ['jxxx', 'jxyj', 'sjjx', 'zljk', 'tzgg'];
- const data = response.data;
+ const data = response.body;
const $ = cheerio.load(data);
- const list = $('#__01 > tbody > tr > td:nth-child(2)');
- const titleTables = list.children().filter((index) => index % 2 !== 1);
+ const leftItems = $('div .con2 .fl').children();
+ const rightItems = $('div .con2 .fr').children();
+ const mainItems = $('div .main_right').children();
+ const list = { 0: leftItems[1], 1: leftItems[4], 2: rightItems[1], 3: rightItems[4], 4: mainItems[5] };
const parseTable = (index, item) => {
const title = arrC[index];
- const aTags = $(item).next().find('a');
+ const aTags = $(item).find('a');
return aTags
.map((_, item) => {
item = $(item);
+ let date;
+ if (index === '0' || index === '1') {
+ date = new Date(item.find('span').text()).toUTCString();
+ } else if (index === '4') {
+ const a = item.find('div p').text();
+ const b = item.find('span').text();
+ const c = b + '.' + a;
+ date = new Date(c).toUTCString();
+ } else {
+ const a = item.find('div p').text();
+ const b = item.find('span').text();
+ const c = a + '.' + b;
+ date = new Date(c).toUTCString();
+ }
return {
title: item.attr('title'),
description: title + '
' + item.attr('title') + '
全文内容需使用校园网或VPN获取',
- pubDate: new Date(item.parent().next().text()).toUTCString(),
+ pubDate: date,
link: `https://jwc.xidian.edu.cn/${item.attr('href')}`,
};
})
@@ -33,12 +49,14 @@ module.exports = async (ctx) => {
};
const arrIndex = arrE.indexOf(category);
- let result;
+ let result = new Array();
if (arrIndex === -1) {
- result = titleTables.map(parseTable).get();
+ for (const i in list) {
+ result = result.concat(parseTable(i, list[i]));
+ }
result.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate));
} else {
- result = parseTable(arrIndex, titleTables[arrIndex]);
+ result = parseTable(arrIndex, list[arrIndex]);
}
ctx.state.data = {
diff --git a/lib/routes/wallstreetcn/live.js b/lib/routes/wallstreetcn/live.js
new file mode 100644
index 0000000000..6455fea5d8
--- /dev/null
+++ b/lib/routes/wallstreetcn/live.js
@@ -0,0 +1,44 @@
+const got = require('@/utils/got');
+
+const config = {
+ global: '要闻',
+ 'a-stock': 'A股',
+ 'us-stock': '美股',
+ 'hk-stock': '港股',
+ forex: '外汇',
+ commodity: '商品',
+ financing: '理财',
+};
+
+module.exports = async (ctx) => {
+ ctx.params.channel = ctx.params.channel || 'global';
+
+ const currentUrl = `https://wallstreetcn.com/live/${ctx.params.channel}`;
+ const rootUrl = `https://api.wallstcn.com/apiv1/content/lives?channel=${ctx.params.channel}-channel`;
+ const response = await got({
+ method: 'get',
+ url: rootUrl,
+ });
+
+ const items = response.data.data.items.map((item) => {
+ let title;
+ const match = item.content_text.match(/【(.*)】/);
+ if (match !== null) {
+ title = match[1];
+ } else {
+ title = item.content_text;
+ }
+ return {
+ title,
+ link: `https://wallstreetcn.com/livenews/${item.id}`,
+ pubDate: new Date(item.display_time * 1000).toUTCString(),
+ description: item.content,
+ };
+ });
+
+ ctx.state.data = {
+ title: `${config[ctx.params.channel]} - 实时快讯 - 华尔街见闻`,
+ link: currentUrl,
+ item: items,
+ };
+};
diff --git a/lib/routes/weforum/report.js b/lib/routes/weforum/report.js
new file mode 100644
index 0000000000..69e46f6900
--- /dev/null
+++ b/lib/routes/weforum/report.js
@@ -0,0 +1,53 @@
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+
+module.exports = async (ctx) => {
+ ctx.params.lang = ctx.params.lang || 'www';
+ ctx.params.platform = ctx.params.platform || '';
+ ctx.params.year = ctx.params.year || '';
+
+ const rootUrl = `https://${ctx.params.lang === 'en' ? 'www' : ctx.params.lang}.weforum.org`;
+ const currentUrl = `${rootUrl}/reports?platform=${ctx.params.platform}&year=${ctx.params.year}`;
+ const response = await got({
+ method: 'get',
+ url: currentUrl,
+ });
+
+ const $ = cheerio.load(response.data);
+
+ const list = $('.report-listing-tout__content')
+ .map((_, item) => {
+ item = $(item);
+ return {
+ title: item.find('.report-listing-tout__title').text(),
+ link: `${rootUrl}${item.find('.report-listing-tout__cta').attr('href')}`,
+ description: `Download PDF`,
+ };
+ })
+ .get();
+
+ const items = await Promise.all(
+ list.map(
+ async (item) =>
+ await ctx.cache.tryGet(item.link, async () => {
+ const detailResponse = await got({
+ method: 'get',
+ url: item.link,
+ });
+ const content = cheerio.load(detailResponse.data);
+
+ content('.report__meta').remove();
+
+ item.description += content('.report__display-info').html();
+
+ return item;
+ })
+ )
+ );
+
+ ctx.state.data = {
+ title: $('title').text(),
+ link: currentUrl,
+ item: items,
+ };
+};
diff --git a/lib/routes/youtube/utils.js b/lib/routes/youtube/utils.js
index c796ae8c76..e1bfe5b46a 100644
--- a/lib/routes/youtube/utils.js
+++ b/lib/routes/youtube/utils.js
@@ -1,12 +1,10 @@
const { google } = require('googleapis');
const config = require('@/config').value;
-let getYoutube = () => null;
+let count = 0;
+const youtube = {};
if (config.youtube.key) {
const keys = config.youtube.key.split(',');
- const youtube = {};
- let count = 0;
- let index = -1;
keys.forEach((key, index) => {
if (key) {
@@ -17,44 +15,67 @@ if (config.youtube.key) {
count = index + 1;
}
});
-
- getYoutube = () => {
- index++;
- return youtube[index % count];
- };
}
+let index = -1;
+const exec = async (func) => {
+ let result;
+ for (let i = 0; i < count; i++) {
+ index++;
+ try {
+ // eslint-disable-next-line no-await-in-loop
+ result = await func(youtube[index % count]);
+ break;
+ } catch (error) {
+ // console.error(error);
+ }
+ }
+ return result;
+};
+
const youtubeUtils = {
getPlaylistItems: async (id, part) => {
- const res = await getYoutube().playlistItems.list({
- part,
- playlistId: id,
- maxResults: 50, // youtube api param value default is 5
- });
+ const res = await exec(
+ async (youtube) =>
+ await youtube.playlistItems.list({
+ part,
+ playlistId: id,
+ maxResults: 50, // youtube api param value default is 5
+ })
+ );
return res;
},
getPlaylist: async (id, part, cache) =>
await cache.tryGet('getPlaylist' + id, async () => {
- const res = await getYoutube().playlists.list({
- part,
- id: id,
- });
+ const res = await exec(
+ async (youtube) =>
+ await youtube.playlists.list({
+ part,
+ id: id,
+ })
+ );
return res;
}),
getChannelWithId: async (id, part, cache) =>
await cache.tryGet('getChannelWithId' + id, async () => {
- const res = await getYoutube().channels.list({
- part,
- id: id,
- });
+ const res = await exec(
+ async (youtube) =>
+ await youtube.channels.list({
+ part,
+ id: id,
+ })
+ );
return res;
}),
getChannelWithUsername: async (username, part, cache) =>
await cache.tryGet('getPlaylist' + username, async () => {
- const res = await getYoutube().channels.list({
- part,
- forUsername: username,
- });
+ const res = await exec(
+ async (youtube) =>
+ await youtube.channels.list({
+ part,
+ forUsername: username,
+ })
+ );
return res;
}),
getThumbnail: (thumbnails) => thumbnails.maxres || thumbnails.standard || thumbnails.high || thumbnails.medium || thumbnails.default,
diff --git a/package.json b/package.json
index a3cb6cb02a..c5d6cf663a 100644
--- a/package.json
+++ b/package.json
@@ -34,23 +34,23 @@
},
"homepage": "https://github.com/DIYgod/RSSHub#readme",
"devDependencies": {
- "@types/cheerio": "0.22.21",
+ "@types/cheerio": "0.22.22",
"@types/got": "9.6.11",
"@types/koa": "2.11.4",
- "@vuepress/plugin-back-to-top": "1.5.4",
- "@vuepress/plugin-google-analytics": "1.5.4",
- "@vuepress/plugin-pwa": "1.5.4",
+ "@vuepress/plugin-back-to-top": "1.6.0",
+ "@vuepress/plugin-google-analytics": "1.6.0",
+ "@vuepress/plugin-pwa": "1.6.0",
"cross-env": "7.0.2",
"entities": "2.0.3",
- "eslint": "7.9.0",
- "eslint-config-prettier": "6.11.0",
+ "eslint": "7.10.0",
+ "eslint-config-prettier": "6.12.0",
"eslint-plugin-prettier": "3.1.4",
"jest": "26.4.2",
"mockdate": "3.0.2",
"nock": "13.0.4",
"nodemon": "2.0.4",
"pinyin": "2.9.1",
- "prettier": "2.1.1",
+ "prettier": "2.1.2",
"prettier-check": "2.0.0",
"pretty-quick": "3.0.2",
"remark": "12.0.1",
@@ -59,8 +59,8 @@
"remark-preset-prettier": "0.4.0",
"staged-git-files": "1.2.0",
"string-width": "4.2.0",
- "supertest": "4.0.2",
- "vuepress": "1.5.3",
+ "supertest": "5.0.0",
+ "vuepress": "1.6.0",
"yorkie": "2.0.0"
},
"dependencies": {
@@ -74,13 +74,13 @@
"co-redis": "2.1.1",
"crypto-js": "4.0.0",
"currency-symbol-map": "4.0.4",
- "dayjs": "1.8.36",
+ "dayjs": "1.9.1",
"dotenv": "8.2.0",
"emailjs-imap-client": "3.1.0",
"etag": "1.8.1",
"fanfou-sdk": "4.2.0",
"git-rev-sync": "3.0.1",
- "googleapis": "59.0.0",
+ "googleapis": "60.0.1",
"got": "11.7.0",
"he": "1.2.0",
"hooman": "1.2.6",
@@ -99,11 +99,12 @@
"mailparser": "3.0.0",
"markdown-it": "11.0.1",
"module-alias": "2.2.2",
+ "opencc": "1.1.1",
"parse-torrent": "7.1.3",
"pidusage": "2.0.21",
"plist": "3.0.1",
- "puppeteer": "5.3.0",
- "query-string": "6.13.2",
+ "puppeteer": "5.3.1",
+ "query-string": "6.13.4",
"redis": "3.0.2",
"require-all": "3.0.0",
"rss-parser": "3.9.0",
diff --git a/test/middleware/debug.js b/test/middleware/debug.js
index dfca5f3e6a..5ccd4937b2 100644
--- a/test/middleware/debug.js
+++ b/test/middleware/debug.js
@@ -18,8 +18,9 @@ afterAll(() => {
describe('debug', () => {
it('debug', async () => {
- await request.get('/test/1').set('X-Forwarded-For', '233.233.233.233');
- await request.get('/test/1').set('X-Forwarded-For', '233.233.233.233');
+ const response1 = await request.get('/test/1').set('X-Forwarded-For', '233.233.233.233');
+ const etag = response1.headers.etag;
+ await request.get('/test/1').set('If-None-Match', etag).set('X-Forwarded-For', '233.233.233.233');
await request.get('/test/1').set('X-Forwarded-For', '233.233.233.234');
await request.get('/test/2').set('X-Forwarded-For', '233.233.233.233');
await request.get('/test/2').set('X-Forwarded-For', '233.233.233.234');
@@ -33,28 +34,31 @@ describe('debug', () => {
const key = $(item).find('.debug-key').html().trim();
const value = $(item).find('.debug-value').html().trim();
switch (key) {
- case 'node name:':
+ case 'Node Name:':
expect(value).toBe('mock');
break;
- case 'git hash:':
+ case 'Git Hash:':
expect(value).toBe(gitHash);
break;
- case 'request amount:':
+ case 'Request Amount:':
expect(value).toBe('8');
break;
- case 'hot routes:':
- expect(value).toBe('3 /test/:id
');
+ case 'ETag Matched:':
+ expect(value).toBe('1');
break;
- case 'hot paths:':
+ case 'Hot Routes:':
+ expect(value).toBe('7 /test/:id
');
+ break;
+ case 'Hot Paths:':
expect(value).toBe('3 /test/1
2 /test/2
2 /test/empty
1 /
');
break;
- case 'hot IP:':
+ case 'Hot IP:':
expect(value).toBe('5 233.233.233.233
3 233.233.233.234
');
break;
- case 'hot error routes:':
- expect(value).toBe('1 /test/:id
');
+ case 'Hot Error Routes:':
+ expect(value).toBe('2 /test/:id
');
break;
- case 'hot error paths:':
+ case 'Hot Error Paths:':
expect(value).toBe('2 /test/empty
');
break;
}
diff --git a/test/middleware/header.js b/test/middleware/header.js
index 3e19a802e5..1e206f5f9c 100644
--- a/test/middleware/header.js
+++ b/test/middleware/header.js
@@ -5,6 +5,7 @@ jest.mock('request-promise-native');
const server = require('../../lib/index');
const request = supertest(server);
const config = require('../../lib/config').value;
+let etag;
afterAll(() => {
server.close();
@@ -19,5 +20,14 @@ describe('header', () => {
expect(response.headers['cache-control']).toBe(`public, max-age=${config.cache.routeExpire}`);
expect(response.headers['last-modified']).toBe(response.text.match(/(.*)<\/lastBuildDate>/)[1]);
expect(response.headers['rsshub-node']).toBe('mock');
+ expect(response.headers.etag).not.toBe(undefined);
+ etag = response.headers.etag;
+ });
+
+ it(`etag`, async () => {
+ const response = await request.get('/test/1').set('If-None-Match', etag);
+ expect(response.status).toBe(304);
+ expect(response.text).toBe('');
+ expect(response.headers['last-modified']).toBe(undefined);
});
});
diff --git a/test/middleware/parameter.js b/test/middleware/parameter.js
index c9563198e1..f3fe9dcfaa 100644
--- a/test/middleware/parameter.js
+++ b/test/middleware/parameter.js
@@ -301,3 +301,12 @@ describe('mess parameter', () => {
expect(parsed.items[0].link).toBe('https://github.com/DIYgod/RSSHub/issues/0');
});
});
+
+describe('opencc', () => {
+ it(`opencc`, async () => {
+ const response = await request.get('/test/opencc?opencc=t2s');
+ const parsed = await parser.parseString(response.text);
+ expect(parsed.items[0].title).toBe('小可爱');
+ expect(parsed.items[0].content).toBe('宇宙无敌');
+ });
+});
diff --git a/yarn.lock b/yarn.lock
index 3c88c00ba1..1590e3b88c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1525,10 +1525,10 @@
"@types/node" "*"
"@types/responselike" "*"
-"@types/cheerio@0.22.21":
- version "0.22.21"
- resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.21.tgz#5e37887de309ba11b2e19a6e14cad7874b31a8a3"
- integrity sha512-aGI3DfswwqgKPiEOTaiHV2ZPC9KEhprpgEbJnv0fZl3SGX0cGgEva1126dGrMC6AJM6v/aihlUgJn9M5DbDZ/Q==
+"@types/cheerio@0.22.22":
+ version "0.22.22"
+ resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.22.tgz#ae71cf4ca59b8bbaf34c99af7a5d6c8894988f5f"
+ integrity sha512-05DYX4zU96IBfZFY+t3Mh88nlwSMtmmzSYaQkKN48T495VV1dkHSah6qYyDTN5ngaS0i0VonH37m+RuzSM0YiA==
dependencies:
"@types/node" "*"
@@ -1856,18 +1856,18 @@
source-map "~0.6.1"
vue-template-es2015-compiler "^1.9.0"
-"@vuepress/core@1.5.3":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@vuepress/core/-/core-1.5.3.tgz#e48728a26a60b21673c7b8f1f7377c03fb17e34f"
- integrity sha512-ZZpDkYVtztN2eWZ5+oj5DoGMEQdV9Bz4et0doKhLXfIEQFwjWUyN6HHnIgqjnmSFIqfjzbWdOKVxMLENs8njpA==
+"@vuepress/core@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/core/-/core-1.6.0.tgz#8abca498cd8c589dd621be5d5b1c9c805dfed3fd"
+ integrity sha512-zce6xMB77pk4g44CHYE75cBuJpa3lmLPujknymH0sD1LKkSrlkgH04x+LGhu98bVU/hiS0xjV3jDs3X37Texbw==
dependencies:
"@babel/core" "^7.8.4"
"@vue/babel-preset-app" "^4.1.2"
- "@vuepress/markdown" "1.5.3"
- "@vuepress/markdown-loader" "1.5.3"
- "@vuepress/plugin-last-updated" "1.5.3"
- "@vuepress/plugin-register-components" "1.5.3"
- "@vuepress/shared-utils" "1.5.3"
+ "@vuepress/markdown" "1.6.0"
+ "@vuepress/markdown-loader" "1.6.0"
+ "@vuepress/plugin-last-updated" "1.6.0"
+ "@vuepress/plugin-register-components" "1.6.0"
+ "@vuepress/shared-utils" "1.6.0"
autoprefixer "^9.5.1"
babel-loader "^8.0.4"
cache-loader "^3.0.0"
@@ -1900,21 +1900,21 @@
webpack-merge "^4.1.2"
webpackbar "3.2.0"
-"@vuepress/markdown-loader@1.5.3":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@vuepress/markdown-loader/-/markdown-loader-1.5.3.tgz#3d0eec1d37318b71029f051525f0bff3bc36647d"
- integrity sha512-Y1FLkEZw1p84gPer14CjA1gPSdmc/bfPuZ/7mE0dqBtpsU3o9suaubWpFs75agjHew4IJap5TibtUs57FWGSfA==
+"@vuepress/markdown-loader@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/markdown-loader/-/markdown-loader-1.6.0.tgz#5a666c5b01c01181a3c0802ceed5a2b96577d9c7"
+ integrity sha512-7cYD9+td89u0EePoHw+nVwxCoafYvpP10r6RfdN3Ongvd2apyn37Mjjv+85U1jnSTRvjZHV4v7KFs4H8+Y0xiw==
dependencies:
- "@vuepress/markdown" "1.5.3"
+ "@vuepress/markdown" "1.6.0"
loader-utils "^1.1.0"
lru-cache "^5.1.1"
-"@vuepress/markdown@1.5.3":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@vuepress/markdown/-/markdown-1.5.3.tgz#90807f0366ebdde8380b27f249396cffe9c5d300"
- integrity sha512-TI6pSkmvu8SZhIfZR0VbDmmGAWOaoI+zIaXMDY27ex7Ty/KQ/JIsVSgr5wbiSJMhkA0efbZzAVFu1NrHIc1waw==
+"@vuepress/markdown@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/markdown/-/markdown-1.6.0.tgz#6702a1938b5d5308919261ffcc5c369eabfa6694"
+ integrity sha512-niFP+mKbEPu82OkkYf+dZMd8cWYfKEeIFq2jrQCJcVnCuSGVmJbKJbQF+cP/iu+94RHFVUtKwsh4X3Ef/1PLXw==
dependencies:
- "@vuepress/shared-utils" "1.5.3"
+ "@vuepress/shared-utils" "1.6.0"
markdown-it "^8.4.1"
markdown-it-anchor "^5.0.2"
markdown-it-chain "^1.3.0"
@@ -1922,80 +1922,64 @@
markdown-it-table-of-contents "^0.4.0"
prismjs "^1.13.0"
-"@vuepress/plugin-active-header-links@1.5.3":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.5.3.tgz#736f51a3aab126b6a003d896d3d77254b656a76e"
- integrity sha512-x9U3bVkwwUkfXtf7db1Gg/m32UGpSWRurdl9I5ePFFxwEy8ffGmvhpzCBL878q8TNa90jd1XueQJCq6hQ9/KsQ==
+"@vuepress/plugin-active-header-links@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.6.0.tgz#7d94db2e34a0b4af10b93171f56e7efc3bb7bd40"
+ integrity sha512-AsbUptcwtBJtlvrcDyiW2HZAHz/tLoYXrGopJVPtWUZ9LzNIcXuSFVIRzKd1Jc+86VPUYLeDhLBIWe0rfsphAQ==
dependencies:
lodash.debounce "^4.0.8"
-"@vuepress/plugin-back-to-top@1.5.4":
- version "1.5.4"
- resolved "https://registry.yarnpkg.com/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.5.4.tgz#f7904e1220fcd1cb457a819a6bf963b55c584bea"
- integrity sha512-FqT3F8VztSiDXtI7xjD4SOeEuyaPYx2zxxU3cH3wfe/amlFWyFPjTWJwAf1GRT5CqS13J2qfEnfWMU/Ct7Xg/Q==
+"@vuepress/plugin-back-to-top@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.6.0.tgz#a10df98b7a4f57c627f72289cd0ab2ff0f075a1d"
+ integrity sha512-nJr/qlBcCN8vUyAb3nZPKqBS1DjfgZJquroOOd41CcLgsq3yAxmWLmxbLjg1MoBxk1Q8TrWz8qI7JRIw7W4aVw==
dependencies:
lodash.debounce "^4.0.8"
-"@vuepress/plugin-google-analytics@1.5.4":
- version "1.5.4"
- resolved "https://registry.yarnpkg.com/@vuepress/plugin-google-analytics/-/plugin-google-analytics-1.5.4.tgz#43dff0a84b18b21ea597f3d97281c40d754a5083"
- integrity sha512-JVmIPBqKNiOVvow+XAZE+jgGvIRMBVxZOpKb5HBQ0xwz/E81Opl7cxdX9VkPKX+i9VoRBPWEiD/874RivzbW1g==
+"@vuepress/plugin-google-analytics@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/plugin-google-analytics/-/plugin-google-analytics-1.6.0.tgz#1a3960259556016b668276ab00417f1c96ddf4bd"
+ integrity sha512-CPRTQsq6KnZEb4SEB/6KdXHFKGvKdsg0GWtSYpLTbF/aUETVRUVJsqR7i/tLWgtyB8qFMwzPUiTc7KlEFjvYyg==
-"@vuepress/plugin-last-updated@1.5.3":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@vuepress/plugin-last-updated/-/plugin-last-updated-1.5.3.tgz#1f2dcc653d3b829d65094433395f9a92642eb301"
- integrity sha512-xb4FXSRTTPrERX2DigGDAJrVFLsTQwsY4QSzRBFYSlfZkK3gcZMNmUISXS/4tDkyPgxh/TtcMwbcUiUu0LQOnQ==
+"@vuepress/plugin-last-updated@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/plugin-last-updated/-/plugin-last-updated-1.6.0.tgz#9c27739b87adc908b1fbb90f96b3456065c20f08"
+ integrity sha512-/gnk9HGaZw3ow/i9ODjZxK40TbriTWuMY3YYIzqvP7CT3mrM92nMKYDygYbffbu6xkWdUZppN8JadtJ7we4z9A==
dependencies:
cross-spawn "^6.0.5"
-"@vuepress/plugin-nprogress@1.5.3":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@vuepress/plugin-nprogress/-/plugin-nprogress-1.5.3.tgz#01c699739ecfe94569986ff838665dcb30e6cb05"
- integrity sha512-SBa4uoRBaBPF+TrN38y/eFSnj1c2a53EuyY+vYijrWq5+nmDCQkpoClpS4a90f2eG2shMIvsMxUsS8waMKFZ8w==
+"@vuepress/plugin-nprogress@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/plugin-nprogress/-/plugin-nprogress-1.6.0.tgz#7c93a3ed233ef8cc21b689d54f518902502e064c"
+ integrity sha512-dhIho2z33aGjPavcdVYRlqR3+ZC5Vd3FPd+HkRP8MdIIFxhVR1HLFxVgaSUcASOCGAwuG58OB2RStvgMQLtTEA==
dependencies:
nprogress "^0.2.0"
-"@vuepress/plugin-pwa@1.5.4":
- version "1.5.4"
- resolved "https://registry.yarnpkg.com/@vuepress/plugin-pwa/-/plugin-pwa-1.5.4.tgz#97fe6d917f8815cdea7a8025e065c5a08480cd94"
- integrity sha512-d3XWS0Zbae1c6IDU64BpIAIr78A7kTZTA7qkqk1H5sbO1SqlXMWQVMsiFZuraxiEY2uDc0N5j3Yr4Kkmo+0o0w==
+"@vuepress/plugin-pwa@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/plugin-pwa/-/plugin-pwa-1.6.0.tgz#4de907286cf5afc6e8ced03625ec7ed66a7c2310"
+ integrity sha512-8Y3KnbEtprolA83AGBcRdzVs64+ZjQRGWaRWAeEZIsWl1gNuwcMT+voS69IpbqMUH7cw8v/KDQdIJkEjvOBe0w==
dependencies:
- "@vuepress/shared-utils" "1.5.4"
+ "@vuepress/shared-utils" "1.6.0"
register-service-worker "^1.7.0"
workbox-build "^4.3.1"
-"@vuepress/plugin-register-components@1.5.3":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@vuepress/plugin-register-components/-/plugin-register-components-1.5.3.tgz#70e28460475e42b43435c6647ace537129116fb1"
- integrity sha512-OzL7QOKhR+biUWrDqPisQz35cXVdI274cDWw2tTUTw3yr7aPyezDw3DFRFXzPaZzk9Jo+d+kkOTwghXXC88Xbg==
+"@vuepress/plugin-register-components@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/plugin-register-components/-/plugin-register-components-1.6.0.tgz#bdf7271a38edffa83d48ab82210489f4fc6343e8"
+ integrity sha512-w9Lafh1G3514rulpjSoIfZXt94wZ5oMkpXyVzXyC2wRHqSu/4fKpcxhwxf6HeT57jIBdPifT+eUrL+XIZWnXLQ==
dependencies:
- "@vuepress/shared-utils" "1.5.3"
+ "@vuepress/shared-utils" "1.6.0"
-"@vuepress/plugin-search@1.5.3":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@vuepress/plugin-search/-/plugin-search-1.5.3.tgz#c2a93fceab3830e4f07ba6ac68e3bfc27c7d908d"
- integrity sha512-LCqqgKQ1I26oWE3N5OKeZMV0xtWv2WURI+bhxirM1xL0OpCQyqwk/rLHWBto+j4Y0ScxgXiRxa9Zs2E6eY6Dnw==
+"@vuepress/plugin-search@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/plugin-search/-/plugin-search-1.6.0.tgz#a064f638a8f30485859b871047deaf9194ffc886"
+ integrity sha512-Js7zRmM6/b6dYfnJsSP2MQN0lzjUfSX8l3z9y/QHxK8BaXIx7LdTcQY6FGK4pxuwlWcg02CIUS5BMc1gZKn6Nw==
-"@vuepress/shared-utils@1.5.3":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@vuepress/shared-utils/-/shared-utils-1.5.3.tgz#071bb68c3ec0dfb5f3939c14d3a8795a03617ad4"
- integrity sha512-/eTSADRZ0Iz1REnIkQ1ouoWY0ZH9ivH6IuGT19H/WBe8gru2EoK7jUqpXE8JHcGf6pxkK3qB4E/DNCO9Cyy4yg==
- dependencies:
- chalk "^2.3.2"
- diacritics "^1.3.0"
- escape-html "^1.0.3"
- fs-extra "^7.0.1"
- globby "^9.2.0"
- gray-matter "^4.0.1"
- hash-sum "^1.0.2"
- semver "^6.0.0"
- toml "^3.0.0"
- upath "^1.1.0"
-
-"@vuepress/shared-utils@1.5.4":
- version "1.5.4"
- resolved "https://registry.yarnpkg.com/@vuepress/shared-utils/-/shared-utils-1.5.4.tgz#d2c8693b8cd354d3a13a76f8f4259335e5540099"
- integrity sha512-HCeMPEAPjFN1Ongii0BUCI1iB4gBBiQ4PUgh7F4IGG8yBg4tMqWO4NHqCuDCuGEvK7lgHy8veto0SsSvdSKp3g==
+"@vuepress/shared-utils@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/shared-utils/-/shared-utils-1.6.0.tgz#8bf0c9c4e502bc6f10e70db3b236e816d8165631"
+ integrity sha512-+TMHgW7gmVY2lRX5qpPbsLkbxTBbzRo+Ar05tvEI0bAG0c6v2gWyQr3BchdbLyRJxrAVk530PABAjM8roDJ9bw==
dependencies:
chalk "^2.3.2"
escape-html "^1.0.3"
@@ -2007,17 +1991,17 @@
toml "^3.0.0"
upath "^1.1.0"
-"@vuepress/theme-default@1.5.3":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@vuepress/theme-default/-/theme-default-1.5.3.tgz#98112065b3c987d41463eca5db91a47dce823e45"
- integrity sha512-LRldV8U4FRV26bKXtJFT1oe5lhYbfCxPRFnRXPgf/cLZC+mQd1abl9njCAP7fjmmS33ZgF1dFARGbpCsYWY1Gg==
+"@vuepress/theme-default@1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@vuepress/theme-default/-/theme-default-1.6.0.tgz#870c4513a186ae233d2c818fb8bef753f35da972"
+ integrity sha512-dV6awQzV+gQqxYK8oHY5A9Hwj34H23bA2khPjqqLDpgLMnw4tvxMfriwK5tuaAjgnHT+MZB1VmgsNdUA9T9HIQ==
dependencies:
- "@vuepress/plugin-active-header-links" "1.5.3"
- "@vuepress/plugin-nprogress" "1.5.3"
- "@vuepress/plugin-search" "1.5.3"
+ "@vuepress/plugin-active-header-links" "1.6.0"
+ "@vuepress/plugin-nprogress" "1.6.0"
+ "@vuepress/plugin-search" "1.6.0"
docsearch.js "^2.5.2"
lodash "^4.17.15"
- stylus "^0.54.5"
+ stylus "^0.54.8"
stylus-loader "^3.0.2"
vuepress-plugin-container "^2.0.2"
vuepress-plugin-smooth-scroll "^0.0.3"
@@ -2327,11 +2311,6 @@ alphanum-sort@^1.0.0:
resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
-amdefine@>=0.0.4:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
- integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
-
ansi-align@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
@@ -2584,7 +2563,7 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
-atob@^2.1.1:
+atob@^2.1.1, atob@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
@@ -3630,7 +3609,7 @@ commondir@^1.0.1:
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
-component-emitter@^1.2.0, component-emitter@^1.2.1:
+component-emitter@^1.2.1, component-emitter@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
@@ -3757,7 +3736,7 @@ cookie@^0.4.1:
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
-cookiejar@^2.1.0:
+cookiejar@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
@@ -3972,10 +3951,12 @@ css-loader@^2.1.1:
postcss-value-parser "^3.3.0"
schema-utils "^1.0.0"
-css-parse@1.7.x:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b"
- integrity sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=
+css-parse@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4"
+ integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=
+ dependencies:
+ css "^2.0.0"
css-select-base-adapter@^0.1.1:
version "0.1.1"
@@ -4033,6 +4014,16 @@ css-what@2.1, css-what@^2.1.2:
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
+css@^2.0.0:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
+ integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
+ dependencies:
+ inherits "^2.0.3"
+ source-map "^0.6.1"
+ source-map-resolve "^0.5.2"
+ urix "^0.1.0"
+
cssesc@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703"
@@ -4182,23 +4173,16 @@ date-now@^0.1.4:
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
-dayjs@1.8.36, dayjs@^1.8.29:
- version "1.8.36"
- resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.36.tgz#be36e248467afabf8f5a86bae0de0cdceecced50"
- integrity sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==
+dayjs@1.9.1, dayjs@^1.8.29:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.9.1.tgz#201a755f7db5103ed6de63ba93a984141c754541"
+ integrity sha512-01NCTBg8cuMJG1OQc6PR7T66+AFYiPwgDvdJmvJBn29NGzIG+DIFxPLNjHzwz3cpFIvG+NcwIjP9hSaPVoOaDg==
de-indent@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=
-debug@*, debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
- integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
- dependencies:
- ms "^2.1.1"
-
debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@@ -4206,7 +4190,14 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
dependencies:
ms "2.0.0"
-debug@^3.1.0, debug@^3.2.5, debug@^3.2.6:
+debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+ integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^3.2.5, debug@^3.2.6:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
@@ -4416,11 +4407,6 @@ devtools-protocol@0.0.799653:
resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.799653.tgz#86fc95ce5bf4fdf4b77a58047ba9d2301078f119"
integrity sha512-t1CcaZbvm8pOlikqrsIM9GOa7Ipp07+4h/q9u0JXBWjPCjHdBl9KkddX87Vv9vBHoBGtwV79sYQNGnQM6iS5gg==
-diacritics@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/diacritics/-/diacritics-1.3.0.tgz#3efa87323ebb863e6696cebb0082d48ff3d6f7a1"
- integrity sha1-PvqHMj67hj5mls67AILUj/PW96E=
-
diff-sequences@^26.3.0:
version "26.3.0"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.3.0.tgz#62a59b1b29ab7fd27cef2a33ae52abe73042d0a2"
@@ -4878,10 +4864,10 @@ escodegen@^1.14.1, escodegen@^1.8.1, escodegen@^1.9.1:
optionalDependencies:
source-map "~0.6.1"
-eslint-config-prettier@6.11.0:
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1"
- integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==
+eslint-config-prettier@6.12.0:
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.12.0.tgz#9eb2bccff727db1c52104f0b49e87ea46605a0d2"
+ integrity sha512-9jWPlFlgNwRUYVoujvWTQ1aMO8o6648r+K7qU7K5Jmkbyqav1fuEZC0COYpGBxyiAJb65Ra9hrmFx19xRGwXWw==
dependencies:
get-stdin "^6.0.0"
@@ -4900,12 +4886,12 @@ eslint-scope@^4.0.0:
esrecurse "^4.1.0"
estraverse "^4.1.1"
-eslint-scope@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5"
- integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==
+eslint-scope@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
dependencies:
- esrecurse "^4.1.0"
+ esrecurse "^4.3.0"
estraverse "^4.1.1"
eslint-utils@^2.1.0:
@@ -4920,10 +4906,10 @@ eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
-eslint@7.9.0:
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.9.0.tgz#522aeccc5c3a19017cf0cb46ebfd660a79acf337"
- integrity sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==
+eslint@7.10.0:
+ version "7.10.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.10.0.tgz#494edb3e4750fb791133ca379e786a8f648c72b9"
+ integrity sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA==
dependencies:
"@babel/code-frame" "^7.0.0"
"@eslint/eslintrc" "^0.1.3"
@@ -4933,7 +4919,7 @@ eslint@7.9.0:
debug "^4.0.1"
doctrine "^3.0.0"
enquirer "^2.3.5"
- eslint-scope "^5.1.0"
+ eslint-scope "^5.1.1"
eslint-utils "^2.1.0"
eslint-visitor-keys "^1.3.0"
espree "^7.3.0"
@@ -4991,6 +4977,13 @@ esrecurse@^4.1.0:
dependencies:
estraverse "^4.1.0"
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
@@ -5001,6 +4994,11 @@ estraverse@^5.1.0:
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
+estraverse@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880"
+ integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==
+
esutils@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
@@ -5275,6 +5273,11 @@ fast-safe-stringify@^2.0.4:
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2"
integrity sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==
+fast-safe-stringify@^2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
+ integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==
+
fast-text-encoding@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz#3e5ce8293409cfaa7177a71b9ca84e1b1e6f25ef"
@@ -5448,7 +5451,7 @@ forever-agent@~0.6.1:
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
-form-data@^2.3.1, form-data@^2.5.0:
+form-data@^2.5.0:
version "2.5.1"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4"
integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==
@@ -5480,10 +5483,10 @@ format@^0.2.0:
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
-formidable@^1.2.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659"
- integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==
+formidable@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9"
+ integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==
forwarded@~0.1.2:
version "0.1.2"
@@ -5701,18 +5704,6 @@ glob-to-regexp@^0.3.0:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
-glob@7.0.x:
- version "7.0.6"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
- integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.2"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3:
version "7.1.4"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
@@ -5725,7 +5716,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^7.1.4:
+glob@^7.1.4, glob@^7.1.6:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@@ -5842,10 +5833,10 @@ googleapis-common@^4.4.0:
url-template "^2.0.8"
uuid "^8.0.0"
-googleapis@59.0.0:
- version "59.0.0"
- resolved "https://registry.yarnpkg.com/googleapis/-/googleapis-59.0.0.tgz#aec5c6f5b0b347c9c6996d45fa8ad8176e585fae"
- integrity sha512-GV/E4KRN89a4GxSk7D7cwUfRYgcJHR05sOgm/WGdwc/u8dxNXG5lWmz9gF5ZwFGk2yKtVxL4VZNn4zBuZ6rmGg==
+googleapis@60.0.1:
+ version "60.0.1"
+ resolved "https://registry.yarnpkg.com/googleapis/-/googleapis-60.0.1.tgz#f0614cbf798e1308ef6e7dd6b7cbf3c464692975"
+ integrity sha512-r/7pDeIMAm/FepbAl2iM+uRQURf2manjOaOVR0j7v2fDPU8QEme44z6N6qGroqJtne0JO5BM0FUz4LuskcwGeQ==
dependencies:
google-auth-library "^6.0.0"
googleapis-common "^4.4.0"
@@ -8272,7 +8263,7 @@ merge2@^1.2.3:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5"
integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==
-methods@^1.1.1, methods@^1.1.2, methods@~1.1.2:
+methods@1.1.2, methods@^1.1.2, methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
@@ -8329,7 +8320,7 @@ mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.17, mime-types@~2.1.19,
dependencies:
mime-db "1.43.0"
-mime@1.6.0, mime@^1.3.4, mime@^1.4.1:
+mime@1.6.0, mime@^1.3.4:
version "1.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
@@ -8339,6 +8330,11 @@ mime@^2.0.3, mime@^2.2.0, mime@^2.4.2:
resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5"
integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==
+mime@^2.4.6:
+ version "2.4.6"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1"
+ integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==
+
mimic-fn@^2.0.0, mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
@@ -8386,7 +8382,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
-minimatch@^3.0.2, minimatch@^3.0.4:
+minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -8467,6 +8463,11 @@ mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
dependencies:
minimist "0.0.8"
+mkdirp@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
mockdate@3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-3.0.2.tgz#a5a7bb5820da617747af424d7a4dcb22c6c03d79"
@@ -8564,6 +8565,11 @@ nan@^2.12.1, nan@^2.14.0:
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
+nan@^2.14.1:
+ version "2.14.1"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
+ integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
+
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@@ -9022,6 +9028,14 @@ only@~0.0.2:
resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=
+opencc@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/opencc/-/opencc-1.1.1.tgz#94776e515ef13b23e00065caa04a69e9529d460e"
+ integrity sha512-t/4FIL43esdrUDfQejqHPhZyWdDVRfwMxsNBkA/2NjIEQv33mG80WHXcmEJ+KMd6T8bjbtx+EiJzPiybE8SPeg==
+ dependencies:
+ nan "^2.14.1"
+ node-pre-gyp "^0.14.0"
+
opencollective-postinstall@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89"
@@ -9903,10 +9917,10 @@ prettier@1.16.3:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d"
integrity sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==
-prettier@2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.1.tgz#d9485dd5e499daa6cb547023b87a6cf51bee37d6"
- integrity sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw==
+prettier@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5"
+ integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==
pretty-bytes@^5.1.0:
version "5.2.0"
@@ -10088,16 +10102,15 @@ punycode@^2.1.0, punycode@^2.1.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-puppeteer@5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-5.3.0.tgz#0abf83d0f2d1273baf2b56885a813f8052903e33"
- integrity sha512-GjqMk5GRro3TO0sw3QMsF1H7n+/jaK2OW45qMvqjYUyJ7y4oA//9auy969HHhTG3HZXaMxY/NWXF/NXlAFIvtw==
+puppeteer@5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-5.3.1.tgz#324e190d89f25ac33dba539f57b82a18553f8646"
+ integrity sha512-YTM1RaBeYrj6n7IlRXRYLqJHF+GM7tasbvrNFx6w1S16G76NrPq7oYFKLDO+BQsXNtS8kW2GxWCXjIMPvfDyaQ==
dependencies:
debug "^4.1.0"
devtools-protocol "0.0.799653"
extract-zip "^2.0.0"
https-proxy-agent "^4.0.0"
- mime "^2.0.3"
pkg-dir "^4.2.0"
progress "^2.0.1"
proxy-from-env "^1.0.0"
@@ -10111,7 +10124,7 @@ q@^1.1.2:
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
-qs@6.7.0, qs@^6.5.1:
+qs@6.7.0:
version "6.7.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
@@ -10121,15 +10134,20 @@ qs@^6.7.0:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9"
integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==
+qs@^6.9.4:
+ version "6.9.4"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
+ integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==
+
qs@~6.5.2:
version "6.5.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
-query-string@6.13.2, query-string@^6.2.0:
- version "6.13.2"
- resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.2.tgz#3585aa9412c957cbd358fd5eaca7466f05586dda"
- integrity sha512-BMmDaUiLDFU1hlM38jTFcRt7HYiGP/zt1sRzrIWm5zpeEuO1rkbPS0ELI3uehoLuuhHDCS8u8lhFN3fEN4JzPQ==
+query-string@6.13.4, query-string@^6.2.0:
+ version "6.13.4"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.4.tgz#b35a9a3bd4955bce55f94feb0e819b3d0be6f66f"
+ integrity sha512-E2NPIeJoBEJGQNy3ib1k/Z/OkDBUKIo8IV2ZVwbKfoa65IS9unqWWUlLcbfU70Da0qNoxUZZA8CfKUjKLE641Q==
dependencies:
decode-uri-component "^0.2.0"
split-on-first "^1.0.0"
@@ -10243,7 +10261,7 @@ read-pkg@^5.2.0:
parse-json "^5.0.0"
type-fest "^0.6.0"
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@^2.3.7, readable-stream@~2.3.6:
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@^2.3.7, readable-stream@~2.3.6:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
@@ -10256,7 +10274,7 @@ read-pkg@^5.2.0:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
-readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0:
+readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -10750,7 +10768,7 @@ safe-regex@^1.1.0:
dependencies:
ret "~0.1.10"
-"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@@ -10770,11 +10788,6 @@ sane@^4.0.3:
minimist "^1.1.1"
walker "~1.0.5"
-sax@0.5.x:
- version "0.5.8"
- resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
- integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=
-
sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
@@ -11144,6 +11157,17 @@ source-map-resolve@^0.5.0:
source-map-url "^0.4.0"
urix "^0.1.0"
+source-map-resolve@^0.5.2:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
source-map-support@^0.5.6, source-map-support@~0.5.10:
version "0.5.12"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599"
@@ -11157,13 +11181,6 @@ source-map-url@^0.4.0:
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
-source-map@0.1.x:
- version "0.1.43"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
- integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=
- dependencies:
- amdefine ">=0.0.4"
-
source-map@0.5.6:
version "0.5.6"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
@@ -11565,41 +11582,44 @@ stylus-loader@^3.0.2:
lodash.clonedeep "^4.5.0"
when "~3.6.x"
-stylus@^0.54.5:
- version "0.54.5"
- resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79"
- integrity sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=
+stylus@^0.54.8:
+ version "0.54.8"
+ resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.8.tgz#3da3e65966bc567a7b044bfe0eece653e099d147"
+ integrity sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==
dependencies:
- css-parse "1.7.x"
- debug "*"
- glob "7.0.x"
- mkdirp "0.5.x"
- sax "0.5.x"
- source-map "0.1.x"
+ css-parse "~2.0.0"
+ debug "~3.1.0"
+ glob "^7.1.6"
+ mkdirp "~1.0.4"
+ safer-buffer "^2.1.2"
+ sax "~1.2.4"
+ semver "^6.3.0"
+ source-map "^0.7.3"
-superagent@^3.8.3:
- version "3.8.3"
- resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128"
- integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==
- dependencies:
- component-emitter "^1.2.0"
- cookiejar "^2.1.0"
- debug "^3.1.0"
- extend "^3.0.0"
- form-data "^2.3.1"
- formidable "^1.2.0"
- methods "^1.1.1"
- mime "^1.4.1"
- qs "^6.5.1"
- readable-stream "^2.3.5"
-
-supertest@4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/supertest/-/supertest-4.0.2.tgz#c2234dbdd6dc79b6f15b99c8d6577b90e4ce3f36"
- integrity sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==
+superagent@6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/superagent/-/superagent-6.1.0.tgz#09f08807bc41108ef164cfb4be293cebd480f4a6"
+ integrity sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==
dependencies:
+ component-emitter "^1.3.0"
+ cookiejar "^2.1.2"
+ debug "^4.1.1"
+ fast-safe-stringify "^2.0.7"
+ form-data "^3.0.0"
+ formidable "^1.2.2"
methods "^1.1.2"
- superagent "^3.8.3"
+ mime "^2.4.6"
+ qs "^6.9.4"
+ readable-stream "^3.6.0"
+ semver "^7.3.2"
+
+supertest@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/supertest/-/supertest-5.0.0.tgz#771aedfeb0a95466cc5d100d5d11288736fd25da"
+ integrity sha512-2JAWpPrUOZF4hHH5ZTCN2xjKXvJS3AEwPNXl0HUseHsfcXFvMy9kcsufIHCNAmQ5hlGCvgeAqaR5PBEouN3hlQ==
+ dependencies:
+ methods "1.1.2"
+ superagent "6.1.0"
supports-color@^2.0.0:
version "2.0.0"
@@ -12599,13 +12619,13 @@ vuepress-plugin-smooth-scroll@^0.0.3:
dependencies:
smoothscroll-polyfill "^0.4.3"
-vuepress@1.5.3:
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/vuepress/-/vuepress-1.5.3.tgz#663a1041240a0c182f58316ba567a22b8df932a4"
- integrity sha512-H9bGu6ygrZmq8GxMtDD8xNX1l9zvoyjsOA9oW+Lcttkfyt/HT/WBrpIC08kNPpRE0ZY/U4Jib1KgBfjbFZTffw==
+vuepress@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/vuepress/-/vuepress-1.6.0.tgz#00e6f1649d992f4cfef80a2e3f7af8683acc6ad9"
+ integrity sha512-5hxhkgMROjo6ja59oyrHeiOv6xpq1sy86ejaWgevMWiMbBIZU+9grwrd+PSL6q4rwfsi/a8NqYzcBXV/ZSXWZA==
dependencies:
- "@vuepress/core" "1.5.3"
- "@vuepress/theme-default" "1.5.3"
+ "@vuepress/core" "1.6.0"
+ "@vuepress/theme-default" "1.6.0"
cac "^6.5.6"
envinfo "^7.2.0"
opencollective-postinstall "^2.0.2"