曲库来自网易云音乐公开接口——精品歌单、官方排行榜、搜索、歌词;播放直链由洛雪(LX Music)自定义音源脚本解析,跑在 Go 内嵌的 goja 引擎里;界面复刻现行 Apple Music 网页版。一条 go build,拷走就能放歌。
Go 1.23+ · goja 引擎 · Vue 3 全局构建 · 无构建步骤 · 无 Node 依赖
环境变量 ADDR / SOURCES_DIR / SOURCE_URLS / QUALITY / VERIFY / OPEN 同名覆盖,命令行参数优先
技术栈与数据来源
没有数据库、没有 Node、没有前端构建步骤。二进制自带全部静态资源与音源脚本,拷到哪台机器都能放歌。
精品歌单、官方排行榜全量「新发现」、歌曲 / 歌单搜索、lrc 歌词与翻译,全部来自公开 Web 端点,服务端代发并伪装浏览器 UA。
sources/*.js 原样复用(含混淆脚本),跑在 Go 内嵌的 goja 引擎里;也可配 SOURCE_URLS 远端加载,改脚本不用换二进制。
成绩排序、分波下发、赢家一出即掐断、连续失败熔断、低码率兜底、直链探活 + 换源重试,单次请求总预算 12 秒。
自绘品牌徽章的侧栏 + 底部悬浮胶囊播放条,进度线内嵌可拖拽;全屏层彩色洗染背景、左封面右歌词,歌词平滑跟随、选词即跳。
默认浅色,侧栏底部一键切换深色,记忆存在 localStorage;介绍页与本页同款的双主题令牌体系,跟随系统配色方案。
空格播放暂停、←/→ 快进快退 5s、↑/↓ 音量、Esc 退出全屏;MediaSession 让系统媒体面板 / 蓝牙耳机按键直接可用。
/api/url 收到请求后,调度器把全部音源按历史成绩排序、分波并发下发;赢家一出立即掐断其余请求,失败音源按熔断规则记分。单次请求总预算 12 秒,逻辑移植自主页 Vercel 版同一套实现。
每个音源按历史成功率与耗时计分,请求先发给成绩好的。成绩进程常驻、跨请求累积,不像函数实例随时清零。
不把所有音源一次性并发,按成绩分波投放;后面的波次在前面的超时之后才出发,省掉无谓的出网请求。
拿到可用直链立刻取消其余在途请求;赢家还要过 SSRF 校验与直链探活(HEAD+GET 竞速)才算数。
连续失败熔断踢出轮换;高码率全军覆没时降级低码率兜底——宁要 128k,不要无声。
探活语义(与主页版一致)
前端是 Vue 3 全局构建直挂 web/,经 go:embed 编进二进制——没有 dist 产物,也没有打包配置。
左侧侧栏放主页、新发现与搜索;底部悬浮胶囊播放条承载全套播放控制,进度线内嵌可拖拽,播放列表从胶囊上方的小弹窗展开。
全屏层复用个人主页音乐卡的样式:背景按封面取色洗染,左边大封面,右边逐行歌词。歌词按 900ms 缓动平滑跟随当前句——当前行清晰、其余逐级虚化;扫过歌词区自动取消模糊,点任意行直接跳到那句。
下面这些不是路线图,是当前版本已经跑在服务上的行为。
/api/hqplaylists,按分类 + limit 拉取/api/songs?ids=1,2,3/api/health?refresh=1 热重装一键脚本装好即用,或手动下载五平台 Release;本机跑、常驻公网(Vercel)都行——同一个仓库两用。
脚本自动下载最新 Release 装到本机:Linux 交给 systemd 常驻开机自启,Windows 可注册登录自启动。环境变量 PORT / QUALITY / SOURCE_URLS 可调。
打 tag 自动出五平台二进制(GitHub Actions)+ sha256 清单,发布到 Releases;releases/latest/download 永远指向最新版。
需要 Go 1.23+。前端与 sources/ 音源脚本经 go:embed 打进产物,没有 npm install,也没有打包步骤。国内拉依赖建议先设 GOPROXY。
Vercel 走 Go framework preset(vercel.json 已声明 framework: "go",地区 hkg1),前端与音源脚本内嵌进函数产物,无需任何函数目录改造。函数实例随时可能被回收,调度器成绩只在实例内存活。
六个参数覆盖监听、音源、音质、探活与自动开浏览器。音源脚本优先读 sources/ 目录,目录不存在时回退 go:embed 内嵌脚本(Release / Vercel 场景);远端 SOURCE_URLS 同名覆盖本地。
本机跑
只改脚本,不换二进制
完整参数表
| 参数 | 环境变量 | 默认 | 说明 |
|---|---|---|---|
| -addr | ADDR / PORT | :8787 | 监听地址 |
| -sources | SOURCES_DIR | ./sources | 洛雪音源脚本目录(不存在时回退 go:embed 内嵌) |
| -source-urls | SOURCE_URLS | 空 | 远端音源脚本地址,逗号分隔,同名覆盖本地,改脚本不用换二进制 |
| -quality | QUALITY | 320k | 默认音质:128k / 320k / flac / flac24bit |
| -verify | VERIFY | on | 直链探活(off 跳过) |
| -open | OPEN | 1 | 启动后自动打开浏览器 |
与主页版(zlion-home)同一套接口形状。/api/url 返回 code:0 即拿到直链;?debug=1 附逐音源溯源。
| 方法 | 路径 | 说明 |
|---|---|---|
| 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 仅供个人学习播放用途;请支持正版。
解析失败会 toast 提示并自动跳下一首;服务本身不做任何破解,只做调度与转发。
只有 404/410/451 判死换源;403/413/超时/HTML 属软失败照发——机房判死 ≠ 访客判死。
internal/lx/ssrf.go 对 lx.request 与播放直链统一做内网 / 元数据地址校验,音源脚本与直链共用同一道闸。
服务端代发并伪装浏览器头;接口形状随网易侧调整可能变动,解析失败会走换源与跳歌兜底。
函数实例随时回收,调度器成绩只在实例内存活;直链缓存退到浏览器侧 max-age=900。
与主页版(zlion-home)的差异
| 维度 | zlion-home(Vercel) | zlion-music(Go) |
|---|---|---|
| JS 引擎 | node:vm | goja(纯 Go,单二进制无 Node 依赖) |
| 成绩 / 熔断 | 函数实例内,随时清零 | 进程常驻,跨请求累积 |
| 直链缓存 | CDN 边缘 s-maxage=900 | 进程内 + 浏览器侧 max-age=900 |
| 探活出口 | 机房出口 | 本机出口,与访客同网络环境,软失败判定更准 |
二进制自带全部前端与音源脚本;同一个仓库在 Vercel 上走 Go preset 直接部署,本机出口探活,与访客同网络环境。
本页为项目介绍页 · 详细配置见仓库 README