增加网易云音乐API

This commit is contained in:
dengtongyu committed 2018-06-28 17:39:30 +08:00
1 parent 7757265959
commit eda8523a09
17 files changed
+1038 -214

No files matched your search

+97
View File
@@ -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 }
+147
View File
@@ -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 }
+45
View File
@@ -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 }