From f77a6f0fd7ab43cb91ee68315e9064d4216a9ef3 Mon Sep 17 00:00:00 2001 From: saopig1 Date: Mon, 30 Mar 2026 01:37:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20start=20NeteaseCloudMusicApi=20server=20?= =?UTF-8?q?for=20real=20=E2=80=94=20enables=20QR=20code=20login?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) --- src/music/api-server.ts | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) 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 {