From 9a692a99f682671f4583c70bc194d0061ec4605f Mon Sep 17 00:00:00 2001 From: Folltoshe Date: Tue, 6 May 2025 23:18:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BB=A3=E7=90=86=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/defaultSetting.ts | 2 +- src/common/types/app_setting.d.ts | 4 +- src/common/utils/migrateSetting.ts | 2 +- src/lang/en-us.json | 3 ++ src/lang/zh-cn.json | 3 ++ src/lang/zh-tw.json | 3 ++ src/main/modules/userApi/main.ts | 44 ++++++++++++------- src/main/modules/winMain/index.ts | 2 +- src/main/modules/winMain/main.ts | 39 ++++++++-------- src/main/utils/index.ts | 37 +++++++--------- src/renderer/core/useApp/index.ts | 2 +- src/renderer/core/useApp/useSettingSync.ts | 7 +-- src/renderer/store/download/action.ts | 2 +- src/renderer/store/index.ts | 5 +-- src/renderer/utils/request.js | 23 +++------- .../Setting/components/SettingNetwork.vue | 25 +++++++---- 16 files changed, 107 insertions(+), 96 deletions(-) diff --git a/src/common/defaultSetting.ts b/src/common/defaultSetting.ts index 88664105..02c2adc6 100644 --- a/src/common/defaultSetting.ts +++ b/src/common/defaultSetting.ts @@ -128,7 +128,7 @@ const defaultSetting: LX.AppSetting = { 'search.isShowHistorySearch': false, 'search.isFocusSearchBox': false, - 'network.proxy.enable': false, + 'network.proxy.type': 'disable', 'network.proxy.host': '', 'network.proxy.port': '', diff --git a/src/common/types/app_setting.d.ts b/src/common/types/app_setting.d.ts index aeff0891..455c0d70 100644 --- a/src/common/types/app_setting.d.ts +++ b/src/common/types/app_setting.d.ts @@ -596,9 +596,9 @@ declare global { 'search.isFocusSearchBox': boolean /** - * 是否启用代理 + * 代理类型 */ - 'network.proxy.enable': boolean + 'network.proxy.type': 'disable' | 'system' | 'custom' /** * 代理服务器地址 diff --git a/src/common/utils/migrateSetting.ts b/src/common/utils/migrateSetting.ts index 6c06630f..0a94705f 100644 --- a/src/common/utils/migrateSetting.ts +++ b/src/common/utils/migrateSetting.ts @@ -113,7 +113,7 @@ export default (setting: any): Partial => { setting['search.isShowHistorySearch'] = setting.search?.isShowHistorySearch setting['search.isFocusSearchBox'] = setting.search?.isFocusSearchBox - setting['network.proxy.enable'] = setting.network?.proxy?.enable + // setting['network.proxy.enable'] = setting.network?.proxy?.enable setting['network.proxy.host'] = setting.network?.proxy?.host setting['network.proxy.port'] = setting.network?.proxy?.port diff --git a/src/lang/en-us.json b/src/lang/en-us.json index a58c6fa7..73d1e1af 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -472,6 +472,9 @@ "setting__list_scroll": "Remember position of scroll bar of playlist (Only valid for \"Your Library\" page)", "setting__list_source": "Show which music streaming service the song is from (Only valid for \"Your Library\" page)", "setting__network": "Network", + "setting__network_proxy_type_disable": "Do not use proxy", + "setting__network_proxy_type_system": "Use system proxy", + "setting__network_proxy_type_custom": "Custom proxy", "setting__network_proxy_host": "Host", "setting__network_proxy_password": "Password", "setting__network_proxy_port": "Port", diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index bec3ac91..48aa1572 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -472,6 +472,9 @@ "setting__list_scroll": "记住播放列表滚动条位置(仅对「我的列表」有效)", "setting__list_source": "显示歌曲来源平台(仅对「我的列表」有效)", "setting__network": "网络设置", + "setting__network_proxy_type_disable": "不使用代理", + "setting__network_proxy_type_system": "使用系统代理", + "setting__network_proxy_type_custom": "自定义代理", "setting__network_proxy_host": "主机", "setting__network_proxy_password": "密码", "setting__network_proxy_port": "端口", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 05e4d913..3184fda4 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -472,6 +472,9 @@ "setting__list_scroll": "記住播放清單滾動條位置(僅對「我的清單」有效)", "setting__list_source": "顯示歌曲來自哪個音樂串流平台(僅對「我的清單」有效)", "setting__network": "網路設定", + "setting__network_proxy_type_disable": "不使用代理", + "setting__network_proxy_type_system": "使用系統代理", + "setting__network_proxy_type_custom": "自訂代理", "setting__network_proxy_host": "主機", "setting__network_proxy_password": "密碼", "setting__network_proxy_port": "埠", diff --git a/src/main/modules/userApi/main.ts b/src/main/modules/userApi/main.ts index 96aad60b..7f70d95b 100644 --- a/src/main/modules/userApi/main.ts +++ b/src/main/modules/userApi/main.ts @@ -19,31 +19,41 @@ const denyEvents = [ 'media-started-playing', ] as const - export const getProxy = () => { - if (global.lx.appSetting['network.proxy.enable'] && global.lx.appSetting['network.proxy.host']) { + const envProxyStr = envParams.cmdParams['proxy-server'] + if (envProxyStr && typeof envProxyStr == 'string') { + const [host, port = ''] = envProxyStr.split(':') return { - host: global.lx.appSetting['network.proxy.host'], - port: global.lx.appSetting['network.proxy.port'], + host, + port: parseInt(port || '80'), } } - const envProxy = envParams.cmdParams['proxy-server'] - if (envProxy) { - if (envProxy && typeof envProxy == 'string') { - const [host, port = ''] = envProxy.split(':') - return { - host, - port, + + switch (global.lx.appSetting['network.proxy.type']) { + case 'custom': + const custom = { + enable: global.lx.appSetting['network.proxy.type'] === 'custom', + host: global.lx.appSetting['network.proxy.host'], + port: global.lx.appSetting['network.proxy.port'], + } + return custom.enable && custom.host + ? { + host: custom.host, + port: parseInt(custom.port || '80'), + } + : { + host: '', + port: '', + } + default: + return { + host: '', + port: '', } - } - } - return { - host: '', - port: '', } } const handleUpdateProxy = (keys: Array) => { - if (keys.includes('network.proxy.enable') || (global.lx.appSetting['network.proxy.enable'] && keys.some(k => k.startsWith('network.proxy.')))) { + if (keys.some(k => k.startsWith('network.proxy.'))) { sendEvent(USER_API_RENDERER_EVENT_NAME.proxyUpdate, getProxy()) } } diff --git a/src/main/modules/winMain/index.ts b/src/main/modules/winMain/index.ts index c05e4466..4c03c983 100644 --- a/src/main/modules/winMain/index.ts +++ b/src/main/modules/winMain/index.ts @@ -108,7 +108,7 @@ export default () => { setProgressBar(-1, { mode: 'none' }) } } - if (keys.includes('network.proxy.enable') || (global.lx.appSetting['network.proxy.enable'] && keys.some(k => k.includes('network.proxy.')))) { + if (keys.some(k => k.includes('network.proxy.'))) { setProxy() } }) diff --git a/src/main/modules/winMain/main.ts b/src/main/modules/winMain/main.ts index fc2d022d..e1113b14 100644 --- a/src/main/modules/winMain/main.ts +++ b/src/main/modules/winMain/main.ts @@ -65,12 +65,6 @@ export const createWindow = () => { const { shouldUseDarkColors, theme } = global.lx.theme const ses = session.fromPartition('persist:win-main') - const proxy = getProxy() - if (proxy) { - void ses.setProxy({ - proxyRules: `http://${proxy.host}:${proxy.port}`, - }) - } /** * Initial window options @@ -108,11 +102,12 @@ export const createWindow = () => { } browserWindow = new BrowserWindow(options) + setProxy() + winEvent() + const winURL = process.env.NODE_ENV !== 'production' ? 'http://localhost:9080' : `file://${path.join(encodePath(__dirname), 'index.html')}` void browserWindow.loadURL(winURL + `?os=${getPlatform()}&dt=${global.envParams.cmdParams.dt}&dark=${shouldUseDarkColors}&theme=${encodeURIComponent(JSON.stringify(theme))}`) - winEvent() - if (global.envParams.cmdParams.odt) handleOpenDevTools(browserWindow.webContents) // global.lx.mainWindowClosed = false @@ -133,19 +128,27 @@ export const closeWindow = () => { export const setProxy = () => { if (!browserWindow) return - const proxy = getProxy() - if (proxy) { - void browserWindow.webContents.session.setProxy({ - proxyRules: `http://${proxy.host}:${proxy.port}`, - }) - } else { - void browserWindow.webContents.session.setProxy({ - proxyRules: '', - }) + switch (global.lx.appSetting['network.proxy.type']) { + case 'system': + void browserWindow.webContents.session.setProxy({ + mode: 'system', + }) + break + case 'disable': + void browserWindow.webContents.session.setProxy({ + mode: 'direct', + }) + break + default: + const proxy = getProxy() + if (!proxy) break + void browserWindow.webContents.session.setProxy({ + proxyRules: `http://${proxy.host}:${proxy.port}`, + }) + break } } - export const sendEvent = (name: string, params?: T) => { if (!browserWindow) return mainSend(browserWindow, name, params) diff --git a/src/main/utils/index.ts b/src/main/utils/index.ts index 453ef558..fee6c147 100644 --- a/src/main/utils/index.ts +++ b/src/main/utils/index.ts @@ -295,30 +295,25 @@ export const setPowerSaveBlocker = (enabled: boolean) => { } } - -let envProxy: null | { host: string, port: number } = null export const getProxy = () => { - if (global.lx.appSetting['network.proxy.enable'] && global.lx.appSetting['network.proxy.host']) { + const envProxyStr = envParams.cmdParams['proxy-server'] + if (envProxyStr && typeof envProxyStr == 'string') { + const [host, port = ''] = envProxyStr.split(':') return { - host: global.lx.appSetting['network.proxy.host'], - port: parseInt(global.lx.appSetting['network.proxy.port'] || '80'), - } - } - if (envProxy) { - return { - host: envProxy.host, - port: envProxy.port, - } - } else { - const envProxyStr = envParams.cmdParams['proxy-server'] - if (envProxyStr && typeof envProxyStr == 'string') { - const [host, port = ''] = envProxyStr.split(':') - return envProxy = { - host, - port: parseInt(port || '80'), - } + host, + port: parseInt(port || '80'), } } - return null + const custom = { + enable: global.lx.appSetting['network.proxy.type'] === 'custom', + host: global.lx.appSetting['network.proxy.host'], + port: global.lx.appSetting['network.proxy.port'], + } + return custom.enable && custom.host + ? { + host: custom.host, + port: parseInt(custom.port || '80'), + } + : null } diff --git a/src/renderer/core/useApp/index.ts b/src/renderer/core/useApp/index.ts index 79536141..5f779056 100644 --- a/src/renderer/core/useApp/index.ts +++ b/src/renderer/core/useApp/index.ts @@ -19,7 +19,7 @@ import handleListAutoUpdate from './listAutoUpdate' export default () => { // apiSource.value = appSetting['common.apiSource'] - proxy.enable = appSetting['network.proxy.enable'] + proxy.type = appSetting['network.proxy.type'] proxy.host = appSetting['network.proxy.host'] proxy.port = appSetting['network.proxy.port'] isFullscreen.value = appSetting['common.startInFullscreen'] diff --git a/src/renderer/core/useApp/useSettingSync.ts b/src/renderer/core/useApp/useSettingSync.ts index 40b26125..61ee030a 100644 --- a/src/renderer/core/useApp/useSettingSync.ts +++ b/src/renderer/core/useApp/useSettingSync.ts @@ -95,11 +95,8 @@ export default () => { sync.client.host = host }) - watch(() => appSetting['network.proxy.enable'], enable => { - proxy.enable = enable - }) - watch(() => appSetting['network.proxy.enable'], enable => { - proxy.enable = enable + watch(() => appSetting['network.proxy.type'], type => { + proxy.type = type }) watch(() => appSetting['network.proxy.host'], host => { proxy.host = host diff --git a/src/renderer/store/download/action.ts b/src/renderer/store/download/action.ts index 15618e9e..fc28043c 100644 --- a/src/renderer/store/download/action.ts +++ b/src/renderer/store/download/action.ts @@ -134,7 +134,7 @@ const setStatus = (downloadInfo: LX.Download.ListItem, status: LX.Download.Downl const fixKgLyric = (lrc: string) => /\[00:\d\d:\d\d.\d+\]/.test(lrc) ? lrc.replace(/(?:\[00:(\d\d:\d\d.\d+\]))/gm, '[$1') : lrc const getProxy = () => { - return proxy.enable && proxy.host ? { + return proxy.type === 'custom' && proxy.host ? { host: proxy.host, port: parseInt(proxy.port || '80'), } : proxy.envProxy ? { diff --git a/src/renderer/store/index.ts b/src/renderer/store/index.ts index 585c8345..d2faadee 100644 --- a/src/renderer/store/index.ts +++ b/src/renderer/store/index.ts @@ -8,16 +8,15 @@ process.versions.app = pkg.version export const apiSource = ref(null) export const proxy: { - enable: boolean + type: LX.AppSetting['network.proxy.type'] host: string port: string - envProxy?: { host: string port: string } } = { - enable: false, + type: 'disable', host: '', port: '', } diff --git a/src/renderer/utils/request.js b/src/renderer/utils/request.js index 6a30ee35..dd11a06c 100644 --- a/src/renderer/utils/request.js +++ b/src/renderer/utils/request.js @@ -10,23 +10,12 @@ import { httpOverHttp, httpsOverHttp } from 'tunnel' const httpsRxp = /^https:/ const getRequestAgent = url => { - let options - if (proxy.enable && proxy.host) { - options = { - proxy: { - host: proxy.host, - port: proxy.port, - }, - } - } else if (proxy.envProxy) { - options = { - proxy: { - host: proxy.envProxy.host, - port: proxy.envProxy.port, - }, - } - } - return options ? (httpsRxp.test(url) ? httpsOverHttp : httpOverHttp)(options) : undefined + const options = proxy.type === 'custom' && proxy.host + ? { host: proxy.host, port: parseInt(proxy.port || '80') } + : proxy.envProxy + ? { host: proxy.envProxy.host, port: parseInt(proxy.envProxy.port || '80') } + : null + return options ? (httpsRxp.test(url) ? httpsOverHttp : httpOverHttp)({ proxy: options }) : undefined } diff --git a/src/renderer/views/Setting/components/SettingNetwork.vue b/src/renderer/views/Setting/components/SettingNetwork.vue index 29780370..733bcc0d 100644 --- a/src/renderer/views/Setting/components/SettingNetwork.vue +++ b/src/renderer/views/Setting/components/SettingNetwork.vue @@ -4,16 +4,18 @@ dd h3#network_proxy_title {{ $t('setting__network_proxy_title') }} div .p - base-checkbox(id="setting_network_proxy_enable" :model-value="appSetting['network.proxy.enable']" :label="$t('setting__is_enable')" @update:model-value="updateSetting({'network.proxy.enable': $event})") - .p - base-input(:model-value="appSetting['network.proxy.host']" :placeholder="proxy.envProxy ? proxy.envProxy.host : $t('setting__network_proxy_host')" @update:model-value="setHost") - .p - base-input(:model-value="appSetting['network.proxy.port']" :placeholder="proxy.envProxy ? proxy.envProxy.port : $t('setting__network_proxy_port')" @update:model-value="setPort") - + base-checkbox.gap-left(id="setting_network_proxy_type_disable" key="disable" value="disable" need :model-value="appSetting['network.proxy.type']" :label="$t('setting__network_proxy_type_disable')" @update:model-value="updateSetting({'network.proxy.type': 'disable'})") + base-checkbox.gap-left(id="setting_network_proxy_type_system" key="system" value="system" need :model-value="appSetting['network.proxy.type']" :label="$t('setting__network_proxy_type_system')" @update:model-value="updateSetting({'network.proxy.type': 'system'})") + base-checkbox.gap-left(id="setting_network_proxy_type_custom" key="custom" value="custom" need :model-value="appSetting['network.proxy.type']" :label="$t('setting__network_proxy_type_custom')" @update:model-value="updateSetting({'network.proxy.type': 'custom'})") + .p(v-if="appSetting['network.proxy.type'] == 'custom'") + .p + base-input(:model-value="appSetting['network.proxy.host']" :placeholder="proxy.envProxy ? proxy.envProxy.host : $t('setting__network_proxy_host')" @update:model-value="setHost") + .p + base-input(:model-value="appSetting['network.proxy.port']" :placeholder="proxy.envProxy ? proxy.envProxy.port : $t('setting__network_proxy_port')" @update:model-value="setPort")