Skip to content
MCDFstevePublic

About

网易云音乐第三方客户端,Mac、Windows、Linux、iPhone、安卓都能用。小巧顺手,本地的歌也会自动配上歌词和封面。· A third-party NetEase Cloud Music app for Mac, Windows, Linux, iPhone and Android.

Resources

Stars

115 stars

Watchers

3 watching

Forks

Repository files navigation

Enji Music 图标

Enji Music

网易云音乐第三方客户端,电脑和手机都能用,小巧顺手。

非网易云音乐官方出品,与网易公司无关。

名字来自《海猫鸣泣之时》的右代宫缘寿,与其他同名作品和角色无关。

Rust Built with Bern 网易云音乐 第三方客户端

macOS · SwiftUI iOS · SwiftUI Windows · WinUI 3 Android · Jetpack Compose Linux · GTK 4 MCP built in License: MIT

简体中文 · English

macOS 上的排行榜页:左侧边栏,网格排列的榜单封面,底部播放条
macOS · 排行榜
macOS 上的播放页:左边封面和播放控制,右边逐行歌词与中文翻译,背后是模糊的封面
macOS · 播放页
Windows 上的排行榜页:左侧导航栏,网格排列的榜单封面,底部播放条
Windows · 排行榜
Windows 上的播放页:左边封面和播放控制,右边逐行歌词与中文翻译,背后是模糊的封面
Windows · 播放页
Linux(GNOME)上的排行榜页:左侧边栏,网格排列的榜单封面,底部播放条
Linux · 排行榜
Linux(GNOME)上的播放页:左边封面和播放控制,右边逐行歌词与中文翻译,背后是模糊的封面
Linux · 播放页
iPhone Duo 外屏上的排行榜,系统的竖向标签栏在右侧 iPhone Duo 外屏上的播放页:大封面、进度条和播放控制 Android 上的排行榜,底部是迷你播放器和导航栏 Android 上的播放页:歌词代替封面显示,逐行歌词带中文翻译,下方是进度条和播放控制
iPhone Duo 外屏 Android

iPhone Duo 展开后的内屏播放页:封面在左半屏,歌词在右半屏,中间隔着铰链
iPhone Duo 展开:封面和歌词分在铰链两侧

iPad 排行榜 iPad 播放页
iPad

Android 平板 排行榜 Android 平板 播放页
Android 平板

Apple TV 排行榜 Apple TV 播放页
Apple TV

Android TV 排行榜 Android TV 播放页
Android TV

特色

  • 轻。 macOS 版 .app 13.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 签名安装,其余的第一次打开时怎么放行写在发布说明里。

交给 AI

每次构建都会在 target/bern/<平台>/bin/ 生成 enji 命令行和 enji-mcp,skills/enji/SKILL.md 里是全部命令的说明。

enji search search --text "GO GHOST"
enji enji play --source Search --index 0
enji state

Enji 是怎么做到的

Enji 用 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 run

bern 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:图标里的均衡器图形

About

网易云音乐第三方客户端,Mac、Windows、Linux、iPhone、安卓都能用。小巧顺手,本地的歌也会自动配上歌词和封面。· A third-party NetEase Cloud Music app for Mac, Windows, Linux, iPhone and Android.

Resources

Stars

115 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages