music.9ll.uk 上线:全屏歌词播放器,顺手搭了个网易云 API

1754 字
9 分钟
music.9ll.uk 上线:全屏歌词播放器,顺手搭了个网易云 API
music.9ll.uk 上线:全屏歌词播放器,顺手搭了个网易云 API

我的书签页里有个「自建服务」分组,评论、图床、图片工具、监控、统计都在里面。这次往里加的是个音乐站。

地址先放这儿:

https://music.9ll.uk/

图的是入口统一:浏览器打开就能听,手机上加到桌面就是个 PWA,不用每台设备都装一遍客户端。

而且这个站是对外开放的 —— 不是自用测试,也不是搭着玩,谁想听直接打开就行,不用打招呼。

Folia 是什么#

项目叫 Folia,AGPL-3.0。卖点不是曲库,是全屏歌词——歌词动画在这个项目里是主角,不是附属的滚动条。

Folia 的全屏歌词:歌词动画占满整屏,底部只留一条进度条
Folia 的全屏歌词:歌词动画占满整屏,底部只留一条进度条

它有几个东西挺戳我:

能力说明
全屏歌词动画十几种模式(浮名、流光、心象、云阶、群唱、镜台、时计……),可调参数,自适应窗口尺寸
多音源网易云、酷狗、QQ 音乐、Navidrome、本地音乐库
本地歌库导入本地音频,只上传索引不上传文件;自动匹配在线歌词和封面
AI 主题按歌曲情绪和歌词内容生成沉浸式背景
多端Electron 桌面端有现成安装包;Web 版能当 PWA 装

我走的是 Web 版。界面就是一个封面网格,登录之后能直接看到自己网易云那边的歌单,卡片展开是播放和加入队列:

Folia 的歌单页:封面网格,一张卡片展开了播放与加入队列按钮
Folia 的歌单页:封面网格,一张卡片展开了播放与加入队列按钮

点开一首,网格中间会浮出播放面板,歌词在封面下方跟着走,再点一下就是上面那张全屏歌词:

点开一首歌,网格中间浮出播放面板,歌词跟着走
点开一首歌,网格中间浮出播放面板,歌词跟着走

Web 版要自备一个网易云 API#

这是整件事里最容易被忽略的一点。官方文档写得很直白:Web 版至少要有两样东西——一个放前端的地方,和一个可用的网易云 API 地址。

桌面端内置了前后端所以开箱能用,Web 版没有,你得自己准备。所以这次实际上是两段部署。

第一段:网易云 API#

fork NeteaseCloudMusicApiEnhanced/api-enhanced,丢 Vercel 导入就行,Framework Preset 认成 Express 是对的。

环境变量只需要一条:

Terminal window
ENABLE_GENERAL_UNBLOCK=false

注意这是网易云 API 项目的变量,不是 Folia 前端的。官方文档特意点了这一句,两个项目的环境变量不是一套。

部署完 Vercel 会先给一个 <项目名>-<后缀>.vercel.app 的默认域名,能用,但地址又长又不好看,所以我在这个项目上另外绑了自己的域名:

https://wyyapi.9ll.uk

第二段:Folia 前端#

fork chthollyphile/folia-major 到自己的账号,然后 Cloudflare 后台:Workers 和 Pages → 创建应用 → Continue with GitHub → 选仓库。

仓库自带 wrangler.jsonc,所以不用像有些纯静态项目那样自己补配置:

{
"name": "folia-major",
"main": "./worker/index.ts",
"compatibility_date": "2026-04-02",
"assets": {
"directory": "./dist",
"binding": "ASSETS",
"not_found_handling": "single-page-application",
"run_worker_first": ["/api/*"]
}
}

Cloudflare 自己就把构建命令识别成了 npm run build,部署命令 npx wrangler deploy,不用改。

唯一必须填的构建变量#

Terminal window
VITE_NETEASE_API_BASE=https://wyyapi.9ll.uk

踩坑:Cloudflare 的「变量」和「构建变量」是两回事#

这个坑我差点踩进去。

Folia 仓库里有个 runtime-config.js,看名字像是”运行时才读配置”,那种思路下环境变量填在 Worker 的运行时变量里就够了。但我把它抓下来看了一眼,内容是这样的:

// 当前文件:非 Docker Web 部署的空运行时配置,具体值继续由 Vite 环境变量提供。
window.__FOLIA_RUNTIME_CONFIG__ = window.__FOLIA_RUNTIME_CONFIG__ || {};

空壳。真正的值还是 import.meta.env.VITE_* 那一套,走 Vite 构建期注入。

也就是说 VITE_NETEASE_API_BASE 必须填在 Cloudflare 的构建变量(Settings → 构建 → 变量和机密)里。Cloudflare 自己的文档也写得很清楚:构建变量只在构建期可见,运行时读不到;反过来,运行时变量构建期也读不到。

Warning

这个填错位子不会报错,构建照样成功,只是产物里的 API 地址是空的,页面能打开但搜不到歌。排查起来挺费劲。

怎么验证填对了:打开线上页面,看它实际请求的是不是你自己那个 API 域名。我这边在 music.9ll.uk 上抓到的请求是 https://wyyapi.9ll.uk/...,这才算真的通了。

换完地址重新部署之后,已经开着的页面或者装成 PWA 的可能会继续跑旧的那份资源——Service Worker 会把旧包喂回来。我这次就撞上了:老标签页上还在请求旧域名,换一个没有缓存的干净上下文打开才是新的。关掉重开或者强制刷新一下就行。

第三段:绑域名#

Worker 建好之后在「域」标签页里加 music.9ll.uk。因为 9ll.uk 本来就在同一个 Cloudflare 账号里,DNS 记录是自动建的,证书也一起下来了,没等多久。

用之前先知道这几件事#

第一,不登录只能试听 30 秒。 Folia 的在线播放要登录网易云才完整,未登录状态下部分歌曲只能试听 30s,歌单、收藏、电台这些也看不到。

第二,AI 主题现在是用不了的。 它要另外一组 key:

Terminal window
VITE_AI_PROVIDER=google # 或者 openai
GEMINI_API_KEY=你的_key

我这次没配,所以 AI 主题那个入口点了没用。想用的话把这几个变量加进构建变量再重新部署一次就行。

第三,QQ 音乐和酷狗这两条线有额外门槛。

  • QQ 音乐 API 需要常驻 Node 进程(扫码登录依赖 MQTT over WebSocket 长连接),跑不了 Vercel Serverless 或者 Cloudflare Workers,得另找一台机器或 Docker 环境,再把地址填进 VITE_QQ_API_BASE。
  • 酷狗那边是播放节点默认 HTTP + CDN 证书错配,HTTPS 页面里混不进 HTTP,有时候会播放失败,属于上游的老问题。

我这两个都没接,现在能用的是网易云在线 + 本地音乐库。

第四,构建令牌那条告警可以先放着。 Cloudflare 的构建设置里有一条「提取 GitHub 用户或组织详细信息时出错」。这次构建是正常的,先记一笔,真出问题再回头查。

写在最后#

代码都是原作者的,AGPL-3.0,我做的是 fork 一份、拆成前后端两段部署、再挂到自己域名下。许可证和署名都在仓库里留着。

部署过程这次同样是丢给 AI agent 用浏览器点完的,流程和前面那篇把浏览器交给 AI 之后一样,就不重复了。区别是这次多了「网易云 API 得自己先搭」这一段,比纯静态项目麻烦一档。

地址再放一次:https://music.9ll.uk/

这个站是开放给大家用的,谁都能来听 —— 不是自用测试实例,也不是搭完摆着看的。

配套的网易云 API 单独挂了个域名:https://wyyapi.9ll.uk/

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
music.9ll.uk 上线:全屏歌词播放器,顺手搭了个网易云 API
https://www.9ll.uk/posts/deploy/deployfolia/
作者
HY
发布于
2026-10-14
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
HY
Hello, I'm HY.
公告
迷茫.... 为了访问速度,本站将会在11月上旬至中旬迁移到0dm.cn并完成备案
分类
标签
最新动态
站点统计
文章
74
分类
8
标签
192
总字数
161,979
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录