fix: 改进音乐API代理的图片端点处理,将JSON响应转换为重定向

This commit is contained in:
史悦
2026-01-14 16:19:52 +08:00
parent 6b1cdb92ad
commit 4bdb5c539d

View File

@@ -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) => {