import { httpFetch } from '../../request' import { weapi } from './utils/crypto' import { formatPlayTime, sizeFormate } from '../..' // https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/module/song_detail.js export default { _requestObj: null, getSinger(singers) { let arr = [] singers.forEach(singer => { arr.push(singer.name) }) return arr.join('、') }, filterList({ songs, privileges }) { // console.log(tracks, privileges) const list = [] songs.forEach((item, index) => { const types = [] const _types = {} let size let privilege = privileges[index] if (privilege.id !== item.id) privilege = privileges.find(p => p.id === item.id) if (!privilege) return switch (privilege.maxbr) { case 999000: size = null types.push({ type: 'flac', size }) _types.flac = { size, } case 320000: if (item.h) { size = sizeFormate(item.h.size) types.push({ type: '320k', size }) _types['320k'] = { size, } } case 128000: if (item.l) { size = sizeFormate(item.l.size) types.push({ type: '128k', size }) _types['128k'] = { size, } } } types.reverse() list.push({ singer: this.getSinger(item.ar), name: item.name, albumName: item.al.name, albumId: item.al.id, source: 'wy', interval: formatPlayTime(item.dt / 1000), songmid: item.id, img: item.al.picUrl, lrc: null, otherSource: null, types, _types, typeUrl: {}, }) }) return list }, async getList(ids = [], retryNum = 0) { if (this._requestObj) this._requestObj.cancelHttp() if (retryNum > 2) return Promise.reject(new Error('try max num')) const _requestObj = httpFetch('https://music.163.com/weapi/v3/song/detail', { method: 'post', headers: { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36', origin: 'https://music.163.com', }, form: weapi({ c: '[' + ids.map(id => ('{"id":' + id + '}')).join(',') + ']', ids: '[' + ids.join(',') + ']', }), }) const { body, statusCode } = await _requestObj.promise if (statusCode != 200 || body.code !== 200) throw new Error('获取歌曲详情失败') // console.log(body) return { source: 'wy', list: this.filterList(body) } }, }