feat: DSL 磁力聚合 — 搜索/解析/预览/投递 + cilisousuo 源 + 中英双语 + Docker 部署

This commit is contained in:
ice-a
2026-10-16 18:53:45 +08:00
commit d6999104bf
64 changed files with 16524 additions and 0 deletions
+150
View File
@@ -0,0 +1,150 @@
# BT 种子预览台(DSL)
搜索 / 解析 / 预览 BT 种子内容,并一键投递到本机下载工具(qBittorrent / Transmission / aria2)的 Web 控制台。
## 功能特性
- **多源聚合搜索**:同时搜索多个公开磁力站并自动按 infoHash 去重、按做种数排序。
- The Pirate Bay(apibay)
- Nyaa
- SolidTorrents
- 磁力搜索(cilisousuo.cc)
- **种子内容预览**:通过 WebTorrent 的 DHT / Tracker 解析磁力链,取得文件清单、总大小、做种/下载人数(无需真正下载文件)。
- **一键投递**:把选中的磁力链直接发给本机 BT 客户端开始下载,并记录投递历史。
- **可配置**:搜索代理、超时、启用哪些搜索源、BT 客户端地址都可在「设置」页或 `.env` 中调整。
## 技术栈
- 前端/全栈:[Nuxt 4](https://nuxt.com/)(Vue 3 + Nitro 服务端)
- 数据库:[MongoDB](https://www.mongodb.com/)(搜索历史、投递记录、配置持久化;不连库时回落到 `.env` 默认值)
- 关键依赖:`webtorrent`(种子解析)、`mongodb`、`parse-torrent`、`undici`(带代理的 fetch)、`fast-xml-parser`
## 环境要求
- Node.js ≥ 18(推荐 20 LTS)
- MongoDB(可选;不安装也能跑,只是配置和历史记录不会持久化)
## 快速开始(本地开发)
```bash
# 1. 安装依赖
npm install
# 2. 配置环境变量(可选,见下文「配置项」)
cp .env.example .env
# 3. 启动开发服务器
npm run dev
```
打开 http://localhost:3000 即可。
构建并本地预览生产版本:
```bash
npm run build
npm run preview
```
## 配置项
所有配置都可写入 `.env`(项目根目录),未设置时使用括号内默认值。
| 变量 | 说明 | 默认 |
| --- | --- | --- |
| `MONGODB_URI` | MongoDB 连接串 | `mongodb://127.0.0.1:27017` |
| `MONGODB_DB` | 数据库名 | `torrent_console` |
| `SEARCH_PROXY` | 访问搜索源时使用的 HTTP 代理(如 `http://127.0.0.1:7890`),留空直连 | 空 |
| `SEARCH_TIMEOUT` | 单次搜索源请求超时(毫秒) | `12000` |
| `METADATA_TIMEOUT` | 磁力链元数据解析超时(毫秒) | `30000` |
| `APIBAY_BASE` | The Pirate Bay 接口地址 | `https://apibay.org` |
| `NYAA_BASE` | Nyaa 地址 | `https://nyaa.si` |
| `CILISOUSUO_BASE` | 磁力搜索(cilisousuo)地址 | `https://cilisousuo.cc` |
> 这些项也可在「设置」页通过 UI 修改(保存后写入 MongoDB 的 `settings` 集合,优先级高于 `.env`)。
## 搜索源说明
cilisousuo.cc 的列表页只暴露名称、大小和详情页短链,不含 infoHash,因此该源会**逐条抓取详情页**补全磁力链(单次搜索最多取前 24 条、5 路并发)。若服务端网络连不上该站,请在「设置」里配置 `SEARCH_PROXY`。
## 部署
### 方式一:Docker(推荐)
已提供 `Dockerfile` 与 `docker-compose.yml`(自带 MongoDB):
```bash
# 构建并启动(后台)
docker compose up -d --build
# 查看日志
docker compose logs -f app
```
访问 http://<服务器IP>:3000 。
仅构建镜像单独运行:
```bash
docker build -t bt-preview .
docker run -d --name bt-preview -p 3000:3000 \
-e MONGODB_URI=mongodb://mongo:27017 \
bt-preview
```
### 方式二:直接运行(Node 服务器)
```bash
# 生产构建,产物在 .output/
npm run build
# 用任意进程管理器跑起来(以 PM2 为例)
npm install -g pm2
pm2 start .output/server/index.mjs --name bt-preview
pm2 save
```
关键运行环境变量:
```bash
HOST=0.0.0.0 # 监听地址
PORT=3000 # 监听端口
MONGODB_URI=mongodb://127.0.0.1:27017
```
### 方式三:反向代理(Nginx 示例)
```nginx
server {
listen 80;
server_name your.domain;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
## 常见问题
- **搜索源"打不开" / 搜不到结果**:公开磁力站在部分网络下被墙。在「设置」里填一个可用的 HTTP 代理(`SEARCH_PROXY`),保存后重试。
- **MongoDB 未连接提示**:不影响基础搜索;只是配置和历史不会持久化。安装并启动 MongoDB,或设置 `MONGODB_URI` 指向可用的实例即可。
- **磁力解析不可用**:WebTorrent 依赖 Node 网络环境(DHT/UDP)。在受限网络下可能只能显示 infoHash,拿不到文件清单,属正常现象。
## 目录结构
```
app/ 前端页面与组件(Nuxt pages / components / composables)
server/
api/ Nitro 接口(search / torrent / clients / history / downloads ...)
utils/
search/ 各搜索源实现(apibay / nyaa / solidtorrents / cilisousuo)
mongo.ts MongoDB 连接与索引
appconfig.ts 配置读写与默认值
torrent.ts 磁力链 / 种子解析工具
```