lx-music-desktop/src/renderer/utils/musicSdk/index.js

170 lines
5.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 && item.interval == interval))
newResult.push(...sortMusic(result, item => item.fSinger == fSinger && item.interval == interval))
newResult.push(...sortMusic(result, item => item.interval == interval))
newResult.push(...sortMusic(result, item => item.fMusicName == fMusicName))
newResult.push(...sortMusic(result, item => item.fSinger == fSinger))
newResult.push(...sortMusic(result, item => item.fAlbumName == fAlbumName))
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
},
}