Giter Site home page Giter Site logo

javclub / core Goto Github PK

View Code? Open in Web Editor NEW
2.9K 106.0 340.0 5.47 MB

🔞 JAVClub - 让你的大姐姐不再走丢

License: MIT License

JavaScript 99.88% Dockerfile 0.12%
jav javbus adult adult-content video-streaming google-drive javiewer porn spider japanese magnet

core's Introduction

JAVClub
JAVClub

因架构调整,本项目已不再维护并将存档。新项目将支持泛媒体文件管理,相关开发工作将迁移至 @UsagiHouse 进行,请知悉
⚠️ 因 Google Drive 相关服务近期进行转型升级,无限存储空间可能将不再对个人/教育提供,故本项目暂时停止更新。若后续 Google 仍决定以任意一种可承受的方式提供无限存储空间,项目可能将继续更新。若不会继续提供,则项目可能会 archive 或者支持 OneDrive 等其他网盘平台,敬请谅解

Features

  • 支持在线播放
  • 全自动爬取、下载、上传、处理
  • 视频、图片数据不占用本地空间
  • 代理后速度播放速度可观, 不代理亦可看
  • 多用户系统, 可以与的好基友一起穿越
  • 可从公开/私有站点下载数据, 多种选择
  • Docker 自动部署
  • 支持收藏夹
  • 支持公告系统
  • 支持用户系统
  • 支持邀请注册
  • 面熟的话大概可以直接白嫖

简介

这是一个涩情系列 Repos, 包含三个子项目, 分别是 fetcherweb 还有这个项目

稍微逛了一下 GitHub, 发现现有的 JAV 数据库都仅限于存储 Metadata(JAV 元数据[车牌号、cover 等等]) 及没啥用的种子信息, 没法做到在线观看, 所以这就是一个集搜集、下载、存储、观看、管理为一体的东西了

项目应该已经差不多进入了稳定期, 各种 TODO 应该有空有兴趣了会填坑, bugfixs 正常, issues 回复期在一至两周左右, 还请见谅

往下看之前请先确保你已满 18 周岁

Are you 18

TODO

  • 公告栏
  • 用户系统
    • 邀请注册

DEMO

感谢某位 dalao 为项目提供非官方演示站, 站点地址在这, 目前开放注册, 数据继承自原演示站(70k+), 欢迎体验 (附: 不提供在线时间保证, 有问题/赞助请联系这里)

因为项目的特殊性就不提供在线 DEMO 了, 仅放一些图片 #SFW

页面截图 (点击展开)

Home

Metadata List

Metadata Info Top

Metadata Info Bottom

Bookmark List

Bookmark Info

Tag List

Star List

Series List

Profile

部署

下面的信息可能有一些繁琐枯燥甚至还有错误, 希望还可见谅, 套用某位 dalao 的话来讲就是一劳永逸, 一旦理解了就没什么困难的了

Docker 部署方式请看这里

部署之前请确保你拥有/完成以下能力/事情:

  • 一台有稳定国际互联网的服务器
  • Node.js / JavaScript 基础
  • 基本的报错阅读能力
  • Linux 基础
  • 阅读过《提问的智慧
  • 可以克制住自己想把作者往死里揍心情的能力

要正常工作的话总共需要部署几样东西, 它们之间关系是这样的:

fetcher: 抓取种子->推送 qBittorrent 下载->处理->上传 Google Drive
↑
| 通过 Google Drive 相互联系
↓
core: 读取 Google Drive 文件列表->导入本地数据库
↑
| 通过 API 读取数据库中的内容
↓
web: 展示信息
↑
| 用户请求
|
Vercel: 为 Workers 提供 access token
|
| 302 跳转
↓
Workers: 代理 Google Drive 文件及 JAVBus 封面

Fetcher 部署

参照 JAVClub/fetcher

代理部署

参照 JAVClub/proxy

Core&Web 部署

Docker

参照 core - JAVClub/docker

非 Docker

拉取

请确保主机已安装 Node.js 环境 (版本 12.0+), 如未安装可使用 nvm 进行安装

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
nvm install node # "node" is an alias for the latest version

拉取项目

git clone https://github.com/JAVClub/core.git JAVClub_core
cd JAVClub_core
cp config/dev.example.json config/dev.json
npm i
配置文件
配置文件 (点击展开)
{
    "system": {
        "logLevel": "debug",
        "port": 3000,
        "path": "/api",
        "allowChangeUsername": false,
        "userMaxBookmarkNum": 10,
        "userMaxBookmarkItemNum": 100,
        "corsDomain": [
            "https://yourdomain.com"
        ],
        "searchParmaNum": 3,
        "allowSignup": false,
        "defaultGroup": 2
    },
    "database": {
        "dialect": "mysql",
        "connectionLimit": 5,
        "host": "mysql",
        "port": 3306,
        "username": "javclub",
        "password": "javclub",
        "database": "javclub"
    },
    "importer": {
        "settings": {
            "googleDrive": {
                "queueNum": 1
            }
        },
        "cron": [
            {
                "driveId": 1,
                "interval": 36000000,
                "doFull": true
            }
        ]
    },
    "proxy": [
        "https://proxy.xiaolin.in/"
    ]
}
  • system
    • path: API 监听的路径
    • corsDomain: cors 头允许的域名
    • searchParmaNum: 搜索允许的关键词数量(以空格分隔)
    • defaultGroup: 用户通过直接注册进入的权限组 ID (保持默认即可)
  • importer
    • settings.googleDrive.queueNum: (Int) Importer 导入时队列并行数
    • cron[].driverId: (Int) 数据库 drivers 表中条目的 ID
    • cron[].interval: (Int) 每隔多少毫秒 扫描一次这个云端硬盘
    • cron[].doFull: (Boolean) 启动程序后第一次运行时是否扫描云盘全部内容 (建议第一次导入完成后关闭)
  • proxy (Array) 用于代理 Metadata Cover 及 Star Cover 的反代 URL (请求格式: https://your.img.proxy/https://url.to/imgage.png)

按照提示修改 config/dev.json 并更改相关配置即可

  • system 部分若无需更改保持默认即可
  • database 部分请修改 host port username password database 为你自己的信息
  • cron 部分的相关设定可以暂时不用填写, 下文会有详细讲解
  • proxy 字段, 如果不想部署图片代理的话也可以直接填写 [""]
数据库

因程序不打算弄太复杂, 所以没有安装界面, 请自行导入数据表

在最新版本中终于用上了 migration, 所以现在数据表在启动时会自动创建, 默认的用户名 / 密码为 admin / admin, 请及时修改

配置 Google Drive 相关

core 中的数据来源是 fetcher 上传至 Google Drive 中的数据, 请在使用前 1-2 天部署好 fetcher 以获取足够的数据 (当然你要是想部署完 core 再部署 fetcher 也是没问题的)

首先要做的是往数据库里添加有关 Google Drive 的信息, 样例 SQL 命令如下

INSERT INTO `drivers` (`id`, `name`, `driverType`, `driverData`, `isEnable`, `createTime`, `updateTime`) VALUES
(1, 'My first drive', '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, '1583679345619', '1583679345619');

driverData 是这部分的核心, 看起来挺乱的, 这里给一个格式化后的方便理解

{
    "oAuth":{
        "client_id":"xxx.apps.googleusercontent.com",
        "client_secret":"",
        "redirect_uri":"urn:ietf:wg:oauth:2.0:oob",
        "token":{
            "access_token":"",
            "refresh_token":"",
            "scope":"https://www.googleapis.com/auth/drive",
            "token_type":"Bearer",
            "expiry_date":1583679345619
        }
    },
    "drive":{
        "driveId":"987b3d98q7deuiedsr",
        "type": "shared"
    },
    "encryption":{
        "secret":"secret",
        "server":"https://proxy.abc.workers.dev,https://proxy.def.workers.dev"
    }
}
  • oAuth 中的顾名思义就是 Google API 的鉴权信息, 按照你的凭证填写即可
    • 凭证相关可使用 GoIndex Code Builder 来方便地取得, 将生成代码中的 client_idclient_secretrefresh_token 复制到此处即可, 其余位置可留空
  • drive
    • driveId 是你的云端硬盘 ID, 也就是云端硬盘根目录浏览器地址栏的那一长串东西
    • type[optional] 可选 usershared, 选择 user 时无需填写 driveId, 代表 我的云端硬盘
  • encryption 是给 Workers 使用的选项
    • secret 请随便填写串字符, 部署 Workers 时使用的 password 请与此处的保持一致
    • server 是你部署的 Workers 的地址, 多个地址用 , 隔开

更改完后将上面一段 JSON 复制到这里压缩后照本节开头格式插入数据表即可

下一步就是要告诉程序你添加了这个硬盘并且希望扫描/导入这个硬盘中的内容

还记得上文中提到的 cron 部分吗? 那里的 id 便是这里数据表中自动生成的 id

那么就只需要在 dev.json 中的 cron 字段按中所述添加相应内容即可

到现在 core 应该已经配置完成并可以工作了

配置 WebUI

到现在只剩下 WebUI 程序就可以正常工作了, 为了正常工作需要将 core 的 /api 路径代理到你域名下的 /api 路径并将静态资源放置于该域名对应目录的根目录下, 请使用你熟悉的 HTTP 服务端软件来执行此操作(如 Nginx, Caddy 等)

首先是拉取并构建 Web UI

git clone https://github.com/JAVClub/web.git JAVClub_web
cd JAVClub_web
cp src/config.example.js src/config.js
npm i && npm run build

运行完成之后前端资源就已经构建完成了, 位于 ./dist 目录下 这时候只需要在服务端软件中将除 /api 以外的请求重定向至 ./dist 目录即可

启动:
NODE_ENV=dev node src/app.js
# 以及你服务端的启动命令

没有意外的话现在 Web UI 和 API 服务器应该已经启动并正常工作了, 可以观察一下输出日志中有没有错误 (如果有务必将错误日志提交至 Issue

如果有任何不明白的欢迎开 issue 提问

完成

现在 JAVClub 已经成功运行起来了

那么在这里祝你身体健康

其余配置

权限组

新版本新增了权限系统, 数据库由 id name rule time 四个部分组成

其中 id 是权限组 ID, name 是权限组名, rule 是权限组的权限列表, 为 JSON 格式, 如下所示

{
    "admin":true, // 是否为管理员
    "title":"Admin",
    "banned":false, // 是否被封禁
    "invitationNum":-1, // 可以创建的邀请码数量
    "invitationGroup":2 // 邀请码使用者注册到的权限组
}

程序启动时会自动创建 Admin Group User Group Banned Group 三个组, 可按需调整参数

后续

先感谢看完这篇废话连篇的使用文档, 有很多东西可能没有说明白, 如果有问题请尽管开 IS 来轰炸我吧

正常来讲现在整套系统应该已经在正常工作了, 如果没有请再次检查是否漏掉了任何一个步骤

FAQ

  • 遇到一大堆问题没办法解决

可以先参考一下 core#11 core#12 fetcher#3 这里是被踩的最多的坑, 可以看看有没有自己遇到的问题

  • Docker 部署的相关问题

有关 Docker 部署的任何问题请提交 Issue 或者直接发送邮件询问

  • 没有 M-Team 的账号怎么办

现在重写后的 fetcher 也已经支持 OneJAV 了, 所以不需要任何账号都可以正常使用了

  • 这玩意儿真的有人成功部署过吗

说实话我也不知道, 我已经尽最大努力简化安装过程&写说明文档了, 如果还是有不懂的可以提交 Issue

免责声明

本程序仅供学习了解, 请于下载后 24 小时内删除, 不得用作任何商业用途, 文字、数据及图片均有所属版权, 如转载须注明来源

使用本程序必循遵守部署服务器所在地、所在国家和用户所在国家的法律法规, 程序作者不对使用者任何不当行为负责

core's People

Contributors

dependabot[bot] avatar iwestlin avatar lynmoe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

core's Issues

登入時出現error

[INFO] API: Main - [UID: -1] POST /api/auth/login
This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason:
Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
at Handshake.Sequence._packetToError (/usr/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
at Handshake.ErrorPacket (/usr/app/node_modules/mysql/lib/protocol/sequences/Handshake.js:123:18)
at Protocol._parsePacket (/usr/app/node_modules/mysql/lib/protocol/Protocol.js:291:23)
at Parser._parsePacket (/usr/app/node_modules/mysql/lib/protocol/Parser.js:433:10)
at Parser.write (/usr/app/node_modules/mysql/lib/protocol/Parser.js:43:10)
at Protocol.write (/usr/app/node_modules/mysql/lib/protocol/Protocol.js:38:16)
at Socket. (/usr/app/node_modules/mysql/lib/Connection.js:88:28)
at Socket. (/usr/app/node_modules/mysql/lib/Connection.js:523:10)
at Socket.emit (events.js:314:20)
at Socket.EventEmitter.emit (domain.js:548:15)
--------------------
at Protocol._enqueue (/usr/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
at Protocol.handshake (/usr/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)
at Connection.connect (/usr/app/node_modules/mysql/lib/Connection.js:116:18)
at /usr/app/node_modules/knex/lib/dialects/mysql/index.js:68:18
at new Promise ()
at Client_MySQL.acquireRawConnection (/usr/app/node_modules/knex/lib/dialects/mysql/index.js:63:12)
at create (/usr/app/node_modules/knex/lib/client.js:289:39)
at processTicksAndRejections (internal/process/task_queues.js:93:5)

想請問一下如何解決這個問題QQ,使用docker配置的,docker-compose ps如下:

  Name                     Command                  State               Ports

core_javclub_1 docker-entrypoint.sh node ... Up 0.0.0.0:1234->3000/tcp
core_mysql_1 /entrypoint.sh --default-a ... Up (healthy) 3306/tcp, 33060/tcp
core_phpmyadmin_1 /docker-entrypoint.sh apac ... Up 0.0.0.0:8080->80/tcp

外部nginx配置:

server {
listen 80;
server_name my_domain;
root /heihei/JAVClub_docker/core/wwwroot/JAVClub_web/dist;

location / {
    try_files $uri $uri/ /index.html;
}

location ^~ /api {
    proxy_pass http://0.0.0.0:1234;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_set_header   Host              $http_host;
    proxy_set_header   X-Real-IP         $remote_addr;
}
# 其他如default

}

感謝!

无法部署

虽然作者写了很详细的 readme,但我怀疑究竟有几个人能成功部署,更别提还要自己翻墙,我要收回我的小星星。欢迎部署成功的大佬来打我脸。
部署过程中遇到的坑有:

  1. docker-lempJAVClub_core 项目的 docker-compose.yml 文件里都没有配置 port 映射,导致容器外部无法访问。
  2. docker-lemp 项目的 my.cnf 文件里面配置了 user=mysql 导致 /var/lib/mysql/mysql.sock 文件因权限问题无法使用,改成 user=root 可解决。
  3. 还得自己建数据库用户和表结构......
  4. 早点儿说还得翻墙我就不折腾了......

卡在数据库那里

一直提示我
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''drivers' ('id','name','driverType','driverData','isEnable','createTime','update' at line 1
mysql的版本是5.5
操作就是手动建了一个名为drivers的表格,随后尝试添加记录失败

cf会不会封号

我看这个有点像aria2+googledrive+gindex的进化版,cf免费版的不是有cpu限制吗,这样大量播放不会被cf封号吗

两个建议

使用过程中发现,出现封面图之后,鼠标点击图片不会跳转连接,而是需要点击文字才能跳转过去。所以希望能让图片也可以点击,扩大使用者的点击范围。因为直觉上都是直接对图片进行点击动作的。

另一个是关于播放页面的建议请考虑。希望播放页面能增加一些知名的第三方播放器的播放调用按钮,而不仅仅是在网页上播放。
还有如果可以的话建议爬虫程序能顺便爬取对应番号在DMM内的预告片。主要是觉得观看者在判断一部片子好不好看的时候除了DMM提供的预览图,预告视频也是很直接的一个参考。并且还能省下因为只是想快速预览十几秒的部分片段而对主视频调用的大量流量,也可以降低一下服务器负载。

创建书签失败

搭建成功后唯一的问题是,书签只能创建一个,创建第二个的时候没反应,搭建了几次都是这样。不知道在哪看错误日志。

關於Google API的小建議

原本作者的請求是這樣的:

driveId: 'your_drive_id',
corpora: 'drive',
includeItemsFromAllDrives: true,
supportsTeamDrives: true,
pageSize: 1000,
orderBy: 'modifiedTime desc',
q: "name='info.json'",
fields: 'nextPageToken, files(id, name, modifiedTime, parents, size)'

但根據Google API文件的說法,上面只能查詢到僅在shared drive裡面的檔案,而shared drive的建立是需要G Suite
的 (還要有權限建立shared drive),因此個人雲端的無限容量就無法用到 (像我個人本身的大學附的學校帳號)。

因此我建議可以將API請求改成如下,以增加搜尋範圍:

corpora: 'user',
pageSize: 1000,
orderBy: 'modifiedTime desc',
q: "name='info.json' and 'Your_folder_id' in parents",
fields: 'nextPageToken, files(id, name, modifiedTime, parents, size)'

謝謝!

feat:swag

想知道大佬有没有兴趣爬一下 Swag 的内容 @LoliLin

手动插入drives表,导入成功,链接gd出错

INSERT INTO `drivers` (`id`, `name`, `driverType`, `driverData`, `isEnable`, `createTime`, `updateTime`) VALUES
(2, 'My first drive', 'gd', '{\"oAuth\":{\"client_id\":\"57465633sssssxxxxxxxktd.apps.googleusercontent.com\",\"client_secret\":\"BzGuesxxxxxUvTzXyAXC\",\"redirect_uri\":\"urn:ietf:wg:oauth:2.0:oob\",\"token\":{\"access_token\":\"ya29.a0AfH6xxxxxxxxxycZotCJcsjlnKNTnHZnT9_Z7kvHgCSPa2H8pVraIxJptC8YP8kdEOs6QC7HIKDDk3xQEoGEAv4TjMu8QKX-dh7RwVpfHHpZK7cOnCt1JuWFQjNRQgPHw8ZumOIWsGxxxxxxxaLWuVX58rg9mflPCAw\",\"refresh_token\":\"1//0eHvhUK_7spkssssssxxxxF-L9IrL9HfoUshrgIiGYiKe-oh7mqI5yW4gCBgd4YUOjuN1uBjl08d3B9a1WVhnVh4xX4ZvlE\",\"scope\":\"https://www.googleapis.com/auth/drive\",\"token_type\":\"Bearer\",\"expiry_date\":1583679345619}},\"drive\":{\"driveId\":\"15R5DRknP1Pxxxxxxxxxx2aamgVb\"},\"encryption\":{\"secret\":\"tsyxxxxxx524\",\"server\":\"https://jxxxxx.workers.dev"}}', 1, '1583679345619', '1583679345619');

报错log

[2020-08-10T22:21:22.430] [DEBUG] Driver[2]: Google Drive - Attempt 5 failed. There are 1 retries left
[2020-08-10T22:21:27.456] [DEBUG] Driver[1]: Google Drive - Attempt 5 failed. There are 1 retries left
[2020-08-10T22:21:48.682] [DEBUG] Driver[2]: Google Drive - Attempt 6 failed. There are 0 retries left
[2020-08-10T22:21:53.653] [DEBUG] Driver[1]: Google Drive - Attempt 6 failed. There are 0 retries left
[2020-08-10T22:21:58.684] [ERROR] Driver[2]: Google Drive - Error while getting dir list name='info.json' GaxiosError: Shared drive not found: 1O6rDfVXddddddLdtsaF9B
    at Gaxios.<anonymous> (/usr/app/node_modules/gaxios/build/src/gaxios.js:73:27)
    at Generator.next (<anonymous>)
    at fulfilled (/usr/app/node_modules/gaxios/build/src/gaxios.js:16:58)
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  response: {
    config: {
      url: 'https://www.googleapis.com/drive/v3/files?pageSize=1000&orderBy=modifiedTime%20desc&q=name%3D%27info.json%27&fields=nextPageToken%2C%20files%28id%2C%20name%2C%20modifiedTime%2C%20parents%2C%20size%29&driveId=1O6rDfVXxxxxxxsaF9B&corpora=drive&includeItemsFromAllDrives=true&supportsTeamDrives=true',
      method: 'GET',
      paramsSerializer: [Function (anonymous)],
      headers: [Object],
      params: [Object: null prototype],
      validateStatus: [Function (anonymous)],
      responseType: 'json'
    },
    data: { error: [Object] },
    headers: {
      'alt-svc': 'h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"',
      'cache-control': 'private, max-age=0',
      connection: 'close',
      'content-encoding': 'gzip',
      'content-security-policy': "frame-ancestors 'self'",
      'content-type': 'application/json; charset=UTF-8',
      date: 'Mon, 10 Aug 2020 14:21:48 GMT',
      expires: 'Mon, 10 Aug 2020 14:21:48 GMT',
      server: 'GSE',
      'transfer-encoding': 'chunked',
      vary: 'Origin, X-Origin',
      'x-content-type-options': 'nosniff',
      'x-frame-options': 'SAMEORIGIN',
      'x-xss-protection': '1; mode=block'
    },
    status: 404,
    statusText: 'Not Found'
  },
  config: {
    url: 'https://www.googleapis.com/drive/v3/files?pageSize=1000&orderBy=modifiedTime%20desc&q=name%3D%27info.json%27&fields=nextPageToken%2C%20files%28id%2C%20name%2C%20modifiedTime%2C%20parents%2C%20size%29&driveId=1O6rDfVxxxxxxxOZWgsPyLdtsaF9B&corpora=drive&includeItemsFromAllDrives=true&supportsTeamDrives=true',
    method: 'GET',
    paramsSerializer: [Function (anonymous)],
    headers: {
      'Accept-Encoding': 'gzip',
      'User-Agent': 'google-api-nodejs-client/0.7.2 (gzip)',
      Authorization: 'Bearer ya29.a0AfH6SMCBMxrQutwxxxxxxxxcYN17q1BmzLs4AaAiogXrWoqBHmZOWBrgJbI-oUDXxMEGVDaw7HQLhG25qOAZkDqhwTVT4_gDGaOL2iIIYExxxxxxxxKstoVMu5UCWcWu5UnYR6jWdWaquQz8IwULsI',
      Accept: 'application/json'
    },
    params: [Object: null prototype] {
      pageSize: 1000,
      orderBy: 'modifiedTime desc',
      q: "name='info.json'",
      fields: 'nextPageToken, files(id, name, modifiedTime, parents, size)',
      driveId: '1O6rDfVXGJxxxxxxxxPyLdtsaF9B',
      corpora: 'drive',
      includeItemsFromAllDrives: true,
      supportsTeamDrives: true
    },
    validateStatus: [Function (anonymous)],
    responseType: 'json'
  },
  code: 404,
  errors: [
    {
      domain: 'global',
      reason: 'notFound',
      message: 'Shared drive not found: 1O6rDfVXGJxxxxxxyLdtsaF9B',
      locationType: 'parameter',
      location: 'driveId'
    }
  ],
  attemptNumber: 6,
  retriesLeft: 0
}

======================
问题
encryption 是不是一定要设置,留空或者用别人的行不行;这个应该只读gd里面的info.json文件到数据库里吧。

项目跑起来 第一个种子下载完成后 /tmp/sync/ 目录下没有出现xx/xx/xx.....xx/ 这种目录

core日志

[2020-09-26T22:22:44.278] [DEBUG] Importer: GD 1 - Video id undefined
[2020-09-26T22:22:44.279] [DEBUG] Importer: GD 1 - Storyboard folder id undefined
[2020-09-26T22:22:44.279] [INFO] Driver[1]: Google Drive - Getting file list of keyword 'undefined' in parents
[2020-09-26T22:22:44.279] [DEBUG] Driver[1]: Google Drive - Getting page 1
[2020-09-26T22:22:44.562] [DEBUG] Driver[1]: Google Drive - Attempt 1 failed. There are 5 retries left
[2020-09-26T22:22:55.814] [DEBUG] Driver[1]: Google Drive - Attempt 2 failed. There are 4 retries left
[2020-09-26T22:23:08.069] [DEBUG] Driver[1]: Google Drive - Attempt 3 failed. There are 3 retries left
[2020-09-26T22:23:22.330] [DEBUG] Driver[1]: Google Drive - Attempt 4 failed. There are 2 retries left
[2020-09-26T22:23:40.607] [DEBUG] Driver[1]: Google Drive - Attempt 5 failed. There are 1 retries left
[2020-09-26T22:24:06.870] [DEBUG] Driver[1]: Google Drive - Attempt 6 failed. There are 0 retries left
[2020-09-26T22:24:16.872] [ERROR] Driver[1]: Google Drive - Error while getting dir list 'undefined' in parents GaxiosError: File not found: .
at Gaxios. (/usr/app/node_modules/gaxios/build/src/gaxios.js:73:27)
at Generator.next ()
at fulfilled (/usr/app/node_modules/gaxios/build/src/gaxios.js:16:58)
at processTicksAndRejections (internal/process/task_queues.js:93:5) {
response: {
config: {
url: 'https://www.googleapis.com/drive/v3/files?pageSize=1000&orderBy=modifiedTime%20desc&q=%27undefined%27%20in%20parents&fields=nextPageToken%2C%20files%28id%2C%20name%2C%20modifiedTime%2C%20parents%2C%20size%29&driveId=0AJIzFPBxaQGjUk9PVA&corpora=drive&includeItemsFromAllDrives=true&supportsTeamDrives=true',
method: 'GET',
paramsSerializer: [Function (anonymous)],
headers: [Object],
params: [Object: null prototype],
validateStatus: [Function (anonymous)],
responseType: 'json'
},
data: { error: [Object] },
headers: {
'cache-control': 'private, max-age=0',
connection: 'close',
'content-encoding': 'gzip',
'content-security-policy': "frame-ancestors 'self'",
'content-type': 'application/json; charset=UTF-8',
date: 'Sat, 26 Sep 2020 14:24:06 GMT',
expires: 'Sat, 26 Sep 2020 14:24:06 GMT',
server: 'GSE',
'transfer-encoding': 'chunked',
vary: 'Origin, X-Origin',
'x-content-type-options': 'nosniff',
'x-frame-options': 'SAMEORIGIN',
'x-xss-protection': '1; mode=block'
},
status: 404,
statusText: 'Not Found'
},
config: {
url: 'https://www.googleapis.com/drive/v3/files?pageSize=1000&orderBy=modifiedTime%20desc&q=%27undefined%27%20in%20parents&fields=nextPageToken%2C%20files%28id%2C%20name%2C%20modifiedTime%2C%20parents%2C%20size%29&driveId=0AJIzFPBxaQGjUk9PVA&corpora=drive&includeItemsFromAllDrives=true&supportsTeamDrives=true',
method: 'GET',
paramsSerializer: [Function (anonymous)],
headers: {
'Accept-Encoding': 'gzip',
'User-Agent': 'google-api-nodejs-client/0.7.2 (gzip)',
Authorization: 'Bearer ya29.a0AfH6SMCmCDPCZ_506QJrsfvFSE-nNuXZMzG9GdP6l4_tsnVARXuzyPwSnxSEbEYjWl93D-sLILmefF-n3880VSUVpaIkHn1FSYdYnLSutVZuYbsXDqU5ETFLd9FwoenUmqiWm03m3ggOAypmAQc1SooAv4BYETRS4BA',
Accept: 'application/json'
},
params: [Object: null prototype] {
pageSize: 1000,
orderBy: 'modifiedTime desc',
q: "'undefined' in parents",
fields: 'nextPageToken, files(id, name, modifiedTime, parents, size)',
driveId: '0AJIzFPBxaQGjUk9PVA',
corpora: 'drive',
includeItemsFromAllDrives: true,
supportsTeamDrives: true
},
validateStatus: [Function (anonymous)],
responseType: 'json'
},
code: 404,
errors: [
{
domain: 'global',
reason: 'notFound',
message: 'File not found: .',
locationType: 'parameter',
location: 'fileId'
}
],
attemptNumber: 6,
retriesLeft: 0
}
[2020-09-26T22:24:16.873] [INFO] Importer: GD 1 - Video 0259f105ee7372f5bddcb474083b61774f99f12a havn't fully upload yet
[2020-09-26T22:24:16.874] [DEBUG] Importer: GD 1 - Handling info.json file 1Hmb5I0xkhW9G3SaZg6l35-nBkUHHCZ_F
[2020-09-26T22:24:16.874] [DEBUG] Driver[1]: Google Drive - Downloading file 1Hmb5I0xkhW9G3SaZg6l35-nBkUHHCZ_F
[2020-09-26T22:24:17.671] [DEBUG] Importer: GD 1 - File 1Hmb5I0xkhW9G3SaZg6l35-nBkUHHCZ_F's content {"JAVID":"JUL171","company":"JUL","id":"171","episode":"A","metadata":{"video":{"width":1920,"height":1080,"codec":"h264","duration":8496,"bitRate":6006074,"fps":30},"audio":{"codec":"aac","duration":8496,"bitRate":192002,"channels":2}},"hash":"072d3507459fd608c3a27bd7d7f74722a85aef6d"}
[2020-09-26T22:24:17.671] [DEBUG] Importer: GD 1 - Info {
JAVID: 'JUL171',
company: 'JUL',
id: '171',
episode: 'A',
metadata: {
video: {
width: 1920,
height: 1080,
codec: 'h264',
duration: 8496,
bitRate: 6006074,
fps: 30
},
audio: { codec: 'aac', duration: 8496, bitRate: 192002, channels: 2 }
},
hash: '072d3507459fd608c3a27bd7d7f74722a85aef6d'
}
[2020-09-26T22:24:17.672] [INFO] Importer: GD 1 - Processing JUL-171
[2020-09-26T22:24:17.672] [DEBUG] Importer: GD 1 - JUL-171 info.json file version: 1
[2020-09-26T22:24:17.677] [DEBUG] Importer: GD 1 - Video folder id 1WF0RLkT_RAeu7bybOBJugfown_QREkQL
[2020-09-26T22:24:17.677] [INFO] Driver[1]: Google Drive - Getting file list of keyword '1WF0RLkT_RAeu7bybOBJugfown_QREkQL' in parents
[2020-09-26T22:24:17.678] [DEBUG] Driver[1]: Google Drive - Getting page 1
[2020-09-26T22:24:18.124] [INFO] Driver[1]: Google Drive - Got 1 files' metadatas
[2020-09-26T22:24:18.125] [DEBUG] Importer: GD 1 - Video folder file list [
{
id: '1Hmb5I0xkhW9G3SaZg6l35-nBkUHHCZ_F',
name: 'info.json',
parents: [ '1WF0RLkT_RAeu7bybOBJugfown_QREkQL' ],
modifiedTime: '2020-03-20T22:45:46.075Z',
size: '287'
}
]
[2020-09-26T22:24:18.125] [DEBUG] Importer: GD 1 - Video id undefined
[2020-09-26T22:24:18.126] [DEBUG] Importer: GD 1 - Storyboard folder id undefined
[2020-09-26T22:24:18.126] [INFO] Driver[1]: Google Drive - Getting file list of keyword 'undefined' in parents
[2020-09-26T22:24:18.126] [DEBUG] Driver[1]: Google Drive - Getting page 1
[2020-09-26T22:24:18.389] [DEBUG] Driver[1]: Google Drive - Attempt 1 failed. There are 5 retries left
[2020-09-26T22:24:29.654] [DEBUG] Driver[1]: Google Drive - Attempt 2 failed. There are 4 retries left
[2020-09-26T22:24:41.904] [DEBUG] Driver[1]: Google Drive - Attempt 3 failed. There are 3 retries left
[2020-09-26T22:24:56.189] [DEBUG] Driver[1]: Google Drive - Attempt 4 failed. There are 2 retries left
[2020-09-26T22:25:14.441] [DEBUG] Driver[1]: Google Drive - Attempt 5 failed. There are 1 retries left

fetcher日志

[2020-09-26T13:46:57.388] [INFO] Handle: Init - Processing torrent 9eaf2491b3bf306179ec21c8e0bcab0e541a0c53
{
hash: '8e49a090343e78b5879ff7db992e8b70eb689c93c7c69a542da20fd7146c1e5e',
JAVID: 'FSDSS-098',
size: 4.9,
torrentURL: 'https://onejav.com/torrent/fsdss098/download/496728/onejav.com_fsdss098.torrent',
metadata: {
title: '自撮り神ありなの激盛りハメ「ラレ」撮り交尾 橋本ありな',
cover: 'https://pics.javbus.com/cover/7w55_b.jpg',
studio: 'FALENO',
series: '',
tags: [ '単体作品', 'ハイビジョン', '長身', 'ハメ撮り', 'お姉さん' ],
stars: [ [Object] ],
releaseDate: '2020-09-24',
screenshots: [
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-1.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-2.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-3.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-4.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-5.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-6.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-7.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-8.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-9.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-10.jpg'
],
JAVID: 'FSDSS-098'
},
torrentHash: '9eaf2491b3bf306179ec21c8e0bcab0e541a0c53'
} {
title: '自撮り神ありなの激盛りハメ「ラレ」撮り交尾 橋本ありな',
cover: 'https://pics.javbus.com/cover/7w55_b.jpg',
studio: 'FALENO',
series: '',
tags: [ '単体作品', 'ハイビジョン', '長身', 'ハメ撮り', 'お姉さん' ],
stars: [
{ name: '橋本ありな', img: 'https://pics.javbus.com/actress/pmv_a.jpg' }
],
releaseDate: '2020-09-24',
screenshots: [
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-1.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-2.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-3.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-4.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-5.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-6.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-7.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-8.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-9.jpg',
'https://pics.dmm.co.jp/digital/video/1fsdss00098/1fsdss00098jp-10.jpg'
],
JAVID: 'FSDSS-098'
}
[2020-09-26T13:46:58.854] [ERROR] Handle: Init - FFMpeg threw an error Error: ffprobe exited with code 1
ffprobe version 4.2.1 Copyright (c) 2007-2019 the FFmpeg developers
built with gcc 9.2.0 (Alpine 9.2.0)
configuration: --prefix=/usr --enable-avresample --enable-avfilter --enable-gnutls --enable-gpl --enable-libass --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libxvid --enable-libx264 --enable-libx265 --enable-libtheora --enable-libv4l2 --enable-postproc --enable-pic --enable-pthreads --enable-shared --enable-libxcb --disable-stripping --disable-static --disable-librtmp --enable-vaapi --enable-vdpau --enable-libopus --disable-debug
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
/usr/app/tmp/downloads/JAVClub/FSDSS-098.mp4: No such file or directory

at ChildProcess.<anonymous> (/usr/app/node_modules/fluent-ffmpeg/lib/ffprobe.js:233:22)
at ChildProcess.emit (events.js:321:20)
at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12)

[2020-09-26T13:46:58.917] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:47:57.359] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T13:47:57.362] [INFO] Pull: Init - Handling BGN-060's torrent, hash ad855a5aae9e5c0f010724c5f582aba24b134ce176cf6e66a5747fa54e87ed44
[2020-09-26T13:47:58.919] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:47:58.922] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:47:59.555] [INFO] Pull: Init - [BGN-060] Adding to qBittorrent
[2020-09-26T13:47:59.680] [INFO] Pull: Init - Handling TIKP-049's torrent, hash 17159d1da9a36208c6de93c181b3abf22ad664607df41273f14e11a060a143e5
[2020-09-26T13:48:03.582] [INFO] Pull: Init - [TIKP-049] Adding to qBittorrent
[2020-09-26T13:48:03.590] [INFO] Pull: Init - Handling ONSG-027's torrent, hash d11e9e47f028594a7bfe4427110714ccced49b324db585435e02f7f15f34dec2
[2020-09-26T13:48:09.377] [INFO] Pull: Init - [ONSG-027] Adding to qBittorrent
[2020-09-26T13:48:09.387] [INFO] Pull: Init - Handling FSDSS-100's torrent, hash 64619d55a65f9d42f667579c21694c6e6d256e36d3a37b6fcebf90bb82f548bb
[2020-09-26T13:48:11.195] [INFO] Pull: Init - [FSDSS-100] Adding to qBittorrent
[2020-09-26T13:48:11.201] [INFO] Pull: Init - Handling STARS-265's torrent, hash df36715429f1e7b6e27461dea7928ddf630e58e21a164722cbf597f027e577ac
[2020-09-26T13:48:13.259] [INFO] Pull: Init - [STARS-265] Adding to qBittorrent
[2020-09-26T13:48:13.263] [INFO] Pull: Init - Handling HND-879's torrent, hash 91c0e0bacc8dbe836a7a25b781c858c8136b533093048f351b26a0bac5ed3df1
[2020-09-26T13:48:15.145] [INFO] Pull: Init - [HND-879] Adding to qBittorrent
[2020-09-26T13:48:15.150] [INFO] Pull: Init - Handling FSDSS-101's torrent, hash 3af4950a75b558f26650d8c811d3a6db744e5be7feac2d60e506ab65eaa5c2e5
[2020-09-26T13:48:19.100] [INFO] Pull: Init - [FSDSS-101] Adding to qBittorrent
[2020-09-26T13:48:19.103] [INFO] Pull: Init - Handling ABW-013's torrent, hash a2c6f313f00c3596611ad2dc93451ae3831f013dd18e3b156bac1f9fe5ba04c9
[2020-09-26T13:48:20.572] [INFO] Pull: Init - [ABW-013] Adding to qBittorrent
[2020-09-26T13:48:20.576] [INFO] Pull: Init - Handling FSDSS-098's torrent, hash 067f52665c2e72dbb4e192b12c35719f4d81142b31f95de83db540d7296c953e
[2020-09-26T13:48:22.453] [INFO] Pull: Init - [FSDSS-098] Adding to qBittorrent
[2020-09-26T13:48:22.457] [INFO] Pull: Init - Handling CAWD-120's torrent, hash b2fa066b1d605fff4a2a238ab1b11681d91670ca7528a69e5455c18ce319391c
[2020-09-26T13:48:24.077] [INFO] Pull: Init - [CAWD-120] Adding to qBittorrent
[2020-09-26T13:48:24.080] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T13:48:58.927] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:48:58.931] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:49:24.083] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T13:49:24.087] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T13:49:58.935] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:49:58.943] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:50:24.089] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T13:50:24.092] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T13:50:58.947] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:50:58.950] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:51:01.965] [INFO] Module: runAndSetInterval - [OneJAV: 0] Starting job
[
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false }
]
[2020-09-26T13:51:06.096] [INFO] Module: runAndSetInterval - [OneJAV: 0] Job finished, setting timer
[2020-09-26T13:51:24.095] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T13:51:24.100] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T13:51:58.951] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:51:58.954] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:52:24.105] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T13:52:24.108] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T13:52:58.956] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:52:58.960] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:53:24.111] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T13:53:24.115] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T13:53:58.963] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:53:58.967] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:54:24.119] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T13:54:24.122] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T13:54:58.969] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:54:58.973] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:55:24.126] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T13:55:24.131] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T13:55:58.975] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:55:58.978] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:56:06.099] [INFO] Module: runAndSetInterval - [OneJAV: 0] Starting job
[
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false }
]
[2020-09-26T13:56:07.475] [INFO] Module: runAndSetInterval - [OneJAV: 0] Job finished, setting timer
[2020-09-26T13:56:24.135] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T13:56:24.139] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T13:56:58.982] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:56:58.985] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:57:24.143] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T13:57:24.147] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T13:57:58.987] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:57:58.990] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:58:24.151] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T13:58:24.154] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T13:58:58.992] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:58:58.996] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T13:59:24.158] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T13:59:24.161] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T13:59:58.999] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T13:59:59.002] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:00:24.163] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:00:24.166] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:00:59.006] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:00:59.009] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:01:07.476] [INFO] Module: runAndSetInterval - [OneJAV: 0] Starting job
[
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false }
]
[2020-09-26T14:01:12.522] [INFO] Module: runAndSetInterval - [OneJAV: 0] Job finished, setting timer
[2020-09-26T14:01:24.170] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:01:24.174] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:01:59.011] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:01:59.014] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:02:24.178] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:02:24.182] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:02:59.017] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:02:59.020] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:03:24.186] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:03:24.190] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:03:59.022] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:03:59.025] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:04:24.194] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:04:24.197] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:04:59.029] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:04:59.033] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:05:24.201] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:05:24.205] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:05:59.035] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:05:59.038] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:06:12.523] [INFO] Module: runAndSetInterval - [OneJAV: 0] Starting job
[2020-09-26T14:07:32.625] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:07:33.014] [INFO] Pull: Init - Remote list [
{
driver: 'OneJAV',
url: 'https://onejav.com/popular/',
interval: 300
}
]
[2020-09-26T14:07:33.018] [INFO] Module: runAndSetInterval - [OneJAV: 0] Starting job
[2020-09-26T14:07:33.036] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:07:33.418] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:07:33.421] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false }
]
[2020-09-26T14:07:34.430] [INFO] Module: runAndSetInterval - [OneJAV: 0] Job finished, setting timer
[2020-09-26T14:08:33.425] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:08:33.428] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:08:33.433] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:08:33.440] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:09:33.435] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:09:34.144] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:09:34.428] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:09:34.429] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:10:34.429] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:10:39.131] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:10:39.370] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:10:39.719] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:11:40.111] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:11:44.470] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:11:44.877] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:11:44.879] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:12:34.593] [INFO] Module: runAndSetInterval - [OneJAV: 0] Starting job
[2020-09-26T14:12:44.908] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:12:44.910] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:12:44.915] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:12:44.916] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false }
]
[2020-09-26T14:12:47.237] [INFO] Module: runAndSetInterval - [OneJAV: 0] Job finished, setting timer
[2020-09-26T14:13:44.916] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:13:45.575] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:13:45.579] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:13:45.580] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:14:45.579] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:14:45.711] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:14:45.826] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:14:45.828] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:15:45.831] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:15:45.833] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:15:45.836] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:15:45.837] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:16:45.839] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:16:45.840] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:16:45.844] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:16:45.845] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:17:45.847] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:17:45.849] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:17:45.851] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:17:45.853] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:17:47.238] [INFO] Module: runAndSetInterval - [OneJAV: 0] Starting job
[
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false }
]
[2020-09-26T14:17:51.298] [INFO] Module: runAndSetInterval - [OneJAV: 0] Job finished, setting timer
[2020-09-26T14:18:45.855] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:18:45.856] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:18:45.860] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:18:45.862] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:19:45.865] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:19:45.866] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:19:45.869] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:19:45.871] [INFO] Pull: Init - Handling FSDSS-099's torrent, hash 1c01535daa0a590941f7d9bd8842feb2689fdcd091adf3bcac8874ad2bbd60c9
[2020-09-26T14:19:49.884] [INFO] Pull: Init - [FSDSS-099] Adding to qBittorrent
[2020-09-26T14:19:53.079] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:20:45.871] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:20:45.875] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:21:00.764] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:21:00.769] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:21:45.877] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:21:45.881] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:22:00.771] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:22:00.774] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:22:45.884] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:22:45.887] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:22:51.301] [INFO] Module: runAndSetInterval - [OneJAV: 0] Starting job
[
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false },
Node { namespace: null, text: undefined, _selfCloseTag: false }
]
[2020-09-26T14:22:52.751] [INFO] Module: runAndSetInterval - [OneJAV: 0] Job finished, setting timer
[2020-09-26T14:23:00.776] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:23:00.780] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:23:45.889] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:23:45.892] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:24:00.782] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:24:00.786] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:24:45.895] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:24:45.898] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:25:00.788] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:25:00.792] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:25:45.900] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:25:45.903] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:26:00.795] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:26:00.798] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer
[2020-09-26T14:26:45.904] [INFO] Module: runAndSetInterval - [Check torrent status] Starting job
[2020-09-26T14:26:45.907] [INFO] Module: runAndSetInterval - [Check torrent status] Job finished, setting timer
[2020-09-26T14:27:00.803] [INFO] Module: runAndSetInterval - [Download queue] Starting job
[2020-09-26T14:27:00.806] [INFO] Module: runAndSetInterval - [Download queue] Job finished, setting timer

构建web前端时一直报错

root@instance-2:~/JAVClub_web# npm run build 构建web前端时一直报错,但是我尝试用 run dev 可以运行起来, 错误信息是:
⠏ Building for production...Killed
npm ERR! code ELIFECYCLE
npm ERR! errno 137
npm ERR! [email protected] build: vue-cli-service build
npm ERR! Exit status 137
npm ERR!
npm ERR! Failed at the [email protected] build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

我又尝试在全局安装了 vue-cli 还是无果, 原来在ubunbu 18下这样,更换 debian9也是一样。 core已经配置好能跑起来监听3000端口了,就差这个web,请大佬指路。 谢谢

你好, 请问可以更详细地描述一下实现原理吗?

通过阅读文档, 可以知道该项目由三个子项目组成: fetcher, core, web,

  1. fetcher: 抓取种子 -> 推送qBittorrent下载 -> 处理 -> 上传Google Drive.
  2. core: 读取 Google Drive 文件列表->导入本地数据库.
  3. web: 展示信息.

针对上面三个部分, 我有如下的疑问点:

  • 对于"1.":
    • "推送qBittorrent下载": "qBittorrent"是一个node的种子下载器lib吗? 还是说是第三方的种子下载服务呢?
  • 对于"2.":
    • "导入本地数据库": 这里导入的是视频的内容吗? 但是Features上面不是说"视频、图片数据不占用本地空间"吗?

这些疑问我相信通过完成一遍项目的部署和阅读源码来得以解答, 但是在一些概念没有理解之前埋头去做这些事情性价比是不高的, 时间上会耗费更多. 因此想到来这里提一个issues向作者请教, 希望能得到回复. 非常感谢!

希望更详细一点的 Workers & Fetcher 配置描述

折腾了一天将全套系统部署完了,fetch 了 OneJAV 的几部影片到本地后成功 move 到 rclone 挂载的 Google Drive ,网页登陆也可以看到云端硬盘中的文件,可 WebUI 显示有一个硬盘但是没有视频。

不知道是因为我用的是云端共享硬盘还是因为配置错了 QAQ 。fetcher lemp core 全部使用 Docker 部署,以下是我的部分配置过程:

core

关于 core 中说要用到 client_id client_secret access_token refresh_token ,但是我并不知道是在哪里用的... rclone 在服务器挂载硬盘时倒是有需要 client_id client_secret ,然后点链接授权之后返回了 access_token refresh_token 。之后本地挂载和文件 move 都正常。

然后在数据库导入 drives 表数据时说明是这样的:

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】');

嗯,好的,我按照 rclone 挂载时的 client_id client_secret access_token refresh_token 填好了,后面的 driveId 我填的是 https://drive.google.com/drive/folders/【id】 这里后面的文件夹 id 。

然后 secret 我就不知道是什么了 QAQ 。我将部署 google drive workers 时要填的 aes_password 填了进去。

workers

workers 里面的 gd-config.js 中要填 aes_password client_id client_secret refresh_token ,后三个我将 rclone 挂载的时候那几个对应 client_id client_secret refresh_token 填进去了, aes_password emmm... 不知道是啥,我就把 access_token 填了进去,webpack 构建完后部署到 workers.dev 了。

以上就是我认为可能出错的地方了,如果还有什么要补充的细节请提。霖大有时间的话救救孩子!蟹蟹了


我尝试将 AES 加密的密码填在 workers gd-config.js 的 aes_password ,修改 drivers 数据表中的 【path_ase_secret】 为 AES 加密后的谷歌盘文件夹 id ,然后更新 core 容器编排,但是好像也不对 QAQ

测试站点报错

The resource https://fuckloli.net/js/app.197df758.js was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate as value and it is preloaded intentionally.
chrome下会报这个错,打开梯子或者关闭梯子都一样

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.