diff --git a/src/music/qq.ts b/src/music/qq.ts index 0851a28..191dc8a 100644 --- a/src/music/qq.ts +++ b/src/music/qq.ts @@ -10,6 +10,14 @@ import type { } from "./provider.js"; import { parseLyrics } from "./netease.js"; +// Direct QQ Music API client — bypasses the local API server for search +// because @sansenjian/qq-music-api still uses the broken c.y.qq.com endpoint. +const qqDirectApi = axios.create({ + baseURL: "https://u.y.qq.com", + timeout: 10000, + headers: { referer: "https://y.qq.com" }, +}); + export class QQMusicProvider implements MusicProvider { readonly platform = "qq" as const; private api: AxiosInstance; @@ -36,23 +44,34 @@ export class QQMusicProvider implements MusicProvider { } async search(query: string, limit = 20): Promise { - const res = await this.api.get("/getSearchByKey", { - params: { key: query, pageSize: limit, ...this.cookieParams }, + const reqData = JSON.stringify({ + req_0: { + module: "music.search.SearchCgiService", + method: "DoSearchForQQMusicDesktop", + param: { + searchid: "1", + query, + num_per_page: Math.min(limit, 50), + }, + }, }); + const res = await qqDirectApi.get("/cgi-bin/musicu.fcg", { + params: { format: "json", data: reqData }, + }); + const list: any[] = + res.data?.req_0?.data?.body?.song?.list ?? []; - const songs: Song[] = (res.data?.response?.data?.song?.list ?? []).map( - (s: any) => ({ - id: String(s.mid ?? s.songmid ?? s.songid), - name: s.songname ?? "", - artist: (s.singer ?? []).map((a: any) => a.name).join(" / "), - album: s.albumname ?? "", - duration: s.interval ?? 0, - coverUrl: s.albummid - ? `https://y.gtimg.cn/music/photo_new/T002R300x300M000${s.albummid}.jpg` - : "", - platform: "qq", - }) - ); + const songs: Song[] = list.map((s: any) => ({ + id: String(s.mid ?? s.id), + name: s.title ?? s.name ?? "", + artist: (s.singer ?? []).map((a: any) => a.name).join(" / "), + album: s.album?.name ?? s.album?.title ?? "", + duration: s.interval ?? 0, + coverUrl: s.album?.mid + ? `https://y.gtimg.cn/music/photo_new/T002R300x300M000${s.album.mid}.jpg` + : "", + platform: "qq", + })); return { songs, playlists: [], albums: [] }; }