- sdk/qs 平台模块(安卓参数指纹匿名搜索)+ sdk/apis/qs 取流: 匿名 30s 试听,登录态走签名 track_v2 + spade key AES-CTR 解密 - /login/qs/qr 抖音扫码登录(授权后 sessionid 解锁完整曲目) - /stream/qs/:id 解密流代理,/url 返回的相对地址按请求 host 补全 - 回归测试覆盖 kw 双通道(VIP 真音频/降级链)与 qs 试听;start.bat 去掉 SOURCE_ENABLED 直启
146 lines
3.9 KiB
TypeScript
146 lines
3.9 KiB
TypeScript
// SDK 共享类型定义
|
||
// 所有平台模块与根模块的类型锚点。类型只描述实际返回的数据形状,不改变运行时行为。
|
||
|
||
/** 音乐平台标识 */
|
||
export type Source = 'kw' | 'kg' | 'tx' | 'wy' | 'qs'
|
||
|
||
/** 音质标识(wav 仅部分接口声明使用) */
|
||
export type Quality = '128k' | '320k' | 'flac' | 'flac24bit' | 'wav'
|
||
|
||
/** 单音质资源描述(搜索结果 types 数组项) */
|
||
export interface SongType {
|
||
type: Quality
|
||
size: string
|
||
}
|
||
|
||
/** 单音质详情(搜索结果 _types 映射项) */
|
||
export interface QualityInfo {
|
||
size: string
|
||
}
|
||
|
||
/** 歌曲信息(搜索结果项 / 取流入参) */
|
||
export interface SongInfo {
|
||
songmid?: string
|
||
hash?: string
|
||
copyrightId?: string
|
||
songStringId?: string
|
||
albumId?: string
|
||
name?: string | null
|
||
singer?: string
|
||
source?: Source
|
||
interval?: string | number
|
||
albumName?: string
|
||
img?: string | null
|
||
lrc?: string | null
|
||
otherSource?: string | null
|
||
types?: SongType[]
|
||
_types?: Partial<Record<Quality, QualityInfo>>
|
||
typeUrl?: Partial<Record<Quality, string>>
|
||
[key: string]: unknown
|
||
}
|
||
|
||
/** httpFetch 响应(与 common/request.ts 契约一致) */
|
||
export interface HttpResponse {
|
||
statusCode: number
|
||
statusMessage?: string
|
||
headers: Record<string, string | string[]>
|
||
body: any
|
||
raw?: Buffer
|
||
}
|
||
|
||
/** httpFetch 返回的可取消请求对象 */
|
||
export interface HttpRequestObject {
|
||
promise: Promise<HttpResponse>
|
||
cancelHttp(): void
|
||
}
|
||
|
||
/** httpFetch 选项(common/request.ts 子集) */
|
||
export interface HttpOptions {
|
||
method?: string
|
||
headers?: Record<string, string>
|
||
body?: string | object
|
||
form?: Record<string, unknown>
|
||
timeout?: number
|
||
lookup?: unknown
|
||
family?: number
|
||
}
|
||
|
||
/** 带取消句柄的异步结果(getMusicUrl/getLyric 等的统一返回形态) */
|
||
export interface RequestObj<T> {
|
||
promise: Promise<T>
|
||
cancelHttp(): void
|
||
}
|
||
|
||
/** 取流结果 */
|
||
export interface MusicUrlResult {
|
||
type: string
|
||
url: string
|
||
}
|
||
|
||
/** 歌词结果 */
|
||
export interface LyricInfo {
|
||
lyric: string
|
||
tlyric: string
|
||
rlyric?: string
|
||
yrc?: string
|
||
}
|
||
|
||
/** 搜索结果 */
|
||
export interface SearchResult {
|
||
list: SongInfo[]
|
||
allPage: number
|
||
total: number
|
||
limit: number
|
||
source: Source
|
||
}
|
||
|
||
/** 搜索模块(平台 musicSearch 子模块) */
|
||
export interface MusicSearchModule {
|
||
search(str: string, page?: number, limit?: number, retryNum?: number): Promise<SearchResult>
|
||
[key: string]: unknown
|
||
}
|
||
|
||
/** 歌词模块 */
|
||
export interface LyricModule {
|
||
getLyric(songInfo: SongInfo, ...rest: unknown[]): Promise<LyricInfo> | RequestObj<LyricInfo>
|
||
[key: string]: unknown
|
||
}
|
||
|
||
/** 封面模块 */
|
||
export interface PicModule {
|
||
getPic(songInfo: SongInfo, ...rest: unknown[]): Promise<string> | RequestObj<string>
|
||
[key: string]: unknown
|
||
}
|
||
|
||
/** 热搜模块 */
|
||
export interface HotSearchModule {
|
||
getList(): Promise<any>
|
||
[key: string]: unknown
|
||
}
|
||
|
||
/** 评论模块 */
|
||
export interface CommentModule {
|
||
getComment(songInfo: any, page?: number, limit?: number): Promise<any>
|
||
getHotComment(songInfo: any, page?: number, limit?: number): Promise<any>
|
||
[key: string]: unknown
|
||
}
|
||
|
||
/** 平台模块(各平台默认导出需满足的最小形状)
|
||
* 注:SDK 内部实现大量返回 httpFetch 原生的 HttpRequestObject,
|
||
* 实际 promise 会在 .then() 中被改写为对应结果类型;此处只约束调用侧可见形态。
|
||
*/
|
||
export interface PlatformModule {
|
||
init?(): Promise<unknown> | void
|
||
musicSearch?: MusicSearchModule
|
||
leaderboard?: any
|
||
songList?: any
|
||
hotSearch?: HotSearchModule
|
||
comment?: CommentModule
|
||
getMusicUrl?(songInfo: SongInfo, type: Quality): HttpRequestObject
|
||
getLyric?(songInfo: SongInfo, ...rest: unknown[]): HttpRequestObject
|
||
getPic?(songInfo: SongInfo, ...rest: unknown[]): HttpRequestObject | Promise<any>
|
||
getMusicInfo?(songInfo: SongInfo): HttpRequestObject | Promise<any>
|
||
getMusicDetailPageUrl?(songInfo: SongInfo): string
|
||
[key: string]: any
|
||
}
|