import kw from './kw/index' import kg from './kg/index' import tx from './tx/index' import wy from './wy/index' import mg from './mg/index' import bd from './bd/index' import xm from './xm' import { supportQuality } from './api-source' const sources = { sources: [ { name: '酷我音乐', id: 'kw', }, { name: '酷狗音乐', id: 'kg', }, { name: 'QQ音乐', id: 'tx', }, { name: '网易音乐', id: 'wy', }, { name: '咪咕音乐', id: 'mg', }, { name: '虾米音乐', id: 'xm', }, // { // name: '百度音乐', // id: 'bd', // }, ], kw, kg, tx, wy, mg, bd, xm, } export default { ...sources, init() { const tasks = [] for (let source of sources.sources) { let sm = sources[source.id] sm && sm.init && tasks.push(sm.init()) } return Promise.all(tasks) }, supportQuality, async searchMusic({ name, singer, source: s, limit = 25 }) { const trimStr = str => typeof str == 'string' ? str.trim() : str const musicName = trimStr(name) const tasks = [] const excludeSource = ['xm'] for (const source of sources.sources) { if (!sources[source.id].musicSearch || source.id == s || excludeSource.includes(source.id)) continue tasks.push(sources[source.id].musicSearch.search(`${musicName} ${singer || ''}`.trim(), 1, limit).catch(_ => null)) } return (await Promise.all(tasks)).filter(s => s) }, async findMusic({ name, singer, albumName, interval, source: s }) { const lists = await this.searchMusic({ name, singer, source: s, limit: 25 }) // console.log(lists) // console.log({ name, singer, albumName, interval, source: s }) const singersRxp = /、|&|;|;|\/|,|,|\|/ const sortSingle = singer => singersRxp.test(singer) ? singer.split(singersRxp).sort((a, b) => a.localeCompare(b)).join('、') : (singer || '') const sortMusic = (arr, callback) => { const tempResult = [] for (let i = arr.length - 1; i > -1; i--) { const item = arr[i] if (callback(item)) { delete item.fSinger delete item.fMusicName delete item.fAlbumName delete item.fInterval tempResult.push(item) arr.splice(i, 1) } } tempResult.reverse() return tempResult } const getIntv = (interval) => { if (!interval) return 0 // if (musicInfo._interval) return musicInfo._interval let intvArr = interval.split(':') let intv = 0 let unit = 1 while (intvArr.length) { intv += parseInt(intvArr.pop()) * unit unit *= 60 } return intv } const trimStr = str => typeof str == 'string' ? str.trim() : (str || '') const filterStr = str => typeof str == 'string' ? str.replace(/\s|'|\.|,|,|&|"|、|\(|\)|(|)|`|~|-|<|>|\||\/|\]|\[|!|!/g, '') : String(str || '') const fMusicName = filterStr(name).toLowerCase() const fSinger = filterStr(sortSingle(singer)).toLowerCase() const fAlbumName = filterStr(albumName).toLowerCase() const fInterval = getIntv(interval) const isEqualsInterval = (intv) => Math.abs((fInterval || intv) - (intv || fInterval)) < 5 const isIncludesName = (name) => (fMusicName.includes(name) || name.includes(fMusicName)) const isIncludesSinger = (singer) => fSinger ? (fSinger.includes(singer) || singer.includes(fSinger)) : true const isEqualsAlbum = (album) => fAlbumName ? fAlbumName == album : true const result = lists.map(source => { for (const item of source.list) { item.name = trimStr(item.name) item.singer = trimStr(item.singer) item.fSinger = filterStr(sortSingle(item.singer).toLowerCase()) item.fMusicName = filterStr(String(item.name ?? '').toLowerCase()) item.fAlbumName = filterStr(String(item.albumName ?? '').toLowerCase()) item.fInterval = getIntv(item.interval) // console.log(fMusicName, item.fMusicName, item.source) if (!isEqualsInterval(item.fInterval)) { item.name = null continue } if (item.fMusicName == fMusicName && isIncludesSinger(item.fSinger)) return item } for (const item of source.list) { if (item.name == null) continue if (item.fSinger == fSinger && isIncludesName(item.fMusicName)) return item } for (const item of source.list) { if (item.name == null) continue if (isEqualsAlbum(item.fAlbumName) && isIncludesSinger(item.fSinger) && isIncludesName(item.fMusicName)) return item } return null }).filter(s => s) const newResult = [] if (result.length) { newResult.push(...sortMusic(result, item => item.fSinger == fSinger && item.fMusicName == fMusicName && item.interval == interval)) newResult.push(...sortMusic(result, item => item.fMusicName == fMusicName && item.fSinger == fSinger && item.fAlbumName == fAlbumName)) newResult.push(...sortMusic(result, item => item.fSinger == fSinger && item.fMusicName == fMusicName)) newResult.push(...sortMusic(result, item => item.fMusicName == fMusicName)) newResult.push(...sortMusic(result, item => item.fSinger == fSinger)) newResult.push(...sortMusic(result, item => item.fAlbumName == fAlbumName)) newResult.push(...sortMusic(result, item => item.interval == interval)) for (const item of result) { delete item.fSinger delete item.fMusicName delete item.fAlbumName delete item.fInterval } newResult.push(...result) } // console.log(newResult) return newResult }, }