Comments (11)
首先感谢能花费那么多时间来踩坑
-
没有视频显示
在 core 的配置中有没有设定定时任务呢?(就是 importer 中 cron那项 -
secret 和 aes_password
这里可能的确有点误导,这两个是同一个东西,后续会考虑统一说法
别的步骤看起来都没有什么问题,如果还有什么问题可以把 log level 开到 debug 将错误日志附上来
from core.
core 的 dev.json 是按照默认的:
"cron": [
{
"driveId": 1,
"interval": 36000000,
"doFull": true
}
]
文件我都是手动 rclone move 到谷歌盘,不知道这个自动任务是怎么用 ...
docker loglevel 一直是 debug ,日志写了一大堆 233 ,core 的日志:
{"log":"\u001b[36m[2020-05-02T16:44:23.094] [DEBUG] Module: Cache - \u001b[39m[api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.095020795Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.095] [DEBUG] Module: User - \u001b[39mChecking token sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5\n","stream":"stdout","time":"2020-05-02T08:44:23.153415678Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.099] [DEBUG] Module: Cache - \u001b[39m[api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.153443417Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.099] [DEBUG] Module: User - \u001b[39mChecking token sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5\n","stream":"stdout","time":"2020-05-02T08:44:23.153447963Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.136] [DEBUG] Module: Cache - \u001b[39m[api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.15345172Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.136] [DEBUG] Module: User - \u001b[39mChecking token sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5\n","stream":"stdout","time":"2020-05-02T08:44:23.153455416Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.541] [DEBUG] Module: Cache - \u001b[39m[api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.541665679Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.541] [DEBUG] Module: User - \u001b[39mChecking token sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5\n","stream":"stdout","time":"2020-05-02T08:44:23.541793979Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.542] [DEBUG] Module: Cache - \u001b[39m[api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.543192844Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.543] [DEBUG] Module: User - \u001b[39mChecking token sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5\n","stream":"stdout","time":"2020-05-02T08:44:23.543218593Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.658] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/statistic/getData\n","stream":"stdout","time":"2020-05-02T08:44:23.65903812Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.659] [DEBUG] Module: Cache - \u001b[39m[api_statistic] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.659307678Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.661] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/metadata/getList/1/20\n","stream":"stdout","time":"2020-05-02T08:44:23.661275559Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.661] [DEBUG] API: Metadata - \u001b[39mPage 1, size 20\n","stream":"stdout","time":"2020-05-02T08:44:23.66155576Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.661] [DEBUG] Module: Cache - \u001b[39m[api_metadata_list_1_20] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.661648199Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.665] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/auth/check\n","stream":"stdout","time":"2020-05-02T08:44:23.666047909Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.671] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/statistic/getData\n","stream":"stdout","time":"2020-05-02T08:44:23.671827449Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.671] [DEBUG] Module: Cache - \u001b[39m[api_statistic] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:23.67198189Z"}
{"log":"\u001b[36m[2020-05-02T16:44:23.677] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/auth/check\n","stream":"stdout","time":"2020-05-02T08:44:23.677995665Z"}
{"log":"\u001b[36m[2020-05-02T16:44:30.051] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/metadata/getMetaList/series/1/50\n","stream":"stdout","time":"2020-05-02T08:44:30.051452161Z"}
{"log":"\u001b[36m[2020-05-02T16:44:30.051] [DEBUG] API: Metadata - \u001b[39mType series, page 1, size 50\n","stream":"stdout","time":"2020-05-02T08:44:30.051640628Z"}
{"log":"\u001b[36m[2020-05-02T16:44:30.051] [DEBUG] Module: Cache - \u001b[39m[api_meta_list_series_1_50] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:30.05172411Z"}
{"log":"\u001b[36m[2020-05-02T16:44:32.825] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/metadata/getMetaList/star/1/50\n","stream":"stdout","time":"2020-05-02T08:44:32.825485242Z"}
{"log":"\u001b[36m[2020-05-02T16:44:32.825] [DEBUG] API: Metadata - \u001b[39mType star, page 1, size 50\n","stream":"stdout","time":"2020-05-02T08:44:32.825633323Z"}
{"log":"\u001b[36m[2020-05-02T16:44:32.825] [DEBUG] Module: Cache - \u001b[39m[api_meta_list_stars_1_50] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:32.825786876Z"}
{"log":"\u001b[36m[2020-05-02T16:44:33.723] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/metadata/getMetaList/tag/1/50\n","stream":"stdout","time":"2020-05-02T08:44:33.723378189Z"}
{"log":"\u001b[36m[2020-05-02T16:44:33.723] [DEBUG] API: Metadata - \u001b[39mType tag, page 1, size 50\n","stream":"stdout","time":"2020-05-02T08:44:33.723482056Z"}
{"log":"\u001b[36m[2020-05-02T16:44:33.723] [DEBUG] Module: Cache - \u001b[39m[api_meta_list_tags_1_50] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:33.72349004Z"}
{"log":"\u001b[36m[2020-05-02T16:44:34.403] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/bookmark/getList\n","stream":"stdout","time":"2020-05-02T08:44:34.40339052Z"}
{"log":"\u001b[36m[2020-05-02T16:44:35.017] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/metadata/getList/1/20\n","stream":"stdout","time":"2020-05-02T08:44:35.01784188Z"}
{"log":"\u001b[36m[2020-05-02T16:44:35.017] [DEBUG] API: Metadata - \u001b[39mPage 1, size 20\n","stream":"stdout","time":"2020-05-02T08:44:35.017994494Z"}
{"log":"\u001b[36m[2020-05-02T16:44:40.257] [DEBUG] API: Main - \u001b[39m[UID: 1] GET /api/statistic/getData\n","stream":"stdout","time":"2020-05-02T08:44:40.258310593Z"}
{"log":"\u001b[36m[2020-05-02T16:44:40.258] [DEBUG] Module: Cache - \u001b[39m[api_statistic] Cache missed, creating one\n","stream":"stdout","time":"2020-05-02T08:44:40.258436294Z"}
{"log":"\u001b[36m[2020-05-02T16:44:58.041] [DEBUG] Module: Cache - \u001b[39mExpired cache api_statistic cleared\n","stream":"stdout","time":"2020-05-02T08:44:58.042538495Z"}
{"log":"\u001b[36m[2020-05-02T16:45:58.043] [DEBUG] Module: Cache - \u001b[39mExpired cache api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5 cleared\n","stream":"stdout","time":"2020-05-02T08:45:58.047838368Z"}
{"log":"\u001b[36m[2020-05-02T16:45:58.047] [DEBUG] Module: Cache - \u001b[39mExpired cache api_metadata_list_1_20 cleared\n","stream":"stdout","time":"2020-05-02T08:45:58.048441297Z"}
{"log":"\u001b[36m[2020-05-02T16:45:58.048] [DEBUG] Module: Cache - \u001b[39mExpired cache api_meta_list_series_1_50 cleared\n","stream":"stdout","time":"2020-05-02T08:45:58.048505121Z"}
{"log":"\u001b[36m[2020-05-02T16:45:58.048] [DEBUG] Module: Cache - \u001b[39mExpired cache api_meta_list_stars_1_50 cleared\n","stream":"stdout","time":"2020-05-02T08:45:58.048747348Z"}
{"log":"\u001b[36m[2020-05-02T16:45:58.048] [DEBUG] Module: Cache - \u001b[39mExpired cache api_meta_list_tags_1_50 cleared\n","stream":"stdout","time":"2020-05-02T08:45:58.048795901Z"}
说起看日志我想起来 fetcher 一直在不停的 restart ,我删掉了 mt rss 的源只留了 OneJAV 的源,毕竟 mt 账号看起来... fetcher 配置这块是这样写的,其他地方没有修改:
"remote": [
{
"driver": "OneJAV",
"url": "https://onejav.com/new/"
},{
"driver": "OneJAV",
"url": "https://onejav.com/popular/"
},{
"driver": "OneJAV",
"url": "https://onejav.com/random/"
}
]
qBittorrent WebUI 正常,自动抓取 OneJAV 好像失败了,我在 8585 端口的面板上手动添加 .torrent 地址下载。附上 fetcher 的日志:
{"log":" ^\n","stream":"stderr","time":"2020-05-02T09:33:52.742082913Z"}
{"log":"\n","stream":"stderr","time":"2020-05-02T09:33:52.742087279Z"}
{"log":"Error: Configuration property \"system.logLevel\" is not defined\n","stream":"stderr","time":"2020-05-02T09:33:52.742091512Z"}
{"log":" at Config.get (/usr/app/node_modules/config/lib/config.js:182:11)\n","stream":"stderr","time":"2020-05-02T09:33:52.742096032Z"}
{"log":" at module.exports (/usr/app/src/module/logger.js:6:27)\n","stream":"stderr","time":"2020-05-02T09:33:52.742100539Z"}
{"log":" at Object.\u003canonymous\u003e (/usr/app/src/module/qbittorrent.js:2:35)\n","stream":"stderr","time":"2020-05-02T09:33:52.742104866Z"}
{"log":" at Module._compile (internal/modules/cjs/loader.js:1151:30)\n","stream":"stderr","time":"2020-05-02T09:33:52.742109839Z"}
{"log":" at Object.Module._extensions..js (internal/modules/cjs/loader.js:1171:10)\n","stream":"stderr","time":"2020-05-02T09:33:52.74211435Z"}
{"log":" at Module.load (internal/modules/cjs/loader.js:1000:32)\n","stream":"stderr","time":"2020-05-02T09:33:52.74211899Z"}
{"log":" at Function.Module._load (internal/modules/cjs/loader.js:899:14)\n","stream":"stderr","time":"2020-05-02T09:33:52.742123395Z"}
{"log":" at Module.require (internal/modules/cjs/loader.js:1040:19)\n","stream":"stderr","time":"2020-05-02T09:33:52.742127799Z"}
{"log":" at require (internal/modules/cjs/helpers.js:72:18)\n","stream":"stderr","time":"2020-05-02T09:33:52.742132051Z"}
{"log":" at Object.\u003canonymous\u003e (/usr/app/src/handle/init.js:5:12)\n","stream":"stderr","time":"2020-05-02T09:33:52.742136205Z"}
{"log":"WARNING: NODE_ENV value of 'dev' did not match any deployment config file names.\n","stream":"stderr","time":"2020-05-02T09:34:54.2248761Z"}
{"log":"WARNING: See https://github.com/lorenwest/node-config/wiki/Strict-Mode\n","stream":"stderr","time":"2020-05-02T09:34:54.225272509Z"}
{"log":"WARNING: No configurations found in configuration directory:/usr/app/config/\n","stream":"stderr","time":"2020-05-02T09:34:54.225369699Z"}
{"log":"WARNING: To disable this warning set SUPPRESS_NO_CONFIG_WARNING in the environment.\n","stream":"stderr","time":"2020-05-02T09:34:54.225377256Z"}
{"log":"/usr/app/node_modules/config/lib/config.js:182\n","stream":"stderr","time":"2020-05-02T09:34:54.322909029Z"}
{"log":" throw new Error('Configuration property \"' + property + '\" is not defined');\n","stream":"stderr","time":"2020-05-02T09:34:54.322951291Z"}
{"log":" ^\n","stream":"stderr","time":"2020-05-02T09:34:54.322955051Z"}
{"log":"\n","stream":"stderr","time":"2020-05-02T09:34:54.322957721Z"}
{"log":"Error: Configuration property \"system.logLevel\" is not defined\n","stream":"stderr","time":"2020-05-02T09:34:54.322960108Z"}
{"log":" at Config.get (/usr/app/node_modules/config/lib/config.js:182:11)\n","stream":"stderr","time":"2020-05-02T09:34:54.32296269Z"}
{"log":" at module.exports (/usr/app/src/module/logger.js:6:27)\n","stream":"stderr","time":"2020-05-02T09:34:54.322965293Z"}
{"log":" at Object.\u003canonymous\u003e (/usr/app/src/module/qbittorrent.js:2:35)\n","stream":"stderr","time":"2020-05-02T09:34:54.322978267Z"}
{"log":" at Module._compile (internal/modules/cjs/loader.js:1151:30)\n","stream":"stderr","time":"2020-05-02T09:34:54.322981421Z"}
{"log":" at Object.Module._extensions..js (internal/modules/cjs/loader.js:1171:10)\n","stream":"stderr","time":"2020-05-02T09:34:54.322983868Z"}
{"log":" at Module.load (internal/modules/cjs/loader.js:1000:32)\n","stream":"stderr","time":"2020-05-02T09:34:54.322993614Z"}
{"log":" at Function.Module._load (internal/modules/cjs/loader.js:899:14)\n","stream":"stderr","time":"2020-05-02T09:34:54.322998876Z"}
{"log":" at Module.require (internal/modules/cjs/loader.js:1040:19)\n","stream":"stderr","time":"2020-05-02T09:34:54.323002249Z"}
{"log":" at require (internal/modules/cjs/helpers.js:72:18)\n","stream":"stderr","time":"2020-05-02T09:34:54.323004759Z"}
{"log":" at Object.\u003canonymous\u003e (/usr/app/src/handle/init.js:5:12)\n","stream":"stderr","time":"2020-05-02T09:34:54.32300726Z"}
日志很多都是重复的我就截取了重复的部分,应该没有遗漏什么
from core.
core的日志你截取的都是网站的访问日志而不是importer的日志,可以试试加上 grep Importer 试试,可以先关闭再启动并等待一分钟左右即可看到相关日志
然后fetcher不启动的原因看起来是找不到配置文件,可以检查一下是否已经改名成dev.json并在启动语句前加上 NODE_ENV=dev来让程序寻找到dev.json
关于定时任务的作用就是从Google Drive中读取视频信息并导入到core的数据库中
另外想问一句你上传到网盘的数据有没有经过fetcher处理.... (毕竟看你fetcher都没正常运行
core导入的一定是要fetcher处理过的才行,不是随便一个视频都可以的
from core.
啊,那原来是我没有 fetcher 处理就上传到网盘了(逃...
fetcher 找不到那个可能是我按照教程复制 dev.json 文件的位置错了吗我看看,docker fetcher 的说明:
cp config/dev.example.json dev.json
我试试在 config 文件夹创建 dev.json
不太熟悉 Docker,emmm... Importer 日志像这样,这是没连接上数据库🐎:
root@msvultr2020:~/JAVClub_core# docker logs e928dcbda9fa | grep Importer
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_BAD_DB_ERROR: Unknown database 'javclub'
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.<anonymous> (/usr/app/node_modules/mysql/lib/Connection.js:88:28)
at Socket.<anonymous> (/usr/app/node_modules/mysql/lib/Connection.js:526:10)
at Socket.emit (events.js:321:20)
at Socket.EventEmitter.emit (domain.js:485:12)
--------------------
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
[2020-05-02T11:41:57.960] [DEBUG] Importer: Main - Config: [ { driveId: 1, interval: 36000000, doFull: true } ]
at new Promise (<anonymous>)
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:97:5)
我去试了下,好像还真是 dev.json 位置不对,教程把 dev.json 复制到 fetcher 根目录去了 233
现在 fetcher 日志:
[2020-05-02T10:43:46.494] [DEBUG] Handle: Init - [Check torrent status] Starting job
[2020-05-02T10:43:46.494] [INFO] Module: Qbittorrent - Getting torrent list
[2020-05-02T10:43:46.494] [DEBUG] Module: Qbittorrent - GET /api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true
[2020-05-02T10:43:46.494] [DEBUG] Module: Qbittorrent - GET data: {
method: 'GET',
headers: { Cookie: 'SID=DbuXc2TO8HDajgFE2edemARvVJ48G7W8' }
}
[2020-05-02T10:43:46.499] [DEBUG] Module: Qbittorrent - POST response body Response {
size: 0,
timeout: 0,
[Symbol(Body internals)]: {
body: PassThrough {
_readableState: [ReadableState],
readable: true,
_events: [Object: null prototype],
_eventsCount: 2,
_maxListeners: undefined,
_writableState: [WritableState],
writable: false,
allowHalfOpen: true,
_transformState: [Object],
[Symbol(kCapture)]: false
},
disturbed: false,
error: null
},
[Symbol(Response internals)]: {
url: 'http://qbittorrent:8585/api/v2/torrents/createCategory',
status: 409,
statusText: 'Conflict',
headers: Headers { [Symbol(map)]: [Object: null prototype] },
counter: 0
}
}
[2020-05-02T10:43:46.499] [INFO] Pull: Init - [Download queue] Job finished, setting timer
[2020-05-02T10:43:46.500] [DEBUG] Module: Qbittorrent - GET response body []
[2020-05-02T10:43:46.500] [INFO] Handle: Init - [Check torrent status] Job finished, setting timer
core 日志:
[2020-05-02T18:13:11.480] [INFO] Stack - Stack created
[2020-05-02T18:13:11.500] [DEBUG] Importer: Main - Config: [ { driveId: 1, interval: 36000000, doFull: true } ]
[2020-05-02T18:13:11.500] [INFO] Stack - Creating Instance 1
[2020-05-02T18:13:11.502] [INFO] API: Main - JAVClub core is listening on port 3000!
[2020-05-02T18:13:11.604] [DEBUG] Stack - RowDataPacket {
id: 1,
name: '1',
driverType: 'gd',
driverData: '{"oAuth":{"client_id":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","client_secret":"xxxxxxxxxxxxxxxxxxxxx","redirect_uri":"urn:ietf:wg:oauth:2.0:oob","token":{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","refresh_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","scope":"https://www.googleapis.com/auth/drive","token_type":"Bearer","expiry_date":1583679345619}},"drive":{"driveId":"xxxxxxxxxxx"},"encryption":{"secret":"xxxxxxxxxxxxxx","server":"https://mv-gd.msx.workers.dev"}}',
isEnable: 1,
createTime: '1588363401',
updateTime: '1588363401'
}
[2020-05-02T18:13:11.606] [DEBUG] Driver[1]: Google Drive - Token expiry date 1583679345619
[2020-05-02T18:13:11.606] [INFO] Driver[1]: Google Drive - Refreshing access token
(node:1) [google-auth-library:DEP007] DeprecationWarning: The `refreshAccessToken` method has been deprecated, and will be removed in the 3.0 release of google-auth-library. Please use the `getRequestHeaders` method instead.
[2020-05-02T18:13:11.765] [INFO] Driver[1]: Google Drive - Got access token
[2020-05-02T18:13:11.766] [DEBUG] Driver[1]: Google Drive - {
access_token: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
scope: 'https://www.googleapis.com/auth/drive',
token_type: 'Bearer',
expiry_date: 1588417990765,
refresh_token: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
}
[2020-05-02T18:13:11.766] [INFO] Importer: GD 1 - Got drive instance
[2020-05-02T18:13:11.774] [INFO] Importer: Main - [1] Ready in 32 seconds
[2020-05-02T18:13:43.777] [INFO] Importer: Main - [1] Starting first time import process
[2020-05-02T18:13:43.778] [INFO] Importer: GD 1 - Starting process of import, full = true
[2020-05-02T18:13:43.778] [INFO] Driver[1]: Google Drive - Getting full file list of keyword name='info.json'
[2020-05-02T18:13:43.779] [DEBUG] Driver[1]: Google Drive - Getting page 1
[2020-05-02T18:13:44.102] [INFO] Driver[1]: Google Drive - Got 0 files' metadatas
[2020-05-02T18:13:44.102] [INFO] Importer: GD 1 - Got info.json file list
[2020-05-02T18:13:44.102] [INFO] Importer: GD 1 - All Promise settled
[2020-05-02T18:13:44.102] [INFO] Importer: Main - [1] First time import process fininshed
[2020-05-02T18:13:44.102] [DEBUG] Importer: Main - [1] Cron set, 36000000ms
[2020-05-02T18:18:52.141] [DEBUG] Module: Cache - [api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5] Cache missed, creating one
[2020-05-02T18:18:52.142] [DEBUG] Module: User - Checking token sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5
[2020-05-02T18:18:52.166] [DEBUG] API: Main - [UID: 1] GET /api/auth/check
[2020-05-02T18:18:52.310] [DEBUG] API: Main - [UID: 1] GET /api/statistic/getData
[2020-05-02T18:18:52.311] [DEBUG] Module: Cache - [api_statistic] Cache missed, creating one
[2020-05-02T18:19:10.566] [DEBUG] Module: Cache - Expired cache api_statistic cleared
[2020-05-02T18:20:10.567] [DEBUG] Module: Cache - Expired cache api_checktoken_sjdkfgho9we84yt98w7yhtguierhbgu93oh578gwijhgnwo5 cleared
我觉得我需要等几天再看有没有数据了
from core.
Unknown database 'javclub'
写得挺明白了的吧...
数据的话你就等fetcher处理完第一个种子然后把sync目录里面的所有东西上传到网盘里就可以了
from core.
数据库的问题我已经检查了,那个找不到数据库应该是之前启动的时候没有先启动 lemp ,日志也记录了我没删。后来我清空日志重新编排了容器,core 日志中没有数据库的报错了。现在数据库是没问题的了,但 fetcher 对 http://qbittorrent:8585/api/v2/torrents/createCategory
发起请求的响应一直都是 409 错误。fetcher/tmp 的 downloads sync 目录下无内容。fetcher 的日志内容如下:
2020-05-04T03:14:33.511655019Z [2020-05-04T03:14:33.511] [DEBUG] Handle: Init - [Check torrent status] Starting job
2020-05-04T03:14:33.511721393Z [2020-05-04T03:14:33.511] [INFO] Module: Qbittorrent - Getting torrent list
2020-05-04T03:14:33.511946559Z [2020-05-04T03:14:33.511] [DEBUG] Module: Qbittorrent - GET /api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true
2020-05-04T03:14:33.512026522Z [2020-05-04T03:14:33.511] [DEBUG] Module: Qbittorrent - GET data: {
2020-05-04T03:14:33.512043878Z method: 'GET',
2020-05-04T03:14:33.512048181Z headers: { Cookie: 'SID=RLNLgyGTTFfwgbhrwK1mxm/WD8o520p1' }
2020-05-04T03:14:33.512051822Z }
2020-05-04T03:14:33.512673306Z [2020-05-04T03:14:33.512] [DEBUG] Pull: Init - [Download queue] Starting job
2020-05-04T03:14:33.512932456Z [2020-05-04T03:14:33.512] [INFO] Module: Qbittorrent - Adding category JAVClub
2020-05-04T03:14:33.512945841Z [2020-05-04T03:14:33.512] [DEBUG] Module: Qbittorrent - POST /api/v2/torrents/createCategory
2020-05-04T03:14:33.512949872Z [2020-05-04T03:14:33.512] [DEBUG] Module: Qbittorrent - POST data: {
2020-05-04T03:14:33.512953383Z method: 'POST',
2020-05-04T03:14:33.512956633Z body: URLSearchParams { 'category' => 'JAVClub', 'savePath' => 'JAVClub' },
2020-05-04T03:14:33.512960156Z headers: { Cookie: 'SID=RLNLgyGTTFfwgbhrwK1mxm/WD8o520p1' }
2020-05-04T03:14:33.512963567Z }
2020-05-04T03:14:33.514702086Z [2020-05-04T03:14:33.514] [DEBUG] Module: Qbittorrent - GET response body []
2020-05-04T03:14:33.514733031Z [2020-05-04T03:14:33.514] [INFO] Handle: Init - [Check torrent status] Job finished, setting timer
2020-05-04T03:14:33.515114865Z [2020-05-04T03:14:33.514] [DEBUG] Module: Qbittorrent - POST response body Response {
2020-05-04T03:14:33.515130150Z size: 0,
2020-05-04T03:14:33.515133741Z timeout: 0,
2020-05-04T03:14:33.515136768Z [Symbol(Body internals)]: {
2020-05-04T03:14:33.515139857Z body: PassThrough {
2020-05-04T03:14:33.515143100Z _readableState: [ReadableState],
2020-05-04T03:14:33.515146238Z readable: true,
2020-05-04T03:14:33.515149235Z _events: [Object: null prototype],
2020-05-04T03:14:33.515152063Z _eventsCount: 2,
2020-05-04T03:14:33.515155032Z _maxListeners: undefined,
2020-05-04T03:14:33.515157889Z _writableState: [WritableState],
2020-05-04T03:14:33.515160789Z writable: false,
2020-05-04T03:14:33.515163850Z allowHalfOpen: true,
2020-05-04T03:14:33.515166993Z _transformState: [Object],
2020-05-04T03:14:33.515183965Z [Symbol(kCapture)]: false
2020-05-04T03:14:33.515186803Z },
2020-05-04T03:14:33.515189282Z disturbed: false,
2020-05-04T03:14:33.515191784Z error: null
2020-05-04T03:14:33.515194301Z },
2020-05-04T03:14:33.515196867Z [Symbol(Response internals)]: {
2020-05-04T03:14:33.515199464Z url: 'http://qbittorrent:8585/api/v2/torrents/createCategory',
2020-05-04T03:14:33.515202315Z status: 409,
2020-05-04T03:14:33.515204848Z statusText: 'Conflict',
2020-05-04T03:14:33.515207521Z headers: Headers { [Symbol(map)]: [Object: null prototype] },
2020-05-04T03:14:33.515210292Z counter: 0
2020-05-04T03:14:33.515212858Z }
2020-05-04T03:14:33.515215354Z }
2020-05-04T03:14:33.515219700Z [2020-05-04T03:14:33.515] [INFO] Pull: Init - [Download queue] Job finished, setting timer
不知道是否和我的容器网络桥接有关,此时我的 fetcher 和 qbittorrent 同时存在于 javclub_lemp_default
和 javclub_fetcher_default
网络中, docker network 如下:
root@msvultr2020:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
a5eb30cf6dee bridge bridge local
732bcdad4481 host host local
4f07216d6714 javclub_fetcher_default bridge local
e67609173e19 javclub_lemp_default bridge local
3a4e5788bcb4 none null local
root@msvultr2020:~# docker network inspect javclub_fetcher_default
[
{
"Name": "javclub_fetcher_default",
"Id": "4f07216d671467e46919eb16d5b21981e38afc0d8d070c7ea92ee6c7f7b80f4d",
"Created": "2020-05-01T11:51:27.505918288Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"186de75ba4d8ad8be838c7abfa1635ffd870928ab25196ea9aec7b4f358c54f9": {
"Name": "fetcher",
"EndpointID": "aba7bd94f378ef481043ac75b2acede8b1109e50767aa448f7ef54b02959522f",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
"8829e3f2dcc97a77fd415a9fbe892ce25ca0b5302b4292754a026bae2607a769": {
"Name": "qbittorrent",
"EndpointID": "d6b9e07b5e440d4ad1f9a5636f8b57d61f9f52734b5a40febf90fc0b3e520df7",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
root@msvultr2020:~# docker network inspect javclub_lemp_default
[
{
"Name": "javclub_lemp_default",
"Id": "e67609173e191ed009190f3692c1eb9ec2377492c009fe3440fc709df97fed3a",
"Created": "2020-05-01T12:25:23.425133701Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0920253567cad31a1a4538b3f392813d2385daaf75b0c7af2596963e79895f4a": {
"Name": "javclub_lemp_php-fpm_1",
"EndpointID": "e3e28dbc001c1e2223374fdf24c034aed5ad944d350a0551c1e97dd914d91266",
"MacAddress": "02:42:ac:13:00:06",
"IPv4Address": "172.19.0.6/16",
"IPv6Address": ""
},
"186de75ba4d8ad8be838c7abfa1635ffd870928ab25196ea9aec7b4f358c54f9": {
"Name": "fetcher",
"EndpointID": "e66fdb9adcadc36b7d93b0a08b78403d6dd210c80a8658470a663c66692a19ba",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
},
"41556a6d0a3e53e37c0923f6089f42088e6892fb58f940f179641ba49b63cdef": {
"Name": "javclub_lemp_nginx_1",
"EndpointID": "abf62e1f5ffeb53363814fd7a9cb988eb01b715d2dfb63c0fd8b65bf7b9e8445",
"MacAddress": "02:42:ac:13:00:07",
"IPv4Address": "172.19.0.7/16",
"IPv6Address": ""
},
"607adedbb599b34c4c678a1e02bbd8efb051cd571d605c1a85d71205acfb9bfa": {
"Name": "javclub_lemp_redis_1",
"EndpointID": "a0d97fe555af900c1debcc51992b15fb5d3b9215b0b8fec2c9d3687282eddc86",
"MacAddress": "02:42:ac:13:00:08",
"IPv4Address": "172.19.0.8/16",
"IPv6Address": ""
},
"8829e3f2dcc97a77fd415a9fbe892ce25ca0b5302b4292754a026bae2607a769": {
"Name": "qbittorrent",
"EndpointID": "bd5dc1e32df48cb046d52ce9d726a616c406011e09fdc900cc643bab3c5eb1e2",
"MacAddress": "02:42:ac:13:00:04",
"IPv4Address": "172.19.0.4/16",
"IPv6Address": ""
},
"962e1c888897ac6bef0327203875820a2ab2e2e091ecc839a5146c28d338ae9a": {
"Name": "javclub_lemp_mysql_1",
"EndpointID": "9ae7b1f317bfabbe7b4afcfbaa534de54b6af7e9f51ae3d7a4ec614b68fca93f",
"MacAddress": "02:42:ac:13:00:05",
"IPv4Address": "172.19.0.5/16",
"IPv6Address": ""
},
"c45050da45070bebea7d089812db4ebef6290dd7f15642876fbd7e0902febe5d": {
"Name": "javclub_lemp_phpmyadmin_1",
"EndpointID": "eeeb39627228ebfcb1826d21c4a98f1a39084fa21f9a5e27c3b8ab22c37c013b",
"MacAddress": "02:42:ac:13:00:09",
"IPv4Address": "172.19.0.9/16",
"IPv6Address": ""
},
"e928dcbda9fad17296a33ba54c6c1a697a01631fd10a788765158c76cc0f6b50": {
"Name": "javclub_core_core_1",
"EndpointID": "6d1934faa8bf7677ac072f90768f7c116a277c3b820146b247d8470a1bad9ec8",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "javclub_lemp",
"com.docker.compose.version": "1.25.4"
}
}
]
我尝试将 fetcher 和 qbittorrent 容器从 javclub_lemp_default
网络中剥离,让他俩只存在于 javclub_fetcher_default
网络中,但是依旧失败,刚开始日志报了一个 409 ,后来都是 403 响应,fetcher 日志如下:
[2020-05-04T03:34:32.528] [DEBUG] Handle: Init - [Check torrent status] Starting job
[2020-05-04T03:34:32.534] [INFO] Module: Qbittorrent - Getting torrent list
[2020-05-04T03:34:32.534] [DEBUG] Module: Qbittorrent - GET /api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true
[2020-05-04T03:34:32.575] [DEBUG] Pull: Init - [Download queue] Starting job
[2020-05-04T03:34:32.576] [INFO] Module: Qbittorrent - Adding category JAVClub
[2020-05-04T03:34:32.577] [DEBUG] Module: Qbittorrent - POST /api/v2/torrents/createCategory
[2020-05-04T03:34:32.630] [DEBUG] Pull: Init - Remote list [
{ driver: 'OneJAV', url: 'https://onejav.com/new/' },
{ driver: 'OneJAV', url: 'https://onejav.com/popular/' },
{ driver: 'OneJAV', url: 'https://onejav.com/random/' }
]
[2020-05-04T03:34:32.859] [DEBUG] Module: Qbittorrent - Auth body: Ok.
[2020-05-04T03:34:32.860] [INFO] Module: Qbittorrent - Cookie: SID=Ys3jgOC0uEuC/Kzgz3mtVbQt4Rr0HQkP
[2020-05-04T03:34:32.860] [DEBUG] Module: Qbittorrent - GET data: {
method: 'GET',
headers: { Cookie: 'SID=Ys3jgOC0uEuC/Kzgz3mtVbQt4Rr0HQkP' }
}
[2020-05-04T03:34:32.862] [DEBUG] Module: Qbittorrent - Auth body: Ok.
[2020-05-04T03:34:32.863] [INFO] Module: Qbittorrent - Cookie: SID=TOhsOgyGUOfPB+Ra0qvdyw57AKuuIW01
[2020-05-04T03:34:32.863] [DEBUG] Module: Qbittorrent - POST data: {
method: 'POST',
body: URLSearchParams { 'category' => 'JAVClub', 'savePath' => 'JAVClub' },
headers: { Cookie: 'SID=TOhsOgyGUOfPB+Ra0qvdyw57AKuuIW01' }
}
[2020-05-04T03:34:32.867] [DEBUG] Module: Qbittorrent - GET response body []
[2020-05-04T03:34:32.868] [INFO] Handle: Init - [Check torrent status] Job finished, setting timer
[2020-05-04T03:34:32.869] [DEBUG] Module: Qbittorrent - POST response body Response {
size: 0,
timeout: 0,
[Symbol(Body internals)]: {
body: PassThrough {
_readableState: [ReadableState],
readable: true,
_events: [Object: null prototype],
_eventsCount: 2,
_maxListeners: undefined,
_writableState: [WritableState],
writable: false,
allowHalfOpen: true,
_transformState: [Object],
[Symbol(kCapture)]: false
},
disturbed: false,
error: null
},
[Symbol(Response internals)]: {
url: 'http://qbittorrent:8585/api/v2/torrents/createCategory',
status: 409,
statusText: 'Conflict',
headers: Headers { [Symbol(map)]: [Object: null prototype] },
counter: 0
}
}
[2020-05-04T03:34:32.870] [INFO] Pull: Init - [Download queue] Job finished, setting timer
[2020-05-04T03:35:32.915] [DEBUG] Handle: Init - [Check torrent status] Starting job
[2020-05-04T03:35:32.915] [INFO] Module: Qbittorrent - Getting torrent list
[2020-05-04T03:35:32.915] [DEBUG] Module: Qbittorrent - GET /api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true
[2020-05-04T03:35:32.916] [DEBUG] Module: Qbittorrent - GET data: {
method: 'GET',
headers: { Cookie: 'SID=TOhsOgyGUOfPB+Ra0qvdyw57AKuuIW01' }
}
[2020-05-04T03:35:32.917] [DEBUG] Pull: Init - [Download queue] Starting job
[2020-05-04T03:35:32.917] [INFO] Module: Qbittorrent - Adding category JAVClub
[2020-05-04T03:35:32.917] [DEBUG] Module: Qbittorrent - POST /api/v2/torrents/createCategory
[2020-05-04T03:35:32.917] [DEBUG] Module: Qbittorrent - POST data: {
method: 'POST',
body: URLSearchParams { 'category' => 'JAVClub', 'savePath' => 'JAVClub' },
headers: { Cookie: 'SID=TOhsOgyGUOfPB+Ra0qvdyw57AKuuIW01' }
}
[2020-05-04T03:35:32.921] [ERROR] Handle: Init - [Check torrent status] Job threw an error FetchError: invalid json response body at http://qbittorrent:8585/api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true reason: Unexpected end of JSON input
at /usr/app/node_modules/node-fetch/lib/index.js:272:32
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at async Qbittorrent.sendRequest (/usr/app/src/module/qbittorrent.js:57:31)
at async Qbittorrent.getTorrentList (/usr/app/src/module/qbittorrent.js:69:24)
at async process (/usr/app/src/handle/init.js:25:25)
at async /usr/app/src/handle/init.js:128:5
at async runAndSetInterval (/usr/app/src/handle/init.js:13:9) {
message: 'invalid json response body at http://qbittorrent:8585/api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true reason: Unexpected end of JSON input',
type: 'invalid-json'
}
[2020-05-04T03:35:32.922] [INFO] Handle: Init - [Check torrent status] Job finished, setting timer
[2020-05-04T03:35:32.915] [DEBUG] Handle: Init - [Check torrent status] Starting job
[2020-05-04T03:35:32.915] [INFO] Module: Qbittorrent - Getting torrent list
[2020-05-04T03:35:32.915] [DEBUG] Module: Qbittorrent - GET /api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true
[2020-05-04T03:35:32.916] [DEBUG] Module: Qbittorrent - GET data: {
method: 'GET',
headers: { Cookie: 'SID=TOhsOgyGUOfPB+Ra0qvdyw57AKuuIW01' }
}
[2020-05-04T03:35:32.917] [DEBUG] Pull: Init - [Download queue] Starting job
[2020-05-04T03:35:32.917] [INFO] Module: Qbittorrent - Adding category JAVClub
[2020-05-04T03:35:32.917] [DEBUG] Module: Qbittorrent - POST /api/v2/torrents/createCategory
[2020-05-04T03:35:32.917] [DEBUG] Module: Qbittorrent - POST data: {
method: 'POST',
body: URLSearchParams { 'category' => 'JAVClub', 'savePath' => 'JAVClub' },
headers: { Cookie: 'SID=TOhsOgyGUOfPB+Ra0qvdyw57AKuuIW01' }
}
[2020-05-04T03:35:32.921] [ERROR] Handle: Init - [Check torrent status] Job threw an error FetchError: invalid json response body at http://qbittorrent:8585/api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true reason: Unexpected end of JSON input
at /usr/app/node_modules/node-fetch/lib/index.js:272:32
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at async Qbittorrent.sendRequest (/usr/app/src/module/qbittorrent.js:57:31)
at async Qbittorrent.getTorrentList (/usr/app/src/module/qbittorrent.js:69:24)
at async process (/usr/app/src/handle/init.js:25:25)
at async /usr/app/src/handle/init.js:128:5
at async runAndSetInterval (/usr/app/src/handle/init.js:13:9) {
message: 'invalid json response body at http://qbittorrent:8585/api/v2/torrents/info?limit=5&category=JAVClub&filter=paused&sort=completion_on&reverse=true reason: Unexpected end of JSON input',
type: 'invalid-json'
}
[2020-05-04T03:35:32.922] [INFO] Handle: Init - [Check torrent status] Job finished, setting timer
[2020-05-04T03:35:32.922] [DEBUG] Module: Qbittorrent - POST response body Response {
size: 0,
timeout: 0,
[Symbol(Body internals)]: {
body: PassThrough {
_readableState: [ReadableState],
readable: true,
_events: [Object: null prototype],
_eventsCount: 2,
_maxListeners: undefined,
_writableState: [WritableState],
writable: false,
allowHalfOpen: true,
_transformState: [Object],
[Symbol(kCapture)]: false
},
disturbed: false,
error: null
},
[Symbol(Response internals)]: {
url: 'http://qbittorrent:8585/api/v2/torrents/createCategory',
status: 403,
statusText: 'Forbidden',
headers: Headers { [Symbol(map)]: [Object: null prototype] },
counter: 0
}
}
[2020-05-04T03:35:32.923] [INFO] Pull: Init - [Download queue] Job finished, setting timer
不知道是哪里的问题...
from core.
因为没法判断是否已存在分类 JAVClub 所以每次都会尝试创建一个分类, 如果已存在就会返回 409, 这个不用在意
以及 fetcher/qBittorrent 和 core 是完全没有关系的, 可以当两个东西来看, 不需要放在同一个网络里面
看日志的话应该是 qBittorrent 端的相应不符合预期, 可以检查一下 qBittorrent 里面是否存在 JAVClub
这个分类以及贴一下你拉取的 qBittorrent 版本吗
发现文档中漏了一个很重要的东西, 可以加上再试试
{
"driver": "RSS",
"type": "MT",
"url": "https://pt.m-team.cc/torrentrss.php?https=1&rows=30&cat410=1&isize=1&search=-&search_mode=1&linktype=dl&passkey=",
"interval": 300
}
interval
是轮询延时, 以秒为单位
from core.
因为 qBittorrent 还在快速迭代期, 所以 API 在疯狂变动, 为了避免麻烦这里钦定 4.2.1
版本(即 web API 版本为 2.4 的版本), 请升/降级到指定版本使用
如果使用 Docker 部署可以拉取最新的 docker-compose.yaml
from core.
之前拉取的是 qbittorrent 是最新版本的。
root@msvultr2020:~# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
linuxserver/qbittorrent latest c77db2e3af22 5 days ago 333MB
检查一下 qBittorrent 里面是否存在 JAVClub 这个分类
这个分类如果是个叫 JAVClub 的文件夹的话,那没有
nice! 换了版本现在看起来没什么问题了。fetcher 日志中只有 409 了。
from core.
好的,要是成功部署的话还请发个喜报(不是)让我知道这玩意儿能用hhhh
from core.
会的 嘿嘿 (怎么会不能用呢
from core.
Related Issues (20)
- 希望能在core裡面直接實現抓取影片 (海外用戶) HOT 6
- 两个建议 HOT 6
- 卡在数据库那里 HOT 6
- 播放的时候会转码吗,服务器转码还是客户端转码? HOT 4
- [email protected]
- 如果可以实现观看电影电视剧就好了 HOT 1
- 所有api访问都报这个错 HOT 14
- 气死人
- 构建web前端时一直报错 HOT 5
- 支持老哥哦,虽然不用在线的
- 手动插入drives表,导入成功,链接gd出错 HOT 1
- cf会不会封号 HOT 1
- 请问我已把分享在tg上分享的导到dg盘了,那如何接着这些资料继续爬新的资料呢? HOT 1
- 請問展示站是不是不能用了 HOT 1
- 项目跑起来 第一个种子下载完成后 /tmp/sync/ 目录下没有出现xx/xx/xx.....xx/ 这种目录 HOT 2
- 谷歌教育版政策不变,希望作者继续更新下去呐! HOT 2
- 创建书签失败
- 有没有考虑添加themoviedb的api或者豆瓣的呢?
- windows可以用吗
- 小白的建议
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from core.