fix: kg use mobilecdn (has 周杰伦版权); wy use weapi cloudsearch; add hires/master quality labels
This commit is contained in:
@@ -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']
|
||||
}
|
||||
|
||||
@@ -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']
|
||||
}
|
||||
|
||||
@@ -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']
|
||||
}
|
||||
|
||||
@@ -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']
|
||||
}
|
||||
|
||||
@@ -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']
|
||||
}
|
||||
|
||||
@@ -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']
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user