Files
2026-06-29 03:41:14 +00:00

174 lines
5.9 KiB
JavaScript

/*
@header({
searchable: 1,
filterable: 1,
quickSearch: 1,
title: '听了么[听]',
lang: 'cat'
})
*/
function home() {
return JSON.stringify({
'class': [
{'type_id': 'hot', 'type_name': '热门歌单'},
{'type_id': 'new', 'type_name': '新歌推荐'}
]
});
}
async function homeVod() {
let url = 'http://wapi.kuwo.cn/api/pc/classify/playlist/getRcmPlayList?loginUid=0&loginSid=0&appUid=76039576&rn=30&order=hot&pn=1';
let res = JSON.parse((await req(url)).content);
let data = res.data?.data || res.data || [];
let d = data.map(it => ({
vod_name: it.name || it.title || '未命名歌单',
vod_id: (it.id || it.pid || '').toString(),
vod_pic: it.img || it.pic || it.cover || 'https://p1.music.126.net/SUeqMM8HOIpHv9Nhl9qt9w==/109951165647004069.jpg',
vod_remarks: it.info || it.uname || it.userName || '',
type_name: 'hot'
}));
return JSON.stringify({list: d});
}
async function category(tid, pg) {
let api = `http://wapi.kuwo.cn/api/pc/classify/playlist/getRcmPlayList?loginUid=0&loginSid=0&appUid=76039576&rn=30&order=${tid}&pn=${pg}&_=${Date.now()}`;
let res = JSON.parse((await req(api)).content);
let data = res.data?.data || res.data || [];
let arr = data.map(it => ({
vod_name: it.name || it.title || '未命名歌单',
vod_id: (it.id || it.pid || '').toString(),
vod_pic: it.img || it.pic || it.cover || 'https://p1.music.126.net/SUeqMM8HOIpHv9Nhl9qt9w==/109951165647004069.jpg',
vod_remarks: it.info || it.uname || it.userName || '',
type_name: tid
}));
return JSON.stringify({list: arr, page: +pg, pagecount: 999, limit: 30, total: 999});
}
async function detail(vod_url) {
let api = `http://nplserver.kuwo.cn/pl.svc?op=getlistinfo&pid=${vod_url.trim()}&pn=0&rn=200&encode=utf8&keyset=pl2012&identity=kuwo&pcmp4=1&vipver=MUSIC_9.1.1.2_BCS2&newver=1`;
console.log(`✅[api]: ${api}`);
let d = JSON.parse((await req(api)).content);
console.log(`✅[d的结果: ]${JSON.stringify(d, null, 4)}`);
let list = d.musiclist || [];
let playArr = [];
let artistPicArr = [];
list.forEach(it => {
let rid = (it.id || '').toString();
let song = (it.name || it.SONGNAME || it.displaysongname || '').toString();
let artist = (it.artist || it.ARTIST || it.FARTIST || it.displayartistname || '').toString();
let albumpic = it.albumpic || '';
let artistPic = it.artistPic || '';
let displayName = artist ? `${song} [${artist}]` : song;
if (rid) {
playArr.push(`${displayName}$${rid}&&${albumpic}&&${artistPic}`);
artistPicArr.push(artistPic);
}
});
return JSON.stringify({
list: [{
vod_id: vod_url,
vod_name: d.name || d.title || '酷我歌单',
vod_pic: d.pic || d.img,
vod_content: d.info || d.desc || '',
vod_play_from: '酷我歌单',
vod_play_pic: artistPicArr.join('#'),
vod_play_pic_ratio: 1.5,
vod_play_url: playArr.join('#')
}]
});
}
async function play(flag, id) {
// 解析格式:显示名称$歌曲ID&&专辑图片&&歌手图片
let parts = id.split('&&');
// 第一部分可能包含显示名称$歌曲ID
let firstPart = parts[0] || '';
let firstParts = firstPart.split('$');
let songId = firstParts.length > 1 ? firstParts[1] : firstParts[0];
let albumPic = parts[1] || '';
let artistPic = parts[2] || '';
// 优先使用专辑图片,没有则使用歌手图片
let picUrl = albumPic || artistPic;
if (/\.(m3u8|mp4|m4a|mp3|aac)(\?|$)/i.test(songId)) {
return JSON.stringify({
parse: 0,
jx: 0,
url: songId,
pic: picUrl
});
}
async function getUrl(rid, br) {
let api = `http://nmobi.kuwo.cn/mobi.s?f=web&user=0&source=kwplayerhd_ar_4.3.0.8_tianbao_T1A_qirui.apk&type=convert_url_with_sign&rid=${rid}&br=${br}`;
let j = JSON.parse((await req(api)).content);
return j?.data?.url?.trim() || '';
}
let url = await getUrl(songId, '320kmp3') || await getUrl(songId, '128kmp3');
let lrc = await getLyric(songId);
return JSON.stringify({
parse: 0,
jx: 0,
url: url,
pic: picUrl,
cover: albumPic,
lrc: lrc
});
}
async function getLyric(rid) {
let url = `http://m.kuwo.cn/newh5/singles/songinfoandlrc?musicId=${rid}`;
let res = (await req(url)).content;
let json = JSON.parse(res);
let lrclist = json?.data?.lrclist;
if (!lrclist) return '';
return lrclist.map(item => {
let time = +item.time;
let min = Math.floor(time / 60).toString().padStart(2, '0');
let sec = Math.floor(time % 60).toString().padStart(2, '0');
let ms = Math.floor((time % 1) * 100).toString().padStart(2, '0');
return `[${min}:${sec}.${ms}]${item.lineLyric}`;
}).join('\n');
}
async function search(wd, quick) {
let searchUrl = `https://search.kuwo.cn/r.s?client=kt&all=${encodeURIComponent(wd)}&pn=0&rn=20&vipver=1&ft=music&encoding=utf8&rformat=json&mobi=1`;
let res = (await req(searchUrl)).content;
let json = JSON.parse(res);
let d = [];
if (json.abslist) {
json.abslist.forEach(it => {
if (it.MUSICRID) {
let musicId = it.MUSICRID.replace('MUSIC_', '');
let picUrl = it.hts_MVPIC || '';
d.push({
vod_name: (it.NAME || '未知歌曲') + (it.ARTIST ? ' - ' + it.ARTIST : ''),
vod_id: musicId,
vod_pic: picUrl,
vod_remarks: '酷我音乐',
type_name: 'search'
});
}
});
}
return JSON.stringify({list: d});
}
export function __jsEvalReturn() {
return {home, homeVod, category, detail, play, search};
}