From 4db5f0394c225cd8d8e276b75d7cb1bb43718483 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Tue, 30 Jan 2024 17:57:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=BA=90=E8=B0=83=E7=94=A8=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/assets/script/user-api-preload.js | 27 +++++-------------- .../toside/music/mobile/userApi/QuickJS.java | 26 +++++++++++------- src/config/globalData.ts | 1 + src/core/apiSource.ts | 11 ++++++++ src/core/init/userApi/index.ts | 1 + src/core/music/utils.ts | 11 +++++--- src/types/app.d.ts | 1 + 7 files changed, 44 insertions(+), 34 deletions(-) diff --git a/android/app/src/main/assets/script/user-api-preload.js b/android/app/src/main/assets/script/user-api-preload.js index c445922..7e72196 100644 --- a/android/app/src/main/assets/script/user-api-preload.js +++ b/android/app/src/main/assets/script/user-api-preload.js @@ -232,18 +232,18 @@ globalThis.lx_setup = (key, id, name, description, version, author, homepage, ra const jsCall = (action, data) => { // console.log('jsCall', action, data) switch (action) { + case '__run_error__': + if (!isInitedApi) isInitedApi = true + return case '__set_timeout__': handleSetTimeout(data) - break + return case 'request': handleRequest(data) - break + return case 'response': handleNativeResponse(data) - break - - default: - break + return } return 'Unknown action: ' + action } @@ -254,7 +254,7 @@ globalThis.lx_setup = (key, id, name, description, version, author, homepage, ra writable: false, value: (_key, action, data) => { if (key != _key) return 'Invalid key' - return jsCall(action, JSON.parse(data)) + return data == null ? jsCall(action) : jsCall(action, JSON.parse(data)) }, }) @@ -496,19 +496,6 @@ globalThis.lx_setup = (key, id, name, description, version, author, homepage, ra globalThis.setTimeout = _setTimeout globalThis.clearTimeout = _clearTimeout - globalThis.window = globalThis - globalThis.document = { - getElementsByTagName(name) { - if (name == 'script') { - return [ - Object.freeze({ - innerText: globalThis.lx.currentScriptInfo.rawScript, - }), - ] - } - return null - }, - } const freezeObject = (obj) => { if (typeof obj != 'object') return diff --git a/android/app/src/main/java/cn/toside/music/mobile/userApi/QuickJS.java b/android/app/src/main/java/cn/toside/music/mobile/userApi/QuickJS.java index 8980c5c..416c906 100644 --- a/android/app/src/main/java/cn/toside/music/mobile/userApi/QuickJS.java +++ b/android/app/src/main/java/cn/toside/music/mobile/userApi/QuickJS.java @@ -165,23 +165,29 @@ public class QuickJS { return ""; } catch (Exception e) { Log.e("UserApi", "load script error: " + e.getMessage()); + try { + callJS("__run_error__"); + } catch (Exception ignored) {} + if (inited) return ""; + inited = true; return e.getMessage(); } } return "create JavaScript Env failed"; } + public Object callJS(String action) { + Object[] params = new Object[]{this.key, action}; + return callJS(params); + } public Object callJS(String action, Object... args) { - Object[] params; - if (args == null) { - params = new Object[]{this.key, action}; - } else { - Object[] params2 = new Object[args.length + 2]; - params2[0] = this.key; - params2[1] = action; - System.arraycopy(args, 0, params2, 2, args.length); - params = params2; - } + Object[] params = new Object[args.length + 2]; + params[0] = this.key; + params[1] = action; + System.arraycopy(args, 0, params, 2, args.length); + return callJS(params); + } + public Object callJS(Object[] params) { try { return this.jsContext.getGlobalObject().getJSFunction("__lx_native__").call(params); } catch (Exception e) { diff --git a/src/config/globalData.ts b/src/config/globalData.ts index 45a16f5..45bb88c 100644 --- a/src/config/globalData.ts +++ b/src/config/globalData.ts @@ -53,6 +53,7 @@ global.lx = { qualityList: {}, apis: {}, + apiInitPromise: [Promise.resolve(false), true, () => {}], jumpMyListPosition: false, diff --git a/src/core/apiSource.ts b/src/core/apiSource.ts index 44d06ac..4579eb3 100644 --- a/src/core/apiSource.ts +++ b/src/core/apiSource.ts @@ -8,8 +8,18 @@ import apiSourceInfo from '@/utils/musicSdk/api-source-info' export const setApiSource = (apiId: string) => { + if (global.lx.apiInitPromise[1]) { + global.lx.apiInitPromise[0] = new Promise(resolve => { + global.lx.apiInitPromise[1] = false + global.lx.apiInitPromise[2] = (result: boolean) => { + global.lx.apiInitPromise[1] = true + resolve(result) + } + }) + } if (/^user_api/.test(apiId)) { setUserApi(apiId).catch(err => { + if (!global.lx.apiInitPromise[1]) global.lx.apiInitPromise[2](false) console.log(err) let api = apiSourceInfo.find(api => !api.disabled) if (!api) return @@ -19,6 +29,7 @@ export const setApiSource = (apiId: string) => { // @ts-expect-error global.lx.qualityList = musicSdk.supportQuality[apiId] ?? {} destroyUserApi() + if (!global.lx.apiInitPromise[1]) global.lx.apiInitPromise[2](true) // apiSource.value = apiId // void setUserApiAction(apiId) } diff --git a/src/core/init/userApi/index.ts b/src/core/init/userApi/index.ts index 653fc6e..d855f15 100644 --- a/src/core/init/userApi/index.ts +++ b/src/core/init/userApi/index.ts @@ -133,6 +133,7 @@ export default async(setting: LX.AppSetting) => { }) } } + if (!global.lx.apiInitPromise[1]) global.lx.apiInitPromise[2](status) } const showUpdateAlert = ({ name, log, updateUrl }: UpdateInfoParams) => { if (updateUrl) { diff --git a/src/core/music/utils.ts b/src/core/music/utils.ts index a3301e4..a7ebe8d 100644 --- a/src/core/music/utils.ts +++ b/src/core/music/utils.ts @@ -53,7 +53,7 @@ export const getOtherSource = async(musicInfo: LX.Music.MusicInfo | LX.Download. let timeout: null | number = BackgroundTimer.setTimeout(() => { timeout = null reject(new Error('find music timeout')) - }, 20_000) + }, 15_000) findMusic(searchMusicInfo).then((otherSource) => { resolve(otherSource.map(toNewMusicInfo) as LX.Music.MusicInfoOnline[]) }).catch(reject).finally(() => { @@ -164,6 +164,8 @@ export const getOnlineOtherSourceMusicUrl = async({ musicInfos, quality, onToggl quality: LX.Quality isFromCache: boolean }> => { + if (!await global.lx.apiInitPromise[0]) throw new Error('source init failed') + let musicInfo: LX.Music.MusicInfoOnline | null = null let itemQuality: LX.Quality | null = null // eslint-disable-next-line no-cond-assign @@ -189,7 +191,7 @@ export const getOnlineOtherSourceMusicUrl = async({ musicInfos, quality, onToggl } catch (err: any) { reqPromise = Promise.reject(err) } - retryedSource.includes(musicInfo.source) + // retryedSource.includes(musicInfo.source) // eslint-disable-next-line @typescript-eslint/promise-function-async return reqPromise.then(({ url, type }: { url: string, type: LX.Quality }) => { return { musicInfo, url, quality: type, isFromCache: false } @@ -216,6 +218,7 @@ export const handleGetOnlineMusicUrl = async({ musicInfo, quality, onToggleSourc quality: LX.Quality isFromCache: boolean }> => { + if (!await global.lx.apiInitPromise[0]) throw new Error('source init failed') // console.log(musicInfo.source) const targetQuality = quality ?? getPlayQuality(settingState.setting['player.isPlayHighQuality'], musicInfo) @@ -279,7 +282,7 @@ export const getOnlineOtherSourcePicUrl = async({ musicInfos, onToggleSource, is } catch (err: any) { reqPromise = Promise.reject(err) } - retryedSource.includes(musicInfo.source) + // retryedSource.includes(musicInfo.source) return reqPromise.then((url: string) => { return { musicInfo, url, isFromCache: false } // eslint-disable-next-line @typescript-eslint/promise-function-async @@ -366,7 +369,7 @@ export const getOnlineOtherSourceLyricInfo = async({ musicInfos, onToggleSource, } catch (err: any) { reqPromise = Promise.reject(err) } - retryedSource.includes(musicInfo.source) + // retryedSource.includes(musicInfo.source) return reqPromise.then(async(lyricInfo: LX.Music.LyricInfo) => { return existTimeExp.test(lyricInfo.lyric) ? { lyricInfo, diff --git a/src/types/app.d.ts b/src/types/app.d.ts index a5b5301..63ce869 100644 --- a/src/types/app.d.ts +++ b/src/types/app.d.ts @@ -36,6 +36,7 @@ interface GlobalData { qualityList: LX.QualityList apis: Partial + apiInitPromise: [Promise, boolean, (success: boolean) => void] jumpMyListPosition: boolean