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) }) } }