From bd4dbb55e42670a2d311b6900f34de2eeca33c5b Mon Sep 17 00:00:00 2001 From: lyswhut Date: Tue, 11 Jun 2024 19:41:10 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8E=B0=E5=9C=A8=E5=A6=82=E6=9E=9C=E5=9C=A8?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E6=88=96=E8=80=85=E5=90=AF=E5=8A=A8=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=85=8D=E7=BD=AE=E4=BA=86=E4=BB=A3=E7=90=86=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=EF=BC=8C=E9=82=A3=E4=B9=88=E5=BA=94=E7=94=A8=E5=86=85?= =?UTF-8?q?=E7=9A=84=E5=9B=BE=E7=89=87=E3=80=81=E9=9F=B3=E9=A2=91=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=EF=BC=8C=E6=AD=8C=E6=9B=B2=E4=B8=8B=E8=BD=BD=E4=B9=9F?= =?UTF-8?q?=E5=B0=86=E8=B5=B0=E4=BB=A3=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/common/utils/musicMeta/downloader.js | 13 ++++++-- src/common/utils/musicMeta/flacMeta.js | 4 +-- src/common/utils/musicMeta/index.d.ts | 2 +- src/common/utils/musicMeta/index.js | 6 ++-- src/common/utils/musicMeta/mp3Meta.js | 4 +-- src/main/modules/winMain/index.ts | 5 +++- src/main/modules/winMain/main.ts | 23 +++++++++++++- src/main/utils/index.ts | 28 +++++++++++++++++ src/main/utils/request.ts | 38 ++---------------------- src/renderer/store/download/action.ts | 14 +++++++-- src/renderer/worker/download/common.ts | 4 +-- src/renderer/worker/download/download.ts | 7 +++-- 13 files changed, 94 insertions(+), 55 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index 9aa4b702..dfeb6798 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -6,6 +6,7 @@ ### 变更 - 简化了应用退出行为,据测试,现在 linux 下,若启用了托盘,dock 右键菜单的 退出、关闭所有 之类的功能将不再退出程序,需改用托盘的退出按钮退出程序 +- 现在如果在设置或者启动参数配置了代理服务,那么应用内的图片、音频加载,歌曲下载也将走代理 ### 其他 diff --git a/src/common/utils/musicMeta/downloader.js b/src/common/utils/musicMeta/downloader.js index 7af2872c..1eaae9a8 100644 --- a/src/common/utils/musicMeta/downloader.js +++ b/src/common/utils/musicMeta/downloader.js @@ -1,14 +1,21 @@ const http = require('http') const https = require('https') const fs = require('fs') +const { httpOverHttp, httpsOverHttp } = require('tunnel') -const sendRequest = (url) => { +const httpsRxp = /^https:/ +const getRequestAgent = (url, proxy) => { + return proxy ? (httpsRxp.test(url) ? httpsOverHttp : httpOverHttp)({ proxy }) : undefined +} + +const sendRequest = (url, proxy) => { const urlParse = new URL(url) const httpOptions = { method: 'get', host: urlParse.hostname, port: urlParse.port, path: urlParse.pathname + urlParse.search, + agent: getRequestAgent(url, proxy), headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', }, @@ -20,9 +27,9 @@ const sendRequest = (url) => { : http.request(httpOptions) } -module.exports = (url, filePath) => { +module.exports = (url, filePath, proxy) => { return new Promise((resolve) => { - sendRequest(url) + sendRequest(url, proxy) .on('response', response => { // console.log(response.statusCode) if (response.statusCode !== 200 && response.statusCode != 206) { diff --git a/src/common/utils/musicMeta/flacMeta.js b/src/common/utils/musicMeta/flacMeta.js index 84dead42..e2711fec 100644 --- a/src/common/utils/musicMeta/flacMeta.js +++ b/src/common/utils/musicMeta/flacMeta.js @@ -57,7 +57,7 @@ const writeMeta = async(filePath, meta, picPath) => { }) } -module.exports = (filePath, meta) => { +module.exports = (filePath, meta, proxy) => { if (!meta.APIC) return writeMeta(filePath, meta) let picUrl = meta.APIC delete meta.APIC @@ -68,7 +68,7 @@ module.exports = (filePath, meta) => { let picPath = filePath.replace(/\.flac$/, '') + (ext ? ext.replace(extReg, '$1') : '.jpg') if (picUrl.includes('music.126.net')) picUrl += `${picUrl.includes('?') ? '&' : '?'}param=500y500` - download(picUrl, picPath).then(success => { + download(picUrl, picPath, proxy).then(success => { if (success) { writeMeta(filePath, meta, picPath).finally(() => { fs.unlink(picPath, err => { diff --git a/src/common/utils/musicMeta/index.d.ts b/src/common/utils/musicMeta/index.d.ts index 52de761b..7dd60bbe 100644 --- a/src/common/utils/musicMeta/index.d.ts +++ b/src/common/utils/musicMeta/index.d.ts @@ -5,4 +5,4 @@ export interface MusicMeta { APIC: string | null lyrics: string | null } -export function setMeta(filePath: string, meta: MusicMeta): void +export function setMeta(filePath: string, meta: MusicMeta, proxy?: { host: string, port: number }): void diff --git a/src/common/utils/musicMeta/index.js b/src/common/utils/musicMeta/index.js index 018392cb..46877f68 100644 --- a/src/common/utils/musicMeta/index.js +++ b/src/common/utils/musicMeta/index.js @@ -2,13 +2,13 @@ const path = require('path') const mp3Meta = require('./mp3Meta') const flacMeta = require('./flacMeta') -exports.setMeta = (filePath, meta) => { +exports.setMeta = (filePath, meta, proxy) => { switch (path.extname(filePath)) { case '.mp3': - mp3Meta(filePath, meta) + mp3Meta(filePath, meta, proxy) break case '.flac': - flacMeta(filePath, meta) + flacMeta(filePath, meta, proxy) break } } diff --git a/src/common/utils/musicMeta/mp3Meta.js b/src/common/utils/musicMeta/mp3Meta.js index aae25542..e5e55b79 100644 --- a/src/common/utils/musicMeta/mp3Meta.js +++ b/src/common/utils/musicMeta/mp3Meta.js @@ -15,7 +15,7 @@ const handleWriteMeta = (meta, filePath) => { NodeID3.write(meta, filePath) } -module.exports = (filePath, meta) => { +module.exports = (filePath, meta, proxy) => { if (!meta.APIC) return handleWriteMeta(meta, filePath) if (!/^http/.test(meta.APIC)) { delete meta.APIC @@ -26,7 +26,7 @@ module.exports = (filePath, meta) => { let picUrl = meta.APIC if (picUrl.includes('music.126.net')) picUrl += `${picUrl.includes('?') ? '&' : '?'}param=500y500` - download(picUrl, picPath).then(success => { + download(picUrl, picPath, proxy).then(success => { if (success) { meta.APIC = picPath handleWriteMeta(meta, filePath) diff --git a/src/main/modules/winMain/index.ts b/src/main/modules/winMain/index.ts index 9ffca140..c05e4466 100644 --- a/src/main/modules/winMain/index.ts +++ b/src/main/modules/winMain/index.ts @@ -1,7 +1,7 @@ import initRendererEvent, { handleKeyDown, hotKeyConfigUpdate } from './rendererEvent' import { APP_EVENT_NAMES } from '@common/constants' -import { createWindow, minimize, setProgressBar, setThumbarButtons, toggleHide, toggleMinimize } from './main' +import { createWindow, minimize, setProgressBar, setProxy, setThumbarButtons, toggleHide, toggleMinimize } from './main' import initUpdate from './autoUpdate' import { HOTKEY_COMMON } from '@common/hotKey' import { quitApp } from '@main/app' @@ -108,6 +108,9 @@ 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.')))) { + setProxy() + } }) } diff --git a/src/main/modules/winMain/main.ts b/src/main/modules/winMain/main.ts index 35aa651e..5998d147 100644 --- a/src/main/modules/winMain/main.ts +++ b/src/main/modules/winMain/main.ts @@ -2,7 +2,7 @@ import { BrowserWindow, dialog, session } from 'electron' import path from 'node:path' import { createTaskBarButtons, getWindowSizeInfo } from './utils' import { isLinux, isWin } from '@common/utils' -import { openDevTools as handleOpenDevTools } from '@main/utils' +import { getProxy, openDevTools as handleOpenDevTools } from '@main/utils' import { mainSend } from '@common/mainIpc' import { sendFocus, sendTaskbarButtonClick } from './rendererEvent' import { encodePath } from '@common/utils/electron' @@ -65,6 +65,12 @@ 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 @@ -124,6 +130,21 @@ export const closeWindow = () => { browserWindow.close() } +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: '', + }) + } +} + + 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 8e4b618b..453ef558 100644 --- a/src/main/utils/index.ts +++ b/src/main/utils/index.ts @@ -294,3 +294,31 @@ export const setPowerSaveBlocker = (enabled: boolean) => { powerSaveBlockerId = null } } + + +let envProxy: null | { host: string, port: number } = null +export const getProxy = () => { + if (global.lx.appSetting['network.proxy.enable'] && global.lx.appSetting['network.proxy.host']) { + 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'), + } + } + } + + return null +} diff --git a/src/main/utils/request.ts b/src/main/utils/request.ts index fddf4bcb..2bb080d2 100644 --- a/src/main/utils/request.ts +++ b/src/main/utils/request.ts @@ -2,6 +2,7 @@ import needle, { type NeedleHttpVerbs, type NeedleOptions, type BodyData, type N // import progress from 'request-progress' import { httpOverHttp, httpsOverHttp } from 'tunnel' import { type ClientRequest } from 'node:http' +import { getProxy } from './index' // import fs from 'fs' export const requestMsg = { @@ -15,42 +16,9 @@ export const requestMsg = { const httpsRxp = /^https:/ -let envProxy: null | { host: string, port: string } = null - const getRequestAgent = (url: string) => { - if (envProxy == null) { - if (global.envParams.cmdParams['proxy-server'] && typeof global.envParams.cmdParams['proxy-server'] == 'string') { - const [host, port = ''] = global.envParams.cmdParams['proxy-server'].split(':') - envProxy = { - host, - port, - } - } - } - const proxy = { - enable: global.lx.appSetting['network.proxy.enable'], - host: global.lx.appSetting['network.proxy.host'], - port: global.lx.appSetting['network.proxy.port'], - envProxy, - } - - let options - if (global.lx.appSetting['network.proxy.enable'] && proxy.host) { - options = { - proxy: { - host: proxy.host, - port: parseInt(proxy.port || '80'), - }, - } - } else if (proxy.envProxy) { - options = { - proxy: { - host: proxy.envProxy.host, - port: parseInt(proxy.envProxy.port || '80'), - }, - } - } - return options ? (httpsRxp.test(url) ? httpsOverHttp : httpOverHttp)(options) : undefined + const proxy = getProxy() + return proxy ? (httpsRxp.test(url) ? httpsOverHttp : httpOverHttp)({ proxy }) : undefined } export interface RequestOptions extends NeedleOptions { diff --git a/src/renderer/store/download/action.ts b/src/renderer/store/download/action.ts index a1421b10..b50ca295 100644 --- a/src/renderer/store/download/action.ts +++ b/src/renderer/store/download/action.ts @@ -15,6 +15,7 @@ import { qualityList } from '..' import { proxyCallback } from '@renderer/worker/utils' import { arrPush, arrUnshift, joinPath } from '@renderer/utils' import { DOWNLOAD_STATUS } from '@common/constants' +import { proxy } from '../index' const waitingUpdateTasks = new Map() let timer: NodeJS.Timeout | null = null @@ -131,6 +132,15 @@ const setStatus = (downloadInfo: LX.Download.ListItem, status: LX.Download.Downl // 修复 1.1.x版本 酷狗源歌词格式 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 ? { + host: proxy.host, + port: parseInt(proxy.port || '80'), + } : proxy.envProxy ? { + host: proxy.envProxy.host, + port: parseInt(proxy.envProxy.port || '80'), + } : undefined +} /** * 设置歌曲meta信息 * @param downloadInfo 下载任务信息 @@ -170,7 +180,7 @@ const saveMeta = (downloadInfo: LX.Download.ListItem) => { artist: downloadInfo.metadata.musicInfo.singer, album: downloadInfo.metadata.musicInfo.meta.albumName, APIC: imgUrl, - }, lrcData) + }, lrcData, getProxy()) }) } @@ -282,7 +292,7 @@ const handleStartTask = async(downloadInfo: LX.Download.ListItem) => { default: break } - })) + }), getProxy()) } const startTask = async(downloadInfo: LX.Download.ListItem) => { setStatus(downloadInfo, DOWNLOAD_STATUS.RUN) diff --git a/src/renderer/worker/download/common.ts b/src/renderer/worker/download/common.ts index 6aafe61e..00411f82 100644 --- a/src/renderer/worker/download/common.ts +++ b/src/renderer/worker/download/common.ts @@ -1,8 +1,8 @@ import { setMeta } from '@common/utils/musicMeta' import { mergeLyrics } from './lrcTool' -export const writeMeta = (filePath: string, meta: Omit, lyricData: { lrc: string, tlrc: string | null, rlrc: string | null }) => { - setMeta(filePath, { ...meta, lyrics: mergeLyrics(lyricData.lrc, lyricData.tlrc, lyricData.rlrc) || null }) +export const writeMeta = (filePath: string, meta: Omit, lyricData: { lrc: string, tlrc: string | null, rlrc: string | null }, proxy?: { host: string, port: number }) => { + setMeta(filePath, { ...meta, lyrics: mergeLyrics(lyricData.lrc, lyricData.tlrc, lyricData.rlrc) || null }, proxy) } export { saveLrc } from './utils' diff --git a/src/renderer/worker/download/download.ts b/src/renderer/worker/download/download.ts index 22081175..1304ca66 100644 --- a/src/renderer/worker/download/download.ts +++ b/src/renderer/worker/download/download.ts @@ -55,7 +55,7 @@ export const createDownloadTasks = ( // } } -const createTask = async(downloadInfo: LX.Download.ListItem, savePath: string, skipExistFile: boolean) => { +const createTask = async(downloadInfo: LX.Download.ListItem, savePath: string, skipExistFile: boolean, proxy?: { host: string, port: number }) => { // console.log('createTask', downloadInfo, savePath) // 开始任务 /* commit('onStart', downloadInfo) @@ -103,6 +103,7 @@ const createTask = async(downloadInfo: LX.Download.ListItem, savePath: string, s path: savePath, fileName: downloadInfo.metadata.fileName, method: 'get', + proxy, onCompleted() { // if (downloadInfo.progress.progress != '100.00') { // delete.get(downloadInfo.id)? @@ -241,7 +242,7 @@ export const updateUrl = (id: string, url: string) => { }) } -export const startTask = async(downloadInfo: LX.Download.ListItem, savePath: string, skipExistFile: boolean, callback: (action: LX.Download.DownloadTaskActions) => void) => { +export const startTask = async(downloadInfo: LX.Download.ListItem, savePath: string, skipExistFile: boolean, callback: (action: LX.Download.DownloadTaskActions) => void, proxy?: { host: string, port: number }) => { await pauseTask(downloadInfo.id) tasks.set(downloadInfo.id, downloadInfo) @@ -276,7 +277,7 @@ export const startTask = async(downloadInfo: LX.Download.ListItem, savePath: str // await dispatch('startTask') } } else { - await createTask(downloadInfo, savePath, skipExistFile) + await createTask(downloadInfo, savePath, skipExistFile, proxy) // await dispatch('handleStartTask', downloadInfo) } }