feat: 完善剩余功能

This commit is contained in:
ethan.chen
2025-11-05 14:24:15 +08:00
parent f67a3835fa
commit 73945c40e5
8 changed files with 105 additions and 59 deletions

View File

@@ -4,6 +4,7 @@
*/
import { MusicStatus } from "./apple_music.ts";
import { DatabaseSync } from 'node:sqlite'
export interface LyricsData {
current_lyric_time: number | null;
@@ -37,14 +38,23 @@ let lyricsCache: LyricsCache = {
};
const DB_PATH = "./lyrics.db";
const db = new DatabaseSync(DB_PATH);
/**
* 初始化数据库
*/
export async function initDB(): Promise<void> {
try {
// 确保歌词目录存在
await Deno.mkdir("./lyrics", { recursive: true });
db.exec(`
CREATE TABLE IF NOT EXISTS lyrics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
track_name TEXT NOT NULL,
artist TEXT NOT NULL,
lyrics_text TEXT NOT NULL,
source TEXT NOT NULL,
deleted BOOLEAN NOT NULL DEFAULT 0
)
`);
console.log(`数据库初始化完成: ${DB_PATH}`);
} catch (error) {
console.error(`数据库初始化失败: ${error}`);
@@ -72,11 +82,8 @@ async function loadLyricsFromDB(
artist: string
): Promise<string | null> {
try {
const filePath = `./lyrics/${encodeURIComponent(
trackName
)}_${encodeURIComponent(artist)}.lrc`;
const content = await Deno.readTextFile(filePath);
return content;
const content = db.prepare(`SELECT lyrics_text FROM lyrics WHERE track_name = ? AND artist = ?`).get(trackName, artist);
return content.lyrics_text;
} catch (error) {
return null;
}
@@ -85,25 +92,29 @@ async function loadLyricsFromDB(
/**
* 保存歌词到数据库
*/
async function saveLyrics(
export async function saveLyrics(
trackName: string,
artist: string,
lyricsText: string
lyricsText: string,
source: string
): Promise<void> {
try {
const filePath = `./lyrics/${encodeURIComponent(
trackName
)}_${encodeURIComponent(artist)}.lrc`;
await Deno.writeTextFile(filePath, lyricsText);
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.lyrics_text = lyricsText;
lyricsCache.source = source;
console.log(`保存歌词成功: ${trackName} - ${artist}`);
} catch (error) {
console.error(`保存歌词失败: ${error}`);
}
}
/**
* 从网易云音乐 API 搜索歌词
* 从服务器 API 搜索歌词
*/
async function searchLyrics(
export async function searchLyrics(
trackName: string,
artistName: string
): Promise<string | null> {
@@ -234,6 +245,18 @@ function formatLrcLyrics(
};
}
/**
* 删除歌词
*/
export async function deleteLyrics(trackName: string, artist: string): Promise<void> {
try {
db.prepare(`DELETE FROM lyrics WHERE track_name = ? AND artist = ?`).run(trackName, artist);
console.log(`删除歌词成功: ${trackName} - ${artist}`);
} catch (error) {
console.error(`删除歌词失败: ${error}`);
}
}
/**
* 获取当前歌词数据
*/
@@ -276,9 +299,9 @@ export async function getLyricsData(status: MusicStatus): Promise<LyricsData> {
const lyricsText = await searchLyrics(trackName || "", artist || "");
if (lyricsText) {
// 保存到数据库
await saveLyrics(trackName || "", artist || "", lyricsText);
await saveLyrics(trackName || "", artist || "", lyricsText, "server");
lyricsCache.lyrics_text = lyricsText;
lyricsCache.source = "netease";
lyricsCache.source = "server";
}
}
}