|
|
|
|
|
class kugou { |
|
static kg_convert_song(song) { |
|
const track = { |
|
id: `kgtrack_${song.FileHash}`, |
|
title: song.SongName, |
|
artist: '', |
|
artist_id: '', |
|
album: song.AlbumName, |
|
album_id: `kgalbum_${song.AlbumID}`, |
|
source: 'kugou', |
|
source_url: `https://www.kugou.com/song/#hash=${song.FileHash}&album_id=${song.AlbumID}`, |
|
img_url: '', |
|
|
|
lyric_url: song.FileHash, |
|
}; |
|
let singer_id = song.SingerId; |
|
let singer_name = song.SingerName; |
|
if (song.SingerId instanceof Array) { |
|
[singer_id] = singer_id; |
|
[singer_name] = singer_name.split('、'); |
|
} |
|
track.artist = singer_name; |
|
track.artist_id = `kgartist_${singer_id}`; |
|
return track; |
|
} |
|
|
|
static async_process_list( |
|
data_list, |
|
handler, |
|
handler_extra_param_list, |
|
callback |
|
) { |
|
const fnDict = {}; |
|
data_list.forEach((item, index) => { |
|
fnDict[index] = (cb) => |
|
handler(index, item, handler_extra_param_list, cb); |
|
}); |
|
async.parallel(fnDict, (err, results) => |
|
callback( |
|
null, |
|
data_list.map((item, index) => results[index]) |
|
) |
|
); |
|
} |
|
|
|
static kg_render_search_result_item(index, item, params, callback) { |
|
const track = kugou.kg_convert_song(item); |
|
|
|
const url = `${'https://www.kugou.com/yy/index.php?r=play/getdata&hash='}${ |
|
track.lyric_url |
|
}`; |
|
axios.get(url).then((response) => { |
|
const { data } = response; |
|
track.img_url = data.data.img; |
|
callback(null, track); |
|
}); |
|
} |
|
|
|
static search(url) { |
|
const keyword = getParameterByName('keywords', url); |
|
const curpage = getParameterByName('curpage', url); |
|
const searchType = getParameterByName('type', url); |
|
if (searchType === '1') { |
|
return { |
|
success: (fn) => |
|
fn({ |
|
result: [], |
|
total: 0, |
|
type: searchType, |
|
}), |
|
}; |
|
} |
|
return { |
|
success: (fn) => { |
|
const target_url = `${'https://songsearch.kugou.com/song_search_v2?keyword='}${keyword}&page=${curpage}`; |
|
axios |
|
.get(target_url) |
|
.then((response) => { |
|
const { data } = response; |
|
this.async_process_list( |
|
data.data.lists, |
|
this.kg_render_search_result_item, |
|
[], |
|
(err, tracks) => |
|
fn({ |
|
result: tracks, |
|
total: data.data.total, |
|
type: searchType, |
|
}) |
|
); |
|
}) |
|
.catch(() => |
|
fn({ |
|
result: [], |
|
total: 0, |
|
type: searchType, |
|
}) |
|
); |
|
}, |
|
}; |
|
} |
|
|
|
static kg_render_playlist_result_item(index, item, params, callback) { |
|
const { hash } = item; |
|
|
|
let target_url = `${'http://m.kugou.com/app/i/getSongInfo.php?cmd=playInfo&hash='}${hash}`; |
|
const track = { |
|
id: `kgtrack_${hash}`, |
|
title: '', |
|
artist: '', |
|
artist_id: '', |
|
album: '', |
|
album_id: `kgalbum_${item.album_id}`, |
|
source: 'kugou', |
|
source_url: `https://www.kugou.com/song/#hash=${hash}&album_id=${item.album_id}`, |
|
img_url: '', |
|
lyric_url: hash, |
|
}; |
|
|
|
axios.get(target_url).then((response) => { |
|
const { data } = response; |
|
track.title = data.songName; |
|
track.artist = data.singerId === 0 ? '未知' : data.singerName; |
|
track.artist_id = `kgartist_${data.singerId}`; |
|
if (data.album_img !== undefined) { |
|
track.img_url = data.album_img.replace('{size}', '400'); |
|
} else { |
|
|
|
} |
|
|
|
target_url = `http://mobilecdnbj.kugou.com/api/v3/album/info?albumid=${item.album_id}`; |
|
axios.get(target_url).then((res) => { |
|
const { data: res_data } = res; |
|
if ( |
|
res_data.status && |
|
res_data.data !== undefined && |
|
res_data.data !== null |
|
) { |
|
track.album = res_data.data.albumname; |
|
} else { |
|
track.album = ''; |
|
} |
|
return callback(null, track); |
|
}); |
|
}); |
|
} |
|
|
|
static kg_get_playlist(url) { |
|
return { |
|
success: (fn) => { |
|
const list_id = getParameterByName('list_id', url).split('_').pop(); |
|
const target_url = `http://m.kugou.com/plist/list/${list_id}?json=true`; |
|
|
|
axios.get(target_url).then((response) => { |
|
const { data } = response; |
|
|
|
const info = { |
|
cover_img_url: data.info.list.imgurl |
|
? data.info.list.imgurl.replace('{size}', '400') |
|
: '', |
|
title: data.info.list.specialname, |
|
id: `kgplaylist_${data.info.list.specialid}`, |
|
source_url: 'https://www.kugou.com/yy/special/single/{size}.html'.replace( |
|
'{size}', |
|
data.info.list.specialid |
|
), |
|
}; |
|
|
|
this.async_process_list( |
|
data.list.list.info, |
|
this.kg_render_playlist_result_item, |
|
[], |
|
(err, tracks) => |
|
fn({ |
|
tracks, |
|
info, |
|
}) |
|
); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
static kg_render_artist_result_item(index, item, params, callback) { |
|
const info = params[0]; |
|
const track = { |
|
id: `kgtrack_${item.hash}`, |
|
title: '', |
|
artist: '', |
|
artist_id: info.id, |
|
album: '', |
|
album_id: `kgalbum_${item.album_id}`, |
|
source: 'kugou', |
|
source_url: `https://www.kugou.com/song/#hash=${item.hash}&album_id=${item.album_id}`, |
|
img_url: '', |
|
|
|
lyric_url: item.hash, |
|
}; |
|
const one = item.filename.split('-'); |
|
track.title = one[1].trim(); |
|
track.artist = one[0].trim(); |
|
|
|
const target_url = `${'https://www.kugou.com/yy/index.php?r=play/getdata&hash='}${ |
|
item.hash |
|
}`; |
|
axios |
|
.get( |
|
`http://mobilecdnbj.kugou.com/api/v3/album/info?albumid=${item.album_id}` |
|
) |
|
.then((response) => { |
|
const { data } = response; |
|
if (data.status && data.data !== undefined) { |
|
track.album = data.data.albumname; |
|
} else { |
|
track.album = ''; |
|
} |
|
axios.get(target_url).then((res) => { |
|
track.img_url = res.data.data.img; |
|
callback(null, track); |
|
}); |
|
}); |
|
} |
|
|
|
static kg_artist(url) { |
|
return { |
|
success: (fn) => { |
|
const artist_id = getParameterByName('list_id', url).split('_').pop(); |
|
let target_url = `http://mobilecdnbj.kugou.com/api/v3/singer/info?singerid=${artist_id}`; |
|
axios.get(target_url).then((response) => { |
|
const { data } = response; |
|
const info = { |
|
cover_img_url: data.data.imgurl.replace('{size}', '400'), |
|
title: data.data.singername, |
|
id: `kgartist_${artist_id}`, |
|
source_url: 'https://www.kugou.com/singer/{id}.html'.replace( |
|
'{id}', |
|
artist_id |
|
), |
|
}; |
|
target_url = `http://mobilecdnbj.kugou.com/api/v3/singer/song?singerid=${artist_id}&page=1&pagesize=30`; |
|
axios.get(target_url).then((res) => { |
|
this.async_process_list( |
|
res.data.data.info, |
|
this.kg_render_artist_result_item, |
|
[info], |
|
(err, tracks) => |
|
fn({ |
|
tracks, |
|
info, |
|
}) |
|
); |
|
}); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
static getTimestampString() { |
|
return new Date().getTime().toString(); |
|
} |
|
|
|
static getRandomIntString() { |
|
return (Math.random() * 100).toString().replace(/\D/g, ''); |
|
} |
|
|
|
static getRandomHexString() { |
|
let result = ''; |
|
const letters = '0123456789abcdef'; |
|
for (let i = 0; i < 16; i += 1) { |
|
result += letters[Math.floor(Math.random() * 16)]; |
|
} |
|
return result; |
|
} |
|
|
|
static bootstrap_track(track, success, failure) { |
|
const track_id = track.id.slice('kgtrack_'.length); |
|
const album_id = track.album_id.slice('kgalbum_'.length); |
|
let target_url = `https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery&hash=${track_id}&dfid=dfid&mid=mid&platid=4`; |
|
if (album_id !== '') { |
|
target_url += `&album_id=${album_id}`; |
|
} |
|
axios.get(target_url).then((response) => { |
|
const { data } = response; |
|
const jsonString = data.slice('jQuery('.length, data.length - 1 - 1); |
|
const info = JSON.parse(jsonString); |
|
const { play_url } = info.data; |
|
|
|
if (play_url === '') { |
|
return failure({}); |
|
} |
|
|
|
return success({ |
|
url: play_url, |
|
bitrate: `${info.data.bitrate}kbps`, |
|
platform: 'kugou', |
|
}); |
|
}); |
|
} |
|
|
|
static lyric(url) { |
|
const track_id = getParameterByName('track_id', url).split('_').pop(); |
|
const album_id = getParameterByName('album_id', url).split('_').pop(); |
|
const lyric_url = `https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery&hash=${track_id}&dfid=dfid&mid=mid&platid=4&album_id=${album_id}`; |
|
|
|
return { |
|
success: (fn) => { |
|
axios.get(lyric_url).then((response) => { |
|
const { data } = response; |
|
const jsonString = data.slice('jQuery('.length, data.length - 1 - 1); |
|
const info = JSON.parse(jsonString); |
|
return fn({ |
|
lyric: info.data.lyrics, |
|
}); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
static kg_render_album_result_item(index, item, params, callback) { |
|
const info = params[0]; |
|
const album_id = params[1]; |
|
const track = { |
|
id: `kgtrack_${item.hash}`, |
|
title: '', |
|
artist: '', |
|
artist_id: '', |
|
album: info.title, |
|
album_id: `kgalbum_${album_id}`, |
|
source: 'kugou', |
|
source_url: `https://www.kugou.com/song/#hash=${item.hash}&album_id=${album_id}`, |
|
img_url: '', |
|
|
|
lyric_url: item.hash, |
|
}; |
|
|
|
const target_url = `${'http://m.kugou.com/app/i/getSongInfo.php?cmd=playInfo&hash='}${ |
|
item.hash |
|
}`; |
|
axios.get(target_url).then((response) => { |
|
const { data } = response; |
|
track.title = data.songName; |
|
track.artist = data.singerId === 0 ? '未知' : data.singerName; |
|
track.artist_id = `kgartist_${data.singerId}`; |
|
track.img_url = data.imgUrl.replace('{size}', '400'); |
|
callback(null, track); |
|
}); |
|
} |
|
|
|
static kg_album(url) { |
|
return { |
|
success: (fn) => { |
|
const album_id = getParameterByName('list_id', url).split('_').pop(); |
|
let target_url = `${'http://mobilecdnbj.kugou.com/api/v3/album/info?albumid='}${album_id}`; |
|
|
|
let info; |
|
|
|
axios.get(target_url).then((response) => { |
|
const { data } = response; |
|
|
|
info = { |
|
cover_img_url: data.data.imgurl.replace('{size}', '400'), |
|
title: data.data.albumname, |
|
id: `kgalbum_${data.data.albumid}`, |
|
source_url: 'https://www.kugou.com/album/{id}.html'.replace( |
|
'{id}', |
|
data.data.albumid |
|
), |
|
}; |
|
|
|
target_url = `${'http://mobilecdnbj.kugou.com/api/v3/album/song?albumid='}${album_id}&page=1&pagesize=-1`; |
|
axios.get(target_url).then((res) => { |
|
this.async_process_list( |
|
res.data.data.info, |
|
this.kg_render_album_result_item, |
|
[info, album_id], |
|
(err, tracks) => |
|
fn({ |
|
tracks, |
|
info, |
|
}) |
|
); |
|
}); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
static show_playlist(url) { |
|
let offset = getParameterByName('offset', url); |
|
if (offset === undefined) { |
|
offset = 0; |
|
} |
|
|
|
const target_url = `${'http://m.kugou.com/plist/index&json=true&page='}${offset}`; |
|
return { |
|
success: (fn) => { |
|
axios.get(target_url).then((response) => { |
|
const { data } = response; |
|
|
|
const result = data.plist.list.info.map((item) => ({ |
|
cover_img_url: item.imgurl |
|
? item.imgurl.replace('{size}', '400') |
|
: '', |
|
title: item.specialname, |
|
id: `kgplaylist_${item.specialid}`, |
|
source_url: 'https://www.kugou.com/yy/special/single/{size}.html'.replace( |
|
'{size}', |
|
item.specialid |
|
), |
|
})); |
|
return fn({ |
|
result, |
|
}); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
static parse_url(url) { |
|
let result; |
|
const match = /\/\/www.kugou.com\/yy\/special\/single\/([0-9]+).html/.exec( |
|
url |
|
); |
|
if (match != null) { |
|
const playlist_id = match[1]; |
|
result = { |
|
type: 'playlist', |
|
id: `kgplaylist_${playlist_id}`, |
|
}; |
|
} |
|
return { |
|
success: (fn) => { |
|
fn(result); |
|
}, |
|
}; |
|
} |
|
|
|
static get_playlist(url) { |
|
|
|
const list_id = getParameterByName('list_id', url).split('_')[0]; |
|
switch (list_id) { |
|
case 'kgplaylist': |
|
return this.kg_get_playlist(url); |
|
case 'kgalbum': |
|
return this.kg_album(url); |
|
case 'kgartist': |
|
return this.kg_artist(url); |
|
default: |
|
return null; |
|
} |
|
} |
|
|
|
static get_playlist_filters() { |
|
return { |
|
success: (fn) => fn({ recommend: [], all: [] }), |
|
}; |
|
} |
|
|
|
static get_user() { |
|
return { |
|
success: (fn) => fn({ status: 'fail', data: {} }), |
|
}; |
|
} |
|
|
|
static get_login_url() { |
|
return `https://www.kugou.com`; |
|
} |
|
|
|
static logout() {} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|