fix: kg use mobilecdn (has 周杰伦版权); wy use weapi cloudsearch; add hires/master quality labels

This commit is contained in:
TRAE Bot
2026-07-05 18:56:45 +00:00
parent 89d0c1557c
commit 89ab94b276
6 changed files with 63 additions and 62 deletions

View File

@@ -244,7 +244,9 @@ var pluginInfo = {
quality: [
{ name: '标准音质', ui: '标', id: '128k' },
{ name: '高品音质', ui: 'HQ', id: '320k' },
{ name: '无损音质', ui: 'SQ', id: 'flac' }
{ name: '无损音质', ui: 'SQ', id: 'flac' },
{ name: '高解析度无损(Hi-Res)', ui: 'HR', id: 'hires' },
{ name: '至臻母带', ui: 'MT', id: 'master' }
],
supportFunc: ['search_song', 'search_playlist', 'playlist', 'album', 'lyric']
}

View File

@@ -327,7 +327,9 @@ var pluginInfo = {
quality: [
{ name: '标准音质', ui: '标', id: '128k' },
{ name: '高品音质', ui: 'HQ', id: '320k' },
{ name: '无损音质', ui: 'SQ', id: 'flac' }
{ name: '无损音质', ui: 'SQ', id: 'flac' },
{ name: '高解析度无损(Hi-Res)', ui: 'HR', id: 'hires' },
{ name: '至臻母带', ui: 'MT', id: 'master' }
],
supportFunc: ['search_song', 'search_playlist', 'playlist', 'album', 'lyric']
}

View File

@@ -212,7 +212,9 @@ var pluginInfo = {
quality: [
{ name: '标准音质', ui: '标', id: '128k' },
{ name: '高品音质', ui: 'HQ', id: '320k' },
{ name: '无损音质', ui: 'SQ', id: 'flac' }
{ name: '无损音质', ui: 'SQ', id: 'flac' },
{ name: '高解析度无损(Hi-Res)', ui: 'HR', id: 'hires' },
{ name: '至臻母带', ui: 'MT', id: 'master' }
],
supportFunc: ['search_song', 'search_playlist', 'playlist', 'album', 'lyric']
}

View File

@@ -143,21 +143,23 @@ function formatPlayCount(count) {
// ===== 搜索实现 =====
function musicSearch(str, page, limit) {
var form = eapi('/api/search/song/list/page', {
keyword: str,
needCorrect: '1',
channel: 'typing',
var form = weapi({
s: str,
type: 1,
limit: limit,
offset: limit * (page - 1),
scene: 'normal',
total: page == 1,
limit: limit
total: page == 1
});
return requestUrl('http://interface3.music.163.com/eapi/search/song/list/page', 'POST', {
return requestUrl('https://music.163.com/weapi/cloudsearch/get/web', 'POST', {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
'Origin': 'https://music.163.com',
'Referer': 'https://music.163.com',
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': WY_COOKIE
}, querystring.stringify(form)).then(function(res) {
if (typeof res.body === 'string') {
try { res.body = JSON.parse(res.body); } catch (e) { return null; }
}
return res.body;
});
}
@@ -167,24 +169,23 @@ function handleSearchResult(rawList) {
var list = [];
for (var i = 0; i < rawList.length; i++) {
var item = rawList[i];
if (!item.baseInfo || !item.baseInfo.simpleSongData) continue;
var s = item.baseInfo.simpleSongData;
var qualities = {};
if (s.l && s.l.size) qualities['128k'] = sizeFormate(s.l.size);
if (s.h && s.h.size) qualities['320k'] = sizeFormate(s.h.size);
if (s.sq && s.sq.size) qualities['flac'] = sizeFormate(s.sq.size);
var picUrl = s.al && s.al.picUrl ? s.al.picUrl : '';
if (item.l && item.l.size) qualities['128k'] = sizeFormate(item.l.size);
if (item.h && item.h.size) qualities['320k'] = sizeFormate(item.h.size);
if (item.sq && item.sq.size) qualities['flac'] = sizeFormate(item.sq.size);
if (item.hr && item.hr.size) qualities['hires'] = sizeFormate(item.hr.size);
var picUrl = item.al && item.al.picUrl ? item.al.picUrl : '';
list.push({
id: String(s.id),
name: s.name,
artists: formatSingerName(s.ar, 'name'),
id: String(item.id),
name: item.name || '',
artists: formatSingerName(item.ar, 'name'),
source: 'wy',
pic: picUrl,
mPic: picUrl,
sPic: picUrl,
albumName: s.al && s.al.name ? s.al.name : '',
albumId: String(s.al && s.al.id ? s.al.id : ''),
interval: String(formatPlayTime((s.dt || 0) / 1000) || '--/--'),
albumName: item.al && item.al.name ? item.al.name : '',
albumId: String(item.al && item.al.id ? item.al.id : ''),
interval: String(formatPlayTime((item.dt || 0) / 1000) || '--/--'),
qualities: qualities
});
}
@@ -197,9 +198,10 @@ function search(str, page, limit, retryNum) {
if (!limit) limit = 30;
return musicSearch(str, page, limit).then(function(result) {
if (!result || result.code !== 200) return search(str, page, limit, retryNum);
var list = handleSearchResult(result.data && result.data.resources ? result.data.resources : []);
var songs = (result.result && result.result.songs) ? result.result.songs : [];
var list = handleSearchResult(songs);
if (!list || list.length === 0) return search(str, page, limit, retryNum);
var total = result.data && result.data.totalCount ? result.data.totalCount : 0;
var total = result.result && result.result.songCount ? result.result.songCount : 0;
return {
list: list,
allPage: Math.ceil(total / limit),
@@ -644,7 +646,9 @@ var pluginInfo = {
quality: [
{ name: '标准音质', ui: '标', id: '128k' },
{ name: '高品音质', ui: 'HQ', id: '320k' },
{ name: '无损音质', ui: 'SQ', id: 'flac' }
{ name: '无损音质', ui: 'SQ', id: 'flac' },
{ name: '高解析度无损(Hi-Res)', ui: 'HR', id: 'hires' },
{ name: '至臻母带', ui: 'MT', id: 'master' }
],
supportFunc: ['search_song', 'search_playlist', 'playlist', 'album', 'lyric']
}

View File

@@ -225,7 +225,9 @@ var pluginInfo = {
quality: [
{ name: '标准音质', ui: '标', id: '128k' },
{ name: '高品音质', ui: 'HQ', id: '320k' },
{ name: '无损音质', ui: 'SQ', id: 'flac' }
{ name: '无损音质', ui: 'SQ', id: 'flac' },
{ name: '高解析度无损(Hi-Res)', ui: 'HR', id: 'hires' },
{ name: '至臻母带', ui: 'MT', id: 'master' }
],
supportFunc: ['search_song', 'search_playlist', 'playlist', 'album', 'lyric']
}

View File

@@ -79,29 +79,10 @@ function stripEm(s) {
}
function musicSearch(str, page, limit) {
var url = 'http://songsearch.kugou.com/song_search_v2?keyword=' + encodeURIComponent(str) + '&page=' + page + '&pagesize=' + limit + '&showtype=10&utf8=1';
var url = 'http://mobilecdn.kugou.com/api/v3/search/song?showtype=14&highlight=&pagesize=' + limit + '&page=' + page + '&keyword=' + encodeURIComponent(str);
return requestUrl(url, 'GET', { 'User-Agent': 'Mozilla/5.0 (Linux; Android 10)' }).then(function(res) {
if (res.body && res.body.data && res.body.data.lists) return res.body.data;
// fallback to mobilecdn http
var url2 = 'http://mobilecdn.kugou.com/api/v3/search/song?showtype=14&pagesize=' + limit + '&page=' + page + '&keyword=' + encodeURIComponent(str);
return requestUrl(url2, 'GET', { 'User-Agent': 'Mozilla/5.0 (Linux; Android 10)' }).then(function(res2) {
if (res2.body && res2.body.data && res2.body.data.info) {
// map mobilecdn format to songsearch format
var info = res2.body.data.info;
var mapped = [];
for (var i = 0; i < info.length; i++) {
var it = info[i];
mapped.push({
FileName: it.songname, SingerName: it.singername, AlbumName: it.album_name,
AlbumID: it.album_id, FileHash: it.hash, Image: it.img,
FileSize: it.filesize, HQFileSize: it.sqfilesize, SQFileSize: it.flacfilesize,
Duration: it.duration
});
}
return { lists: mapped, total: res2.body.data.total || mapped.length * 10 };
}
throw new Error('kg search failed');
});
if (res.body && res.body.data && res.body.data.info) return res.body.data;
throw new Error('kg search failed');
});
}
@@ -111,25 +92,31 @@ function handleSearchResult(rawList) {
for (var i = 0; i < rawList.length; i++) {
var item = rawList[i];
var qualities = {};
if (item.FileSize) qualities['128k'] = sizeFormate(item.FileSize);
if (item.HQFileSize) qualities['320k'] = sizeFormate(item.HQFileSize);
if (item.SQFileSize) qualities['flac'] = sizeFormate(item.SQFileSize);
var picUrl = item.Image || item.AblumPic || item.AlbumImage || '';
if (picUrl) picUrl = picUrl.replace('{size}', '480');
if (picUrl && picUrl.indexOf('http') !== 0) picUrl = 'https://' + picUrl.replace(/^\/+/, '');
var name = stripEm(item.FileName || item.SongName || '');
var singerName = stripEm(item.SingerName || '');
if (item.filesize) qualities['128k'] = sizeFormate(item.filesize);
if (item['320filesize']) qualities['320k'] = sizeFormate(item['320filesize']);
if (item.sqfilesize) qualities['flac'] = sizeFormate(item.sqfilesize);
// 封面:用 album_id 拼 kugou 封面 URL
var albumId = String(item.album_id || '');
var picUrl = '';
if (albumId) picUrl = 'http://imge.kugou.com/stdmusic/150/' + albumId + '.jpg';
var name = stripEm(item.songname || item.filename || '');
var singerName = stripEm(item.singername || '');
// filename 格式 "歌手 - 歌名",如果没有 songname 就从 filename 拆
if (!name && item.filename) {
var parts = String(item.filename).split(' - ');
name = stripEm(parts[1] || parts[0]);
}
list.push({
id: String(item.FileHash || item.HQFileHash || item.SQFileHash || ''),
id: String(item.hash || ''),
name: name,
artists: singerName,
source: 'kg',
pic: picUrl,
mPic: picUrl,
sPic: picUrl,
albumName: stripEm(item.AlbumName || ''),
albumId: String(item.AlbumID || ''),
interval: String(formatPlayTime(item.Duration) || '--/--'),
albumName: stripEm(item.album_name || ''),
albumId: albumId,
interval: String(formatPlayTime(item.duration) || '--/--'),
qualities: qualities
});
}
@@ -240,7 +227,9 @@ var pluginInfo = {
quality: [
{ name: '标准音质', ui: '标', id: '128k' },
{ name: '高品音质', ui: 'HQ', id: '320k' },
{ name: '无损音质', ui: 'SQ', id: 'flac' }
{ name: '无损音质', ui: 'SQ', id: 'flac' },
{ name: '高解析度无损(Hi-Res)', ui: 'HR', id: 'hires' },
{ name: '至臻母带', ui: 'MT', id: 'master' }
],
supportFunc: ['search_song', 'search_playlist', 'playlist', 'album', 'lyric']
}