版本号:
- 1.5.11 越界(规则 3 规定 patch ≤ 10)→ 修正为 1.6.0(进位到 minor、patch 归 0)
- versionCode 43 不变:43 从未对外发布,本次修正只是把命名拉回约定
合并支线(原在工作区根目录、App 仓库之外,DESIGN.md 自称"支线"):
- selfhost-source/server/ 自建歌曲源服务器(纯 Python 标准库、零 pip 依赖)
- selfhost-source/deploy/、DESIGN.md、LIBRARY.md、build_inventory.py
- selfhost-source/inventory/ 小清单(playlists.csv、song-stats.md 等)
- ⚠️ inventory 生成物(songs-*.csv / singers-top.csv,共 84MB)不入库,
已写入 .gitignore;需要时用 build_inventory.py 依据 muse.db 重新生成
同时入库的 App 侧支线改动(此前为工作树未提交状态):
- Whoami.kt(whoami 设备心跳)、DeviceIdentity.kt(设备身份伪装)
- PushDownload.kt / PushDownloadClient.kt(点歌推送)
- AdVideoFilter 带 query/fragment 的地址闸门;KTV_BRIDGE_API 11 → 13
- 修 ktv_api.js 的 global.KtvBridgeApiVersion(12 → 13,与注释及 Kotlin 两处校验一致)
- 对应单测:WhoamiTest / DeviceIdentityTest / PushDownloadTest / AdVideoFilterTest(共 39 例)
文档:
- DESIGN.md 的"在 App 仓库之外"约定改为"已并入仓库统一版本化"
- AGENTS.md 版本号行更新为 1.6.0/43,并新增支线并入说明
验证:assembleRelease + testReleaseUnitTest 全过(39 例)
4.4 KiB
本地曲库(muse.db)— 更新方法与版本记录
支线文档(自建歌曲源),不涉及本体 App 代码。 工具:
/home/zijun/dsh_data/maidongktv/tools/muse-sync.py(本机复刻 App 的MuseDbSync协议)
一、更新方法
cd /home/zijun/dsh_data/maidongktv
python3 tools/muse-sync.py --check # 只比对远端/本地版本
python3 tools/muse-sync.py --update # 有更新才下载安装(412MB gz → 969MB db)
python3 tools/muse-sync.py --update --force # 强制重下
MUSE_SYNC_HOST=mws.cherryonline.cn python3 tools/muse-sync.py --update # 换同步主机
安装时会:下载 → 校验 md5 → 解压 → 旧库改名 muse.db.backup → 写入新库 + 更新 db_version.txt。
二、协议要点(2026-10-10 实测)
| 步骤 | 说明 |
|---|---|
| 登录 | POST https://mconn.cherryonline.cn/mls-api/v1/login,body {encrypted_data: RSA_PKCS1v15({"device_id":"s00e04b021b2d"}), ip, dns, router, subnet_mask, channel:common, mode:ott} → 取 Set-Cookie: muse-portal-connector=… |
| 同步 | POST {host}/mls-api/v1/sqlite/sync,body {"last_sync_at":0,"music_file_type":214},必须带上面的 Cookie |
| 主机 | mconn.cherryonline.cn 与 mws.cherryonline.cn 实测都能返回文件(同一后台) |
| 无 Cookie | 返回 401 Unauthorized —— 登录 cookie 是唯一门槛,每次同步前都要重新登录 |
| 响应 | {"errcode":0,"files":[{"day":"261009","db_vc":10100,"md5":"…","url":"https://ali.pri.mcdn.cherryonline.cn/muse.portal.ott_common.full.261009.db.gz?Expires=…&Signature=…"}]} |
⚠️ 踩坑记录(是我自己的 bug,不是服务端限制):首版脚本用「按固定下标插入
-H Cookie」拼接 curl 参数, 把前一个-H的取值切断 → Cookie 没发出去 →sync返回空 files,被误判成"服务端未授权、拿不到库"。 真相是渠道正常。修复方式:所有-H用追加(cmd += [...]),不要按下标插入。 另注意该库的下发与歌曲源取址的卡密/试用是两套东西 —— 曲库同步不看卡密。
三、版本对照(本机留档)
| 版本 | 曲库标识 | 歌曲数 | 文件 | md5 | 备注 |
|---|---|---|---|---|---|
旧(已备份 muse.db.backup) |
db_version=20260717.211050 |
670,304 | 1,036,038,144 B | 0bc6a5b51f0e24009ccfef2eee2d4d37 |
含 cloud_url / block_status 等列(44 列) |
新(当前 muse.db) |
day=261009 / db_vc=10100 / db_version=1791504483411 |
696,393 | 1,015,771,136 B | 2ad0b46eacfa2620f0224237d36eb348 |
官方版(29 列,无 cloud_url) |
新库 schema 变化(对比旧库少 15 列):
cloud_url、block_status、block_at、created_at、fav_at、media_id、p_origin、p_accomp、
p_volume、search_at、singer_names、source、source_id、store_id、updated_at 均不存在;
表也精简为:songs / singers / song_singer_relations / playlists / playlist_songs / song_langs / tag_groups / tag_relations / singer_areas / singer_types / albums / movies(后三者空)。
对本体 App 无影响:
MuseDatabase.kt的注释早已写明"官方曲库无cloud_url冗余列",SongApiClient的 DB 兜底是历史遗留路径,不会因缺列崩溃。
四、当前统计快照(新库,2026-10-10)
- 歌曲总数:696,393 首(对比旧库 +26,089,+3.9%)
- 语言:国语 629,947(90.46%)· 粤语 24,646 · 闽南语 15,967 · 英语 14,701 · 其它 5,407 · 韩语 3,548 · 日语 2,115 · 未标注 62
- 歌手:137,462 位;歌曲-歌手关联 771,261 条,覆盖 692,579 首(99.5%)
- 歌单:276 个 / 43,054 条关联
- 文件名:绝大多数为
<编号>.ts(自建服务器可直接沿用该命名)
五、清单产物(selfhost-source/inventory/)
| 文件 | 内容 |
|---|---|
song-stats.md |
统计报告(总数/语言/标签/歌手/维度分布) |
songs-all.csv |
全量清单 696,393 行(44 MB):编号,歌名,语言,文件名,专辑,歌手,热度 |
songs-<语言>.csv |
按语言拆分 8 份(国语 40 MB / 粤语 / 闽南语 / 英语 / 其它 / 韩语 / 日语 / 未标注) |
singers-top.csv |
全量歌手榜(按歌曲数) |
playlists.csv |
歌单清单 |
生成脚本:selfhost-source/build_inventory.py(已做 schema 容错:列/表不存在时自动跳过,适配不同曲库版本)。