fix: 改进音乐API代理的图片端点处理,将JSON响应转换为重定向
This commit is contained in:
@@ -310,7 +310,8 @@ function downloadFile(url, dest) {
|
|||||||
|
|
||||||
// --- Music API Proxy Function ---
|
// --- Music API Proxy Function ---
|
||||||
function proxyRequest(targetUrl, req, res) {
|
function proxyRequest(targetUrl, req, res) {
|
||||||
const parsedTarget = url.parse(targetUrl);
|
const parsedTarget = url.parse(targetUrl, true);
|
||||||
|
const isPicRequest = parsedTarget.query && parsedTarget.query.type === 'pic';
|
||||||
|
|
||||||
const options = {
|
const options = {
|
||||||
hostname: parsedTarget.hostname,
|
hostname: parsedTarget.hostname,
|
||||||
@@ -325,6 +326,53 @@ function proxyRequest(targetUrl, req, res) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const proxyReq = https.request(options, (proxyRes) => {
|
const proxyReq = https.request(options, (proxyRes) => {
|
||||||
|
const passThrough = () => {
|
||||||
|
const headers = { ...proxyRes.headers };
|
||||||
|
delete headers['content-encoding'];
|
||||||
|
delete headers['transfer-encoding'];
|
||||||
|
|
||||||
|
res.writeHead(proxyRes.statusCode, headers);
|
||||||
|
proxyRes.pipe(res);
|
||||||
|
};
|
||||||
|
|
||||||
|
// pic endpoint now returns JSON, turn it into a redirect for <img>
|
||||||
|
if (isPicRequest) {
|
||||||
|
if (proxyRes.statusCode >= 300 && proxyRes.statusCode < 400 && proxyRes.headers.location) {
|
||||||
|
res.writeHead(302, { Location: proxyRes.headers.location });
|
||||||
|
proxyRes.resume();
|
||||||
|
res.end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const contentType = proxyRes.headers['content-type'] || '';
|
||||||
|
if (contentType.startsWith('image/')) {
|
||||||
|
passThrough();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let body = '';
|
||||||
|
proxyRes.setEncoding('utf8');
|
||||||
|
proxyRes.on('data', chunk => body += chunk);
|
||||||
|
proxyRes.on('end', () => {
|
||||||
|
try {
|
||||||
|
const parsedBody = JSON.parse(body);
|
||||||
|
if (parsedBody && parsedBody.url) {
|
||||||
|
res.writeHead(302, { Location: parsedBody.url });
|
||||||
|
res.end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// fall through
|
||||||
|
}
|
||||||
|
|
||||||
|
res.writeHead(proxyRes.statusCode || 200, {
|
||||||
|
'Content-Type': proxyRes.headers['content-type'] || 'application/json'
|
||||||
|
});
|
||||||
|
res.end(body);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Handle redirects
|
// Handle redirects
|
||||||
if (proxyRes.statusCode >= 300 && proxyRes.statusCode < 400 && proxyRes.headers.location) {
|
if (proxyRes.statusCode >= 300 && proxyRes.statusCode < 400 && proxyRes.headers.location) {
|
||||||
// For redirects, return the redirect URL to client
|
// For redirects, return the redirect URL to client
|
||||||
@@ -333,13 +381,7 @@ function proxyRequest(targetUrl, req, res) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy response headers (except problematic ones)
|
passThrough();
|
||||||
const headers = { ...proxyRes.headers };
|
|
||||||
delete headers['content-encoding'];
|
|
||||||
delete headers['transfer-encoding'];
|
|
||||||
|
|
||||||
res.writeHead(proxyRes.statusCode, headers);
|
|
||||||
proxyRes.pipe(res);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
proxyReq.on('error', (e) => {
|
proxyReq.on('error', (e) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user