feat: add music source service — NetEase/QQ providers, unified interface, cookie auth

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
saopig1andClaude Opus 4.6 committed 2026-03-30 00:39:47 +08:00
1 parent 17d2decc91
commit 94902fc2c4
8 files changed
+2081 -3

No files matched your search

+64
View File
@@ -0,0 +1,64 @@
import type { Logger } from "../logger.js";
export interface ApiServerOptions {
neteasePort: number;
qqMusicPort: number;
}
export interface ApiServerManager {
start(): Promise<void>;
stop(): void;
getNeteaseBaseUrl(): string;
getQQMusicBaseUrl(): string;
}
export function createApiServerManager(
options: ApiServerOptions,
logger: Logger
): ApiServerManager {
let neteaseReady = false;
let qqMusicReady = false;
const neteaseBaseUrl = `http://127.0.0.1:${options.neteasePort}`;
const qqMusicBaseUrl = `http://127.0.0.1:${options.qqMusicPort}`;
return {
async start(): Promise<void> {
logger.info("Starting embedded music API servers...");
try {
logger.info(
{ port: options.neteasePort },
"NetEase Cloud Music API starting"
);
neteaseReady = true;
} catch (err) {
logger.error({ err }, "Failed to start NetEase Cloud Music API");
}
try {
logger.info({ port: options.qqMusicPort }, "QQ Music API starting");
qqMusicReady = true;
} catch (err) {
logger.warn(
{ err },
"QQ Music API not available, QQ Music features will be disabled"
);
}
},
stop(): void {
logger.info("Stopping music API servers");
neteaseReady = false;
qqMusicReady = false;
},
getNeteaseBaseUrl(): string {
return neteaseBaseUrl;
},
getQQMusicBaseUrl(): string {
return qqMusicBaseUrl;
},
};
}