# core
**Repository Path**: hermesqiang/core
## Basic Information
- **Project Name**: core
- **Description**: JAVClub - 让你的大姐姐不再走丢
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 1
- **Created**: 2020-05-15
- **Last Updated**: 2023-01-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
JAVClub
## Features
- 支持在线播放
- 全自动爬取、下载、上传、处理
- 视频、图片数据不占用本地空间
- 代理后速度播放速度可观, 不代理亦可看
- 多用户系统, 可以与的好基友一起穿越 (不是
- 支持收藏夹
- ~~面熟的话可以直接白嫖~~白嫖 (逃 -> [Google Form](https://forms.gle/SphJGNRxbjjhf4bU8)
## 简介
嘛这是一个星际涩情(划掉)系列 Repos, 包含三个子项目, 分别是 [fetcher](https://github.com/JAVClub/fetcher)、[web](https://github.com/JAVClub/web) 还有这个项目, 用处嘛就是你们想得那样啦
稍微逛了一下 GitHub, 貌似现有的 JAV 数据库都仅限于存储 Metadata(JAV 元数据[车牌号、cover 等等]) 及没啥用的种子信息, 没法做到在线观看, 所以这就是一个集搜集、下载、存储、观看、管理为一体的东西啦 (不是 (大雾
往下看之前请先确保你已满 18 周岁

## DEMO
因为项目的特殊性就不提供在线 DEMO 了, 仅放一些图片 #SFW
页面截图 (点击展开)










## 部署
部署这套系统至少需要两台服务器, 其中一台是用来运行 [fetcher](https://github.com/JAVClub/fetcher) 的, 因为要持续跑满宽带及 CPU, 所以不建议在上面建站(fetcher 的具体部署方式参考其 README); 第二台是网站 / API / 数据库服务器, 因为目前数据库查询及写入优化做得不是很好, 建议 2C 以上
### 配置
配置文件 (点击展开)
```json
{
"system": {
"logLevel": "debug",
"port": 3000,
"allowChangeUsername": false,
"userMaxBookmarkNum": 10,
"userMaxBookmarkItemNum": 100
},
"database": {
"connectionLimit": 5,
"host": "127.0.0.1",
"user": "javclub",
"password": "javclub",
"database": "javclub"
},
"importer": {
"settings": {
"googleDrive": {
"queueNum": 5
}
},
"cron": [
{
"driveId": 1,
"interval": 36000000,
"doFull": false
}
]
},
"proxy": [
"https://your.img.proxy/"
]
}
```
- **importer**
- settings.googleDrive.queueNum: (Int) Importer 导入时队列并行数
- cron[].driverId: (Int) 数据库 `drivers` 表中添加的 Driver ID
- cron[].interval: (Int) 每隔多少毫秒运行一次该 Driver 的 Importer
- cron[].doFull: (Boolean) 启动程序后第一次运行时是否扫描全部内容 (建议导入完成后关闭)
- **proxy** (Array) 用于代理 Metadata Cover 及 Star Cover 的反代 URL (请求格式: `https://your.img.proxy/https://url.to/imgage.png`)
将 `config/dev.example.json` 修改为 `config/dev.json` 并更改配置即可
### 数据库
因程序比较简洁, 不准备制作安装界面, 请自行导入数据表
数据表 (点击展开)
```sql
CREATE TABLE `bookmarks` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`uid` tinyint(4) DEFAULT NULL,
`name` tinytext,
`createTime` tinytext,
`updateTime` tinytext,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `bookmarks_mapping` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`bookmarkId` tinyint(4) DEFAULT NULL,
`metadataId` int(11) DEFAULT NULL,
`updateTime` tinytext,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `drivers` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` tinytext NOT NULL,
`driverType` tinytext NOT NULL,
`driverData` longtext NOT NULL,
`isEnable` tinyint(4) DEFAULT '0',
`createTime` tinytext NOT NULL,
`updateTime` tinytext NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `files` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`driverId` tinyint(4) NOT NULL,
`storageData` tinytext NOT NULL,
`updateTime` tinytext NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `ignore` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`data` tinytext,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `metadatas` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` text NOT NULL,
`companyName` tinytext NOT NULL,
`companyId` tinytext NOT NULL,
`posterFileURL` text,
`releaseDate` tinytext NOT NULL,
`updateTime` tinytext NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `series` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`updateTime` tinytext NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `series_mapping` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`metadataId` int(11) DEFAULT NULL,
`seriesId` int(11) DEFAULT NULL,
`updateTime` tinytext,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `stars` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` tinytext NOT NULL,
`photoURL` text,
`updateTime` tinytext,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `stars_mapping` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`metadataId` int(11) DEFAULT NULL,
`starId` int(11) DEFAULT NULL,
`updateTime` tinytext,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `tags` (
`id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`name` tinytext,
`updateTime` tinytext,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `tags_mapping` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`metadataId` int(11) NOT NULL,
`tagId` smallint(6) NOT NULL,
`updateTime` tinytext NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`username` tinytext,
`password` tinytext,
`token` tinytext,
`updateTime` tinytext,
`lastSeen` tinytext,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `videos` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`metadataId` int(11) NOT NULL,
`videoFileId` int(11) DEFAULT NULL,
`isHiden` char(1) DEFAULT '0',
`infoFileId` int(11) NOT NULL,
`videoMetadata` json NOT NULL,
`storyboardFileIdSet` json NOT NULL,
`updateTime` tinytext NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
```
### 安装
core 的入口文件是 src/app.js, 开启时建议使用 dev 模式 (`NODE_ENV=dev node src/app.js`) 以便于获取详细调试信息
**Option 1:** Docker 安装
请确保主机已安装 Docker 环境且已按上述步骤配置完程序
```bash
git clone https://github.com/JAVClub/core.git JAVClub_core
cd JAVClub_core
sudo docker pull javclub/core
sudo docker create -e NODE_ENV=dev -v ./config:/usr/src/app/config --name javclub_core javclub/core
```
**Option 2:** 直接安装
请确保主机已安装 Node.js 环境 (版本 10.0+)
```bash
git clone https://github.com/JAVClub/core.git JAVClub_core
cd JAVClub_core
npm i
```
执行完上述命令后根据选择配置的不同运行 `NODE_ENV=dev/stage node src/app.js` 即可
### 使用
core 中的数据来源是 fetcher 上传至 Google Drive 中的数据, 请在使用前 1-2 天部署好 fetcher 以获取足够的数据
**使用前准备:**
- 向数据库中 `drivers` 表中插入数据, 参考如下, 替换其中以 `【】` 包裹的内容即可 (目前仅支持 Google Drive) (【your_gd_proxy_server_here】的内容请参考 [workers](https://github.com/JAVClub/workers), 需要 `https://` 以及 `/`, 多个地址请用 `,` 分割)
```sql
INSERT INTO `drivers` (`id`, `name`, `driverType`, `driverData`, `isEnable`, `createTime`, `updateTime`) VALUES
(1, '1', 'gd', '{\"oAuth\":{\"client_id\":\"【your_client_here】\",\"client_secret\":\"【your_client_secret_here】\",\"redirect_uri\":\"urn:ietf:wg:oauth:2.0:oob\",\"token\":{\"access_token\":\"【your_access_token_here_optional】\",\"refresh_token\":\"【your_refresh_token_here】\",\"scope\":\"https://www.googleapis.com/auth/drive\",\"token_type\":\"Bearer\",\"expiry_date\":1583679345619}},\"drive\":{\"driveId\":\"【your_drive_or_folder_id_here】\"},\"encryption\":{\"secret\":\"【path_ase_secret】\",\"server\":\"【your_gd_proxy_server_here】"}}', 1, '【timestanp_in_ms_here】', '【timestanp_in_ms_here】');
```
- 向数据库 `users` 表中插入默认用户, 密码加密算法为 Bcrypt(round=10), 添加时可使用默认密码(123456) `$2b$10$pOavdaA2Pb4HXTCqecCbA.wepz0ArXjrNAn35mSwB55K43HVSdGbi` 及猫滚键盘 token, 登录后密码即可自动刷新
- 若还未导入数据请确保在 `dev.json` 中添加了 `cron` 段, 以便于程序在启动时自动扫描并导入数据
- 确保在服务器上可正常运行下列命令并正常输出:
```bash
curl -I https://www.google.com
curl -I https://www.javbus.com
```
如果上述的 Checklist 已经完成, 那么恭喜, 很快新世界的大门就要敞开了! (大雾
**启动服务端及与 WEB 端整合**
如果之前的步骤都有好好完成的话, 那现在剩下的就是启动服务器端以及和 WEB 端整合了
#### 启动:
- Docker: `sudo docker start javclub_core`
- 单机: `NODE_ENV=dev node src/app.js`
没有意外的话现在服务端和 API 服务器应该已经启动并正常工作了, 可以观察一下输出日志中有没有错误 (如果有一定一定一定要来提 IS 哇 (超大声
WEB 端请求的 API 路径默认为 `/api`, 所以只需要在 Nginx 中将 `/api` 代理到 `core:3000` 即可, 详细操作可以至搜索引擎处搜索 `nginx proxy_pass`
### 完成
恭喜现在 JAVClub 已经成功运行起来啦!
那么在这里祝你身体健康 (溜
## 后续
先感谢看完这篇废话连篇的使用文档, 有很多东西可能没有说明白, 如果有问题请尽管开 IS 来轰炸我吧 (不是, 也请有技术的小伙伴多多提交 PR (溜
正常来讲现在整套系统应该已经在正常工作了, 如果没有请再次检查是否漏掉了任何一个步骤
嘛如果实在是不想那么麻烦也可以来使用我们的私有服务(DEMO 的站点), 为了避免被 jvbao 所以现在是自荐加入, Twitter 上被我关注的小伙伴是默认有名额的, 直接私信 username 给咱就可获取到账号一枚(哆啦A梦式), 当然如果觉得跟我很脸熟的话也可以直接在 Telegram 私信我, 会视情况发账号哒
## 捐赠
嘛写这个虽然不算麻烦但还是挺繁琐的, 所以如果想请咱喝一杯咖啡也是可以哒
用[爱发电](https://afdian.net/@isXiaoLin) (大雾
## 免责声明
本程序仅供学习了解, 请于下载后 24 小时内删除, 不得用作任何商业用途, 文字、数据及图片均有所属版权, 如转载须注明来源
使用本程序必循遵守部署服务器所在地、所在国家和用户所在国家的法律法规, 程序作者不对使用者任何不当行为负责