snowy-yang
|
33b96f92c4
|
feat(sdk): 新增咪咕/千千/JOOX/哔哩哔哩/5sing/Apple Music 六平台
平台注册表由 9 个扩到 15 个,同时补齐 sdk/types.ts 的类型与
OpenAPI 文档里的能力位声明。
- migu:命中 Z3D/I3D 加密候选时不返回直链,改由服务端解密代理出流,
SDK 侧只负责登记票据,避免客户端拿到无法播放的密文
- apple:只提供 preview 试听片段(完整曲为 DRM),标 noAggregate
排除在跨平台精确匹配之外,防止用它顶掉其它平台的可播结果
- 其余平台按既有 PlatformModule 约定实现搜索/专辑/歌单/歌词
为什么合并成一次提交:六平台共用同一份注册表与能力位声明,
拆开会产生互相引用、单独无法通过类型检查的中间态。
|
2026-10-03 00:26:32 +08:00 |
|
snowy-yang
|
47ce651f46
|
fix: 修复代码审查发现的 P0/P1 缺陷(含测试加固)
审查明细见 CODE-AUDIT.md。本提交覆盖其中的代码级修复:
P0-2 migu 解密流异常逃逸 → 进程崩溃
src/http/migu-stream.ts 把 transform/onChunk 就地 try/catch,转 reject 并 res.destroy()。
为什么:二者在 res 的 data 事件回调里同步执行,抛出的异常既不在 Promise 链上、
也不在路由层 try/catch 内,会逃逸成 uncaughtException(全项目无全局处理器)直接杀进程。
已用最小复现验证:修复前 exit 9,修复后正常 reject。
P0-1 /login/lr 缺失 → lr 取流 100% 不可用
src/routes-login.ts 补 POST/DELETE /login/lr。
为什么:sdk/lr/auth.ts 早已实现 login、该文件也已 import lrAuth,只差路由注册;
lr 取流强制要求登录态,缺此入口等于整个平台不可用,而 README 已将其文档化。
P0-3 + P1-7 凭据存储
sdk/auth/store.ts 写入改 0600 + 「临时文件 + rename」原子替换;解析失败改为改名备份而非静默清空;
新增 DATA_DIR 环境变量(测试隔离用)。
为什么:原先直接覆写明文 JSON(0644)且解析失败静默置空,写入中途被杀会留下截断 JSON,
下次启动解析失败后,任意一次 setCredentials 都会以空表覆盖,导致全部平台凭据丢失。
P1-9 / P1-10 / P1-11 / P1-12 平台模块缺陷
sdk/kg/krcDecode.ts:空歌词显式 resolve('')(原先裸 return 让 Promise 永久 pending,请求挂死)
sdk/kg/lyric.ts:重试改调 getLyricDownload(原先误调 getLyric,参数语义不同导致重试恒失败)
sdk/kw/songList.ts:重试改自递归(原先误调 getListDetail,返回类型错位且把 tryNum 当 page)
sdk/kw/songList.ts:删除 URL 模板中多余的右花括号
P1-6 /song-list 参数契约
src/routes.ts 移除不生效的 limit 声明。
为什么:各平台 getList 签名不一致(如 kw 为 (sortId, tagId, page, tryNum)),无法统一透传,
保留声明只会让文档与实现不符。
P1-4/5/13/15 冒烟测试加固
test/smoke-test.ts:子实例统一登记 + 进程退出回收(原先异常路径留下孤儿实例,曾累积 5 个);
启动超时 10s→30s 且失败时附子进程输出、提前退出立即报错;显式 SOURCE_ENABLED='' 与 DATA_DIR
隔离(原先继承 .env,取流用例走外部音源掩盖 SDK 回归,且 /login/refresh 会改写真实 data/auth.json);
AUTH 断言移入 test()(原先裸抛错会跳过实例回收);修正 642 行过期断言并补 kw parse 正向用例。
P1-8 src/auth/store.ts 删除引用已不存在命令 `pnpm build` 的过期注释。
src/server.ts 头注释的接口清单改为 path 风格,与实际路由一致。
注:src/routes.ts、src/routes-login.ts、src/server.ts、test/smoke-test.ts 同时承载了工作区
既有的在途改动(parse/playlist/album 路由接入与相应用例),一并随本提交入库。
|
2026-10-03 00:23:25 +08:00 |
|
snowy-yang
|
ece9c5fc9a
|
chore(git): 忽略 agent 工作目录、取消跟踪本机配置
- .gitignore 增加 .workbuddy/ 与 .claude/:二者都是本机产物(记忆日志、工具权限配置),
其中 .claude/settings.local.json 内容含本机绝对路径,已 git rm --cached 停止跟踪
(为什么:避免把本机环境细节提交进公开仓库,也避免 git add . 误收)
- pnpm-workspace.yaml 补注释说明 allowBuilds 的用途
(为什么:isolated-vm 的原生构建脚本必须显式放行,否则 pnpm 静默跳过 postinstall,
node_modules/isolated-vm 无 build/Release/*.node,加载失败后 ivm 沙箱音源会静默降级)
|
2026-10-03 00:21:02 +08:00 |
|
snowy-yang
|
cca7e63ec3
|
fix(dev): pnpm dev 容忍 sources/ 缺失——scripts/dev.mjs 仅为存在的目录注册 --watch-path
|
2026-10-02 21:09:20 +08:00 |
|
snowy-yang
|
436b102ae2
|
feat(api): 列表接口分页统一 path 段——boards/song-list/singer songs与albums/album 支持可选 /:page,弃用 ?page=
|
2026-10-02 20:57:31 +08:00 |
|
snowy-yang
|
baa34a501c
|
feat(api): search/find 改 path 风格——/search/:source/:keyword[/:page] 与 /url 同构,find 支持单平台/all
|
2026-10-02 20:51:50 +08:00 |
|
snowy-yang
|
cf0874fc15
|
feat(auth): 流代理升级短时签名 URL——?exp=&sig=(HMAC 派生 10 分钟有效)替代裸 ?key=,秘钥不再落入 URL/日志
|
2026-10-02 20:39:25 +08:00 |
|
snowy-yang
|
415a04dea8
|
feat(auth): 统一 X-Server-Key 全路径鉴权(防扫描探测)+ per-IP 滑动窗口限流
|
2026-10-02 20:31:59 +08:00 |
|
snowy-yang
|
649ebbe12b
|
feat(auth): 调用秘钥鉴权——AUTH_KEY 环境变量启用,Bearer/X-Api-Key/?key= 三种携带方式,流地址自动附带 key
|
2026-10-02 20:15:36 +08:00 |
|
snowy-yang
|
bc1d23cbba
|
fix(test): smoke 默认随机端口自起实例——避免连到 16688 常驻旧实例导致新用例误报
|
2026-10-02 20:08:35 +08:00 |
|
snowy-yang
|
cd5d9b1c91
|
fix(me): 搜索对齐网页版——dramaapi/search 正剧置顶,d:<剧id> 条目自动取首个免费集
|
2026-10-02 20:08:35 +08:00 |
|
snowy-yang
|
1fec828547
|
feat: 平台注册与路由收尾——9 平台(含 xm/me/qt/lr 有声)、复合 id 约定、64k 档位、测试与文档
|
2026-10-02 19:43:21 +08:00 |
|
snowy-yang
|
6fb866e343
|
feat(lr): 懒人听书平台接入——App 通道搜索、web 章节列表、账密登录取流
|
2026-10-02 19:43:21 +08:00 |
|
snowy-yang
|
83d3eb3b49
|
feat(qt): 蜻蜓FM平台接入——audiostream HMAC-MD5 签名直链、SSR 搜索/频道节目列表
|
2026-10-02 19:43:20 +08:00 |
|
snowy-yang
|
020e9bbb2e
|
feat(me): 猫耳FM平台接入——App API HMAC 签名取明文直链、匿名搜索/剧集、token 绑定
|
2026-10-02 19:43:20 +08:00 |
|
snowy-yang
|
5a9915b74c
|
feat(xm): 喜马拉雅平台接入——匿名搜索/专辑/免费曲直链(hdaa xm-sign+AES-ECB 解密)、cookie 绑定解锁付费
|
2026-10-02 19:43:09 +08:00 |
|
snowy-yang
|
44852864e2
|
feat(tx): flac24bit 高阶音质候选链——RS01(Hi-Res)/Q000(大师)/AI00(臻品母带) 逐级回退
|
2026-10-02 19:43:08 +08:00 |
|
snowy-yang
|
3b40ba4c8f
|
feat(kg): 账密登录与 20028 验证码处理——/v9/login_by_pwd、ssa-code 挑战链、行为指纹模拟、dfid 正式注册
|
2026-10-02 19:43:08 +08:00 |
|
snowy-yang
|
e796e622f2
|
docs(readme): 补齐 qs 平台与双通道后的过期内容
- 平台列表/接口表补 qs(抖音扫码登录、/stream/qs 解密流代理)与取流链说明
- 歌曲 ID 约定补 qs,删掉已失效的 kg 风控告示(2026-10-01 /v5/url 已修复,
VIP 歌改为需登录的准确表述)
- 外部音源章节说明候选链只覆盖 kw/kg/tx/wy、失败回落 SDK 与酷我兜底
- 已知限制重写:kg 登录取流、kw 严格档位校验与降级链、qs 试听/解密代理
- 项目结构注释补 qs 目录与 auth 续期描述
|
2026-10-01 22:54:05 +08:00 |
|
snowy-yang
|
b3e1cc5f67
|
feat(url): 取流链兜底——外部音源→SDK 直连→酷我跨平台匹配
/url/:source/:id 顺序尝试:外部音源脚本(SOURCE_ENABLED 启用时)→
SDK 官方直连→都失败时用 findMusic 仅在 kw 内按歌名/歌手/时长匹配
同一首歌后走 kw 通道(匿名可拿无损)。kg 的 hash 自动反查歌曲信息,
其它平台可传 name/singer/interval 查询参数启用兜底;
kw 自身不再二次兜底。响应新增 via 字段标记实际命中通道
(script/平台 id/kw,直接命中不返回),type 改为实际音质(降级链生效);
全部失败返回聚合各阶段错误的 502。findMusic/searchMusic 增加 only 参数。
|
2026-10-01 22:54:00 +08:00 |
|
snowy-yang
|
0f9cff2a08
|
feat(qs): 汽水音乐平台接入——匿名搜索/试听、抖音扫码登录、解密流代理
- 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 直启
|
2026-10-01 22:43:49 +08:00 |
|
snowy-yang
|
aa4f2eec67
|
feat(kw): 取流双通道重构——mobi.s convert_url_with_sign 主通道
主通道 mobi.s(keluze 指纹,user=0 匿名):VIP/付费歌放行真音频,
晴天 320k mp3/2000k flac 与 N_MINFO 元数据逐字节吻合,hi-res 可用;
档位缺失会静默降级甚至吐 mgg/mflac 加密,必须严格校验
「返回 bitrate==请求档位 且格式为明文」否则沿降级链换档重试。
回退通道 web playUrl(Hm_Iuvt cookie 异或哈希 Secret 签名):匿名恒 128k,
VIP 歌明确拒绝,仅作 mobi 网络故障兜底。旧 antiserver 链移除。
|
2026-10-01 22:43:43 +08:00 |
|
snowy-yang
|
ddc44a276d
|
fix(kg): /v5/url 成功响应按顶层 url/backupUrl 数组解析
网关成功(status:1)时播放地址在顶层 url: string[] 与 backupUrl: string[],
并非旧 data:[{url}] 结构,导致 VIP 登录后所有取流仍报"获取失败";
旧结构保留为兜底。album_audio_id/album_id 加 Number.isFinite 守卫——
/url 路由把 hash 传给 songmid 时 Number(hash)=NaN 会被网关拒答。
实测珊瑚海四档(VIP)全通,320k/flac/hi-res 与曲库大小逐字节吻合。
|
2026-10-01 22:43:29 +08:00 |
|
snowy-yang
|
0f9989b26f
|
feat(login): kg 扫码/短信验证码登录、QQ 扫码登录
- kg:sdk/auth 新增 qrKey/qrCheck 扫码与 sendCaptcha/cellphoneLogin 短信登录,路由接线
- tx:新增 /login/tx/qr(/check)(移植 sansenjian/qq-music-api):ptlogin 扫码 →
check_sig 换 p_skey → OAuth authorize 换 code → QQConnectLogin 换凭据;
状态码对齐 wy(800 过期/801 等待/802 已扫/803 成功),qrsig 失效 403 映射 800;
成功凭据入库(通常含 openid/refresh_key,可走自动续期)
|
2026-10-01 16:35:08 +08:00 |
|
snowy-yang
|
96f6a7fe91
|
feat(source): 外部音源迁 src/ 并新增 source-simple 进程内直载
- apis/source(.ivm).ts → src/source(.ivm).ts(音源属服务端职责,不入 SDK)
- 新增 src/source-simple.ts:sources/*.mjs 进程内直载(getMusicUrl 极简契约),
与 *.js 的 IVM 沙箱(globalThis.lx 契约)按扩展名混排候选链,失败降权冷却
- server 挂载决策:SOURCE_ENABLED 非 0/false 启用,/url 取流分流到外部音源;
音源模式下登录态不参与取流,自动续期不启动(手动 /login/refresh 仍可用)
- 新增 src/env.ts(.env 最先加载)与 test/source-simple-test.ts(并入 pnpm test)
|
2026-10-01 16:35:08 +08:00 |
|
snowy-yang
|
66d06ef48a
|
refactor(sdk): tipSearch 全删、歌词解码器归位、IPC 桥移除、api-source 层拆除
- 四平台 tipSearch 全部删除(永不做搜索联想),types 同步去掉 tipSearch 字段
- 歌词解码器归位:kg/krcDecode、tx/qrcDecode、kw/lyricDecode(原 common/ 下三处)
- rendererIpc/ipcNames IPC 桥删除,SDK 纯服务端化
- supportQuality 由各平台 apis 内联导出(sdk/index 汇总),kg/kw/tx/wy 改直连 apis/*,api-source 旧层移除
|
2026-10-01 16:33:53 +08:00 |
|
snowy-yang
|
3c51e4d06a
|
feat(dev): 热重载开发模式(node --watch 限定 src/sdk/sources 目录)
- package.json 新增 dev 脚本;--watch-path 限定监视范围,
规避 @fastify/swagger-ui 启动时写 node_modules 触发的多余重启
- start.bat 支持 dev 参数(保留 SOURCE_ENABLED 外部音源开关)
- README 快速开始补充 pnpm dev
|
2026-09-29 20:24:40 +08:00 |
|
snowy-yang
|
aca7928019
|
feat(login): kg/tx 登录态自动续期(移植 lx-music-api-server 方案)
- kg: login_by_token 续期(AES-256-CBC + RSA 裸加密,参考其 refresh/kg.py),新 token 回写 data/auth.json
- tx: 新增 sdk/auth/tx.ts —— cookie 解析、VIP 检测(vip_login_base)、
music.login.LoginServer 续期(走既有 musicu.fcg 未签名通道,最佳努力)
- 调度:启动 10s 后首刷 + 每 24h 一次(对齐参考项目 86400s + next_run_time=now)
- /login/tx 支持可选 App 抓包凭据(openId/accessToken/refreshToken/refreshKey)
- 新增 POST /login/refresh 手动续期;/login/status 增补 tx 字段与更新时间
- 补充 /login/tx 文档行与 smoke 测试
|
2026-09-29 20:16:33 +08:00 |
|
snowy-yang
|
9d7cb6f39a
|
fix: /search 的 name 参数示例与描述改为纯歌名(拼入歌手会被翻唱版顶掉原曲)
|
2026-09-29 20:09:21 +08:00 |
|
snowy-yang
|
354df2e739
|
refactor: 架构整固——分层单向化、全量 TypeScript、直接运行
- 移除 bd/mg 两平台及磁盘残留产物;清理 api-test 死脚本、musicSdk/message+options 死模块、infSign vendor
- musicSdk/ 改名 sdk/;src/common、src/auth、src/apis 整体移入 sdk/,依赖方向定为 src → sdk 严格单向
- src/ 手写 JS 全量转 .ts,删除 JS 类型垫片 modules.d.ts;源码 import 统一 .ts 后缀
- Node 原生类型剥离直接运行 .ts(engines >=22.18),取消 tsc 发射产物,tsc 仅类型检查(pnpm typecheck)
- 删除 kwdes 备用实现与 src/index.ts 转发垫片;测试移至 test/smoke-test.ts
- common/request.ts 补显式导出类型;修复 set-cookie 单值形态、ApiError 类字段等隐患
验证:tsc 零错误,smoke-test 41/41
|
2026-09-25 23:06:23 +08:00 |
|
snowy-yang
|
c8c939aa32
|
feat(kg): 取流切换到手机客户端通道(gateway /v5/url,android 签名)
|
2026-09-18 21:28:43 +08:00 |
|
snowy-yang
|
45f3a4b989
|
feat(login): 新增网易云扫码/手机号登录与酷狗 token 绑定
|
2026-09-18 19:15:11 +08:00 |
|
snowy-yang
|
fd5e2122d3
|
chore: 还原被 tmp 下临时依赖安装波及的 pnpm-lock.yaml
|
2026-09-18 18:45:57 +08:00 |
|
snowy-yang
|
41b5d20b1e
|
feat(wy): 歌手歌曲列表填充专辑封面
|
2026-09-18 18:45:06 +08:00 |
|
snowy-yang
|
0f2585e5bd
|
feat(album): 新增 QQ 音乐(tx)专辑支持
|
2026-09-17 06:20:37 +08:00 |
|
snowy-yang
|
b06769dbbd
|
fix(album): 修复 kw 专辑接口——上游通道可用,故障为路由误传参数
|
2026-09-16 22:34:41 +08:00 |
|
snowy-yang
|
23c7ad91e4
|
feat(api): 新增歌手与专辑接口,修复各平台死代码中的多处隐藏 bug
|
2026-09-16 22:23:22 +08:00 |
|
snowy-yang
|
d142dd6096
|
refactor: 清理死代码与构建加固
|
2026-09-16 21:40:28 +08:00 |
|
snowy-yang
|
5dd0468860
|
refactor!: 移除品牌字样,音源改为 sources/ 目录自动加载,脚本不入库
|
2026-09-16 21:28:50 +08:00 |
|
snowy-yang
|
f548e5990b
|
chore: 切换包管理器为 pnpm
|
2026-09-16 21:14:33 +08:00 |
|
snowy-yang
|
c1c8aa4b94
|
refactor(routes)!: 移除旧版 query 风格路由
|
2026-09-16 21:07:01 +08:00 |
|
snowy-yang
|
10de5582c7
|
fix(docs): 豁免 /docs/json 信封包裹,修复 Swagger UI 无法加载规范
|
2026-09-16 20:52:38 +08:00 |
|
snowy-yang
|
ab90c5b4c4
|
docs: 移除 lx 音源签名分析与逆向相关表述
|
2026-09-16 20:29:18 +08:00 |
|
snowy-yang
|
2b4bb16e02
|
refactor(server): 迁移到 Fastify 5 + 完善文档与路由参数适配
|
2026-09-09 21:56:06 +08:00 |
|
snowy-yang
|
59b2aae584
|
feat(server): 标准 HTTP 服务器重构 + FastAPI 风格自动文档
|
2026-08-29 11:51:07 +08:00 |
|
snowy-yang
|
1dfb7a59ca
|
refactor(sdk): musicSdk 全量迁移至 TypeScript
|
2026-08-29 00:23:50 +08:00 |
|
archive
|
f289df4cd7
|
存档:TS 重构前基线(lx 聚合源 = isolated-vm 加载器,签名方案已移除)
|
2026-08-28 23:24:49 +08:00 |
|