Files
Melo/src/renderer/utils/musicSdk/index.js
T

168 lines
5.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
},
}