diff --git a/backend-deno/deno.json b/backend-deno/deno.json index 7c118f5..32122fb 100644 --- a/backend-deno/deno.json +++ b/backend-deno/deno.json @@ -7,6 +7,7 @@ }, "tasks": { "start": "deno run --allow-net --allow-run --allow-read --allow-write --allow-env main.ts", - "dev": "deno run --allow-net --allow-run --allow-read --allow-write --watch --allow-env main.ts" + "dev": "deno run --allow-net --allow-run --allow-read --allow-write --watch --allow-env main.ts", + "build": "deno compile --target aarch64-apple-darwin --allow-net --allow-run --allow-read --allow-write --allow-env --output dist/ main.ts" } } \ No newline at end of file diff --git a/backend-deno/dist/backend-deno b/backend-deno/dist/backend-deno new file mode 100755 index 0000000..c66016f Binary files /dev/null and b/backend-deno/dist/backend-deno differ diff --git a/backend-deno/main.ts b/backend-deno/main.ts index 3fc66a2..ad659cd 100644 --- a/backend-deno/main.ts +++ b/backend-deno/main.ts @@ -72,7 +72,7 @@ Deno.addSignalListener("SIGTERM", () => { await startup(); // 获取端口号 -const port = parseInt(Deno.env.get("PORT") || "5005"); +const port = Number(Deno.env.get("PORT") ?? 5005); console.log(`启动后端服务器在端口: ${port}`); // 启动服务器 diff --git a/backend-deno/modules/lyrics.ts b/backend-deno/modules/lyrics.ts index 12a5a95..b36afca 100644 --- a/backend-deno/modules/lyrics.ts +++ b/backend-deno/modules/lyrics.ts @@ -5,6 +5,9 @@ import { MusicStatus } from "./apple_music.ts"; import { DatabaseSync } from 'node:sqlite' +const userDataDir = Deno.env.get("USER_DATA_DIR") ?? "."; +// 将 DB_PATH 设为 `${userDataDir}/lyrics.db` +const DB_PATH = `${userDataDir}/lyrics.db`; export interface LyricsData { current_lyric_time: number | null; @@ -37,7 +40,6 @@ let lyricsCache: LyricsCache = { deleted: false, }; -const DB_PATH = "./lyrics.db"; const db = new DatabaseSync(DB_PATH); /** @@ -80,12 +82,12 @@ export function clearLyricsCache(): void { async function loadLyricsFromDB( trackName: string, artist: string -): Promise { +): Promise { try { const content = db.prepare(`SELECT lyrics_text FROM lyrics WHERE track_name = ? AND artist = ?`).get(trackName, artist); - return content.lyrics_text; + return String(content?.lyrics_text ?? ''); } catch (error) { - return null; + return ''; } } @@ -101,8 +103,8 @@ export async function saveLyrics( try { db.prepare(`DELETE FROM lyrics WHERE track_name = ? AND artist = ?`).run(trackName, artist); db.prepare(`INSERT INTO lyrics (track_name, artist, lyrics_text, source) VALUES (?, ?, ?, ?)`).run(trackName, artist, lyricsText, source); - lyricsCache.track_name = trackName; - lyricsCache.artist = artist; + lyricsCache.track_name = trackName ?? null; + lyricsCache.artist = artist ?? null; lyricsCache.lyrics_text = lyricsText; lyricsCache.source = source; console.log(`保存歌词成功: ${trackName} - ${artist}`); @@ -117,7 +119,7 @@ export async function saveLyrics( export async function searchLyrics( trackName: string, artistName: string -): Promise { +): Promise { try { const searchVariants = [ { title: trackName, artist: artistName }, @@ -155,10 +157,10 @@ export async function searchLyrics( } } - return null; + return ''; } catch (error) { console.error(`搜索歌词时出错: ${error}`); - return null; + return ''; } } @@ -283,8 +285,8 @@ export async function getLyricsData(status: MusicStatus): Promise { console.log(`歌曲切换,重新获取歌词: ${trackName} - ${artist}`); // 清空缓存 - lyricsCache.track_name = trackName; - lyricsCache.artist = artist; + lyricsCache.track_name = trackName ?? null; + lyricsCache.artist = artist ?? null; lyricsCache.lyrics_text = null; lyricsCache.deleted = false; diff --git a/electron-app/modules/backend-service.js b/electron-app/modules/backend-service.js index fdee945..ea58da2 100644 --- a/electron-app/modules/backend-service.js +++ b/electron-app/modules/backend-service.js @@ -76,25 +76,15 @@ async function startDenoBackend(isDev) { if (isDev) { // 开发模式:使用项目中的Deno后端 - scriptPath = path.join(__dirname, "..", "..", "backend-deno", "main.ts"); + scriptPath = path.join(__dirname, "..", "..", "backend-deno", "dist", "backend-deno"); } else { // 生产模式:使用打包的Deno后端 - scriptPath = path.join(process.resourcesPath, "backend-deno", "main.ts"); + scriptPath = path.join(process.resourcesPath, "backend", "backend-deno"); } console.log(`启动Deno后端: ${scriptPath} 在端口 ${backendPort}`); console.log(`后端脚本路径存在: ${fs.existsSync(scriptPath)}`); - // 检查Deno是否安装 - try { - const denoCheck = spawn("deno", ["--version"], { stdio: "pipe" }); - denoCheck.on("error", (err) => { - throw new Error(`Deno未安装或不在PATH中: ${err.message}`); - }); - } catch (err) { - throw new Error(`Deno未安装或不在PATH中: ${err.message}`); - } - // 打印Deno脚本目录内容 try { const scriptDir = path.dirname(scriptPath); @@ -104,29 +94,14 @@ async function startDenoBackend(isDev) { } // 启动子进程 - denoProcess = spawn( - "deno", - [ - "run", - "--allow-net", - "--allow-run", - "--allow-read", - "--allow-write", - "--allow-env", - scriptPath, - ], + denoProcess = spawn(scriptPath, + [], { - env: { ...process.env, PORT: backendPort.toString() }, + env: { ...process.env, PORT: backendPort.toString(), USER_DATA_DIR: require("electron").app.getPath("userData"), }, stdio: "pipe", // 确保可以读取标准输出和错误 } ); - // 输出Deno进程的日志 - denoProcess.stdout.on("data", (data) => { - const output = data.toString().trim(); - console.log(`Deno后端输出: ${output}`); - }); - denoProcess.stderr.on("data", (data) => { const message = data.toString().trim(); // 判断是否是错误日志还是普通日志