一个简单的 Node.js API 服务器,用于获取网易云音乐歌曲的歌词,它会优先从指定的 GitHub 仓库获取 TTML 格式,然后按顺序查找仓库中的其他格式,最后回退到一个外部 NCM API。
本Fork项目在上游 Burial0268/Lyric-Atlas-API 基础上增加了本地缓存管理机制,用户可以通过 Web 界面查看和管理缓存,同时也支持开发模式下的本地 TTML 文件开发和测试。
- 优先从 Steve-XMH/amll-ttml-db 仓库获取
ttml歌词。 - 当 TTML 未找到时,按顺序查找仓库中的
yrc,lrc,eslrc格式(可通过fallback参数自定义顺序)。 - 当仓库中所有格式都未找到时,回退到外部 API (通过
EXTERNAL_NCM_API_URL环境变量配置) 获取yrc或lrc。(外部 API 为 NeteaseCloudMusicApi) - 支持通过
fixedVersion参数强制只查找仓库中的特定格式。 - 使用 Hono 构建,性能高效。
- 本地歌词缓存: 自动缓存热门歌词,减少网络请求。
- 缓存管理界面: Web 界面管理缓存和开发文件。
- 开发模式: 支持本地 TTML 文件开发和测试。
根据提供的网易云音乐歌曲 ID 搜索歌词。
查询参数:
id( 必需 ): 网易云音乐歌曲的数字 ID。fixedVersion( 可选 ): 强制只在 GitHub 仓库中查找指定的歌词格式。如果提供此参数,则忽略fallback参数。有效值:ttml,yrc,lrc,eslrc。fallback( 可选 ): 指定在 GitHub 仓库中未找到ttml格式后,按顺序尝试查找的回退格式列表(逗号分隔)。注意: 此列表不应包含ttml。如果忽略此参数,默认的回退顺序是yrc,lrc,eslrc。
响应:
- 成功 (200 OK):
{ "found": true, "id": "歌曲ID", "format": "找到的格式 (ttml, yrc, lrc, eslrc)", "source": "来源 ('repository' 或 'external')", "content": "歌词文件的文本内容" } - 未找到 (404 Not Found):
{ "found": false, "id": "歌曲ID", "error": "错误信息 (例如 'Lyrics not found')" } - 客户端错误 (400 Bad Request):
{ "error": "错误信息 (例如 'Missing id parameter')" } - 服务器错误 (5xx):
{ "error": "错误信息 (例如 'Failed to fetch ...', 'External API fallback failed ...')" }
示例请求:
GET /api/search?id=449818741(默认查找顺序: ttml -> yrc -> lrc -> eslrc -> external)GET /api/search?id=449818741&fallback=lrc,yrc(查找顺序: ttml -> lrc -> yrc -> external)GET /api/search?id=449818741&fixedVersion=ttml(只查找仓库中的 ttml)
快速检查某个歌曲 ID 是否存在歌词,并返回可用的歌词格式列表以及是否有翻译或罗马音(来自外部 API)。此端点不返回完整的歌词内容,设计用于轻量级检查。
查询参数:
id( 必需 ): 网易云音乐歌曲的数字 ID。
响应:
- 成功 (200 OK):
{ "found": true, "id": "歌曲ID", "availableFormats": ["ttml", "lrc"], // 可能的格式列表 (LyricFormat[]) "hasTranslation": true, // 布尔值,指示外部 API 是否提供翻译 "hasRomaji": false // 布尔值,指示外部 API 是否提供罗马音 } - 未找到 (404 Not Found):
{ "found": false, "id": "歌曲ID", "error": "错误信息 (例如 'No lyric formats found')" } - 客户端错误 (400 Bad Request):
{ "found": false, // 注意:为了与 search 保持一致性,这里也返回 found: false "error": "错误信息 (例如 'Missing id parameter')" } - 服务器错误 (5xx):
{ "found": false, "error": "错误信息" }
示例请求:
GET /api/lyrics/meta?id=449818741
直接获取 TTML 格式的歌词文件,返回纯文本 XML 内容。
路径参数:
id( 必需 ): 网易云音乐歌曲的数字 ID,需以.ttml结尾。
响应:
- 成功 (200 OK): 返回
application/xml格式的 TTML 内容。 - 未找到 (404 Not Found): 返回纯文本
TTML lyrics not found。 - 客户端错误 (400 Bad Request): 返回纯文本
Invalid song ID。
示例请求:
GET /api/ncm-lyrics/449818741.ttml
| 用途 | 端点 | 示例 |
|---|---|---|
| 搜索歌词 (JSON) | /api/search?id=xxx |
/api/search?id=449818741 |
| 只获取 TTML (JSON) | /api/search?id=xxx&fixedVersion=ttml |
/api/search?id=449818741&fixedVersion=ttml |
| 直接下载 TTML 文件 | /api/ncm-lyrics/xxx.ttml |
/api/ncm-lyrics/449818741.ttml |
| 检查歌词元数据 | /api/lyrics/meta?id=xxx |
/api/lyrics/meta?id=449818741 |
| 缓存管理界面 | http://localhost:8300 |
- |
- 主要来源: Steve-XMH/amll-ttml-db GitHub 仓库 (
/ncm-lyrics目录)。 - 回退来源: 通过
EXTERNAL_NCM_API_URL环境变量配置的外部 API。
本地缓存系统会自动缓存播放次数达到阈值的歌词文件,减少对远程仓库和外部 API 的请求。
| 参数 | 默认值 | 说明 |
|---|---|---|
| 播放次数阈值 | 2 | 歌曲播放次数达到此值后自动缓存 |
| 不活跃天数阈值 | 15 天 | 超过此天数未播放的缓存将被清理 |
| 更新检查间隔 | 12 小时 | 定期检查远程仓库是否有更新 |
启动服务器后,访问 http://localhost:8300 进入缓存管理界面。
功能:
- 查看已缓存的歌词列表(显示歌曲名、艺术家、专辑信息)
- 查看缓存文件内容
- 删除单个缓存文件
- 清理所有不活跃缓存
- 管理开发文件 (
lyrics-dev/目录)
开发模式允许你本地编辑 TTML 文件并实时预览效果。
开发文件目录: lyrics-dev/
TTML 文件格式要求 Steve-XMH/amll-ttml-db :
支持的元数据字段:
musicName- 歌曲名称artists- 艺术家album- 专辑名ncmMusicId- 网易云音乐歌曲 ID
| 端点 | 方法 | 说明 |
|---|---|---|
/api/cache/list |
GET | 获取缓存列表 |
/api/cache/file/:id |
GET | 获取缓存文件内容 |
/api/cache/delete/:id |
DELETE | 删除单个缓存 |
/api/cache/cleanup |
POST | 清理不活跃缓存 |
/api/dev/files |
GET | 获取开发文件列表 |
/api/dev/file/:filename |
GET | 获取开发文件内容 |
/api/dev/upload |
POST | 上传开发文件 |
/api/dev/delete/:filename |
DELETE | 删除开发文件 |
Lyric-Atlas-API/
├── lyrics-cache/ # 本地缓存目录
│ ├── cache-meta.json # 缓存元数据
│ └── *.ttml # 缓存的歌词文件
├── lyrics-dev/ # 开发文件目录
│ └── *.ttml # 开发中的歌词文件
└── ...
-
克隆仓库:
git clone <你的仓库URL> cd <仓库目录>
-
安装依赖: 推荐使用
pnpm:pnpm install
(或者使用
npm install或yarn install) -
配置环境变量:
- 开发: 创建一个
.env文件在项目根目录,并添加必需的环境变量:重要: 将# .env EXTERNAL_NCM_API_URL=https://NeteaseCloudMusicApi/lyric/new PORT=3000 # 可选,默认 3000 PRISMA_DATABASE_URL="prisma+postgres://github.com/amll-dev/amll-ttml-db" # 修改此仓储可自定义使用其他仓库,但建议使用默认值 # 控制台日志语言配置 (可选) LOG_LANGUAGE=zh # 可选值: zh (中文), en (英文),默认为 zh # 仅影响后端控制台日志输出语言,前端界面语言由浏览器自动检测
.env文件添加到.gitignore。 - 生产: 通过你的部署平台或系统设置相应的环境变量。
- 开发: 创建一个
-
开发模式 (带热重载):
pnpm run dev
服务器将在
http://localhost:3000(或PORT环境变量指定的端口) 启动。Windows 用户: 可使用
Lyric Atlas Dev.bat启动脚本,支持前台/后台模式和服务管理。服务端口:
- Main API:
3000- 歌词搜索 API - Cache Admin:
8300- 缓存管理界面
- Main API:
-
构建生产版本:
pnpm run build
确保
tsconfig.json中outDir配置为./dist并且noEmit为false或已移除。 -
运行生产版本:
pnpm run start
EXTERNAL_NCM_API_URL( 必需 ): 指定外部回退 NCM API 的基础 URL (例如:https://ncm-api/lyric/new)。服务器在启动时会检查此变量。PORT: 指定服务器监听的端口 (默认:3000)。
这是一个标准的 Node.js Fastify 应用,可以部署到任何支持 Node.js 的平台,例如 Heroku, Render, Fly.io, 或你自己的服务器。确保目标环境安装了生产依赖 (dependencies 而非 devDependencies),设置了必需的环境变量 (EXTERNAL_NCM_API_URL),并使用 pnpm run start (或等效命令) 启动。
GNU GENERAL PUBLIC LICENSE v3.