112 lines
3.8 KiB
TypeScript
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() => {
|
|
void setUserApi(appSetting['common.apiSource'])
|
|
return await 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)
|
|
})
|
|
}
|
|
}
|