fix(qq): bypass broken c.y.qq.com search API, use u.y.qq.com directly

This commit is contained in:
fattiger committed 2026-04-27 19:04:31 +08:00
1 parent f9e2a210b7
commit 4de8ac1810
1 file changed
+34 -15
+34 -15
View File
@@ -10,6 +10,14 @@ import type {
} from "./provider.js"; } from "./provider.js";
import { parseLyrics } from "./netease.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 { export class QQMusicProvider implements MusicProvider {
readonly platform = "qq" as const; readonly platform = "qq" as const;
private api: AxiosInstance; private api: AxiosInstance;
@@ -36,23 +44,34 @@ export class QQMusicProvider implements MusicProvider {
} }
async search(query: string, limit = 20): Promise<SearchResult> { async search(query: string, limit = 20): Promise<SearchResult> {
const res = await this.api.get("/getSearchByKey", { const reqData = JSON.stringify({
params: { key: query, pageSize: limit, ...this.cookieParams }, 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( const songs: Song[] = list.map((s: any) => ({
(s: any) => ({ id: String(s.mid ?? s.id),
id: String(s.mid ?? s.songmid ?? s.songid), name: s.title ?? s.name ?? "",
name: s.songname ?? "", artist: (s.singer ?? []).map((a: any) => a.name).join(" / "),
artist: (s.singer ?? []).map((a: any) => a.name).join(" / "), album: s.album?.name ?? s.album?.title ?? "",
album: s.albumname ?? "", duration: s.interval ?? 0,
duration: s.interval ?? 0, coverUrl: s.album?.mid
coverUrl: s.albummid ? `https://y.gtimg.cn/music/photo_new/T002R300x300M000${s.album.mid}.jpg`
? `https://y.gtimg.cn/music/photo_new/T002R300x300M000${s.albummid}.jpg` : "",
: "", platform: "qq",
platform: "qq", }));
})
);
return { songs, playlists: [], albums: [] }; return { songs, playlists: [], albums: [] };
} }