feat: 添加字体配置功能 可配置歌词页面 或全局字体

This commit is contained in:
alger
2025-01-17 22:45:59 +08:00
parent 914e043502
commit 1bdb8fcb4a
13 changed files with 525 additions and 42 deletions
+11
View File
@@ -12,6 +12,17 @@ interface StoreType {
author: string;
authorUrl: string;
musicApiPort: number;
closeAction: 'ask' | 'minimize' | 'close';
musicQuality: string;
fontFamily: string;
proxyConfig: {
enable: boolean;
protocol: string;
host: string;
port: number;
};
enableRealIP: boolean;
realIP: string;
};
shortcuts: typeof defaultShortcuts;
}
+42
View File
@@ -0,0 +1,42 @@
import { ipcMain } from 'electron';
import { getFonts } from 'font-list';
/**
* 清理字体名称
* @param fontName 原始字体名称
* @returns 清理后的字体名称
*/
function cleanFontName(fontName: string): string {
return fontName
.trim()
.replace(/^["']|["']$/g, '') // 移除首尾的引号
.replace(/\s+/g, ' '); // 将多个空格替换为单个空格
}
/**
* 获取系统字体列表
*/
async function getSystemFonts(): Promise<string[]> {
try {
// 使用 font-list 获取系统字体
const fonts = await getFonts();
// 清理字体名称并去重
const cleanedFonts = [...new Set(fonts.map(cleanFontName))];
// 添加系统默认字体并排序
return ['system-ui', ...cleanedFonts].sort();
} catch (error) {
console.error('获取系统字体失败:', error);
// 如果获取失败,至少返回系统默认字体
return ['system-ui'];
}
}
/**
* 初始化字体管理模块
*/
export function initializeFonts() {
// 添加获取系统字体的 IPC 处理
ipcMain.handle('get-system-fonts', async () => {
return await getSystemFonts();
});
}
+90
View File
@@ -0,0 +1,90 @@
import axios from 'axios';
import { exec } from 'child_process';
import { app, BrowserWindow, ipcMain } from 'electron';
import * as fs from 'fs';
import * as path from 'path';
export function setupUpdateHandlers(_mainWindow: BrowserWindow) {
ipcMain.on('start-download', async (event, url: string) => {
try {
const response = await axios({
url,
method: 'GET',
responseType: 'stream',
onDownloadProgress: (progressEvent: { loaded: number; total?: number }) => {
if (!progressEvent.total) return;
const percent = Math.round((progressEvent.loaded / progressEvent.total) * 100);
const downloaded = (progressEvent.loaded / 1024 / 1024).toFixed(2);
const total = (progressEvent.total / 1024 / 1024).toFixed(2);
event.sender.send('download-progress', percent, `已下载 ${downloaded}MB / ${total}MB`);
}
});
const fileName = url.split('/').pop() || 'update.exe';
const downloadPath = path.join(app.getPath('downloads'), fileName);
// 创建写入流
const writer = fs.createWriteStream(downloadPath);
// 将响应流写入文件
response.data.pipe(writer);
// 处理写入完成
writer.on('finish', () => {
event.sender.send('download-complete', true, downloadPath);
});
// 处理写入错误
writer.on('error', (error) => {
console.error('Write file error:', error);
event.sender.send('download-complete', false, '');
});
} catch (error) {
console.error('Download failed:', error);
event.sender.send('download-complete', false, '');
}
});
ipcMain.on('install-update', (_event, filePath: string) => {
if (!fs.existsSync(filePath)) {
console.error('Installation file not found:', filePath);
return;
}
const { platform } = process;
// 关闭当前应用
app.quit();
// 根据不同平台执行安装
if (platform === 'win32') {
exec(`"${filePath}"`, (error) => {
if (error) {
console.error('Error starting installer:', error);
}
});
} else if (platform === 'darwin') {
// 挂载 DMG 文件
exec(`open "${filePath}"`, (error) => {
if (error) {
console.error('Error opening DMG:', error);
}
});
} else if (platform === 'linux') {
const ext = path.extname(filePath);
if (ext === '.AppImage') {
exec(`chmod +x "${filePath}" && "${filePath}"`, (error) => {
if (error) {
console.error('Error running AppImage:', error);
}
});
} else if (ext === '.deb') {
exec(`pkexec dpkg -i "${filePath}"`, (error) => {
if (error) {
console.error('Error installing deb package:', error);
}
});
}
}
});
}