新增版本检查功能 v2.20.0

This commit is contained in:
binaryify 2018-09-06 21:11:27 +08:00
parent b485c8ed40
commit 106a153597
4 changed files with 1200 additions and 311 deletions

View File

@ -1,5 +1,9 @@
# 更新日志 # 更新日志
### 2.20.0 | 2018.09.06
新增版本检查功能
### 2.19.0 | 2018.08.29 ### 2.19.0 | 2018.08.29
新增获取视频数据接口,新增发送/删除评论接口,修复登录状态接口问题,完善文档 #301,感谢 @izhenyuls 新增获取视频数据接口,新增发送/删除评论接口,修复登录状态接口问题,完善文档 #301,感谢 @izhenyuls

112
app.js
View File

@ -1,77 +1,95 @@
const express = require("express"); const express = require('express')
const apicache = require("apicache"); const apicache = require('apicache')
const path = require("path"); const path = require('path')
const fs = require("fs"); const fs = require('fs')
const app = express(); const app = express()
let cache = apicache.middleware; let cache = apicache.middleware
var npmview = require('npmview')
// 跨域设置 npmview('NeteaseCloudMusicApi', function(err, version, moduleInfo) {
app.all("*", function(req, res, next) { if (err) {
if (req.path !== "/" && !req.path.includes(".")) { console.error(err)
res.header("Access-Control-Allow-Credentials", true); return
// 这里获取 origin 请求头 而不是用 *
res.header("Access-Control-Allow-Origin", req.headers["origin"] || "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("Content-Type", "application/json;charset=utf-8");
} }
next(); const package = require('./package.json')
}); if (package.version < version) {
console.log(
'最新版:Version:' +
version +
',当前版本:' +
package.version +
',请及时更新'
)
}
})
// 跨域设置
app.all('*', function(req, res, next) {
if (req.path !== '/' && !req.path.includes('.')) {
res.header('Access-Control-Allow-Credentials', true)
// 这里获取 origin 请求头 而不是用 *
res.header('Access-Control-Allow-Origin', req.headers['origin'] || '*')
res.header('Access-Control-Allow-Headers', 'X-Requested-With')
res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
res.header('Content-Type', 'application/json;charset=utf-8')
}
next()
})
const onlyStatus200 = (req, res) => res.statusCode === 200; const onlyStatus200 = (req, res) => res.statusCode === 200
app.use(cache("2 minutes", onlyStatus200)); app.use(cache('2 minutes', onlyStatus200))
app.use(express.static(path.resolve(__dirname, "public"))); app.use(express.static(path.resolve(__dirname, 'public')))
app.use(function(req, res, next) { app.use(function(req, res, next) {
const proxy = req.query.proxy; const proxy = req.query.proxy
if (proxy) { if (proxy) {
req.headers.cookie = req.headers.cookie + `__proxy__${proxy}`; req.headers.cookie = req.headers.cookie + `__proxy__${proxy}`
} }
next(); next()
}); })
// 因为这几个文件对外所注册的路由 和 其他文件对外注册的路由规则不一样, 所以专门写个MAP对这些文件做特殊处理 // 因为这几个文件对外所注册的路由 和 其他文件对外注册的路由规则不一样, 所以专门写个MAP对这些文件做特殊处理
const UnusualRouteFileMap = { const UnusualRouteFileMap = {
// key 为文件名, value 为对外注册的路由 // key 为文件名, value 为对外注册的路由
"daily_signin.js": "/daily_signin", 'daily_signin.js': '/daily_signin',
"fm_trash.js": "/fm_trash", 'fm_trash.js': '/fm_trash',
"personal_fm.js": "/personal_fm" 'personal_fm.js': '/personal_fm'
}; }
// 简化 路由 导出方式, 由这里统一对 router 目录中导出的路由做包装, 路由实际对应的文件只专注做它该做的事情, 不用重复写样板代码 // 简化 路由 导出方式, 由这里统一对 router 目录中导出的路由做包装, 路由实际对应的文件只专注做它该做的事情, 不用重复写样板代码
const { createWebAPIRequest, request } = require("./util/util"); const { createWebAPIRequest, request } = require('./util/util')
const Wrap = fn => (req, res) => fn(req, res, createWebAPIRequest, request); const Wrap = fn => (req, res) => fn(req, res, createWebAPIRequest, request)
// 同步读取 router 目录中的js文件, 根据命名规则, 自动注册路由 // 同步读取 router 目录中的js文件, 根据命名规则, 自动注册路由
fs.readdirSync(path.resolve(__dirname, "router")).reverse().forEach(file => { fs.readdirSync(path.resolve(__dirname, 'router'))
.reverse()
.forEach(file => {
if (/\.js$/i.test(file) === false) { if (/\.js$/i.test(file) === false) {
return; return
} }
let route; let route
if (typeof UnusualRouteFileMap[file] !== "undefined") { if (typeof UnusualRouteFileMap[file] !== 'undefined') {
route = UnusualRouteFileMap[file]; route = UnusualRouteFileMap[file]
} else { } else {
route = route =
"/" + '/' +
file file
.replace(/\.js$/i, "") .replace(/\.js$/i, '')
.replace(/_/g, "/") .replace(/_/g, '/')
.replace(/[A-Z]/g, a => { .replace(/[A-Z]/g, a => {
return "/" + a.toLowerCase(); return '/' + a.toLowerCase()
}); })
} }
app.use(route, Wrap(require("./router/" + file))); app.use(route, Wrap(require('./router/' + file)))
}); })
const port = process.env.PORT || 3000; const port = process.env.PORT || 3000
app.listen(port, () => { app.listen(port, () => {
console.log(`server running @ http://localhost:${port}`); console.log(`server running @ http://localhost:${port}`)
}); })
module.exports = app; module.exports = app

View File

@ -1,6 +1,6 @@
{ {
"name": "NeteaseCloudMusicApi", "name": "NeteaseCloudMusicApi",
"version": "2.19.0", "version": "2.20.0",
"description": "网易云音乐 NodeJS 版 API", "description": "网易云音乐 NodeJS 版 API",
"scripts": { "scripts": {
"start": "node app.js", "start": "node app.js",
@ -18,7 +18,8 @@
"apicache": "^1.2.1", "apicache": "^1.2.1",
"big-integer": "^1.6.28", "big-integer": "^1.6.28",
"express": "^4.16.3", "express": "^4.16.3",
"request": "^2.85.0" "request": "^2.85.0",
"npmview": "^0.0.4"
}, },
"devDependencies": { "devDependencies": {
"intelli-espower-loader": "^1.0.1", "intelli-espower-loader": "^1.0.1",

1376
yarn.lock

File diff suppressed because it is too large Load Diff