feat: 完善剩余功能
This commit is contained in:
@@ -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";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user