Kotlin中解析QQ音乐和网易云音乐歌词的工具类

AI智能摘要
文章介绍了一个用Kotlin实现的歌词解析工具类LyricParser,包含parse和parseQQLyric两个方法,分别用于解析网易云和QQ音乐格式的歌词。两个方法都返回Map,键为秒数、值为该秒对应的歌词。parse通过按行分割和时间标记处理多时间标签与行间歌词切换,最后将歌词向后移一位以对应播放时长;parseQQLyric用正则提取[mm:ss.xx]格式时间,按秒(对>=50毫秒进位)映射非空歌词文本。总结了各方法的输入输出与核心处理逻辑。
— AI 生成的文章内容摘要

直接放出代码

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.所有资源仅限于参考和学习,版权归原作者所有。

Kotlin技术

记录一下Fabric高版本模组开发的注意事项

2025-1-1 16:24:53

KotlinLanguage学习技术默认

Kotlin中操作二进制数据

2025-1-4 14:34:27

25 条回复 A文章作者 M管理员
  1. 旧时光收藏家

    听说虾米的已经不能用了,可惜了

  2. 猫头鹰老K

    蹲个后续更新,加个异常处理就更稳了

  3. 云野

    啊嘛呢吧,又是这种小细节调半天

  4. 我在做个音乐播放器,正好拿去试试效果先

  5. 独立自由人

    这个parse方法最后还做了个值偏移……楼主是想干嘛?

  6. 风过林

    话说酷狗和酷我的格式也差不多,改改应该能用

  7. 解析的时候遇到重复时间戳咋办,直接覆盖了?

  8. 夜幕之刃

    有没有人试过带【】以外标签的歌词?会崩吗?

  9. 阴司账房

    感觉还行,至少比我自己写的强点

  10. AndromedaGhost

    这代码用在项目里得小心点,有些空行可能出问题

  11. 前几天自己搞了个类似的东西,也是被毫秒搞得头疼

  12. 黄泉使者

    试了下网易云的歌词,确实有几个时间差了一两秒,不知道是不是格式问题

  13. 能不能加个解析酷狗音乐的功能?

  14. 社交小彩虹

    解析出来的map顺序是乱的,需要手动排序吗?

  15. 沉梦者

    感觉Kotlin写这种工具类确实比Java简洁

  16. 在项目里用了这个解析器,效果还不错

  17. 有考虑过歌词里带特殊符号的情况吗?

  18. 绵绵小奶糖

    为啥要shiftedValues啊,直接返回不行吗?

    • 影月祭司

      我也有这个疑问,shift完之后歌词对不上原时间点了吧?

  19. 信息炼金术士

    QQ音乐那个正则写得挺巧妙的👍

    • RTAkland

      正则那个写法挺聪明的,省了不少事👍

  20. 之前自己写解析器也卡在时间格式转换上了

  21. 云端诗人

    这个toTimeInSeconds方法处理毫秒的方式有点简单啊

  22. 果冻小星星

    试了下解析网易云歌词,有些时间戳对不上怎么回事?

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索