![]() macOS · 排行榜 |
![]() macOS · 播放页 |
![]() Windows · 排行榜 |
![]() Windows · 播放页 |
![]() Linux · 排行榜 |
![]() Linux · 播放页 |
![]() |
![]() |
![]() |
![]() |
| iPhone Duo 外屏 | Android | ||
- 轻。 macOS 版
.app13.9 MiB,压缩后 7 MiB;停在排行榜页时占用 61 MiB 内存。 - 有景深的歌词。 正在唱的一行最清楚,上下几行逐渐虚化,背后铺着模糊的封面。
- 本地音乐也有歌词和封面。 本机的 FLAC、MP3 会自动配上网易云里同一首歌的歌词和封面,和在线歌单在一个曲库里搜索。关掉网易云,Enji 就是一个纯本地播放器。
- AI 能直接用。 自带 MCP 服务器和命令行。Claude 这样的 AI 可以搜歌、放歌、切换页面,看的是界面上的控件,而不是截图。
- 听网易云:每日推荐、推荐歌单和 60 多个排行榜,歌单、专辑、歌手都能点进去看。不登录也能看排行榜、搜歌、听免费歌曲。
- 登录:用网易云音乐 App 扫码登录;在手机上把二维码存到相册,再在网易云音乐里从相册扫码。登录信息只保存在你自己的设备上。
- 私人漫游:登录后从首页打开,歌放完自动接下一首,不想听就点“不喜欢”;也可以设成启动时直接打开。
- 我的歌单:我喜欢的音乐、自建和收藏的歌单;可以新建歌单、把歌加进去、给歌点红心。
- 搜索:网易云和本机的歌一起搜,有搜索记录和热搜榜,热搜榜可以在设置里单独关闭。
- 歌词:跟着歌逐行滚动,带中文翻译,点一行就跳到那里;也能看歌曲评论。网易云给了逐字时间的歌,每个字随着演唱从左到右逐渐亮起,桌面歌词也一样。日语歌词可在汉字和片假名上方显示平假名注音,在设置中开关。手机竖着拿时,封面下方也显示正在唱的那一行。
- 音质:标准、较高、极高、无损、Hi-Res 可选(320k 以上需要网易云会员)。
- USB 独占输出:Android 14 及以上,插 USB 解码器时按歌曲原本的采样率输出,不经过系统重采样。需要手机厂商开放这项功能。
- 本地音乐:MP3、FLAC、M4A、WAV 等常见格式都能放,播放时写出格式和码率,例如“FLAC · 921 kbps · 44.1 kHz · 16 bit”。电脑上添加文件夹;iPhone 上把歌放进“文件”App 的 Enji 文件夹;Android 上选一个文件夹。
- 下载:把歌连同歌词和封面存到本机,电脑上在“音乐”文件夹的 Enji 里。下载过的歌和本机的歌在列表里都有标记。
- 系统的播放控件:键盘上的媒体键、macOS 菜单栏、iPhone 的锁屏和控制中心、Windows 的媒体浮窗、Linux 桌面的媒体控件、Android 的通知栏,都能看到正在放的歌并控制播放。切到别的 App 或锁屏后音乐不停。
- 桌面歌词:电脑和 Android 上,歌词可以浮在所有窗口上面,拖到哪里就停在哪里。鼠标移上去(Android 上点一下)就能切歌、暂停和锁定;锁定后鼠标点击会穿过它。
- 插件:在设置里的插件商店安装插件,比如 Windows 任务栏歌词、跟着鼓点跳动的封面。插件用 JavaScript 编写,见 enji-plugins。
- 播放记录:最近听过什么,每首歌听了几次。听过的歌同步到网易云账号(可在设置里关闭),计入听歌排行和年度报告。
- 心动模式:在设置里打开后,它和列表循环、随机播放在一起,从正在放的歌开始,接上网易云为你挑的歌。
- 一起听:在设置里打开后,用网易云的房间和朋友一起听:切歌、暂停、拖进度都会同步。
- 账号:点开设置里的账号,能看到等级和升级进度、听歌时长、每年听了多少、最常听的歌和勋章,还能选年份打开网易云的官方年度听歌报告(不想要可以在设置里关掉)。
- 接着听:下次打开时,上次放的歌和进度还在,按播放就接着放。
- 留在后台:电脑上可以在设置里选关闭窗口时退出还是留在后台。留在后台时音乐继续放,从任务栏托盘(macOS 是菜单栏)能控制和打开窗口。
- 电视:Apple TV 和 Android TV 上用遥控器操作,用手机扫码登录。
- 外观:浅色、深色或跟随系统,中文和英文界面;格式、封面下的歌词和桌面歌词都能在设置里关掉。
到 Releases 下载:
| 系统 | 文件 |
|---|---|
| macOS | Apple 芯片用 -macos-arm64.dmg,Intel 用 -macos-x86_64.dmg |
| iPhone / iPad | -ios.ipa |
| Apple TV | -tvos.ipa |
| Windows | -windows-x64-setup.exe 或 -windows-arm64-setup.exe,也有免安装的 .zip |
| Android 手机、平板和电视 | 大多用 -android-arm64-v8a.apk;很旧的 32 位设备用 -android-armeabi-v7a.apk;模拟器和 x86 设备用 -android-x86_64.apk |
| Linux | -linux-x64 或 -linux-arm64 的 .deb,也有 .tar.gz |
macOS、iOS、tvOS 和 Windows 版没有开发者签名:.ipa 需要用 AltStore、Sideloadly 等工具以自己的 Apple ID 签名安装,其余的第一次打开时怎么放行写在发布说明里。
每次构建都会在 target/bern/<平台>/bin/ 生成 enji 命令行和 enji-mcp,skills/enji/SKILL.md 里是全部命令的说明。
enji search search --text "GO GHOST"
enji enji play --source Search --index 0
enji stateEnji 用 Bern 写成。上面的特色,大多是 Bern 直接带来的。
界面写一次,编译成各平台自己的代码。 Enji 的界面用 Bern 的 ui! 声明写在 Rust 里。构建时,Bern 把它生成 SwiftUI、WinUI 3(C++)、Jetpack Compose(Kotlin)和 GTK 4(Rust)的源码,再交给 Xcode、MSVC、Gradle、Cargo 各自编译。运行时没有自绘引擎,也没有内嵌网页,所以 macOS 版只有 14 MB。
布局按屏幕宽度声明。 窄屏用手机布局,宽屏用侧边栏,整个切换就是这三行:
// shell/ui/src/lib.rs
Adaptive(id: shell) {
Layout(size: compact) { phone_shell(app: app) }
Layout(size: expanded) { desktop_shell(app: app) }
}iPhone Duo 一展开就换成宽屏布局,没有一行专门给折叠屏的代码。
界面和逻辑之间隔着一份协议。 每个模块的 protocol 用 #[bern::protocol] 声明界面能读的状态和能调用的命令,core 是实现这些命令的 Rust 引擎,五个平台跑的是同一份。界面里按钮写 => app.toggle(),调用的就是协议里的 fn toggle:
// modules/enji/protocol/src/lib.rs
#[commands]
pub trait Commands {
// …
/// Play the song at `index` of a list, then the rest of the list.
fn play(&mut self, source: Source, index: i64) -> Result<(), CommandError>;
/// Pause, or play on.
fn toggle(&mut self) -> Result<(), CommandError>;
// …
}界面引用了不存在的命令,或者某句文案缺了英文翻译,bern check 在构建前就会报错。
AI 接口来自同一份协议。 协议里的每条命令、界面上的每个控件都有名字,Bern 据此生成 enji 命令行、enji-mcp 服务器和 SKILL.md。AI 执行 enji enji play 和你点播放按钮走的是同一条命令。
想用同样的方式写自己的应用,可以看看 Bern。
Enji 用 Bern 构建。先装上 Bern 的构建工具 bern,版本和 Enji 用的 Bern 一致:
cargo install --locked --force --git https://github.com/AimesSoft/Bern.git --rev 8e95c39cae4098c5fec6decfd6cdfc479c8508ca bern-cli构建工具与 Cargo.toml 固定到同一份 Bern 提交;请使用上面的版本构建当前源码。
然后取得 Enji 并运行:
git clone https://github.com/MCDFsteve/Enji.git
cd Enji
bern runbern run 构建并打开这台电脑上的版本;bern build --target <平台> --release 构建某个平台(macos、ios、windows、linux、android),bern package 生成安装包。bern doctor 会列出这台电脑构建各平台还缺什么,各平台需要的工具见 Bern 的说明。
同时修改 Bern 时,把 Bern 放在 Enji 旁边(../Bern),再把 .cargo/config.local.example.toml 复制成 .cargo/config.toml,Enji 就会用这份 Bern 源码;bern 也从它安装:在 Bern 目录里运行 cargo install --path crates/bern-cli。
macOS 和 Windows 实机、Ubuntu 24.04 虚拟机(GNOME)、iPhone Duo 和 iPad 模拟器、Android 手机和平板模拟器、Apple TV 和 Android TV 模拟器上实际用过浏览、搜索、播放和歌词。
系统的播放控件在 macOS、iPhone 模拟器、Android 模拟器和 Ubuntu 上试过,桌面歌词在 macOS、Windows 和 Android 上试过;Windows 上的播放控件和 Linux 的桌面歌词还没有实际试过。
USB 独占输出还没有接真的 USB 解码器试过;Linux 版的逐字歌词只通过了编译。
日语假名注音已通过歌词解析单元测试、Apple 原生排版与颜色回归测试及 iOS 16/17 双前端编译;macOS 完整应用已实际检查注音开关及重启保持、颜色、桌面浮层,并逐帧检查窄窗口内字号切换和换行时的文字完整性。
iPhone 17(iOS 26.5)模拟器已实际检查注音开关、重启保持,以及开关注音时原文字体和字重一致;逐字高亮另用有逐字时间的歌曲逐帧验证。测试的日语歌曲不含逐字时间,尚未覆盖日语注音与逐字高亮同时播放。Apple TV 4K(tvOS 27.0)模拟器也已实际检查注音开关、重启保持和逐字高亮;修正后的电视大标题在开关注音时保持相同字号和字重。注音本身需要横向空间,长读音仍可能使一行提前换行。tvOS 18 仅通过编译,其余平台的注音显示未验证。
- Enji 是第三方客户端,不是网易云音乐官方出品,与网易公司无关。
- 本项目仅供学习和技术交流。
- Enji 只通过网易云音乐的接口播放你本来就能听的内容,不提供任何音乐资源,也不绕过会员和版权限制。试听片段不能下载;下载的歌请只用于个人收听,不要传播。
- 歌曲、歌词、封面等内容的版权归网易云音乐及各自的权利人所有。
- 使用时请遵守网易云音乐的用户协议和当地法律法规,因使用本项目产生的一切后果由使用者自行承担。
- 如果你是权利人,认为本项目侵犯了你的权益,请提交 Issue,我们会尽快处理。
MIT。
- Bern:界面框架
- ncm-api-rs:网易云音乐接口
- Misuzu Music:随机播放、本地歌曲识别和封面光效的做法
- symphonia、rodio、lofty:解码、播放和标签
- Boa:Apple TV 上运行插件的 JavaScript 引擎,其他平台用系统自带的;插件的格式参照 NipaPlay Next
- Fluent UI System Icons:图标里的均衡器图形


















