xjmzx/ndisc.tree
GitHub: xjmzx/ntree
基于 Tauri 2 的 FLAC 音频库无损质量扫描器,利用高频频谱启发式判断 FLAC 文件是否真正无损。
Stars: 1 | Forks: 0
# ndisc.tree
(二进制文件 `ndisc-tree`;前身为 `audio-flac-quality-check-tauri` / `ndisc.blobtree`)
[`audio-flac-quality-check`](https://github.com/xjmzx/audio-flac-quality-check) 的 Tauri 2 桌面端移植版。
相同的启发式逻辑,相同的阈值,相同的工作流 —— 不同的技术栈,因此它与套件中的其余工具相匹配([`smpl-tool`](https://github.com/xjmzx/smpl-tool),
[`ndisc`](https://github.com/xjmzx/ndisc),[`bpm-tapper`](https://github.com/xjmzx/bpm-tapper))。
**技术栈:** Tauri 2 桌面二进制文件 + React 19 + TypeScript + Tailwind v3。
前端使用 Vite。扫描在 Rust 命令中运行,通过 rayon 并行调用
`ffmpeg`/`ffprobe`。
## 功能说明
对于所选根目录下的每个 `.flac` 文件:
1. `ffprobe` 验证流是否为 FLAC 并读取采样率。
2. `ffmpeg -af highpass=f=16000,volumedetect` 测量高频段中的
峰值采样。
3. 真正的无损 44.1 kHz 音频保留了 16 kHz 以上可测量的能量
(峰值通常为 −10 到 −45 dBFS)。有损编解码器在其带宽限制以下进行低通滤波,因此 16 kHz 以上的峰值本质上
是静音(远低于 −65 dBFS)。
| 判定结果 | 16 kHz 以上峰值 |
| --- | --- |
| `LOSSLESS` | ≥ −35 dB |
| `UNCERTAIN` | 介于两者之间(需人工复查 —— 真正安静/氛围感的无损音频可能会落入此处) |
| `PROBABLY-LOSSY` | ≤ −65 dB |
| `NOT-FLAC` | 编解码器不是 flac |
| `UNKNOWN` | ffprobe / ffmpeg 执行失败 |
该方法**不**依赖于文件大小或压缩率 —— 因为它们
无法区分真正的无损音频与重新编码为 FLAC 的有损源。
## 安装运行时依赖 (Debian / Ubuntu)
该应用程序会调用 `ffmpeg`/`ffprobe` —— 与原始的 Python
版本具有相同的运行时依赖。
```
sudo apt update
sudo apt install ffmpeg
```
Tauri 的 [Linux 前置条件](https://tauri.app/start/prerequisites/#linux):
```
sudo apt install \
libwebkit2gtk-4.1-dev \
libgtk-3-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libssl-dev \
build-essential \
curl wget file
```
外加 Node 工具链和 Rust 工具链:
```
sudo apt install nodejs npm
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
## 快速开始
```
git clone https://github.com/xjmzx/ndisc.tree.git
cd ndisc.tree
make deps # npm install + cargo fetch
make icons # one-time: generate Tauri bundle icons from icon.svg
make dev # opens the Tauri window with hot reload
```
## 构建 / 安装 / 部署
`Makefile` 会构建一个 release 二进制文件并将其放置在 `PREFIX/bin` 下,
图标放在 `PREFIX/share/icons/hicolor/scalable/apps` 下,并且将
`.desktop` 条目放在 `PREFIX/share/applications` 下(以便该应用程序显示在
GNOME / KDE / XFCE 应用程序菜单中,名称为 **FLAC Library Browser**)。
```
# 用户级别安装(无 sudo) — 默认 PREFIX 为 $HOME/.local
make install
# 系统范围
sudo make install PREFIX=/usr/local
# 移除
make uninstall # or: sudo make uninstall PREFIX=/usr/local
```
其他目标:
```
make help # list everything
make check # tsc + vite build + cargo check (no full Tauri build)
make build # release build only
make clean # remove dist/ and src-tauri/target/
```
## 快捷键(与 Python Tk 版本匹配)
| 键位 | 操作 |
| --- | --- |
| `Ctrl+R` | 重新扫描已配置的根目录 |
| `Ctrl+F` | 聚焦搜索框 |
| `Esc` | 清除过滤条件 + 搜索 |
| 双击音轨行 | 打开其所在文件夹 (`xdg-open`) |
## 持久化
扫描报告以 JSON 格式缓存在标准的 Tauri app-data 目录中
(Linux 上为 `~/.local/share/uk.fizx.audioflacqualitycheck/last_scan.json`),
而不是二进制文件旁边。窗口在启动时会恢复上一次的扫描结果。
## 布局
```
ndisc.tree/
├── src/ # React + TS frontend
│ ├── App.tsx # main layout
│ ├── components/ # ScannerControls, Filters, LibraryTree,
│ │ # StatusBar, NostrPanel (stub), Section
│ ├── lib/cn.ts # clsx + tailwind-merge helper
│ └── lib/tauri.ts # typed wrappers around invoke() + events
├── src-tauri/
│ ├── src/lib.rs # scan_library / load_report /
│ │ # save_report / open_folder
│ ├── Cargo.toml
│ └── tauri.conf.json
├── icon.svg # suite-style 128px tile
├── ndisc-tree.desktop.in
└── Makefile
```
## 关于 Nostr 槽位的说明
右侧的 `NostrPanel` 是一个结构占位符,与
`smpl-tool` 和 `ndisc` 中使用的套件级布局相匹配。目前未接入任何功能 ——
因为质量扫描器目前还没有明确需要发布的内容。当出现实际用例时(例如发布
库质量摘要,或分享可疑音轨
列表),可以从 [`smpl-tool`](https://github.com/xjmzx/smpl-tool/blob/main/src/lib/nostr.ts) 中复制
`lib/nostr.ts` 以及上传和发布流程。
## 注意事项
频谱截断是一种启发式方法;纯粹的 drone(持续低音)/ 超低音 / 无声的氛围
音轨即使完全是真正的无损音频,也没有高频内容,并且会
显示为 `PROBABLY-LOSSY`。请通过试听、检查
元数据(编码器、源比特率),或使用如 Spek 等频谱
可视化工具来验证可疑音轨。
## 关联项目
- [`audio-flac-quality-check`](https://github.com/xjmzx/audio-flac-quality-check) — 本项目所移植的原始 Python + Tk 版本。
- [`smpl-tool`](https://github.com/xjmzx/smpl-tool)
- [`ndisc`](https://github.com/xjmzx/ndisc)
- [`bpm-tapper`](https://github.com/xjmzx/bpm-tapper)
标签:React, Rust, Syscalls, Tauri, 可视化界面, 无损检测, 桌面应用, 网络流量审计, 自动化攻击, 音频处理