create-chuntianxiaozhu
Version:
春天小猪模板工具
147 lines (140 loc) • 3.76 kB
text/typescript
import axios from 'axios';
import { load } from 'cheerio';
import { getVarFromScript } from './utils';
import { v4 as uuidv4 } from 'uuid';
const userAgent =
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36';
/**
* 获取musicens列表
* @param name
* @returns
*/
export async function scrapyMusicListFromMusicenc(name) {
const res = await axios.get(`https://www.musicenc.com/?search=${name}`, {
headers: {
'User-Agent': userAgent,
},
});
const $ = load(res.data);
const musicList = [];
const uniqueMap = {};
$('.list>li').map(function () {
if (musicList.length > 5) {
return;
}
const authorTxt = $(this).children('span').text() || '';
const name = $(this).children('a').text() || '';
const token = $(this).children('a').attr('dates');
const uuid = uuidv4().replaceAll('-', '');
const author = authorTxt.slice(1, authorTxt.length - 2);
const uniqueId = name + author;
if (uniqueMap[uniqueId]) {
return;
}
uniqueMap[uniqueId] = true;
if (author && name) {
musicList.push({
id: uuid,
author,
name: name.toLowerCase(),
token,
type: 0,
});
}
});
const musicReqPromises = [];
for (let i = 0; i < musicList.length; i++) {
const item = musicList[i];
musicReqPromises.push(
axios
.get(`https://www.musicenc.com/searchr/?token=${item.token}`, {
headers: {
'User-Agent': userAgent,
},
})
.then((res) => res.data),
);
}
const contents = await Promise.all(musicReqPromises);
for (let i = 0; i < contents.length; i++) {
const $ = load(contents[i]);
const bidHref = $('.downBu.secm3').attr('href') || '';
const bid = bidHref.slice(
bidHref.lastIndexOf('/') + 1,
bidHref.lastIndexOf('.'),
);
musicList[i].bid = bid;
}
return musicList;
}
/**
* 获取musicens音乐链接
* @param bid
* @returns
*/
export async function scrapyMusicLinkFromMusicenc(bid) {
const res = await axios.get(`https://www.musicenc.com/article/${bid}.html`, {
headers: {
'User-Agent': userAgent,
},
});
const $ = load(res.data);
const picsScript = $('script')[4];
const link = atob(getVarFromScript($(picsScript).text(), 'pics'));
return axios.get(link).then((res) => res.data);
}
const TonzhonSearchLink = {
1: 'https://music-api.tonzhon.com/search/m/',
2: 'https://music-api.tonzhon.com/search/n/',
3: 'https://music-api.tonzhon.com/search/q/',
4: 'https://music-api.tonzhon.com/search/k/',
};
/**
* 获取铜钟列表
* @param name
* @param source
* @returns
*/
export async function scrapyMusicListFromTonzhon(name, source) {
const res = await axios.get(`${TonzhonSearchLink[source]}${name}`, {
headers: {
'User-Agent': userAgent,
},
});
const data = res.data.data || [];
const songs = data.songs || [];
const result = [];
songs.map((item) => {
const uuid = uuidv4().replaceAll('-', '');
const articles = item.artists || [];
const author = (articles[0] && articles[0].name) || item.alias;
// 只有作者和歌曲名同时在才需要
if (author && item.name) {
result.push({
id: uuid,
author,
name: item.name.toLowerCase(),
bid: item.newId,
type: source,
});
}
});
return result;
}
/**
* 获取铜钟音乐
* @param bid
* @returns
*/
export async function scrapyMusicLinkFromTonzhon(bid) {
const res = await axios.get(
`https://music-api.tonzhon.com/song_file/${bid}`,
{
headers: {
'User-Agent': userAgent,
},
},
);
const data = res.data;
return data.data;
}