特性 多音源对冲调度 Apple Music 式界面 能力清单 获取与安装 运行与配置 HTTP 接口 使用说明
GitHub 仓库 完整 README
Go 单二进制 · 前端 go:embed 内嵌 网易云曲库 · 洛雪音源直链 v1.0.0 已发布 · 五平台二进制

把音乐站装进一个可执行文件。

曲库来自网易云音乐公开接口——精品歌单、官方排行榜、搜索、歌词;播放直链由洛雪(LX Music)自定义音源脚本解析,跑在 Go 内嵌的 goja 引擎里;界面复刻现行 Apple Music 网页版。一条 go build,拷走就能放歌。

Go 1.23+ · goja 引擎 · Vue 3 全局构建 · 无构建步骤 · 无 Node 依赖

terminal — zlion-music
# 单二进制:没有运行时,没有依赖安装,没有前端构建 $ go build -o zlion-music.exe . $ ./zlion-music.exe ▸ 监听地址 http://:8787 ▸ 音源脚本 sources/ · 8 个洛雪脚本已装载 ▸ 默认音质 320k · 直链探活 on ✓ 已在浏览器打开 http://localhost:8787

环境变量 ADDR / SOURCES_DIR / SOURCE_URLS / QUALITY / VERIFY / OPEN 同名覆盖,命令行参数优先

技术栈与数据来源

核心能力

一个 Go 文件,装下曲库、音源和整套界面。

没有数据库、没有 Node、没有前端构建步骤。二进制自带全部静态资源与音源脚本,拷到哪台机器都能放歌。

网易云曲库

精品歌单、官方排行榜全量「新发现」、歌曲 / 歌单搜索、lrc 歌词与翻译,全部来自公开 Web 端点,服务端代发并伪装浏览器 UA。

洛雪音源直链

sources/*.js 原样复用(含混淆脚本),跑在 Go 内嵌的 goja 引擎里;也可配 SOURCE_URLS 远端加载,改脚本不用换二进制。

多音源对冲

成绩排序、分波下发、赢家一出即掐断、连续失败熔断、低码率兜底、直链探活 + 换源重试,单次请求总预算 12 秒。

Apple Music 式界面

自绘品牌徽章的侧栏 + 底部悬浮胶囊播放条,进度线内嵌可拖拽;全屏层彩色洗染背景、左封面右歌词,歌词平滑跟随、选词即跳。

深浅色外观

默认浅色,侧栏底部一键切换深色,记忆存在 localStorage;介绍页与本页同款的双主题令牌体系,跟随系统配色方案。

快捷键与媒体控制

空格播放暂停、←/→ 快进快退 5s、↑/↓ 音量、Esc 退出全屏;MediaSession 让系统媒体面板 / 蓝牙耳机按键直接可用。

功能深潜 · 多音源对冲

一次点击,背后是一场音源竞速。

/api/url 收到请求后,调度器把全部音源按历史成绩排序、分波并发下发;赢家一出立即掐断其余请求,失败音源按熔断规则记分。单次请求总预算 12 秒,逻辑移植自主页 Vercel 版同一套实现。

成绩排序

每个音源按历史成功率与耗时计分,请求先发给成绩好的。成绩进程常驻、跨请求累积,不像函数实例随时清零。

分波下发

不把所有音源一次性并发,按成绩分波投放;后面的波次在前面的超时之后才出发,省掉无谓的出网请求。

赢家即掐

拿到可用直链立刻取消其余在途请求;赢家还要过 SSRF 校验与直链探活(HEAD+GET 竞速)才算数。

熔断与兜底

连续失败熔断踢出轮换;高码率全军覆没时降级低码率兜底——宁要 128k,不要无声。

探活语义(与主页版一致)

# 判死换源(仅这三个状态码) 404 / 410 / 451 # 软失败照发——机房判死 ≠ 访客判死 403 / 413 / 超时 / 返回 HTML # 单次 /api/url 总预算 12s 调度器按剩余预算自动钳制单源超时
HEAD + GET 竞速 SSRF:内网 / 元数据地址校验 ?debug=1 逐音源溯源 直链缓存 max-age=900
功能深潜 · 界面

界面对着 Apple Music 网页版抠的。

前端是 Vue 3 全局构建直挂 web/,经 go:embed 编进二进制——没有 dist 产物,也没有打包配置。

左栏曲库,底部胶囊,一眼眼熟。

左侧侧栏放主页、新发现与搜索;底部悬浮胶囊播放条承载全套播放控制,进度线内嵌可拖拽,播放列表从胶囊上方的小弹窗展开。

  • 主页聚合精品歌单与热门榜单,新发现看官方排行榜全量
  • 歌曲 / 歌单双类型搜索,单曲结果自动补全封面
  • 胶囊播放条:控制 / 音质 / 音量,内嵌进度线可拖拽,播放列表小弹窗
  • 默认浅色,侧栏底部一键切深色,localStorage 记忆
主界面 左侧为 Music 侧栏,中间为专辑网格,底部为悬浮胶囊播放条。 搜索 主页 新发现 搜索 播放队列 深色外观 精品歌单 · 华语 1:24 3:56

全屏一层,彩色洗染加歌词。

全屏层复用个人主页音乐卡的样式:背景按封面取色洗染,左边大封面,右边逐行歌词。歌词按 900ms 缓动平滑跟随当前句——当前行清晰、其余逐级虚化;扫过歌词区自动取消模糊,点任意行直接跳到那句。

  • 歌词 900ms 平滑跟随当前句,大跨度跳段直接到位不抖跳
  • 选词播放:滚过歌词区取消模糊,点任意行即跳播,3 秒自动回正
  • 翻译对照显示;播放列表小弹窗随时展开切歌
  • 播放模式三态:顺序 / 列表循环 / 单曲循环;Esc 退出全屏
全屏播放层 彩色洗染背景上,左侧为封面与曲目信息,右侧为逐行歌词,当前行高亮。 正在播放 全屏 歌曲名 · 夜行 歌手 / 专辑 · 320k 路灯把影子拉得很长 耳机里的鼓点不慌不忙 夜色只是刚好路过我心上 夜色只是刚好路过(翻译对照) 风把下一段前奏吹响 这一句还没唱到的地方 留给明天再想 1:24 3:56
完整能力清单

按模块摊开,逐条可查。

下面这些不是路线图,是当前版本已经跑在服务上的行为。

曲库与搜索

01
  • 精品歌单 /api/hqplaylists,按分类 + limit 拉取
  • 新发现聚合官方排行榜全量曲目
  • 歌曲 / 歌单双类型搜索,单曲结果自动补全封面
  • 歌单 / 榜单详情 tracks 全量下发
  • 批量歌曲详情 /api/songs?ids=1,2,3
  • 歌词 lrc + 翻译对照

播放与音质

02
  • 默认 320k,可切 128k / 320k / flac / flac24bit
  • 洛雪音源解析直链,返回 {url, verified, via}
  • 直链缓存浏览器侧 max-age=900
  • 解析失败 toast 提示并自动跳下一首
  • MediaSession:系统媒体面板 / 蓝牙耳机按键
  • 快捷键:空格 · ←/→ 5s · ↑/↓ 音量 · Esc

调度与可靠性

03
  • 成绩排序 / 分波下发 / 赢家一出即掐断
  • 连续失败熔断 + 低码率兜底 + 换源重试
  • 成绩进程常驻,跨请求累积
  • 直链探活 HEAD+GET 竞速,404/410/451 判死换源
  • SSRF 校验:lx.request 与直链共用内网 / 元数据过滤
  • 音源脚本空闲回收,/api/health?refresh=1 热重装

界面与运行

04
  • Apple Music 网页版布局 + 胶囊播放条(内嵌可拖拽进度线)
  • 全屏彩色洗染 + 歌词平滑跟随 / 选词播放 + 播放列表小弹窗
  • 播放模式三态:顺序 / 列表循环 / 单曲循环
  • 深浅色一键切换,localStorage 记忆;自绘品牌标识
  • Vue 3 直挂 web/ 无打包;前端与音源脚本 go:embed 进二进制
  • 打 tag 自动出五平台 Release(Actions)+ 一键部署脚本
获取与安装

四种路径,任选其一。

一键脚本装好即用,或手动下载五平台 Release;本机跑、常驻公网(Vercel)都行——同一个仓库两用。

脚本自动下载最新 Release 装到本机:Linux 交给 systemd 常驻开机自启,Windows 可注册登录自启动。环境变量 PORT / QUALITY / SOURCE_URLS 可调。

# 1. 取仓库(部署脚本在 scripts/ 下) git clone https://github.com/Zlion-Y/zlion-music && cd zlion-music # 2a. Linux / macOS:装到 /opt/zlion-music,systemd 常驻 sudo bash scripts/install.sh # --foreground 前台;PORT=9000 可调 # 2b. Windows(PowerShell):启动 + 登录自启动 powershell -ExecutionPolicy Bypass -File scripts\install.ps1 -AutoStart
Linux systemd 常驻 Windows 计划任务 PORT / QUALITY / SOURCE_URLS journalctl -u zlion-music 看日志

打 tag 自动出五平台二进制(GitHub Actions)+ sha256 清单,发布到 Releases;releases/latest/download 永远指向最新版。

# Linux amd64:下载 → 可执行 → 运行 curl -fLO https://github.com/Zlion-Y/zlion-music/releases/latest/download/zlion-music-linux-amd64 chmod +x zlion-music-linux-amd64 && ./zlion-music-linux-amd64 # Windows(PowerShell) Invoke-WebRequest https://github.com/Zlion-Y/zlion-music/releases/latest/download/zlion-music-windows-amd64.exe
windows / linux / darwin × amd64 / arm64 checksums.txt sha256 校验 v1.0.0 已发布

需要 Go 1.23+。前端与 sources/ 音源脚本经 go:embed 打进产物,没有 npm install,也没有打包步骤。国内拉依赖建议先设 GOPROXY。

# 国内拉依赖先设代理 set GOPROXY=https://goproxy.cn,direct # 编译(web/ 与 sources/ 一并嵌入) go build -o zlion-music.exe . # 运行 ./zlion-music.exe

Vercel 走 Go framework preset(vercel.json 已声明 framework: "go",地区 hkg1),前端与音源脚本内嵌进函数产物,无需任何函数目录改造。函数实例随时可能被回收,调度器成绩只在实例内存活。

# 1. Vercel → Add New Project → 导入本仓库 # Framework Preset 选 Go,其余留空 # 2. 可选环境变量 SOURCE_URLS=https://…/a.js,https://…/b.js # 远端音源 QUALITY=320k VERIFY=on
framework: "go" regions: hkg1 SOURCE_URLS 同名覆盖内嵌
运行与配置

命令行参数与环境变量同名,命令行优先。

六个参数覆盖监听、音源、音质、探活与自动开浏览器。音源脚本优先读 sources/ 目录,目录不存在时回退 go:embed 内嵌脚本(Release / Vercel 场景);远端 SOURCE_URLS 同名覆盖本地。

本机跑

# 默认 :8787,自动开浏览器 zlion-music.exe # 全参数 zlion-music.exe -addr :8787 \ -sources ./sources \ -source-urls https://…/a.js \ -quality 320k -verify on -open 1

只改脚本,不换二进制

# 远端音源脚本(逗号分隔,同名覆盖本地) SOURCE_URLS=https://…/a.js,https://…/b.js # 音源装载状态 / 各源成绩 / 熔断情况 curl localhost:8787/api/health # 重新装载:/api/health?refresh=1

完整参数表

环境变量与同名命令行参数一一对应,命令行优先
参数环境变量默认说明
-addrADDR / PORT:8787监听地址
-sourcesSOURCES_DIR./sources洛雪音源脚本目录(不存在时回退 go:embed 内嵌)
-source-urlsSOURCE_URLS空远端音源脚本地址,逗号分隔,同名覆盖本地,改脚本不用换二进制
-qualityQUALITY320k默认音质:128k / 320k / flac / flac24bit
-verifyVERIFYon直链探活(off 跳过)
-openOPEN1启动后自动打开浏览器
HTTP 接口

界面之外,每个能力都是一条 GET。

与主页版(zlion-home)同一套接口形状。/api/url 返回 code:0 即拿到直链;?debug=1 附逐音源溯源。

全部只读 GET,无鉴权(自建内网使用)
方法路径说明
GET/api/url?source=wy&quality=320k&id=xxx洛雪音源解析直链(code:0 → {url, verified, via};?debug=1 附逐音源溯源)
GET/api/playlist?id=xxx歌单 / 榜单详情(tracks 全量)
GET/api/toplists网易官方排行榜列表
GET/api/search?keywords=&type=song|playlist搜索(单曲结果自动补全封面)
GET/api/songs?ids=1,2,3批量歌曲详情
GET/api/lyric?id=xxx歌词(lrc + 翻译)
GET/api/hqplaylists?cat=华语&limit=24精品歌单
GET/api/health音源装载状态 / 各源成绩 / 熔断情况(?refresh=1 重装音源)
使用说明

用之前,知道这几件事。

音源脚本来自洛雪社区

随仓库分发的 sources/*.js 仅供个人学习播放用途;请支持正版。

VIP 曲目取决于音源后端

解析失败会 toast 提示并自动跳下一首;服务本身不做任何破解,只做调度与转发。

探活语义与主页版一致

只有 404/410/451 判死换源;403/413/超时/HTML 属软失败照发——机房判死 ≠ 访客判死。

SSRF 安全边界

internal/lx/ssrf.go 对 lx.request 与播放直链统一做内网 / 元数据地址校验,音源脚本与直链共用同一道闸。

网易接口为公开端点

服务端代发并伪装浏览器头;接口形状随网易侧调整可能变动,解析失败会走换源与跳歌兜底。

Vercel 与本地的差别

函数实例随时回收,调度器成绩只在实例内存活;直链缓存退到浏览器侧 max-age=900。

与主页版(zlion-home)的差异

同一套业务逻辑的两种载体
维度zlion-home(Vercel)zlion-music(Go)
JS 引擎node:vmgoja(纯 Go,单二进制无 Node 依赖)
成绩 / 熔断函数实例内,随时清零进程常驻,跨请求累积
直链缓存CDN 边缘 s-maxage=900进程内 + 浏览器侧 max-age=900
探活出口机房出口本机出口,与访客同网络环境,软失败判定更准
Go 单二进制 · 无 Node 依赖

下载、编译或一键部署,音乐马上开始。

二进制自带全部前端与音源脚本;同一个仓库在 Vercel 上走 Go preset 直接部署,本机出口探活,与访客同网络环境。

本页为项目介绍页 · 详细配置见仓库 README