Skip to content

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

本机控制台(LocalDesk)

面向 Linux 本机运维与文件操作的桌面控制台,目标环境为 CachyOS/Arch Linux、niri 和 Wayland。

项目使用 Tauri 2 承载 Vue 3/TypeScript 界面,由 Rust appd 统一提供本机状态、应用资源、网络、远程连接、传输和日志数据。界面只展示后端或桌面协议返回的事实;不可用能力会保留为 degraded、unsupported 或 unreachable,并显示对应的 capability reason。

当前版本为 0.1.0,仍处于开发阶段。仓库针对 Linux/niri,不提供其他桌面环境或操作系统的兼容承诺。

主要能力

  • 仪表盘:集中展示后端能力目录和运行状态。
  • 应用:基于 /proc 的进程资源聚合,以及由 niri、Wayland idle 协议和 logind 提供事实依据的前台使用时长。
  • 网络:通过 rtnetlink 获取接口计数器;按应用流量由独立 eBPF helper 提供,未授权时明确标记为 unsupported。
  • 网络工具:按本机依赖情况提供基础测速、iperf3、Wi-Fi 扫描和 IP 检查等能力。
  • 远程连接:SSH 终端与 SFTP、显式 FTPS/可确认的明文 FTP、基于系统 libsmbclient 的 SMB2/3 文件操作。
  • 传输队列:持久化上传/下载任务,保留协议能力、冲突和恢复语义。
  • 日志:日历/列表共用同一套 SQLite 实体,支持 Markdown 编辑、修订和导出;AI 会话提取仅从本机已存在且可读取的数据源获取事实。
  • 音乐:本地音乐库和播放队列、QQ 公开歌单元数据、自定义来源下载,以及 QMC/QMC2/musicex 文件夹批量转换和封面修复。
  • 设置:查看系统信息、能力状态和未开放配置边界。

具体能力取决于本机环境和权限。项目不会用模拟数据填补缺失值,也不会把未接入能力伪装为可操作功能。

技术架构

Vue 3 / TypeScript UI
        │ Tauri commands(固定契约)
        ▼
Tauri desktop bridge
        │ Unix socket:$XDG_RUNTIME_DIR/localdesk/appd.sock
        ▼
Rust appd
  ├─ domain / IPC
  ├─ telemetry / system information
  ├─ network / usage accounting
  ├─ SSH / SFTP / FTP(S) / SMB
  ├─ transfer queue
  ├─ notes
  └─ music / QQ local conversion
        │
        ├─ system APIs:procfs、rtnetlink、Wayland、logind
        └─ system tools/libraries:OpenSSH、libcurl、libsmbclient、SQLite

主要目录:

路径 用途
apps/desktop-ui Vue UI 与 Tauri 桌面桥接
bins/appd 用户会话内的常驻后端
bins/telemetry-helper 受控的遥测采集 helper
bins/network-helper 可选的 eBPF 按应用网络采集 helper
crates/domain 跨层领域类型与 capability 状态
crates/ipc Unix socket 消息、帧和客户端/服务端
crates/remote-* SSH/SFTP、FTP(S)、SMB 适配器
crates/transfers 传输状态机、执行器和持久化
crates/notes 日志实体、修订、查询与导出
crates/music 本地音乐、来源、下载、QQ 解密和转换任务
helpers/qqmusic-wine-bridge 仅供新版 musicex 使用的 32 位 Wine 桥接
packaging Linux 桌面入口和 Arch 包模板

环境要求

  • Linux x86_64,推荐 CachyOS/Arch Linux
  • niri + Wayland 用户会话
  • Rust 1.97(workspace 使用 edition 2024)
  • Node.js 与 pnpm 11.3.0
  • C/C++ 构建工具、Clang/LLVM
  • GTK 3、WebKitGTK 4.1、GLib、SQLite、libcurl、libsecret、libbpf
  • OpenSSH、Samba client、systemd/logind、XDG Desktop Portal、FFmpeg/ffprobe 和 mpv

Arch 包的完整运行/构建依赖以 packaging/arch/PKGBUILD.in 为准。部分网络工具会在运行时探测 iperf3、nmcli、iw、pkexec 等程序;缺失时相应能力会降级或标记为不支持。

本地开发

安装前端依赖:

pnpm install --frozen-lockfile

在 niri/Wayland 图形会话中启动完整开发环境:

pnpm dev

启动脚本会依次:

  1. 使用锁文件构建桌面端、appd 和所需 helper;
  2. 启动 appd 并等待 Unix socket 就绪;
  3. 在 127.0.0.1:1420 启动 Vite;
  4. 启动 Tauri 桌面窗口。

普通开发启动不强制安装 cargo-xwin:存在该命令时会重建 QQ 音乐 Wine 桥接;不存在时会复用已有桥接 EXE,若两者都不存在则继续启动,带内置密钥的 QMC/QMC2 解密仍可使用。需要单独构建桥接时执行:

cargo install cargo-xwin
npm run build:qqmusic-bridge

关闭桌面窗口或按 Ctrl+C 会结束整组开发进程。脚本要求 XDG_RUNTIME_DIR 已设置为当前用户拥有的绝对路径,并会拒绝复用已被占用的 socket 或 Vite 端口。

只启动前端界面可使用:

pnpm --filter desktop-ui dev

此时没有桌面桥接和 appd,依赖后端的页面会如实显示不可达状态。

音乐与 QQ 音乐转换

支持范围

文件/能力 是否需要 Wine 和正在运行的 QQ 音乐 输出/行为
.qmc0、.qmc2、.qmc3 否 MP3
.qmcflac 否 FLAC
.qmcogg 否 Ogg Vorbis
带内置 ekey 的 .mflac、.mflac0、.mgg、.mgg1、.mggl 否 FLAC 或 Ogg Vorbis
文件尾为 musicex 且没有内置 ekey 的新版文件 是 通过受限的 32 位 Wine 桥接输出 FLAC 或 Ogg Vorbis
“仅补封面” 否 原子更新已有 MP3、FLAC、Ogg 文件的封面标签,不转码音频

便携解密逻辑在 Rust 进程内完成。musicex 桥接只附加到名称精确为 QQMusic.exe 的唯一进程,并检查 QQMusicCommon.dll 所需导出;QQ 音乐升级后如果导出发生变化,界面会显示不兼容,不会继续尝试解密。

Wine 配置与目录

Arch/CachyOS 安装 Wine 后,在 Wine 中安装 Windows QQ 音乐并登录有权访问相应媒体的账号。默认前缀为 $HOME/.wine,自定义前缀可在启动应用前设置绝对路径:

export WINEPREFIX=/absolute/path/to/prefix
wine 'C:\Program Files (x86)\Tencent\QQMusic\QQMusic.exe'

应用会自动检查 WINEPREFIX、$HOME/.wine、Bottles 常用目录和 Steam Proton compatdata。QQ 音乐默认下载目录通常位于:

$WINEPREFIX/drive_c/users/<用户>/Music/VipSongsDownload

图片缓存通常位于:

$WINEPREFIX/drive_c/users/<用户>/AppData/Roaming/Tencent/QQMusic/QQMusicCache/QQMusicPicture

进入“音乐 → 批量转换”后,顶部状态带会显示 ffmpeg、ffprobe、mpv、Wine、QQ 音乐进程、桥接 EXE、Wine 前缀、下载目录和图片缓存的真实检测结果。

批量转换与质量规则

  1. 选择“解密音乐”,分别选择加密音乐目录和输出目录;两个目录不得相同或互相包含。
  2. 点击“开始转换”。任务按文件持久化游标,支持取消;应用重启后可继续,部分失败可重试。
  3. 若目标目录存在同名音频,使用 ffprobe 比较无损/有损、位深、采样率、声道和码率:只有源音质更高才覆盖;相同或目标音质更高时跳过。
  4. 输出先写入权限为 0600 的临时文件,验证音频签名并同步落盘后原子提交;源文件和输出目录中的无关文件不会被删除。

“仅补封面”直接选择已有解密音频目录。默认只使用本地 QQ 图片缓存,并要求音频的歌手和专辑与缓存键精确归一化匹配。用户可显式开启“允许在线补图”;在线回退只查询固定 QQ HTTPS 主机,并且仅在返回结果的歌手和专辑都精确匹配时写入,不会使用默认图或模糊匹配图。

常见问题

界面状态 处理方法
Wine 不可用 仍可处理便携 QMC/QMC2;需要 musicex 时安装 Wine。
QQ 音乐未运行 在同一个 Wine server/prefix 中启动 QQ 音乐并保持唯一一个 QQMusic.exe。
QQ 音乐进程冲突 退出多余实例,只保留一个 QQMusic.exe 后重新检查。
Wine 桥接不可用 正式安装包应包含 /usr/lib/localdesk/localdesk-qqmusic-wine-bridge.exe;源码开发可运行 npm run build:qqmusic-bridge。
QQMusicCommon.dll 不兼容 当前客户端缺少桥接所需导出;不要批量重试,等待项目适配该客户端版本或使用已验证版本。
本地缓存没有精确封面 先让 QQ 音乐加载相应专辑图片,或在“仅补封面”模式显式允许在线补图。

当前真实运行验收使用 Wine 下的 32 位 QQ 音乐 22.52。这只是已验证样本,不是长期版本承诺;最终以页面的进程、DLL 导出和桥接检测结果为准。

验证

不要默认运行全仓测试;按变更所在 package 执行最小检查。

前端:

pnpm --filter desktop-ui typecheck
pnpm --filter desktop-ui test

单个 Rust package:

cargo fmt --package localdesk-appd -- --check
cargo test --locked -p localdesk-appd
cargo clippy --locked -p localdesk-appd --all-targets -- -D warnings

将 localdesk-appd 替换为实际修改的 package 名称。独立适配器也可使用其 manifest,例如:

cargo test --locked --manifest-path crates/remote-ftp/Cargo.toml

构建与 Arch 打包

构建 UI 和发布二进制,并暂存为 Linux 文件系统树:

scripts/stage-release.sh --build /tmp/localdesk-stage
scripts/verify-release-stage.sh /tmp/localdesk-stage

生成 x86_64 tarball 和配套 PKGBUILD:

scripts/prepare-arch-package.sh /tmp/localdesk-package

若已经单独生成并验证过 release stage,可避免重复构建并复用该制品树:

scripts/prepare-arch-package.sh --stage /absolute/verified-stage /tmp/localdesk-package

在干净的 Arch/CachyOS 机器上安装生成的包:

sudo pacman -U /tmp/localdesk-package/localdesk-*.pkg.tar.zst

发布包会安装六个 Linux 可执行文件和一个 32 位 QQ 音乐桥接 EXE 到 /usr/lib/localdesk,并安装桌面入口、XDG autostart、组件许可证和 SHA-256 清单。Wine 保持可选依赖;没有 Wine 时应用与便携 QMC/QMC2 功能仍可使用。详细生命周期和可移植构建要求见 packaging/linux/README.md。

运行时数据

  • IPC socket:$XDG_RUNTIME_DIR/localdesk/appd.sock
  • 持久状态:${XDG_STATE_HOME:-$HOME/.local/state}/localdesk
  • SQLite 数据包括使用时长、远程连接元数据、传输队列、日志、音乐下载和 QQ 批量转换任务。
  • 远程密码/密钥口令使用 Secret Service 引用;配置数据库不保存明文 secret。

卸载软件包不会自动删除用户状态或 Secret Service 项。需要清理时应先停止当前图形会话中的 appd,再由用户明确删除对应数据。

权限与安全边界

  • UI 不获得任意 shell、插件或文件系统权限;Tauri command 使用固定、结构化契约。
  • SSH/SFTP 复用系统 OpenSSH,FTP(S) 复用 libcurl,SMB 复用 Samba libsmbclient。
  • 明文 FTP 必须显式确认;FTPS 默认验证系统 CA、主机名和证书有效期。
  • SMB 最低为 SMB2,密码不进入命令行参数。
  • 按应用网络统计默认不提权。若要启用,必须对不可由桌面用户替换的已安装 helper 单独授予最小的 cap_bpf,cap_net_admin=ep;具体部署和回滚流程见 crates/network/README.md。
  • 核心流程不依赖全局 Mod/Super 快捷键、托盘、通知 action、持久剪贴板或固定屏幕坐标。

相关文档

许可证

MIT © 2026 skynit

音乐模块 vendored 的 qmc2-crypto 和遗留 QMC 映射实现按 MIT 或 Apache-2.0 使用;两套许可证文本保存在 crates/music/vendor/qmc2-crypto 和 crates/music/LICENSES。Wine 桥接使用的 Frida Core/binding 许可证文本保存在 helpers/qqmusic-wine-bridge/LICENSES。luyikk/qqmusic_decrypt 在审查版本中没有许可证,因此本仓库没有复制或链接其源码和二进制,只记录了行为研究。用户只能处理自己有权访问的媒体,并应自行确认适用的服务条款和当地法律。

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages