- 删除旧 sdk/request.ts,全部 import 收敛到 sdk/common/request.ts(85 文件) - 注释死代码 630+ 行、裸 console.log 吞错 6 处、未使用符号 26 处清零 - bili 状态校验去重;utils DNS 预解析失败日志改 warn 带上下文 - CODE-AUDIT.md:第四节 P2 清理记录 + 第八节线索逐条复核结论(kw/kg/tx/wy parse 骨架相似实质各异,不抽公共层)
29 lines
1.2 KiB
TypeScript
29 lines
1.2 KiB
TypeScript
// JOOX 链接解析(上游 joox/song.go Parse + album.go ParseAlbum + playlist.go ParsePlaylist)
|
||
// 歌曲:joox.com/<region>/single/<id> 或裸 ID(>10 字符且不含 '/')→ openjoox2 详情 → Song(含直链)
|
||
// 专辑:joox.com/.../album/<id>、h_activity_id=、albumid= → album.getAlbumDetail
|
||
// 歌单:joox.com/.../playlist/<id>、playlistid|playlist_id|id= → playlist.getPlaylistDetail
|
||
|
||
import { normalizeJooxID } from './util.ts'
|
||
import { getTrackDetail, pickTrackUrl } from './musicInfo.ts'
|
||
import { jooxSongFromDetail } from './song.ts'
|
||
import { parseAlbum } from './album.ts'
|
||
import { parsePlaylist } from './playlist.ts'
|
||
|
||
/** 歌曲链接 → Song(上游 Parse 的正则与裸 ID 规则) */
|
||
export const parseSong = async(link: string) => {
|
||
const raw = String(link ?? '').trim()
|
||
const m = /joox\.com\/.*\/single\/([^/?#]+)/.exec(raw)
|
||
let songId = ''
|
||
if (m) {
|
||
songId = normalizeJooxID(m[1])
|
||
} else if (raw.length > 10 && !raw.includes('/')) {
|
||
songId = normalizeJooxID(raw)
|
||
} else {
|
||
throw new Error('invalid joox link')
|
||
}
|
||
const detail = await getTrackDetail(songId)
|
||
return jooxSongFromDetail(detail, pickTrackUrl(detail))
|
||
}
|
||
|
||
export default { parseSong, parseAlbum, parsePlaylist }
|