import fetch from "node-fetch"; import queryString from "querystring"; export interface SearchResult { songs: Song[], songCount: number } export interface Song { name: string, id: number, position: number, alias: string[], status: number, fee: number, copyrightId: number, disc: string, no: number, artists: Artist[], album: Album, starred: boolean, popularity: number, score: number, starredNum: number, duration: number, playedNum: number, dayPlays: number, hearTime: number, ringtone: string, commentThreadId: string, bMusic: Music mp3Url: string, mvid: number, hMusic: Music, mMusic: Music, lMusic: Music, rtype: number } export interface Artist { name: string, id: number, picId: number, img1v1Id: number, briefDesc: string, picUrl: string, img1v1Url: string, albumSize: number, alias: string[], trans: string, musicSize: number } export interface Album { name: string, id: number, type: string, size: number, picId: number, blurPicUrl: string, companyId: number, pic: number, picUrl: string, publishTime: number, description: string, tags: string, company: string, artist: Artist, songs: any[], alias: string[], status: number, copyrightId: number commentThreadId: string, artists: Artist[] } export interface Music { name: string, id: number, size: number, extension: string, sr: number, dfsId: number, bitrate: number, playTime: number, volumeDelta: number } export interface LyricResult { sgc: boolean, sfy: boolean, qfy: boolean, transUser: { id: number, status: number, demand: number, userid: number, nickname: string, uptime: number }, lrc: { version: number, lyric: string }, klyric: { version: number, lyric: string }, tlyric: { version: number, lyric: string }, code: number } export default class TimeLyrics { static fullRequest(url: string, method: string = 'GET') { return fetch(url, { method: method }).then(response => { if (response.status === 200) return response.json(); else return response; }); } static makeRequest(endpoint: string, queryList: any, method: string = 'GET') { Object.keys(queryList).forEach(key => queryList[key] === undefined ? delete queryList[key] : {}); let query = queryString.stringify(queryList); let url = `http://music.163.com/api${endpoint}?${query}`; return this.fullRequest(url, method); } static search(title: string, artist: string): Promise<{ result: SearchResult, code: number }> { return this.makeRequest( '/search/pc', {offset: 0, limit: 10, type: 1, s: title + ',' + artist}, 'GET' ); } static lyrics(id: number): Promise { return this.makeRequest( '/song/lyric', {os: 'pc', lv: -1, kv: -1, tv: -1, id: id}, 'GET' ); } }