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, 可视化界面, 无损检测, 桌面应用, 网络流量审计, 自动化攻击, 音频处理