using System.Text.RegularExpressions; namespace ZonyLrcTools.Common.Lyrics { /// /// 歌词的行对象,是 的最小单位。。 /// public class LyricsItem : IComparable { /// /// 原始时间轴,格式类似于 [01:55.12]。 /// public string OriginalTimeline => $"[{Minute:00}:{Second:00.00}]"; /// /// 歌词文本数据。 /// public string? LyricText { get; } /// /// 歌词所在的时间(分)。 /// public int Minute { get; } /// /// 歌词所在的时间(秒)。 /// public double Second { get; } /// /// 排序分数,用于一组歌词当中的排序权重。
///
public double SortScore => Minute * 60 + Second; /// /// 构建新的 对象。 /// /// 原始的 Lyric 歌词。 public LyricsItem(string lyricText) { var timeline = new Regex(@"\[\d+:\d+.\d+\]").Match(lyricText) .Value.Replace("]", string.Empty) .Replace("[", string.Empty) .Split(':'); if (int.TryParse(timeline[0], out var minute)) Minute = minute; if (double.TryParse(timeline[1], out var second)) Second = second; LyricText = new Regex(@"(?<=\[\d+:\d+.\d+\]).+").Match(lyricText).Value; } /// /// 构造新的 对象。 /// /// 歌词所在的时间(分)。 /// 歌词所在的时间(秒)。 /// 歌词文本数据。 public LyricsItem(int minute, double second, string? lyricText) { Minute = minute; Second = second; LyricText = lyricText; } public int CompareTo(LyricsItem? other) { if (SortScore > other?.SortScore) { return 1; } if (SortScore < other?.SortScore) { return -1; } return 0; } public static bool operator >(LyricsItem left, LyricsItem right) { return left.SortScore > right.SortScore; } public static bool operator <(LyricsItem left, LyricsItem right) { return left.SortScore < right.SortScore; } public static bool operator ==(LyricsItem? left, LyricsItem? right) { return (int?)left?.SortScore == (int?)right?.SortScore; } public static bool operator !=(LyricsItem? item1, LyricsItem? item2) { return !(item1 == item2); } public static LyricsItem operator +(LyricsItem src, LyricsItem dist) { return new LyricsItem(src.Minute, src.Second, $"{src.LyricText} {dist.LyricText}"); } protected bool Equals(LyricsItem other) { return LyricText == other.LyricText && Minute == other.Minute && Second.Equals(other.Second); } public override bool Equals(object? obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != this.GetType()) return false; return Equals((LyricsItem)obj); } public override int GetHashCode() { return HashCode.Combine(LyricText, Minute, Second); } /// /// 获得歌词行的标准文本。 /// public override string ToString() => $"[{Minute:00}:{Second:00.00}]{LyricText}"; } }