feat: 完善后端启动,打二进制文件防止因为网络无法运行
This commit is contained in:
@@ -7,6 +7,7 @@
|
|||||||
},
|
},
|
||||||
"tasks": {
|
"tasks": {
|
||||||
"start": "deno run --allow-net --allow-run --allow-read --allow-write --allow-env main.ts",
|
"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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BIN
backend-deno/dist/backend-deno
vendored
Executable file
BIN
backend-deno/dist/backend-deno
vendored
Executable file
Binary file not shown.
@@ -72,7 +72,7 @@ Deno.addSignalListener("SIGTERM", () => {
|
|||||||
await startup();
|
await startup();
|
||||||
|
|
||||||
// 获取端口号
|
// 获取端口号
|
||||||
const port = parseInt(Deno.env.get("PORT") || "5005");
|
const port = Number(Deno.env.get("PORT") ?? 5005);
|
||||||
console.log(`启动后端服务器在端口: ${port}`);
|
console.log(`启动后端服务器在端口: ${port}`);
|
||||||
|
|
||||||
// 启动服务器
|
// 启动服务器
|
||||||
|
|||||||
@@ -5,6 +5,9 @@
|
|||||||
|
|
||||||
import { MusicStatus } from "./apple_music.ts";
|
import { MusicStatus } from "./apple_music.ts";
|
||||||
import { DatabaseSync } from 'node:sqlite'
|
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 {
|
export interface LyricsData {
|
||||||
current_lyric_time: number | null;
|
current_lyric_time: number | null;
|
||||||
@@ -37,7 +40,6 @@ let lyricsCache: LyricsCache = {
|
|||||||
deleted: false,
|
deleted: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
const DB_PATH = "./lyrics.db";
|
|
||||||
const db = new DatabaseSync(DB_PATH);
|
const db = new DatabaseSync(DB_PATH);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -80,12 +82,12 @@ export function clearLyricsCache(): void {
|
|||||||
async function loadLyricsFromDB(
|
async function loadLyricsFromDB(
|
||||||
trackName: string,
|
trackName: string,
|
||||||
artist: string
|
artist: string
|
||||||
): Promise<string | null> {
|
): Promise<string> {
|
||||||
try {
|
try {
|
||||||
const content = db.prepare(`SELECT lyrics_text FROM lyrics WHERE track_name = ? AND artist = ?`).get(trackName, artist);
|
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) {
|
} catch (error) {
|
||||||
return null;
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,8 +103,8 @@ export async function saveLyrics(
|
|||||||
try {
|
try {
|
||||||
db.prepare(`DELETE FROM lyrics WHERE track_name = ? AND artist = ?`).run(trackName, artist);
|
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);
|
db.prepare(`INSERT INTO lyrics (track_name, artist, lyrics_text, source) VALUES (?, ?, ?, ?)`).run(trackName, artist, lyricsText, source);
|
||||||
lyricsCache.track_name = trackName;
|
lyricsCache.track_name = trackName ?? null;
|
||||||
lyricsCache.artist = artist;
|
lyricsCache.artist = artist ?? null;
|
||||||
lyricsCache.lyrics_text = lyricsText;
|
lyricsCache.lyrics_text = lyricsText;
|
||||||
lyricsCache.source = source;
|
lyricsCache.source = source;
|
||||||
console.log(`保存歌词成功: ${trackName} - ${artist}`);
|
console.log(`保存歌词成功: ${trackName} - ${artist}`);
|
||||||
@@ -117,7 +119,7 @@ export async function saveLyrics(
|
|||||||
export async function searchLyrics(
|
export async function searchLyrics(
|
||||||
trackName: string,
|
trackName: string,
|
||||||
artistName: string
|
artistName: string
|
||||||
): Promise<string | null> {
|
): Promise<string> {
|
||||||
try {
|
try {
|
||||||
const searchVariants = [
|
const searchVariants = [
|
||||||
{ title: trackName, artist: artistName },
|
{ title: trackName, artist: artistName },
|
||||||
@@ -155,10 +157,10 @@ export async function searchLyrics(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return '';
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`搜索歌词时出错: ${error}`);
|
console.error(`搜索歌词时出错: ${error}`);
|
||||||
return null;
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,8 +285,8 @@ export async function getLyricsData(status: MusicStatus): Promise<LyricsData> {
|
|||||||
console.log(`歌曲切换,重新获取歌词: ${trackName} - ${artist}`);
|
console.log(`歌曲切换,重新获取歌词: ${trackName} - ${artist}`);
|
||||||
|
|
||||||
// 清空缓存
|
// 清空缓存
|
||||||
lyricsCache.track_name = trackName;
|
lyricsCache.track_name = trackName ?? null;
|
||||||
lyricsCache.artist = artist;
|
lyricsCache.artist = artist ?? null;
|
||||||
lyricsCache.lyrics_text = null;
|
lyricsCache.lyrics_text = null;
|
||||||
lyricsCache.deleted = false;
|
lyricsCache.deleted = false;
|
||||||
|
|
||||||
|
|||||||
@@ -76,25 +76,15 @@ async function startDenoBackend(isDev) {
|
|||||||
|
|
||||||
if (isDev) {
|
if (isDev) {
|
||||||
// 开发模式:使用项目中的Deno后端
|
// 开发模式:使用项目中的Deno后端
|
||||||
scriptPath = path.join(__dirname, "..", "..", "backend-deno", "main.ts");
|
scriptPath = path.join(__dirname, "..", "..", "backend-deno", "dist", "backend-deno");
|
||||||
} else {
|
} else {
|
||||||
// 生产模式:使用打包的Deno后端
|
// 生产模式:使用打包的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(`启动Deno后端: ${scriptPath} 在端口 ${backendPort}`);
|
||||||
console.log(`后端脚本路径存在: ${fs.existsSync(scriptPath)}`);
|
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脚本目录内容
|
// 打印Deno脚本目录内容
|
||||||
try {
|
try {
|
||||||
const scriptDir = path.dirname(scriptPath);
|
const scriptDir = path.dirname(scriptPath);
|
||||||
@@ -104,29 +94,14 @@ async function startDenoBackend(isDev) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 启动子进程
|
// 启动子进程
|
||||||
denoProcess = spawn(
|
denoProcess = spawn(scriptPath,
|
||||||
"deno",
|
[],
|
||||||
[
|
|
||||||
"run",
|
|
||||||
"--allow-net",
|
|
||||||
"--allow-run",
|
|
||||||
"--allow-read",
|
|
||||||
"--allow-write",
|
|
||||||
"--allow-env",
|
|
||||||
scriptPath,
|
|
||||||
],
|
|
||||||
{
|
{
|
||||||
env: { ...process.env, PORT: backendPort.toString() },
|
env: { ...process.env, PORT: backendPort.toString(), USER_DATA_DIR: require("electron").app.getPath("userData"), },
|
||||||
stdio: "pipe", // 确保可以读取标准输出和错误
|
stdio: "pipe", // 确保可以读取标准输出和错误
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// 输出Deno进程的日志
|
|
||||||
denoProcess.stdout.on("data", (data) => {
|
|
||||||
const output = data.toString().trim();
|
|
||||||
console.log(`Deno后端输出: ${output}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
denoProcess.stderr.on("data", (data) => {
|
denoProcess.stderr.on("data", (data) => {
|
||||||
const message = data.toString().trim();
|
const message = data.toString().trim();
|
||||||
// 判断是否是错误日志还是普通日志
|
// 判断是否是错误日志还是普通日志
|
||||||
|
|||||||
Reference in New Issue
Block a user