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}";
}
}