科技 · 实用指南
把 MediaMonkey 4 的播放次数和最后播放时间迁移到 Strawberry
明确映射 MM4 路径、预览两项统计,并用经审读的只写副本适配器在 Linux 上生成经检查的 Strawberry 数据库副本。

在 Strawberry 中扫描同一批音乐不会恢复 MediaMonkey 4 的历史。本流程从原始 MM4 MM.DB 读取 PlayCounter 和 LastTimePlayed,匹配 Linux 上已扫描的歌曲,只把 playcount 与 lastplayed 写入新的 Strawberry 数据库副本。
它只适用于刚扫描且未使用的目标库:playcount 应为 0、lastplayed 为 -1,存在 skipcount 时也应为 0。它不会替换在线配置、合并已使用的库、迁移评分或播放列表、重建逐次播放事件,也不会找回缺失音频。
准备一致副本和未使用的目标库
退出两个播放器。把原始 MM4 数据库复制为 MM.DB,把刚扫描的 Strawberry 数据库复制为 strawberry.db,并另存原件。输入旁若有 -wal、-shm 或 -journal,工具会拒绝;不要删除它们来伪造一致备份。
使用原始 MM4 数据,不用可能含本地时间的 XML。目标库保持未播放。下载 https://watchatease.com/guide-tools/mm4-to-strawberry-v1.0.1.zip 并在解压前核对 SHA-256;测试使用生成记录,不是真实媒体库。
检查并映射每个源卷
运行:python3 mm4_to_strawberry.py inspect --mm-db MM.DB --strawberry-db strawberry.db
报告列出真实 IDMedia、原始路径和目标 URL。像 :\Music\Album\Track.flac 的路径本身不含卷身份,必须使用返回的 IDMedia。创建 version 为 1 的 mapping.json,为每个卷写一条不重叠的 id_media/source_root 规则,例如把 IDMedia 7 的 :\Music 映射到 /home/YOU/Music。
遇到歧义匹配就停止
本版支持文档所述的原始 :\ 路径,不重建带盘符或 UNC 的路径,不折叠 Linux 大小写,不统一不同 Unicode 写法,也不按歌手和标题猜测。
重复目标 URL、两份历史指向同一实体文件、cue 分段、目标缺歌及歧义匹配都会阻断。修正路径或库,不能编辑计划随意选行。
预览每一项改动
运行:python3 mm4_to_strawberry.py preview --mm-db MM.DB --strawberry-db strawberry.db --mapping mapping.json --confirm-mm4-utc --out-dir preview-mm4
使用新目录,抽查 plan.json 中的已知曲目。无阻断时退出码 0;有阻断时为 2,并留下诊断。日期按 (date - 25569) × 86400 转换,范围为 1970-01-01 至预览时间后五分钟。正次数缺有效日期会阻断;零次数有日期会保留;零次数无日期为 skipped-no-supported-history。
应用未改动的计划并核验副本
审读干净计划后运行:python3 mm4_to_strawberry.py apply --plan preview-mm4/plan.json --out-dir migrated-mm4
apply 会重算预览。数据库、映射、脚本、音频身份元数据或决定有变化都会让计划失效。成功后生成 migrated-mm4/strawberry.db 和 verification.json,不会安装或覆盖在线配置。
报告记录输入/输出 SHA-256、行数和计划校验和;比较完整统计向量,检查其余表与模式,拒绝额外写入触发器,并运行 PRAGMA quick_check 与完整 PRAGMA integrity_check。确认原文件哈希不变。
隔离测试并守住边界
在独立系统账户或单独 Strawberry 数据目录中测试返回的数据库。若被拒绝,保留原件并调查模式/构建,不能篡改版本号强行兼容。
57 个合成测试覆盖 inspect-preview-apply、固定 schema-11 songs 夹具、无关字段/FTS/播放列表保全、歧义与输入变化拒绝,以及四时区下 1,000 个日期转换;它们不证明所有版本或真实库兼容。
本指南只迁移现有本地歌曲的 playcount 与 lastplayed;不迁移评分、播放列表或逐次事件,不合并已使用的库,不修复缺失音频,也不宣称通用支持 MM3/MM5。
