Delete jar/统一音乐源.js

This commit is contained in:
hy5528
2026-05-18 09:23:03 +08:00
committed by GitHub
parent 44e712fea3
commit fcc3f3917a
-305
View File
@@ -1,305 +0,0 @@
/**
* @name 统一音乐源
* @description 基于GD音乐台(music.gdstudio.xyz)的通用音乐源
* @version 1.0.0
* @author 脚本作者:7878gyc API提供者:GDSTUDIO
*/
console.log('脚本开始执行');
// 检查lx对象
if (typeof globalThis.lx === 'undefined') {
console.log('错误: lx对象不存在');
} else {
console.log('lx版本:', globalThis.lx.version);
console.log('运行环境:', globalThis.lx.env);
// 源映射
var sourceMap = {
'kw': 'kuwo',
'wy': 'netease'
};
// 音质映射 - 添加flac支持
var qualityMap = {
'128k': '128',
'192k': '192',
'320k': '320',
'flac': '740', // 16bit flac
'flac24bit': '999' // 24bit flac(酷我可能不支持,但先加上)
};
// 各源支持的音质
var sourceQualitys = {
'kw': ['128k', '192k', '320k', 'flac'], // 酷我支持16bit flac
'wy': ['128k', '320k', 'flac'] // 网易云支持flac
};
// HTTP请求函数
function httpRequest(url) {
return new Promise(function(resolve, reject) {
console.log('发送HTTP请求:', url);
var options = {
timeout: 10000,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept': 'application/json'
}
};
globalThis.lx.request(url, options, function(err, resp) {
if (err) {
console.log('HTTP请求错误:', err.message || err);
reject(new Error('网络请求失败'));
return;
}
console.log('HTTP响应状态码:', resp.statusCode);
console.log('响应体类型:', typeof resp.body);
// 记录响应头中的content-type
if (resp.headers && resp.headers['content-type']) {
console.log('Content-Type:', resp.headers['content-type']);
}
// 如果响应体是对象,直接记录
if (resp.body && typeof resp.body === 'object') {
console.log('响应体是对象,键:', Object.keys(resp.body));
console.log('响应体内容:', JSON.stringify(resp.body).substring(0, 200));
} else if (typeof resp.body === 'string') {
console.log('响应体是字符串,长度:', resp.body.length);
console.log('响应体前200字符:', resp.body.substring(0, Math.min(200, resp.body.length)));
}
resolve(resp);
});
});
}
// 从响应中提取URL
function extractUrlFromResponse(resp) {
if (!resp) {
console.log('响应为空');
return null;
}
var body = resp.body;
console.log('提取URLbody类型:', typeof body);
// 如果body已经是对象
if (body && typeof body === 'object') {
console.log('body是对象,直接提取URL');
// 根据API文档,可能的返回格式:
// 1. {url: "音乐链接", br: "音质", size: "文件大小"}
// 2. {data: {url: "音乐链接", br: "音质", size: "文件大小"}}
if (body.url) {
console.log('从body.url获取URL');
return body.url;
}
if (body.data && body.data.url) {
console.log('从body.data.url获取URL');
return body.data.url;
}
// 尝试查找任何包含URL的字段
for (var key in body) {
var value = body[key];
if (typeof value === 'string' && value.startsWith('http')) {
console.log('从字段', key, '获取URL');
return value;
}
if (value && typeof value === 'object' && value.url && typeof value.url === 'string' && value.url.startsWith('http')) {
console.log('从嵌套对象', key, '.url获取URL');
return value.url;
}
}
console.log('无法从对象中提取URL,对象内容:', JSON.stringify(body).substring(0, 300));
return null;
}
// 如果body是字符串,尝试解析为JSON
if (typeof body === 'string') {
console.log('body是字符串,尝试解析为JSON');
try {
var data = JSON.parse(body);
if (data.url) return data.url;
if (data.data && data.data.url) return data.data.url;
} catch (e) {
console.log('JSON解析失败:', e.message);
}
// 如果不是JSON,尝试正则匹配URL
var urlMatch = body.match(/https?:\/\/[^\s<>"']+/);
if (urlMatch) {
console.log('从字符串中正则匹配到URL');
return urlMatch[0];
}
}
console.log('无法提取URL');
return null;
}
// 音质降级策略
function getQualityFallbackChain(quality) {
var chain = [];
switch(quality) {
case 'flac24bit':
chain = ['flac24bit', 'flac', '320k', '192k', '128k'];
break;
case 'flac':
chain = ['flac', '320k', '192k', '128k'];
break;
case '320k':
chain = ['320k', '192k', '128k'];
break;
case '192k':
chain = ['192k', '128k'];
break;
case '128k':
chain = ['128k'];
break;
default:
chain = ['320k', '128k'];
}
return chain;
}
// 获取音乐URL(支持音质降级)
function getMusicUrl(musicInfo, quality) {
console.log('开始获取音乐URL:', {
source: musicInfo.source,
songmid: musicInfo.songmid,
id: musicInfo.id,
quality: quality
});
return new Promise(function(resolve, reject) {
try {
var source = musicInfo.source;
var apiSource = sourceMap[source];
if (!apiSource) {
console.log('不支持的音源:', source);
reject(new Error('暂不支持此音源'));
return;
}
var songId = musicInfo.songmid || musicInfo.id;
if (!songId) {
console.log('缺少歌曲ID');
reject(new Error('缺少歌曲ID'));
return;
}
// 获取该源支持的音质列表
var supportedQualitys = sourceQualitys[source] || ['128k', '320k'];
var qualityChain = getQualityFallbackChain(quality);
// 过滤掉不支持的音质
qualityChain = qualityChain.filter(function(q) {
return supportedQualitys.includes(q);
});
console.log('音质尝试链:', qualityChain);
// 递归尝试不同音质
function tryQualityChain(index) {
if (index >= qualityChain.length) {
reject(new Error('所有音质尝试均失败'));
return;
}
var currentQuality = qualityChain[index];
var br = qualityMap[currentQuality] || '320';
console.log('尝试音质:', currentQuality, '-> br:', br);
var url = 'https://music-api.gdstudio.xyz/api.php?types=url&source=' + apiSource + '&id=' + songId + '&br=' + br;
httpRequest(url).then(function(resp) {
if (resp.statusCode !== 200) {
console.log('音质', currentQuality, '请求失败,状态码:', resp.statusCode);
tryQualityChain(index + 1);
return;
}
var musicUrl = extractUrlFromResponse(resp);
if (musicUrl) {
console.log('成功获取', currentQuality, '音质URL');
resolve(musicUrl);
} else {
console.log('音质', currentQuality, '无法提取URL');
tryQualityChain(index + 1);
}
}).catch(function(err) {
console.log('音质', currentQuality, '请求出错:', err.message);
tryQualityChain(index + 1);
});
}
// 开始尝试
tryQualityChain(0);
} catch (error) {
console.log('获取音乐URL过程中发生异常:', error);
reject(error);
}
});
}
// 注册事件处理器
console.log('注册事件处理器');
globalThis.lx.on(globalThis.lx.EVENT_NAMES.request, function(data) {
console.log('收到请求事件, action:', data.action);
if (data.action === 'musicUrl') {
return getMusicUrl(data.info.musicInfo, data.info.type);
}
return Promise.reject(new Error('不支持的action: ' + data.action));
});
// 初始化
console.log('准备初始化');
setTimeout(function() {
try {
console.log('发送初始化事件');
var config = {
sources: {
kw: {
name: '酷我音乐',
type: 'music',
actions: ['musicUrl'],
qualitys: ['128k', '192k', '320k', 'flac'] // 添加flac支持
},
wy: {
name: '网易云音乐',
type: 'music',
actions: ['musicUrl'],
qualitys: ['128k', '320k', 'flac'] // 添加flac支持
}
}
};
globalThis.lx.send(globalThis.lx.EVENT_NAMES.inited, config);
console.log('初始化完成');
} catch (error) {
console.log('初始化失败:', error);
}
}, 100);
}
console.log('脚本加载完成');