mirror of
https://github.com/ikun0014/lx-music-mobile.git
synced 2025-07-15 05:02:08 +08:00
113 lines
3.2 KiB
JavaScript
113 lines
3.2 KiB
JavaScript
import { httpFetch } from '../../request'
|
|
import { weapi } from './utils/crypto'
|
|
import { formatPlayTime, sizeFormate } from '../../index'
|
|
// https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/module/song_detail.js
|
|
|
|
export default {
|
|
getSinger(singers) {
|
|
let arr = []
|
|
singers?.forEach(singer => {
|
|
arr.push(singer.name)
|
|
})
|
|
return arr.join('、')
|
|
},
|
|
filterList({ songs, privileges }) {
|
|
// console.log(songs, 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
|
|
|
|
if (privilege.maxBrLevel == 'hires') {
|
|
size = item.hr ? sizeFormate(item.hr.size) : null
|
|
types.push({ type: 'flac24bit', size })
|
|
_types.flac24bit = {
|
|
size,
|
|
}
|
|
}
|
|
switch (privilege.maxbr) {
|
|
case 999000:
|
|
size = item.sq ? sizeFormate(item.sq.size) : null
|
|
types.push({ type: 'flac', size })
|
|
_types.flac = {
|
|
size,
|
|
}
|
|
case 320000:
|
|
size = item.h ? sizeFormate(item.h.size) : null
|
|
types.push({ type: '320k', size })
|
|
_types['320k'] = {
|
|
size,
|
|
}
|
|
case 192000:
|
|
case 128000:
|
|
size = item.l ? sizeFormate(item.l.size) : null
|
|
types.push({ type: '128k', size })
|
|
_types['128k'] = {
|
|
size,
|
|
}
|
|
}
|
|
|
|
types.reverse()
|
|
|
|
if (item.pc) {
|
|
list.push({
|
|
singer: item.pc.ar ?? '',
|
|
name: item.pc.sn ?? '',
|
|
albumName: item.pc.alb ?? '',
|
|
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: {},
|
|
})
|
|
} else {
|
|
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: {},
|
|
})
|
|
}
|
|
})
|
|
// console.log(list)
|
|
return list
|
|
},
|
|
async getList(ids = [], retryNum = 0) {
|
|
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) }
|
|
},
|
|
}
|