mirror of
https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced.git
synced 2025-10-22 22:53:09 +00:00
97 lines
2.4 KiB
JavaScript
97 lines
2.4 KiB
JavaScript
const { serveNcmApi } = require('../../server')
|
|
|
|
// 默认配置
|
|
const defaultEnv = {
|
|
ENABLE_GENERAL_UNBLOCK: 'true',
|
|
ENABLE_FLAC: 'true',
|
|
SELECT_MAX_BR: 'true',
|
|
UNBLOCK_SOURCE: 'pyncmd,qq,kuwo,migu,kugou',
|
|
FOLLOW_SOURCE_ORDER: 'true',
|
|
CORS_ALLOW_ORIGIN: '*',
|
|
ENABLE_PROXY: 'false',
|
|
PROXY_URL: '',
|
|
NETEASE_COOKIE: '',
|
|
JOOX_COOKIE: '',
|
|
MIGU_COOKIE: '',
|
|
QQ_COOKIE: '',
|
|
YOUTUBE_KEY: ''
|
|
}
|
|
|
|
let app = null
|
|
|
|
export async function onRequest(context) {
|
|
const { request, env } = context
|
|
|
|
// 合并默认配置和环境变量
|
|
Object.keys(defaultEnv).forEach(key => {
|
|
process.env[key] = env[key] || defaultEnv[key]
|
|
})
|
|
|
|
if (!app) {
|
|
app = await serveNcmApi({
|
|
checkVersion: false // 禁用版本检查,避免在边缘函数环境中发起不必要的网络请求
|
|
})
|
|
}
|
|
|
|
return new Promise((resolve) => {
|
|
let body = []
|
|
request.arrayBuffer().then(buffer => {
|
|
if (buffer.byteLength > 0) {
|
|
body = Buffer.from(buffer)
|
|
}
|
|
|
|
// 构造 Express 兼容的请求对象
|
|
const req = new Proxy(request, {
|
|
get: (target, prop) => {
|
|
switch(prop) {
|
|
case 'body':
|
|
return body
|
|
case 'query':
|
|
return Object.fromEntries(new URL(request.url).searchParams)
|
|
case 'cookies':
|
|
return Object.fromEntries(
|
|
request.headers.get('cookie')?.split(';')
|
|
.map(cookie => cookie.trim().split('='))
|
|
.map(([key, value]) => [key, decodeURIComponent(value)]) || []
|
|
)
|
|
default:
|
|
return target[prop]
|
|
}
|
|
}
|
|
})
|
|
|
|
// 构造 Express 兼容的响应对象
|
|
const res = {
|
|
status: (code) => {
|
|
res.statusCode = code
|
|
return res
|
|
},
|
|
set: (headers) => {
|
|
Object.entries(headers).forEach(([key, value]) => {
|
|
res.headers[key] = value
|
|
})
|
|
return res
|
|
},
|
|
send: (body) => {
|
|
const response = new Response(
|
|
typeof body === 'string' ? body : JSON.stringify(body),
|
|
{
|
|
status: res.statusCode || 200,
|
|
headers: {
|
|
'Content-Type': 'application/json;charset=utf-8',
|
|
...res.headers
|
|
}
|
|
}
|
|
)
|
|
resolve(response)
|
|
},
|
|
statusCode: 200,
|
|
headers: {}
|
|
}
|
|
|
|
// 处理请求
|
|
app.handle(req, res)
|
|
})
|
|
})
|
|
}
|