增加网易云音乐API
This commit is contained in:
1 parent
7757265959
commit
eda8523a09
17 files changed
+1038
-214
No files matched your search
@@ -0,0 +1,97 @@
|
||||
import { urlFetch, parseLyric} from './Util';
|
||||
|
||||
//const host = 'https://node.dengtongyu.com';
|
||||
const host = '/kugou';
|
||||
|
||||
const searchUrl = host + '/songSearch';
|
||||
|
||||
const newSongUrl = host + '/newSong';
|
||||
|
||||
const songMassgeUrl = host + '/songMsg';
|
||||
|
||||
let getKugouSearchSongList = async function(keyWord,page,size) {
|
||||
if(!keyWord) keyWord = '';
|
||||
if(!page) page = 1;
|
||||
if(!size) size = 10;
|
||||
let url = searchUrl + '?keyword=' + keyWord + '&page=' + page + '&pagesize=' + size;
|
||||
let response = await urlFetch(url);
|
||||
|
||||
try {
|
||||
let data = await response.json();
|
||||
//console.log(data)
|
||||
let songs = {};
|
||||
songs.list = [];
|
||||
songs.aggregation = [];
|
||||
songs.page = 1;
|
||||
|
||||
if(data.result) {
|
||||
let list = data.data.lists;
|
||||
for (let index = 0; index < list.length; index++) {
|
||||
let songMsg = {};
|
||||
songMsg.Hash = list[index].FileHash;
|
||||
songMsg.SongName = list[index].SongName;
|
||||
songMsg.SingerName = list[index].SingerName;
|
||||
songMsg.Duration = list[index].Duration;
|
||||
|
||||
songs.list.push(songMsg);
|
||||
|
||||
}
|
||||
songs.aggregation = data.data.aggregation;
|
||||
songs.page = data.data.page;
|
||||
}
|
||||
return songs;
|
||||
} catch (err) {
|
||||
return Promise.reject(err);
|
||||
}
|
||||
}
|
||||
|
||||
let getKugouNewSongList = async function() {
|
||||
let url = newSongUrl + '?json=true';
|
||||
let response = await urlFetch(url);
|
||||
try {
|
||||
let data = await response.json();
|
||||
|
||||
let songs = [];
|
||||
if(data.result) {
|
||||
let list = data.data;
|
||||
for (let index = 0; index < list.length; index++) {
|
||||
let songMsg = {};
|
||||
songMsg.Hash = list[index].hash;
|
||||
songMsg.SongName = list[index].filename.split(' - ')[1];
|
||||
songMsg.SingerName = list[index].filename.split(' - ')[0];
|
||||
songMsg.Duration = list[index].duration;
|
||||
|
||||
songs.push(songMsg);
|
||||
}
|
||||
}
|
||||
return songs;
|
||||
} catch (err) {
|
||||
return Promise.reject(err);
|
||||
}
|
||||
}
|
||||
|
||||
let getKugouSongMassge = async function(hash) {
|
||||
let url = songMassgeUrl + '?hash=' + hash;
|
||||
let response = await urlFetch(url);
|
||||
try {
|
||||
let json = await response.json();
|
||||
|
||||
let songMassge = {};
|
||||
|
||||
if(json.result) {
|
||||
songMassge.PlayUrl = json.data.play_url;
|
||||
songMassge.SongName = json.data.song_name;
|
||||
songMassge.SingerName = json.data.author_name;
|
||||
songMassge.Img = json.data.img;
|
||||
songMassge.Lyrics = json.data.lyrics ? parseLyric(json.data.lyrics) : [];
|
||||
songMassge.AlbumName = json.data.album_name;
|
||||
songMassge.Duration = Math.floor(json.data.timelength / 1000);
|
||||
songMassge.Hash = json.data.hash;
|
||||
}
|
||||
return songMassge;
|
||||
} catch(err) {
|
||||
return Promise.reject(err);
|
||||
}
|
||||
}
|
||||
|
||||
export { getKugouNewSongList, getKugouSearchSongList, getKugouSongMassge }
|
||||
@@ -0,0 +1,147 @@
|
||||
import { urlFetch, parseLyric} from './Util';
|
||||
|
||||
const host = '/netease';
|
||||
|
||||
const searchUrl = host + '/search';
|
||||
|
||||
const rankUrl = host + '/top/list';
|
||||
|
||||
const songDetailUrl = host + '/song/detail';
|
||||
|
||||
const songLyriclUrl = host + '/lyric';
|
||||
|
||||
const songPlayUrl = host + '/music/url';
|
||||
|
||||
let getNeteaseSearchSongList = async function(keyWord, page, size) {
|
||||
if(!keyWord) keyWord = '';
|
||||
if(!page) page = 1;
|
||||
if(!size) size = 10;
|
||||
let offset = (page - 1)* size;
|
||||
let url = searchUrl + '?keywords=' + keyWord + '&offset=' + offset + '&limit=' + size;
|
||||
let response = await urlFetch(url);
|
||||
|
||||
try {
|
||||
let data = await response.json();
|
||||
//console.log(data)
|
||||
let songs = {};
|
||||
songs.list = [];
|
||||
songs.aggregation = [];
|
||||
songs.page = 1;
|
||||
|
||||
if(data.code === 200) {
|
||||
let list = data.result.songs;
|
||||
for (let index = 0; index < list.length; index++) {
|
||||
let songMsg = {};
|
||||
songMsg.Hash = list[index].id;
|
||||
songMsg.SongName = list[index].name;
|
||||
songMsg.SingerName = singersName(list[index].artists);
|
||||
songMsg.Duration = list[index].duration;
|
||||
|
||||
songs.list.push(songMsg);
|
||||
|
||||
}
|
||||
songs.aggregation = [];
|
||||
songs.page = page;
|
||||
}
|
||||
return songs;
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
return Promise.reject(err);
|
||||
}
|
||||
}
|
||||
|
||||
let getNeteaseHotSongList = async function() {
|
||||
let url = rankUrl + '?idx=1';
|
||||
let response = await urlFetch(url);
|
||||
try {
|
||||
let data = await response.json();
|
||||
|
||||
let songs = [];
|
||||
if(data.code === 200) {
|
||||
let list = data.playlist.tracks;
|
||||
for (let index = 0; index < list.length; index++) {
|
||||
let songMsg = {};
|
||||
songMsg.Hash = list[index].id;
|
||||
songMsg.SongName = list[index].name;
|
||||
songMsg.SingerName = singersName(list[index].ar);
|
||||
songMsg.Duration = list[index].dt;
|
||||
|
||||
songs.push(songMsg);
|
||||
}
|
||||
}
|
||||
return songs;
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
return Promise.reject(err);
|
||||
}
|
||||
}
|
||||
|
||||
let getNeteaseSongMassge = async function(hash) {
|
||||
let songMassge = {};
|
||||
let detailUrl = songDetailUrl + '?ids=' + hash;
|
||||
let detailResponse = await urlFetch(detailUrl);
|
||||
try {
|
||||
let detailJson = await detailResponse.json();
|
||||
|
||||
if(detailJson.code === 200) {
|
||||
songMassge.SongName = detailJson.songs[0].name;
|
||||
songMassge.SingerName = singersName(detailJson.songs[0].ar);
|
||||
songMassge.Img = detailJson.songs[0].al.picUrl;
|
||||
songMassge.AlbumName = detailJson.songs[0].al.name;
|
||||
songMassge.Duration = Math.floor(detailJson.songs[0].dt / 1000);
|
||||
songMassge.Hash = hash;
|
||||
//songMassge.PlayUrl = getPlayUrl(hash);
|
||||
}
|
||||
} catch(err) {
|
||||
console.error(err);
|
||||
return Promise.reject(err);
|
||||
}
|
||||
|
||||
let lyricUrl = songLyriclUrl + '?id=' + hash;
|
||||
let lyricResponse = await urlFetch(lyricUrl);
|
||||
try {
|
||||
let lyricJson = await lyricResponse.json();
|
||||
|
||||
if(lyricJson.code === 200) {
|
||||
//console.log(lyricJson.lrc.lyric);
|
||||
songMassge.Lyrics = lyricJson.lrc.lyric ? parseLyric(lyricJson.lrc.lyric) : [];
|
||||
}
|
||||
} catch(err) {
|
||||
console.error(err);
|
||||
return Promise.reject(err);
|
||||
}
|
||||
|
||||
let songUrl = songPlayUrl + '?id=' + hash;
|
||||
let songResponse = await urlFetch(songUrl);
|
||||
try {
|
||||
let songJson = await songResponse.json();
|
||||
|
||||
if(songJson.code === 200) {
|
||||
songMassge.PlayUrl = songJson.data[0].url;
|
||||
}
|
||||
if(!songMassge.PlayUrl) {
|
||||
return Promise.reject('该歌曲已经下架!');
|
||||
}
|
||||
} catch(err) {
|
||||
console.error(err);
|
||||
return Promise.reject(err);
|
||||
}
|
||||
|
||||
return songMassge;
|
||||
}
|
||||
|
||||
let singersName = function(arr) {
|
||||
let singers = '';
|
||||
for (let index = 0; index < arr.length; index++) {
|
||||
singers += arr[index].name;
|
||||
singers += (index === arr.length - 1 ? '' : '、');
|
||||
}
|
||||
return singers;
|
||||
}
|
||||
|
||||
// let getPlayUrl = function(id) {
|
||||
// let playUrl = 'http://music.163.com/song/media/outer/url?id=' + id + '.mp3';
|
||||
// return playUrl;
|
||||
// }
|
||||
|
||||
export { getNeteaseHotSongList, getNeteaseSongMassge, getNeteaseSearchSongList }
|
||||
@@ -0,0 +1,45 @@
|
||||
let isFetching = false;
|
||||
|
||||
let urlFetch = async function (url) {
|
||||
if(isFetching) return Promise.reject('您点太快了!');
|
||||
|
||||
isFetching = true;
|
||||
let result = await fetch(url)
|
||||
isFetching = false;
|
||||
return result;
|
||||
}
|
||||
|
||||
let parseLyric = function (text) {
|
||||
//将文本分隔成一行一行,存入数组
|
||||
let lines = text.split('\n'),
|
||||
//用于匹配时间的正则表达式,匹配的结果类似[xx:xx.xx]
|
||||
pattern = /\[\d{2}:\d{2}.\d{2,3}\]/g,
|
||||
//保存最终结果的数组
|
||||
result = [];
|
||||
//去掉不含时间的行
|
||||
while (!pattern.test(lines[0])) {
|
||||
lines = lines.slice(1);
|
||||
};
|
||||
//上面用'\n'生成生成数组时,结果中最后一个为空元素,这里将去掉
|
||||
lines[lines.length - 1].length === 0 && lines.pop();
|
||||
lines.forEach(function(v /*数组元素值*/ , i /*元素索引*/ , a /*数组本身*/ ) {
|
||||
//提取出时间[xx:xx.xx]
|
||||
var time = v.match(pattern),
|
||||
//提取歌词
|
||||
value = v.replace(pattern, '');
|
||||
//因为一行里面可能有多个时间,所以time有可能是[xx:xx.xx][xx:xx.xx][xx:xx.xx]的形式,需要进一步分隔
|
||||
time.forEach(function(v1, i1, a1) {
|
||||
//去掉时间里的中括号得到xx:xx.xx
|
||||
var t = v1.slice(1, -1).split(':');
|
||||
//将结果压入最终数组
|
||||
result.push([parseInt(t[0], 10) * 60 + parseFloat(t[1]), value]);
|
||||
});
|
||||
});
|
||||
//最后将结果数组中的元素按时间大小排序,以便保存之后正常显示歌词
|
||||
result.sort(function(a, b) {
|
||||
return a[0] - b[0];
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
export { urlFetch, parseLyric }
|
||||
Reference in new issue
Block a user