补上最后两个多字母 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 零残留。
45 lines
1.6 KiB
TypeScript
45 lines
1.6 KiB
TypeScript
// 咪咕音乐搜索 —— 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 }
|