Files
maidong-ktv/selfhost-source/LIBRARY.md
T
zijunchiang 87aa979abd 合并自建歌曲源支线(selfhost-source)+ 版本号按约定修正为 1.6.0
版本号:
- 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 例)
2026-10-14 02:06:28 +08:00

68 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 本地曲库(muse.db)— 更新方法与版本记录
> 支线文档(自建歌曲源),不涉及本体 App 代码。
> 工具:`/home/zijun/dsh_data/maidongktv/tools/muse-sync.py`(本机复刻 App 的 `MuseDbSync` 协议)
## 一、更新方法
```bash
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 容错**:列/表不存在时自动跳过,适配不同曲库版本)。