直接放出代码
object LyricParser {
private fun toTimeInSeconds(input: String): Int {
val timeParts = input.split(":")
val minutes = timeParts[0].toInt()
val seconds = timeParts[1].substringBefore(".").toInt()
return minutes * 60 + seconds
}
fun parse(lyric: String): MutableMap<Int, String> {
val lyricsMap = mutableMapOf<Int, String>()
var currentLyric = ""
for (line in lyric.trimIndent().lines()) {
val parts = line.split("]")
val times = parts.dropLast(1).map { toTimeInSeconds(it.substring(1).replace(".000", "").trim()) }
val content = parts.last().trim()
if (times.isNotEmpty()) {
for (time in times) {
lyricsMap[time] = currentLyric.trim()
}
currentLyric = content
} else {
currentLyric += " $content"
}
}
val keys = lyricsMap.keys.toList()
val values = lyricsMap.values.toList()
keys.dropLast(1)
val shiftedValues = values.drop(1)
val shiftedLyricsMap = mutableMapOf<Int, String>()
for (i in keys.indices) {
shiftedLyricsMap[keys[i]] = shiftedValues.getOrElse(i) { "" }
}
return shiftedLyricsMap
}
fun parseQQLyric(lyrics: String): Map<Int, String> {
val lyricsMap = mutableMapOf<Int, String>()
val regex = """\[(\d{2}):(\d{2})\.(\d{2})](.*)""".toRegex()
lyrics.lines().forEach { line ->
val matchResult = regex.find(line)
if (matchResult != null) {
val minute = matchResult.groups[1]?.value?.toInt() ?: 0
val second = matchResult.groups[2]?.value?.toInt() ?: 0
val millis = matchResult.groups[3]?.value?.toInt() ?: 0
val lyricText = matchResult.groups[4]?.value?.trim() ?: ""
val totalSeconds = minute * 60 + second + if (millis >= 50) 1 else 0
if (lyricText.isNotEmpty()) {
lyricsMap[totalSeconds] = lyricText
}
}
}
return lyricsMap
}
}
parse方法是解析网易云歌词的parseQQLyric是解析QQ音乐的歌词, 最终的结果都是返回一个Map<Int, String>, Int是对应的秒数, String是秒数对应的歌词
1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:xiaoman1221@yhdzz.cn,工作室将第一时间处理!
2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。
3.所有资源仅限于参考和学习,版权归原作者所有。



听说虾米的已经不能用了,可惜了
蹲个后续更新,加个异常处理就更稳了
啊嘛呢吧,又是这种小细节调半天
我在做个音乐播放器,正好拿去试试效果先
这个parse方法最后还做了个值偏移……楼主是想干嘛?
话说酷狗和酷我的格式也差不多,改改应该能用
解析的时候遇到重复时间戳咋办,直接覆盖了?
有没有人试过带【】以外标签的歌词?会崩吗?
感觉还行,至少比我自己写的强点
这代码用在项目里得小心点,有些空行可能出问题
前几天自己搞了个类似的东西,也是被毫秒搞得头疼
试了下网易云的歌词,确实有几个时间差了一两秒,不知道是不是格式问题
能不能加个解析酷狗音乐的功能?
解析出来的map顺序是乱的,需要手动排序吗?
感觉Kotlin写这种工具类确实比Java简洁
在项目里用了这个解析器,效果还不错
有考虑过歌词里带特殊符号的情况吗?
为啥要shiftedValues啊,直接返回不行吗?
为啥要先把值左移一位啊,逻辑没太懂
我也有这个疑问,shift完之后歌词对不上原时间点了吧?
QQ音乐那个正则写得挺巧妙的👍
正则那个写法挺聪明的,省了不少事👍
之前自己写解析器也卡在时间格式转换上了
这个toTimeInSeconds方法处理毫秒的方式有点简单啊
试了下解析网易云歌词,有些时间戳对不上怎么回事?