lx-music-desktop/src/renderer/core/useApp/useInitUserApi.ts
2022-11-23 18:04:28 +08:00

112 lines
3.8 KiB
TypeScript

import { onBeforeUnmount } from '@common/utils/vueTools'
import { useI18n } from '@renderer/plugins/i18n'
import { onUserApiStatus, getUserApiList, sendUserApiRequest, userApiRequestCancel, onShowUserApiUpdateAlert } from '@renderer/utils/ipc'
import { openUrl } from '@common/utils/electron'
import { qualityList, userApi } from '@renderer/store'
import { appSetting } from '@renderer/store/setting'
import { dialog } from '@renderer/plugins/Dialog'
import { setUserApi } from '@renderer/core/apiSource'
export default () => {
const t = useI18n()
const rUserApiStatus = onUserApiStatus(({ params: { status, message, apiInfo } }) => {
// console.log({ status, message, apiInfo })
userApi.status = status
userApi.message = message
if (status && apiInfo && apiInfo.sources) {
if (apiInfo.id === appSetting['common.apiSource']) {
let apis: any = {}
let qualitys: LX.QualityList = {}
for (const [source, { actions, type, qualitys: sourceQualitys }] of Object.entries(apiInfo.sources)) {
if (type != 'music') continue
apis[source as LX.Source] = {}
for (const action of actions) {
switch (action) {
case 'musicUrl':
apis[source].getMusicUrl = (songInfo: LX.Music.MusicInfo, type: LX.Quality) => {
const requestKey = `request__${Math.random().toString().substring(2)}`
return {
canceleFn() {
userApiRequestCancel(requestKey)
},
promise: sendUserApiRequest({
requestKey,
data: {
source,
action: 'musicUrl',
info: {
type,
musicInfo: songInfo,
},
},
}).then(res => {
// console.log(res)
if (!/^https?:/.test(res.data.url)) return Promise.reject(new Error('Get url failed'))
return { type, url: res.data.url }
}).catch(async err => {
console.log(err.message)
return await Promise.reject(err)
}),
}
}
break
default:
break
}
}
qualitys[source as LX.Source] = sourceQualitys
}
qualityList.value = qualitys
userApi.apis = apis
}
}
})
const rUserApiShowUpdateAlert = onShowUserApiUpdateAlert(({ params: { name, log, updateUrl } }) => {
if (updateUrl) {
void dialog({
message: `${t('user_api__update_alert', { name })}\n${log}`,
selection: true,
showCancel: true,
confirmButtonText: t('user_api__update_alert_open_url'),
cancelButtonText: t('close'),
}).then(confirm => {
if (!confirm) return
window.setTimeout(() => {
void openUrl(updateUrl)
}, 300)
})
} else {
void dialog({
message: `${t('user_api__update_alert', { name })}\n${log}`,
selection: true,
confirmButtonText: t('ok'),
})
}
})
onBeforeUnmount(() => {
rUserApiStatus()
rUserApiShowUpdateAlert()
})
return async() => {
await setUserApi(appSetting['common.apiSource'])
void getUserApiList().then(list => {
// console.log(list)
// if (![...apiSourceInfo.map(s => s.id), ...list.map(s => s.id)].includes(appSetting['common.apiSource'])) {
// console.warn('reset api')
// let api = apiSourceInfo.find(api => !api.disabled)
// if (api) apiSource.value = api.id
// }
userApi.list = list
}).catch(err => {
console.log(err)
})
}
}