Files
MusicServer/sdk/migu/musicSearch.ts
T
snowy-yang 1b972ec4dd refactor(api)!: 平台 id 收尾统一——migu→mg、apple→ap
补上最后两个多字母 id,至此 15 个平台对外 id 全部为两字母:
kw kg tx wy qs xm me qt lr mg bd jx bl 5s ap

**破坏性变更**:id 出现在所有 URL、/sources 返回以及 data/auth.json 的
凭据键里,咪咕与 Apple Music 已存的登录态会失效,需重新登录。

- sdk/index.ts:id 与 supportQuality 映射键(展示名 `咪咕音乐` /
  `Apple Music` 保持不动)
- sdk/types.ts:Source 联合类型
- src/routes.ts:/stream 的 enum ['qs','migu'] → ['qs','mg'],以及
  /url/mg、/stream/mg 等路径与 schema 描述
- src/http/migu-stream.ts、src/routes-login.ts、src/server.ts
- test/smoke-test.ts、README.md、docs/API.md 同步

有意未改:域名与 API 路径(music.migu.cn、music.apple.com、
amp-api.music.apple.com、/v1/catalog/cn/apple-curators/…)、
标识符(registerMiguStream、appleAmpGet、APPLE_AMP_API_URL 等)、
sdk/migu 与 sdk/apple 的目录与文件名、错误文案里的平台名。

验证:typecheck ✓、pnpm test 112/112 ✓;另起临时实例实证 /sources
(15/15 平台 id 与展示名全对)与 /login/status,旧 id 零残留。
2026-10-03 11:07:21 +08:00

45 lines
1.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 咪咕音乐搜索 —— search_all.do(Android_migu 参数),searchSwitch 控制返回类别
// 上游对应:music-lib/migu/migu.go 的 (*Migu).Search
import { buildUrl, convertItemToSong, miguGet, type MiguSongItem } from './util.ts'
export const SEARCH_ALL_URL = 'http://pd.musicapp.migu.cn/MIGUM2.0/v1.0/content/search_all.do'
/** 搜索开关:只开某一类(song/album/songlist),bestShow 保留最优推荐 */
export const searchSwitch = (kind: 'song' | 'album' | 'songlist'): string => JSON.stringify({
song: kind === 'song' ? 1 : 0,
album: kind === 'album' ? 1 : 0,
singer: 0,
tagSong: 0,
mvSong: 0,
songlist: kind === 'songlist' ? 1 : 0,
bestShow: 1,
})
export const searchAll = async(text: string, kind: 'song' | 'album' | 'songlist', page = 1, limit = 20): Promise<any> => {
const url = buildUrl(SEARCH_ALL_URL, {
ua: 'Android_migu',
version: '5.0.1',
text,
pageNo: page,
pageSize: limit,
searchSwitch: searchSwitch(kind),
})
return miguGet(url)
}
export const search = async(keyword: string, page = 1, limit = 20) => {
const body = await searchAll(keyword, 'song', page, limit)
const result: MiguSongItem[] = body?.songResultData?.result ?? []
const list = result.map(item => convertItemToSong(item, true)).filter((s): s is NonNullable<typeof s> => s != null)
const total = parseInt(String(body?.songResultData?.totalCount ?? list.length), 10) || list.length
return {
list,
allPage: Math.max(1, Math.ceil(total / limit)),
total,
limit,
source: 'mg' as const,
}
}
export default { search }