rssany 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/.env.example +52 -0
  2. package/README.md +196 -0
  3. package/bin/rssany.js +6 -0
  4. package/config.examples.json +11 -0
  5. package/dist/index.js +4037 -0
  6. package/dist/index.js.map +1 -0
  7. package/package.json +98 -0
  8. package/plugins/sources/email.rssany.js +96 -0
  9. package/plugins/sources/rss.rssany.js +83 -0
  10. package/plugins/templates/site.rssany.js +26 -0
  11. package/scripts/reset.mjs +136 -0
  12. package/sources.example.json +562 -0
  13. package/statics/401.html +56 -0
  14. package/statics/404.html +12 -0
  15. package/statics/README.md +7 -0
  16. package/statics/image.png +0 -0
  17. package/webui/build/200.html +51 -0
  18. package/webui/build/_app/env.js +1 -0
  19. package/webui/build/_app/immutable/assets/0.BUAXpTm6.css +1 -0
  20. package/webui/build/_app/immutable/assets/10.I1OuCLrU.css +1 -0
  21. package/webui/build/_app/immutable/assets/11.CrO9xaki.css +1 -0
  22. package/webui/build/_app/immutable/assets/12.BEi6fInA.css +1 -0
  23. package/webui/build/_app/immutable/assets/14.Ctlgn1LZ.css +1 -0
  24. package/webui/build/_app/immutable/assets/2.eJ80XOGm.css +1 -0
  25. package/webui/build/_app/immutable/assets/4.B8-jYAVj.css +1 -0
  26. package/webui/build/_app/immutable/assets/5.ClehBQ0g.css +1 -0
  27. package/webui/build/_app/immutable/assets/6.Drn-0DON.css +1 -0
  28. package/webui/build/_app/immutable/assets/7.ms2diq_q.css +1 -0
  29. package/webui/build/_app/immutable/assets/8.DKymkjjs.css +1 -0
  30. package/webui/build/_app/immutable/assets/9.BZheTlzZ.css +1 -0
  31. package/webui/build/_app/immutable/assets/SourcesList.BhtYlRsQ.css +1 -0
  32. package/webui/build/_app/immutable/chunks/BUApaBEI.js +1 -0
  33. package/webui/build/_app/immutable/chunks/BUngiKFg.js +1 -0
  34. package/webui/build/_app/immutable/chunks/Bfc47y5P.js +1 -0
  35. package/webui/build/_app/immutable/chunks/Bt0fzibd.js +1 -0
  36. package/webui/build/_app/immutable/chunks/BxHqDcpw.js +1 -0
  37. package/webui/build/_app/immutable/chunks/ByQRbEUX.js +1 -0
  38. package/webui/build/_app/immutable/chunks/C12mHcUp.js +6 -0
  39. package/webui/build/_app/immutable/chunks/C1kQ4pHy.js +1 -0
  40. package/webui/build/_app/immutable/chunks/C74gbb4Q.js +1 -0
  41. package/webui/build/_app/immutable/chunks/CAtemnMo.js +1 -0
  42. package/webui/build/_app/immutable/chunks/CBY2biv-.js +1 -0
  43. package/webui/build/_app/immutable/chunks/CVjCNJia.js +1 -0
  44. package/webui/build/_app/immutable/chunks/Cg3zih_x.js +1 -0
  45. package/webui/build/_app/immutable/chunks/CjQQ9_Q2.js +2 -0
  46. package/webui/build/_app/immutable/chunks/CkS2JMkE.js +1 -0
  47. package/webui/build/_app/immutable/chunks/CtHRh_pJ.js +1 -0
  48. package/webui/build/_app/immutable/chunks/D-6mYMI1.js +1 -0
  49. package/webui/build/_app/immutable/chunks/D1Gs8-g3.js +1 -0
  50. package/webui/build/_app/immutable/chunks/D9dRVKgL.js +1 -0
  51. package/webui/build/_app/immutable/chunks/DCEY1XiC.js +1 -0
  52. package/webui/build/_app/immutable/chunks/DI-t-G_K.js +2 -0
  53. package/webui/build/_app/immutable/chunks/DTUxjyWL.js +1 -0
  54. package/webui/build/_app/immutable/chunks/DWJZOHke.js +1 -0
  55. package/webui/build/_app/immutable/chunks/Dgs6d7X5.js +1 -0
  56. package/webui/build/_app/immutable/chunks/DjpPK99f.js +71 -0
  57. package/webui/build/_app/immutable/chunks/DjzVVxpy.js +1 -0
  58. package/webui/build/_app/immutable/chunks/LQVMBmDN.js +1 -0
  59. package/webui/build/_app/immutable/chunks/Qw0Qgx6J.js +1 -0
  60. package/webui/build/_app/immutable/chunks/V2-VOe88.js +1 -0
  61. package/webui/build/_app/immutable/chunks/bohabpgg.js +1 -0
  62. package/webui/build/_app/immutable/chunks/c-YfbAB_.js +8 -0
  63. package/webui/build/_app/immutable/chunks/hp4PFHFv.js +1 -0
  64. package/webui/build/_app/immutable/chunks/tpTQfoNn.js +1 -0
  65. package/webui/build/_app/immutable/entry/app.4I2fqDIL.js +2 -0
  66. package/webui/build/_app/immutable/entry/start.CrgdT2Qb.js +1 -0
  67. package/webui/build/_app/immutable/nodes/0.gA9sQtoM.js +11 -0
  68. package/webui/build/_app/immutable/nodes/1.Bybh7btp.js +1 -0
  69. package/webui/build/_app/immutable/nodes/10.DEkJCZ6X.js +1 -0
  70. package/webui/build/_app/immutable/nodes/11.CDNNJqlQ.js +1 -0
  71. package/webui/build/_app/immutable/nodes/12.D9g8GCjm.js +24 -0
  72. package/webui/build/_app/immutable/nodes/13.DRpZV72T.js +1 -0
  73. package/webui/build/_app/immutable/nodes/14.DVeJW6bd.js +1 -0
  74. package/webui/build/_app/immutable/nodes/15.BtYZF6FM.js +1 -0
  75. package/webui/build/_app/immutable/nodes/16.Ba_qJjp6.js +1 -0
  76. package/webui/build/_app/immutable/nodes/2.DIZ4IPNm.js +1 -0
  77. package/webui/build/_app/immutable/nodes/3.BFSNf0FK.js +1 -0
  78. package/webui/build/_app/immutable/nodes/4.BSsIjejE.js +2 -0
  79. package/webui/build/_app/immutable/nodes/5.COxRT9Oe.js +1 -0
  80. package/webui/build/_app/immutable/nodes/6.CBgQ4YzB.js +1 -0
  81. package/webui/build/_app/immutable/nodes/7.BbzWOL0V.js +6 -0
  82. package/webui/build/_app/immutable/nodes/8.C8120200.js +1 -0
  83. package/webui/build/_app/immutable/nodes/9.BH_BGQQ4.js +1 -0
  84. package/webui/build/_app/version.json +1 -0
package/.env.example ADDED
@@ -0,0 +1,52 @@
1
+ # ─── 服务基础 ────────────────────────────────────────────────────────────────
2
+ PORT=18473
3
+ NODE_ENV=production
4
+
5
+ # 前端地址,OAuth 回调后重定向至此
6
+ APP_URL=https://rssany.com
7
+
8
+ # ─── 认证(必填)────────────────────────────────────────────────────────────
9
+ # JWT 签名密钥,至少 32 位随机字符串,例如:openssl rand -base64 32
10
+ JWT_SECRET=change-me-to-a-random-32-char-secret
11
+
12
+ # ─── Google OAuth(可选)────────────────────────────────────────────────────
13
+ # 在 https://console.cloud.google.com/apis/credentials 创建 OAuth 2.0 客户端
14
+ # 授权回调 URI 填:https://your-domain.com/api/auth/google
15
+ GOOGLE_CLIENT_ID=
16
+ GOOGLE_CLIENT_SECRET=
17
+
18
+ # ─── GitHub OAuth(可选)────────────────────────────────────────────────────
19
+ # 在 https://github.com/settings/applications/new 创建 OAuth App
20
+ # Authorization callback URL 填:https://your-domain.com/api/auth/github
21
+ GITHUB_CLIENT_ID=
22
+ GITHUB_CLIENT_SECRET=
23
+
24
+ # ─── 邮件发送(全部放 env,无需在 config.json 写 email 节)─────────────────────
25
+ # SMTP 配置
26
+ SMTP_HOST=smtp.example.com
27
+ SMTP_PORT=465
28
+ SMTP_SECURE=true
29
+ SMTP_USER=your@example.com
30
+ SMTP_PASS=your-smtp-password
31
+
32
+
33
+ # Resend API Key(driver=resend 时使用;https://resend.com/api-keys)
34
+ RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxx
35
+
36
+ # ─── LLM(研究报告模式用)──────────────────────────────────────────────────
37
+ OPENAI_API_KEY=sk-...
38
+ OPENAI_BASE_URL=https://api.openai.com/v1
39
+ OPENAI_MODEL=gpt-4o-mini
40
+
41
+
42
+ # ─── 用户数据目录(可选)──────────────────────────────────────────────────────
43
+ # 默认:用户主目录下的 .rssany/(Windows:%USERPROFILE%\.rssany)
44
+ # RSSANY_USER_DIR=/path/to/custom
45
+
46
+ # ─── 数据库(本地 SQLite)────────────────────────────────────────────────────
47
+ # 主库路径:<用户数据>/.rssany/data/rssany.db(启动时自动建表);可选:
48
+ # RSSANY_DB_JOURNAL=delete 在 Windows 热重载场景下降低 WAL 损坏风险
49
+
50
+ # ─── 缓存目录(可选)────────────────────────────────────────────────────────
51
+ # 默认:<用户数据>/.rssany/cache;可单独覆盖:
52
+ # CACHE_DIR=/path/to/custom/cache
package/README.md ADDED
@@ -0,0 +1,196 @@
1
+ # RSSAny - 把任何信息变成RSS订阅
2
+
3
+
4
+ > 按信源抓取网页 / RSS / 邮件等,解析、补全文、打标签与翻译后**入库**,再按需生成 **RSS / Atom / JSON Feed** 与 JSON API。
5
+
6
+ **RSSAny** 是一套自托管的订阅管线:列表 URL → **抓取与解析**(规则 / LLM)→ **正文提取**(自定义 / Readability / LLM)→ **upsert 去重** → 固定 **pipeline**(打标签、翻译等)→ 对外提供 `**/rss`** 等输出。
7
+
8
+ ---
9
+
10
+ ## 功能概览
11
+
12
+ - **统一订阅**:在 `.rssany/sources.json` 中配置网站列表、标准 RSS、IMAP 邮件等,由调度器按 `refresh` 策略拉取。
13
+ - **可插拔信源**:`plugins/sources/` 与 `.rssany/plugins/sources/` 中的 **Site** 插件(`.rssany.js` / `.rssany.ts`),自定义列表解析与详情规则。
14
+ - **正文补全**:可选 **enrich** 插件拉全文;无 enrich 时入库后仍会跑 pipeline。
15
+ - **固定 pipeline**:`app/pipeline/` 中打标签、翻译等,由 `.rssany/config.json` 的 `pipeline.steps` 开关(**不是**用户目录下的 pipeline 插件)。
16
+ - **LLM 辅助**:解析、提取、标签、翻译等可按配置走 OpenAI 兼容接口。
17
+ - **站点登录**:需登录的站点通过 Puppeteer 管理 Cookie(与产品用户账号无关)。
18
+ - **可选远端投递**:若 `config.json` 中 `**deliver.url`** 非空,在写库与 pipeline 完成后将条目以 `**{ sourceRef, items }**` JSON **POST** 到该 URL(由 `app/deliver/post.ts` 发送);留空则仅本地消费。
19
+ - **MCP**:条目检索等能力以 MCP 暴露,供 Cursor、Claude 等使用。
20
+ - **Web 界面**:SvelteKit 构建产物由后端托管;**Feeds** 等需 **邮箱校验**;`**/admin`** 需 `**users.role === 'admin'**`(可从 `**/me**` 进入)。
21
+
22
+ ---
23
+
24
+ ## 技术栈(摘要)
25
+
26
+
27
+ | 层级 | 说明 |
28
+ | --- | ------------------------------------------------------------ |
29
+ | 运行时 | Node.js **20–23**(见 `package.json` `engines`) |
30
+ | 后端 | Hono、`tsx` 开发入口 |
31
+ | 数据 | **SQLite**(`better-sqlite3`),默认 **`~/.rssany/data/rssany.db`**(Windows:`%USERPROFILE%\.rssany\data\rssany.db`) |
32
+ | 前端 | `webui/`(SvelteKit + Vite,构建输出由根服务托管) |
33
+
34
+
35
+ 原生模块 `**better-sqlite3**` 安装时会编译;若遇绑定缺失,请确认未禁用构建(仓库 `pnpm-workspace.yaml` 中已允许其 `allowBuilds`)。
36
+
37
+ ---
38
+
39
+ ## 快速开始
40
+
41
+ ### 环境要求
42
+
43
+ - Node.js **20.x–23.x**(与 `package.json` 的 `engines` 字段一致)
44
+ - **pnpm**
45
+
46
+ ### 安装依赖
47
+
48
+ ```bash
49
+ pnpm install
50
+ pnpm run webui:install
51
+ ```
52
+
53
+ ### 配置
54
+
55
+ 1. 复制环境变量示例并按需填写(JWT、OAuth、SMTP、LLM 等):
56
+ ```bash
57
+ cp .env.example .env
58
+ ```
59
+ 2. 信源与全局配置:首次启动会在 **`~/.rssany/`**(Windows:`%USERPROFILE%\.rssany\`)下自动从包内示例生成 `sources.json`、`config.json`(若已存在则不会覆盖)。也可手动复制仓库里的 `sources.example.json`、`config.examples.json`。
60
+ 3. (可选)LLM:在 `.env` 中设置 `OPENAI_API_KEY`、`OPENAI_BASE_URL`、`OPENAI_MODEL` 等。
61
+
62
+ ### 运行
63
+
64
+ **开发**(后端根路径托管 `webui` 构建产物,改前端需重新构建或 watch):
65
+
66
+ ```bash
67
+ # 推荐:API + 前端 watch(修改 Svelte 后自动写入构建目录,刷新浏览器即可)
68
+ pnpm run dev:all
69
+
70
+ # 或分步:先打一次前端再起后端
71
+ pnpm run webui:build
72
+ pnpm dev
73
+ ```
74
+
75
+ 默认监听 `**http://127.0.0.1:18473/**`(端口见 `.env.example` 中 `PORT`,避免与常见开发端口冲突)。
76
+
77
+ **重置本地数据**(结束占用 `PORT` 的监听进程,并删除 **`~/.rssany/`**,或 `RSSANY_USER_DIR` 所设目录):
78
+
79
+ ```bash
80
+ pnpm reset
81
+ ```
82
+
83
+ **仅调试 WebUI 热更新**(可选):`cd webui && pnpm dev`(Vite 代理到本机后端,见 `webui/vite.config.ts`)。
84
+
85
+ **生产**:
86
+
87
+ ```bash
88
+ pnpm run webui:build && pnpm start
89
+ ```
90
+
91
+ ### npm 全局安装(或 `npx`)
92
+
93
+ 发布包时 `prepublishOnly` 会执行 `build:all`(后端 `vite build` + `webui:build`)。安装后:
94
+
95
+ ```bash
96
+ npm install -g rssany
97
+ rssany
98
+ ```
99
+
100
+ 重置数据(结束 `PORT` 监听进程并删除用户目录):**`rssany reset`**(与仓库内 **`pnpm reset`** 相同逻辑;可在含 `.env` 的目录下执行以读取 `PORT` / `RSSANY_USER_DIR`)。
101
+
102
+ 用户数据在 **`~/.rssany/`**(Windows:`%USERPROFILE%\.rssany`),与工作目录无关。可选环境变量 **`RSSANY_USER_DIR`** 可指定其它路径。等价于 `node node_modules/rssany/dist/index.js`;CLI 名称为 `rssany`。内置 `plugins/`、`statics/`、`webui/build` 随包安装路径解析。
103
+
104
+ ---
105
+
106
+ ## 数据流(简图)
107
+
108
+ ```
109
+ sources.json / Site 插件
110
+ → 调度器触发 fetchItems
111
+ → upsertItems
112
+ → [可选] enrich 队列
113
+ → pipeline(每条一次)
114
+ → [可选] deliver.url POST(出站,非入站 API)
115
+ ```
116
+
117
+ 消费侧:**RSS/XML**、`**/api/*`**、**MCP**、Web UI。
118
+
119
+ ---
120
+
121
+ ## 常用 HTTP 能力
122
+
123
+ ### RSS 输出
124
+
125
+ - **按条件从库中生成**:支持 `search`、`tags`、`lng`、`limit` 等查询参数;可用 `subscribed=1` 限定为 `sources.json` 中出现的 ref。
126
+ - **按 URL 即时抓取**:`GET /rss/https://example.com/...`(具体行为以路由实现为准)。
127
+
128
+ ---
129
+
130
+ ## 插件与配置
131
+
132
+ ### 信源插件(Site)
133
+
134
+ 放置于 `**plugins/sources/`** 或 `**.rssany/plugins/sources/**`,用户插件可与内置插件同 `id` 覆盖。最小约定包括 `id`、`listUrlPattern` 等(详见 `app/scraper/sources/web/site.ts`)。
135
+
136
+ ### Enrich 插件
137
+
138
+ `**plugins/enrich/**`、`**.rssany/plugins/enrich/**`,按 enrich 管线加载。
139
+
140
+ ### Pipeline(固定代码)
141
+
142
+ `**app/pipeline/**`,通过 `**.rssany/config.json**` 配置步骤,例如:
143
+
144
+ ```json
145
+ {
146
+ "pipeline": {
147
+ "steps": [
148
+ { "id": "tagger", "enabled": true },
149
+ { "id": "translator", "enabled": false }
150
+ ]
151
+ },
152
+ "deliver": {
153
+ "url": ""
154
+ }
155
+ }
156
+ ```
157
+
158
+ `deliver.url` 非空时会对处理完成的条目向该 URL 发起出站 POST;留空则不投递。
159
+
160
+ ### `sources.json` 片段示例
161
+
162
+ ```json
163
+ {
164
+ "sources": [
165
+ { "ref": "https://example.com/feed.xml", "label": "Example", "refresh": "1h" }
166
+ ]
167
+ }
168
+ ```
169
+
170
+ 合法 `refresh` 取值包括:`10min`、`30min`、`1h`、`6h`、`12h`、`1day`(默认)、`3day`、`7day`。
171
+
172
+ ---
173
+
174
+ ## 仓库目录(摘要)
175
+
176
+ ```
177
+ ├── app/ # 后端:路由、feeder、scraper、pipeline、mcp、db、auth…
178
+ ├── plugins/ # 内置信源 / enrich 等插件
179
+ └── webui/ # SvelteKit 前端
180
+
181
+ ~/.rssany/ # 运行时用户数据(首次启动创建;或 RSSANY_USER_DIR)
182
+ ├── sources.json
183
+ ├── config.json
184
+ ├── tags.json
185
+ ├── data/rssany.db # SQLite 主库
186
+ ├── cache/
187
+ └── plugins/ # 用户插件覆盖内置
188
+ ```
189
+
190
+ 更细的模块说明见 **[AGENTS.md](./AGENTS.md)**(与代码迭代同步,若有出入以代码为准)。
191
+
192
+ ---
193
+
194
+ ## 许可证
195
+
196
+ MIT
package/bin/rssany.js ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ if (process.argv[2] === "reset") {
3
+ await import(new URL("../scripts/reset.mjs", import.meta.url));
4
+ } else {
5
+ await import(new URL("../dist/index.js", import.meta.url));
6
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "pipeline": {
3
+ "steps": [
4
+ { "id": "tagger", "enabled": false },
5
+ { "id": "translator", "enabled": false }
6
+ ]
7
+ },
8
+ "deliver": {
9
+ "url": ""
10
+ }
11
+ }