Compatibility
Minecraft: Java Edition
26.1.x
Platforms
Supported environments
Client-side
Links
Tags
Creators
Details
Licensed AGPL-3.0-only
Published yesterday
Addon mod for AllMusic Client3 by color_yr(https://github.com/Coloryr/AllMusic) . Automatically fetches synced lyrics from NetEase Cloud Music / LRCLIB and displays them on screen when songs play.
The current lyrics fetching has the following log chains:
Normal Path (with Song ID)
[AllMusic3]正在解析歌曲[123456] ← Caught by ClientReceiveMessageEvents.GAME
↓ LyricsDisplay.onSongParsing()
↓ LyricsFetcher.fetchById(123456) → Direct LRC fetch
↓ Log: "后台获取歌词 ID=123456"
↓ Log: "歌词已缓存: 35 行 (等待播放)"
[AllMusic3]正在播放:歌名 | 歌手 ← Caught by ClientReceiveMessageEvents.GAME
↓ LyricsDisplay.onNowPlaying()
↓ pendingLines has cache → use directly
↓ Log: "正在播放: 歌名 | 歌手"
↓ Log: "歌词显示已激活: 歌名 | 歌手"
Fallback Path (No Cache, Search by Name)
If the "parsing song" message never appeared, and "now playing" arrives directly:
[AllMusic3]正在播放:歌名 | 歌手
↓ LyricsDisplay.onNowPlaying()
↓ pendingLines == null → fallback to search
↓ Log: "无缓存,用歌名搜索..."
↓ LyricsFetcher.fetch(message)
├─ Match NOW_PLAYING regex → extract "歌名 | 歌手"
├─ Split: name="歌名", artist="歌手"
├─ neteaseSearch("歌名", "歌手") → search API
├─ neteaseSearch("歌名", "") → name only (fallback)
└─ lrclib("歌名", "歌手") → LRCLIB (final fallback)
Third Path (packDo Fallback)
AllMusicCore.packDo(INFO, "歌名 | 歌手") ← Mixin TAIL interception
↓ LyricsDisplay.onNowPlaying(data)
↓ Same search flow as above
Key Regex (LyricsFetcher)
| Regex | Matches | Action |
|---|---|---|
正在解析歌曲[::]?\s*(\d+) |
正在解析歌曲[123456] |
Direct ID fetch |
music\.163\.com.*[/#]song\?id=(\d+) |
NetEase URL |
Direct ID fetch |
正在播放[::]\s*(.+?)(?:\s+by:.*)?$ |
正在播放:Song Name |
Search by name |
Search log keywords: |
搜索歌词:, 网易云搜索, LRCLIB, ✘ 未找到歌词. |
Currently, this module does not generate English log files.
中文用户:
AllMusic Client 歌词附属模组。 自动获取网易云/LRCLIB同步歌词并显示在HUD
当前歌词获取有以下日志链路:
正常路径(有歌曲ID)
[AllMusic3]正在解析歌曲[123456] ← ClientReceiveMessageEvents.GAME 捕获
↓ LyricsDisplay.onSongParsing()
↓ LyricsFetcher.fetchById(123456) → 直接获取 LRC
↓ 日志: "后台获取歌词 ID=123456"
↓ 日志: "歌词已缓存: 35 行 (等待播放)"
[AllMusic3]正在播放:歌名 | 歌手 ← ClientReceiveMessageEvents.GAME 捕获
↓ LyricsDisplay.onNowPlaying()
↓ pendingLines 有缓存 → 直接使用
↓ 日志: "正在播放: 歌名 | 歌手"
↓ 日志: "歌词显示已激活: 歌名 | 歌手"
后备路径(无缓存,歌名搜索) 如果"正在解析歌曲"消息没出现,直接来了"正在播放":
[AllMusic3]正在播放:歌名 | 歌手
↓ LyricsDisplay.onNowPlaying()
↓ pendingLines == null → 走搜索
↓ 日志: "无缓存,用歌名搜索..."
↓ LyricsFetcher.fetch(message)
├─ 匹配 NOW_PLAYING 正则 → 提取 "歌名 | 歌手"
├─ 拆分: name="歌名", artist="歌手"
├─ neteaseSearch("歌名", "歌手") → 搜索API
├─ neteaseSearch("歌名", "") → 仅歌名(后备)
└─ lrclib("歌名", "歌手") → LRCLIB(最终后备)
第三路径(packDo 后备)
AllMusicCore.packDo(INFO, "歌名 | 歌手") ← Mixin TAIL 拦截
↓ LyricsDisplay.onNowPlaying(data)
↓ 同上搜索流程
关键正则(LyricsFetcher)
| 正则 | 匹配内容 | 动作 |
|---|---|---|
正在解析歌曲[::]?\s*(\d+) |
正在解析歌曲[123456] |
直接ID获取 |
music\.163\.com.*[/#]song\?id=(\d+) |
网易云URL |
直接ID获取 |
正在播放[::]\s*(.+?)(?:\s+by:.*)?$ |
正在播放:歌名 |
歌名搜索 |
搜索的日志关键词: |
搜索歌词:、网易云搜索、LRCLIB、✘ 未找到歌词。 |


