# AM Music Deduper 轻量级家庭 NAS 音乐库去重服务,面向 `AllMusic/{username}/` 场景。 ## 处理模型 ```text AllMusic ↓ 文件稳定检测(size + mtime) ↓ L1:size + head/tail 64 KiB ↓ 完整 SHA-256 ├─ 相同 → Exact Duplicate → hard link └─ 不同 → duration ±3s → Chromaprint ├─ 高相似且版本一致 → hard link ├─ 中等相似/版本冲突 → review └─ 低相似 → 保留 ``` ### 安全规则 - SHA-256 是 Exact Duplicate 的最终依据;L1 只负责缩小候选范围。 - 不根据文件名、歌手、歌名、专辑或来源单独判重。 - 确认相同版本后,优先使用 hard link 保留每个用户原来的逻辑路径。 - 用户删除自己的路径不会影响其他 hard link;最后一个 link 删除后数据才释放。 - hard link 要求源文件和目标文件位于同一文件系统。 - 正在写入的文件必须先通过稳定性检查。 - L2 对版本标记冲突的文件进入 review,不自动合并。 - SQLite 是加速索引,文件系统是最终事实;数据库丢失后可以重新扫描。 - `.dedupe` 不参与音乐扫描,避免把内部文件再次处理。 ## CLI ```bash # 建立/更新索引,不修改音乐文件 am-deduper scan /music/AllMusic --db /data/dedupe.db # Exact + L2;首次执行建议 dry-run am-deduper dedupe /music/AllMusic --db /data/dedupe.db --dry-run # 确认后执行 am-deduper dedupe /music/AllMusic --db /data/dedupe.db # 长驻监听:默认只自动执行安全的 Exact hard-link am-deduper watch /music/AllMusic --db /data/dedupe.db # 开启 L2 acoustic 匹配;建议先 dry-run 验证 am-deduper watch /music/AllMusic --db /data/dedupe.db --l2 ``` ## Feiniu NAS 部署 生产环境采用 **Gitea 源码 → NAS 本地 Docker build → NAS 本地运行**。 不需要 Docker Registry,也不需要让 wjyhk 构建生产镜像。 建议目录: ```text NAS ├── Gitea 仓库 │ └── am-deduper/ ├── AllMusic/ │ ├── admin/ │ ├── alice/ │ └── bob/ └── AppData/ └── am-deduper/ └── dedupe.db ``` ### NAS `.env` ```dotenv ALLMUSIC_PATH=/AllMusic DEDUPE_DATA_PATH=/AppData/am-deduper ``` ### 首次部署 ```bash cd /am-deduper git pull mkdir -p /AppData/am-deduper docker compose build docker compose run --rm am-deduper scan /music/AllMusic --db /data/dedupe.db docker compose run --rm am-deduper dedupe /music/AllMusic --db /data/dedupe.db --dry-run ``` 确认 dry-run 输出后,再执行正式 Exact/L2: ```bash docker compose run --rm am-deduper dedupe /music/AllMusic --db /data/dedupe.db ``` 然后启动长期监听: ```bash docker compose up -d ``` 更新版本: ```bash git pull docker compose build docker compose up -d ```