把“最近循环的一首歌”变成一场能和朋友一起玩的挑战。
推歌挑战适合朋友、群聊和社群。发起者出几道关于音乐的题,大家各自用一首或多首歌回答;再去听彼此的选择、点赞、留言,或用一首“印象曲”回应对方。
它不是固定的“三十日问卷”。你可以从空白题库开始,载入 30 题示例,自己写题,或者把已有问卷的图片变成一场新挑战。
- 发起挑战:写下“最想推荐的一首”“一听就想起夏天的歌”这类题目,决定全部开放还是每天解锁一题。
- 认真推歌:搜索歌名或粘贴哔哩哔哩、网易云链接;一题可以多选,想说的话也可以一起留下。
- 交换感受:翻看大家的答案,去听没听过的歌,用点赞、评论和印象曲继续这段对话。
| 挑战与题库 | 找歌与作答 | 分享与互动 |
|---|---|---|
| 题目数量不限 | 一题可选择多首歌 | 点赞、评论与站内通知 |
| 全部开放或逐日开放 | 哔哩哔哩与网易云链接 | 印象曲关键词互动 |
| 统一在北京时间 00:00 解锁 | B 站前 50 项智能筛选 | 带题目、二维码和 Token 的海报 |
| 公开挑战或 6 位邀请 Token | 本家、翻唱等结构化标签 | 响应式网页与 PWA |
输入歌名后,智能搜索会从真实的 B 站候选中尽量找出原作,并标记翻唱、官方重制等不同版本;遇到本家不在候选里的小众曲,也会明确提示,而不是假装找到了答案。
如果你已经收藏了一张音乐问卷,建房页可以识别 JPEG、PNG 或 WebP 图片里的题目。确认、编辑后就能直接开玩;原图不会保存在本站。
首页只列出当前已经开放、但你还没回答的挑战,并显示“已答 / 已开放”进度。逐日挑战当天答完后会暂时隐藏,下一题解锁时再出现。
想把它部署到自己的社群,或想参与开发?下面保留了完整的技术、运行与贡献入口;普通玩家不需要配置任何东西,直接打开 game.rmqg.org 就可以开始。
flowchart LR
Browser[Next.js / React] --> Actions[Server Actions 与 API]
Actions --> DB[(PostgreSQL 17)]
Actions --> Bilibili[Bilibili Adapter]
Actions --> Netease[NetEase Adapter]
Bilibili --> DeepSeek[DeepSeek 筛选]
Actions --> Vision[OpenRouter 视觉模型]
- Next.js 16 App Router、React 19、TypeScript
- Better Auth 用户名密码认证
- Drizzle ORM 与 PostgreSQL
- Lucide 图标、原生响应式 CSS
- Docker Compose、健康检查、定时备份与平台登录态监控
平台 Cookie、模型密钥和 Bark 配置只应存放在服务器 secret 中,不得提交到仓库或暴露给前端。
需要 Node.js 24、pnpm 11 和 PostgreSQL 17。
corepack enable
pnpm install
docker run --name playlist-postgres \
-e POSTGRES_DB=playlist \
-e POSTGRES_USER=playlist \
-e POSTGRES_PASSWORD=playlist \
-p 5432:5432 -d postgres:17-alpine
cp .env.example .env.local将 .env.local 的数据库地址改为:
DATABASE_URL=postgres://playlist:playlist@localhost:5432/playlist
BETTER_AUTH_URL=http://localhost:3000
TRUSTED_ORIGINS=http://localhost:3000然后执行:
DATABASE_URL=postgres://playlist:playlist@localhost:5432/playlist pnpm db:migrate
pnpm dev未配置模型密钥时,账号、挑战、互动和平台链接解析仍可使用;智能歌名搜索需要 DEEPSEEK_API_KEY,图片题库需要 OPENROUTER_API_KEY。Turnstile 两项配置均为空时,本地注册不会显示验证码。
pnpm typecheck
pnpm lint
pnpm test
pnpm build浏览器回归测试需要先启动站点:
PLAYWRIGHT_BASE_URL=http://127.0.0.1:3000 pnpm test:e2e生产部署使用多阶段 Docker 镜像。首次启动时 PostgreSQL 会执行 drizzle/ 中的初始化迁移;已有数据库应先运行 scripts/backup.sh,再按顺序应用新增迁移。反向代理需要为 /api/questions/from-image 设置约 9 MB 的请求体硬上限。
图片题库当前通过 OpenRouter 调用视觉模型。该选型针对本项目的境外服务器:访问硅基流动服务的效果不佳,因此未将其作为生产 provider。
若在中国大陆服务器部署并希望评估硅基流动,可参考可选的硅基流动 SDK 配置。这份配置不改变本项目当前的 OpenRouter 默认 provider。
部署变量见 .env.example。平台 Cookie 与 Bark 告警变量另见 platform-monitor.env.example,实际文件应放在受限的 secrets/platform-monitor.env。生产 Cookie、模型密钥、数据库凭据和告警配置不得写入镜像、日志或仓库。
发布 Docker 镜像前,应先从本仓库的固定 Git tag 构建;运行镜像内的 /app/licenses/ 包含本项目许可证、版权说明与第三方通知。
欢迎提出新的题目灵感、玩法建议、无障碍改进或代码贡献。请先阅读 贡献指南 与 安全政策,再通过 Issue 或 Pull Request 参与。
原创项目代码以 GPL-3.0-only 发布,版权范围见 COPYRIGHT。第三方组件的归属、许可证与源码获取方式见 THIRD_PARTY_NOTICES.md;Noto Sans CJK 字体的完整 SIL Open Font License 位于 assets/fonts/OFL.txt。