ListenOne / js /provider /kugou.js
CatPtain's picture
Upload 83 files
765bc42 verified
/* eslint-disable no-unused-vars */
/* global async getParameterByName */
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: '',
// url: `kgtrack_${song.FileHash}`,
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);
// Add singer img
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,
};
// Fix song info
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 {
// track['img_url'] = data.imgUrl.replace('{size}', '400');
}
// Fix album
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: '',
// url: `kgtrack_${item.hash}`,
lyric_url: item.hash,
};
const one = item.filename.split('-');
track.title = one[1].trim();
track.artist = one[0].trim();
// Fix album name and img
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: '',
// url: `xmtrack_${item.hash}`,
lyric_url: item.hash,
};
// Fix other data
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;
// 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 page = offset / 30 + 1;
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 total = data.plist.total;
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) {
// eslint-disable-line no-unused-vars
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() {}
// return {
// show_playlist: kg_show_playlist,
// get_playlist_filters,
// get_playlist,
// parse_url: kg_parse_url,
// bootstrap_track: kg_bootstrap_track,
// search: kg_search,
// lyric: kg_lyric,
// get_user: kg_get_user,
// get_login_url: kg_get_login_url,
// logout: kg_logout,
// };
}