parseRaw method

  1. @override
LyricModel parseRaw(
  1. String mainLyric, {
  2. String? translationLyric,
})
override

解析主歌词,可选传入副歌词文本

Implementation

@override
LyricModel parseRaw(String mainLyric, {String? translationLyric}) {
  final idTags = <String, String>{};
  final match = RegExp(r'LyricContent=([\s\S]*)"\/>').firstMatch(mainLyric);

  // 提取翻译歌词
  var translationMap = LrcParser.extractTranslationMap(translationLyric);

  final lyricContent = match?.group(1) ?? mainLyric;
  final lineRegExp = RegExp(r'(\[\d+,\d+\])?(.*?)(\(\d+,\d+\))');
  final lines = <LyricLine>[];
  for (var line in lyricContent.split('\n')) {
    // 提取标签内容
    final tagInfo = _extractTag(line);
    if (tagInfo != null) {
      final tag = tagInfo;
      idTags[tag.tag] = tag.value;
      continue;
    }
    Duration startTime = Duration.zero;
    Duration endTime = Duration.zero;
    String text = '';
    final matchs = lineRegExp.allMatches(line);
    if (matchs.isEmpty) continue;
    final words = <LyricWord>[];
    for (var match in matchs) {
      final totalTime = match.group(1);
      if (totalTime?.isNotEmpty ?? false) {
        final time = extractTime(totalTime!);
        startTime = time.first;
        endTime = time.first + time.second;
      }
      final wordText = match.group(2) ?? '';
      text += wordText;

      final time = extractTime(match.group(3)!);
      words.add(LyricWord(
          text: wordText, start: time.first, end: time.first + time.second));
    }
    LyricLine lyricLine = LyricLine(
      start: startTime,
      end: endTime,
      text: text,
      words: words,
      translation: LrcParser.findTranslation(
          translationMap, startTime.inMilliseconds, 10),
    );
    lines.add(lyricLine);
  }
  return LyricModel(lines: lines, tags: idTags);
}