diff --git a/src/music/api-server.ts b/src/music/api-server.ts index d0b6316..0b3e8c9 100644 --- a/src/music/api-server.ts +++ b/src/music/api-server.ts @@ -1,4 +1,5 @@ import type { Logger } from "../logger.js"; +import type { Server } from "node:http"; export interface ApiServerOptions { neteasePort: number; @@ -16,8 +17,7 @@ export function createApiServerManager( options: ApiServerOptions, logger: Logger ): ApiServerManager { - let neteaseReady = false; - let qqMusicReady = false; + let neteaseServer: Server | null = null; const neteaseBaseUrl = `http://127.0.0.1:${options.neteasePort}`; const qqMusicBaseUrl = `http://127.0.0.1:${options.qqMusicPort}`; @@ -26,31 +26,42 @@ export function createApiServerManager( async start(): Promise { logger.info("Starting embedded music API servers..."); + // Start NetEase Cloud Music API try { + // NeteaseCloudMusicApi exports differ between CJS/ESM — use dynamic require + const ncmModule = await import("NeteaseCloudMusicApi") as any; + const serverObj = ncmModule.server ?? ncmModule.default?.server; + const app = await serverObj.serveNcmApi({ port: options.neteasePort }); + // serveNcmApi returns the express app; the server is already listening + neteaseServer = app; logger.info( { port: options.neteasePort }, - "NetEase Cloud Music API starting" + "NetEase Cloud Music API started" ); - neteaseReady = true; } catch (err) { logger.error({ err }, "Failed to start NetEase Cloud Music API"); } + // QQ Music API — placeholder (requires separate setup) try { - logger.info({ port: options.qqMusicPort }, "QQ Music API starting"); - qqMusicReady = true; + logger.info( + { port: options.qqMusicPort }, + "QQ Music API: not bundled, skipping" + ); } catch (err) { logger.warn( { err }, - "QQ Music API not available, QQ Music features will be disabled" + "QQ Music API not available" ); } }, stop(): void { logger.info("Stopping music API servers"); - neteaseReady = false; - qqMusicReady = false; + if (neteaseServer && typeof (neteaseServer as any).close === "function") { + (neteaseServer as any).close(); + } + neteaseServer = null; }, getNeteaseBaseUrl(): string {