fix(kw): robust cover field handling + official anti-server getUrl fallback
This commit is contained in:
@@ -47,6 +47,14 @@ function formatPlayTime(seconds) {
|
|||||||
return m + ':' + (s < 10 ? '0' : '') + s
|
return m + ':' + (s < 10 ? '0' : '') + s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function safeGet(obj, keys) {
|
||||||
|
if (!obj) return ''
|
||||||
|
for (var i = 0; i < keys.length; i++) {
|
||||||
|
if (obj[keys[i]] != null) return obj[keys[i]]
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
var musicSearch = {
|
var musicSearch = {
|
||||||
limit: 30,
|
limit: 30,
|
||||||
total: 0,
|
total: 0,
|
||||||
@@ -62,16 +70,26 @@ var musicSearch = {
|
|||||||
'http://search.kuwo.cn/r.s?client=kt&all=' + encodeURIComponent(str) + '&pn=' + (page - 1) + '&rn=' + limit + '&uid=794762570&ver=kwplayer_ar_9.2.2.1&vipver=1&show_copyright_off=1&newver=1&ft=music&cluster=0&strategy=2012&encoding=utf8&rformat=json&vermerge=1&mobi=1&issubtitle=1',
|
'http://search.kuwo.cn/r.s?client=kt&all=' + encodeURIComponent(str) + '&pn=' + (page - 1) + '&rn=' + limit + '&uid=794762570&ver=kwplayer_ar_9.2.2.1&vipver=1&show_copyright_off=1&newver=1&ft=music&cluster=0&strategy=2012&encoding=utf8&rformat=json&vermerge=1&mobi=1&issubtitle=1',
|
||||||
HEADERS_COMMON
|
HEADERS_COMMON
|
||||||
).then(function(result) {
|
).then(function(result) {
|
||||||
if (!result || !result.abslist || result.abslist.length === 0) {
|
var listData = result && result.abslist
|
||||||
|
if (!listData || listData.length === 0) {
|
||||||
|
listData = result && result.data && result.data.list
|
||||||
|
}
|
||||||
|
if (!listData || listData.length === 0) {
|
||||||
|
listData = result && result.songs
|
||||||
|
}
|
||||||
|
if (!listData || listData.length === 0) {
|
||||||
return self.search(str, page, limit, retryNum)
|
return self.search(str, page, limit, retryNum)
|
||||||
}
|
}
|
||||||
var list = []
|
var list = []
|
||||||
for (var i = 0; i < result.abslist.length; i++) {
|
for (var i = 0; i < listData.length; i++) {
|
||||||
var info = result.abslist[i]
|
var info = listData[i]
|
||||||
var songId = (info.MUSICRID || '').replace('MUSIC_', '')
|
var musicRid = safeGet(info, ['MUSICRID', 'musicrid', 'rid', 'id', 'songid'])
|
||||||
|
var songId = musicRid ? String(musicRid).replace('MUSIC_', '') : ''
|
||||||
|
if (!songId) continue
|
||||||
var qualities = {}
|
var qualities = {}
|
||||||
if (info.N_MINFO) {
|
var nmInfo = safeGet(info, ['N_MINFO', 'n_minfo', 'minfo'])
|
||||||
var parts = info.N_MINFO.split(';')
|
if (nmInfo) {
|
||||||
|
var parts = String(nmInfo).split(';')
|
||||||
for (var j = 0; j < parts.length; j++) {
|
for (var j = 0; j < parts.length; j++) {
|
||||||
var m = parts[j].match(/level:(\w+),bitrate:(\d+),format:(\w+),size:([\w.]+)/)
|
var m = parts[j].match(/level:(\w+),bitrate:(\d+),format:(\w+),size:([\w.]+)/)
|
||||||
if (m) {
|
if (m) {
|
||||||
@@ -84,29 +102,36 @@ var musicSearch = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
var picUrl = ''
|
var picUrl = ''
|
||||||
if (info.ALBUMID) {
|
var albumId = safeGet(info, ['ALBUMID', 'albumid', 'album_id', 'AlbumID'])
|
||||||
picUrl = 'https://img2.kuwo.cn/star/albumcover/300/' + info.ALBUMID + '.jpg'
|
if (albumId) {
|
||||||
} else {
|
picUrl = 'https://img2.kuwo.cn/star/albumcover/300/' + albumId + '.jpg'
|
||||||
picUrl = 'http://artistpicserver.kuwo.cn/pic.web?corp=kuwo&type=rid_pic&pictype=500&size=500&rid=' + songId
|
|
||||||
}
|
}
|
||||||
var artistStr = ''
|
if (!picUrl || picUrl === '') {
|
||||||
if (info.ARTIST) artistStr = info.ARTIST.replace(/&/g, '、')
|
picUrl = 'http://artistpicserver.kuwo.cn/pic.web?corp=kuwo&type=rid_pic&pictype=500&size=500&rid=MUSIC_' + songId
|
||||||
var duration = parseInt(info.DURATION)
|
}
|
||||||
|
var artistStr = safeGet(info, ['ARTIST', 'artist', 'singer', 'author'])
|
||||||
|
if (artistStr) artistStr = String(artistStr).replace(/&/g, '、')
|
||||||
|
var duration = parseInt(safeGet(info, ['DURATION', 'duration', 'Duration', 'time'])) || 0
|
||||||
|
var songName = safeGet(info, ['SONGNAME', 'songname', 'name', 'Name', 'title'])
|
||||||
|
var albumName = safeGet(info, ['ALBUM', 'album', 'Album', 'album_name'])
|
||||||
list.push({
|
list.push({
|
||||||
id: String(songId),
|
id: String(songId),
|
||||||
name: String(info.SONGNAME || ''),
|
name: String(songName || ''),
|
||||||
artists: artistStr,
|
artists: artistStr,
|
||||||
source: 'kw',
|
source: 'kw',
|
||||||
pic: picUrl,
|
pic: picUrl,
|
||||||
mPic: picUrl,
|
mPic: picUrl,
|
||||||
sPic: picUrl,
|
sPic: picUrl,
|
||||||
albumName: String(info.ALBUM || ''),
|
albumName: String(albumName || ''),
|
||||||
albumId: String(info.ALBUMID || ''),
|
albumId: String(albumId || ''),
|
||||||
interval: isNaN(duration) ? '--/--' : formatPlayTime(duration),
|
interval: isNaN(duration) ? '--/--' : formatPlayTime(duration),
|
||||||
qualities: qualities
|
qualities: qualities
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
self.total = parseInt(result.TOTAL) || 0
|
if (list.length === 0) {
|
||||||
|
return self.search(str, page, limit, retryNum)
|
||||||
|
}
|
||||||
|
self.total = parseInt(safeGet(result, ['TOTAL', 'total', 'Total'])) || list.length
|
||||||
self.page = page
|
self.page = page
|
||||||
self.allPage = Math.ceil(self.total / limit)
|
self.allPage = Math.ceil(self.total / limit)
|
||||||
return { list: list, allPage: self.allPage, limit: limit, total: self.total, source: 'kw' }
|
return { list: list, allPage: self.allPage, limit: limit, total: self.total, source: 'kw' }
|
||||||
@@ -152,6 +177,7 @@ var hotSearch = {
|
|||||||
|
|
||||||
function buildApis(songId, q) {
|
function buildApis(songId, q) {
|
||||||
var br = mapBr(q)
|
var br = mapBr(q)
|
||||||
|
var fullRid = 'MUSIC_' + songId
|
||||||
var apis = []
|
var apis = []
|
||||||
if (CERU_KEY) {
|
if (CERU_KEY) {
|
||||||
apis.push({
|
apis.push({
|
||||||
@@ -168,6 +194,24 @@ function buildApis(songId, q) {
|
|||||||
headers: { 'User-Agent': HEADERS_COMMON['User-Agent'], 'X-Request-Key': 'share-v3' },
|
headers: { 'User-Agent': HEADERS_COMMON['User-Agent'], 'X-Request-Key': 'share-v3' },
|
||||||
extract: function(res) { return res && res.code === 0 && res.url ? res.url : null }
|
extract: function(res) { return res && res.code === 0 && res.url ? res.url : null }
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: '官方反代',
|
||||||
|
url: 'http://antiserver.kuwo.cn/anti.s?rid=' + fullRid + '&format=mp3&type=convert_url',
|
||||||
|
headers: HEADERS_COMMON,
|
||||||
|
extract: function(res) {
|
||||||
|
if (typeof res === 'string' && res.indexOf('http') === 0) return res
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '官方反代2',
|
||||||
|
url: 'http://antiserver.kuwo.cn/anti.s?type=convert_url&rid=' + fullRid + '&format=aac|mp3',
|
||||||
|
headers: HEADERS_COMMON,
|
||||||
|
extract: function(res) {
|
||||||
|
if (typeof res === 'string' && res.indexOf('http') === 0) return res
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: '星海',
|
name: '星海',
|
||||||
url: 'https://music-api.gdstudio.xyz/api.php?types=url&source=kuwo&id=' + songId + '&br=' + br,
|
url: 'https://music-api.gdstudio.xyz/api.php?types=url&source=kuwo&id=' + songId + '&br=' + br,
|
||||||
@@ -288,7 +332,20 @@ var album = {
|
|||||||
search: function(str, page, limit) { return Promise.resolve([]) }
|
search: function(str, page, limit) { return Promise.resolve([]) }
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLyric(id) { return Promise.resolve('') }
|
function getLyric(id) {
|
||||||
|
return httpGet('http://m.kuwo.cn/newh5app/api/music/musicLyric?musicId=' + id, HEADERS_COMMON, 8000).then(function(res) {
|
||||||
|
if (res && res.data && res.data.lrc) return { lrc: res.data.lrc }
|
||||||
|
if (res && res.lrclist) {
|
||||||
|
var lrc = ''
|
||||||
|
for (var i = 0; i < res.lrclist.length; i++) {
|
||||||
|
var t = res.lrclist[i]
|
||||||
|
lrc += '[' + t.time + ']' + (t.lineLyric || t.content || '') + '\n'
|
||||||
|
}
|
||||||
|
return { lrc: lrc }
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}).catch(function(e) { return '' })
|
||||||
|
}
|
||||||
function getPic(songId) { return Promise.resolve('') }
|
function getPic(songId) { return Promise.resolve('') }
|
||||||
function musicDetail(id) { return Promise.resolve(null) }
|
function musicDetail(id) { return Promise.resolve(null) }
|
||||||
function musicInfo(id) { return Promise.resolve(null) }
|
function musicInfo(id) { return Promise.resolve(null) }
|
||||||
|
|||||||
Reference in New Issue
Block a user